Коли ми витягуємо дані з бази, нас рідко цікавлять абсолютно всі стовпці. Наприклад, у таблиці співробітників 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 *— це пастка для новачків. Так, це працює і дуже зручно, але у великих проєктах це погана практика! Завжди вибирай тільки ті стовпці, які тобі дійсно потрібні.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ