Skip to content
Related Articles
Get the best out of our app
GeeksforGeeks App
Open App
geeksforgeeks
Browser
Continue

Related Articles

SQL | WITH clause

Improve Article
Save Article
Like Article
Improve Article
Save Article
Like Article

The SQL WITH clause was introduced by Oracle in the Oracle 9i release 2 database. The SQL WITH clause allows you to give a sub-query block a name (a process also called sub-query refactoring), which can be referenced in several places within the main SQL query. 
 

  • The clause is used for defining a temporary relation such that the output of this temporary relation is available and is used by the query that is associated with the WITH clause.
  • Queries that have an associated WITH clause can also be written using nested sub-queries but doing so add more complexity to read/debug the SQL query.
  • WITH clause is not supported by all database system.
  • The name assigned to the sub-query is treated as though it was an inline view or table
  • The SQL WITH clause was introduced by Oracle in the Oracle 9i release 2 database.

Syntax: 

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

In this query, WITH clause is used to define a temporary relation temporaryTable that has only 1 attribute averageValue. averageValue holds the average value of column Attr1 described in relation Table. The SELECT statement that follows the WITH clause will produce only those tuples where the value of Attr1 in relation Table is greater than the average value obtained from the WITH clause statement. 

Note: When a query with a WITH clause is executed, first the query mentioned within the  clause is evaluated and the output of this evaluation is stored in a temporary relation. Following this, the main query associated with the WITH clause is finally executed that would use the temporary relation produced. 
 

Queries

Example 1:  Find all the employee whose salary is more than the average salary of all employees. 
Name of the relation: Employee 
 

EmployeeIDNameSalary
100011Smith50000
100022Bill94000
100027Sam70550
100845Walden80000
115585Erik60000
1100070Kate69000

SQL Query: 

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

Output: 
 

EmployeeIDNameSalary
100022Bill94000
100845Walden80000

Explanation: The average salary of all employees is 70591. Therefore, all employees whose salary is more than the obtained average lies in the output relation. 
 

Example 2: Find all the airlines where the total salary of all pilots in that airline is more than the average of total salary of all pilots in the database. 

Name of the relation: Pilot 
 

EmployeeIDAirlineNameSalary
70007Airbus 380Kim60000
70002BoeingLaura20000
10027Airbus 380Will80050
10778Airbus 380Warren80780
115585BoeingSmith25000
114070Airbus 380Katy78000

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: 
 

Airline
Airbus 380

Explanation: The total salary of all pilots of Airbus 380 = 298,830 and that of Boeing = 45000. Average salary of all pilots in the table Pilot = 57305. Since only the total salary of all pilots of Airbus 380 is greater than the average salary obtained, so Airbus 380 lies in the output relation. 

Important Points: 

  • The SQL WITH clause is good when used with complex SQL statements rather than simple ones
  • It also allows you to break down complex SQL queries into smaller ones which make it easy for debugging and processing the complex queries.
  • The SQL WITH clause is basically a drop-in replacement to the normal sub-query.

This article is contributed by Mayank Kumar. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks. 

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

My Personal Notes arrow_drop_up
Last Updated : 13 Aug, 2021
Like Article
Save Article
Similar Reads