- •Теоретичні відомості об'єднання таблиць
- •Імена таблиць і стовпців
- •Створення об'єднання
- •Об'єднання таблиць через довідкову цілісність
- •Об'єднання таблиць по рівності значень у стовпцях і інші види об'єднань
- •Об'єднання більше двох таблиць
- •Як працює підзапит?
- •Значення, які підзапит може виводити
- •Distinct з підзапитами
- •Використання агрегатних функцій в підзапитах
- •Використання підзапитів, які видають багато рядків За допомогою оператора in
- •Підзапити вибирають поодинокі стовпці
- •Використання виразів в підзапитах
- •Підзапити в пропозиції having
- •Варіанти завдань :
Використання агрегатних функцій в підзапитах
Тип функцій, який автоматично може проводити поодиноке значення для будь-якого числа рядків, звичайно ж - агрегатна функція.
Будь-який запит, що використовує поодиноку функцію агрегату без пропозиції GROUP BY, вибиратиме поодиноке значення для використання в основному предикаті. Наприклад, ви хочете побачити усі замовлення, що мають суму вище середньою на 4-і жовтня (висновок показаний на Малюнку 10.3) :
SELECT *
FROM Orders
WHERE amt >
(SELECT AVG (amt)
FROM Orders
WHERE odate = 10/04/1990);
=============== SQL Execution Log ==============
| |
| SELECT * |
| FROM Orders |
| WHERE amt > |
| (SELECT AVG (amt) |
| FROM Orders |
| WHERE odate = 01/04/1990); |
| =============================================== |
| onum amt odate cnum snum |
| ----- -------- ---------- ----- ----- |
| 3002 1900.10 10/03/1990 2007 1004 |
| 3005 2345.45 10/03/1990 2003 1002 |
| 3006 1098.19 10/03/1990 2008 1007 |
| 3009 1713.23 10/04/1990 2002 1003 |
| 3008 4723.00 10/05/1990 2006 1001 |
| 3010 1309.95 10/06/1990 2004 1002 |
| 3011 9891.88 10/06/1990 2006 1001 |
================================================
Малюнок 10.3 Вибір усіх сум зі значенням вище за середній на 10/04/1990
Середня сума придбань на 4 жовтня - 1788.98 (1713.23 + 75.75) ділиться навпіл, що в цілому дорівнює 894.49. Усі рядки зі значенням в полі amt вище за це є вибраними. Майте на увазі, що згруповані агрегатні функції, які є агрегатними функціями, визначеними в термінах пропозиції GROUP BY, можуть проводити численні значення. Вони, отже, недопустимі в підзапитах такого характеру. Навіть якщо GROUP BY і HAVING використовуються у такий спосіб, що тільки одна група виводиться за допомогою підзапиту, команда буде відхилена в принципі. Ви повинні використовувати поодиноку агрегатну функцію з пропозицією WHERE, що усуне небажані групи.
Наприклад, наступний запит який повинен знайти середнє значення комісійних продавця в Лондоні
SELECT AVG (comm)
FROM Salespeople
GROUP BY city
HAVlNG city = "London";
не може використовуватися в підзапиті! В усякому разі, це не кращий спосіб формувати запит.
Іншим способом може бути
SELECT AVG (comm)
FROM Salespeople
WHERE city = "London";