Как работает оператор WHERE?

Оператор WHERE в SQL используется для фильтрации строк, извлекаемых из базы данных при выполнении запроса. Он позволяет задать условие, которому должны соответствовать строки, чтобы попасть в результирующий набор. Если строка удовлетворяет этому условию, она включается в результат. Если не удовлетворяет — исключается.

Оператор WHERE может применяться во многих SQL-операциях, включая SELECT, UPDATE, DELETE, а также в подзапросах. Он играет ключевую роль в выборке нужной информации из таблиц.

Общий синтаксис оператора WHERE

SELECT столбцы
FROM таблица
WHERE условие;

Примеры использования

Простой пример

SELECT \* FROM Employees
WHERE Department = 'Sales';

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

С числовым условием

SELECT \* FROM Products
WHERE Price > 100;

Выбирает продукты с ценой больше 100.

С датой

SELECT \* FROM Orders
WHERE OrderDate >= '2024-01-01';

Выбирает заказы, оформленные начиная с 1 января 2024 года.

Поддерживаемые операторы в WHERE

1. Сравнение значений

  • \= — равно

  • != или <> — не равно

  • > — больше

  • < — меньше

  • >= — больше или равно

  • <= — меньше или равно

Пример:

SELECT \* FROM Employees
WHERE Salary >= 50000;

2. Логические операторы

  • AND — логическое И

  • OR — логическое ИЛИ

  • NOT — логическое НЕ

SELECT \* FROM Employees
WHERE Department = 'IT' AND Salary > 60000;
SELECT \* FROM Orders
WHERE NOT Status = 'Cancelled';

3. Множественный выбор: IN

SELECT \* FROM Products
WHERE Category IN ('Books', 'Electronics', 'Toys');

Оператор IN эквивалентен нескольким условиям OR, но работает быстрее и читается лучше.

4. Диапазоны: BETWEEN ... AND

SELECT \* FROM Products
WHERE Price BETWEEN 100 AND 200;

Включает оба края диапазона (100 и 200). Эквивалентен:

WHERE Price >= 100 AND Price <= 200

5. Поиск по шаблону: LIKE

Используется для поиска по строковым шаблонам. Поддерживает подстановочные символы:

  • % — любое количество любых символов

  • _ — ровно один любой символ

SELECT \* FROM Customers
WHERE Name LIKE 'A%'; -- Имя начинается с "A"
SELECT \* FROM Customers
WHERE Email LIKE '%@gmail.com'; -- Email заканчивается на @gmail.com

6. Проверка на NULL: IS NULL / IS NOT NULL

SELECT \* FROM Users
WHERE PhoneNumber IS NULL;
SELECT \* FROM Orders
WHERE DeliveryDate IS NOT NULL;

NULL — это специальное значение "пусто", оно не эквивалентно ни 0, ни пустой строке. Проверки через = с NULL не работают, используется только IS NULL.

7. С подзапросами

SELECT \* FROM Employees
WHERE DepartmentID IN (
SELECT ID FROM Departments WHERE Name = 'HR'
);  

8. Сложные условия

Можно комбинировать условия с помощью скобок:

SELECT \* FROM Orders
WHERE (Status = 'Pending' OR Status = 'Processing')
AND OrderDate >= '2023-01-01';

WHERE в других операциях

В UPDATE:

UPDATE Employees
SET Salary = Salary \* 1.1
WHERE Department = 'Sales';

В DELETE:

DELETE FROM Orders
WHERE Status = 'Cancelled';

В подзапросах:

SELECT Name FROM Customers
WHERE ID NOT IN (
SELECT CustomerID FROM Orders
);

Порядок выполнения с WHERE

Когда выполняется SQL-запрос, WHERE используется до GROUP BY, HAVING и ORDER BY. Это значит, что фильтрация с WHERE происходит до всех агрегаций и сортировок.

Пример:

SELECT Department, AVG(Salary)
FROM Employees
WHERE Active = 1
GROUP BY Department;

Здесь WHERE Active = 1 сначала исключает неактивных сотрудников, и только потом выполняется группировка.

Особенности и подводные камни

  • WHERE не может использовать псевдонимы столбцов, объявленные в SELECT.

  • Нельзя сравнивать NULL с помощью = или !=, только через IS NULL или IS NOT NULL.

  • Условия с OR могут мешать использованию индексов — следует внимательно анализировать производительность.

  • Для строк в SQL сравнение чувствительно к регистру или нечувствительно в зависимости от настроек коллатора базы данных.

Оператор WHERE — это мощный и гибкий механизм фильтрации строк в SQL. Он предоставляет большое разнообразие способов задать условия, от простых сравнений до вложенных подзапросов и шаблонов. Его правильное использование критично как для получения корректных результатов, так и для оптимизации производительности запросов.