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.