select e.empno, e.ename, d.deptno, d.dname
from emp e, dept d
where e.deptno = d.deptno;
在上述sql语句中先执行 from 后执行select和where 如果使用了别名的话以后引用表都要使用别名不然会报错 别名最长为30个字符
内连接
select e.empno, e.ename, d.deptno, d.dname
from emp e
join dept d
on e.deptno = d.deptno
from 后直接接两张表名 系统会将两张表做笛卡尔乘积操作 会生成一张笛卡尔积中间表 (这张表相当于两个集合做乘操作 参考两个集合相乘) 如果两张表都很大的话中间表就会很大 会占用很大的内存空间
如果使用join操作 会优先判断 是否符合 join 后所接on的条件 使生成结果不会太大
外连接 分为left outer join right outer join full outer join
内链接只能查询到符合条件的结果 左外连接可以使某一张表或两张表的数据完全显示出来
left join 和right join还可以用(+)来代替
(+)应放在缺少相应信息的一边
左连接的主表是join左边的表 为主表 内容会全部显示
select e.empno, e.ename, d.deptno, d.dname from emp e left join dept d on e.deptno = d.deptno ;
左外链接的加号写法
select e.empno, e.ename, d.deptno, d.dname from emp e, dept d where e.deptno = d.deptno(+);
上图为执行之后的结果 由表格可知 第十五条数据 的e.deptno 为空不符合 连接条件 但还是显示出来了
右连接
右连接的主表是join右边的表 为主表 内容会全部显示
select e.empno, e.ename, d.deptno, d.dname from emp e right join dept d on e.deptno = d.deptno ;
右外链接的加号写法
select e.empno, e.ename, d.deptno, d.dname from emp e, dept d where e.deptno(+) = d.deptno
dept表中deptno = 40 的 在emp表中没有与之对应的数据 但在右连接中可以完全显示dept表中的数据
完全外连接
相当于做左连和右连后去重值
select e.empno, e.ename, d.deptno, d.dname from emp e full join dept d on e.deptno = d.deptno ;
自然连接
会对表总具有相同列明的做自动连接
select * from emp e natural join dept ;
限定多 不实用 仅做了解
自连接
自己和自己做连接 以scott 的emp表为例 mgr字段为该员工的 领导编号 该表中存在主从关系
又因要查询所有员工的领导及其编号所以在下面用左连接
select em2.empno 领导的员工编号,
em2.ename 领导姓名,
em1.empno 员工导编号,
em1.ename 员工姓名,
em1.mgr 对应领导的员工编号
from emp em1
left join emp em2
on em1.mgr = em2.empno
order by em2.empno ;
交叉连接
做两张表的笛卡尔积
select * from emp cross join dept
基本用不到 作为了解
总结一下
内连接
只筛选符合条件的
外链接
分为左外右外和完全外链接
左外显示符合条件的 以及左表不符合条件的 右表只有符合条件的
剩下两种略
自连接
自己和自己做连接 因为用的都是一张表(本身)所以一定要用别名