mysql 基础篇数据库分组 + 案例大量练习(二)

149 阅读4分钟


携手创作,共同成长!这是我参与「掘金日新计划 · 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 使用分组函数注意事项

  1. 所有的分组函数自动忽略null值,如果统计表格中有多少行数据count(*),count(字段)可能会有误差,因为null不会被统计

  2. 数据库表达式中如果出现了null ,返回结果一定为null

  3. 分组函数输入多行,返回的是单行数据

    ifnull (可能为nulll的字段,返回的数据)
    
  4. 分组函数不能出现在where子句的后面,终究原因是因为,数据库的执行顺序,where 条件判断的时候,调用分组函数,此时的分组函数还没有被创建,所以程序会报错

  5. 如果语句中没有出现分组语句,那么默认就会把整张表作为一组

  6. 分组查询,语法: group by 字段1 ,字段2;

  1. select job from emp order by job desc;
  2. select job from emp order by '3' desc; // 序号从1开始
  3. select ename ,job ,sal from emp where job = 'SALESMAN' order by sal desc;
  4. 顺序 select emp where job = 'SALESMAN' ename ,job ,sal sal desc;

3.3 分组函数

  1. count () // 统计函数
  2. sum() // 求和
  3. max() // 最大值
  4. min() //最小值
  5. avg() // 平均值

3.4 distinct 去重

  • 注意事项: distinct 在字段前面,不能再有字段 ,正确写法实例:

    select distinct(job) from emp;
    

4 . 案例: 练习

4.1 案例分析 (一)

  • 数据库知识点有点多,而且没有其他办法,就是多记多练(所以就多整一些案例,仅供参考!)
  • 还是以 emp 表为例

emp表.png

  • 练习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相比确实简单一点,毕竟还是在基础,所以多记多背就是基础学习的重点!