news
Serverspace добавил возможность подключения S3 к сервису CDN
VB
2 ноября 2023
Обновлено 2 ноября 2023

Основные ошибки SQL и как их исправить

Базы данных

Эта статья посвящена распространенным ошибкам, с которыми люди часто сталкиваются при написании SQL-кода или конструировании запросов к базам данных. Не волнуйтесь, если при выполнении запросов к базе данных вместо ответа возникает ошибка. Не ошибается лишь тот, кто ничего не делает. В этой статье мы рассмотрим часто встречающиеся ошибки, которые возникают при работе с SQL. По окончании чтения статьи вы уже сможете их избегать и тратить гораздо меньше времени на типовые операции.

Подготовительный этап

В качестве подготовительных шагов мы создадим тестовую базу данных с некоторыми данными внутри. Подключитесь к вашему серверу баз данных, создайте пустую базу с именем testdb, затем сделайте ее активной:

mysql -u<имя_пользователя> -p<пароль>
create database testdb;
use testdb;

pic0

Создайте две таблицы внутри базы данных:

CREATE TABLE boys (
ID int,
Name varchar(20),
Surname varchar(20),
FavoriteDiscipline varchar(20),
Age int);

CREATE TABLE girls (
ID int,
Name varchar(20),
Surname varchar(20),
FavoriteDiscipline varchar(20),
Age int);

Создание двух таблиц внутри базы данных

 

Следующим шагом заполните таблицы данными:

INSERT into boys (Id,Name,Surname,FavoriteDiscipline,Age)
VALUES
(1,'Vanya','Sidorov','Math',15),
(2,'Petya','Shmelev','Literature',14),
(3,'Seryozha','Petrov','Music',15),
(4,'Fedya','Kurbanov','Geography',15),
(5, 'Vanya','Korolyov','History',15);

INSERT into girls (Id,Name,Surname,FavoriteDiscipline,Age)
VALUES
(1,'Olya','Sukhova','History',14),
(2,'Irina','Vlasova','Music',14),
(3,'Vera','Kurbanova','Literature',15);

Заполните таблицы данными

 

В дальнейшем в данной инструкции имеется в виду именно эта база данных. Теперь приступим к описанию типовых ошибок!

Опечатки

Если вы напишете собеседнику-человеку что-то вроде “Как насчет вреститься вечером?”, он вас, скорее всего, поймет. Однако в случае запросов к базам данных не все так просто, слово TABEL поставит машину в тупик. Проиллюстрируем ситуацию на примере. Попробуем получить всю информацию о мальчиках, имеющуюся в нашей базе:

SELECT * FORM boys;

Есть ли тут ошибка? На беглый взгляд нет, но если попытаться выполнить этот запрос, получим:

Есть ли тут ошибка?

 

В данном запросе допущена ошибка. Слово “FROM” написано неправильно как “FORM”. Самые распространенные ошибки при написании SQL-запросов обычно связаны с неправильным написанием слов, один неправильно написанный символ “обрушивает” всю конструкцию. Помочь избежать таких ситуаций может любой онлайн-редактор SQL, который будет подсвечивать синтаксис.

pic2

Пропуск символов-разделителей

Представим, что нам требуется информация о человеке по имени Федя. Мы помним, что его фамилия может быть Курбанов или Шмелев. Кроме того, он ненавидит математику, но в последнем вы не уверены. Попробуем составить запрос к нашей базе:

SELECT *
FROM boys
WHERE Name = 'Fedya' and NOT FavoriteDiscipline = 'Math' and (Surname = Kurbanov or Surname = Shmelev);

Результат… ошибка SQL:

ошибка SQL

 

А вы знаете, в чем причина ошибки выполнения запроса? Забыты “закрывающие” кавычки – это также распространенная ошибка в SQL. Исправленная команда успешно выполнится:

SELECT *
FROM boys
WHERE Name = 'Fedya' and NOT FavoriteDiscipline = 'Math' and (Surname = 'Kurbanov' or Surname = 'Shmelev');

Исправленная команда

 

Тот же принцип применяется к одинарным кавычкам (‘ ‘) и двойным кавычкам (” “). В SQL они всегда используются только парами. Если есть необходимость включить кавычку внутри значения (например, Surname = “O’Henry”), мы либо используем комбинацию разных типов кавычек, либо используем символы экранирования. В SQL символы экранирования обычно помещаются перед символом, который требуется экранировать, например, путем добавления еще одной пары кавычек другого типа.

Неиспользование псевдонимов

Когда мы объединяем информацию из разных таблиц, может возникнуть путаница, если часть столбцов в разных таблицах имеют одинаковое название. Чтобы избежать этой путаницы, следует использовать так называемый псевдоним, когда мы перед названием столбца добавляем имя таблицы.  А теперь пример – представьте, что мы ищем всех мальчиков и девочек, которые любят одну и тот же предмет. Потребуется одновременная выборка из двух таблиц, для чего используется оператор join. Давайте составим запрос согласно “общим правилам”:

SELECT *
FROM girls INNER JOIN boys
ON FavoriteDiscipline;

составим запрос согласно "общим правилам"

Если вы увидели сообщение с ошибкой ambiguous column name это однозначно говорит о необходимости использования псевдонима. В данном случае обе таблицы, boys и girls, имеют столбец с именем FavoriteDiscipline. Чтобы исправить эту ошибку, достаточно скорректировать запрос вот так:

SELECT *
FROM girls INNER JOIN boys
ON boys.FavoriteDiscipline = girls.FavoriteDiscipline;

достаточно скорректировать запрос вот так

Неверный порядок слов в запросе

В языке SQL важное значение имеет не только написание собственно слов, но и их порядок в запросе. Предопределенный порядок таков – <действие>, <область_применения>, <фильтр>, <группировка_или_сортировка>. Как видите, свободы действия особо нет, но и, как говорится, “не ядерная физика”. В качестве примера – найдем всех мальчиков с именем “Ваня” и отсортируем результат по фамилии:

SELECT Name, Surname FROM boys WHERE Name = 'Vanya' ORDER BY Surname;

Результат по фамилии

 

Данный порядок слов “прибит гвоздями” на уровне языка запросов SQL, при попытке изменить конструкцию мигом получим state error:

SELECT Name, Surname FROM boys ORDER BY Surname WHERE Name = 'Vanya' ;

State error

Использование ЗАГЛАВНЫХ букв

В большинстве случаев команды SQL нечувствительны к регистру, он никак не влияет на результат их выполнения. Пример:

Команды SQL нечувствительны к регистру

 

Однако, если вы случайно создадите таблицу с тем же именем, что и у существующей таблицы, но написанным в другом регистре, это потенциально может привести к  проблемам. Давайте для примера создадим “пустую” таблицу с именем GIRLS:

Создадим "пустую" таблицу с именем GIRLS:

 

Теперь представьте, что при написании запроса, где мы ищем фамилию девочки с именем Оля, вы случайно нажали клавишу CapsLock. Результат будет несколько неожиданным:

Решение - по возможности не использовать заглавных букв.

Решение – по возможности не использовать заглавных букв.

Мы рассмотрели типичные ошибки, которые люди часто допускают при написании запросов SQL. Ошибки — обычное явление во время обучения и естественная часть процесса программирования. Не падайте духом и не сдавайтесь. По мере того, как вы приобретете больше опыта и сможете более эффективно выявлять и исправлять ошибки.

Оценка:
5 из 5
Аverage rating : 5
Оценок: 1
191028 Санкт-Петербург Литейный пр., д. 26, Лит. А
+7 (812) 403-06-99
700 300
ООО «ИТГЛОБАЛКОМ ЛАБС»
700 300

Вам также может быть интересно...