MySQLday3--分组函数,分组查询,连接查询

Day3

分组函数(多行处理函数)

特点:输入多行,输出一行。

5个:
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值

注意:分组函数在使用德时候必须先分组,然后才能用。如果没有对数据分组,则整张表默认为1组

select avg(sal) from emp;
select min(sal) from emp;
select 函数(字段名) from 表名;

第一点!!!使用时注意:分组函数自动忽略NULL 不需要提前处理。

第二点!!!分组函数中 count(*) 和 count(具体字段) 有什么区别?

count(具体字段):表示该字段下所有不为null的元素的总数
count(*) :表示整个表行数,统计所有行数

第三点!!!分组函数不能直接使用在 where 子句中。

​ 找出比最低工资高的原员工信息

​ 不能再where中 where sal > min(sal) //详见分组查询(group by)

第四点!!!所有的分组函数可以组合起来一起用

	select sum(sal),min(sal),max(sal),avg(sal),count(*) from emp;
分组查询(非常重要)

什么是分组查询:在实际应用中可能有这样的需求,需要先进行分组,然后堆i每一组的数据进行操作

select
	...
from
	...
group by
	...
计算每个部门的平均工资
找出每个岗位的最高薪资

关键字执行顺序

select
	...
from
	...
where
	...
group by
	...
order by
	...

以上执行顺序不能颠倒,需要记忆

以上关键字的执行顺序:

1.from
2.where
3.group by
4.select
5.order by

所以在where中不能使用分组函数

案例:找出每个工作岗位的工资和

​ 实现思路:按照工作岗位分组,然后工资求和

select 
	job,sum(sal)
from
	emp
group by 
	job

重点结论
在一条 select 语句中,如果有group by 语句的话,select 后米娜只能跟,参加分组的字段,以及分组函数,其他的都不能跟

多字段分组:找出每个部门,不同岗位的最高薪资

技巧:两个字段联合成1个字段看

select
	depton,job,max(sal)
from
	emp
group by 
	depth,job

使用having 子句可以对分完组之后的数据就行过滤

having不能代替where单独使用,必须和group by联合使用

where是先筛选再分组,having是先分组再筛选

示例:查询每个部门的最高薪资,要求显示最高薪资大于3000的

第一步: 查询每个部门的最高薪资

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

第二步:显示最高薪资大于3000的

select 
	depton,max(sal) 
from
	emp 
group by
	depton;
having 
	max(sal)>3000
单表查询总结
select
	...
from
	...
where
	...
group by
	...
having
	...
order by
	...

以上关键字只能按照这个顺序来。

执行顺序

1.from
2.where
3.group by
4.having
5.select
6.order by

从某张表中查询数据,
先经过where条件筛选有价值的数据
再经过 group by 对有价值的数据分组
之后这些分组可以通过having继续筛选
select查询出来
最后排序输出

distinct关键字

把查询结果去除重复记录
注意:不会改变原数据,只是查询结果去除

select distinct job from emp

//distinct只能出现在所以字段的最前方、

distinct出现在job,deptno两个字段之前,表示两个字段联合起来去除重复

select distinct job,deptno from emp;
连接查询(非常重要)
什么是连接查询

从一张表中单独查询,称为单表查询。

emp表和dept表联合起来取数据,从emp中取员工名字,从dept中取部门名字。

这种跨表查询,多张表联合起来查询数据,称为连接查询

根据表的连接方式

​ 内连接:
​ 等值连接
​ 非等值连接
​ 自链接

​ 外连接:
​ 左外连接(左连接)
​ 右外连接(右连接)

​ 全连接(不讲)

笛卡尔积现象

两张表连接没有任何条件限制:

select ename,dname from emp,dept;

是两张表的笛卡尔积

避免笛卡尔积现象

连接时加条件,满足这个条件的记录被筛选出来

select 
	emp.ename,dept.dname 
from 
	emp,dept
where
	emp.deptno = dept.deptno;

//给表起别名,
select 
	e.ename,d.dname 
from 
	emp e,dept d
where
	e.deptno = d.deptno;

最终查询的结果条数正确,但匹配过程中的匹配次数没有减少。还经过了笛卡尔积,只是筛选出来了

表的连接次数越多效率越低,尽量减少表的连接次数

内连接之等值连接:

案例:查询每个员工所在的部门名称,显示员工名和部门名
emp e和dept d表进行连接,条件是 : e.deptno = d.deptno

SQL92语法:
select 
	e.ename,d.dname;
from 
	emp e,dept d
where
	e.deptno = d.deptno;
SQL92 结构不清晰,表的连接条件和筛选的条件都放到了where的后面
SQL99语法: 
select 
	e.ename,d.dname;
from 
	emp e join dept d
on
	e.deptno = d.deptno
where
	...;
SQL99 结构清晰,表连接的条件是独立的,连接之后,如果还需要进一步筛选,再往后添加where,join是连接,on是条件
select 
	...
from 
	a join b
on
	 a和b连接的条件 (这个条件是等量关系,所以被称为等值连接)
where
	筛选条件;
内连接之非等值连接

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

image-20220308162142361
select
	e.ename,e.sal,s.grade
from 
	emp e join salgrade s
on
	e.sal between s.losal and s.hisal;
内连接之自连接

案例:查询员工的上级领导,要求显示员工名和对应的领导名

image-20220308163149100

技巧:将一张表看成两张表 (给一张表起两个别名,分别用)

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

**内连接的特点:**完全能匹配上这个条件的数据查询出来

**外连接特点:**外连接能把 (right left)join 对应的表 看成主表,把主表的全部数据全都查出来,捎带着关联查询左边的表。

​ 在外连接中,两张表出现了主次关系

外连接
select
	e.ename,e.sal,s.grade
from 
	emp e right  join salgrade s
on
	e.sal between s.losal and s.hisal;

带有left的是左外连接,又叫做左连接

带有right的是右外连接,又叫做右连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值