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 -- в примерах вопросов по всем темам.