ВГОРУ

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

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

Підзапит – це оператор SELECT, вкладений у інший SELECT, SELECT...INTO, INSERT...INTO, DELETE, UPDATE або всередині іншого підзапиту.

Текст підзапиту має бути розміщений у дужках. Часто підзапити використовують замість поєднання таблиць (JOIN).


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

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

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

Run SQLSELECT City 
FROM Sellers 
WHERE Country = 'Canada'

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

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

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

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

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

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

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

Run SQLSELECT 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, використавши повні назви стовпців (Таблиця.Поле).