WHERE

WHERE используется для фильтрации строк. Он определяет, какие строки попадут в результат запроса.

Ключевая идея

WHERE работает со строками таблицы до группировок, сортировок и агрегатных функций.


Базовый пример

Выберем всех сотрудников из отдела Sales.

SELECT *
FROM employees
WHERE department = 'Sales';
Пример результата:
id name department salary
1AliceSales1200
2BobSales900

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

SELECT name, salary
FROM employees
WHERE salary >= 1000;
Пример результата:
name salary
Alice1200
Dave1300

Логические операторы: AND / OR / NOT

SELECT *
FROM employees
WHERE department = 'Sales'
  AND salary >= 1000;
💡 Совет

Если в запросе используются AND и OR — добавляй скобки. Это повышает читаемость и защищает от логических ошибок.


Фильтрация по нескольким атрибутам

На практике условия почти всегда комбинируются: по отделу, зарплате, статусу, дате и т.д.

AND — все условия должны выполниться

Сотрудники из Sales с зарплатой не ниже 1000.

SELECT name, department, salary
FROM employees
WHERE department = 'Sales'
  AND salary >= 1000;
Пример результата:
name department salary
AliceSales1200

OR — достаточно одного условия

Сотрудники из Sales или с высокой зарплатой.

SELECT name, department, salary
FROM employees
WHERE department = 'Sales'
   OR salary >= 1300;
Пример результата:
name department salary
AliceSales1200
BobSales900
DaveIT1300

AND + OR вместе (со скобками)

Сотрудники из Sales или IT, но только с зарплатой ≥ 1000.

SELECT name, department, salary
FROM employees
WHERE (department = 'Sales' OR department = 'IT')
  AND salary >= 1000;
Пример результата:
name department salary
AliceSales1200
DaveIT1300
⚠ Очень частая ошибка

Без скобок SQL применяет приоритет AND раньше OR:

department = 'Sales'
OR department = 'IT'
AND salary >= 1000

Это эквивалентно: department = 'Sales' OR (department = 'IT' AND salary >= 1000)


IN — проверка на вхождение

Удобно, когда нужно проверить принадлежность к набору значений.

SELECT name, department
FROM employees
WHERE department IN ('Sales', 'IT');

BETWEEN — диапазон значений

Проверяет, что значение находится в диапазоне (включительно).

SELECT name, salary
FROM employees
WHERE salary BETWEEN 1000 AND 1300;
Важно

BETWEEN включает границы диапазона.


LIKE — поиск по шаблону

LIKE позволяет искать строки по шаблону. В шаблонах используются два специальных символа:

Когда использовать

LIKE хорошо подходит для простого поиска по строкам. Для сложного полнотекстового поиска обычно используют отдельные механизмы (FTS), но для учебных задач LIKE — must-have.

Начинается с…

Найдём имена, которые начинаются на "A".

SELECT name
FROM employees
WHERE name LIKE 'A%';
Пример результата:
name
Alice

Заканчивается на…

Найдём имена, которые заканчиваются на "e".

SELECT name
FROM employees
WHERE name LIKE '%e';
Пример результата:
name
Alice
Dave
Eve

Содержит подстроку

Найдём имена, которые содержат "al".

SELECT name
FROM employees
WHERE name LIKE '%al%';
Пример результата:
name
Mallory

Ровно один символ: _

_ обозначает ровно один символ. Например, шаблон '_ve' соответствует строкам длины 3: "Eve", "Ive", ...

SELECT name
FROM employees
WHERE name LIKE '_ve';
Пример результата:
name
Eve

NOT LIKE — исключить по шаблону

Выберем сотрудников, чьё имя не начинается на "A".

SELECT name
FROM employees
WHERE name NOT LIKE 'A%';

LIKE в комбинации с другими условиями

Частый кейс: поиск по имени + дополнительная фильтрация по атрибутам.

SELECT name, department, salary
FROM employees
WHERE department = 'Sales'
  AND name LIKE 'A%'
  AND salary >= 1000;
Пример результата:
namedepartmentsalary
AliceSales1200
⚠ Про регистр в SQLite

В SQLite поведение LIKE для ASCII-символов обычно нечувствительно к регистру (то есть "alice" может совпасть с "Alice"). Для кириллицы/юникода и в других СУБД поведение может отличаться и зависит от колляции/настроек.

💡 Если нужно искать символ % или _

В шаблоне LIKE символы % и _ специальные. Чтобы искать их буквально, используют экранирование с ESCAPE. Пример ниже — общий SQL-приём (поддержка может отличаться по СУБД).

SELECT *
FROM files
WHERE filename LIKE '%\_%' ESCAPE '\';

NULL и IS NULL

NULL — это не значение, а отсутствие значения. Его нельзя сравнивать через =.

SELECT *
FROM employees
WHERE bonus IS NULL;
Запомни

= NULL никогда не работает. Используй IS NULL или IS NOT NULL.


Порядок выполнения (упрощённо)

Важно: WHERE применяется очень рано.

FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
LIMIT

Поэтому:


Итого