SELECT SQL. Введение
SELECT — центральная команда SQL из подмножества DQL, с помощью которой извлекают данные и формируют отчёты. Если вы искали практические примеры SELECT SQL — ниже собрана коллекция «живых» универсальных сценариев.
Ключевые элементы запроса: FROM, WHERE, JOIN, GROUP BY, HAVING, ORDER BY, UNION, DISTINCT, IN, EXISTS, BETWEEN, LIKE, CASE.
Все примеры в статье оформлены с подсветкой кода и возможностью скопировать в один клик.
Синтаксис
SELECT список_полей
FROM источник
[WHERE условие]
[GROUP BY поля]
[HAVING условие_агрегации]
[ORDER BY поля [ASC|DESC]];
Типовая конструкция
SELECT c.id,
c.full_name,
COALESCE(SUM(o.amount), 0) AS total_amount
FROM customers AS c
LEFT JOIN orders AS o
ON o.customer_id = c.id
WHERE c.status = 'ACTIVE'
GROUP BY c.id, c.full_name
HAVING COALESCE(SUM(o.amount), 0) > 0
ORDER BY total_amount DESC;
1. Получение всех столбцов из справочника стран:
SELECT *
FROM countries;2. Список имён сотрудников по алфавиту:
SELECT name
FROM employees
ORDER BY name ASC;3. Уникальные категории товаров через DISTINCT:
SELECT DISTINCT category
FROM products
ORDER BY category;4. Три самых дорогих товара:
SELECT id,
title,
price
FROM products
ORDER BY price DESC;5. Список активных клиентов с флагом:
SELECT id,
full_name,
is_active
FROM customers
WHERE is_active = 1;6. Первые даты заказов каждого клиента (без агрегации):
SELECT order_date,
customer_id
FROM orders
ORDER BY order_date;7. Список кодов стран и названий:
SELECT code,
name
FROM countries
ORDER BY code;8. Товары с ненулевой ценой:
SELECT id,
title,
price
FROM products
WHERE price > 0;9. Список сотрудников с указанием отдела:
SELECT e.id,
e.name,
e.department
FROM employees AS e
ORDER BY e.department, e.name;10. Клиенты с известным email (не NULL):
SELECT id,
full_name,
email
FROM customers
WHERE email IS NOT NULL;11. Простая проекция колонок заказов:
SELECT id,
customer_id,
amount
FROM orders;12. Наименования курсов и их коды:
SELECT code,
title
FROM courses
ORDER BY title;13. Города и код страны:
SELECT name,
country_code
FROM cities
ORDER BY country_code, name;14. Список публикаций с датой:
SELECT title,
published_on
FROM posts
ORDER BY published_on DESC;15. Номера счетов и баланс:
SELECT account_no,
balance
FROM accounts
ORDER BY account_no;16. Клиенты, созданные в заданном году:
SELECT id,
full_name,
created_at
FROM customers
WHERE created_at BETWEEN DATE '2020-01-01' AND DATE '2020-12-31'
ORDER BY created_at;17. Товары дороже заданного порога:
SELECT id,
title,
price
FROM products
WHERE price >= 100.00
ORDER BY price DESC;18. Города страны по коду (равенство):
SELECT name
FROM cities
WHERE country_code = 'US'
ORDER BY name;19. Поиск клиентов по началу имени (LIKE):
SELECT id,
full_name
FROM customers
WHERE full_name LIKE 'Ann%'
ORDER BY full_name;20. Фильтр по множеству статусов (IN):
SELECT id,
status
FROM orders
WHERE status IN ('NEW','PAID','SHIPPED')
ORDER BY id;21. Исключение пустых email (IS NOT NULL AND <> »):
SELECT id,
email
FROM customers
WHERE email IS NOT NULL
AND email <> ''
ORDER BY id;22. Заказы выше среднего чека (с подзапросом):
SELECT o.id,
o.amount
FROM orders AS o
WHERE o.amount > (
SELECT AVG(amount)
FROM orders
)
ORDER BY o.amount DESC;23. Сотрудники из указанного отдела:
SELECT id,
name
FROM employees
WHERE department = 'IT'
ORDER BY name;24. Транзакции в заданный месяц:
SELECT id,
happened_at,
amount
FROM transactions
WHERE happened_at BETWEEN TIMESTAMP '2024-05-01 00:00:00' AND TIMESTAMP '2024-05-31 23:59:59'
ORDER BY happened_at;25. Посты с названием, содержащим фразу:
SELECT id,
title
FROM posts
WHERE title LIKE '%SQL%'
ORDER BY id;26. Платежи по клиентам, исключая возвраты:
SELECT id,
customer_id,
amount
FROM payments
WHERE type <> 'REFUND'
ORDER BY id;27. Счета с нулевым или отрицательным балансом:
SELECT account_no,
balance
FROM accounts
WHERE balance <= 0
ORDER BY balance;28. Курсы уровня advanced или pro:
SELECT code,
title,
level
FROM courses
WHERE level IN ('ADVANCED','PRO')
ORDER BY title;29. Сотрудники, у кого нет email:
SELECT id,
name
FROM employees
WHERE email IS NULL
ORDER BY id;30. Города, начинающиеся на ‘New ‘:
SELECT name
FROM cities
WHERE name LIKE 'New %'
ORDER BY name;31. Сумма заказов по клиентам:
SELECT customer_id,
SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id
ORDER BY total_amount DESC;32. Количество заказов по статусам:
SELECT status,
COUNT(*) AS cnt
FROM orders
GROUP BY status
ORDER BY cnt DESC;33. Средняя цена по категориям:
SELECT category,
AVG(price) AS avg_price
FROM products
GROUP BY category
ORDER BY category;34. Минимальная/максимальная дата транзакций:
SELECT MIN(happened_at) AS first_tx,
MAX(happened_at) AS last_tx
FROM transactions;35. Средний балл по курсам:
SELECT course_id,
AVG(score) AS avg_score
FROM grades
GROUP BY course_id
ORDER BY avg_score DESC;36. Топ клиентов по сумме покупок (HAVING):
SELECT customer_id,
SUM(amount) AS revenue
FROM orders
GROUP BY customer_id
HAVING SUM(amount) >= 1000
ORDER BY revenue DESC;37. Частота встречаемости домена email:
SELECT SUBSTRING(email FROM POSITION('@' IN email)+1) AS domain,
COUNT(*) AS cnt
FROM customers
WHERE email IS NOT NULL
GROUP BY SUBSTRING(email FROM POSITION('@' IN email)+1)
ORDER BY cnt DESC;38. Количество постов по авторам:
SELECT author,
COUNT(*) AS posts_cnt
FROM posts
GROUP BY author
ORDER BY posts_cnt DESC;39. Средний остаток товара по складам:
SELECT warehouse_id,
AVG(qty_on_hand) AS avg_qty
FROM stock
GROUP BY warehouse_id
ORDER BY warehouse_id;40. Сумма платежей по месяцам:
SELECT CAST(happened_at AS DATE) AS day,
SUM(amount) AS day_sum
FROM payments
GROUP BY CAST(happened_at AS DATE)
ORDER BY day;41. Корзины: среднее количество позиций:
SELECT customer_id,
AVG(qty) AS avg_qty
FROM cart_items
GROUP BY customer_id
ORDER BY avg_qty DESC;42. Города: количество по странам:
SELECT country_code,
COUNT(*) AS city_cnt
FROM cities
GROUP BY country_code
ORDER BY city_cnt DESC;43. Курсы: сколько записей на курс:
SELECT course_id,
COUNT(*) AS enroll_cnt
FROM enrollment
GROUP BY course_id
ORDER BY enroll_cnt DESC;44. Продукты: категория с максимумом товаров:
SELECT category,
COUNT(*) AS cnt
FROM products
GROUP BY category
ORDER BY cnt DESC;45. Аккаунты: сколько активных контактов:
SELECT account_id,
COUNT(*) AS contacts
FROM contacts
WHERE active = 1
GROUP BY account_id
ORDER BY contacts DESC;46. Клиенты и их заказы (INNER JOIN):
SELECT c.id,
c.full_name,
o.id AS order_id,
o.amount
FROM customers AS c
JOIN orders AS o
ON o.customer_id = c.id
ORDER BY c.id, o.id;47. Все клиенты и их заказы (LEFT JOIN):
SELECT c.id,
c.full_name,
o.id AS order_id,
o.amount
FROM customers AS c
LEFT JOIN orders AS o
ON o.customer_id = c.id
ORDER BY c.id, o.id;48. Заказы и товары (соединение через детали):
SELECT o.id AS order_id,
od.product_id,
p.title AS product_title,
od.qty
FROM orders AS o
JOIN order_items AS od
ON od.order_id = o.id
JOIN products AS p
ON p.id = od.product_id
ORDER BY o.id, od.product_id;49. Города с названием страны:
SELECT ci.name AS city,
co.name AS country
FROM cities AS ci
JOIN countries AS co
ON co.code = ci.country_code
ORDER BY country, city;50. Посты вместе с именем автора:
SELECT p.id,
p.title,
a.name AS author_name
FROM posts AS p
JOIN authors AS a
ON a.id = p.author_id
ORDER BY p.id;51. Сотрудник и его текущий отдел:
SELECT e.id,
e.name,
d.title AS department
FROM employees AS e
JOIN departments AS d
ON d.id = e.department_id
ORDER BY e.id;52. Сделка CRM и аккаунт:
SELECT d.deal_id,
d.amount,
a.name AS account
FROM crm_deal AS d
JOIN crm_account AS a
ON a.account_id = d.account_id
ORDER BY d.deal_id;53. Ученики и их курсы:
SELECT s.id AS student_id,
s.name AS student_name,
c.title AS course_title
FROM students AS s
JOIN enrollment AS e
ON e.student_id = s.id
JOIN courses AS c
ON c.id = e.course_id
ORDER BY s.id;54. Склады и остатки:
SELECT w.id AS warehouse_id,
w.location,
st.product_id,
st.qty_on_hand
FROM warehouses AS w
JOIN stock AS st
ON st.warehouse_id = w.id
ORDER BY w.id, st.product_id;55. Пациенты и последние визиты (LEFT JOIN):
SELECT p.patient_id,
p.full_name,
v.visited_at,
v.diagnosis
FROM patients AS p
LEFT JOIN visits AS v
ON v.patient_id = p.patient_id
ORDER BY p.patient_id, v.visited_at DESC;56. Заказы и платежи:
SELECT o.id AS order_id,
o.customer_id,
pay.amount AS payment_amount
FROM orders AS o
LEFT JOIN payments AS pay
ON pay.order_id = o.id
ORDER BY o.id;57. Комментарии с заголовками постов:
SELECT c.id,
c.body,
p.title AS post_title
FROM comments AS c
JOIN posts AS p
ON p.id = c.post_id
ORDER BY c.id;58. Транзакции и счёт:
SELECT t.id,
t.amount,
a.account_no
FROM transactions AS t
JOIN accounts AS a
ON a.id = t.account_id
ORDER BY t.id;59. Города, страны и регионы:
SELECT c.name AS city,
co.name AS country,
r.title AS region
FROM cities AS c
JOIN countries AS co
ON co.code = c.country_code
JOIN regions AS r
ON r.id = c.region_id
ORDER BY country, region, city;60. Заказы с менеджерами:
SELECT o.id AS order_id,
m.full_name AS manager
FROM orders AS o
JOIN managers AS m
ON m.id = o.manager_id
ORDER BY o.id;61. Клиенты, у которых есть заказы (EXISTS):
SELECT c.id,
c.full_name
FROM customers AS c
WHERE EXISTS (
SELECT 1
FROM orders AS o
WHERE o.customer_id = c.id
)
ORDER BY c.id;62. Товары, которые встречаются в заказах (IN):
SELECT p.id,
p.title
FROM products AS p
WHERE p.id IN (
SELECT oi.product_id
FROM order_items AS oi
)
ORDER BY p.id;63. Посты с комментариями (EXISTS):
SELECT p.id,
p.title
FROM posts AS p
WHERE EXISTS (
SELECT 1
FROM comments AS c
WHERE c.post_id = p.id
)
ORDER BY p.id;64. Студенты, записанные хотя бы на один курс:
SELECT s.id,
s.name
FROM students AS s
WHERE s.id IN (
SELECT e.student_id
FROM enrollment AS e
)
ORDER BY s.id;65. Склады, где есть положительный остаток:
SELECT w.id,
w.location
FROM warehouses AS w
WHERE EXISTS (
SELECT 1
FROM stock AS st
WHERE st.warehouse_id = w.id
AND st.qty_on_hand > 0
)
ORDER BY w.id;66. Аккаунты с активными контактами:
SELECT a.account_id,
a.name
FROM crm_accounts AS a
WHERE EXISTS (
SELECT 1
FROM contacts AS c
WHERE c.account_id = a.account_id
AND c.active = 1
)
ORDER BY a.account_id;67. Клиенты без заказов (NOT EXISTS):
SELECT c.id,
c.full_name
FROM customers AS c
WHERE NOT EXISTS (
SELECT 1
FROM orders AS o
WHERE o.customer_id = c.id
)
ORDER BY c.id;68. Заказы с платежами на сумму выше 100:
SELECT o.id,
o.customer_id
FROM orders AS o
WHERE EXISTS (
SELECT 1
FROM payments AS p
WHERE p.order_id = o.id
AND p.amount > 100
)
ORDER BY o.id;69. Посты без комментариев (NOT IN через подзапрос):
SELECT p.id,
p.title
FROM posts AS p
WHERE p.id NOT IN (
SELECT c.post_id
FROM comments AS c
)
ORDER BY p.id;70. Клиенты с заказами в 2024 году:
SELECT c.id,
c.full_name
FROM customers AS c
WHERE EXISTS (
SELECT 1
FROM orders AS o
WHERE o.customer_id = c.id
AND o.order_date BETWEEN DATE '2024-01-01' AND DATE '2024-12-31'
)
ORDER BY c.id;71. Классификация суммы заказа через CASE:
SELECT id,
amount,
CASE
WHEN amount >= 1000 THEN 'LARGE'
WHEN amount >= 100 THEN 'MEDIUM'
ELSE 'SMALL'
END AS size_bucket
FROM orders
ORDER BY amount DESC;72. Нормализация пустых email через COALESCE:
SELECT id,
COALESCE(email, 'n/a') AS email_norm
FROM customers
ORDER BY id;73. Сортировка клиентов: сначала активные:
SELECT id,
full_name,
is_active
FROM customers
ORDER BY is_active DESC, full_name;74. Округление сумм до целого:
SELECT id,
CAST(amount AS INTEGER) AS amount_int
FROM payments
ORDER BY amount_int DESC;75. Формирование метки уровня курса:
SELECT code,
title,
CASE level
WHEN 'BEGINNER' THEN 'BASIC'
WHEN 'ADVANCED' THEN 'PRO'
ELSE 'OTHER'
END AS level_label
FROM courses
ORDER BY title;76. Приоритет очереди: VIP > REG через CASE:
SELECT id,
customer_id,
CASE kind
WHEN 'VIP' THEN 1
ELSE 2
END AS priority
FROM tickets
ORDER BY priority, id;77. Категория возраста по дате рождения:
SELECT id,
birth_date,
CASE
WHEN birth_date < DATE '1980-01-01' THEN '40+'
WHEN birth_date < DATE '2005-01-01' THEN '18-39'
ELSE '0-17'
END AS age_bucket
FROM persons
ORDER BY birth_date;78. Генерация метки для остатков:
SELECT product_id,
qty_on_hand,
CASE
WHEN qty_on_hand <= 0 THEN 'OUT'
WHEN qty_on_hand < 10 THEN 'LOW'
ELSE 'OK'
END AS stock_label
FROM stock
ORDER BY product_id;79. Классификация постов по длине заголовка:
SELECT id,
title,
CASE
WHEN LENGTH(title) > 60 THEN 'LONG'
WHEN LENGTH(title) > 30 THEN 'MID'
ELSE 'SHORT'
END AS title_len
FROM posts
ORDER BY id;80. Безопасная сортировка с NULLS в конце (условная):
SELECT id,
COALESCE(email, 'zzz') AS email_sort
FROM customers
ORDER BY email_sort;81. Объединение активных и новых клиентов (UNION ALL):
SELECT id,
full_name
FROM customers
WHERE status = 'ACTIVE'
UNION ALL
SELECT id,
full_name
FROM customers
WHERE status = 'NEW'
ORDER BY id;82. Список всех авторов: из справочника и по постам (UNION):
SELECT name
FROM authors
UNION
SELECT DISTINCT author
FROM posts
ORDER BY name;83. Единый список идентификаторов объектов:
SELECT id
FROM products
UNION
SELECT id
FROM customers
UNION
SELECT id
FROM orders
ORDER BY id;84. Уникальные категории из товаров и постов:
SELECT category
FROM products
UNION
SELECT DISTINCT category
FROM posts
ORDER BY category;85. Список email из двух источников (без дублей):
SELECT email
FROM customers
WHERE email IS NOT NULL
UNION
SELECT email
FROM contacts
WHERE email IS NOT NULL
ORDER BY email;86. Сводный набор тегов:
SELECT tag
FROM product_tags
UNION
SELECT tag
FROM post_tags
ORDER BY tag;87. Имена людей из нескольких таблиц:
SELECT full_name
FROM employees
UNION
SELECT full_name
FROM students
UNION
SELECT full_name
FROM customers
ORDER BY full_name;88. Список кодов и справочников:
SELECT code
FROM countries
UNION
SELECT code
FROM regions
ORDER BY code;89. Единый поток операций (UNION ALL):
SELECT created_at AS ts,
'ORDER' AS kind
FROM orders
UNION ALL
SELECT happened_at AS ts,
'PAYMENT' AS kind
FROM payments
ORDER BY ts;90. Сводная лента действий пользователей:
SELECT occurred_at AS ts,
'LOGIN' AS kind
FROM logins
UNION ALL
SELECT occurred_at AS ts,
'LOGOUT' AS kind
FROM logouts
ORDER BY ts;91. E‑commerce: заказы клиента за последние 30 дней:
SELECT o.id,
o.order_date,
o.amount
FROM orders AS o
WHERE o.customer_id = :customer_id
AND o.order_date >= CURRENT_DATE - INTERVAL '30' DAY
ORDER BY o.order_date DESC;92. Финансы: дневной оборот по счёту:
SELECT CAST(t.happened_at AS DATE) AS day,
SUM(t.amount) AS turnover
FROM transactions AS t
WHERE t.account_id = :account_id
GROUP BY CAST(t.happened_at AS DATE)
ORDER BY day;93. Логистика: загрузка склада по товарам:
SELECT s.product_id,
SUM(s.qty_on_hand) AS total_qty
FROM stock AS s
GROUP BY s.product_id
ORDER BY total_qty DESC;94. Образование: посещаемость урока:
SELECT e.lesson_id,
COUNT(*) AS attendees
FROM enrollment AS e
GROUP BY e.lesson_id
ORDER BY attendees DESC;95. Медицина: список визитов пациента:
SELECT v.visited_at,
v.doctor_name,
v.diagnosis
FROM visits AS v
WHERE v.patient_id = :patient_id
ORDER BY v.visited_at DESC;96. HR: сотрудники, нанятые за квартал:
SELECT e.id,
e.full_name,
e.hire_date
FROM employees AS e
WHERE e.hire_date BETWEEN DATE '2025-01-01' AND DATE '2025-03-31'
ORDER BY e.hire_date;97. CRM: сделки на стадии ‘Negotiation’:
SELECT d.deal_id,
d.amount,
a.name AS account
FROM crm_deal AS d
JOIN crm_account AS a
ON a.account_id = d.account_id
WHERE d.stage = 'NEGOTIATION'
ORDER BY d.amount DESC;98. Контент: посты без комментариев:
SELECT p.id,
p.title
FROM posts AS p
WHERE NOT EXISTS (
SELECT 1
FROM comments AS c
WHERE c.post_id = p.id
)
ORDER BY p.id;99. Безопасность: неуспешные логины за сутки:
SELECT l.user_id,
l.occurred_at,
l.ip
FROM login_events AS l
WHERE l.success = 0
AND l.occurred_at >= CURRENT_TIMESTAMP - INTERVAL '1' DAY
ORDER BY l.occurred_at DESC;100. IoT: последние показания по устройству:
SELECT r.observed_at,
r.metric,
r.value
FROM readings AS r
WHERE r.device_id = :device_id
ORDER BY r.observed_at DESC;Заключение
Мы рассмотрели 100 универсальных примеров SELECT SQL: от простых выборок и фильтров до объединений и подзапросов.
Команда SELECT лежит в основе отчётности, аналитики и интеграций. В связке с CREATE VIEW и CTAS (AS SELECT) она формирует устойчивые витрины данных, а корректная индексация (INDEX) и продуманные условия WHERE / JOIN обеспечивают производительность.
Следуйте единым правилам форматирования, используйте осмысленные алиасы и проверяйте планы выполнения запросов.