- •Теоретичні відомості об'єднання таблиць
- •Імена таблиць і стовпців
- •Створення об'єднання
- •Об'єднання таблиць через довідкову цілісність
- •Об'єднання таблиць по рівності значень у стовпцях і інші види об'єднань
- •Об'єднання більше двох таблиць
- •Як працює підзапит?
- •Значення, які підзапит може виводити
- •Distinct з підзапитами
- •Використання агрегатних функцій в підзапитах
- •Використання підзапитів, які видають багато рядків За допомогою оператора in
- •Підзапити вибирають поодинокі стовпці
- •Використання виразів в підзапитах
- •Підзапити в пропозиції having
- •Варіанти завдань :
Підзапити вибирають поодинокі стовпці
Сенс усіх підзапитів, обговорених в цій главі, в тому, що усі вони вибирають поодинокий стовпець. Це обов'язково, оскільки отриманий вивід порівнюється з поодиноким значенням. Підтвердженням цьому являється те, що SELECT * не може використовуватися в підзапиті. Є виключення з цього, коли підзапити використовуються з оператором EXISTS.
Використання виразів в підзапитах
Ви можете використовувати вираження, засноване на стовпці, а не просто сам стовпець, в пропозиції SELECT підзапиту. Це може бути виконано або за допомогою реляційних операторів, або з IN. Наприклад, наступний запит використовує реляційний оператор = (висновок показаний на Малюнку 10.6) :
SELECT *
FROM Customers
WHERE cnum =
(SELECT snum + 1000
FROM Salespeople
WHERE sname = Serres);
Він знаходить усіх замовників, чийого значення поля cnum, рівне 1000, вище за поле snum Serres. Ми припускаємо, що стовпець sname не має ніяких подвійних значень інакше
=============== SQL Execution Log ============
| |
| SELECT * |
| FROM Customers |
| WHERE cnum = |
| (SELECT snum + 1000 |
| WHERE Salespeople |
| WHERE sname = 'Serres' |
| ============================================= |
| cnum cname city rating snum |
| ----- -------- ---- ------ ----- |
| 2002 Giovanni Rome 200 1003 |
=============================================
Малюнок 10.6 Використання підзапиту з вираженням
підзапит може провести декілька значень. Коли поля snum і сnum не мають такого простого функціонального значення як, наприклад, первинний ключ, що не завжди добре, запит типу вищезгаданого неймовірно корисний.
Підзапити в пропозиції having
Ви можете також використовувати підзапити усередині пропозиції HAVING. Ці підзапити можуть використовувати свої власні агрегатні функції, якщо вони не проводять декількох значень, або використовувати GROUP BY або HAVING. Наступний запит є прикладом цього (висновок показаний на Малюнку 10.7) :
SELECT rating, COUNT (DISTINCT cnum)
FROM Customers
GROUP BY rating
HAVING rating >
(SELECT AVG (rating)
FROM Customers
WHERE city = " San Jose');
=============== SQL Execution Log =============
| |
| SELECT rating, count (DISTINCT cnum) |
| FROM Customers |
| GROUP BY rating |
| HAVING rating > |
| (SELECT AVG (rating) snum + 1000 |
| FROM Custimers |
| WHERE city = 'San Jose'); |
|================================================ |
| rating |
| -------- -------- |
| 200 2 |
================================================
Малюнок 10.7 Пошук в San Jose замовників з оцінкою вище за середній
Ця команда підраховує замовників в San Jose з рейтингами вище за середній. Оскільки є інші оцінки, відмінні від 300, вони мають бути виведені з числом номерів замовників, які мали цю оцінку.