Definition:
A correlated subquery refers to a type of subquery that relies on the results of the outer query to execute. Essentially, the inner query is executed for each row of the outer query, utilizing values from the outer query in its filtering or comparison criteria. This approach enables the inner query to reference columns from the outer query, allowing for more complex queries that can manipulate data or perform comparisons that would otherwise require multiple queries or joins, which could be more challenging to implement and require more system resources.
Syntax:
SELECT
Column_Name(s)
FROM
Table_Name1
WHERE
column_name_operator(
SELECT column_name
FROM Table_Name2
WHERE Table_Name1.Column_Name =
Table_Name2.column_Name
);
(In this example, table_name1 represents the outer query table, and table_name2 represents the inner query table. The column_name_operator is used to compare the results of the inner query to the column values in the outer query.)
Syntax of a correlated subquery with alias:
SELECT
Column_Name(s)
FROM
Table_Name1 AS T1
WHERE
Column_Name_Operator(
SELECT column_name
FROM table_name2 AS T2
WHERE T1.column_name = T2.column_name
);
(In this example, the AS keyword is used to assign aliases to the tables. The aliases T1 and T2 can then be used to distinguish between columns from the different tables.)
Examples:
Level 1:
SELECT
Productname,
Unitprice
FROM
Production.Products AS P1
WHERE
Unitprice = (
SELECT MAX(Unitprice) FROM dbo.Products p2 WHERE
p1.categoryid = p2.categoryid
);
Result:

(In the above example, the subquery (SELECT MAX(price) FROM dbo.products p2 WHERE p1.category = p2.category) is correlated with the outer query because it depends on the value of category from the outer query. The subquery finds the maximum price within the same category as the current row in the outer query, and the outer query returns the name and price of the product with that maximum price.)
Level2:
SELECT
Productname,
unitprice
FROM
dbo.Products as p1
WHERE (
SELECT COUNT(*) FROM dbo.Products AS p2 WHERE p2.unitprice > p1.unitprice AND p2.categoryid = p1.categoryid
) < 5;


(In this example, the subquery (SELECT COUNT(*) FROM products p2 WHERE p2.price > p1.price AND p2.category = p1.category) is correlated with the outer query because it depends on both the value of price and category from the outer query. The subquery counts the number of products with a higher price within the same category as the current row in the outer query, and the outer query returns the name and price of products that have fewer than 5 products with a higher price in the same category.)
Advantages:
- Increased flexibility: Correlated subqueries can be used to perform complex filtering and comparisons that would otherwise require multiple queries or joins, making them a powerful tool for querying complex data.
- Reduced complexity: By using correlated subqueries, it is possible to simplify complex queries that might otherwise require complicated joins or subqueries.
- Improved performance: In some cases, using correlated subqueries can result in better query performance than using joins or multiple queries.
Limitations:
- Increased resource usage: Correlated subqueries can be resource-intensive and slow, especially if they are executed repeatedly or used with large data sets. They can also cause performance issues if not used carefully.
- Difficult to debug: Correlated subqueries can be difficult to debug since they depend on the results of the outer query. If there is an error in the inner query, it can be challenging to determine which row in the outer query caused the issue.
- Lack of readability: Correlated subqueries can make queries difficult to read and understand, especially if they are used excessively or nested multiple times.
Conclusion:
Correlated subqueries can be a powerful tool for filtering and aggregating data in SQL queries, and can allow for more complex queries than might be possible with simple joins and grouping. However, they should be used with care, as they can be slower and more complex than other approaches, and may not always be the most efficient solution.