You have two tables: Customers and Orders. Some customers have no orders. You want a list of all customers with their order counts, showing zero for customers without orders. Which query achieves this?
ASELECT Customers.name, COUNT(Orders.id) FROM Customers LEFT OUTER JOIN Orders ON Customers.id = Orders.customer_id GROUP BY Customers.name;
BSELECT Customers.name, COUNT(Orders.id) FROM Customers INNER JOIN Orders ON Customers.id = Orders.customer_id GROUP BY Customers.name;
CSELECT Customers.name, COUNT(Orders.id) FROM Orders LEFT OUTER JOIN Customers ON Customers.id = Orders.customer_id GROUP BY Customers.name;
DSELECT Customers.name, COUNT(*) FROM Customers RIGHT OUTER JOIN Orders ON Customers.id = Orders.customer_id GROUP BY Customers.name;
Step-by-Step Solution
Solution:
Step 1: Identify join type needed
LEFT OUTER JOIN keeps all customers, including those without orders.
Step 2: Use COUNT on Orders.id
COUNT(Orders.id) counts orders per customer; zero if no orders due to NULLs.
Final Answer:
SELECT Customers.name, COUNT(Orders.id) FROM Customers LEFT OUTER JOIN Orders ON Customers.id = Orders.customer_id GROUP BY Customers.name; -> Option A
Quick Check:
LEFT OUTER JOIN + COUNT(Orders.id) = zero for no orders [OK]
Quick Trick:Use LEFT OUTER JOIN and COUNT(column) for zero counts [OK]
Common Mistakes:
MISTAKES
Using INNER JOIN excludes customers without orders
Counting * instead of column causes wrong counts
Reversing join order changes results
Master "LEFT and RIGHT JOIN" in SQL
9 interactive learning modes - each teaches the same concept differently