1.子查询
1. 将查询的结果集当做一张表再次进行查询[自连接查询]
查询每个员工的编号,姓名和其上司的编号姓名
select empno,ename,mgr from emp;
select empno,ename from emp;
select * from (select empno,ename,mgr from emp) a,(select empno,ename from emp) b;
如果从两张表或者两个结果集中取数据,一定需要等值条件,否则就会出现笛卡尔积
select * from a,b;
加上等值条件
select * from (select empno,ename,mgr from emp) a,(select empno,ename from emp) b where a.mgr=b.empno;
select a.*,b.ename from (select empno,ename,mgr from emp) a,(select empno,ename from emp) b where a.mgr=b.empno;
select empno,ename,mgr m ,(select ename from emp where empno=m) man from emp;
2..将查询的结果作为一个字段[只能返回一行数据]
select empno,ename,mgr m ,(select ename,sal from emp where empno=m) man from emp;
3.将查询的结果作为条件
查询工资最高的人的信息【查询结果只有一个值的情况】
select max(sal) from emp;
select * from emp where sal=(select max(sal) from emp);
查询部门人数不为0的所有部门
select deptno from emp group by deptno having count(empno)>0;
将查询的结果作为条件【查询结果有多个值的情况】
select * from dept where deptno in(select deptno from emp group by deptno having count(empno)>0);
2.连接查询
1.自然连接
查询员工的编号,姓名,岗位,工资和部门名称,办公地点
select empno,ename,job,sal,dname,loc from emp,dept where emp.deptno=dept.deptno;
2.内连接 inner join 内连接是取两个表的交集
查询员工的编号,姓名,岗位,工资和部门名称,办公地点
select empno,ename,job,dname,loc from emp inner join dept on emp.deptno=dept.deptno;
如果没有写inner,默认就是内连接
select empno,ename,job,dname,loc from emp2 join dept on emp2.deptno=dept.deptno;
3.外链接 out join
外链接分为左外连接left out join 右外连接 right out join 全外连接 full out join
左外连接:以左表的数据为基准【会查询左表的所有数据】
//查询所有员工的所属部门
select empno,ename,job,dname,loc from emp2 left join dept on emp2.deptno=dept.deptno;
右外连接:以右表的数据为基准[会查询右表的所有数据]
//查询所有部门的员工情况
select empno,ename,job,dname,loc from emp2 right join dept on emp2.deptno=dept.deptno;
克隆一张表,带数据
create table emp2 as select * from emp;
克隆一张空表,不带数据
create table emp3 as select * from emp where 1=2;
3.交集 并集 与差集
jion union union all MINUS
交集:使用内连接查询
并集:
union和union all
select * from emp where deptno>10;
select * from emp where deptno<30;
合并结果集并去掉重复数据
select * from emp where deptno>10
union
select * from emp where deptno<30;
合并结果集 保留重复数据
select * from emp where deptno>10
union all
select * from emp where deptno<30;
差集 minus ( MySQL不支持)
select * from emp where deptno>10
minus
select * from emp where deptno<30;
MYSQL中可以用not in取差集
查询emp2 不包含在部门中的员工
select * from emp2 where deptno not in(select deptno from dept);
查询没有员工的部门
select * from dept where deptno not in(select distinct deptno from emp);
来源:CSDN
作者:正在路上的小白
链接:https://blog.csdn.net/weixin_44364444/article/details/104031022