select ename, job, sal, deptno from emp where job in (select distinct job from emp where deptno=10) and deptno<>10;
显示工资比30号部门所有员工的工资高的员工的姓名、工资和部门号。
select ename, sal, deptno from emp where sal>all(select sal from emp where deptno=30);
显示工资比30号部门的任意员工的工资高的员工的姓名、工资和部门号(包含30号部门的员工)。
select ename, sal, deptno from emp where sal>any(select sal from emp where deptno=30);
表子查询:查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人。
select deptno, job, ename from emp where (deptno, job) = (select deptno, job from emp where ename='smith') and ename <> 'smith';
显示每个高于自己部门平均工资的员工的姓名、部门号、部门名、工资和平均工资。
select ename, dept.deptno, dname, sal, avg_sal from emp, (select deptno, avg(sal) avg_sal from emp group by deptno) tmp, dept where emp.deptno=tmp.deptno and emp.deptno=dept.deptno and emp.sal>avg_sal;
显示每个部门的信息(部门编号,部门名,地址)和人员数量,下方分别为多表和子查询方法。
select dept.deptno, dname, loc, count(*) from emp, dept where emp.deptno=dept.deptno group by deptno, dname, loc;
select dept.deptno, dname, loc, count_sum from dept, (select deptno, count(*) count_sum from emp group by deptno) tmp where dept.deptno=tmp.deptno;
四、UNION和UNION ALL
1、介绍
操作符
作用
UNION
合并两个或多个 SELECT 语句的结果集,并自动去除重复的记录
UNION ALL
合并两个或多个 SELECT 语句的结果集,但不会去除重复的记录
2、注意
列数和数据类型:使用 UNION 或 UNION ALL 合并的 SELECT 语句必须具有相同数量的列,并且对应列的数据类型必须兼容。
select ename, dname from emp, dept where emp.deptno=dept.deptno and ename='smith';
select ename, dname from emp inner join dept on emp.deptno=dept.deptno and ename='smith';
左外连接。
create table stu (id int, name varchar(30));
insert into stu values(1,'jack'),(2,'mike'),(3,'kity'),(4,'alice');
create table exam (id int, grade int);
insert into exam values(1, 56),(2,66),(11, 18);
select * from stu left join exam on stu.id=exam.id;
右外连接。
select * from stu right join exam on stu.id=exam.id;