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的差集)

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐