1.投影查询

如果我们只希望返回某些列的数据,而不是所有列的数据,我们可以用SELECT 列1, 列2, 列3 FROM …,让结果集仅包含指定列。这种操作称为投影查询。

(1)例如,从students表中返回id、score和name这三列:

SELECT id, score, name FROM students;

(2)使用SELECT 列1, 列2, 列3 FROM …时,还可以给每一列起个别名,这样,结果集的列名就可以与原表的列名不同。它的语法是SELECT 列1 别名1, 列2 别名2, 列3 别名3 FROM …。

例如,以下SELECT语句将列名score重命名为points,而id和name列名保持不变:

SELECT id, score points, name FROM students;

(3)投影查询同样可以接WHERE条件,实现复杂的查询:

SELECT id, score points, name FROM students WHERE gender = 'M';

2排序

(1)根据其他条件排序,可以加上 ORDER BY 子句:

SELECT id, name, gender, score FROM students ORDER BY score;

(2)如果要反过来,按照成绩从高到底排序,我们可以加上DESC表示“倒序”:

SELECT id, name, gender, score FROM students ORDER BY score DESC;

(3)如果score列有相同的数据,要进一步排序,可以继续添加列名。例如,使用ORDER BY score DESC, gender表示先按score列倒序,如果有相同分数的,再按gender列排序:

SELECT id, name, gender, score FROM students ORDER BY score DESC, gender;

(4)默认的排序规则是ASC:“升序”,即从小到大。ASC可以省略,即ORDER BY score ASC和ORDER BY score效果一样。

如果有WHERE子句,那么ORDER BY子句要放到WHERE子句后面。例如,查询一班的学生成绩,并按照倒序排序:

SELECT id, name, gender, score
FROM students
WHERE class_id = 1
ORDER BY score DESC;

3.分页查询

(1)分页实际上就是从结果集中“截取”出第M~N条记录。这个查询可以通过LIMIT OFFSET 子句实现。

SELECT id, name, gender, score
FROM students
ORDER BY score DESC
LIMIT 3 OFFSET 0;

上述查询LIMIT 3 OFFSET 0表示,对结果集从0号记录开始,最多取3条。注意SQL记录集的索引从0开始。

(2)如果要查询第2页,那么我们只需要“跳过”头3条记录,也就是对结果集从3号记录开始查询,把OFFSET设定为3:

SELECT id, name, gender, score
FROM students
ORDER BY score DESC
LIMIT 3 OFFSET 3;

(3)查询第3页的时候,OFFSET应该设定为6:

SELECT id, name, gender, score
FROM students
ORDER BY score DESC
LIMIT 3 OFFSET 6;

(4)如果原本记录集一共就10条记录,但我们把OFFSET设置为20,会得到什么结果呢?

SELECT id, name, gender, score
FROM students
ORDER BY score DESC
LIMIT 3 OFFSET 20;
Empty result set

OFFSET超过了查询的最大数量并不会报错,而是得到一个空的结果集。


(5)OFFSET是可选的,如果只写LIMIT 15,那么相当于LIMIT 15 OFFSET 0。

在MySQL中,LIMIT 15 OFFSET 30还可以简写成LIMIT 30, 15。

使用LIMIT OFFSET 分页时,随着N越来越大,查询效率也会越来越低。