SELECT в SQL — как выбирать данные из таблицы
Коротко
SELECT -- главная команда в SQL. Она извлекает данные из таблиц. Всё, что вы видите в отчётах, дашбордах и выгрузках -- результат SELECT-запросов. На собеседовании аналитика каждая задача начинается с SELECT, поэтому понимать его синтаксис нужно на автомате.
Синтаксис SELECT
SELECT column1, column2, ...
FROM table_name;SELECT указывает, какие столбцы вернуть. FROM -- из какой таблицы. Порядок столбцов в результате совпадает с порядком в SELECT.
Пример -- достать имена и города пользователей:
SELECT name, city
FROM users;| name | city |
|---|---|
| Анна | Москва |
| Борис | Казань |
| Вера | Москва |
| Глеб | Новосибирск |
SELECT * -- все столбцы
Звёздочка (*) означает «все столбцы таблицы»:
SELECT *
FROM orders;Удобно для быстрого просмотра данных. Но в рабочих запросах лучше перечислять столбцы явно -- об этом ниже в разделе «типичные ошибки».
SELECT конкретных столбцов
На практике аналитику нужны 3-5 столбцов из таблицы с двадцатью. Перечисляйте только нужные:
SELECT user_id, email, created_at
FROM users;Это быстрее (меньше данных читается с диска), понятнее (видно, что именно используется) и безопаснее (не утечёт лишнее).
Алиасы -- AS
Алиас (alias) -- это временное имя для столбца или таблицы. Задаётся через ключевое слово AS:
SELECT
name AS имя_клиента,
city AS город
FROM users;| имя_клиента | город |
|---|---|
| Анна | Москва |
| Борис | Казань |
AS можно опустить -- name имя_клиента сработает так же. Но с AS читаемее, и на собеседовании это оценят.
Алиасы не меняют данные в таблице -- только названия столбцов в результате запроса. Полезно для отчётов с понятными заголовками и для вычисляемых столбцов.
Вычисляемые столбцы (выражения)
В SELECT можно писать выражения -- арифметику, конкатенацию, вызовы функций:
SELECT
product_name,
price,
quantity,
price * quantity AS total
FROM order_items;| product_name | price | quantity | total |
|---|---|---|---|
| Ноутбук | 80000 | 2 | 160000 |
| Мышь | 1500 | 5 | 7500 |
Выражению обязательно давайте алиас. Без него столбец получит автосгенерированное имя вроде ?column? -- неудобно и непрофессионально.
DISTINCT -- уникальные значения
DISTINCT убирает дубликаты из результата:
SELECT DISTINCT city
FROM users;| city |
|---|
| Москва |
| Казань |
| Новосибирск |
Без DISTINCT Москва была бы в результате дважды (Анна и Вера). DISTINCT работает по всей строке -- если указано несколько столбцов, уникальность проверяется по комбинации:
SELECT DISTINCT city, status
FROM users;Здесь «Москва + active» и «Москва + inactive» -- две разные строки, обе попадут в результат.
SELECT с WHERE
WHERE фильтрует строки по условию:
SELECT name, city
FROM users
WHERE city = 'Москва';WHERE стоит после FROM. Подробный гайд с операторами (IN, BETWEEN, LIKE, IS NULL) -- в отдельной статье.
SELECT с ORDER BY и LIMIT
ORDER BY сортирует результат, LIMIT ограничивает количество строк:
SELECT name, created_at
FROM users
ORDER BY created_at DESC
LIMIT 10;Этот запрос вернёт 10 последних зарегистрировавшихся пользователей. DESC -- по убыванию (от новых к старым), ASC -- по возрастанию (по умолчанию).
SELECT INTO / CREATE TABLE AS
Иногда результат запроса нужно сохранить в новую таблицу:
-- PostgreSQL
CREATE TABLE active_users AS
SELECT user_id, name, email
FROM users
WHERE status = 'active';Это называется CTAS (Create Table As Select). Используется для материализации промежуточных результатов, создания витрин данных и ETL-процессов. В аналитике встречается реже, чем обычный SELECT, но знать полезно.
Практические примеры
Первый запрос аналитика -- посмотреть, что в таблице:
SELECT *
FROM events
LIMIT 100;Быстрый способ понять структуру данных, прежде чем писать сложный запрос.
Посчитать метрику -- средний чек по городам:
SELECT
city,
COUNT(*) AS orders_count,
ROUND(AVG(amount), 2) AS avg_check
FROM orders
GROUP BY city
ORDER BY avg_check DESC;Переименовать столбцы для отчёта:
SELECT
u.name AS "Клиент",
u.email AS "Email",
COUNT(o.order_id) AS "Количество заказов",
SUM(o.amount) AS "Сумма"
FROM users u
JOIN orders o ON u.user_id = o.user_id
GROUP BY u.name, u.email
ORDER BY "Сумма" DESC;Двойные кавычки нужны для алиасов с кириллицей и пробелами.
Типичные ошибки
SELECT * в рабочих запросах. В продакшене и отчётах всегда перечисляйте столбцы. SELECT * тянет все столбцы -- это медленнее, ломается при изменении схемы таблицы и может случайно показать конфиденциальные данные. Для быстрого исследования -- пожалуйста, но в финальном запросе -- нет.
Выражение без алиаса. SELECT price * quantity FROM order_items вернёт столбец с именем ?column? (PostgreSQL) или price * quantity (MySQL). Всегда давайте алиас: price * quantity AS total.
DISTINCT вместо GROUP BY. Если вам нужны уникальные значения с агрегацией -- используйте GROUP BY, а не DISTINCT. SELECT DISTINCT city, COUNT(*) -- ошибка. Правильно: SELECT city, COUNT(*) FROM users GROUP BY city.
Путаница с порядком выполнения. SELECT выполняется почти последним: FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY -> LIMIT. Поэтому алиас из SELECT нельзя использовать в WHERE.
Вопросы с собеседований
-- Чем SELECT * отличается от SELECT с перечислением столбцов?
-- SELECT * возвращает все столбцы таблицы. Перечисление столбцов -- только нужные. В продакшене SELECT * не используют: лишняя нагрузка, зависимость от схемы, риск утечки данных.
-- Что делает DISTINCT? -- Убирает дублирующиеся строки из результата. Работает по всей строке -- если указано несколько столбцов, уникальность определяется по их комбинации.
-- Можно ли использовать алиас столбца в WHERE? -- Нет. WHERE выполняется до SELECT, алиас ещё не существует. Нужно повторить выражение целиком или использовать подзапрос.
-- В каком порядке SQL выполняет части запроса? -- FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY -> LIMIT. Это логический порядок -- оптимизатор может выполнять физически иначе, но результат будет таким, как если бы порядок был именно такой.
-- Напишите запрос: топ-5 городов по количеству заказов за 2025 год.
-- SELECT city, COUNT(*) AS order_count FROM orders WHERE created_at >= '2025-01-01' AND created_at < '2026-01-01' GROUP BY city ORDER BY order_count DESC LIMIT 5.
Потренируйтесь в тренажёре
SELECT -- фундамент, на котором строится всё остальное: WHERE, JOIN, GROUP BY, подзапросы. Если базу не закрепить -- более сложные темы будут буксовать. Потренируйтесь на реальных задачах -- откройте тренажёр с 200+ вопросами по SQL и разборами.
FAQ
Когда допустимо использовать SELECT *?
При исследовании данных: SELECT * FROM table LIMIT 100 -- нормальный способ посмотреть, что в таблице. В финальных запросах для отчётов и дашбордов -- всегда перечисляйте столбцы.
Влияет ли порядок столбцов в SELECT на производительность?
Нет. Порядок столбцов влияет только на то, как выглядит результат. Оптимизатор сам решает, как читать данные с диска.
DISTINCT замедляет запрос?
Да. DISTINCT требует сортировки или хэширования для удаления дубликатов. Если вы уверены, что дубликатов нет -- не ставьте DISTINCT «на всякий случай». Лишний DISTINCT -- признак непонимания данных.
Как тренироваться
SELECT -- первое, что вы напишете на любом SQL-собеседовании. Научитесь писать его быстро и без ошибок: выбирать столбцы, давать алиасы, добавлять выражения. В тренажёре Карьерник задачи построены от простого к сложному -- начните с базовых SELECT-запросов и дойдите до аналитических функций.
Больше вопросов по SQL -- в примерах вопросов по всем темам.