單表操作
1.單字段條件分組查詢
//獲取同名的人的詳細信息
//獲取同分數的人的詳細信息
//獲取同地區的人的姓名
分析:獲取相同的字段,字段條件和分組條件一致,通過where的字段可以獲取到條目,屬於單字段條件查詢
解://獲取同名的人的詳細信息
SELECT * FROM test1 WHERE NAME IN (SELECT NAME FROM test1 GROUP BY NAME HAVING COUNT(NAME)>1)
2.多字段條件分組查詢
//獲取每個地區的最高分的人的詳細信息
//獲取各科目的最高分的詳細信息
分析:第一反應:和第一題幾乎一致,分組後的聚合函數條件不同而已,但是屬於雙字段條件,通過最高分不能確認條目,通過地區(科目)也不能確認條目,所以無法使用in,要關聯查詢
SELECT * FROM test1 INNER JOIN (SELECT str,MAX(age) oage FROM test1 GROUP BY str) o ON test1.str=o.str AND test1.age=o.oage
多表操作
將第一個表字段含義拆分出一個成績表
userid對應test1.id,grade爲成績,subject爲科目
//獲取每個地區的最高分的人的詳細信息
//獲取各科目的最高分的詳細信息
分析:看到多表就慌,實際和單表一致,拿到各科目的最高分就能拿到用戶詳細信息,單表查詢加子查詢,或者關聯查詢就可以了,拿到上面單表的代碼改裝
SELECT * FROM cource INNER JOIN (SELECT SUBJECT,MAX(grade) ograde FROM cource GROUP BY SUBJECT) o ON cource.SUBJECT=o.SUBJECT AND cource.grade=o.ograde
此時關聯獲取用戶詳細信息就明朗了
SELECT * FROM test1 ,
(
SELECT id,userid,grade,o.subject FROM cource INNER JOIN (SELECT SUBJECT,MAX(grade) ograde FROM cource GROUP BY SUBJECT) o
ON cource.SUBJECT=o.SUBJECT AND cource.grade=o.ograde)
v WHERE test1.id=v.userid