哈罗,各位小伙伴大家好,又见面了,我还是那个不吃饱不干活的小尘,欢迎来到本期的SQL语言之排序查询部分,让我们一起进入知识的海洋吧~
一、引入
之前我们学过基础查询:
SELECT * FROM employees;
这样查询的话,显示结果的顺序和表中原始数据的存储顺序是完全一致的。
若我们有这样一个需求,按照员工的工资或是数值的先后,从高到低在页面上显示出来。
那就要用到条件查询啦!
二、语法:
基础查询: SELECT * FROM employees;
排序查询: SELECT * FROM empoyees (根据需要可以加where子句进行筛选)
order by 排序的列表
SELECT
查询列表
FROM
表
WHERE
查询条件
ORDER BY
排序列表(ASC-->升序 / DESC-->降序)
三、案例
案例一:从高到低排序
查询员工信息,要求工资从高到低排序。
代码:
select
*
from
employees
order by
salary desc;
执行结果:
案例二:从低到高排序
查询员工信息,要求工资从低到高排序。
代码:
select
*
from
employees
order by
salary asc;
执行结果:
当然,这里的ASC可以省略,效果和上面一样哦:
案例三、添加筛选条件
查询部门编号大于等于90的员工信息,按入职时间的先后进行排序
代码:
SELECT
*
FROM
employees
WHERE
department_id>=90
ORDER BY
hiredate ASC;
执行结果:
案例四、按表达式排序
按年薪的高低显示员工的信息和年薪。
代码:
SELECT
*,
salary*12*(1+IFNULL(commission_pct,0) ) AS 年薪
FROM
employees
ORDER BY
salary*12*(1+IFNULL(commission_pct,0)) DESC;
执行结果:
年薪那个表达式写法解析:
salary*12*(1+IFNULL(commission_pct,0) ) AS 年薪
salary是薪水,乘以12是年薪,然后还有奖金率呢。因为奖金率commission_pct有NULL的情况,所以用到函数IFNULL,有两个参数:第一个是奖金率,第二个是若有NULL的情况返回什么值。最后AS是起别名。
案例五、按别名排序
按年薪的高低显示员工的信息和年薪。
还是上一题,我们给commission_pct取了一个别名“年薪”,那我们在后面排序的时候,能不能用这个别名呢?
代码:
SELECT
*,
salary*12*(1+IFNULL(commission_pct,0)) AS 年薪
FROM
employees
ORDER BY
年薪 DESC;
执行结果:
我们可以看到,结果没有变。也是可以的。
说明ORDER BY也支持别名。
案例六、按函数排序
按姓名长度来显示员工的姓名和工资
这道题要用到LENGTH函数:
我们可以看到,LENGTH函数有一个参数,括号里面写的是要获取长度的字符。
若我们写了“john”,就是4个长度。即返回字符的长度。
现在我们返回的是姓名last_name。
代码:
SELECT
LENGTH(last_name) AS 字节长度,
last_name,
salary
FROM
employees
ORDER BY
LENGTH(last_name) DESC;
执行结果:
案例七、按多个字段排序
查询员工信息,要求先按工资升序,再按员工编号降序。
我们刚才几个案例,列表里面,只有一个。
现在我们这个里面既有工资,也有编号。也就是说要按多个字段排序。
代码:
SELECT
*
FROM
employees
ORDER BY
salary ASC,
employee_id DESC;
执行结果:
我们还会发现,当工资相等的时候,按照编号降序排列:
四、特点
(1)ASC代表升序,DESC代表降序。若两个关键字都不写,则默认是升序。
(2)ORDER BY 子句中可以支持单个字段、多个字段、表达式、函数、别名。
(3)ORDER BY 子句一般是放在查询语句的最后面, limit 子句除外。
(4)ORDER BY 执行顺序:FROM 表--->WHERE 筛选--->SELECT 查询列表--->ORDER BY
五、测试题
测试题一
查询员工的姓名和部门编号和年薪,按年薪降序,按姓名升序。
考点:按多个字段进行排序。
代码:
select
last_name,
department_id,
salary*12*(1+(IFNULL(commission_pct,0))) as 年薪
from
employees
order by
年薪 desc,
last_name asc;
执行结果:
测试题二
选择工资不在8000到17000的员工的姓名和工资,按工资降序。
考点:排序+筛选
代码:
SELECT
last_name,
salary
FROM
employees
WHERE
#salary <=8000 and salary>=17000
salary NOT BETWEEN 8000 AND 17000
ORDER BY
salary DESC;
执行结果:
测试题三
查询邮箱中包含e的员工信息,并先按邮箱的字节数降序,再按部门号升序。
代码:
SELECT
*,
LENGTH(email)
FROM
employees
WHERE
email LIKE '%e%'
ORDER BY
LENGTH(email) DESC,
department_id ASC;
运行结果:
好啦~这次的内容就分享到这儿了。