SELECT
Основной оператор для выборки данных из таблиц
Теория
Мы уже знаем, что такое база данных, СУБД и SQL. Пришло время познакомиться с самым часто используемым в SQL оператором, при помощи которого выполняется выборка данных из таблиц. Имя этому оператору — SELECT.
SELECT— это команда, которая говорит: «Покажи мне вот эти колонки из этой таблицы». При этом сами данные в таблице остаются нетронутыми — мы просто их вытягиваем и смотрим, анализируем, делаем какие-либо выводы. Когда вы пишете SELECT, вы отправляете в СУБД запрос, в котором просто описываете желаемый результат.
Еще раз. SELECT переводится с английского как «выбрать». И он действительно выбирает то, что вы попросите: какие столбцы, из какой таблицы, а потом отдаёт вам результат. Мы уже писали о том, что язык SQL достаточно логичен в написании. Так вот, самые простые имеют следующую логику: «Покажи мне вот это из такой-то таблицы».
SELECT— это команда, которая говорит: «Покажи мне вот эти колонки из этой таблицы». При этом сами данные в таблице остаются нетронутыми — мы просто их вытягиваем и смотрим, анализируем, делаем какие-либо выводы. Когда вы пишете SELECT, вы отправляете в СУБД запрос, в котором просто описываете желаемый результат.
Еще раз. SELECT переводится с английского как «выбрать». И он действительно выбирает то, что вы попросите: какие столбцы, из какой таблицы, а потом отдаёт вам результат. Мы уже писали о том, что язык SQL достаточно логичен в написании. Так вот, самые простые имеют следующую логику: «Покажи мне вот это из такой-то таблицы».
Синтаксис
SELECT column1, -- указываем столбцы, которые хотим получить
column2,
column3 AS столбец_3 -- задаём столбцу псевдоним
FROM table_name; -- указываем таблицу, из которой берём данные
SQL
После SELECT через запятую перечисляются столбцы, которые вы хотите получить. Запятая ставится между названиями столбцов, но после последнего — не ставится. Если хотите все столбцы сразу, можно написать *, но в реальной работе лучше так не делать: чем меньше данных запрашиваете, тем быстрее работает запрос. После FROM указываете имя таблицы — откуда брать данные.
Можно было перечислить названия столбцов через запятую в одну строку, да и весь запрос написать в одну строку, то есть вот так: SELECT column1, column2 FROM table_name;. Такая конструкция будет работать, но с точки зрения оформления вашего запроса лучше стараться писать его структурировано, как в примере выше и в примерах ниже. Каждое ключевое слово SELECT, FROM и так далее с новой строки. Перечисление самих столбцов в SELECT в колонку. В будущем это здорово упростит вам чтение своих же запросов и поможет коллегам в них быстрее разобраться.
В конце запроса вы видите точку с запятой — это признак того, что запрос как одна целая логическая команда закончен. Теперь к примерам.
Можно было перечислить названия столбцов через запятую в одну строку, да и весь запрос написать в одну строку, то есть вот так: SELECT column1, column2 FROM table_name;. Такая конструкция будет работать, но с точки зрения оформления вашего запроса лучше стараться писать его структурировано, как в примере выше и в примерах ниже. Каждое ключевое слово SELECT, FROM и так далее с новой строки. Перечисление самих столбцов в SELECT в колонку. В будущем это здорово упростит вам чтение своих же запросов и поможет коллегам в них быстрее разобраться.
В конце запроса вы видите точку с запятой — это признак того, что запрос как одна целая логическая команда закончен. Теперь к примерам.
Примеры
1. Все столбцы из таблицы workers
Этот простой запрос вернёт всю таблицу целиком: id, имена, фамилии, зарплаты, даты приёма и всё остальное. Удобно, когда нужно посмотреть, какие столбцы есть в таблице (на боевой БД на больших таблицах старайтесь не использовать *).
🔄 Попробуйте изменить запрос:
- • Замените * на конкретные столбцы: first_name, position
- • Добавьте столбец salary
2. Только имена и зарплаты
В этом запросе выводим только то, что необходимо: имена и зарплаты.
🔄 Попробуйте изменить запрос:
- • Добавьте столбец position в SELECT
- • Попробуйте увеличить зарплату на 20%, напишите отдельным столбцом после salary математическое выражение: salary * 1.2
3. Переименовываем столбцы в результате
Ключевое слово AS используется, чтобы столбцам таблицы присвоить другие названия (псевдонимы). В результате столбцы будут называться «Имя» и «Зарплата» — часто так понятнее, особенно когда данные показываете коллегам или в отчёте. AS можно не писать, но с ним код читается легче.
🔄 Попробуйте изменить запрос:
- • Переименуйте first_name в Имя_сотрудника
- • Попробуйте убрать все ключевые слова AS и запустить запрос. Отработает ли он и присвоятся ли новые имена?
4. Уникальные значения
DISTINCT - это ключевое слово, которое убирает дубликаты строк. В этом примере видно, какие вообще отделы есть в компании: 1, 2, 3 и так далее. Без повторов.
🔄 Попробуйте изменить запрос:
- • Попробуйте DISTINCT position — какие должности есть в компании?
- • А если убрать DISTINCT — что изменится?
5. Уникальные комбинации
Здесь выводятся уникальные пары «отдел — должность». Например, в отделе 1 есть «Продавец-консультант» и «Менеджер по продажам». DISTINCT проверяет сочетание двух столбцов целиком.
🔄 Попробуйте изменить запрос:
- • Попробуйте поменять порядок столбцов: сначала position, потом department_id
- • Попробуйте добавить в SELECT еще один столбец после position
Типичные ошибки
Звёздочка там, где не надо
Пользователи часто пишут SELECT * всегда и везде. Это удобно, но на больших таблицах запрос будет тормозить и тащить кучу лишнего. Лучше привыкать сразу перечислять только нужные столбцы, тем более для решения конкретной задачи все столбцы вам вряд ли понадобятся.
Забывают про FROM
Запрос должен быть полным: SELECT first_name FROM workers; — а не просто SELECT first_name;. Без FROM СУБД не поймёт, откуда брать данные.
Лишние запятые
SELECT first_name, last_name, FROM workers; — запятая после last_name лишняя, будет ошибка. Запятые только между названиями, после последнего — нет.
Путают AS с переименованием столбцов в самой таблице
AS меняет название столбца только в результате, сами столбцы в таблице остаются с прежними именами.
Практика
Проверь себя
Ответьте на вопросы, чтобы закрепить материал:
1
Что вернёт запрос SELECT email FROM users;?
2
Из таблицы products нужно получить список всех категорий товаров. Каждая категория должна встретиться только один раз. Напишите SQL запрос.
3
Какой результат вернёт запрос SELECT city, registration_date FROM users;?
4
Напишите запрос, который покажет названия товаров product_name и их цены price из таблицы products, но чтобы в результате колонки назывались Товар и Цена.
5
Чем отличаются запросы SELECT * FROM orders; и SELECT status FROM orders;?
6
В таблице orders есть статусы заказов. Нужно узнать, какие вообще статусы бывают, без повторений.
7
Сколько строк вернёт запрос SELECT DISTINCT city FROM users;, если в таблице 50 пользователей, из которых 15 живут в Москве, 10 в Казани, а остальные в разных городах?
8
Напишите запрос, который выведет имена first_name и фамилии last_name всех пользователей из таблицы users.