Bird
Raised Fist0
MySQLquery~20 mins

Subqueries in FROM clause (derived tables) in MySQL - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Derived Table Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ query_result
intermediate
2:00remaining
Output of a simple derived table query
What is the output of this query?

SELECT dt.category, dt.total_sales FROM (SELECT category, SUM(sales) AS total_sales FROM products GROUP BY category) AS dt ORDER BY dt.total_sales DESC;
MySQL
CREATE TABLE products (id INT, category VARCHAR(20), sales INT);
INSERT INTO products VALUES (1, 'Books', 100), (2, 'Books', 150), (3, 'Electronics', 200), (4, 'Clothing', 50);
A[{"category": "Clothing", "total_sales": 50}, {"category": "Books", "total_sales": 250}, {"category": "Electronics", "total_sales": 200}]
B[{"category": "Books", "total_sales": 100}, {"category": "Books", "total_sales": 150}, {"category": "Electronics", "total_sales": 200}, {"category": "Clothing", "total_sales": 50}]
C[{"category": "Books", "total_sales": 250}, {"category": "Electronics", "total_sales": 200}, {"category": "Clothing", "total_sales": 50}]
D[{"category": "Electronics", "total_sales": 200}, {"category": "Books", "total_sales": 250}, {"category": "Clothing", "total_sales": 50}]
Attempts:
2 left
💡 Hint
Think about how the subquery groups sales by category and sums them, then the outer query orders by total_sales descending.
📝 Syntax
intermediate
2:00remaining
Identify the syntax error in derived table usage
Which option contains a syntax error when using a derived table in the FROM clause?
MySQL
SELECT dt.category, dt.total FROM (SELECT category, SUM(amount) AS total FROM sales GROUP BY category) dt;
ASELECT dt.category, dt.total FROM (SELECT category, SUM(amount) AS total FROM sales GROUP BY category);
BSELECT dt.category, dt.total FROM (SELECT category, SUM(amount) AS total FROM sales GROUP BY category) AS dt;
CSELECT dt.category, dt.total FROM (SELECT category, SUM(amount) AS total FROM sales GROUP BY category) dt;
DSELECT dt.category, dt.total FROM (SELECT category, SUM(amount) AS total FROM sales GROUP BY category) AS dt WHERE dt.total > 100;
Attempts:
2 left
💡 Hint
Remember that every derived table must have an alias.
❓ optimization
advanced
2:00remaining
Optimizing a query with multiple derived tables
Given two derived tables joined on a common key, which option is the most efficient way to write the query to avoid unnecessary computation?
MySQL
SELECT a.category, a.total_sales, b.total_returns FROM
(SELECT category, SUM(sales) AS total_sales FROM products GROUP BY category) AS a
JOIN
(SELECT category, SUM(returns) AS total_returns FROM products GROUP BY category) AS b
ON a.category = b.category;
AKeep the two derived tables and join them as is, since it is clearer and easier to read.
BUse a single derived table that calculates both sums in one pass: SELECT category, SUM(sales) AS total_sales, SUM(returns) AS total_returns FROM products GROUP BY category;
CUse two separate queries and combine results in application code to reduce database load.
DReplace derived tables with temporary tables to speed up the join.
Attempts:
2 left
💡 Hint
Think about how many times the table is scanned in each approach.
🔧 Debug
advanced
2:00remaining
Debugging a query with nested derived tables
This query returns an error. What is the cause?

SELECT dt1.category, dt2.avg_price FROM
(SELECT category, COUNT(*) AS cnt FROM products GROUP BY category) dt1
JOIN
(SELECT category, AVG(price) AS avg_price FROM products GROUP BY category) dt2
ON dt1.category = dt2.category
WHERE dt1.cnt > 10;
AThe query is valid and should run without errors.
BThe WHERE clause cannot reference columns from derived tables; it should be in HAVING.
CThe JOIN condition is invalid because it uses columns from different derived tables.
DThe alias dt1 is missing in the WHERE clause.
Attempts:
2 left
💡 Hint
Check if referencing derived table columns in WHERE is allowed after the JOIN.
🧠 Conceptual
expert
3:00remaining
Understanding scope and visibility of derived tables
Consider this query:

SELECT category, total_sales FROM
(SELECT category, SUM(sales) AS total_sales FROM products GROUP BY category) AS dt
WHERE total_sales > (SELECT AVG(total_sales) FROM (SELECT category, SUM(sales) AS total_sales FROM products GROUP BY category) AS dt2);

What is the role of the derived table dt2 in the subquery?
Adt2 filters categories with total_sales above average before the outer query runs.
Bdt2 is redundant and can be removed without affecting the query result.
Cdt2 is the same as dt and causes a naming conflict leading to an error.
Ddt2 provides the average total sales across all categories to compare each category's total_sales against.
Attempts:
2 left
💡 Hint
Think about how the subquery calculates the average and how it relates to the outer query.

Practice

(1/5)
1. What is the main purpose of using a subquery in the FROM clause in MySQL?
easy
A. To create a permanent table in the database
B. To update data in multiple tables at once
C. To delete rows based on a condition
D. To create a temporary table that the outer query can use

Solution

  1. Step 1: Understand the role of subqueries in FROM clause

    Subqueries in the FROM clause act like temporary tables that the outer query can use to simplify complex queries.
  2. Step 2: Differentiate from other SQL operations

    Updating or deleting data is not the purpose of subqueries in FROM; they are for organizing data selection.
  3. Final Answer:

    To create a temporary table that the outer query can use -> Option D
  4. Quick Check:

    Subquery in FROM = temporary table [OK]
Hint: Think of subquery in FROM as a temporary table [OK]
Common Mistakes:
  • Confusing subqueries in FROM with UPDATE or DELETE statements
  • Thinking subqueries create permanent tables
  • Ignoring the need for an alias for the subquery
2. Which of the following is the correct syntax for using a subquery in the FROM clause in MySQL?
easy
A. SELECT * FROM (SELECT id FROM users) AS sub;
B. SELECT * FROM users WHERE (SELECT id FROM users);
C. SELECT * FROM users (SELECT id FROM users);
D. SELECT * FROM users AS (SELECT id FROM users);

Solution

  1. Step 1: Identify correct subquery syntax in FROM clause

    The subquery must be enclosed in parentheses and given an alias using AS.
  2. Step 2: Check each option

    SELECT * FROM (SELECT id FROM users) AS sub; correctly uses parentheses and alias. Others misuse syntax or place subquery incorrectly.
  3. Final Answer:

    SELECT * FROM (SELECT id FROM users) AS sub; -> Option A
  4. Quick Check:

    Subquery in FROM needs parentheses + alias [OK]
Hint: Always alias your subquery in FROM clause [OK]
Common Mistakes:
  • Forgetting to alias the subquery
  • Placing subquery outside parentheses
  • Using subquery in WHERE or FROM incorrectly
3. Given the tables:
users(id, name)
orders(id, user_id, amount)
What will the following query return?
SELECT sub.user_id, sub.total_amount FROM (SELECT user_id, SUM(amount) AS total_amount FROM orders GROUP BY user_id) AS sub WHERE sub.total_amount > 100;
medium
A. List of all orders with amount greater than 100
B. List of user IDs with total order amount greater than 100
C. Syntax error due to missing alias
D. Empty result because no user has orders

Solution

  1. Step 1: Understand the subquery

    The subquery calculates total order amount per user by grouping orders by user_id and summing amounts.
  2. Step 2: Apply the outer query filter

    The outer query selects users whose total order amount is greater than 100 from the subquery result.
  3. Final Answer:

    List of user IDs with total order amount greater than 100 -> Option B
  4. Quick Check:

    Subquery sums orders; outer filters total_amount > 100 [OK]
Hint: Subquery groups and sums; outer filters results [OK]
Common Mistakes:
  • Confusing total order amount with individual order amounts
  • Forgetting to alias the subquery
  • Assuming syntax error without checking alias
4. Identify the error in the following query:
SELECT sub.user_id, sub.total FROM (SELECT user_id, SUM(amount) FROM orders GROUP BY user_id);
medium
A. GROUP BY cannot be used in subqueries
B. SUM(amount) must be renamed with AS
C. Missing alias for the subquery
D. SELECT cannot use subqueries in FROM clause

Solution

  1. Step 1: Check subquery alias requirement

    Subqueries in FROM clause must have an alias; this query lacks it.
  2. Step 2: Verify other parts

    SUM(amount) without alias is allowed but referencing it as sub.total will fail; aliasing subquery is mandatory.
  3. Final Answer:

    Missing alias for the subquery -> Option C
  4. Quick Check:

    Subquery in FROM needs alias [OK]
Hint: Always give an alias to subqueries in FROM [OK]
Common Mistakes:
  • Assuming SUM() must be aliased
  • Thinking GROUP BY is disallowed in subqueries
  • Ignoring alias requirement for subqueries
5. You want to find users who have placed orders totaling more than 500, but only include users who have more than 3 orders. Which query correctly uses a subquery in the FROM clause to achieve this?
Tables:
users(id, name)
orders(id, user_id, amount)
hard
A. SELECT u.name, stats.total_amount FROM users u JOIN (SELECT user_id, COUNT(*) AS order_count, SUM(amount) AS total_amount FROM orders GROUP BY user_id) AS stats ON u.id = stats.user_id WHERE stats.total_amount > 500 AND stats.order_count > 3;
B. SELECT u.name FROM users u WHERE (SELECT SUM(amount) FROM orders WHERE user_id = u.id) > 500 AND (SELECT COUNT(*) FROM orders WHERE user_id = u.id) > 3;
C. SELECT u.name, SUM(o.amount) FROM users u JOIN orders o ON u.id = o.user_id GROUP BY u.id HAVING SUM(o.amount) > 500 AND COUNT(o.id) > 3;
D. SELECT name FROM users WHERE id IN (SELECT user_id FROM orders GROUP BY user_id HAVING SUM(amount) > 500 AND COUNT(*) > 3);

Solution

  1. Step 1: Understand the requirement

    We need users with total order amount > 500 and more than 3 orders.
  2. Step 2: Analyze each option's approach

    SELECT u.name, stats.total_amount FROM users u JOIN (SELECT user_id, COUNT(*) AS order_count, SUM(amount) AS total_amount FROM orders GROUP BY user_id) AS stats ON u.id = stats.user_id WHERE stats.total_amount > 500 AND stats.order_count > 3; uses a subquery in FROM to calculate order count and total per user, then joins users to filter correctly. SELECT u.name FROM users u WHERE (SELECT SUM(amount) FROM orders WHERE user_id = u.id) > 500 AND (SELECT COUNT(*) FROM orders WHERE user_id = u.id) > 3; uses correlated subqueries but not FROM clause subquery. SELECT u.name, SUM(o.amount) FROM users u JOIN orders o ON u.id = o.user_id GROUP BY u.id HAVING SUM(o.amount) > 500 AND COUNT(o.id) > 3; uses HAVING but no subquery in FROM. SELECT name FROM users WHERE id IN (SELECT user_id FROM orders GROUP BY user_id HAVING SUM(amount) > 500 AND COUNT(*) > 3); uses IN with subquery but no join.
  3. Step 3: Confirm correct use of subquery in FROM

    Only SELECT u.name, stats.total_amount FROM users u JOIN (SELECT user_id, COUNT(*) AS order_count, SUM(amount) AS total_amount FROM orders GROUP BY user_id) AS stats ON u.id = stats.user_id WHERE stats.total_amount > 500 AND stats.order_count > 3; uses a derived table (subquery in FROM) with alias and joins properly.
  4. Final Answer:

    SELECT u.name, stats.total_amount FROM users u JOIN (SELECT user_id, COUNT(*) AS order_count, SUM(amount) AS total_amount FROM orders GROUP BY user_id) AS stats ON u.id = stats.user_id WHERE stats.total_amount > 500 AND stats.order_count > 3; -> Option A
  5. Quick Check:

    Subquery in FROM calculates stats; outer query filters users [OK]
Hint: Use subquery in FROM to pre-aggregate data, then join [OK]
Common Mistakes:
  • Not aliasing the subquery in FROM
  • Using correlated subqueries instead of derived tables
  • Missing join between users and subquery results
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard