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
.