SQL多表查询详解
多表查询
2017年11月7日
17:49
基本概念
SELECT * FROM emp , dept WHERE emp.deptno = dept.deptno;
WHERE消除了显示的笛卡儿积,但笛卡儿积实际是存在的,只是没有显示出来。多表查询的性能是很差的,当数据量大时必须避免使用。
表名称:一般建议使用。
SELECT * FROM emp e , dept d WHERE e.deptno = d.deptno;
多表查询操作的使用:
没有关联字段或关联条件的两张数据表是不可能实现多表查询的;
在进行多表查询这样复杂的操作时,分步骤解决问题。
表的链接
主要分为两种形式:
内连接(等值连接):所有满足条件的数据都会被显示出来;
外连接(左外连接、右外连接、全外连接):控制左表与右表的数据是否全部显示。
1、等值连接:以上的就是等值连接。
SELECT * FROM emp e , dept d WHERE e.deptno = d.deptno;
只有当e.deptno = d.deptno满足时的数据才显示。
2、外连接
让等值判断左右两边有一边的数据可以全部显示出来,如果要想实现外连接,则需要使用“(+)”的语法。
左外连接:字段 = 字段(+)
SELECT * FROM emp e , dept d WHERE e.deptno = d.deptno(+);
右外连接:字段(+) = 字段
SELECT * FROM emp e , dept d WHERE e.deptno(+) = d.deptno;
没有(+)的表数据全显示
查找每个雇员的领导的姓名
第一步:实现emp表的自身关联查询
SELECT e.ename ,e.job , m.ename
FROM emp e , emp m
WHERE e.mgr = m.empno ;
第二部:控制显示数据
SELECT e.ename ,e.job , m.ename
FROM emp e , emp m
WHERE e.mgr = m.empno(+) ;
注:“(+)”标记只是Oracle才有的。
SQL1999语法;
SELECT [DISTINCT] * | 列 [别名]
FROM 表名称1
[CROSS JOIN 表名称2]
[NATURAL JOIN 表名称2]
[JOIN 表名称 ON(条件) | USING(字段)]
[LEFT | RIGHT | FULLOUTER JOIN 表名称2]
1、交叉连接:CROSS JOIN,主要功能是产生笛卡儿积,简单地实现多表查询
SELECT * FROM emp CROSS JOIN dept ;
2、自然连接:NATURAL JOIN,自动使用关联字段消除笛卡儿积(一般关联字段是外键,但是此处它是以名称相同为主),属于内连接概念。
SELECT * FROM emp NATURAL JOIN dept ;
再返回查询结果的时候,默认情况下会将关联字段设置在第一列上,重复列内容不再显示。
3、USING子句:
SELECT * FROM emp JOIN dept USING(deptno);
4、ON子句:
SELECT * FROM emp e JOIN salgrade s ON(e.sal BETWEEN s.losal AND s.hisal) ;
5、外连接
左外连接:LEFT JOIN左边表数据全显示,右边表可为空
SELECT * FROM empLEFT JOIN dept USING(deptno);
右外连接:
SELECT * FROM emp RIGHT JOIN dept USING(deptno);
全外连接:
SELECT * FROM emp FULL JOIN dept USING(deptno);
数据集合操作(查询的表结构必须相同)
SELECT …(结果1)
集合运算 结果1和结果2的结构必须相同
SELECT …(结果2)
1、并集:UNION(不重复显示相同数据)
2、并集:UNIONALL(重复显示相同数据)
3、交集:INTERSECT(返回交集数据)
4、差集:MINUS(返回结果1-结果2的差集)