MySQL分組函數MAX,聚合函數GROUP BY與連接查詢


先看看用於練習的表里面有些什么。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM