0
点赞
收藏
分享

微信扫一扫

数据库基础学习2022/3/22

16.group by 和having

group by:安装某个或某些字段进行分组

having:对分组之后的数据进行再次过滤

找出每个工作岗位的最高薪资?

select max(sal),job from emp group by job;

注意:分组函数一般会和group by联合使用

任何一个分组函数都是在group by执行结束后才会执行

在一条sql语句中,如果没有group by,整张表的数据会自成一组。

select ename,max(sal),job from emp group by job;//无法执行,ename未参加分组

注意:group by后面只能跟分组函数和参与分组的字段

数据库基础学习2022/3/22_数据

对个字段联合一块分组。

案例:找出每个部门不同工作岗位的最高薪资

select deptno,job,max(sal) from emp group by deptno,job;

数据库基础学习2022/3/22_字段_02

having使用

找出每个部门最高薪资,要求显示薪资大于2900

select deptno,max(sal) from emp group by deptno having max(sal) > 2900;//这种方式效率低

数据库基础学习2022/3/22_数据_03

提前筛选出大于工资2900的,再按部门分组求最大值

select deptno,max(sal) from emp where sal > 2900 group by deptno;//效率较高,建议多使用

数据库基础学习2022/3/22_数据_04

有时候只能用having

找出各个部门平均薪资,并且只显示大于2900的数据

第一步:找出各部门平均薪资

select deptno,avg(sal) from emp group by deptno;

第二部:筛选出大于2900的数据

select deptno,avg(sal) from emp group by deptno having avg(sal) > 2900;

数据库基础学习2022/3/22_数据_05

这使用where就没办法写:

select deptno,avg(sal) from emp where avg(sal) > 2900 group by deptno;//前面说where过后面不能用分组函数

数据库基础学习2022/3/22_字段_06

17.一个完整的DQL语句

select 字段,字段....          1

from 表                          2

where 条件                     3

group by 字段,字段,,,,,     4

having 条件                    5

order by 字段 desc/asc;   6

day 2

1.查询结果集的去重?​

select distinct job from emp;//关键字distinct去除重复记录

数据库基础学习2022/3/22_字段_07

select ename,distinct job from emp;//语法错误

数据库基础学习2022/3/22_字段_08

distinct只能放前面

select distinct deptno,job from emp;//组合一起去重

数据库基础学习2022/3/22_内连接_09

案例:统计岗位种类数量

select count(distinct job) from emp;

数据库基础学习2022/3/22_内连接_10

2.连接查询
2.1 什么是连接查询?

在实际开发中,大部分情况下都不是从单表中查询数据,一般都是多表联合查询取出最终结果。

在实际开发中,一般一个业务会对于多张表,比如:学生和班级,起码两张表

stuno     stuname      classno         classname

1               zs               1               一班

2               ls                1               一班

如果学生和班级都在一张表会使得数据多次重复出现,导致数据冗余

2.2 连接查询分类

根据语法出现年代划分:SQL92,SQL99

根据表的连接方式来划分:

内连接: 

    等值连接

    非等值连接

    自连接

外连接:

    左外连接(左连接)

    右外连接(右连接)

全连接(很少用)

2.3 表的连接查询现象:笛卡尔乘积现象

案例:找出每一个员工的部门名称,要求显示员工名和部门名

EMP表:

数据库基础学习2022/3/22_内连接_11

DEPT表:

数据库基础学习2022/3/22_数据_12

select ename,dname from emp,dept;//会出现56条,是ename和dname逐条匹配,类似于乘积

数据库基础学习2022/3/22_字段_13

笛卡尔积现象:当两张表进行连接查询的时候,没有任何条件进行限制,最终查询结果是两张表记录条数的乘积

关于表的别名:

select e.ename,d.dname from emp e,dept d;

别名的好处:

第一:执行效率高,避免两张表出现同名字符串

第二:可读性强

2.4 怎么避免笛卡尔积现象?加条件进行过滤。

思考:避免了笛卡尔积现象,会减少记录的匹配次数吗?

不会,次数还是56次,只不过显示的是有效记录

案例:找出每一个员工的部门名称,要求显示员工名和部门名

select e.ename,d.dname from emp e,dept d where e.deptno = d.deptno;//sql92语法

数据库基础学习2022/3/22_内连接_14

2.5 内连接之等值连接:最大特点是条件是等量关系

案例:查询每个员工的部门名称,要求显示员工名和部门名

select e.ename,d.dname from emp e,dept d where e.deptno = d.deptno;/sql92

select ename,dname from emp e join dept d on e.deptno = d.deptno;//sql99将表连接和过滤条件分离出来

数据库基础学习2022/3/22_内连接_15

模式:

.....    from 表1 join 表2  on  连接条件 where 条件;

2.6 内连接之非等值连接:连接条件的关系是非等量关系

案例:找出每个员工的工资等级,要求显示员工名,工资,工资等级

数据库基础学习2022/3/22_字段_16

select e.ename,e.sal,s.grade from emp e (inner可以省略) join salgrade s on e.sal between s.losal and hisal;

数据库基础学习2022/3/22_字段_17

2.7 自连接:一张表看做两张表。自己连接自己

案例:找出每个员工的领导,显示员工和领导名

数据库基础学习2022/3/22_数据_18

将emp视为两张表,一张表作为“员工表”,一张表作为“领导表”

连接条件就是员工表的mgr等于领导表的empno

select a.ename as '员工',b.ename as '领导' from emp a join emp b on a.mgr=b.empno;

数据库基础学习2022/3/22_数据_19

king没有上级领导,没有匹配项,所以未显示

2.8 外连接

什么是外连接,和内连接有什么区别?

内连接:

 假设A表和B表进行连接,使用内连接的话,凡是A表和B表能匹配上的记录查询出来,这就是内连接

AB两张表没有主副之分,两张表是平等的

外连接:

假设A和B表进行连接,使用外连接的话,AB两张表中有一张表是主表,一张表是副表,主要查询主表中的数据,捎带查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出null与之匹配。

外连接分类:

左外连接(左连接):表示左边的表是主表

右外连接(右连接):表示右边的表是主表

左连接有右连接的写法,右连接也会有对于的左连接的写法

案例:找出每个员工的上级领导?(所有全部员工)king也查出来

select a.ename as '员工',b.ename as '领导' from emp a ​left (outer可以省略) join emp b on a.mgr=b.empno;

左边的表为主表,所以必须查处所以员工,如果没有领导就显示null

 数据库基础学习2022/3/22_内连接_20

外连接最重要的特点:主表的数据无条件的全部查询出来

案例:找出那个部门没有员工

select d.deptno,d.dname from emp e right join dept d on e.deptno = d.deptno where e.ename is null;

数据库基础学习2022/3/22_数据_21

数据库基础学习2022/3/22_数据_22

数据库基础学习2022/3/22_字段_23

2.9 三张表怎么连接查询

案例:找出每一个员工的部门名称以及工资等级

。。。

A  join   B   join C on ...

表示:A表先和B表建立连接,之后A表继续和C表建立连接

select e.ename,d.dname,s.grade from emp e join dept d on e.deptno=d.deptno join salgrade s  on e.sal between s.losal and s.hisal;

看成e和d,e和s分别连接查询出结果

数据库基础学习2022/3/22_内连接_24

举报

相关推荐

0 条评论