Базовый курс SQL. Комбинирование условий. AND OR IN NOT

Forums:

[к оглавлению]

В этом уроке мы научимся комбинировать несколько условий в запросе, а также рассмотрим другие вспомогательные операторы, которые можно применять внутри WHERE.

Оператор AND

С помощью оператора AND можно добавить несколько условий к одному или даже к нескольким столбцам:

SELECT student_surname
FROM Students
WHERE student_country <> 'РФ' AND group_id = 31548;

Получим фамилии иностранных студентов, учащихся в группе c id = 31548:

student_surname
---------------------
Сейдинай                                          
Адамченко     

Оператор AND соответствует логическому оператору конъюнкции, т.е. требует получения только тех строк, для которых выполняются ВСЕ указанные условия.

Оператор OR

Оператор OR соответствует логическому оператору дизъюнкции, т.е. выведет все строки, которые соответствуют ХОТЯ БЫ ОДНОМУ из представленных условий.

SELECT student_surname
FROM Students
WHERE student_email IS NULL OR student_country IS NULL;

Запрос выдаст список фамилий студентов, у которых не заполнен один из столбцов: student_email или student_country, или оба столбца сразу.

student_surname
---------------------
Адамченко                                         
Римский          

При обработке оператора OR чаще всего СУБД проверяет условия последовательно: если строка уже соответствует первому, в целях оптимизации, второе условие даже не будет рассматривается.

Порядок обработки AND и OR

А теперь представим, что в запросе используется и AND и OR одновременно, что же будет выполнено вначале, а что потом? Попробуем получить список студентов из Франции или Украины, младше 23-х лет:

SELECT student_surname, student_country, student_age
FROM Students
WHERE student_country = 'Франция' OR student_country = 'Украина' AND student_age < 23;

Ожидаем список студентов из обоих стран, соответствующих возрастному ограничению. Но вместо этого увидим, что последнее условие применилось только к украинским студентам, а французы вывелись, независимо от возраста:

student_surname |  student_country |  student_age
-----------------------------------
Адамченко       |  Украина       |  21
Легран          |  Франция       |  24  

Итак

Условие AND имеет больший приоритет, и выполняется ПЕРЕД оператором OR, даже если стоит после него.

Чтобы избежать подобных неожиданностей можно использовать скобки:

SELECT student_surname
FROM Students
WHERE (student_country = 'Франция' OR student_country = 'Украина') AND student_age < 23;

Ответ:

student_surname |  student_country |  student_age
-----------------------------------
Адамченко       |  Украина       |  21

При использовании нескольких операторов AND или OR мы рекомендуем не полагаться на порядок обработки по умолчанию, а всегда использовать скобки для его директивного определения. Это повысит читаемость и стабильность кода.

Оператор IN

Определяет, совпадает ли значение столбца с одним из указанных вариантов:

SELECT exam_id
FROM Exams
WHERE discipline_id IN (48, 13);

Получим exam_id всех экзаменов по дисциплинам с discipline_id 48 и 13:

exam_id
-----------------
20118
20119
20156

Вы можете заметить, что по сути оператор IN выполняет ту же функцию, что и несколько последовательных операторов OR. Следующий запрос даст аналогичный результат:

SELECT exam_id
FROM Exams
WHERE discipline_id = 48 OR discipline_id = 13;

Однако IN всё-таки имеет несколько преимуществ:

  • Если список удовлетворяющих значений длинный, IN намного боле читаемый
  • Меньше операторов - легче уследить за порядком обработки условий
  • Скорость обработки одного оператора IN выше, чем нескольких OR
  • ну и кроме того, внутри IN может содержаться целый подзапрос SELECT, что даёт расширенные возможности сравнению. Подробности рассмотрим в главе Подзапросы

Оператор NOT

Употребляется только в связке с другими условиями и служит для их отрицания (или изменения значения на противоположное). Устанавливается ПЕРЕД именем столбца:

SELECT group_name
FROM Groups
WHERE NOT faculty_id = 7;

Получим все группы, НЕ принадлежащие факультету компьютерных технологий:

group_name
----------------
580Z      

И снова оператор может быть заменён другим (в данном случае оператором !=). Конечно, сделано это не для разнообразия, а потому что оператор NOT имеет свои преимущества в более сложных запросах. Например, в комбинации с IN.

Следующая страница. Оператор LIKE. Использование метасимволов.
Оглавление.