前言
select top n 形式的語句可以獲取查詢的前幾個記錄,但是 mysql沒有此語法,mysql用limit來實現相關功能。
LIMIT子句可以被用於強制 SELECT 語句返回指定的記錄數。LIMIT 接受一個或兩個數字參數。參數必須是一個整數常量。
如果給定兩個參數,第一個參數指定第一個返回記錄行的偏移量,第二個參數指定返回記錄行的最大數目。
萬年不變學生表
有2張表,學生表(student)基本信息如下

科目和分數表(grade)

查詢前3名
列出數學成績前3名的學生(要求顯示字段:學號,姓名, 科目,成績)
select *
from grade
where kemu = '數學'
order by score
desc
limit 3

先通過limit取出前三條記錄,再結合student表查詢
select a.id, a.name, b.kemu, b.score
from student a, grade b
where a.id = b.id
and kemu = '數學'
order by score
desc
limit 3

查詢第2-3名記錄
limit后面如果只寫一個整數n,那就是查詢的前n條記錄;如果后面帶2個整數n 和 m,那么第一個數n就是查詢出來隊列的起點(從0開始),第二個是m是統計的總數目
第2-3條記錄,那么起點就是1, 第2-3名有2條記錄,那么第二個參數就是2
select a.id, a.name, b.kemu, b.score
from student a, grade b
where a.id = b.id
and kemu = '數學'
order by score
desc
limit 1, 2

備注:limit是按條數取的,名次一樣的,也算一個記錄。如果取第5-14的記錄,那就是limit 4 10
查詢第3到后面所有的
select a.id, a.name, b.kemu, b.score
from student a, grade b
where a.id = b.id
and kemu = '數學'
order by score
desc
limit 3, 10000
注意:有些資料上寫的limit 3, -1 用-1代碼最大值,這個是不對的,會報錯,解決辦法:隨便寫個非常大的整數

英語課程少於80分的人
統計英語課程少於80分的,顯示 學號id, 姓名,科目,分數
SELECT a.id, a.name, b.kemu, b.score
FROM student a, grade b
WHERE a.id = b.id
AND b.kemu = '英語'
AND b.score < 80

統計每門課程不及格、一般、優秀
課程不及格(<60)一般(60<= x <=80)優秀(>80)
SELECT b.kemu,
(SELECT COUNT(*) FROM grade WHERE score < 60 and kemu = b.kemu) as 不及格,
(SELECT COUNT(*) FROM grade WHERE score between 60 and 80 and kemu = b.kemu) as 一般,
(SELECT COUNT(*) FROM grade WHERE score > 80 and kemu = b.kemu) as 優秀
FROM grade b
GROUP BY kemu

查找每科成績前2名
查找每科成績前2名,顯示id, 姓名,科目,分數
先按科目和分數查詢
SELECT t1.id, t1.kemu,t1.score
FROM grade t1
ORDER BY t1.kemu,t1.score DESC

再查找每個每科前面2名
SELECT t1.id, a.name, t1.kemu,t1.score
FROM grade t1, student a
WHERE
(SELECT count(*) FROM grade t2
WHERE t1.kemu=t2.kemu AND t2.score>=t1.score
)<=2
and a.id = t1.id
ORDER BY t1.kemu,t1.score
DESC
