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);
-- 最大貨品編號
SELECT MAX(article) AS max_article FROM shop;
-- 結果:4
SELECT article, dealer, price
FROM shop
WHERE price = (SELECT MAX(price) FROM shop);
SELECT article, dealer, price
FROM shop
ORDER BY price DESC
LIMIT 1;
SELECT article, MAX(price) AS max_price
FROM shop
GROUP BY article;
-- 結果:
-- 0001 3.99
-- 0002 10.99
-- 0003 1.69
-- 0004 19.95
SELECT s1.article, s1.dealer, s1.price
FROM shop s1
WHERE s1.price = (
SELECT MAX(s2.price)
FROM shop s2
WHERE s1.article = s2.article
);
SELECT s1.article, s1.dealer, s1.price
FROM shop s1
JOIN (
SELECT article, MAX(price) AS max_price
FROM shop
GROUP BY article
) s2 ON s1.article = s2.article AND s1.price = s2.max_price;
SELECT @min_price := MIN(price), @max_price := MAX(price) FROM shop;
SELECT * FROM shop WHERE price = @min_price OR price = @max_price;
-- 結果:最便宜 0003/D/1.25,最貴 0004/D/19.95
SELECT * FROM test_table
WHERE field1_index = 'val' OR field2_index = 'val';
MySQL 無法同時使用兩個索引,會退化為全表掃描。
SELECT field1_index, field2_index FROM test_table WHERE field1_index = 'val'
UNION
SELECT field1_index, field2_index FROM test_table WHERE field2_index = 'val';
UNION 預設去重,若確定無重複可用 UNION ALL 更快。
-- 延遲關聯法
SELECT t.* FROM (
SELECT id FROM large_table ORDER BY id LIMIT 100000, 20
) AS d JOIN large_table t ON t.id = d.id;
SELECT email, COUNT(*) cnt FROM users GROUP BY email HAVING cnt > 1;
DELETE t1 FROM users t1
JOIN users t2 ON t1.email = t2.email AND t1.id > t2.id;
SELECT a.id + 1 AS start, MIN(b.id) - 1 AS end
FROM sequence a
JOIN sequence b ON a.id < b.id
GROUP BY a.id
HAVING start <= MIN(b.id) - 1;
掌握子查詢、JOIN、用戶變量、UNION 等技巧,能靈活解決「取極值行、分組 Top-N、多條件索引優化」等常見需求。實際專案中請配合 EXPLAIN 分析執行計劃,選擇最優寫法。