mysql关联分组查询,Mysql分组查询⼦查询关联查询【总结】1、分组查询:group by
通常和聚合函数结合使⽤,以组为单位进⾏统计,⼀般情况下,题⽬中每个XX就在group by后⾯写这个XX;
例:查询每个部门的最⾼⼯资:
select deptno,max(sal) from emp group by deptno;
例:查询每个分类下的商品最⼤价格:
select category_id,max(price) from t_item group by category_id;
例:查询每个部门中⼯资⼤于1500的⼈数:
select deptno,sal from emp where sal > 1500 group by deptno;
例:查询每个领导⼿下的⼈数:
select mgr,count(*) from emp where mgr is not null group by mgr;
如果需要使⽤多个字段进⾏分组,直接在group by后⾯写多个字段名通过逗号分隔:
例:查询按每个部门下每个领导的⼿下⼈数:
select deptno,mgr,count(*) from emp where mgr is not null group by deptno,mgr;
having:要写在group by后⾯和它结合使⽤:
where:后⾯只能写普通字段的条件不能写聚合函数;
having:后⾯可以写普通字段条件也可以写聚合函数推荐在having后⾯只写聚合函数;
例:查询每个部门的平均⼯资,要求平均⼯资⼤于2000:
select deptno,avg(sal) a from emp group by deptno having a > 2000;
例:查询每个分类的平均单价,过滤掉平均单价低于100的:
mysql交集查询select category_id,avg(price) a from t_item group by category_id having a >= 100;
2、⼦查询:
例:查询emp表⼯资中最⾼的员⼯信息:
正常情况下需要查出最⾼⼯资的员⼯,然后再查出员⼯的信息:
select max(sal) from emp;(查询结果为5000)
select * from emp where sal = 5000;
使⽤⼦查询:
select * from emp where sal = (select max(sal) from emp);
例:查询⼯资最低的员⼯的所在部门的同事信息:
⾸先查询到⼯资最低的员⼯:
select min(sal) from emp;
通过最低⼯资到所在部门编号:
select deptno from emp where sal = (select min(sal) from emp);
通过编号到其他的员⼯信息:
select * from emp where deptno = (select deptno from emp where sal = (select min(sal) from emp));
扩展题:查询平均⼯资最⾼的部门信息:
得到每个部门的平均⼯资:
select deptno,avg(sal) from emp group by deptno;
得到最⾼的平均⼯资:
select avg(sal) a from emp group by deptno order by a desc limit 0,1;
通过最⾼的平均⼯资得到部门编号:(这⾥为了严谨考虑有多个部门⼯资平均值相同且为最⾼平均⼯资的情况)
select deptno from emp group by deptno having avg(sal) = (select avg(sal) a from emp group by deptno order by a desc limit 0,1);
通过部门编号获得部门信息:
select * from dept where deptno in(select deptno from emp group by deptno having avg(sal) = (select
avg(sal) a from emp group by deptno order by a desc limit 0,1));
⼦查询可以写在什么位置:
写在where或having后⾯,当做查询条件的值;
写在创建表的时候,把查询结果保存成⼀张新的表;
写在from的后⾯当成⼀张虚拟表,必须有别名。
3、关联查询:
同时查询多张表的数据称为关联查询(能查询到的只能是两张表的交集)。
例:查询每⼀个员⼯的姓名和对应的部门名称:
ame,d.dname from emp e,dept d where e.deptno = d.deptno;
笛卡尔积:如果关联查询不写关联关系则结果为两张表的乘积,这个乘积称为笛卡尔积,笛卡尔积为⼀种错误的查询结果,切记⼯作中不要出现。
关联查询的查询⽅式:等值连接和内连接
等值连接:select * from A,B where A.x = B.x and A.age = 18;
内连接:select * from A [inner] join B on A.x = B.x where A.age = 18; [inner]可以省略不写
等值连接和内连接查询到的内容⼀样,都为两张表中有关联关系的数据(交集部分)。
例:查询每⼀个员⼯的姓名和对应部门名称:(⽤内连接的⽅式)
ame,d.deptno from emp e join dept d on e.deptno = d.deptno;
外连接:内连接和等值连接查询到的是交集数据,外连接查询到的是某⼀张表的全部数据 + 另⼀张表的交集数据。
左/右外连接:select * from A left/right join B on A.x = B.x where A.age = 18;(左外连接就是以左边的表即A为主表和右边表的交集)
关联查询总结:
关联查询的查询⽅式:等值连接、内连接、外连接;
如果想查询的数据为两张表的交集数据使⽤等值连接和内连接(推荐);
如果查询的数据是⼀张表的全部数据和领⼀张表的交集数据则使⽤外连接;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论