先创两张表做例子,一张部门表,一张员工表
部门表(dept):
员工表(emp):
1.内连接
一般格式:
select[distinct/all]<目标列表达式[别名]清单>
from<关系名1[别名1]>inner join<关系名2[别名2]>
on<连接条件表达式>;
或
select[distinct/all]<目标列表达式[别名]清单>
from<关系名[别名]清单>
where<连接表达式>;
需要连接查询的关系名在from子句中指定,连接类型和连接条件可以在from子句或者where子句中指定。例::
SELECT e.ename,e.job,e.deptno,d.deptno,d.dname
FROM emp e INNER JOIN dept d
ON e.deptno = d.deptno;
或:
SELECT e.ename,e.job,e.deptno,d.deptno,d.dname
FROM emp e,dept d
WHERE e.deptno = d.deptno;
注:上述命令中“e”,“d”分别表示部门表和员工表的别名,此处只是为了简化表名,但是一旦为关系名指定了别名,则在该命令中必须用别名代替该关系名。
输出结果(部分):
内连接是使用最多的一种连接类型。在连接的两表中只有满足连接条件的元组,才作为结果输出。
2.外连接,又分为左外连接(Left Join),右外连接(Right Join),全外连接(Full Join);
- 左外连接:除了返回两表中满足条件的元组以外,还返回左侧表中不匹配元组,右侧表中以空值(NULL)替代:
- 先插入一条新数据:
INSERT INTO dept VALUES(60,’OPERATIONS’,’BOSTON’);
然后执行命令:
SELECT e.ename,e.job,e.deptno,d.deptno,d.dname
FROM dept d LEFT JOIN emp e
ON e.deptno = d.deptno;
此时由于我们刚加入的部门编号为60但是员工表中没有对应部门编号为60的员工,所以以NUll补全。
结果: - 右外连接:除了返回两表中满足条件的元组以外,还返回右侧表中不匹配元组,左侧表中以空值(NULL)替代:同理,插入一条部门编号为70的数据:
INSERT INTO emp VALUES(7788,’LUCE’,’ANALYST’,’1983-4-19’,2700.00,70);
然后执行:
SELECT e.ename,e.job,e.deptno,d.deptno,d.dname
FROM dept d RIGHT JOIN emp e
ON e.deptno = d.deptno;
结果: - 全外连接:除了返回两表中满足条件的元组以外,还返回左侧表中不匹配元组,右侧表中以空值(NULL)替代,以及右侧表中不匹配元组,左侧表中以空值(NULL)替代
重点区别:等值连接是只把满足条件的两个表的行相连,然后显示出来。完全外连接是把匹配查询条件的行、左表没有匹配到的、右表没有匹配到的都显示出来
3.自身连接
有时,一些特殊的查询需要对同一个关系进行连接查询,成为表的自身连接:
例:要找到某人的间接负责人,则要先找到他的直接负责人,然后通过找他直接负责人的负责人找到某人的间接负责人。
—-先创建两张相同的表:
emp01:
emp02:
执行命令:
SELECT e1.Eno,e2.Emgr
FROM emp01 e1,emp02 e2
WHERE e1.Emgr
=e2.Eno
结果:
这就找到了间接负责人。