🙏 Спасибо за поддержку проекта. В прошлом месяце мы собрали только $32. Этого хватает на серверы, но не на разработку, поэтому новых уроков и функций в этом месяце не будет. Пожалуйста, поддержите следующий месяц. Поддержать →
SQL код скопирован в буфер обмена

Урок 2.1 · Время чтения: ~6 мин

Выборка данных из таблицы

Выборка данных из таблицы

Самой фундаментальной операцией в SQL является извлечение данных из таблицы. Для этого используется оператор SELECT.

Наглядная схема SQL SELECT и DISTINCT

Базовый синтаксис (выборка всех столбцов)

Чтобы выбрать все столбцы из таблицы, используется синтаксис SELECT *:

SELECT *
FROM table_name;
  • SELECT: Это ключевое слово извлекает данные из таблицы.
  • * (звездочка): Указывает, что должны быть извлечены все столбцы из таблицы. Звездочка (*) действует как подстановочный знак, представляющий все столбцы в таблице.
  • FROM table_name: Указывает таблицу, из которой необходимо извлечь данные. Замените table_name фактическим именем таблицы, к которой вы обращаетесь.

Пример (база данных Sakila)

Чтобы выбрать все столбцы из таблицы actor в базе данных Sakila:

SELECT *
FROM actor;

Этот запрос вернет все строки и все столбцы (например, actor_id, first_name, last_name, last_update) из таблицы actor.

Избегайте использования * для выбора всех столбцов

Использование * для выбора всех столбцов обычно не рекомендуется. Хотя это может показаться удобным, это может привести к нескольким проблемам:

  • Влияние на производительность: Извлечение всех столбцов может увеличить объем передаваемых данных, особенно если в таблице много столбцов или большие наборы данных.
  • Непреднамеренные изменения: Если схема таблицы изменится (например, будут добавлены новые столбцы), запросы, использующие *, могут вернуть неожиданные результаты.
  • Читаемость и поддержка: Явное указание столбцов упрощает понимание и поддержку запроса.

Вместо использования * рекомендуется явно перечислять необходимые столбцы. Этот подход обеспечивает ясность, снижает риск непреднамеренных результатов и повышает производительность запроса.

Выборка определенных столбцов

Чтобы извлечь определенные столбцы, перечислите их имена в операторе SELECT, разделяя запятыми:

SELECT column1, column2, column3
FROM table_name;
  • SELECT column1, column2, column3: Указывает столбцы для извлечения. Замените column1, column2 и column3 фактическими именами столбцов.
  • FROM table_name: Указывает таблицу, из которой необходимо извлечь данные.

Пример (база данных Sakila)

Чтобы извлечь только столбцы first_name и last_name из таблицы actor:

SELECT first_name, last_name
FROM actor;

Этот запрос вернет все строки, но только столбцы first_name и last_name для каждого актера.

Выборка уникальных значений с DISTINCT

Иногда нужно получить не все строки, а только уникальные значения в столбце или наборе столбцов. Для этого используется ключевое слово DISTINCT.

Базовый синтаксис

SELECT DISTINCT column_name
FROM table_name;

DISTINCT удаляет дубликаты из результата и оставляет только уникальные строки.

Пример (база данных Sakila)

Получим список уникальных рейтингов фильмов:

SELECT DISTINCT rating
FROM film;

Этот запрос вернет каждое значение rating только один раз.

DISTINCT для нескольких столбцов

DISTINCT можно применять и к нескольким столбцам. В этом случае уникальность определяется по комбинации значений.

SELECT DISTINCT rating, rental_duration
FROM film;

Здесь будут удаляться дубликаты именно по паре rating + rental_duration.

Когда использовать DISTINCT

DISTINCT удобен, когда вы:

  • формируете справочные списки (например, уникальные категории, статусы, рейтинги);
  • проверяете качество данных (есть ли неожиданные повторяющиеся значения);
  • подготавливаете данные для фильтров и интерфейсов.

Если нужно просто проверить несколько значений в одном столбце, часто лучше использовать IN (...) в WHERE, а DISTINCT применять именно для удаления дубликатов в результирующем наборе.

Порядок столбцов в SELECT

Порядок, в котором вы перечисляете столбцы в операторе SELECT, определяет их порядок в результирующем наборе. Однако это не изменяет порядок столбцов в самой таблице.

Пример (база данных Sakila)

SELECT last_name, first_name
FROM actor;

В этом случае столбец last_name появится перед столбцом first_name в выходных данных, даже если first_name может быть определен раньше в структуре таблицы. Порядок в операторе SELECT переопределяет порядок столбцов таблицы по умолчанию.

Часто задаваемые вопросы

Можно ли использовать SELECT * в реальных проектах?

Можно, но лучше делать это осознанно. Для быстрых проверок и отладки SELECT * удобен, а в рабочем коде чаще безопаснее перечислять только нужные столбцы: так проще контролировать результат и снизить лишнюю передачу данных.

Влияет ли порядок столбцов в SELECT на структуру таблицы?

Нет. Он влияет только на порядок вывода в результате запроса. Структура таблицы в базе данных не меняется.

Почему лучше не писать SELECT * в API и отчетах?

Потому что при изменении схемы таблицы запрос начнет возвращать новые столбцы автоматически. Это может сломать API-контракты, отчеты и клиентский код, который ожидает фиксированный набор полей.

Вопросы для собеседования

В чем практический риск SELECT *?

Главные риски: лишняя передача данных, неустойчивость к изменениям схемы и ухудшение читаемости запроса. В production-коде обычно ожидают явного списка столбцов.

Когда DISTINCT может замедлять запрос?

Когда набор данных большой, потому что СУБД нужно выполнить дополнительную обработку для удаления дубликатов (часто сортировку или хеширование). Поэтому DISTINCT стоит использовать только там, где нужна уникальность.

Что вернет SELECT DISTINCT a, b?

Он вернет уникальные пары значений (a, b), а не уникальные значения каждого столбца по отдельности.

Как выбрать между DISTINCT и фильтрацией через WHERE?

WHERE применяют, когда нужно отобрать строки по условию. DISTINCT применяют, когда нужно убрать дубликаты уже отобранных строк.


Основные выводы из этого урока:

  • SELECT * извлекает все столбцы из таблицы.
  • SELECT column1, column2, ... извлекает только указанные столбцы.
  • SELECT DISTINCT column_name возвращает только уникальные значения без дубликатов.
  • Порядок столбцов в операторе SELECT определяет порядок в результирующем наборе.

Попробуйте решить следующие задачи, чтобы закрепить материал этого урока.

  1. Получить список актёров
  2. Список актёров
  3. Получить список языков
  4. Список уникальных клиентов
  5. Распределение пингвинов по островам