Когда мы извлекаем данные из базы, нас редко интересуют абсолютно все столбцы. Например, в таблице сотрудников employees может быть 15 столбцов: имя, фамилия, дата рождения, должность, зарплата, дата найма и так далее. А вам нужно всего лишь узнать их имена и должности. Логично, что тянуть все данные — это бесполезно и неэффективно. Вот тут и вступает в игру искусство выборки конкретных столбцов.
Если проводить аналогию, то это как если бы вам нужно было из общей корзины с апельсинами, яблоками и бананами вытащить только яблоки. Классно же? Вот этим мы и займёмся!
Синтаксис
Напоминаем, SQL спроектировали максимально user-friendly.
Во-первых, регистр текста запроса не играет значения. Ты можешь написать SELECT, Select, или select и все будет работать. Во-вторых, перенос строк никак не учитывается. СУБД все равно превратит запрос в одну длинную строку, так что можешь писать ее как тебе будет угодно.
Как ты уже, наверное, догадываешься, ключевыми словами SELECT и FROM дело не ограничивается. Иначе бы не было столько разговоров вокруг SQL. Расширенный вид SQL запроса имеет вид:
SELECT колонки
FROM таблица
WHERE условие
GROUP BY колонки
HAVING колонки
ORDER BY сортировка
Где:
колонки— это названия столбцов, которые вы хотите получить.таблица— название таблицы, из которой извлекаются данные.условие— условие для фильтрации строк.сортировка— строки и порядок сортировки.
Звучит легко? Давайте разберём это на реальном примере. Но предлагаю начать с примеров попроще.
Пример базового запроса
Предположим, у нас есть таблица students, где лежат данные о студентах. Вот как может выглядеть структура таблицы:
| id | first_name | last_name | age | grade |
|---|---|---|---|---|
| 1 | Alex | Lin | 20 | A |
| 2 | Anna | Song | 22 | B |
| 3 | Otto | Art | 19 | A |
Теперь мы хотим узнать только фамилии last_name и оценки grade всех студентов.
Запрос будет выглядеть так:
SELECT last_name, grade
FROM students;
Результат выполнения:
| last_name | grade |
|---|---|
| Lin | A |
| Song | B |
| Art | A |
Поздравляю, вы только что сэкономили ресурсы базы данных и сделали результат более читабельным!
Склеивание строк
Просто выбирать данные вы уже умеете, давайте попробуем что-нибудь поинтереснее. В нашей таблице имя и фамилия разделены по разным колонкам. Давайте напишем запрос, где будет колонка с полным именем студента.
Для того, чтобы склеить две строки в PostgreSQL используется оператор ||. Выглядеть наш SELECT-запрос будет так:
SELECT first_name || last_name, grade
FROM students;
Результат выполнения:
| first_name || last_name | grade |
|---|---|
| AlexLin | A |
| AnnaSong | B |
| OttoArt | A |
Гм. Кажется тут чего-то нехватает. Например пробела между именем и фамлией! Давайте это исправим.
SELECT first_name || ' ' || last_name, grade
FROM students;
Результат выполнения:
| first_name || ' ' || last_name | grade |
|---|---|
| Alex Lin | A |
| Anna Song | B |
| Otto Art | A |
Красота. Содержимое таблицы-результата мне нравится, но что стало с заголовком? Хотелось бы видеть там full name, ну или просто name, но не first_name || ' ' || last_name. Так не красиво и не практично. Но и для этого есть решение.
Выборка с использованием псевдонимов (алиасов)
SQL-запросы можно сделать более удобочитаемыми с помощью псевдонимов. Это просто способ дать столбцу новое имя в рамках запроса. Алиасы используют ключевое слово AS (хотя формально его можно опустить, но для читаемости лучше не делать этого).
Посмотрим пример:
SELECT first_name AS "Имя", last_name AS "Фамилия", grade AS "Оценка"
FROM students;
Результат выполнения:
| Имя | Фамилия | Оценка |
|---|---|---|
| Alex | Lin | A |
| Anna | Song | B |
| Otto | Art | A |
Здесь мы:
- Переименовали столбцы, чтобы их имена стали более понятными на русском.
- Применили алиасы в запросе, используя
AS.
Если вашему начальнику или клиенту нужно вывести данные с пользователями и не дать ему поседеть при просмотре таблицы - алиасы ваш друг.
Теперь давайте немного улучшим наш запрос на получение полного имени.
SELECT first_name || ' ' || last_name AS "Полное имя", grade AS "Оценка"
FROM students;
Результат выполнения:
| Полное имя | Оценка |
|---|---|
| Alex Lin | A |
| Anna Song | B |
| Otto Art | A |
Отлично. Как мы и хотели.
Зачем выбирать только некоторые столбцы?
- Производительность
Представьте, что вы работаете с огромной таблицей на миллионы строк и сотни столбцов. Извлечение всех данных SELECT * может занять минуты или даже часы, и потребовать много ресурсов сервера. А так вы получаете только то, что нужно.
- Читаемость
Когда вы извлекаете только нужные столбцы, результат становится намного легче для понимания. Иначе ваш результат будет выглядеть, как попытка прочесть длинную ленту новостей в пятницу вечером.
- Минимизация ошибок
Чем меньше данных вы обрабатываете в запросе, тем меньше вероятность получить что-то неправильное. Особенно, если вы работаете дальше с этими данными.
О чём стоит помнить?
Псевдонимы таблиц
Другой способ справиться с длинными названиями таблиц — это использовать алиасы таблиц. Они должны напоминать исходное название таблицы или быть логично связанными с ее содержимым.
SELECT sa05.first_name, sa05.course_id
FROM students_archive_2005 AS sa05
Этот метод особенно полезен, если у вас длинные названия таблиц вроде university_students_enrollments_records можно использовать usr или us
Типичные ошибки при выборе конкретных столбцов
Ошибки в именах столбцов. Если вы напишете название столбца с ошибкой, получите сообщение об ошибке вроде:
ERROR: column "lastname" does not exist. Проверьте правильность написания имен столбцов.Конфликтующие имена. Когда в запросе участвуют несколько таблиц, обязательно указывайте, к какой таблице относится поле. Например,
students.first_name.Использование
SELECT *— это ловушка для новичков. Да, это работает и очень удобно, но в больших проектах это плохая практика! Всегда выбирайте только те столбцы, которые вам действительно нужны.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ