SQL med klausul introducerades av Oracle i Oracle 9i release 2-databasen. SQL WITH-klausulen låter dig ge ett underfrågeblock ett namn (en process som också kallas refactoring av underfrågor), som kan refereras på flera ställen i huvud SQL-frågan.
- klausulen används för att definiera en tillfällig relation så att utmatningen av denna tillfälliga relation är tillgänglig och används av frågan som är associerad med klausulen med.
- frågor som har en associerad med klausul kan också skrivas med kapslade underfrågor men gör det mer komplicerat att läsa/felsöka SQL-frågan.
- med klausul stöds inte av alla databassystem.
- namnet som tilldelats underfrågan behandlas som om det var en inline-vy eller tabell
- SQL med-klausulen introducerades av Oracle i Oracle 9i release 2-databasen.
Syntax:
WITH temporaryTable (averageValue) as (SELECT avg(Attr1) FROM Table), SELECT Attr1 FROM Table WHERE Table.Attr1 > temporaryTable.averageValue;
i denna fråga används med klausul för att definiera en tillfällig relation temporaryTable som bara har 1 attribut averagevalue. averageValue har medelvärdet av kolumn Attr1 som beskrivs i relationstabell. SELECT-uttalandet som följer med-klausulen kommer endast att producera de tuplar där värdet av Attr1 i relationstabellen är större än det genomsnittliga värdet som erhållits från med-klausulen.
Obs: När en fråga med en med-klausul körs utvärderas först frågan som nämns i klausulen och utmatningen från denna utvärdering lagras i en tillfällig relation. Efter detta körs huvudfrågan i samband med med-klausulen slutligen som skulle använda den tillfälliga relationen som produceras.
frågor
exempel 1: Hitta alla anställda vars lön är mer än medellönen för alla anställda.
relationens namn: 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:
EmployeeID | namn | lön |
---|---|---|
100022 | Bill | 94000 |
100845 | Walden | 80000 |
förklaring: Den genomsnittliga lönen för alla anställda är 70591. Därför ligger alla anställda vars lön är mer än det erhållna genomsnittet i produktionsförhållandet.
exempel 2: Hitta alla flygbolag där den totala lönen för alla piloter i det flygbolaget är mer än genomsnittet av den totala lönen för alla piloter i databasen.
relationens namn: 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-fråga:
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;
utgång:
Airbus 380
förklaring: den totala lönen för alla piloter i Airbus 380 = 298,830 och Boeing = 45000. Genomsnittlig lön för alla piloter i tabellen Pilot = 57305. Eftersom endast den totala lönen för alla piloter i Airbus 380 är större än den genomsnittliga lönen som erhållits, så ligger Airbus 380 i utgångsförhållandet.
viktiga punkter:
- SQL med klausulen är bra när den används med komplexa SQL-satser snarare än enkla
- Det låter dig också bryta ner komplexa SQL-frågor till mindre som gör det enkelt för felsökning och bearbetning av komplexa frågor.
- SQL med klausulen är i grunden en drop-in ersättning till den normala underfrågan.
denna artikel är bidragen av Mayank Kumar. Om du gillar GeeksforGeeks och vill bidra kan du också skriva en artikel med contribute.geeksforgeeks.org eller skicka din artikel till [email protected]. Se din artikel visas på GeeksforGeeks huvudsida och hjälpa andra nördar.