SQL WITH Clause
SQL WITH Clause (Common Table Expressions)
The SQL WITH
clause, also known as Common Table Expressions (CTEs), is used to define temporary result sets that can be referenced within a SELECT
, INSERT
, UPDATE
, or DELETE
statement. This command is essential for simplifying complex queries and improving readability.
Syntax
WITH cte_name AS (
SELECT column1, column2, ...
FROM table_name
WHERE condition
)
SELECT column1, column2, ...
FROM cte_name;
-- For recursive CTE
WITH RECURSIVE cte_name AS (
SELECT column1, column2, ...
FROM table_name
WHERE condition
UNION ALL
SELECT column1, column2, ...
FROM cte_name
WHERE condition
)
SELECT column1, column2, ...
FROM cte_name;
WITH cte_name AS
: This is the SQL keyword used to define a Common Table Expression (CTE).cte_name
: This specifies the name of the CTE.SELECT column1, column2, ... FROM table_name WHERE condition
: This specifies the query that defines the CTE.SELECT column1, column2, ... FROM cte_name
: This specifies the query that uses the CTE.WITH RECURSIVE cte_name AS
: This specifies the keyword for defining a recursive CTE.UNION ALL
: This is used to combine the results of the initial query and the recursive query.
Example
Let's go through a complete example that includes creating a database, creating a table, inserting data into the table, and then using the WITH
clause to simplify a complex query.
Step 1: Creating a Database
This step involves creating a new database named example_db
.
CREATE DATABASE example_db;
In this example, we create a database named example_db
.
Step 2: Creating a Table
In this step, we create a table named sales
within the previously created database.
USE example_db;
CREATE TABLE sales (
sale_id INT AUTO_INCREMENT PRIMARY KEY,
product_id INT,
sale_date DATE,
quantity INT,
price DECIMAL(10, 2)
);
Here, we define the sales
table with columns for sale_id
, product_id
, sale_date
, quantity
, and price
. The sale_id
column is set as the primary key and will auto-increment.
Step 3: Inserting Data into the Table
This step involves inserting some sample data into the sales
table.
INSERT INTO sales (product_id, sale_date, quantity, price) VALUES (1, '2023-01-01', 2, 19.99);
INSERT INTO sales (product_id, sale_date, quantity, price) VALUES (2, '2023-01-02', 1, 9.99);
INSERT INTO sales (product_id, sale_date, quantity, price) VALUES (1, '2023-01-03', 3, 19.99);
INSERT INTO sales (product_id, sale_date, quantity, price) VALUES (3, '2023-01-04', 5, 29.99);
Here, we insert four rows of data into the sales
table.
Step 4: Using the WITH Clause
This step involves using the WITH
clause to simplify a query that calculates the total sales for each product.
WITH total_sales AS (
SELECT product_id, SUM(quantity * price) AS total_revenue
FROM sales
GROUP BY product_id
)
SELECT product_id, total_revenue
FROM total_sales;
This command defines a CTE named total_sales
that calculates the total revenue for each product, and then retrieves the product ID and total revenue from the CTE.
Step 5: Using a Recursive CTE
This step involves using a recursive CTE to generate a sequence of numbers from 1 to 10.
WITH RECURSIVE numbers AS (
SELECT 1 AS n
UNION ALL
SELECT n + 1
FROM numbers
WHERE n < 10
)
SELECT n
FROM numbers;
This command defines a recursive CTE named numbers
that generates a sequence of numbers from 1 to 10, and then retrieves the sequence from the CTE.