Scalar subquery in SELECT in SQL - Time & Space Complexity
Start learning this pattern below
Jump into concepts and practice - no test required
When using a scalar subquery inside a SELECT statement, it is important to understand how the query's running time changes as the data grows.
We want to know how many times the subquery runs and how that affects the total work done.
Analyze the time complexity of the following code snippet.
SELECT e.employee_id, e.name,
(SELECT d.department_name
FROM departments d
WHERE d.department_id = e.department_id) AS dept_name
FROM employees e;
This query lists employees and uses a scalar subquery to find each employee's department name.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The scalar subquery runs once for each employee row.
- How many times: It runs as many times as there are employees (n times).
Each employee causes the subquery to run once, so the total work grows directly with the number of employees.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 subquery runs |
| 100 | About 100 subquery runs |
| 1000 | About 1000 subquery runs |
Pattern observation: The total work increases linearly as the number of employees increases.
Time Complexity: O(n)
This means the total time grows in direct proportion to the number of employees processed.
[X] Wrong: "The subquery runs only once for all employees."
[OK] Correct: The subquery is inside the SELECT for each employee, so it runs separately for each row, not just once.
Understanding how scalar subqueries affect query time helps you write efficient database queries and shows you can think about performance clearly.
"What if the scalar subquery was replaced by a JOIN? How would the time complexity change?"
Practice
SELECT clause return?Solution
Step 1: Understand scalar subquery definition
A scalar subquery returns exactly one value, meaning one row and one column.Step 2: Compare with other subquery types
Unlike table subqueries, scalar subqueries cannot return multiple rows or columns.Final Answer:
A single value (one row, one column) -> Option CQuick Check:
Scalar subquery = single value [OK]
- Thinking scalar subquery returns multiple rows
- Confusing scalar subquery with table subquery
- Assuming scalar subquery returns column names only
SELECT clause?Solution
Step 1: Identify correct scalar subquery syntax
The scalar subquery must be enclosed in parentheses and used inside the SELECT clause.Step 2: Check each option
SELECT name, (SELECT MAX(score) FROM scores) AS max_score FROM students; correctly uses parentheses around the subquery. Others miss parentheses or have wrong placement.Final Answer:
SELECT name, (SELECT MAX(score) FROM scores) AS max_score FROM students; -> Option BQuick Check:
Scalar subquery syntax = parentheses [OK]
- Omitting parentheses around subquery
- Placing SELECT keyword incorrectly
- Using aggregate functions without subquery
employees(id, name, dept_id) and departments(id, dept_name), what is the output of this query?SELECT name, (SELECT dept_name FROM departments WHERE id = employees.dept_id) AS department FROM employees ORDER BY name;
Solution
Step 1: Understand query logic
For each employee, the scalar subquery fetches the department name matching their dept_id.Step 2: Match employees to departments
Alice's dept_id matches HR, Bob's matches IT, so the output shows correct department names.Final Answer:
[{"name": "Alice", "department": "HR"}, {"name": "Bob", "department": "IT"}] -> Option DQuick Check:
Scalar subquery returns matching department name per employee [OK]
- Assuming subquery returns multiple rows causing error
- Mixing up department names for employees
- Expecting nulls when matching keys exist
SELECT name, (SELECT dept_name FROM departments WHERE id = employees.dept_id) AS department FROM employees WHERE (SELECT COUNT(*) FROM departments) > 0;
Solution
Step 1: Analyze subquery in WHERE clause
The subquery in WHERE returns COUNT(*), which is a single value, so it's valid.Step 2: Consider efficiency and logic
Using a scalar subquery in WHERE like this works but is inefficient; better to check existence differently.Final Answer:
Scalar subquery in WHERE is valid but inefficient -> Option AQuick Check:
Scalar subquery in WHERE can be valid but watch efficiency [OK]
- Thinking scalar subquery in WHERE always causes error
- Confusing alias requirement in SELECT with WHERE
- Assuming subquery returns multiple rows here
Options:
A) SELECT product_name, IFNULL((SELECT category_name FROM categories WHERE id = products.category_id), 'Uncategorized') AS category FROM products WHERE category_id IS NOT NULL;
B) SELECT product_name, (SELECT category_name FROM categories WHERE id = products.category_id) OR 'Uncategorized' AS category FROM products;
C) SELECT product_name, (SELECT category_name FROM categories WHERE id = products.category_id) AS category FROM products WHERE category_id IS NOT NULL;
D) SELECT product_name, COALESCE((SELECT category_name FROM categories WHERE id = products.category_id), 'Uncategorized') AS category FROM products;
Solution
Step 1: Handle NULL category_id with scalar subquery
Use COALESCE to replace NULL result from subquery with 'Uncategorized'.Step 2: Check each option's correctness
The query with COALESCE((SELECT category_name FROM categories WHERE id = products.category_id), 'Uncategorized') AS category FROM products; correctly uses COALESCE and includes all products. The query with (SELECT category_name FROM categories WHERE id = products.category_id) OR 'Uncategorized' uses invalid OR syntax. The queries with WHERE category_id IS NOT NULL exclude products with NULL category_id.Final Answer:
SELECT product_name, COALESCE((SELECT category_name FROM categories WHERE id = products.category_id), 'Uncategorized') AS category FROM products; -> Option AQuick Check:
Use COALESCE with scalar subquery for NULL handling [OK]
- Using OR instead of COALESCE or IFNULL
- Filtering out NULL category_id rows
- Not handling NULL results from subquery
