多表查询
这里的多表是指的是两张表,两张表的连接方式,可以分成内连接和外连接
1) 内连接 关键字 inner join on
不加关键字 语法
SELECT * FROM EMP,DEPT WHERE dept.deptno=emp.deptno;
加上关键字 语法
select * from emp inner join dept on dept.deptno=emp.deptno;
查询结果一样
2)外连接
外连接分成左右连接两种,关键字为 left/right join on
例子:select * from emp left join dept on dept.deptno=emp.deptno;
代表的是将两个表连接起来 除了显示等值关系的部分记录 也要把某一张表中不满足
连接条件的部分显示出来,从而形成外连接
左右连接本质上没有区别
左连接 select * from emp left join dept on dept.deptno=emp.deptno;
会把emp表中不满足连接条件的显示出来
右连接 select * from emp rigth join dept on dept.deptno=emp.deptno;
会把dept表中不满足连接条件的显示出来
其实此时 下面两个查询语句的作用完全一样
select * from emp left join dept on dept.deptno=emp.deptno;
select * from dept rigth join emp on dept.deptno=emp.deptno;
左右的关系 也就是看看两个表名在语句中出现的先后顺序
此外,全外连接 是将两个表中不满足条件的记录全部显示出来 但是mysql不支持这个语法
3)不等值连接
就是两表中数据不满足相等关系 但是满足其他不等关系(可以用 in,between...and 子句的)
例如:
select e.* .s.* from emp e ,salgrade s where e.sal between s.losal and s.hisal;
复合查询之子查询
把一个查询结果作为一张表进行新的查询 也叫查询的嵌套
例如,在员工表和部门表中 要找出那个部门没有员工 使用子查询
select dept.deptno
from dept where dept.deptno not in
(select distinct (deptno) from emp);
一个表的查询结果可以直接作为内容创建新的表 从而实现了表的复制
create table new_table (select * from emp);
实现把emp表复制到新表new_table中 表格创建方式一样
子查询在对第一张表查询的结果 作为新表进行再次查询时 作为查询条件
分成三类
1.in 语句查询
举例:select dept.deptno
from dept where dept.deptno not in
(select distinct (deptno) from emp);
这里要求部门表中员工号不在员工表员工号查询结果中 (not 不影响语法)
2. < <= > >= = <> != 语句查询
举例:select dept.deptno,dept.dname
from dept where dept.deptno >=
(select distinct (deptno) from emp where sal>=5000);
这里要求部门表中员工号要大于等于工资表中薪水大于等于5000的员工员工号,然后返回这些员工的部门名称
但是这里员工表中查到的结果必须小于等于1个而且类型要匹配的上
3.exists
举例:select dept.deptno,dept.dname
from dept where exists
(select distinct (deptno) from emp where sal>=4000);
这里内层语句 员工表查询结果不为空(返回结果为True)时,此时外层查询,
即部门表的查询才进行,否则不进行查询,返回结果为空 当然 exists前可以加 not 作用和 not in 类似