Мова SQL. Оператори створення та видалення об’єктів баз даних. Оператори пошуку інформації. Агрегатні функції. Вкладені запити, страница 7

• Список вибору внутрішнього підзапита, що починається з оператора чи порівняння IN,     може включати тільки одне або  ім'я стовпця. Стовпець, ім'я якого ви вказуєте в  WHERE зовнішнього оператора, повинний бути сумісним для з’єднання зі стовпцем, ім'я якого ви вказуєте в списку вибору підзапита.

• Список вибору підзапита, що починається з EXISTS, майже завжди включає "зірочку" (*). У даному випадку немає необхідності вказувати імена стовпців, оскільки ви лише виконуєте перевірку на існування (чи "неіснування") будь-яких рядків, що задовольняють зазначеним критеріям. (Ви можете задати приналежність рядків таблицям у  WHERE підзапита.) В інших випадках правила списку вибору для підзапиту, що починаєтьсязEXISTS, ідентичні правилам для стандартного списку вибору.

• Підзапити, що починаються з немодифікованого оператора порівняння (оператор порівняння, за яким не випливає ключове слово ANY або ALL), не можуть включати  GROUP BY і HAVING, якщо тільки ви не визначили заздалегідь, що в результаті групування буде повертатися єдине значення.

• Підзапити не можуть маніпулювати своїми результатами усередині себе, тобто підзапит не може включати  ORDER BY або ключове слово INTO.

Підзапити з оператором порівняння.

Розглянемо, наприклад, задачу складання списку всіх викладачів, що мають мінімальну норму навантаження (ми не знаємо коду чи назви посади, що має мінімальну норму). За допомогою з’єднань цю задачу можна було б виконати в два прийоми.

1. Знайти мінімальну норму навантаження.

SELECT MIN(NrNv)

FROM POST;

Min-NrNv

600

2. Одержати прізвища викладачів, які мають таку норму.

SELECT TCHS.NmTh, POST.NmPs, POST.NrNv

FROM TCHS, POST

WHERE price = 600;

Якщо зробити це з допомогою підзапиту, то нам буде потрібно тільки один оператор:

SELECT TCHS.NmTh, POST.NmPs, POST.NrNv

FROM TCHS INNER JOIN POST ON TCHS.CdPs = POST.CdPs

WHERE (((POST.NrNv)=(select MIN(NrNv) from POST)));

NmTh

NmPs

NrNv

Собчак А.О.

професор

600

Махно Н.Є.

професор

600

Мунтян Р.Д.

професор

600

Середа І.С.

професор

600

Здатність обчислювати значення агрегатної функції "на льоту" і повертати його в зовнішній запит для порівняння відноситься до переваг підзапитів; з’єднання не справляється з цією задачею.

Підзапити з предикатом IN (Not In)

Запит – знайти усіх викладачів, які мають усі ті посади, що є на кафедрі №2 .

SELECT TCHS.NmTh, TCHS.CdCf, TCHS.CdPs

FROM TCHS

WHERE (((TCHS.CdPs) In (select CdPs from TCHS where CdCf=2)));

NmTh

CdCf

CdPs

Бандура В.М.

6

02

Сірко В.В.

7

02

Оприско Ю.Й.

2

02

Батура О.Й.

6

02

Балагура А.М.

2

04

Черно Ф.М.

2

04

А якщо треба, що в результатній таблиці не було викладачів кафедри №2, то

SELECT TCHS.NmTh, TCHS.CdCf, TCHS.CdPs

FROM TCHS

WHERE (((TCHS.CdCf)<>2) AND ((TCHS.CdPs) In (select CdPs from TCHS where CdCf=2)));

NmTh

CdCf

CdPs

Бандура В.М.

6

02

Сірко В.В.

7

02

Батура О.Й.

6

02

Запит – знайти усіх викладачів, які мають  посади, яких немає на кафедрі  №2 .

SELECT TCHS.NmTh, TCHS.CdCf, TCHS.CdPs

FROM TCHS

WHERE (((TCHS.CdPs) Not In (select CdPs from TCHS where CdCf=2)));

NmTh

CdCf

CdPs

Середа І.С.

6

01

Мунтян Р.Д.

7

01

Колчак А.Д.

12

03

Махно Н.Є.

7

01

Собчак А.О.

12

01