設(shè) students 表有 id, class_id, name, gender, score列,設(shè) class表有 id, name列
排序
先按score列倒序,如果有相同分?jǐn)?shù)的,再按gender列排序
SELECT id, name, gender, score FROM students ORDER BY score DESC, gender;
分頁(yè)
把結(jié)果集分頁(yè),每頁(yè)10條記錄,展示第1頁(yè)
SELECT id, name, gender, score
FROM students
ORDER BY score DESC
LIMIT 10;
如果需要顯示第3頁(yè),offset計(jì)算公式為每頁(yè)記錄數(shù)x(頁(yè)數(shù)-1),即10x(3-1)=20,語(yǔ)句為LIMIT 10 OFFSET 20 (offset超過(guò)了查詢的最大數(shù)量并不會(huì)報(bào)錯(cuò),而是得到一個(gè)空的結(jié)果集。)
SELECT id, name, gender, score
FROM students
ORDER BY score DESC
LIMIT 10 OFFSET 20;
聚合查詢
查詢所有男生的行數(shù),設(shè)置結(jié)果集的列名為boys,語(yǔ)句為COUNT(*) boys
SELECT COUNT(*) boys FROM students WHERE gender = 'M';
每頁(yè)10條記錄,通過(guò)聚合查詢獲得總頁(yè)數(shù)(CEILING為向上取整,FLOOR為向下取整)
SELECT CEILING(COUNT(*) / 3) FROM students;
其他常用聚合函數(shù) SUM,AVG,MAX,MIN
分組聚合查詢
統(tǒng)計(jì)各班的男生和女生人數(shù)
SELECT class_id, gender, COUNT(*) num FROM students GROUP BY class_id, gender;
結(jié)果為
| class_id | gender | num |
|---|---|---|
| 1 | M | 15 |
| 1 | F | 15 |
| 2 | M | 15 |
| 2 | F | 15 |
查出每個(gè)班級(jí)的平均分,保留一位小數(shù)點(diǎn)
SELECT class_id,ROUND(AVG(score),1) avg_score from students GROUP by class_id;
結(jié)果為
| class_id | avg_score |
|---|---|
| 1 | 86.5 |
| 2 | 66.6 |
| 3 | 23.3 |
多表查詢
使用多表查詢一班女生的信息
SELECT
s.id sid,
s.name,
s.gender,
s.score,
c.id cid,
c.name cname
FROM students s, classes c
WHERE s.gender = 'M' AND c.id = 1;
由于兩個(gè)表中都有 id 和 name 列,務(wù)必要給相應(yīng)的列設(shè)置別名,也可以給表設(shè)置別名使語(yǔ)句更加簡(jiǎn)潔。
多表查詢的結(jié)果集可能非常巨大,要小心使用。
連接查詢
選出students表的所有學(xué)生信息,并連接class表的班級(jí)名稱
SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score
FROM students s
INNER JOIN classes c
ON s.class_id = c.id;
JOIN查詢對(duì)比
設(shè)A表和B表,設(shè)查詢語(yǔ)句:
SELECT * FROM A JOIN B ON A.c1 = B.c2;
INNER JOIN是選出兩張表都存在的記錄:

LEFT OUTER JOIN是選出左表存在的記錄:

RIGHT OUTER JOIN是選出右表存在的記錄:

FULL OUTER JOIN則是選出左右表都存在的記錄:
