Часть бесплатной книги «SQL Введение» · Перейти к содержанию
Фильтрация данных (Оператор WHERE)
Фильтрация данных в SQL позволяет выбрать только те строки из таблицы, которые удовлетворяют определенным условиям. Для отсечения лишних записей используется оператор WHERE .

В нашей таблице players хранится 50 игроков со всей России. Давайте разберем, как с помощью фильтрации находить среди них нужных пользователей.
Примеры базовой фильтрации
Например, если мы хотим выбрать игроков, которые зарегистрировались в игре после 1 января 2025 года, мы пишем следующий запрос:
SELECT nickname, level, registration_date
FROM players
WHERE registration_date > '2025-01-15';
Результат (срез, первые 5 строк):
| nickname | level | registration_date |
|---|---|---|
| CatQueen | 12 | 2026-05-10 |
| AliceFox | 31 | 2025-11-03 |
| MaxDrive | 55 | 2025-03-14 |
| StarDust | 22 | 2026-02-18 |
| SteelKnight | 61 | 2025-05-20 |
Если мы хотим выбрать только тех опытных игроков, у которых уровень строго выше 40, а в поле звания (rank_title) указано ‘Gold’, запрос будет выглядеть так:
SELECT nickname, level, rank_title
FROM players
WHERE level > 40
AND rank_title = 'Gold';
Результат:
| nickname | level | rank_title |
|---|---|---|
| AlphaKnight | 45 | Gold |
| MaxDrive | 55 | Gold |
| PhoenixRF | 50 | Gold |
| AmurTiger | 58 | Gold |
| SeaWolf | 48 | Gold |
| StormBringer | 52 | Gold |
| MoscowGuy | 42 | Gold |
| CossackRider | 57 | Gold |
| YarBear | 44 | Gold |
| FalconScout | 49 | Gold |
| ShieldWall | 41 | Gold |
| RangerX | 53 | Gold |
| MagnetPoint | 46 | Gold |
| Lia | 52 | Gold |
Сложные условия и логические операторы (AND, OR, NOT)
С помощью оператора WHERE можно составлять многоуровневые запросы, комбинируя условия через логические связки:
- AND — должны выполняться оба условия одновременно.
- OR — должно выполняться хотя бы одно из условий.
- NOT — инвертирует (отрицает) условие.
Например, задача: «Покажи мне игроков из гильдий ‘Грифоны Эрафии’ или ‘Фениксы Конфлюкса’, у которых соревновательный рейтинг превышает 2000 очков и которые заходили в игру после 1 июня 2026 года».
SELECT nickname, guild, rating, last_login
FROM players
WHERE (guild = 'Грифоны Эрафии' OR guild = 'Фениксы Конфлюкса')
AND rating > 2000
AND last_login > '2026-06-01';
В данном запросе мы использовали круглые скобки () для обозначения приоритета. Сначала база данных проверит гильдию (подходит ли под одно из двух названий), а затем применит строгие ограничения по рейтингу и дате последнего визита.
Результат:
| nickname | guild | rating | last_login |
|---|---|---|---|
| AlphaKnight | Грифоны Эрафии | 2100 | 2026-06-20 |
| MaxDrive | Грифоны Эрафии | 2400 | 2026-06-21 |
| BalticStorm | Грифоны Эрафии | 2800 | 2026-06-20 |
| SeaWolf | Грифоны Эрафии | 2050 | 2026-06-20 |
| MountainQueen | Фениксы Конфлюкса | 3100 | 2026-06-21 |
| Lia | Фениксы Конфлюкса | 2380 | 2026-06-21 |
Если использовать NOT, мы можем легко исключить ненужное. Например, найдем игроков, которые зарегистрировались не в январе и не в феврале 2025 года:
SELECT nickname, registration_date
FROM players
WHERE registration_date NOT IN ('2025-01-15', '2025-02-10');
Здесь оператор IN проверяет совпадение со списком значений, а NOT IN — отсекает их.
Операторы фильтрации в SQL
В операторе WHERE вы можете использовать богатый набор инструментов для точечного поиска:
-
Равенство и неравенство (
=,<>)SELECT * FROM players WHERE rank_title = 'Silver'; SELECT * FROM players WHERE city <> 'Москва'; -- все города, кроме Москвы -
Сравнение (
>,<,>=,<=)SELECT * FROM players WHERE level >= 50; SELECT * FROM players WHERE wins < 10; -
Проверка диапазона (
BETWEEN .. AND)SELECT * FROM players WHERE rating BETWEEN 1500 AND 2500; -- включает границы -
Поиск по шаблону текста (
LIKE,NOT LIKE)Знак
%означает любое количество любых символов. Например, найдем все яндексовские почты:SELECT * FROM players WHERE email LIKE '%@yandex.ru'; -
Проверка на пустые значения (
IS NULL,IS NOT NULL)SELECT * FROM players WHERE guild IS NULL; -- игроки без клана
Арифметические операторы в запросах
В SQL можно выполнять математические вычисления прямо «на лету» во время выборки данных. Для этого используются стандартные знаки: + (сложение), - (вычитание), * (умножение), / (деление) и % (деление по модулю/остаток).
Давай посмотрим, как это применимо на практике к нашей таблице:
-
Сложение (
+) — посчитаем общее число сыгранных матчей (победы + поражения):SELECT nickname, wins, losses, (wins + losses) AS total_games FROM players WHERE level > 30; -
Вычитание (
-) — узнаем, на сколько побед у игрока больше, чем поражений:SELECT nickname, (wins - losses) AS win_difference FROM players WHERE wins > losses; -
Умножение (
*) — представим, что за каждую победу дают по 10 бонусных монет. Посчитаем призовой баланс:SELECT nickname, wins, (wins * 10) AS bonus_gold FROM players WHERE wins >= 100; -
Деление (
/) — узнаем среднее количество побед на один уровень персонажа:SELECT nickname, level, wins, (wins / level) AS wins_per_level FROM players WHERE level > 0;
Обрати внимание:
В вычисляемых полях мы использовали ключевое слово AS (например, AS total_games). Это псевдонимы (aliases). Они дают красивое и понятное название новому виртуальному столбцу в итоговом отчете, при этом сама исходная таблица в базе данных никак не изменяется!