La clausola SQL WITH è stata introdotta da Oracle nel database Oracle 9i release 2. La clausola SQL WITH consente di assegnare a un blocco di sub-query un nome (un processo chiamato anche refactoring di sub-query), a cui è possibile fare riferimento in diversi punti all’interno della query SQL principale.
- La clausola viene utilizzata per definire una relazione temporanea in modo tale che l’output di questa relazione temporanea sia disponibile e venga utilizzato dalla query associata alla clausola WITH.
- Le query che hanno una clausola associata A possono anche essere scritte usando sotto-query nidificate, ma così facendo aggiungono più complessità per leggere / eseguire il debug della query SQL.
- CON clausola non è supportato da tutti i sistemi di database.
- Il nome assegnato alla sotto-query viene trattato come se fosse una vista in linea o una tabella
- La clausola SQL WITH è stata introdotta da Oracle nel database Oracle 9i release 2.
Sintassi:
WITH temporaryTable (averageValue) as (SELECT avg(Attr1) FROM Table), SELECT Attr1 FROM Table WHERE Table.Attr1 > temporaryTable.averageValue;
In questa query CON la clausola è utilizzato per definire un temporaneo relazione temporaryTable che ha solo 1 attributo averageValue. averageValue contiene il valore medio della colonna Attr1 descritto nella tabella delle relazioni. L’istruzione SELECT che segue la clausola WITH produrrà solo quelle tuple in cui il valore di Attr1 nella tabella delle relazioni è maggiore del valore medio ottenuto dall’istruzione WITH clause.
Nota: Quando viene eseguita una query con una clausola WITH, prima viene valutata la query menzionata all’interno della clausola e l’output di questa valutazione viene memorizzato in una relazione temporanea. In seguito a ciò, viene infine eseguita la query principale associata alla clausola WITH che utilizzerebbe la relazione temporanea prodotta.
Query
Esempio 1: Trova tutti i dipendenti il cui stipendio è superiore allo stipendio medio di tutti i dipendenti.
Nome della relazione: 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:
Impiegato | Nome | Stipendio |
---|---|---|
100022 | Fattura | 94000 |
100845 | Walden | 80000 |
Spiegazione: Lo stipendio medio di tutti i dipendenti è 70591. Pertanto, tutti i dipendenti il cui stipendio è superiore alla media ottenuta si trova nella relazione di output.
Esempio 2: Trova tutte le compagnie aeree in cui lo stipendio totale di tutti i piloti in quella compagnia aerea è superiore alla media dello stipendio totale di tutti i piloti nel database.
Nome della relazione: 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 |
Query 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;
Uscita:
Airbus 380
Spiegazione: Lo stipendio totale di tutti i piloti di Airbus 380 = 298,830 e che di Boeing = 45000. Stipendio medio di tutti i piloti nella tabella Pilota = 57305. Poiché solo lo stipendio totale di tutti i piloti di Airbus 380 è maggiore dello stipendio medio ottenuto, quindi Airbus 380 si trova nella relazione di uscita.
Punti importanti:
- La clausola SQL WITH è buona se utilizzata con istruzioni SQL complesse piuttosto che semplici
- Consente inoltre di suddividere le query SQL complesse in quelle più piccole che rendono facile il debug e l’elaborazione delle query complesse.
- La clausola SQL WITH è fondamentalmente una sostituzione drop-in alla normale sotto-query.
Questo articolo è contribuito da Mayank Kumar. Se ti piace GeeksforGeeks e vorrebbe contribuire, si può anche scrivere un articolo utilizzando contribute.geeksforgeeks.org o posta il tuo articolo a [email protected]. Vedere il tuo articolo che appare sulla pagina principale GeeksforGeeks e aiutare altri Geek.