Subqueries
A subquery is a query that appears inside another query.
WITH clause
-- Defining a subquery that can be reused many times within the main query
WITH temp AS (
SELECT *
FROM table1_name
)
SELECT *
FROM temp
WHERE column_name BETWEEN 2 AND 5;
The WITH clause creates a temporary result set that can be referenced multiple times within a single query, while normal subqueries can be more straightforward for simpler tasks.
Subqueries in SELECT
Subqueries in the SELECT clause retrieve data from another table and display it as a calculated column in the outer query.
SELECT id, column1_name,
(SELECT AVG(column2_name)
FROM table2_name
WHERE table_name.id = table2_name.id) AS avg
FROM table_name;
Subqueries in FROM
Subqueries in the FROM clause specify the data source for the outer query. The subquery acts as a temporary table.
SELECT id, AVG(avg)
FROM (
SELECT id, SUM(amount) AS avg
FROM table_name
GROUP BY id
) AS subquery
GROUP BY id;
Subqueries in WHERE
Subqueries in the WHERE clause filter results based on the output of another query.
SELECT column1_name, column2_name
FROM table_name
WHERE column2_name > (
SELECT AVG(column2_name)
FROM table_name
);
When building subqueries, we can use the IN and NOT IN keywords to check whether a certain value figures in the result of another query: SELECT * FROM table1_name WHERE column_name NOT IN (SELECT * FROM table2_name);.
Subqueries in HAVING
Subqueries in the HAVING clause are used with grouped results (GROUP BY) to filter groups based on the output of another query.
SELECT column1_name, AVG(column2_name)
FROM table_name
GROUP BY column1_name
HAVING AVG(column2_name) > (
SELECT AVG(column2_name)
FROM table2_name
);