欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SQL多表查询详解

程序员文章站 2022-05-24 20:15:46
多表查询 2017年11月7日 17:49 基本概念 SELECT * FROM emp , dept WHERE emp.deptno = dept.deptno; W...

多表查询

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