【东软实训】SQL多表连接

若是一个查询同时涉及两个以上的表,则称之为连接查询,连接查询是关系数据库中最主要的查询,主要包括等值连接查询、非等值连接查询、自身连接查询、外连接查询和复合条件连接查询。 
这篇博文咱们来对多表连接进行学习。数据库

Outline

Notes

## 连接的基本概念

  • 连接是在多个表之间经过必定的连接条件,使表之间发生关联,进而能从多个表之间获取数据。
  • 语法为
    SELECT    table1.column, table2.column
    FROM    table1, table2
    WHERE    table1.column1 = table2.column2;
  • 在 WHERE子句中书写连接条件。N个表相连时,至少须要N-1个连接条件。
  • 若是在多个表中出现相同的列名,则须要使用表名做为来自该表的列名的前缀。

【连接的分类】性能

  一个用户查询请求涉及到多个表的时候,连接两个表的条件为=时,就是等值连接查询;其余的运算符连接的就是非等值查询。 注意:连接条件中的各连接字段类型必须是可比的,但没必要是相同的,整型和实型是可比的,可是字符型和整型就不可比。学习

  内链接,也被称为天然链接,只有两个表相匹配的行才能在结果集中出现。返回的结果集选取了两个表中全部相匹配的数据,舍弃了不匹配的数据。spa

  外链接不只包含符合链接条件的行,还包含左表(左链接时)、右表(右链接时)或两个边接表(全外链接)中的全部数据行。设计

 

## Oracle自有的链接方法(select from语句)

【等值链接】code

 连接两个表的条件为=时,就是等值连接查询blog

SQL> SELECT     emp.empno,   emp.ename, emp.deptno, dept.deptno, dept.loc
  2  FROM       emp, dep
3 WHERE emp.deptno=dept.deptno;

 

注意:咱们还可使用And运算符添加其余查询条件,如:数学

注意:咱们还能够用列别名提升性能和限制歧义列名table

  • 在用到多个表时可使用表名做前缀来限定列;
  • 经过使用表前缀能够提升性能;
  • 经过使用列的别名能够区分来自不一样表可是名字相同的列;

如:class

 

【非等值链接】

 

SQL>    SELECT  e.ename, e.sal, s.grade
   2    FROM    emp e,   salgrade s
   3    WHERE   e.sal
   4    BETWEEN     s.losal AND s.hisal;

 

 

【自身链接】

   一个表与本身进行链接,这种链接称为表的自身链接查询。 
  具体实现的时候,咱们能够把本身的表起两个别名,一个是first, 一个是second.在设计的时候能够把这两个表想成是彻底两个同样的表,可是各自的字段咱们均可以只有调用访问。 

SQL> SELECT worker.ename||' leader is '||manager.ename
  2  FROM    emp worker, emp manager
  3  WHERE   worker.mgr = manager.empno;

 

 ## SQL标准语法链接方法

 【交叉链接】

  • 交叉链接会产生连个表的交叉乘积,和两个表之间的笛卡尔积是同样的;
  • 交叉链接使用 CROSS JOIN 子句完成。
  • 笛卡尔积: 第一个表中的全部行和第二个表中的全部行都发生链接。
  • 笛卡尔积在下列状况产生:
    • 链接条件被省略
    • 链接条件是无效的
  • 为了不笛卡尔积的产生,一般须要在WHERE子句中包含一个有效的链接条件。
<--笛卡尔积写法-->
SQL> SELECT     emp.empno,   emp.ename, emp.deptno,dept.deptno, dept.loc
         FROM       emp, dept;


<--交叉链接写法--> SELECT emp.empno,emp.ename,emp.sal,emp.deptno,dept.loc FROM emp CROSS JOIN dept;

 

【天然链接】

  • 天然链接是对两个表之间相同名字和数据类型的列进行的等值链接;
  • 若是两个表之间相同名称的列的数据类型不一样,则会产生错误;
  • 使用NATURAL JOIN子句来完成。如:
    SELECT  empno,ename,sal,deptno,loc 
    FROM    emp 
    NATURAL JOIN     dept; 

【Using和On语句】

天然链接是使用全部名称和数据类型相匹配的列做为链接条件,而USING子句能够指定用某个或某几个相同名字和数据类型的列做为链接条件,如:

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子句是相互排斥的,不能同时使用
  • On语句:
    • 天然链接条件基本上是具备相同列名的表之间的等值链接;
    • 若是要指定任意链接条件,或指定要链接的列,则可使用ON子句;
    • 用ON将链接条件和其它检索条件分隔开,其它检索条件写在WHERE子句
    • ON子句能够提升代码的可读性
SELECT     e.empno, e.ename, d.loc,m.ename 
FROM           emp e 
JOIN           dept d 
ON             e.deptno = d.deptno 
JOIN           emp m 
ON             e.mgr = m.empno; 

 

【左外链接、右外链接、全链接】

  • 外连不但返回符合链接和查询条件的数据行,还返回不符合条件的一些行。外链接分三类:左外链接(LEFT OUTER JOIN)、右外链接(RIGHT OUTER JOIN)和全外链接(FULL OUTER JOIN)。
  • 三者的共同点是都返回符合链接条件和查询条件(即:内链接)的数据行。不一样点以下:
    • 左外链接(⟕)还返回左表中不符合链接条件单符合查询条件的数据行。
    • 右外链接(⋉)还返回右表中不符合链接条件单符合查询条件的数据行。
    • 全外链接()还返回左表中不符合链接条件单符合查询条件的数据行,而且还返回右表中不符合链接条件单符合查询条件的数据行。全外链接实际是上左外链接和右外链接的数学合集(去掉重复),即“全外=左外 UNION 右外”。
  • 说明:左表就是在“(LEFT OUTER JOIN)”关键字左边的表。在三种类型的外链接中,OUTER 关键字是可省略的。
<--左外链接-->
SELECT     e.ename,e.deptno,d.loc 
FROM       emp e 
LEFT OUTER JOIN dept d 
ON         (e.deptno = d.deptno); 

<--右外链接--> 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);
相关文章
相关标签/搜索