logo

SQL | MET clausule

De SQL WITH-clausule is door Oracle geïntroduceerd in de Oracle 9i release 2-database. Met de SQL WITH-clausule kunt u een subqueryblok een naam geven (een proces dat ook wel subquery-refactoring wordt genoemd), waarnaar op verschillende plaatsen binnen de SQL-hoofdquery 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 waaraan een WITH-clausule is gekoppeld, kunnen ook worden geschreven met behulp van geneste subquery's, maar dit voegt meer complexiteit toe bij het lezen/debuggen van de SQL-query.
  • WITH-clausule wordt niet door alle databasesystemen ondersteund.
  • De naam die aan de subquery is toegewezen, wordt behandeld alsof het een inlineweergave of tabel is
  • De SQL WITH-clausule is door Oracle geïntroduceerd in de Oracle 9i release 2-database.

Syntaxis:



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

In deze query wordt de WITH-clausule gebruikt om een ​​tijdelijke relatie TemporaryTable te definiëren die slechts één attribuut AverageValue heeft. AverageValue bevat de gemiddelde waarde van kolom Attr1, beschreven in relatietabel. De SELECT-instructie die volgt op de WITH-clausule zal alleen die tupels produceren waarbij de waarde van Attr1 in relatie Table groter is dan de gemiddelde waarde die wordt verkregen uit de WITH-clausule-instructie.

Opmerking: Wanneer een query met een WITH-clausule wordt uitgevoerd, wordt eerst de in de clausule genoemde query geëvalueerd en wordt de uitvoer van deze evaluatie opgeslagen in een tijdelijke relatie. Hierna wordt uiteindelijk de hoofdquery die is gekoppeld aan de WITH-clausule uitgevoerd, waarbij gebruik wordt gemaakt van de geproduceerde tijdelijke relatie.



Vragen

Voorbeeld 1: Vind alle werknemers wiens salaris hoger is dan het gemiddelde salaris van alle werknemers.
Naam van de relatie: Medewerker

MedewerkerID Naam Salaris
100011 Smit 50000
100022 Rekening 94000
100027 Zichzelf 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>tijdelijketabel.gemiddeldewaarde;>

Uitgang:

MedewerkerID Naam Salaris
100022 Rekening 94000
100845 Walden 80000

Uitleg: Het gemiddelde salaris van alle medewerkers is 70591. Daarom liggen alle medewerkers waarvan het salaris hoger is dan het verkregen gemiddelde in de outputrelatie.

Voorbeeld 2: Vind alle luchtvaartmaatschappijen waar het totale salaris van alle piloten bij die luchtvaartmaatschappij hoger is dan het gemiddelde van het totale salaris van alle piloten in de database.

Naam van de relatie: Piloot

MedewerkerID Luchtvaartmaatschappij Naam Salaris
70007 Luchtbus 380 Kim 60000
70002 Boeing Laura 20000
10027 Luchtbus 380 Zullen 80050
10778 Luchtbus 380 Warren 80780
115585 Boeing Smit 25000
114070 Luchtbus 380 Katja 78000

SQL-query:

katrina kaif
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;>

Uitgang:

Luchtvaartmaatschappij
Luchtbus 380

Uitleg: Het totale salaris van alle piloten van Airbus 380 = 298.830 en dat van Boeing = 45000. Gemiddeld salaris van alle piloten in de tabel Piloot = 57305. Aangezien alleen het totale salaris van alle piloten van Airbus 380 groter is dan het gemiddeld behaalde salaris, dus Airbus 380 ligt in de outputrelatie.

Belangrijke punten:

  • De SQL WITH-clausule is goed bij gebruik met complexe SQL-instructies in plaats van eenvoudige
  • Hiermee kunt u ook complexe SQL-query's opsplitsen in kleinere, waardoor het debuggen en verwerken van de complexe query's gemakkelijk wordt.
  • De SQL WITH-clausule is in feite een drop-in-vervanging van de normale subquery.