De SQL WITH clause werd door Oracle geïntroduceerd in de Oracle 9i release 2 database. Met de SQL met-clausule kunt u een subquery-blok een naam geven (een proces dat ook subquery refactoring wordt genoemd), waarnaar op verschillende plaatsen in de hoofdquery van SQL kan worden verwezen.
- de clausule wordt gebruikt voor het definiëren van een tijdelijke relatie, zodat de uitvoer van deze tijdelijke relatie beschikbaar is en wordt gebruikt door de query die is gekoppeld aan de WITH-clausule.
- query ’s die geassocieerd zijn met een clausule kunnen ook geschreven worden met behulp van geneste sub-query’ s, maar dit voegt meer complexiteit toe aan het lezen/debuggen van de SQL query.
- met clausule wordt niet door alle databasesystemen ondersteund.
- de naam die is toegewezen aan de subquery wordt behandeld alsof het een inline weergave of tabel
- was de SQL met clausule werd geïntroduceerd door Oracle in de Oracle 9i release 2 database.
syntaxis:
WITH temporaryTable (averageValue) as (SELECT avg(Attr1) FROM Table), SELECT Attr1 FROM Table WHERE Table.Attr1 > temporaryTable.averageValue;
In deze query wordt met clausule gebruikt om een tijdelijke relatie temporarytabel te definiëren die slechts 1 attribuut averageValue heeft. averageValue bevat de gemiddelde waarde van kolom Attr1 zoals beschreven in de relatietabel. Het SELECT statement dat volgt op de WITH-clausule zal alleen die tupels produceren waar de waarde van Attr1 in de relatietabel groter is dan de gemiddelde waarde die wordt verkregen uit de WITH-clausule-verklaring.
opmerking: Wanneer een query met een WITH-clausule wordt uitgevoerd, wordt eerst de query genoemd in de clausule geëvalueerd en wordt de output van deze evaluatie opgeslagen in een tijdelijke relatie. Hierna wordt de belangrijkste query in verband met de met-clausule uiteindelijk uitgevoerd die de tijdelijke relatie zou gebruiken die is geproduceerd.
Queries
Voorbeeld 1: Zoek alle werknemers met een salaris dat hoger is dan het gemiddelde salaris van alle werknemers.
naam van de relatie: Employee
EmployeeID | Name | Salary |
---|---|---|
100011 | Smith | 50000 |
100022 | Bill | 94000 |
100027 | Sam | 70550 |
100845 | Walden | 80000 |
115585 | Erik | 60000 |
1100070 | Kate | 69000 |
SQL Query:
WITH temporaryTable(averageValue) as (SELECT avg(Salary) from Employee), SELECT EmployeeID,Name, Salary FROM Employee, temporaryTable WHERE Employee.Salary > temporaryTable.averageValue;
Output:
Werknemer | Naam | Salaris |
---|---|---|
100022 | Bill | 94000 |
100845 | Walden | 80000 |
Toelichting: Het gemiddelde salaris van alle werknemers is 70591. Daarom liggen alle werknemers wier salaris hoger is dan het verkregen gemiddelde in de outputverhouding.
Voorbeeld 2: Vind alle luchtvaartmaatschappijen waar het totale salaris van alle piloten in die luchtvaartmaatschappij is meer dan het gemiddelde van het totale salaris van alle piloten in de database.
naam van de relatie: Pilot
EmployeeID | Airline | Name | Salary |
---|---|---|---|
70007 | Airbus 380 | Kim | 60000 |
70002 | Boeing | Laura | 20000 |
10027 | Airbus 380 | Will | 80050 |
10778 | Airbus 380 | Warren | 80780 |
115585 | Boeing | Smith | 25000 |
114070 | Airbus 380 | Katy | 78000 |
SQL Query:
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;
Output:
Airbus 380
Toelichting: het totale salaris van alle piloten van Airbus 380 = 298.830 en dat van Boeing = 45000. Gemiddeld salaris van alle piloten in de tabel Pilot = 57305. Aangezien alleen het totale salaris van alle piloten van Airbus 380 hoger is dan het gemiddelde salaris, ligt Airbus 380 in de outputverhouding.
belangrijke punten:
- de SQL met-clausule is goed wanneer gebruikt met complexe SQL-statements in plaats van eenvoudige
- het staat u ook toe om complexe SQL-query ’s op te splitsen in kleinere query’ s die het gemakkelijk maken voor het debuggen en verwerken van de complexe query ‘ s.
- de SQL met clausule is in principe een drop-in vervanging van de normale sub-query.
Dit artikel is geschreven door Mayank Kumar. Als je GeeksforGeeks leuk vindt en wil bijdragen, kun je ook een artikel schrijven met contribute.geeksforgeeks.org of mail uw artikel naar [email protected]. Zie je artikel verschijnen op de GeeksforGeeks hoofdpagina en help andere Geeks.