https://www.nowcoder.com/exam/oj/ta?tpId=298



SELECT cust_name, order_num
FROM Customers c INNER JOIN Orders o ON c.cust_id = o.cust_id
ORDER BY cust_name ASC, order_num ASC;
SELECT cust_name, order_num
FROM Customers c, Orders o
WHERE c.cust_id = o.cust_id
ORDER BY cust_name ASC, order_num ASC;




SELECT c.cust_name,o.order_num,quantity * item_price OrderTotal
FROM Customers c,Orders o,OrderItems oi
WHERE c.cust_id = o.cust_id AND o.order_num = oi.order_num
ORDER BY cust_name ASC, order_num ASC;
这种答案是避免OrderItems表中有重复的order_num;答案一中默认OrderItems表中没有重复的order_num
SELECT c.cust_name, o.order_num, SUM(quantity * item_price) OrderTotal
FROM Customers c,Orders o,OrderItems os
WHERE c.cust_id = o.cust_id AND o.order_num = os.order_num
GROUP BY c.cust_name, o.order_num
ORDER BY c.cust_name ASC, o.order_num ASC;
SELECT c.cust_name,o.order_num,OrderTotal
FROM Customers c, Orders o,(
SELECT order_num,SUM(quantity*item_price) OrderTotal
FROM OrderItems
GROUP BY order_num) t
WHERE c.cust_id = o.cust_id AND o.order_num = t.order_num
ORDER BY c.cust_name ASC, o.order_num ASC;


SELECT cust_id, order_date
FROM Orders o1, OrderItems o2
WHERE o1.order_num = o2.order_num
AND prod_id = 'BR01'
ORDER BY order_date ASC;
SELECT cust_id, order_date
FROM Orders o1 JOIN OrderItems o2
ON o1.order_num = o2.order_num
WHERE prod_id = 'BR01'
ORDER BY order_date ASC;


SELECT cust_email
FROM Customers c INNER JOIN Orders o1 ON c.cust_id = o1.cust_id
INNER JOIN OrderItems o2 ON o1.order_num = o2.order_num
WHERE prod_id = 'BR01';




SELECT cust_name, total_price
FROM Customers c
JOIN Orders o1 ON c.cust_id = o1.cust_id
JOIN (
SELECT order_num, SUM(item_price * quantity) total_price
FROM OrderItems
GROUP BY order_num
) o2 ON o1.order_num = o2.order_num
WHERE total_price >=1000
ORDER BY total_price ASC;
个人感觉过滤条件放在子查询里面好一点,在形成子表的时候就已经是一个比较小的表了,再连接其他表,开销就会比较小。
SELECT cust_name, total_price
FROM Customers c
JOIN Orders o1 ON c.cust_id = o1.cust_id
JOIN (
SELECT order_num, SUM(item_price * quantity) total_price
FROM OrderItems
GROUP BY order_num
HAVING total_price >= 1000
) o2 ON o1.order_num = o2.order_num
ORDER BY total_price ASC;