本文採用官方經典 shop 範例資料表(商品價格比價),展示解決常見查詢問題的多種寫法與技巧對比。
CREATE TABLE shop (
article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
dealer CHAR(20) DEFAULT '' NOT NULL,
price DOUBLE(16,2) DEFAULT '0.00' NOT NULL,
PRIMARY KEY (article, dealer)
);
INSERT INTO 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);
資料內容:
| article | dealer | price |
|---|---|---|
| 0001 | A | 3.45 |
| 0001 | B | 3.99 |
| 0002 | A | 10.99 |
| 0003 | B | 1.45 |
| 0003 | C | 1.69 |
| 0003 | D | 1.25 |
| 0004 | D | 19.95 |
SELECT MAX(article) AS article FROM shop;
結果:4
SELECT article, dealer, price FROM shop WHERE price = (SELECT MAX(price) FROM shop);
SELECT MAX(price) FROM shop; → 19.95SELECT article, dealer, price FROM shop WHERE price = 19.95;SELECT article, dealer, price FROM shop ORDER BY price DESC LIMIT 1;
注意: 若有多筆相同最高價,LIMIT 1 僅回傳其中一筆。
SELECT article, MAX(price) AS price FROM shop GROUP BY article;
結果:
| article | price |
|---|---|
| 0001 | 3.99 |
| 0002 | 10.99 |
| 0003 | 1.69 |
| 0004 | 19.95 |
SELECT s1.article, s1.dealer, s1.price
FROM shop s1
JOIN (
SELECT article, MIN(price) AS min_price
FROM shop
GROUP BY article
) s2 ON s1.article = s2.article AND s1.price = s2.min_price;
| 需求 | 推薦寫法 | 備註 |
|---|---|---|
| 單一極值 | ORDER BY ... LIMIT 1 | 最簡潔,注意平手情況 |
| 極值對應完整列 | 子查詢 / JOIN 衍生表 | 標準 SQL,相容性佳 |
| 分組極值 | GROUP BY + 聚合函數 | 基礎分組統計 |
| 分組極值對應詳細資訊 | JOIN 衍生表 / 窗口函數 (8.0+) | 進階分析常用 |
掌握 MAX/MIN、GROUP BY、LIMIT、子查詢與 JOIN 的組合運用,能解決 90% 的極值與分組統計問題。MySQL 8.0 引入窗口函數後,寫法更優雅高效。