SQL多表查询

来源:互联网 发布:大数据应用启示录 编辑:程序博客网 时间:2024/05/16 13:54

多表查询

2017117

17:49

基本概念

  • SELECT * FROM emp , dept WHERE emp.deptno = dept.deptno;

WHERE消除了显示的笛卡儿积,但笛卡儿积实际是存在的,只是没有显示出来。多表查询的性能是很差的,当数据量大时必须避免使用。

 

表名称:一般建议使用。

  • SELECT * FROM empe , dept d WHERE e.deptno = d.deptno;

 

多表查询操作的使用:

  • 没有关联字段或关联条件的两张数据表是不可能实现多表查询的;
  • 在进行多表查询这样复杂的操作时,分步骤解决问题。

表的链接

主要分为两种形式:

  • 内连接(等值连接):所有满足条件的数据都会被显示出来;
  • 外连接(左外连接、右外连接、全外连接):控制左表与右表的数据是否全部显示。

 

1、等值连接:以上的就是等值连接。

  • SELECT * FROM empe , dept d WHERE e.deptno = d.deptno;
  • 只有当e.deptno = d.deptno满足时的数据才显示。

 

2、外连接

让等值判断左右两边有一边的数据可以全部显示出来,如果要想实现外连接,则需要使用“(+)”的语法。

  • 左外连接:字段 =字段(+
    • SELECT * FROM empe , dept d WHERE e.deptno = d.deptno(+);
  • 右外连接:字段(+ = 字段
    • SELECT * FROM empe , dept d WHERE e.deptno(+) = d.deptno;

没有(+)的表数据全显示

  • 查找每个雇员的领导的姓名

第一步:实现emp表的自身关联查询

SELECTe.ename ,e.job , m.ename

FROM emp e , emp m

WHERE e.mgr = m.empno ;

第二部:控制显示数据

SELECTe.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

再返回查询结果的时候,默认情况下会将关联字段设置在第一列上,重复列内容不再显示。

 

3USING子句:

  • SELECT* FROM emp JOIN deptUSING(deptno)

4ON子句:

  • SELECT * FROMemp e JOIN salgrade s ON(e.sal BETWEEN s.losal AND s.hisal) ;

5、外连接

左外连接:LEFT JOIN左边表数据全显示,右边表可为空

SELECT* FROM empLEFT JOIN deptUSING(deptno)

右外连接:

SELECT* FROM emp RIGHT JOIN deptUSING(deptno)

全外连接:

SELECT* FROM emp FULL JOIN deptUSING(deptno)

数据集合操作(查询的表结构必须相同)

SELECT …(结果1

集合运算                 结果1和结果2的结构必须相同

SELECT …(结果2

1、并集:UNION(不重复显示相同数据)

2、并集:UNIONALL(重复显示相同数据)

3、交集:INTERSECT(返回交集数据)

4、差集:MINUS(返回结果1-结果2的差集)

原创粉丝点击