一、 排序查询
1、语法
select 要查询的东西
from 表
where 条件
order by 排序的字段|表达式|函数|别名 【asc|desc】
(order by:放在最后除了limit字句,asc|desc :不写默认为升序)
2、排序方式
- ASC:升序,默认的
- DESC:降序
- 排序分类:
按单个字段进行排序
按多个字段排序
按表达式排序
按别名排序
按函数排序
注意: 如果有多个排序条件,则当之前的条件值一样时,才会判断第二条件
2、 常见函数
1、单行函数
(1)字符函数
- length:获取数值字节个数
- concat:拼接字符串
- substr/substring:截取字符串
- upper:大写转换
- lower:小写转换
- instr:返回子串第一次出现的索引
- trim:去除空格
- ltrim: 去左边空格
- rtrim: 去右边空格
- replace: 替换
- lpad: 左填充
- rpad: 右填充
(2)数学函数
- round: 四舍五入
- rand: 随机数
- floor: 向下取整
- ceil: 向上取整
- mod: 取余
- truncate: 截断
(3)日期函数
- now: 当前系统日期+时间
- curdate: 当前系统日期
- curtime: 当前系统时间
- str_to_date: 将字符转换成日期
- date_format: 将日期转换成字符
(4)流程控制函数
- if 处理双分支
- case语句 处理多分支
情况1:处理等值判断
case 要判断的字段或表达式
when 常量1 then 要显示的值1或者语句1
when 常量2 then 要显示的值2或者语句2
....................................
else 要显示的值n或语句n
end
情况2:处理条件判断
case
when 条件1 then 要显示的值1或者语句1
when 条件2 then 要显示的值2或者语句2
....................................
else 要显示的值n或语句n
end
(5)其他函数
- version: 版本
- database: 当前库
- user: 当前连接用户
-
课堂练习
1.显示系统时间(注:日期+时间)
SELECT NOW();
2、查询员工号,姓名,工资,以及工资提高百分之20%后的结果(new salary)
SELECT `employee_id`,CONCAT(`last_name`,`first_name`)AS 姓名,`salary`,`salary`*1.2 AS 新工资
FROM `employee`;
3.将员工的姓名按首字母排序,并写出姓名的长度(length)
SELECT `employee_id`,CONCAT(`last_name`,`first_name`) AS 姓名,LENGTH(CONCAT(`last_name`,`first_name`))
FROM `employee`
ORDER BY SUBSTR(`last_name`,1,1) ASC;
2、分组函数
- count:计算个数
一般选择非空的列:主键
count(*):统计非null的行数
count(1):统计行数
- max:计算最大值
- min:计算最小值
- sum:计算和
- avg:计算平均值
特点:
- 1、以上五个分组函数都忽略null值,除了 count(*)
- 2、sum和avg一般用于处理数值型,max、min、count可以处理任何数据类型
- 3、都可以搭配distinct使用,用于统计去重后的结果
- 4、count的参数可以支持: * 字段、*、常量值,一般放1
注意:聚合函数的计算,排除null值。
解决方案: 选择不包含非空的列进行计算
IFNULL函数
课堂练习
-
查询公司员工工资的最大值,最小值,平均值,总和
SELECT `job_id`,MAX(salary),MIN(salary),AVG(salary),SUM(salary)
FROM `employee`;
2、查询部门编号为90的员工个数
SELECT COUNT(*)
FROM `employee`
WHERE `department_id`= 90;
二、分组查询
-
语法
select 查询的字段,分组函数
from 表
group by 分组的字段
-
特点:
1、可以按单个字段分组
2、和分组函数一同查询的字段最好是分组后的字段
3、可以按多个字段分组,字段之间用逗号隔开
4、可以支持排序
5、having后可以支持别名
-
where 和 having 的区别?
1. where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不 满足结果,则不会被查询出来
2. where 后不可以跟聚合函数,having可以进行聚合函数的判断。
课堂练习
1.查询各job_id的员工工资的最大值,最小值,平均值,总和,并按job_id升序
SELECT `job_id`,MAX(salary),MIN(salary),AVG(salary),SUM(salary)
FROM `employee`
GROUP BY `job_id`
ORDER BY `job_id`;
2.查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内
SELECT `manager_id`,MIN(`salary`)
FROM `employee`
WHERE `manager_id` IS NOT NULL
GROUP BY `manager_id`
HAVING MIN(`salary`)>=6000;
3.查询所有部门的编号,员工数量和工资平均值,并按平均工资降序
SELECT `department_id`,COUNT(1),AVG(`salary`)
FROM `employee`
GROUP BY `department_id`
ORDER BY AVG(`salary`) DESC;