先看看用於練習的表里面有些什么。
SELECT * FROM shop ORDER BY article; +---------+--------+-------+ | article | dealer | price | +---------+--------+-------+ | 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 | +---------+--------+-------+
- 查找價格(price)最貴的文章:
方法一:用聚合函數MAX求最大值
SELECT MAX(price) FROM shop;
方法二:用ORDER BY排序,用“LIMIT 1”只顯示第一行
SELECT article, dealer, price FROM shop ORDER BY price DESC LIMIT 1;
方法三:用左連接
SELECT s1.article, s1.dealer, s1.price FROM shop s1 LEFT JOIN shop s2 ON s1.price < s2.price WHERE s2.article IS NULL;
- 找出每篇article的最高價格。
MAX函數求最大值,用GROUP BY給article分組。
聚合函數與分組函數一起使用時需注意,被GROUP BY分組的字段不可被聚合函數修飾。比如下面的article被GROUP BY了,article在SELECT時就不能被MAX().
SELECT article, MAX(price) AS price FROM shop GROUP BY article ORDER BY article;
聚合函數與GROUP BY一起使用有個弱點,如果我們要選擇article,dealer,MAX(price),但僅以article分組計算最大值,這就不行。
注意:下面的SQL語句GROUP BY后面只有article。
SELECT article,dealer,MAX(price) AS price FROM shop GROUP BY article ORDER BY article;
以下語句是正確的,但沒有實現我們只按照article分組求最大值的目標。
SELECT article,dealer,MAX(price) AS price FROM shop GROUP BY article,dealer ORDER BY article;
GROUP BY與聚合函數辦不到的,就是連接查詢大顯神威的時刻的。
下面有請內連接出場。內連接是INNER JOIN,可以不寫INNER。
同樣的需求:對於每篇article,找出price最高的。
內連接
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;
左連接(LEFT JOIN)同樣可以完成這個目標.
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;
參考連接
MySQL官網
https://dev.mysql.com/doc/refman/8.0/en/example-maximum-column-group-row.html