四、排序数据
4.1单一字段排序
-
根据某字段升序排列:
-
order by 字段名 [asc-可省略,默认为升序];
eg.员工薪资从低到高排:
select
ename,sal
from
emp
order by
sal [asc];//默认是升序!!!
-
降序:order by 字段名 desc;
eg.员工薪资从高到低排:
select
ename,sal
from
emp
order by
sal desc;
4.2手动指定排序顺序
-
!!可以多个字段排序吗?比如查询员工名字和薪资要求按照薪资升序,薪资一样时,再按照名字升序排列?
select
ename,sal
from
emp
order by
sal asc, ename asc;//sal在前,起主导,只有sal相等时继续按照ename升序排
4.3使用字段的位置来排序
-
了解】根据字段的位置也可以排列
select ename,sal from emp order by 2;//2表示第二列sal.--根据查询结果的第二列sal排列
*不建议在开发中这样写,因为不健壮。列的顺序很容易发生改变,列顺序修改后,2就废了。
-
综合案例:
查找出员工名字和薪资在2000到3500之间的,并按照薪资降序进行排列?
select
ename,sal
from
emp
where
sal between 2000 and 3500
order by
sal desc;
//标红的关键字顺序不能变,以上语句的执行顺序!必须掌握:
第一步:from找表
第二步:where筛选数据
第三步:select进行过滤
第四步:order by排序展示(排序总在最后执行!
五、数据处理函数/单行处理函数
5.1数据处理函数又被称为单行处理函数
-
单行处理函数的特点:一个输入对应一个输出
-
多行处理函数:和单行处理函数相对,特定--多个输入对应一个输出。
5.2单行处理函数常见的有哪些?
-
lower(列名)--转换成小写
select lower(ename) as ename from emp;//不写别名会默认显示成lower(ename)作为列名
-
*14个输入,最后还是14个输出,这是单行处理函数的特点。
-
upper(列名)--转换成大写
select upper(ename) as ename from emp;
-
substr(列名/被截取的字符串,起始下标,截取的长度)--取子串
*注意:起始下标从1开始,没有0.
eg.找出员工名字第一个字母是A的员工信息?
第一种方式:模糊查询
select ename from emp where ename like 'A%';
第二种方式:substr函数
select
ename
from
emp
where
substr(ename,1,1)='A';
-
length(列名)--计算每个字段的长度
select length(ename) enamelength from emp;//两个列名之间只有空格表示省略了as的起别名方式
-
concat(要进行拼接的字段1,要进行拼接的字段2,...) --多个字符串的拼接
select concat(empno,ename) from emp;
-
综合案例:将学生姓名的首字母大写?
(1)select name from stu;//查找各个学生姓名
(2)select substr(name,1,1) from stu;//找到首字母
(3)... upper(substr(name,1,1)) ...//1:首字母转成大写
(4)... substr(name,2,length(name)-1) ...//2:截除首字母外剩下的字母
(5)select contact( upper(substr(name,1,1)) , substr(name,2,length(name)-1) ) from emp;//将1,2部分拼接起来
-
trim(可以直接在括号里写字段名,也'可以在引号中直接写带有空格的字符')--去除前后空格
select * from emp where ename = trim(' KING ');
-
str_to_date ---将字符串转换成日期
-
date_format ---格式化日期
-
format ---设置千分位
-
case...when..then..when..then..else..end --相当于分支语句
eg.当员工的工作岗位是MANAGER的时候,工资上调10%,SALESMAN的时候,工资上调50%,其他正常,注:不修改数据库,只是将结果显示为工资上调。
select
ename,
job,
sal as oldsal,
(case job when 'MANAGER' then sal * 1.1 when 'SALESMAN' then sal * 1.5 else sal end) as newsal
from
emp;
-
round(数字,数字-表示四舍五入到哪一位) ---四舍五入
注意:
(1)select ename from emp;//select 字段名 from 表名;--结果正常显示
(2)select 'abc' from emp;//select 后面直接跟非字段名的是'字面量/字面值' --会自动根据表的结构生成以字面量为记录的字段
-
-
结论:select后面可以跟某个表的字段名,也可以跟字面量/字面值(数据)。
eg:
(1)select round(1236.567,0) as result from emp;//保留到整数位 ---1237
(2)select round(1236.567,1) as result from emp;//保留1位小数 ---1236.6
(3)select round(1236.567,2) as result from emp;//保留2位小数 ---1236.57
(4)select round(1236.567,-1) as result from emp;//保留到十位 ---1240
-
rand() ---生成随机数,默认是0-1以内的
(1)select rand() from emp;
-
(2)select round(rand()*100,0) from emp;//一百以内的随机整数
-
ifnull(字段名数据,想把数据当做哪个值) ---当"字段名数据"为NULL时,可以人为将NULL值当做自定义的值来进行计算。*因为数据库中有NULL参与的运算,结果都是NULL,会有错误。
eg.计算员工的薪资加上补助得出实际到手工资:
select ename,(sal+ifnull(comm,0)) as '实际到手' from emp;//as取别名有就近原则
-
(课程P26-p36)