До цього часу ми отримували дані з бази даних за допомогою простих запитів та одного оператора SELECT. Однак, все-таки, частіше нам потрібно буде вибирати дані, що відповідають багатьом умовам, і тут не обійтися без розширених запитів. Для цього в SQL існують підзапити або вкладені запити, коли один оператор SELECT вкладається у інший.
Підзапит – це оператор SELECT, вкладений у інший SELECT, SELECT...INTO, INSERT...INTO, DELETE, UPDATE або всередині іншого підзапиту.
Текст підзапиту має бути розміщений у дужках. Часто підзапити використовують замість поєднання таблиць (JOIN).
Таблиці баз даних, які використовуються в СУБД 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')
Бачимо, що ми отримали аналогічні дані, як і за допомогою двох окремих запитів. Таким же чином, ми можемо збільшувати глибину вкладеності запитів, вкладаючи підзапити скільки завгодно разів.
Ми також можемо використовувати підзапити в ролі розрахункових полів. Відобразимо, наприклад, кількість реалізованої продукції по кожному продавцю за допомогою наступного запиту:
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, використавши повні назви стовпців (Таблиця.Поле).