Subqueries with IN operator in MySQL - Time & Space Complexity
When using subqueries with the IN operator, it is important to understand how the query's running time changes as the data grows.
We want to know how the number of operations increases when the tables get bigger.
Analyze the time complexity of the following code snippet.
SELECT employee_name
FROM employees
WHERE department_id IN (
SELECT department_id
FROM departments
WHERE location = 'New York'
);
This query finds all employees who work in departments located in New York.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: For each employee, the database checks if their department_id is in the list returned by the subquery.
- How many times: This check happens once for every employee row.
As the number of employees grows, the database must check more rows against the subquery results.
| Input Size (n employees) | Approx. Operations |
|---|---|
| 10 | About 10 checks against the subquery result |
| 100 | About 100 checks against the subquery result |
| 1000 | About 1000 checks against the subquery result |
Pattern observation: The number of operations grows roughly in direct proportion to the number of employees.
Time Complexity: O(n)
This means the time to run the query grows linearly with the number of employees.
[X] Wrong: "The subquery runs once for each employee, so the time grows much faster than the number of employees."
[OK] Correct: The database usually runs the subquery once and reuses its results, so the main cost depends mostly on checking each employee against that list.
Understanding how subqueries with IN work helps you explain query performance clearly and shows you can think about how data size affects speed.
"What if we changed the subquery to use EXISTS instead of IN? How would the time complexity change?"
Practice
IN operator do when used with a subquery in MySQL?Solution
Step 1: Understand the IN operator
The IN operator checks if a value exists within a list of values.Step 2: Role of subquery with IN
The subquery returns a list of values, and IN checks if the main query's value matches any of these.Final Answer:
Checks if a value matches any value returned by the subquery -> Option AQuick Check:
IN with subquery = value match list [OK]
- Confusing IN with JOIN
- Thinking IN updates or deletes rows
- Assuming IN returns a single value
Solution
Step 1: Review correct IN syntax
The IN operator must be followed by parentheses enclosing the subquery.Step 2: Check each option
SELECT * FROM employees WHERE department_id IN (SELECT id FROM departments); correctly uses IN with parentheses and a subquery. Others have syntax errors.Final Answer:
SELECT * FROM employees WHERE department_id IN (SELECT id FROM departments); -> Option BQuick Check:
IN + (subquery) = correct syntax [OK]
- Adding = before IN
- Missing parentheses around subquery
- Placing IN before column name
employees(id, name, department_id)departments(id, name)What will this query return?
SELECT name FROM employees WHERE department_id IN (SELECT id FROM departments WHERE name = 'Sales');
Solution
Step 1: Analyze subquery
The subquery selects department IDs where the department name is 'Sales'.Step 2: Main query filters employees
The main query selects employee names whose department_id matches any ID from the subquery.Final Answer:
Names of employees who work in the Sales department -> Option CQuick Check:
IN filters employees by Sales department IDs [OK]
- Thinking IN causes error with multiple rows
- Ignoring subquery filter condition
- Assuming it returns all employees
SELECT * FROM orders WHERE customer_id IN SELECT id FROM customers WHERE city = 'New York';
Solution
Step 1: Check IN operator syntax
The IN operator requires the subquery to be enclosed in parentheses.Step 2: Identify missing parentheses
The query lacks parentheses around the subquery after IN, causing syntax error.Final Answer:
Missing parentheses around the subquery after IN -> Option DQuick Check:
IN needs (subquery) [OK]
- Omitting parentheses around subquery
- Confusing IN with EXISTS
- Assuming table names cause error
Given tables:
products(id, name)orders(id, product_id, customer_id)customers(id, city)Which query correctly uses a subquery with IN to get the product names?
Solution
Step 1: Understand the relationships
Products link to orders by product_id; orders link to customers by customer_id.Step 2: Build nested subqueries
Inner subquery gets customer IDs from Chicago; middle subquery gets product_ids from orders by those customers; outer query selects product names with those IDs.Final Answer:
SELECT name FROM products WHERE id IN (SELECT product_id FROM orders WHERE customer_id IN (SELECT id FROM customers WHERE city = 'Chicago')); -> Option AQuick Check:
Nested IN subqueries correctly filter products [OK]
- Adding = before IN
- Missing parentheses around subqueries
- Using wrong columns in subqueries
Ready to prove it?
Pass the test and this pattern moves unknown
