Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab_4.doc
Скачиваний:
2
Добавлен:
21.11.2019
Размер:
142.85 Кб
Скачать

Підзапити вибирають поодинокі стовпці

Сенс усіх підзапитів, обговорених в цій главі, в тому, що усі вони вибирають поодинокий стовпець. Це обов'язково, оскільки отриманий вивід порівнюється з поодиноким значенням. Підтвердженням цьому являється те, що 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, вони мають бути виведені з числом номерів замовників, які мали цю оцінку.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]