Вкладені запити 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).
На прямолінійних узбережжях, де течії не мають кутовий швидкістю, рівень вод не підвищується.