Тепер ти готовий до наступного кроку — роботи з вкладеними запитами в SQL. Сьогодні розберемо, що це таке, навіщо вони потрібні, які типи вкладених запитів бувають і чому вони корисні в реальному житті.
Вкладені запити (або підзапити) — це такі SQL-запити, які використовуються всередині інших SQL-запитів. Така собі матрьошка або капуста: є зовнішній запит, а всередині нього захований інший, менший запит. Підзапит виконується першим, а його результат використовується зовнішнім запитом (іноді його називають "головним").
Розберемо на прикладі:
Приклад 1: Як це працює
У нас є таблиця students з такими даними:
| id | ім'я | вік | група_id |
|---|---|---|---|
| 1 | Аліса | 20 | 1 |
| 2 | Боб | 22 | 2 |
| 3 | Кларк | 21 | 1 |
| 4 | Діна | 23 | 3 |
| 5 | Емілія | 22 | 2 |
А ще є таблиця groups, в якій зберігається інформація про назви груп:
| id | назва |
|---|---|
| 1 | Математичний клас |
| 2 | Фізичний клас |
| 3 | Літературний клас |
Якщо ми хочемо дізнатися назви груп, в яких навчаються студенти, то можемо використати вкладений запит:
SELECT назва
FROM groups
WHERE id IN (
SELECT група_id
FROM students
WHERE вік > 21
);
Що тут відбувається?
Вкладений запит:
SELECT група_id
FROM students
WHERE вік > 21
Цей запит вибирає група_id всіх студентів старше 21 року. Результат: список ідентифікаторів груп, наприклад [2, 3].
Головний запит:
SELECT назва
FROM groups
WHERE id IN ([результати підзапиту])
Цей запит використовує результати підзапиту і повертає назви груп з id рівним 2 або 3.
Результат:
Фізичний клас
Літературний клас
Все ще нічого не зрозуміло? Логічно. Але не переймайся, зараз усе розберемо.
Почнемо з простої ідеї — результат виконання SELECT-запиту — це свого роду віртуальна таблиця. Справді, у неї є колонки, у неї є рядки. Чим не таблиця?
А якщо результат запиту — таблиця, то її можна використовувати там же, де й реальні таблиці: в операторі JOIN, наприклад, або в більш складних конструкціях.
У неї немає імені, і це проблема. Але у колонок-виразів теж немає імен, і ми вирішуємо цю проблему, призначаючи їм alias — псевдоніми. Те ж саме можна робити і з віртуальними таблицями.
Детальніше в наступних лекціях — не будемо спойлерити :P
Про користь вкладених запитів
Вони спрощують складні задачі. Іноді одна таблиця не містить усієї необхідної інформації, яку ти хочеш отримати. Підзапити дозволяють розбити запит на два етапи: спочатку знаходиш проміжний результат, а потім використовуєш його для отримання фінальних даних.
Робота з проміжними результатами. Вкладені запити корисні, коли треба виконати додаткові обчислення перед тим, як обробити дані. Наприклад, знайти мінімальне значення або підрахувати суму.
Покращення читабельності коду. Вкладені запити роблять код більш структурованим, особливо якщо ти працюєш з великими таблицями і складною логікою.
Основні типи вкладених запитів
Вкладені запити можна використовувати в різних частинах SQL-запиту. Залежно від того, де ти їх пишеш, вони діляться на кілька типів.
- Підзапити в
SELECT. Підзапит знаходиться в списку стовпців і використовується для обчислення значень. Це зручно, наприклад, для додавання нового стовпця в результати.
Приклад — додамо стовпець з максимальним віком серед студентів:
SELECT ім'я, вік,
(SELECT MAX(вік) FROM students) AS максимальний_вік
FROM students;
Результат:
| ім'я | вік | максимальний_вік |
|---|---|---|
| Аліса | 20 | 23 |
| Боб | 22 | 23 |
| Кларк | 21 | 23 |
| Діна | 23 | 23 |
| Емілія | 22 | 23 |
- Підзапити в
FROM. Підзапит використовується як тимчасова таблиця. Це корисно, якщо треба спочатку агрегувати або трансформувати дані.
Приклад — підрахунок середнього віку студентів у кожній групі:
SELECT tmp.група_id, tmp.середній_вік
FROM (
SELECT група_id, AVG(вік) AS середній_вік
FROM students
GROUP BY група_id
) AS tmp -- Призначаємо псевдонім tmp тимчасовій таблиці
WHERE tmp.середній_вік > 21;
Результат:
| група_id | середній_вік |
|---|---|
| 2 | 22.0 |
| 3 | 23.0 |
- Підзапити в
WHEREіHAVING. Підзапити можуть бути умовою, що фільтрує рядки. Це часто використовується для перевірки - існування записів або для порівняння значень.
Приклад — студенти, які старші за середній вік:
SELECT ім'я, вік
FROM students
WHERE вік > (
SELECT AVG(вік)
FROM students
);
Результат:
| ім'я | вік |
|---|---|
| Боб | 22 |
| Діна | 23 |
| Емілія | 22 |
Переваги використання вкладених запитів
Підвищення гнучкості: вкладені запити дозволяють працювати з більш складними структурами даних.
Розділення задач на етапи: логіку можна розбити на підзапити, що робить код більш читабельним.
Доступ до проміжних даних: ти можеш обробляти дані "на ходу", без необхідності створювати тимчасові таблиці в базі даних.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ