携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情
1. 知识点补充
1.1 between and 方法的使用
- between and 可以用字符串,between ‘A ’ and 'C', 查询结果是查找包含A和B的字符串,前闭后开
- age between 20 and 100 整形两个都是闭区间 查询的是 age 在[20,100] 的结果
1.2 模糊查询 like 补充
- 问题,如何查询带 _ 的字符串,我们知道 _ 在模糊查询中代表下一位的意思
- 解决: 通过转义字符, '%/_%' ;
2. 数据库排序
- 排序的关键字为: order by
语法: order by 字段 desc ; // 升序
order by 字段 asc ; // 降序
3. 分组函数
3.1分组函数主要是这五个
count() 统计函数
sum() 求和函数
max() 最大值函数
min() 最小值函数
avg() 平均值函数
注意: ifnull 不是分组函数
3.2 使用分组函数注意事项
所有的分组函数自动忽略null值,如果统计表格中有多少行数据count(*),count(字段)可能会有误差,因为null不会被统计
数据库表达式中如果出现了null ,返回结果一定为null
分组函数输入多行,返回的是单行数据
ifnull (可能为nulll的字段,返回的数据)分组函数不能出现在where子句的后面,终究原因是因为,数据库的执行顺序,where 条件判断的时候,调用分组函数,此时的分组函数还没有被创建,所以程序会报错
如果语句中没有出现分组语句,那么默认就会把整张表作为一组
分组查询,语法: group by 字段1 ,字段2;
- select job from emp order by job desc;
- select job from emp order by '3' desc; // 序号从1开始
- select ename ,job ,sal from emp where job = 'SALESMAN' order by sal desc;
- 顺序 select emp where job = 'SALESMAN' ename ,job ,sal sal desc;
3.3 分组函数
- count () // 统计函数
- sum() // 求和
- max() // 最大值
- min() //最小值
- avg() // 平均值
3.4 distinct 去重
-
注意事项: distinct 在字段前面,不能再有字段 ,正确写法实例:
select distinct(job) from emp;
4 . 案例: 练习
4.1 案例分析 (一)
- 数据库知识点有点多,而且没有其他办法,就是多记多练(所以就多整一些案例,仅供参考!)
- 还是以 emp 表为例
- 练习1 查询员工工资升序/ 降序排行榜
select ename, sal from emp order by sal asc; // 升序
select ename, sal from emp order by sal desc; // 降序
- 练习2 查询工资降序排行榜,当工资相同按照名字的升序排列
// 排序可以接受多个字段, 语法: order by 字段1 desc/ asc , 字段2 desc/ asc ;
//原理: 优先前面的子杜纳,当前面的字段排序结果相等时,按照后面的字段规则来排序;
select ename ,sal from emp order by sal desc ,ename asc;
- 练习 3 查询员工岗位降序排行榜
// 可以将列的顺序当作列名使用,但是 ‘3’ 当作列名输出就不行了
select ename ,job from emp order by '3' desc;
select ename ,'3' from emp order by '3' desc; // 这样是不可以的
- 练习 4 查询岗位是SALESMAN的员工,按照此岗位工资的降序排列
select job ,sal from emp where job='SALESMAN' order by sal desc;
4.1 分组查询原理分析
4.1.1 案例: 查询每个工作岗位的最高薪资
select job , max(sal) from emp group by job;
结果:
+-----------+----------+
| job | max(sal) |
+-----------+----------+
| ANALYST | 3000.00 |
| CLERK | 1300.00 |
| MANAGER | 2975.00 |
| PRESIDENT | 5000.00 |
| SALESMAN | 1600.00 |
+-----------+----------+
5 rows in set (0.00 sec)
4.1.2 原理分析
第一步:所有的job 工作岗位对应的工资
+-----------+---------+
| job | sal |
+-----------+---------+
| CLERK | 800.00 |
| SALESMAN | 1600.00 |
| SALESMAN | 1250.00 |
| MANAGER | 2975.00 |
| SALESMAN | 1250.00 |
| MANAGER | 2850.00 |
| MANAGER | 2450.00 |
| ANALYST | 3000.00 |
| PRESIDENT | 5000.00 |
| SALESMAN | 1500.00 |
| CLERK | 1100.00 |
| CLERK | 950.00 |
| ANALYST | 3000.00 |
| CLERK | 1300.00 |
+-----------+---------+
第二步: 将所有的工作岗位进行归类,然后查找出每一组对应的最高工资
SALESMAN 销售员组
| SALESMAN | 1600.00 |
| SALESMAN | 1250.00 |
| SALESMAN | 1250.00 |
| SALESMAN | 1500.00 |CLERK 组
| CLERK | 800.00 |
| CLERK | 1100.00 |
| CLERK | 950.00 |
| CLERK | 1300.00 |MANAGER 管理员组
| MANAGER | 2975.00 |
| MANAGER | 2850.00 |
| MANAGER | 2450.00 |ANALYST 分析师组
| ANALYST | 3000.00 |
| ANALYST | 3000.00 |
PRESIDENT CEO组
| PRESIDENT | 5000.00 |
4.3 案例分析(二)
补充:
having 的作用: 进行条件判断,但是执行效率低,能用where的使用尽量使用where 进行判断,提高执行程序执行效率,
因为where 的执行顺序比having高
具体例题请看: 练习6 、练习7
- 练习5 查询每个岗位的平均薪资
select job,avg(sal) from emp group by job ;
- 练习6 查询每个部门最高薪资大于1900的数据
select job , max(sal) from emp where sal>1900 group by job ;
- 练习7 查询每个部门最高薪资大于1900的数据
select job, max(sal) from emp group by job having max(sal)>1900;
- 练习 8 查询各个部门的工作岗位去除重复的岗位
select distinct(job) from emp;
5. 程序执行顺序
单表查询的程序执行顺序(重要!)
select (字段|分组函数) 5
from (查找表名) 1
where(条件) 2
group by (分组) 3
having (条件) 4
order by (排序) 6
5.1 总结
暂时学到的数据库,给自己的感觉,就是,可以增删改查,然后要记的东西非常的多,执行起来难度和java相比确实简单一点,毕竟还是在基础,所以多记多背就是基础学习的重点!