2.3 结果排序
SELECT ... FROM table_name [WHERE ...] ORDER BY column [ASC | DESC] [, ...];
SQL中大写的表示关键字,[ ]中代表的是可选项
ASC和DESC分别代表的是排升序和排降序,默认为ASC
注意: 若查询SQL中没有order by子句,那么返回的顺序是未定义的
查询同学及其数学成绩,按数学成绩升序显示
在select的column列表中指明要查询的列为姓名和数学成绩,在order by子句中指明按照数学成绩进行升序排序
查询同学及其QQ号,按QQ号升序显示
在select的column列表中指明要查询的列为姓名和QQ号,在order by子句中指明按照QQ号进行升序排序
NULL值视为比任何值都小,因此排升序时出现在最上面
查询同学的各门成绩,依次按数学降序、英语升序、语文升序显示
在select的column列表中指明要查询的列为姓名、数学成绩、英语成绩和语文成绩,在order by子句中指明依次按照数学成绩排降序、英语成绩排升序和语文成绩排升序
可以看到显示结果是按照数学成绩进行降序排序的,而相同的数学成绩之间则是按照英语成绩进行升序排序的
order by子句中可以指明按照多个字段进行排序,每个字段都可以指明按照升序或降序进行排序,各个字段之间使用逗号隔开,排序优先级与书写顺序相同
如上图中SQL,当两条记录的数学成绩相同时就会按照英语成绩进行排序,若这两条记录的英语成绩也相同就会继续按照语文成绩进行排序,以此类推
查询同学及其总分,按总分降序显示
在select的column列表中指明要查询的列为姓名和总分(表达式查询),在order by子句中指明按照总分进行降序排序
在order by子句中可以使用select中指定的别名:
查询数据时是先根据where子句筛选出符合条件的记录
然后再将符合条件的记录作为数据源来依次执行select语句
最后再通过order by子句对select语句的执行结果进行排序
即order by子句的执行是在select语句之后的,所以在order by子句中可以使用别名
查询姓孙的同学或姓曹的同学及其数学成绩,按数学成绩降序显示
题目的前半句描述的是查询,后半句描述的是排序
在排序的时候必须要有数据,因此可以先完成前面的查询动作,然后再根据题目要求进行排序
查询数据时,在where子句中指明筛选条件为姓孙或姓曹(模糊匹配),在select的column列表中指明要查询的列为姓名和数学成绩
当查询到目标数据后再在查询SQL后添加order by子句,在order by子句中指明按照数学成绩进行降序排序
2.4 筛选分页结果
从第0条记录开始,向后筛选出n条记录
SELECT ... FROM table_name [WHERE ..] [ORDER BY ...] LIMIT n;
从第s条记录开始,向后筛选出n条记录
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n;
从第s条记录开始,向后筛选出n条记录
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;
SQL中大写的表示关键字,[ ]中代表的是可选项
查询SQL中各语句的执行顺序为:where、select、order by、limit
limit子句在筛选记录时,记录的下标从0开始
建议: 对未知表进行查询时最好在查询SQL后加上limit,避免在查询全表数据时因为表中数据过大而导致数据库卡死
按id进行分页,每页3条记录,分别显示第1、2、3页
这里使用成绩表中的数据来演示分页查询,成绩表中的内容如下:
查询第1页记录时在查询全表数据的SQL后,加上limit子句指明从第0条记录开始,向后筛选出3条记录
查询第2页记录时在查询全表数据的SQL后,加上limit子句指明从第3条记录开始,向后筛选出3条记录
查询第3页记录时在查询全表数据的SQL后,加上limit子句指明从第6条记录开始,向后筛选出3条记录
若从表中筛选出的记录不足n个,则筛选出几个就显示几个
三、Update
UPDATE table_name SET column1=expr1 [, column2=expr2] ... [WHERE ...] [ORDER BY ...] [LIMIT ...];
SQL中大写的表示关键字,[ ]中代表的是可选项
SQL中的column=expr,表示将记录中列名为column的值修改为expr
在修改数据之前需先找到待修改的记录,update语句中的where、order by和limit就是用来定位数据的
将孙悟空同学的数学成绩修改为80分
在update语句中指明要将筛选出来的记录的数学成绩改为80分
将曹孟德同学的数学成绩修改为60分,语文成绩修改为70分
将总成绩倒数前三的3位同学的数学成绩加上30分
在修改数据之前,先查看总成绩倒数前三的3位同学的数学成绩
在update语句中指明要将筛选出来的记录的数学成绩加上30分,并在修改后再次查看数据确保数据成功被修改
注意:MySQL中不支持+=这种复合赋值运算符。在查看更新后的数据时不能查看总成绩倒数前三的3位同学,因为之前总成绩倒数前三的3位同学,数学成绩加上30分后可能就不再是倒数前三了