《IT藏经阁》

多表连接

2019-02-14  本文已影响23人  辽A丶孙悟空
一、什么是连接

连接是在多个表之间通过一定的连接条件,使表之间发生关联,进而能从多个表之间获得数据。

语法:

SELECT  table1.column, table2.column 
FROM  table1, table2 
WHERE  table1.column1 = table2.column2;
  • 在WHERE子句中书写连接条件。
  • 如果在多个表中出现相同的列名,则需要使用表名作为来自该表的列名的前缀。
  • N个表相连时,至少需要N-1个连接条件
二、连接的类型

等值连接
非等值连接

外部连接
内部连接

三、多表连接写法

多表连接包含多种写法,在这里主要介绍:

  • Oracle写法:oracle公司提供的写法,绝大多数符合SQL标准,其他关系型数据也适用。
  • ANNSI 99写法:ANSI标准提供的写法,所有关系型数据必须支持。
四、笛卡尔积
  • 笛卡尔积是:
    第一个表中的所有行和第二个表中的所有行都发生连接
  • 笛卡尔积在下列情况卡产生
    1.连接条件被省略
    2.连接条件是无效的
  • 为了避免笛卡尔积的产生,通常需要在WHERE子句中包含一个有效的连接条件。
  • 笛卡尔积结果
    简单描述:
    表1中有14行数据,表2中有4行数据,笛卡尔积结果为56行数据
五、使用AND 运算符增加其他的查询条件
  • 在WHERE子句的连接条件后添加AND条件
六、限制歧义列名
  • 在用到多个表时可以使用表名作为前缀来限定列。
  • 通过使用表前缀可以提高性能。
  • 通过使用列的别名可以区分来自不同表但是名字相同的列。
七、使用表的别名
2019-02-14_163746.png
八、多余两个表的连接
  • 多个表连接和两个表的连接一样,在构造SQL语句时,需要多考虑一个表之间的关联条件。
九、多表连接的写法
  • 分析要查询的列都来自哪个表,构成FROM子句
  • 分析这些表之间的关联关系,如果表之间没有直接的关联关系,而是通过另一个中间表关联,则也要在FROM子句中补充中间关联表。
  • 接下来在WHERE子句中补充表之间的关联关系,通常N个表,至少要有N-1个关联关系。
  • 分析是否还有其他限制条件,补充到WHERE子句的表关联关系之后,作为限定条件。
  • 根据用户想要显示的信息,补充SELECT子句。
  • 分析是否有排序要求,如果排序要求中还涉及到其他表,则也要进行第2步补充排序字段所需要的表,并且添加表之间的关联关系。
十、外部连接

左外连接:

SELECT  table1.column, table2.column 
FROM   table1, table2 
WHERE  table1.column(+) = table2.column;

右外连接:

SELECT  table1.column, table2.column 
FROM   table1, table2 
WHERE  table1.column = table2.column(+);
十一、自身连接
SELECT  worker.ename || ' leader is ' || manager.ename 
FROM   emp  worker,  emp  manager 
WHERE  worker.mgr  =  manager.empno; 
十二、SQL:1999语法的连接
SELECT  table1.column, table2.column 
FROM  table1 
[CROSS JOIN table2] | 
[NATURAL JOIN table2] | 
[JOIN table2 USING (column_name)] | 
[JOIN table2  
ON(table1.column_name = table2.column_name)] | 
[LEFT|RIGHT|FULL OUTER JOIN table2  
ON (table1.column_name = table2.column_name)];
SELECT emp.empno,emp.ename,emp.sal,emp.deptno,dept.loc  
FROM emp  
CROSS JOIN dept;
SELECT  empno,ename,sal,deptno,loc  
FROM    emp  
NATURAL JOIN   dept;
SELECT e.ename,e.ename,e.sal,deptno,d.loc  
FROM emp e JOIN dept d USING (deptno)  
WHERE deptno = 20;

使用USING子句创建连接时,应注意以下几点:

  • 如果有若干个列名称相同但数据类型不同,自然连接子句可以使用USING子句来替换,以指定产生等值连接的列。
  • 如果有多于一个列都匹配的情况,使用USING子句只能指定其中的一列。
  • USING子句中用到的列不能使用表名和别名作为前缀。
  • NATURAL JOIN子句和USING子句是相互排斥的,不能同时使用。
SELECT   e.empno, e.ename, e.deptno, d.deptno, d.loc  
FROM     emp e  
JOIN   dept d  
ON    (e.deptno = d.deptno);

左外连接
左外连接以FROM子句中左边表为基表,该表所有行数据按照连接条件无论是否与右边表能匹配上,都会被显示出来

SELECT e.ename,e.deptno,d.loc  
FROM emp e  
LEFT OUTER JOIN dept d  
ON (e.deptno = d.deptno);

右外连接
右外连接以FROM子句中右边表为基表,该表所有行数据按照连接条件无论是否与左边表能匹配上,都会被显示出来

SELECT e.ename,e.deptno,d.loc  
FROM emp e  
RIGHT OUTER JOIN dept d  
ON (e.deptno = d.deptno);

全外连接
全外连接返回两个表等值连接结果,以及两个表中所有等值连接失败的结果

SELECT   e.ename,e.deptno,d.loc  
FROM     emp e  
FULL    OUTER JOIN dept d  
ON       (e.deptno = d.deptno);
上一篇 下一篇

猜你喜欢

热点阅读