數據庫面試題——打卡
數據庫查詢每組最大值:例如對於每門課程,查詢分數最高的學生。
這裏分享MySQL手冊中例子:For each article, find the dealer or dealers with the most expensive price。對於每篇文章,查詢價格最昂貴的經銷商。
建表添加記錄的SQL語句
create table shop (article int, dealer char(1), price numeric(6,2));
insert shop values(1, 'A', 3.45), (1, 'B', 3.99), (2, 'A', '10.99'), (3, 'B', 1.45), (3, 'C', 1.69), (3, 'D', 1.25), (4, 'D', 19.95);
三種方法
- 相關子查詢
SELECT article, dealer, price
FROM shop s1
WHERE price=(SELECT MAX(s2.price)
FROM shop s2
WHERE s1.article = s2.article)
ORDER BY article;
- 不相關子查詢
SELECT s1.article, dealer, s1.price
FROM shop s1
JOIN (
SELECT article, MAX(price) AS price
FROM shop
GROUP BY article) AS s2
ON s1.article = s2.article AND s1.price = s2.price
ORDER BY article;
- 左連接
SELECT s1.article, s1.dealer, s1.price
FROM shop s1
LEFT JOIN shop s2 ON s1.article = s2.article AND s1.price < s2.price
WHERE s2.article IS NULL
ORDER BY s1.article;
查詢結果
手冊裏說相關子查詢可能效率不高。可能與查詢指令執行順序有關。
摘自:https://dev.mysql.com/doc/refman/5.7/en/example-maximum-column-group-row.html