WHERE
WHERE используется для фильтрации строк.
Он определяет, какие строки попадут в результат запроса.
WHERE работает со строками таблицы до группировок,
сортировок и агрегатных функций.
Базовый пример
Выберем всех сотрудников из отдела Sales.
SELECT *
FROM employees
WHERE department = 'Sales';
| id | name | department | salary |
|---|---|---|---|
| 1 | Alice | Sales | 1200 |
| 2 | Bob | Sales | 900 |
Операторы сравнения
=— равно!=или<>— не равно>,>=,<,<=
SELECT name, salary
FROM employees
WHERE salary >= 1000;
| name | salary |
|---|---|
| Alice | 1200 |
| Dave | 1300 |
Логические операторы: AND / OR / NOT
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 |
|---|---|---|
| Alice | Sales | 1200 |
OR — достаточно одного условия
Сотрудники из Sales или с высокой зарплатой.
SELECT name, department, salary
FROM employees
WHERE department = 'Sales'
OR salary >= 1300;
| name | department | salary |
|---|---|---|
| Alice | Sales | 1200 |
| Bob | Sales | 900 |
| Dave | IT | 1300 |
AND + OR вместе (со скобками)
Сотрудники из Sales или IT, но только с зарплатой ≥ 1000.
SELECT name, department, salary
FROM employees
WHERE (department = 'Sales' OR department = 'IT')
AND salary >= 1000;
| name | department | salary |
|---|---|---|
| Alice | Sales | 1200 |
| Dave | IT | 1300 |
Без скобок 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 позволяет искать строки по шаблону.
В шаблонах используются два специальных символа:
%— любое количество символов (включая 0)_— ровно один символ
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;
| name | department | salary |
|---|---|---|
| Alice | Sales | 1200 |
В 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
Поэтому:
WHEREне видит агрегатные функции (COUNT,SUM, ...)- грамотный
WHEREуменьшает объём данных доGROUP BYи ускоряет запрос
Итого
WHEREфильтрует строки.- Условия можно комбинировать через
AND/OR, при смешивании — используй скобки. INиBETWEENупрощают запись условий.LIKEпомогает искать строки по шаблону:%и_.NULLпроверяется черезIS NULL.