AND, OR и NOT в SQL

В этой статье вы узнаете, как использовать операторы AND, OR и NOT с условием WHERE для фильтрации записей на основе нескольких условия.

В прошлой статье мы научились использовать условие WHERE — чтобы фильтровать запросы по одному условию. Но на практике чаще встречаются ситуации, когда нужно отбирать данные по нескольким условиям. 

AND, OR, NOT — это логические операторы, которые в SQL используются для объединения условий в WHERE

Оператор AND

Оператор AND объединяет два условия и возвращает TRUE только в том случае, если оба условия истинны — равны TRUE. Оператор AND часто используется в WHERE с операторами SELECT, UPDATE, DELETE для формирования условий фильтрации результатов.

Синтаксис

SELECT столбец1, столбец2, столбецN
FROM имя_таблицы
WHERE условие1 AND условие2;

Пример

Используем оператор AND на датасете из предыдущих статей. Если еще не работали с ним, скачайте и установите в свою СУБД таблицу Austin_Animal_Center_Intakes.csv (Google Disc →).

Допустим, нам нужно увидеть всех кошек, которых вернули хозяевам. Для этого можно написать такой запрос:

SELECT monthyear,
       name,
       age_upon_outcome
 FROM austin_animal_center_outcomes
 WHERE animal_type = 'Cat' AND outcome_type = 'Return to Owner'

Примечание. Обратите внимание, что мы не стали включать поля, используемые с оператором AND, в предложение WHERE. Поскольку запрос возвращает строки только для кошек ("Cat"), которые возвращены владельцу ("Return to Owner"), данные в этих столбцах были бы избыточными, поскольку все они были бы одинаковыми. 

Вот первые несколько строк результата запроса:

monthyear name age_upon_outcome
11/15 Bri-Bri 16 years
12/13 Midnight 12 years
1/14 Budgie 13 years
2/15 Pyewackett 14 years
10/14 Spider 12 years
7/14 Clara 12 years
4/16 Pepito 13 years
4/15 Rocky 12 years

 

Оператор OR

Оператор OR объединяет два условия, но возвращает TRUE, когда одно или оба условия равны TRUE.

Синтаксис

SELECT столбец1, столбец2, столбецN
FROM имя_таблицы
WHERE условие1 OR условие2;

Пример

Допустим, мы хотим увидеть всех кошек и собак, которые были либо бездомными, либо их сдали владельцы. Для этого придется объединить операторы AND и OR — получится такой запрос:

SELECT animal_type,
       intake_type,
       Intake_condition,
       age_upon_intake
 FROM austin_animal_center_intakes
 WHERE (animal_type = 'Cat' OR animal_type = 'Dog')
       AND (intake_type = 'Stray' OR intake_type = 'Owner Surrender')

Вот первые несколько строк результата:

 

animal_type intake_type Intake_condition age_upon_intake
Cat Stray Normal 16 years
Cat Stray Normal 1 month
Cat Owner Surrender Normal 10 years
Cat Owner Surrender Normal 9 months
Cat Stray Normal 10 months
Cat Owner Surrender Sick 15 years
Cat Stray Normal 7 years

Оператор NOT

Оператор NOT чаще всего используется с другими ключевыми словами, такими как BETWEEN, LIKE или IN — для «отрицания».

Однако ее можно использовать и для «отрицания» целого условия в WHERE. Допустим, у нас уже есть запрос, который возвращает все строки для кошек и собак, которые были взяты в приюте и которые были больны: 

SELECT monthyear,
       animal_type,
       intake_type,
       intake_condition
 FROM austin_animal_center_intakes
 WHERE ((animal_type = 'Cat') OR (animal_type = 'Dog'))
       AND (intake_condition = 'Sick')

Вот первые несколько строк результата такого запроса:

 

monthyear animal_type intake_type Intake_condition
2014-02 Cat Owner Surrender Sick
2014-02 Cat Owner Surrender Sick
2014-02 Cat Stray Sick
2014-02 Cat Stray Sick
2014-02 Cat Stray Sick
2014-03 Cat Stray Sick
2014-03 Cat Stray Sick
2014-03 Cat Owner Surrender Sick

Если по какой-то причине вы хотите просмотреть все данные о животных, которые не были ни больными кошками, ни больными собаками, можно добавить NOT в WHERE:

SELECT monthyear,
       animal_type,
       intake_type,
       Intake_condition
 FROM austin_animal_center_intakes
 WHERE NOT (((animal_type = 'Cat') OR (animal_type = 'Dog'))
       AND (intake_condition = 'Sick'))

Вот первые несколько строк результата такого запроса:

 

monthyear animal_type intake_type Intake_condition
2017-12 Dog Stray Normal
2014-12 Dog Public Assist Normal
2015-11 Cat Stray Normal
2015-03 Dog Public Assist Normal
2016-03 Dog Public Assist Normal
2014-02 Dog Owner Surrender Normal
2014-02 Dog Public Assist Normal

Примечание. Приведенный выше пример — просто пример. На самом деле запрос для поставленной задачи можно написать проще — чтобы его удобнее было разбирать глазами. На практике NOT редко используют без LIKE, BETWEEN и IN.

Проверьте себя
1. Оператор AND возвращает TRUE, когда...
AХотя бы одно из условий истинно
BОба условия истинны
CПервое условие истинно, а второе — ложно
DЛюбое из условий ложно
2. Что вернёт следующий запрос? SELECT * FROM intakes WHERE animal_type = 'Cat' AND outcome_type = 'Return to Owner'
AВсе кошки и все животные, возвращённые владельцу
BТолько кошек, которые были возвращены владельцу
CВсех животных, кроме кошек, которых вернули владельцу
DВсе записи, где выполнено хотя бы одно условие
3. Зачем используются скобки в выражении WHERE (animal_type = 'Cat' OR animal_type = 'Dog') AND intake_type = 'Stray'?
AСкобки не влияют на результат — они декоративные
BСкобки ускоряют выполнение запроса
CСкобки нужны только при использовании NOT
DСкобки обеспечивают правильный порядок вычисления: сначала OR, потом AND
4. Что делает оператор NOT в WHERE NOT (condition)?
AИнвертирует (отрицает) результат условия в скобках
BДобавляет новое условие к существующему
CОстанавливает выполнение запроса при ложном условии
DЯвляется синонимом оператора != и применяется только к числам