目录
3.6 排序查询
1、CRUD
- C — Create(新增)
- R — Retrieve(查询、检索)
- U — Update(更新)
- D — Delete(删除)
SQL中使用 "--空格+描述"表示注释说明。
2、新增(Create)
即插入一条新的数据行进入表中。
2.1 单行插入+指定列插入
insert into 表名 (字段1,字段2) values (值1,值2);
- 前面的字段明要和后面的值一一对应,如果列与值的类型或者个数不匹配会报错。
- 字符串类型的值要用单引号包裹
- 没有指定出来的列为默认值,默认值为NULL
2.2 单行插入+全列插入
既然是全列插入,那我们就不用指定列,代表插入所有列:
insert into 表名 values (值1,值2,...);
- 全列插入不用指定列,默认全列都要插入值
- 没有指定出来的列仍然为默认值,默认值为NULL
2.3 多行插入
多行插入的全列插入、指定列插入的语法与单行插入的语法相同。
这里以全列插入为例:
insert into 表名 values (值1,值2,...),(值1,值2,...),........;
即在values后跟多个组的值,每个组代表一条数据行。
问题:单行插入(一次提交一条数据)和多行插入(一次提交多条数据)哪个效率更高?
该问题需要考虑:
- 数据量带来的网络开销
- 数据写入磁盘的IO开销
- 开启关闭事务所消耗的系统资源
答:一次提交多条数据(在可控的范围内)比单行插入效率要高一点。
3、查询(Retrieve)
3.1 全列查询(无条数限制)
查询表中所有行所有列:select * from 表名;
- * 代表查询表的所有列
- from、select为关键字
3.2 指定列查询
指定列的查询:select 列名,列名 from 表名;
3.3 表达式查询
3.3.1 表达式为新增的列
在select选择的列后加上一个数值类型,效果为所有记录都加上了这个表达式的值
注意:这个表达式虽然在临时表中显示出来了,但是并不在我们真实所创建的表里。
3.3.2 原有列进行表达式计算
select 表达式 from 表名;
示例一:所有记录的语文成绩在原来的基础上均加10分:
示例二:计算所有学生的总分:
3.4 别名
3.4.1 别名规则
select 表达式/列名 [as] 别名 from 表名;
我们可以给表达式起别名,也可以给每个列起别名。
- 在原来的名后加 as ‘别名’(最完整)
- 在原来的名后加 as 别名
- 在原来的名后加 ‘别名’
- 在原来的名后直接加 别名(最简)
也就是说:
- as可以省略;
- 单引号可以包裹住别名,也可以省略掉单引号,但是如果别名中有空格或者等运算符,则必须用单引号包裹住别名。
3.4.2 给表达式起别名
3.4.3 给列(字段)起别名
注意:
不管是使用表达式还是使用别名,查询显示出的结果集都是通过真实的表所返回的临时表,执行完之后就被删除了,并不是数据库中真正的表,所以说表达式和别名并没有存在于真实的表中。
3.5 去重查询
去重查询:select distinct 列名,列名... from 表名;
即查询所返回的结果集中过滤重复的记录,只保留一条记录。
重复的记录:要求每一列的值都要相同,只要有一列不相同,就不是重复的记录。
注意:上图仅有一个math列,只要math列相同就为重复记录,但是如果加上其他列,就要要求所有列相同才为重复记录:
故:
去重时,只有查询结果中所有的列都相同时,才会被认定为重复记录。
去重后,重复记录只保留一条。
3.6 排序查询
排序规则:
- ASC (asc):升序
- DESC(desc):降序
注意:desc 关键字,我们可以通过desc 表名;来查看表结构。这里的desc指的是describe 描述。而这里的desc为排序规则,descend 降序。
语法:select 列名,列名,... from 表名 order by 列名 [ASC | DESC];
通过升序或降序来对该列进行排序,降序则最大值在表的最上方。
3.6.1 MySQL中的NULL
MySQL中的NULL比较特殊,具有以下特点:
- 如果要排序的列中存在值为NULL的记录时,则NULL视为最小值
- NULL进行排序时,升序排在最上面,降序排在最下面。
- NULL不论和什么值进行运算,结果值都是NULL
-
NULL始终被判定为false
3.6.2 指定列排序
我们也可以通过 指定列+别名、表达式+别名 进行排序。我们更推荐使用别名进行排序,可读性更高,也可以简化代码。
3.6.3 表达式排序
表达式+别名 进行降序排序:
若写出了order by 列名 的字句,但没有指定排序规则,则默认为ASC升序。
3.6.4 多列排序
我们可以对多个字段进行排序,语法上我们只调整order by子句即可:
order by 列名 [ASC | DESC],列名 [ASC | DESC],列名 [ASC | DESC];
排序的优先级与书写顺序有关。
如下图所示,先对数学成绩进行排序,再对语文成绩进行排序,再对英语成绩进行排序: