> 技术文档 > 【MySQL】复合查询+表的内外连接_mysql 外表连接内表查询

【MySQL】复合查询+表的内外连接_mysql 外表连接内表查询


复合查询+表的内外连接

  • 1.基本查询回顾
  • 2.多表查询
  • 3.自连接
  • 4.子查询
    • 4.1单列子查询
    • 4.2多列子查询
  • 5.在from子句中使用子查询
  • 6.合并查询
  • 7.表的内连和外连
    • 7.1内连接
    • 7.2外连接
      • 7.2.1左外连接
      • 7.2.2右外连接

在这里插入图片描述

点赞👍👍收藏🌟🌟关注💖💖
你的支持是对我最大的鼓励,我们一起努力吧!😃😃

前面我们讲解的mysql表的查询都是对一张表进行查询,在实际开发中这远远不够,未来可能还有多表查询,子查询。

1.基本查询回顾

查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J

下面有两种写法,都没问题

select * from emp where (sal>500 or job=\'MANAGER\') and ename like \'J%\';select * from emp where (sal>500 or job=\'MANAGER\') and \'J\'=substring(ename,1,1);

【MySQL】复合查询+表的内外连接_mysql 外表连接内表查询

按照部门号升序而雇员的工资降序排序

select * from emp order by deptno asc,sal desc;

【MySQL】复合查询+表的内外连接_mysql 外表连接内表查询

使用年薪进行降序排序

我们看到这个表奖金这一列有的是有的,有的是没有的为null,年薪=月薪*12+奖金
,但是null不参与运算,我们前面刚学的ifnull函数这个时候就可以用上了

【MySQL】复合查询+表的内外连接_mysql 外表连接内表查询

ifnull(val1,val2),如果val1为null,返回val2,否则返回val1的值

select ename,sal*12+ifnull(comm,0) 年薪 from emp order by 年薪 desc;

【MySQL】复合查询+表的内外连接_mysql 外表连接内表查询

显示工资最高的员工的名字和工作岗位
最高工资我们可以使用聚合函数做统计,但是聚合函数只是对一列的相同数据做聚合,今天还要有名字,所以单纯的做聚合是无法满足需求的,它只能最高工资是多少。名字和工作岗位显示不出来。

因此我们先找最高工资是多少。然后拿着这个最高工资去把这个人和工作岗位找到。很显然这是两句select。

【MySQL】复合查询+表的内外连接_mysql 外表连接内表查询

但是这样写太挫了。怎么办呢,想办法把两个select查询语句合在一块写。
sql允许在一条sql内部在执行select查询,这称为子查询先执行内部的sql然后在执行外部的sql

select ename,job,sal from emp where sal=(select max(sal) from emp);

【MySQL】复合查询+表的内外连接_mysql 外表连接内表查询

显示工资高于平均工资的员工信息

还是要先使用聚合函数把平均工资找到,然后在找到工资高于平均工资的员工。因此还可以使用子查询。

select * from emp where sal>(select avg(sal) from emp);

【MySQL】复合查询+表的内外连接_mysql 外表连接内表查询

显示每个部门的平均工资和最高工资

首先是对部门分组,分组就是分表,表分好之后一个表内部门号是相同的,然后就是在每张表中找每个部门的平均工资和最高工资。其实在子表和在一个整表内找是一样的。在我看来不管是整表还是子表其实都是在表内查询。

select deptno,max(sal) 最高,avg(sal) 平均 from emp group by deptno;

【MySQL】复合查询+表的内外连接_mysql 外表连接内表查询

显示平均工资低于2000的部门号和它的平均工资

这里要的是平均工资低于2000的部门号,因此要按照部门号分组,统计出每个部分的平均工资,然后在筛选出低于2000的部门号和平均工资

select deptno,avg(sal) myavg from emp group by deptno having myavg<2000;

【MySQL】复合查询+表的内外连接_mysql 外表连接内表查询

显示每种岗位的雇员总数,平均工资

这个不就是对岗位分组,然后在统计每个岗位的人数和平均工资

select job,count(*),avg(sal) from emp group by job;

【MySQL】复合查询+表的内外连接_mysql 外表连接内表查询

2.多表查询

以前我们都是从一张表拿数据,但是实际开发中往往数据来自不同的表,所以需要多表查询。

显示雇员名、雇员工资以及所在部门的名字

【MySQL】复合查询+表的内外连接_mysql 外表连接内表查询
我们发现上面emp表中是没有部门名称的,换句话说要的数据是从两张表来的。
员工名和员工工资来自于emp表,部门名称来来自于dept表,因此注定了我们要将两个表做整合然后在查询。

select * from emp,dept;

可以看到形成了一张大表,仔细观察一下,将两张表信息做整合的时候,就光SMITH这一条消息就和整个dept表做组合形成了更多的记录,发现下面都是这样的。