--通过连接条件把相关表关联起来
select * from emp;
--n个表相连会有n-1个关联关系,先写关联条件,再写限制条件
笛卡尔积:
--为什么会产生笛卡尔积:--没有连接条件会产生笛卡尔积select emp.ename,emp.empno,dept.deptno,dept.dname
from emp,dept
等值连接:通过=关联两个表中的列
select emp.empno,emp.ename,emp.deptno,dept.deptno,dept.dname
from emp,dept
where emp.deptno=dept.deptno;
限制歧义列名:给表起一个别名
select e.ename,e.deptno
from emp e,dept d
where e.deptno=d.deptno;
非等值连接
select e.ename,e.sal,s.grade
from emp e,salgrade s
where e.sal between s.losal and s.hisal
外部连接(Oracle自带的连接)
--(+):+号的一边产生一个万能行,是由空值组成的--基准表:+的对立面是基准表select e.ename,e.deptno,d.deptno,d.dname
from emp e,dept d
where e.deptno(+)=d.deptno;(dept为基准表)
--基准表中的数据全部显示,另一张表中的数据和基准表中的数据匹配,匹配不上则用空值填充
自身连接(自连接)
--连接条件--员工的经理编号=经理的员工编号select worker.ename,manager.ename
from emp worker,emp manager
where worker.mgr=manager.empno;
SQL99的写法:
select e.empno,e.deptno,d.deptno,d.dname
from emp e
crossjoin dept d;--产生笛卡尔积,不可取
自然连接:
--两个表中要有相同列--列的数据类型保持一致--是等值连接select deptno,e.ename
from emp e
naturaljoin dept d;--注意:共有的列不能用限定词
using连接:
select e.ename,e.sal,d.dname
from emp e join dept d using(deptno)--using指定的列是两个表中具有相同名称和数据类型的列
ON子句:指定连接条件
select e.eanme,e.deptno,d.deptno,d.dname
from emp e
join dept d
on(e.deptno=d.deptno);
左外连接:
--以左表为基准,右表和左表匹配,匹配不上用空值填充select e.empno,e.ename,e.deptno,d.deptno,d.dname
from emp e
leftouterjoin dept d
on(e.deptno=d.deptno);--emp为左表,没有部门的员工显示出来
左连接:
select e.empno,e.ename,e.deptno,d.deptno,d.dname
from emp e
leftjoin dept d
on(e.deptno=d.deptno);--效果无区别,书法上有区别
右外连接:
--以右表为基准,左表和右表匹配,匹配不上用空值填充select e.empno,e.ename,e.deptno,d.deptno,d.dname
from emp e
rightouterjoin dept d
on(e.deptno=d.deptno);--dept为右表,没有员工的部门显示出来
右连接:
select e.empno,e.ename,e.deptno,d.deptno,d.dname
from emp e
rightjoin dept d
on(e.deptno=d.deptno);
全外连接
--在等值连接的基础上,两个表中的数据都显示select e.empno,e.ename,e.deptno,d.deptno,d.dname
from emp e
fullouterjoin dept d
on(e.deptno=d.deptno);