【MySQL】子查询、合并查询、表的连接

时间:2024-10-03 15:23:52

目录

一、子查询

1、单行子查询

显示SMITH同一部门的员工信息

2、多行子查询

in关键字

查询和10号部门的工作岗位相同的雇员的名字、岗位、工资、部门号,但是筛选出的雇员的部门不能有10号部门

all关键字 

查询工资比30号部门中所有雇员工资高的雇员的姓名、工资、部门号

any关键字

显示工资比30部门中任意雇员工资高的雇员的姓名、工资、部门号,可以包含部门号是30的雇员

3、多列子查询

查询和SMITH的部门和岗位完全相同的雇员的信息,不含SMITH本人

4、在from子句中使用子查询

显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资

查找每个部门工资最高的雇员的姓名、工资、部门、最高工资

二、合并查询

union

将工资大于2500或职位是MANAGER的雇员找出来

union all

三、表的连接

内连接

显示SMIATH的名字和部门名称

外连接

左外连接

查询所有学生的成绩,如果这个学生没有成绩,也要将这个学生的个人信息显示出来

 右外连接

对stu表和exam表联合查询,把所有成绩都显示出来,即使这个成绩没有匹配的学生也要显示出来

显示部门名称和这些部门的雇员信息,同时列出没有雇员的部门

一、子查询

子查询是指嵌套在其他sql语句中的select语句,也叫嵌套查询。

1、单行子查询

返回一行记录的子查询

显示SMITH同一部门的员工信息

select * from emp where (select deptno from emp where ename<=>'SMITH');

2、多行子查询

返回多行记录的子查询

in关键字

查询和10号部门的工作岗位相同的雇员的名字、岗位、工资、部门号,但是筛选出的雇员的部门不能有10号部门
select ename,job,sal,deptno from emp where job in(select distinct job from emp where deptno=10) and deptno<>10;

all关键字 

查询工资比30号部门中所有雇员工资高的雇员的姓名、工资、部门号
select ename,sal,deptno from emp where sal > all(select sal from emp where deptno=30);

//或者是使用聚合函数
select ename,sal,deptno from emp where sal > (select max(sal) from emp);

any关键字

显示工资比30部门中任意雇员工资高的雇员的姓名、工资、部门号,可以包含部门号是30的雇员
select ename,sal,deptno from emp where sal > any(select sal from emp where deptno<=> 30);

3、多列子查询

查询和SMITH的部门和岗位完全相同的雇员的信息,不含SMITH本人

select * from emp where (deptno,job) = (select deptno,job where ename='SMITH') and ename<>'SMITH';

4、在from子句中使用子查询

子查询出现的两种场景:1.在where后出现充当筛选筛选条件。2.在from后出现充当临时表(一般是笛卡尔积)。

显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资

select ename,detpno,sal,a_s from emp,(select avg(sal) a_s,deptno dt from emp group by deptno) tmp where emp.sal>tmp.a_s and emp.deptno=tmp.dt;

查找每个部门工资最高的雇员的姓名、工资、部门、最高工资

select ename,sal,emp.deptno,m_s form emp,(select deptno,max(sal) m_s from emp group by deptno) tmp where emp.deptno=tmp.deptno AND sal = m_s;

二、合并查询

在实际应用中为了合并多个select的结果,可以使用集合操作符union、union all

union

该操作符用于取得两个select结果的并集。当使用该操作符时,自动去掉结果集中的重复行。

将工资大于2500或职位是MANAGER的雇员找出来
select ename,sal,job from emp where sal>2500 union select ename,sal,job from emp where job='MANAGER';

union all

该操作符用于取得两个select结果的并集。当使用该操作符时,不会自动去掉结果集中的重复行。

三、表的连接

表的连接分为内连接和外连接

内连接

内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询

//基本格式:
select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件;
显示SMIATH的名字和部门名称
//之前的写法:
select ename,dname from emp,dept where emp.deptno=dept.deptno and ename='SMITH';

//使用标准的内连接写法:
select ename,dname form emp inner join dept on emp.deptno=dept.deptno and ename='SMITH';

外连接

左外连接

如果联合查询,左侧的表完全显示我们就说是左外连接

//语法:
select 字段名 form 表1 left join 表2 on 连接条件

 建两张表:

查询所有学生的成绩,如果这个学生没有成绩,也要将这个学生的个人信息显示出来

 右外连接

如果联合查询,右侧的表完全显示我们就说是右外连接

对stu表和exam表联合查询,把所有成绩都显示出来,即使这个成绩没有匹配的学生也要显示出来

显示部门名称和这些部门的雇员信息,同时列出没有雇员的部门
//使用左外连接:
select d.dname,e.* from  dept d left join emp e on d.deptno=e.deptno;