Как задавать вопросы базе данных: выборка, фильтрация, сортировка, UNION/EXCEPT/INTERSECT
SELECT — основа SQL. Позволяет выбрать нужные столбцы из таблицы и при необходимости переименовать их.
SELECT name, age, city
FROM users;
-- Псевдоним столбца через AS
SELECT name AS user_name,
age AS years
FROM users;
-- Только уникальные значения
SELECT DISTINCT city
FROM users;
SELECT * — все столбцы (удобно при исследовании данных)SELECT col1, col2 — только нужные столбцыAS alias — псевдоним для столбца или таблицыDISTINCT — убирает дубликаты из результатаWHERE позволяет отбирать строки по условию. Поддерживает операторы сравнения и логические операторы.
-- Простые сравнения
SELECT * FROM users
WHERE gender = 'female';
-- Логические операторы AND / OR / NOT
SELECT name, age FROM users
WHERE gender = 'male' AND age > 25;
-- IN — список значений
SELECT * FROM users
WHERE city IN ('Moscow', 'Kazan');
-- BETWEEN — диапазон (включительно)
SELECT title, score FROM posts
WHERE score BETWEEN 800 AND 1000;
-- LIKE — поиск по шаблону (% — любая строка, _ — любой символ)
SELECT name FROM users
WHERE name LIKE 'A%'; -- имена на букву A
-- IS NULL / IS NOT NULL
SELECT * FROM users
WHERE city IS NOT NULL;
IS NULL / IS NOT NULL, а не = NULL. NULL — это «неизвестное значение», оно не равно ничему, даже себе.-- Сортировка по убыванию score
SELECT title, score
FROM posts
ORDER BY score DESC;
-- Несколько столбцов сортировки: сначала по дате, потом по user_id
SELECT liked_at, user_id
FROM likes
ORDER BY liked_at ASC, user_id DESC;
-- Топ-5 постов с наибольшим score
SELECT title, score
FROM posts
ORDER BY score DESC
LIMIT 5;
-- Пропустить первые 5 записей (пагинация)
SELECT title, score
FROM posts
ORDER BY score DESC
LIMIT 5 OFFSET 5;
SQL позволяет объединять результаты нескольких SELECT-запросов как множества. Правило: количество столбцов и их типы должны совпадать.
UNION — объединение, убирает дубликатыUNION ALL — объединение, сохраняет все строки включая дубликатыEXCEPT — разность: строки из первого запроса, которых нет во второмEXCEPT ALL — разность с учётом дубликатовINTERSECT — пересечение: только строки, которые есть в обоих результатахINTERSECT ALL — пересечение с учётом дубликатов-- UNION: объединить id и заголовки постов с именами пользователей
SELECT id AS object_id, title AS object_name
FROM posts
UNION
SELECT id, name
FROM users
ORDER BY object_id, object_name;
| object_id | object_name |
|---|---|
| 1 | Andrey |
| 1 | tutorial Python basics |
| 2 | Anna |
| … | … |
-- INTERSECT: пользователи, которые В ОДИН ДЕНЬ и просматривали ленту,
-- и поставили лайк
SELECT liked_at AS action_date, user_id
FROM likes
INTERSECT
SELECT viewed_at, user_id
FROM views
ORDER BY action_date ASC, user_id DESC;
-- EXCEPT: пользователи, лайкнувшие 7 января, но не просматривавшие в тот день
SELECT user_id FROM likes
WHERE liked_at = '2026-01-07'
EXCEPT ALL
SELECT user_id FROM views
WHERE viewed_at = '2026-01-07';
INTERSECT и UNION. SQL-операции над множествами активно используются в Data Science.Декартово произведение — результат объединения каждой строки первой таблицы с каждой строкой второй. Без условия соединения это называется CROSS JOIN.
-- Все возможные пары (пользователь, сообщество)
SELECT u.name AS user_name,
c.name AS community_name
FROM users u
CROSS JOIN communities c
ORDER BY u.id, c.id;
SQL-запрос обрабатывается не в том порядке, в котором записан. Понимание порядка выполнения помогает избегать ошибок.
SELECT нельзя использовать в WHERE — WHERE выполняется раньше. Но можно использовать в ORDER BY и HAVING.IS NULL / IS NOT NULL