Вкладені запити sql

Тепер повернемося до БД «Сесія» і розглянемо на її прикладі використання вкладених запитів.

За допомогою SQL можна вкладати запити всередину один одного. Зазвичай внутрішній запит генерує значення, яке перевіряється в предикате зовнішнього запиту (в реченні WHERE або HAVING), що визначає, вірно воно чи ні. Спільно з підзапитом можна використовувати предикат EXISTS, який повертає істину, якщо висновок підзапиту не пустили.

У поєднанні з іншими можливостями оператора вибору, такими як угруповання, підзапит являє собою потужний засіб для досягнення потрібного результату. У частині FROM оператора SELECT припустимо застосовувати синоніми до імен таблиці, якщо при формуванні запиту нам потрібно більш ніж один екземпляр деякого відносини. Синоніми задаються з використанням ключового слова AS, яке може бути взагалі опущено. Тому частина FROM може виглядати наступним чином:

FROM Rl AS A, Rl AS В

обидва вирази еквівалентні і розглядаються як застосування оператора SELECT до двох екземплярів таблиці R1.

Наприклад, покажемо, як виглядають на SQL деякі запити до БД «Сесія»:

  • Список тих, хто здав всі покладені іспити.

WHERE Оцінка> 2

HAVING COUNT (*) = (SELECT COUNT (*)

WHERE R2.Группа = R3.Группа AND ФІОа.ФІО)

Тут у вбудованому запиті визначається загальне число іспитів, які повинен здавати кожен студент, який навчається в групі, в якій навчається даний студент, і це число порівнюється з числом іспитів, які здав даний студент.

  • Список тих, хто повинен був здавати екзамен з БД, але поки ще не здавав.

WHERE R2.Fpynna = R3.Группа AND Дисципліна = "БД" AND NOT EXISTS

(SELECT ПІБ FROM Rl WHERE ПІБ = а.ФІО AND Дисципліна = "БД")

Предикат EXISTS (SubQuery) правдивий, коли підзапит SubQuery не пустили, тобто містить хоча б один кортеж, в іншому випадку предикат EXISTS хибна.

Предикат NOT EXISTS назад - правдивий тільки тоді, коли підзапит SubQuery порожній.

Зверніть увагу, яким чином NOT EXISTS з вкладеним запитом дозволяє обійтися без операції різниці відносин. Наприклад, формулювання запиту зі словом «все» може бути виконана як би з подвійним запереченням. Розглянемо приклад бази, яка моделює поставку окремих деталей окремими постачальниками, вона представлена ​​одним відношенням SP «Постачальники-деталі» зі схемою

SP (Номер_поставщіка. Номер_деталі) Р (номер_деталі. Найменування)

Ось яким чином формулюється відповідь на запит: «Знайти постачальників, які постачають всі деталі».

SELECT DISTINCT НОМЕР_ПОСТАВЩІКА FROM SP SP1 WHERE NOT EXISTS

FROM P WHERE NOT EXISTS

(SELECT * FROM SP SP2

WHERE SР2.номер_поставщіка = SР1.номер_поставщіка AND

Фактично ми переформулювали цей запит так: «Знайти постачальників таких, що не існує деталі, яку б вони не постачали». Слід зазначити, що цей запит може бути реалізований і через агрегатні функції з підзапитом:

SELECT DISTINCT Номер_поставщіка

GROUP BY Номер_поставщіка

HAVING CounKDISTINCT номер_деталі) =

(SELECT Count (номер_деталі)

У стандарті SQL92 оператори порівняння розширені до багаторазових порівнянь з використанням ключових слів ANY і ALL. Це розширення використовується при порівнянні значення певного стовпця зі стовпцем даних, що повертається вкладеним запитом.

Ключове слово ANY, поставлене в будь-якому предикате порівняння, означає, що предикат буде істинний, якщо хоча б для одного значення з підзапиту предикат порівняння правдивий. Ключове слово ALL вимагає, щоб предикат порівняння був би правдивий при порівнянні з усіма рядками підзапиту.

Наприклад, знайдемо студентів, які здали всі іспити на оцінку не нижче ніж «добре». Працюємо з тією ж базою «Сесія», але додамо до неї ще одне відношення R4, яке характеризує здачу лабораторних робіт протягом семестру:

R1 = (ПІБ, Дисципліна, Оцінка);

R4 = (ПІБ, Дисципліна, Номер_лаб_раб, Оцінка);

Select R1.ФІО From R1 Where 4> = All (Select Rl.Оценка

Where R1.Фіо = R11.Фіо)

Розглянемо ще один приклад:

Вибрати студентів, у яких оцінка по іспиту не менше, аніж хоча б одна оцінка по зданим їм лабораторних робіт з даної дисципліни:

From R1 Where R1.Оценка> = ANY (Select R4.Оценка

Where Rl.Дісціпліна = R4. Дисципліна AND R1.Фіо = R4.Фіо)

НОВИНИ ФОРУМУ
Лицарі теорії ефіру

Про це Корнілов написав на своїй сторінці в соцмережі.

За словами Корнілова, тоді його повідомлення було сприйнято з недовірою.

Тепер же Сміла Корнілов вирішив повернутися до цієї теми, в зв'язку з чим публікує у себе в фейсбуці фотографії загадкових ізраїльтян, які брали участь в одеській бійні.

Серед безлічі питань, на які Корнілов, за його словами, хотів би отримати відповідь, наприклад, такі:

«Чому вони випадково розгулювали по Одесі з медичним спорядженням, в гумових рукавичках, звідки вони знали заздалегідь про те, що будуть поранені й убиті? Або чому цей боєць раптом різко забув англійську, коли зрозумів, що його записують? ».

Води озер, морів і океанів північного по --------- Лушар обертаються проти годинникової -з-т - р-е-л-к-і, а води південного полушарія- в-ра - ща-ють -ся- по- ч-асів стрілкою, - обра-зуя- -гіг-ант-скі-е вод-ово-роти.

Основною причиною обертання вирів є місцеві вітру.
І чим вище швидкість вітрів тим вище швидкість обертання вирів і як наслідок, вище відцентрова сила вирів, завдяки чому підвищується рівень вод морів і океанів.
А чим нижче відцентрова сила вирів, тим нижче рівень вод морів і океанів.

Швидкість течій, по периметру морів і океанів не скрізь однакова і залежить від глибини узбережжя. У мілководній частині моря швидкість течій збільшується, а в глибоководній частині моря зменшується.
Сезонні коливання рівня вод спостерігаю-ться не по всьому узбережжю морів і океан-ів, а тільки в тих узбережжях де висока кутова швидкість течій і як наслідок, висока відцентрова сила води. (Відцентрова сила F = v / r).
На прямолінійних узбережжях, де течії не мають кутовий швидкістю, рівень вод не підвищується.

Схожі статті