【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);
按照部门号升序而雇员的工资降序排序
select * from emp order by deptno asc,sal desc;
使用年薪进行降序排序
我们看到这个表奖金这一列有的是有的,有的是没有的为null,年薪=月薪*12+奖金
,但是null不参与运算,我们前面刚学的ifnull函数这个时候就可以用上了
ifnull(val1,val2),如果val1为null,返回val2,否则返回val1的值
select ename,sal*12+ifnull(comm,0) 年薪 from emp order by 年薪 desc;
显示工资最高的员工的名字和工作岗位
最高工资我们可以使用聚合函数做统计,但是聚合函数只是对一列的相同数据做聚合,今天还要有名字,所以单纯的做聚合是无法满足需求的,它只能最高工资是多少。名字和工作岗位显示不出来。
因此我们先找最高工资是多少。然后拿着这个最高工资去把这个人和工作岗位找到。很显然这是两句select。
但是这样写太挫了。怎么办呢,想办法把两个select查询语句合在一块写。
sql允许在一条sql内部在执行select查询,这称为子查询,先执行内部的sql然后在执行外部的sql
select ename,job,sal from emp where sal=(select max(sal) from emp);
显示工资高于平均工资的员工信息
还是要先使用聚合函数把平均工资找到,然后在找到工资高于平均工资的员工。因此还可以使用子查询。
select * from emp where sal>(select avg(sal) from emp);
显示每个部门的平均工资和最高工资
首先是对部门分组,分组就是分表,表分好之后一个表内部门号是相同的,然后就是在每张表中找每个部门的平均工资和最高工资。其实在子表和在一个整表内找是一样的。在我看来不管是整表还是子表其实都是在表内查询。
select deptno,max(sal) 最高,avg(sal) 平均 from emp group by deptno;
显示平均工资低于2000的部门号和它的平均工资
这里要的是平均工资低于2000的部门号,因此要按照部门号分组,统计出每个部分的平均工资,然后在筛选出低于2000的部门号和平均工资
select deptno,avg(sal) myavg from emp group by deptno having myavg<2000;
显示每种岗位的雇员总数,平均工资
这个不就是对岗位分组,然后在统计每个岗位的人数和平均工资
select job,count(*),avg(sal) from emp group by job;
2.多表查询
以前我们都是从一张表拿数据,但是实际开发中往往数据来自不同的表,所以需要多表查询。
显示雇员名、雇员工资以及所在部门的名字
我们发现上面emp表中是没有部门名称的,换句话说要的数据是从两张表来的。
员工名和员工工资来自于emp表,部门名称来来自于dept表,因此注定了我们要将两个表做整合然后在查询。
select * from emp,dept;
可以看到形成了一张大表,仔细观察一下,将两张表信息做整合的时候,就光SMITH这一条消息就和整个dept表做组合形成了更多的记录,发现下面都是这样的。