SQL Subqueries: Master Single-Row, Multiple-Row, Correlated, SELECT/FROM/WHERE with Examples & Best Practices

Table of Contents

1. Understanding Subqueries

SQL Nested Subquery Block Structure Diagram

SQL Subqueries Data Flow and Processing Flowchart

Q: What is a subquery in SQL?

A subquery is a query nested inside another query (the outer query), enclosed in parentheses, and used to return data that the outer query processes. Subqueries can appear in SELECT, FROM, WHERE, or other clauses and are used to break complex problems into smaller, reusable parts.

Syntax:

SELECT column1 FROM table_name WHERE column2 = (SELECT column FROM another_table WHERE condition);

Subqueries can return a single value, a single row, multiple rows, or a table, depending on their structure and use.

Q: Why are subqueries important?

2. Single-Row and Multiple-Row Subqueries

SQL Single vs Multiple Row Subqueries Data Flow Illustration

Q: What are single-row and multiple-row subqueries?

Q: How do you use single-row and multiple-row subqueries?

Q: Can you give an example of single-row and multiple-row subqueries?

-- Create sample tables
CREATE TABLE Employees ( EmployeeID INT PRIMARY KEY, FirstName VARCHAR(50), LastName VARCHAR(50), DepartmentID INT, Salary DECIMAL(10, 2)
); CREATE TABLE Departments ( DepartmentID INT PRIMARY KEY, DepartmentName VARCHAR(50), Location VARCHAR(50)
); -- Insert sample data
INSERT INTO Employees (EmployeeID, FirstName, LastName, DepartmentID, Salary)
VALUES (1, 'John', 'Doe', 1, 60000.00), (2, 'Jane', 'sahil', 2, 55000.00), (3, 'kristal', 'Johnson', 1, 65000.00), (4, 'Ram', 'Williams', NULL, 55000.00), (5, 'hari', 'Brown', 3, NULL); INSERT INTO Departments (DepartmentID, DepartmentName, Location)
VALUES (1, 'IT', 'HQ'), (2, 'HR', 'Branch'), (3, 'Marketing', 'HQ'), (4, 'Sales', 'Branch'); -- Single-row subquery: Employees with salary above average
SELECT FirstName, LastName, Salary
FROM Employees
WHERE Salary > (SELECT AVG(Salary) FROM Employees WHERE Salary IS NOT NULL); -- Multiple-row subquery: Employees in departments at HQ
SELECT FirstName, LastName, DepartmentID
FROM Employees
WHERE DepartmentID IN (SELECT DepartmentID FROM Departments WHERE Location = 'HQ');

Output (Single-Row Subquery):

FirstName | LastName | Salary
----------|----------|--------
kristal | Johnson | 65000.00

Output (Multiple-Row Subquery):

FirstName | LastName | DepartmentID
----------|----------|-------------
John | Doe | 1
kristal | Johnson | 1
hari | Brown | 3

Note:

3. Correlated Subqueries

SQL Correlated vs Non-Correlated Subqueries Comprehensive Diagram

Difference Between Correlated and Non-Correlated Subqueries Illustration

Q: What is a correlated subquery?

A correlated subquery is a subquery that references columns from the outer query, executed repeatedly for each row of the outer query. It's like a loop, making it slower but useful for row-by-row comparisons.

Syntax:

SELECT column1 FROM table1 t1 WHERE column2 = (SELECT column FROM table2 t2 WHERE t2.column = t1.column);

Often used with EXISTS, NOT EXISTS, or comparison operators.

Q: How does a correlated subquery differ from a regular subquery?

Q: Can you give an example of a correlated subquery?

-- Correlated subquery: Employees with salary higher than their department's average
SELECT FirstName, LastName, Salary, DepartmentID
FROM Employees e1
WHERE Salary > ( SELECT AVG(Salary) FROM Employees e2 WHERE e2.DepartmentID = e1.DepartmentID AND Salary IS NOT NULL
);

Output:

FirstName | LastName | Salary | DepartmentID
----------|----------|----------|-------------
kristal | Johnson | 65000.00 | 1

Note:

4. Subqueries in SELECT, FROM, and WHERE Clauses

SQL Subqueries in WHERE Clause Nested Example Visual

SQL Subqueries Usage in SELECT, FROM, WHERE Clauses Diagram

Q: How are subqueries used in SELECT, FROM, and WHERE clauses?

Q: Can you give an example of subqueries in SELECT, FROM, and WHERE?

-- Subquery in SELECT: Get department name for each employee
SELECT FirstName, LastName, (SELECT DepartmentName FROM Departments d WHERE d.DepartmentID = e.DepartmentID) AS DepartmentName
FROM Employees e
WHERE Salary IS NOT NULL; -- Subquery in FROM: Join with derived table of department averages
SELECT e.FirstName, e.LastName, e.Salary, dept_avg.AvgSalary
FROM Employees e
JOIN ( SELECT DepartmentID, AVG(Salary) AS AvgSalary FROM Employees WHERE Salary IS NOT NULL GROUP BY DepartmentID
) dept_avg ON e.DepartmentID = dept_avg.DepartmentID
WHERE e.Salary > dept_avg.AvgSalary; -- Subquery in WHERE: Employees in HQ departments
SELECT FirstName, LastName, DepartmentID
FROM Employees
WHERE DepartmentID IN ( SELECT DepartmentID FROM Departments WHERE Location = 'HQ'
);

Output (SELECT Subquery):

FirstName | LastName | DepartmentName
----------|-----------|---------------
John | Doe | IT
Jane | sahil | HR
kristal | Johnson | IT
Ram | Williams | NULL

Output (FROM Subquery):

FirstName | LastName | Salary | AvgSalary
----------|----------|----------|----------
kristal | Johnson | 65000.00 | 62333.33

Output (WHERE Subquery):

FirstName | LastName | DepartmentID
----------|----------|-------------
John | Doe | 1
kristal | Johnson | 1
hari | Brown | 3

Note:

5. Comprehensive Example Combining All Subquery Concepts

Comprehensive SQL Subqueries Example Data Flow Diagram

Q: Can you provide a comprehensive example using single-row, multiple-row, correlated subqueries, and subqueries in SELECT, FROM, and WHERE?

-- Create sample tables (already created, repeated for context)
CREATE TABLE Employees ( EmployeeID INT PRIMARY KEY, FirstName VARCHAR(50), LastName VARCHAR(50), DepartmentID INT, Salary DECIMAL(10, 2)
); CREATE TABLE Departments ( DepartmentID INT PRIMARY KEY, DepartmentName VARCHAR(50), Location VARCHAR(50)
); -- Insert sample data (already inserted, repeated for context)
INSERT INTO Employees (EmployeeID, FirstName, LastName, DepartmentID, Salary)
VALUES (1, 'John', 'Doe', 1, 60000.00), (2, 'Jane', 'sahil', 2, 55000.00), (3, 'kristal', 'Johnson', 1, 65000.00), (4, 'Ram', 'Williams', NULL, 55000.00), (5, 'hari', 'Brown', 3, NULL); INSERT INTO Departments (DepartmentID, DepartmentName, Location)
VALUES (1, 'IT', 'HQ'), (2, 'HR', 'Branch'), (3, 'Marketing', 'HQ'), (4, 'Sales', 'Branch'); -- Comprehensive query combining all subquery types
SELECT e.FirstName, e.LastName, e.Salary, (SELECT DepartmentName FROM Departments d WHERE d.DepartmentID = e.DepartmentID) AS DepartmentName, -- Single-row subquery in SELECT (SELECT AVG(Salary) FROM Employees WHERE DepartmentID = e.DepartmentID AND Salary IS NOT NULL) AS DeptAvgSalary -- Correlated subquery in SELECT
FROM ( SELECT DepartmentID, AVG(Salary) AS AvgSalary FROM Employees WHERE Salary IS NOT NULL GROUP BY DepartmentID
) dept_avg -- Subquery in FROM
JOIN Employees e ON e.DepartmentID = dept_avg.DepartmentID
WHERE e.Salary > ( SELECT AVG(Salary) FROM Employees WHERE Salary IS NOT NULL
) -- Single-row subquery in WHERE
AND e.DepartmentID IN ( SELECT DepartmentID FROM Departments WHERE Location = 'HQ'
) -- Multiple-row subquery in WHERE
GROUP BY e.FirstName, e.LastName, e.Salary, e.DepartmentID
HAVING e.Salary > (SELECT AVG(Salary) FROM Employees WHERE DepartmentID = e.DepartmentID AND Salary IS NOT NULL) -- Correlated subquery in HAVING
ORDER BY e.Salary DESC
LIMIT 2; -- MySQL/PostgreSQL/SQLite (use TOP 2 for SQL Server)

Output:

FirstName | LastName | Salary | DepartmentName | DeptAvgSalary
----------|----------|----------|----------------|--------------
kristal | Johnson | 65000.00 | IT | 62333.33

Description:

6. Common Mistakes and Best Practices

SQL Query Execution Order and Subqueries Best Practices Infographic

Q: What are common mistakes when using subqueries in SQL?

Single-Row Subqueries:

Multiple-Row Subqueries:

Correlated Subqueries:

Subqueries in Clauses:

General:

Q: What are best practices for using subqueries in SQL?

Single-Row Subqueries:

Multiple-Row Subqueries:

Correlated Subqueries:

Subqueries in Clauses:

General: