多表连接查询
当需要获取的数据分布在多张表中,考虑使用联合查询
一、SQL99的多表连接查询
注意:
- 仍然可以给表添加别名
- 如果使用on或者using关键字的对结果进行筛选,必须使用inner join作用表与表的连接,其中inner可以省略。
- 外连接的outer关键字可以省略不写
- 依然可以继续使用分组,having,排序等
交叉连接
笛卡尔积:使用cross join 关键字,其效果等同于在两个表进行连接时未使用where子句限定连接条件
可以使用where条件从笛卡尔积中选出满足条件的记录
语句:select 内容 from 表名 cross join
例
- select dept.deptno,dname,ename,job from dept cross join emp;
自然连接
问题提出:只想按照部分字段结果筛选
解决方案:使用using关键字
使用关键字 natural join
语法:select 内容 from 表名 natural join 表名
natural join基于两个表中的全部同名列建立连接
- 从两个表中选出同名列的值均对应相应的列
- 如果两个表中同名列的数据类型不同,则出错
- 不允许在参照列上使用表名或者别名作为前缀
- 自然连接的结果不保留重复的属性
自然连接会自动使用多表中所有相同字段(不仅值相同,名字也要相同)进行筛选
select empno,ename,sal,deptno,dname
from emp natural join dept
where deptno=10;
using连接
如果不希望参照被连接表的所有同名列进行等值连接,自然连接将无法满足要求,可以在连接时使用using子句来设置用于等值连接的列(参照劣)名。
using子句引用的列在SQL任何地方不能使用表名或者别名做前缀。
使用using关键字可以指定字段进行连接查询,但是必须是同名字段
使用:select 内容 from 表名 inner join 表名 using(字段名,字段名,......);
查询员工及员工所在部门信息
- select * from deptno inner join emp using(deptno);
on连接
问题提出:如果想按照字段名不同,但是值相同进行等值筛查怎么办?
解决:使用on关键字进行自定义连接条件筛选(等值筛选,不等值筛选)
<