DML. Блок WHERE

DML. Блок WHERE

Дорогу осилит идущий

В рамках прошлой статьи мы разобрались, как получать информацию из таблицы и как ограничивать объем этой информации вертикально (по колонкам). Сегодня же начнем знакомство с основным (но не единственным) механизмом ограничения выборки горизонтально (по записям).

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

Но еще важнее то, что 99% задач и не предполагают обработки всех записей таблицы за раз. Чаще всего необходимо получить конкретную запись (или набор записей), удовлетворяющих заданным условиям: равенство id заданному значению, вхождение значений в определенное множество, соответствие арифметическому неравенству (больше, меньше и т.д.) – или набору заданных условий, объединенных логически.

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

Рассматривать тему будем на базе уже знакомых нам SELECT-запросов. Фильтрация данных применяется не только в них, но синтаксис и принципы везде одинаковы с незначительными ограничениями.

 

Пример. Получить список пассажиров с именем «Ivan»:

select * from passenger where first_name = 'Ivan';

В данном запросе мы указываем, что хотим получить информацию из всех колонок таблицы по записях, удовлетворяющих нашему фильтру. Для этого в запросе добавляется WHERE-блок. Он состоит из оператора WHERE и условий фильтрации, расположенных после него. В примере выше таким условием фильтрации выступает first_name = 'Ivan'.


Операторы сравнения

Обратите внимание, в SQL равенство обозначается одним «=». В остальном базовые операторы сравнения похожи:

·      = – Равно;

·      != – Не равно. Также можно использовать оператор «<>»;

·      > – Больше;

·      < – Меньше;

·      >= – Большие или равно;

·      <= – Меньше или равно.

В отличии от Java, данные операторы подходят не только для числовых типов данных. Так, типы даты и времени будут сравниваться по значению (сегодняшняя дата больше вчерашней), строковые типы – по кодам символов. Условно, в алфавитном порядке.


Операторы IS и IS NOT

Еще одно особенностью SQL является то, что null != null. Таким образом, использовать операторы равенства и неравенства бессмысленно в случае выборки записей с пустым значением в определенной колонке (или, наоборот, любым не пустым).

Для операций с null предусмотрены другие операторы – IS и IS NOT:

select * from passenger where last_purchase is null;
select * from passenger where last_purchase is not null;


Оператор NOT

К слову, NOT в SQL является отдельным оператором (по семантике схожим с «!» в Java). Так, он может располагаться перед условием, делая его отрицательным:

select * from passenger where not first_name = 'Ivan';

Не скажу, что оператор является таким же популярным, как и его аналог в Java – все же, особенности работы с условными выражениями несколько различаются. Но и ничего плохого в нем нет, если он делает ваш запрос более читабельным или, что важнее для SQL, более оптимальным.

Также NOT является составной частью ряда других операторов, с которыми мы познакомимся в следующем уроке. Из рассмотренных сегодня – IS NOT. Может показаться, что это объединение двух различных операторов, но это не так.

Честно говоря, с точки зрения классической группировки операторов NOT было бы правильнее перенести его в следующий пункт. Но ассоциативно его хочется выделить отдельно.

 

Логические операторы и объединение условий

Как и в Java, зачастую требуется производить выборку по нескольким условиям, объединенных по И/ИЛИ. Java также включает «исключающее ИЛИ» (XOR), обозначаемый как «^». В SQL же оператор для XOR отсутствует и его придется реализовывать как группу И/ИЛИ, в случае необходимости.

Логические операторы в SQL:

·      AND – И. Аналогичен «&&» в Java;

·      OR – ИЛИ. Аналогичен «||» в Java;

·      NOT – НЕ. Оставим для закрепления. Аналогичен «!» в Java.


Пример запроса с двумя условиями:

select * from passenger where first_name = 'Ivan' OR last_purchase is null;

Опять же, как и в Java, можно строить более сложные объединения, включающие группы условий. Для объединения групп используются скобки.

Например, запрос, который должен выбрать все записи, для которых

Имя равно «Ivan» и дата рождения раньше 01.01.2000.
Или же пол указан как женский

Выглядит так:

select * from passenger where (first_name = 'Ivan' and birth_date < '2000-01-01') or male is false;

Или так:

select * from passenger where (first_name = 'Ivan' and birth_date < '2000-01-01') or not male;

Обратите внимание, для сравнения boolean-значений допустимо как использование =/!=, так и использование IS/IS NOT.

Для сравнения, в Java выражение из WHERE-блока выглядело бы примерно так:

(firstName.equals("Ivan") && birthDate.isBefore(minBirthDate)) || !male

Где minBirthDate равна '2000-01-01'.


Бонусом, приложу часть SQL-запроса, которая реализует XOR. На место condition1 и condition2 можно подставить любые условия фильтрации:

(condition1 AND NOT condition2) OR (NOT condition1 AND condition2)

 

Как было сказано выше, в следующем уроке познакомимся с более сложными операторами фильтрации. Пока же предлагаю закрепить основы.

 

С теорией на сегодня все!

Переходим к практике:

Задача 1

Получите запись с id равным 1.

 

Задача 2

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

 

Задача 3

Получите все записи, где фамилия равна «Petrov» и имя равно «Petr». Добавьте к выборке все записи, для которых дата рождения меньше, чем дата последней покупки билета.


Если что-то непонятно или не получается – welcome в комменты к посту или в лс:)

Канал: https://t.me/ViamSupervadetVadens

Мой тг: https://t.me/ironicMotherfucker

 

Дорогу осилит идущий!

Report Page