SQL-Урок 9. Підзапити

До цього часу ми отримували дані з бази даних за допомогою простих запитів та одного оператора SELECT. Однак, все-таки, частіше нам потрібно буде вибирати дані, що відповідають багатьом умовам, і тут не обійтися без розширених запитів. Для цього в SQL існують підзапити або вкладені запити, коли один оператор SELECT вкладається у інший.

1. Фільтрування за допомогою підзапитів

Таблиці баз даних, які використовуються в СУБД Access являються реляційними таблицями, тобто всі таблиці можна пов'язати між собою по спільним полям. Припустимо в нас зберігаються дані в двох різних таблицях і нам потрібно вибрати дані в одній із них, в залежності від того, які дані в іншій. Для цього створимо ще одну таблицю в нашій базі даних. Це буде, наприклад, таблиця Sellers з інформацією про постачальників:

Тепер ми маємо дві таблиці - Sumproduct та Sellers, які мають однакове поле City. Припустимо, нам потрібно порахувати скільки товарів було продано лише в Канаді. Зробити це нам допоможуть підзапити. Отже, спочатку напишемо запит для вибірки міст, які знаходяться в Канаді:

SELECT City FROM Sellers WHERE Country = 'Canada'

Тепер передамо ці дані в наступний запит, який вибиратиме дані з таблиці Sumproduct:

SELECT SUM(Quantity) AS Qty_Canada FROM Sumproduct WHERE City IN ('Montreal','Toronto')

Також ми можемо об'єднати ці два запити в один. Таким чином, один запит, який виводить дані буде головним, а другий запит, який передає вхідні дані, буде допоміжним (підзапитом). Для вкладення підзапиту використаємо конструкцію WHERE ... IN (...), про яку говорилось в розділі Розширене фільтрування:

SELECT SUM(Quantity) AS Qty_Canada FROM Sumproduct WHERE City IN (SELECT City FROM Sellers WHERE Country = 'Canada')

Бачимо, що ми отримали аналогічні дані, як і за допомогою двох окремих запитів. Таким же чином, ми можемо збільшувати глибину вкладеності запитів, вкладаючи підзапити скільки завгодно разів.

2. Використання підзапитів в якості розрахункових полів

Ми також можемо використовувати підзапити в ролі розрахункових полів. Відобразимо, наприклад, кількість реалізованої продукції по кожному продавцю за допомогою наступного запиту:

SELECT Seller_name, (SELECT SUM(Quantity) FROM Sumproduct WHERE Sellers.City = Sumproduct.City) AS Qty FROM Sellers

Перший оператор SELECT відображає два стовпця - Seller_name та Qty. Поле Qty являється розрахунковим, воно формується в результаті виконання підзапиту, який взятий в круглі дужки. Цей підзапит виконується по одному разу для кожного запису в полі Seller_name та взагальному буде виконаний чотири рази, оскільки вибрано імена чотирьох продавців.

Також, в підзапиті, речення WHERE виконує функцію поєднання, оскільки за допомогою WHERE ми з'єднали дві таблиці по полю City, використавши повні назви стовпців (Таблиця.Поле).

Статті по темі:

  • SQL-Урок 8. Групування даних (GROUP BY)
  • SQL-Урок 10. Поєднання таблиць (INNER JOIN)