MySQL复合查询(重点)(多表查询、自连接、子查询 -单行子查询,多行子查询,多列子查询,在from子句中使用子查询,合并查询)- 总结四

七、 复合查询(重点)

7.1 多表查询(案例:公司管理系统,有三张表EMP,DEPT,SALGRADE)

eg1:显示雇员名、雇员工资以及所在部门的名字。(上面的数据来自EMP和DEPT表,因此要联合查询)

select EMP.ename, EMP.sal, DEPT.dname from EMP, DEPT where EMP.deptno = DEPT.deptno;

eg2:显示部门号为10的部门名,员工名和工资。

select ename, sal,dname from EMP, DEPT where EMP.deptno=DEPT.deptno and DEPT.deptno= 10;

eg3:显示各个员工的姓名,工资,及工资级别。

select ename, sal, grade from EMP, SALGRADE where EMP.sal between losal and hisal;

7.2 自连接

自连接是指在同一张表连接查询

eg1:显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号--empno)

使用的子查询:

select empno,ename from emp where emp.empno=(select mgr from emp where ename='FORD');

使用多表查询(自查询):

-- 使用到表的别名
select leader.empno,leader.ename from emp leader, emp worker where leader.empno =worker.mgr and worker.ename='FORD';

7.3 子查询

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

7.3.1 单行子查询(单行子查询是指子查询只返回单列,单行数据)

eg:显示SMITH同一部门的员工

  select * from EMP WHERE deptno = (select deptno from EMP where ename='smith');

7.3.2 多行子查询(多行子查询是指返回单列多行数据)

(1)in关键字;

eg:查询和10号部门的工作相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的

select ename,job,sal,empno from emp where job in (select distinct job from emp where deptno=10) and deptno<>10;

(2)all关键字;

eg:显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号

select ename, sal, deptno from EMP where sal > all(select sal from EMP where deptno=30);

(3)any关键字;

eg:显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号

select ename, sal, deptno from EMP where sal > any(select sal from EMP where deptno=30);

7.3.3 多列子查询(多列子查询则是指查询返回多个列数据的子查询语句)

eg:查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人

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

7.3.4 在from子句中使用子查询(把一个子查询当做一个临时表使用)

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

select ename, deptno, sal, format(asal,2) from EMP, (select avg(sal) asal, deptno dt from EMP group by deptno) tmp  bwhere EMP.sal > tmp.asal and EMP.deptno=tmp.dt;

7.3.5 合并查询

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

eg:将工资大于2500或职位是MANAGER的人找出来

 select ename, sal, job from EMP where sal>2500 union (select ename, sal, job from EMP where job='MANAGER');

(2)union all (该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行)

eg:将工资大于25000或职位是MANAGER的人找出来

 select ename, sal, job from EMP where sal>2500 union all (select ename, sal, job from EMP where job='MANAGER');

猜你喜欢

转载自blog.csdn.net/qq_43109561/article/details/89336600