数据库Oracle多表链接

多表查询:

当查询的数据并不是来源一个表时,需要使用多表链接操作完成查询。根据不同表中的数据之间的关系查询相关联的数据。

多表链接方式:

内连接:(等值连接,非等值连接,自连接,SQL99有交叉连接(cross join),内连接(inner join),自然连接(natural join)

            连接两个表,通过相等或不等判断链接列,称为内连接。在内连接中典型的联接运算有 = 或 <> 之类的比较运算符。包括               等值联接和自然联接。

外连接:(左外链接,右外连接,全外链接

            在两个表之间的连接,返回内连接的结果,同时还返回不匹配行的左(或右)表的连接,称为左(或右)连接。返回内连            接的结果, 同时还返回左和右连接,称为全连接。

子查询:当一个查询是另一个查询的条件时,称之为子查询。

 

笛卡尔积:

           笛卡尔乘积是指在数学中,两个集合 X 和 Y 的笛卡尓积(Cartesian product),又称直积,表示为 X * Y,第一个对象是            X 的成员而第二个对象是 Y 的所有可能有序对的其中一个成员。

注意:由于笛卡尔积在数据库较大的情况下,很容易使数据库崩溃,所以为了防止笛卡尔积的产生,应该在 WHERE 子句中始终包含一个有效的连接条件。

例:链接俩张表:

SQL> select e.last_name,d.department_name from employees e,departments d where e.department_id=d.department_id;
LAST_NAME                 DEPARTMENT_NAME
------------------------- ------------------------------
Whalen                    Administration
Fay                       Marketing
Hartstein                 Marketing
Tobias                    Purchasing
Colmenares                Purchasing
Baida                     Purchasing
Raphaely                  Purchasing
Khoo                      Purchasing
Himuro                    Purchasing
Mavris                    Human Resources
Feeney                    Shipping
Fleaur                    Shipping
Fripp                     Shipping
Gates                     Shipping
Gee                       Shipping
Geoni                     Shipping
Grant                     Shipping
Jones                     Shipping
Kaufling                  Shipping
Ladwig                    Shipping

 

多表链接的语法:

• 在 WHERE 子句中写连接条件。
• 当多个表中有相同的列名时,将表名或者表的别名作为列名的前缀。

原则:

• 在写一个连接表的 SELECT 语句时,在列名前面用表名或者表别名可以使语义清楚,并且加快数据库访问。
• 为了连接 n 个表在一起,你最少需要 n-1 个连接条件。例如,为了连接 4 个表,最少需要 3 个连接条件。

 

等值链接:

等值连接也被称为简单连接 (simple joins) 或内连接 (inner joins)。是通过等号来判断连接条件中的数据值是否相匹配。

 

抉择矩阵思想:

为什么能思路清晰去关联多张表。我们提出抉择矩阵的思想:

 

实例:查询所有雇员名字以及他们所在的部门名称。

SQL> select e.last_name,d.department_name from employees e,departments d where e.department_id=d.department_id;
LAST_NAME                 DEPARTMENT_NAME
------------------------- ------------------------------
Whalen                    Administration
Fay                       Marketing
Hartstein                 Marketing
Tobias                    Purchasing
Colmenares                Purchasing
Baida                     Purchasing
Raphaely                  Purchasing
Khoo                      Purchasing
Himuro                    Purchasing
Mavris                    Human Resources
Feeney                    Shipping
Fleaur                    Shipping
Fripp                     Shipping
Gates                     Shipping
Gee                       Shipping
Geoni                     Shipping
Grant                     Shipping
Jones                     Shipping
Kaufling                  Shipping
Ladwig                    Shipping

 

用 使用 AND  操作符附加搜索条件

当我们需要在查询来张表做关联的时候提出要求,我们就需要用我和where子句,条件多了,就需要用and连接。

示例二:显示同一个部门中所有名字为 Taylor 的雇员的名字和部门号。

SQL> select e.last_name,d.department_name from employees e,departments d where e.department_id=d.department_id and e.last_name='Taylor';
LAST_NAME                 DEPARTMENT_NAME
------------------------- ------------------------------
Taylor                    Sales
Taylor                    Shipping

 

使用表别名原则:

• 表别名最多可以有 30 个字符,但短一些更好。
• 如果在 FROM 子句中表别名被用于指定的表,那么在整个 SELECT 语句中都可以使用表别名。
• 表别名应该是有意义的。
• 表别名只对当前的 SELECT 语句有效

 

多于两个表的连接:

实例:查询每个雇员的 last name、departmentname 和 city(city 来源于 locations 表)。

SQL> select e.last_name,d.department_name,l.city from employees e,departments d,locations l where e.department_id=d.department_id and d.location_id=l.location_id;
LAST_NAME                 DEPARTMENT_NAME                CITY
------------------------- ------------------------------ ------------------------------
Abel                      Sales                          Oxford
Ande                      Sales                          Oxford
Atkinson                  Shipping                       South San Francisco
Austin                    IT                             Southlake
Baer                      Public Relations               Munich
Baida                     Purchasing                     Seattle
Banda                     Sales                          Oxford
Bates                     Sales                          Oxford
Bell                      Shipping                       South San Francisco
Bernstein                 Sales                          Oxford
Bissot                    Shipping                       South San Francisco
Bloom                     Sales                          Oxford
Bull                      Shipping                       South San Francisco
Cabrio                    Shipping                       South San Francisco
Cambrault                 Sales                          Oxford
Cambrault                 Sales                          Oxford
Chen                      Finance                        Seattle
Chung                     Shipping                       South San Francisco
Colmenares                Purchasing                     Seattle
Davies                    Shipping                       South San Francisco

 

实例二:查询 Taylor 的雇员 ID、部门名称、和工作的城市

SQL> select e.employee_id,d.department_name,l.city    
  2  from employees e,departments d,locations l
  3  where e.department_id=d.department_id
  4  and d.location_id=l.location_id
  5  and e.last_name='Taylor';
EMPLOYEE_ID DEPARTMENT_NAME                CITY
----------- ------------------------------ ------------------------------
        176 Sales                          Oxford
        180 Shipping                       South San Francisco

 

非等值链接:

一个非等值连接是一种不使用相等(=)作为连接条件的查询。如!=、>、<、>=、<=、BETWEEN AND 等都是非等值链接的条件判断。

实例:查询所有雇员的薪水级别

SQL> select e.last_name,e.employee_id,e.salary,gra.gra
  2  from employees e,job_grades gra
  3  where e.salary<gra.highest_sal
  4  and e.salary>gra.lowest_sal;
LAST_NAME                 EMPLOYEE_ID     SALARY GRA
------------------------- ----------- ---------- ----------
King                              100   24000.00 E
Kochhar                           101   17000.00 E
De Haan                           102   17000.00 E
Russell                           145   14000.00 D
Partners                          146   13500.00 D
Hartstein                         201   13000.00 D
Greenberg                         108   12008.00 D
Higgins                           205   12008.00 D
Errazuriz                         147   12000.00 D
Ozer                              168   11500.00 D
Raphaely                          114   11000.00 D
Cambrault                         148   11000.00 D
Abel                              174   11000.00 D
Zlotkey                           149   10500.00 D
Vishney                           162   10500.00 D
Fox                               170    9600.00 C
Greene                            163    9500.00 C
Bernstein                         151    9500.00 C
Sully                             157    9500.00 C
Hall                              152    9000.00 C

 

自连接:自己连接自己

 示例:查询每个雇员的经理的名字以及雇员的名字。

SQL> select worker.last_name,man.last_name
  2  from employees worker,employees man
  3  where worker.manager_id=man.employee_id;
LAST_NAME                 LAST_NAME
------------------------- -------------------------
Smith                     Cambrault
Ozer                      Cambrault
Kumar                     Cambrault
Fox                       Cambrault
Bloom                     Cambrault
Bates                     Cambrault
Hunold                    De Haan
Vishney                   Errazuriz
Marvins                   Errazuriz
Lee                       Errazuriz
Greene                    Errazuriz
Banda                     Errazuriz
Ande                      Errazuriz
Sarchand                  Fripp
Olson                     Fripp
Marlow                    Fripp
Dellinger                 Fripp
Cabrio                    Fripp
Bull                      Fripp
Bissot                    Fripp

 

外连接(OUTER JOIN):

外连接是指查询出符合连接条件的数据同时还包含孤儿数据。左外链接包含左表的孤儿数据,右外连接包含右表的孤儿数据,全外连接包含两个表中的孤儿数据。

 

孤儿数据(Orphan Data):指被连接的列的值为空的数据

外连接类型:

左外(LEFT OUTER JOIN):包含左表的孤儿数据。
右外(RIGHT OUTER JOIN):包含右表的孤儿数据。
全外(FULL OUTER JOIN):包含两个表中的孤儿数据。

 

SQL99 中的外连接:

用 LEFT OUTER JOIN | RIGHT OUTER JOIN | FULL OUTER JOIN 定义连接类型,用ON 子句创建连接条件。

左外链接(LEFT OUTER JOIN):

例:用左外链接查询雇员名字以及他们所在的部门名称,包含那些没有部门的雇员。

SQL> select e.last_name,d.department_id
  2  from employees e left outer join departments d
  3  on e.department_id=d.department_id;
LAST_NAME                 DEPARTMENT_ID
------------------------- -------------
King                                 90
Kochhar                              90
De Haan                              90
Hunold                               60
Ernst                                60
Hutton                               80
Taylor                               80
Livingston                           80
Grant                     
Johnson                              80
Taylor                               50
Fleaur                               50

 

右外链接(RIGHT OUTER JOIN)

例:用右外链接查询雇员名字以及他们所在的部门名称,包含那些没有雇员的部门。

SQL> select e.last_name,d.department_name
  2  from employees e right outer join departments d
  3  on e.department_id=d.department_id;
LAST_NAME                 DEPARTMENT_NAME
------------------------- ------------------------------
Whalen                    Administration
Fay                       Marketing
Hartstein                 Marketing
Tobias                    Purchasing
Colmenares                Purchasing
Baida                     Purchasing
Gietz                     Accounting
Higgins                   Accounting
                          Treasury
                          Corporate Tax
                          Control And Credit
                          Shareholder Services
                          Benefits
                          Manufacturing
                          Construction
                          Contracting
                          Operations
                          IT Support
                          NOC
                          IT Helpdesk
                          Government Sales
                          Retail Sales
                          Recruiting
                          Payroll

 

全外链接(FULL  OUTER  JOIN)

例:查询所有雇员和部门,包含那些没有雇员的部门以及没有部门的雇员。

SQL> select e.last_name,d.department_name
  2  from employees e full outer join departments d
  3  on e.department_id=d.department_id;
LAST_NAME                 DEPARTMENT_NAME
------------------------- ------------------------------
King                      Executive
Kochhar                   Executive
De Haan                   Executive
Hunold                    IT
Abel                      Sales
Hutton                    Sales
Taylor                    Sales
Livingston                Sales
Grant                     
Johnson                   Sales
aer                      Public Relations
Higgins                   Accounting
Gietz                     Accounting
                          NOC
                          Manufacturing
                          Government Sales
                          IT Support
                          Benefits
                          Shareholder Services
                          Retail Sales
                          Control And Credit
                          Recruiting
                          Operations
                          Treasury
                          Payroll
                          Corporate Tax
                          Construction
                          Contracting
                          IT Helpdesk

 

Oracle 扩展的外连接

在 Oracle 数据库中对外连接中的左外与右外连接做了扩展,可以简化外连接的语法通过在连接条件的后侧使用(+)来表示是否显示孤儿数据,有(+)表示不显示孤儿数据而另一侧则显示孤儿数据。 但是该种写法仅能在 Oracle 

例:查询雇员名字以及他们所在的部门名称,包含那些没有雇员的部门

SQL> select e.last_name,d.department_name
  2  from employees e , departments d
  3  where e.department_id(+)=d.department_id;
LAST_NAME                 DEPARTMENT_NAME
------------------------- ------------------------------
Gietz                     Accounting
Higgins                   Accounting
                          Treasury
                          Corporate Tax
                          Control And Credit
                          Shareholder Services
                          Benefits
                          Manufacturing
                          Construction
                          Contracting
                          Operations
                          IT Support
                          NOC
                          IT Helpdesk
                          Government Sales
                          Retail Sales
                          Recruiting
                          Payroll

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值