logo

SQL | WITH речення

Речення SQL WITH було представлено Oracle у базі даних Oracle 9i випуску 2. Речення SQL WITH дозволяє надати назву блоку підзапиту (цей процес також називають рефакторингом підзапиту), на який можна посилатися в кількох місцях основного запиту SQL.

  • Речення використовується для визначення тимчасового відношення таким чином, що вихід цього тимчасового відношення є доступним і використовується для запиту, пов’язаного з реченням WITH.
  • Запити, які мають пов’язане речення WITH, також можна писати за допомогою вкладених підзапитів, але це ускладнює читання/налагодження SQL-запиту.
  • Речення WITH не підтримується всіма системами баз даних.
  • Ім’я, призначене підзапиту, розглядається як вбудоване подання або таблиця
  • Речення SQL WITH було представлено Oracle у базі даних Oracle 9i випуску 2.

Синтаксис:



WITH temporaryTable (averageValue) as (SELECT avg(Attr1) FROM Table) SELECT Attr1 FROM Table, temporaryTable WHERE Table.Attr1>temporaryTable.averageValue;>

висота зсуву

У цьому запиті речення WITH використовується для визначення тимчасового відношення temporaryTable, яке має лише 1 атрибут averageValue. averageValue містить середнє значення стовпця Attr1, описане в таблиці відношень. Інструкція SELECT, що слідує за пропозицією WITH, створить лише ті кортежі, де значення Attr1 у таблиці відношення перевищує середнє значення, отримане з пропозиції WITH.

Примітка: Коли виконується запит із пропозицією WITH, спочатку обчислюється запит, згаданий у пропозиції, а результат цієї оцінки зберігається у тимчасовому відношенні. Після цього нарешті виконується основний запит, пов’язаний із пропозицією WITH, який використовує створене тимчасове відношення.



Запити

Приклад 1: Знайдіть усіх працівників, зарплата яких перевищує середню зарплату всіх працівників.
Назва відношення: Співробітник

роздільник java
EmployeeID Ім'я Зарплата
100011 Сміт 50000
100022 Білл 94000
100027 себе 70550
100845 Волден 80000
115585 Ерік 60000
1100070 Кейт 69000

SQL запит:



WITH temporaryTable(averageValue) as (SELECT avg(Salary) from Employee) SELECT EmployeeID,Name, Salary FROM Employee, temporaryTable WHERE Employee.Salary>temporaryTable.averageValue;>

Вихід:

EmployeeID Ім'я Зарплата
100022 Білл 94000
100845 Волден 80000

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

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

рядок у дату

Назва відношення: Пілот

EmployeeID Авіакомпанія Ім'я Зарплата
70007 Airbus 380 Кім 60000
70002 Боїнг Лаура 20000
10027 Airbus 380 Воля 80050
10778 Airbus 380 Уоррен 80780
115585 Боїнг Сміт 25000
114070 Airbus 380 Кеті 78000

SQL запит:

набір машинописів
WITH totalSalary(Airline, total) as (SELECT Airline, sum(Salary) FROM Pilot GROUP BY Airline), airlineAverage(avgSalary) as (SELECT avg(Salary) FROM Pilot ) SELECT Airline FROM totalSalary, airlineAverage WHERE totalSalary.total>airlineAverage.avgSalary;>

Вихід:

Авіакомпанія
Airbus 380

Пояснення: Загальна зарплата всіх пілотів Airbus 380 = 298 830, а Boeing = 45 000. Середня зарплата всіх пілотів у таблиці Pilot = 57305. Оскільки лише загальна зарплата всіх пілотів Airbus 380 більша за отриману середню зарплату, тож Airbus 380 лежить у вихідному відношенні.

Важливі моменти:

  • Речення SQL WITH добре використовувати зі складними операторами SQL, а не з простими
  • Це також дозволяє розбивати складні запити SQL на менші, що полегшує налагодження та обробку складних запитів.
  • Речення SQL WITH в основному є заміною звичайного підзапиту.