ITPub博客

首页 > 数据库 > Oracle > 实例解析外连接 内连接 自连接 全连接

实例解析外连接 内连接 自连接 全连接

原创 Oracle 作者:贺子_DBA时代 时间:2014-08-01 21:33:57 1 删除 编辑

1. 首先看两个测试表的结构

1)HR@ENMOEDU> desc employees    #表1

 Name                                      Null?    Type

 ----------------------------------------- -------- ----------------------------

 EMPLOYEE_ID                               NOT NULL NUMBER(6)

 FIRST_NAME                                         VARCHAR2(20)

 LAST_NAME                                 NOT NULL VARCHAR2(25)

 EMAIL                                     NOT NULL VARCHAR2(25)

 PHONE_NUMBER                                       VARCHAR2(20)

 HIRE_DATE                                 NOT NULL DATE

 JOB_ID                                    NOT NULL VARCHAR2(10)

 SALARY                                             NUMBER(8,2)

 COMMISSION_PCT                                     NUMBER(2,2)

 MANAGER_ID                                         NUMBER(6)

 DEPARTMENT_ID                                      NUMBER(4)

2)HR@ENMOEDU>  desc departments   #表2

 Name                                      Null?    Type

 ----------------------------------------- -------- ----------------------------

 DEPARTMENT_ID                             NOT NULL NUMBER(4)

 DEPARTMENT_NAME                           NOT NULL VARCHAR2(30)

 MANAGER_ID                                         NUMBER(6)

 LOCATION_ID                                        NUMBER(4)

1利用上面两个表做连接  连接条件是 DEPARTMENT_ID 可以这样理解连接  你想在一个结果中同时显示EMPLOYEE_ID,LAST_NAME,DEPARTMENT_NAME 你会发现 上面两个表都不同时存在上述三个字段,这时你只有做连接了   

1)内连接:如图所示

如果你想得到这样的结果:显示员工姓名,员工编号,部门名字  表1的DEPARTMENT_ID等于表2的DEPARTMENT_ID等于n ,则输出DEPARTMENT_ID=n对应的EMPLOYEE_ID,LAST_NAME,DEPARTMENT_NAME。否则不返回结果。这时候你就用内连接, 格式为:表1 join 表2   on  表1.DEPARTMENT_ID=表2.DEPARTMENT_ID

所以应该这样来完成任务:HR@ENMOEDU> select a.employee_id,a.last_name,b.department_name from employees a join departments b on a.department_id=b.department_id;

 

EMPLOYEE_ID LAST_NAME                 DEPARTMENT_NAME

----------- ------------------------- ------------------------------

        200 Whalen                    Administration

        201 Hartstein                 Marketing

        202 Fay                       Marketing

        114 Raphaely                  Purchasing

        119 Colmenares                Purchasing

        115 Khoo                      Purchasing

        116 Baida                     Purchasing

        117 Tobias                    Purchasing

2)外连接:如图

                                                      

如果你想要得到 所有的 表1中的 员工姓名,员工编号  连接条件还是department_id ,就算是条件不符合  也要把表1中的想显示的数据也显示出来  这样你就应该用外连接,若表2中没有符合条件的则补空   你就应该用外连接,(一个都不能少)

左外连接:A left join B   右外连接:A right join B    可以这样 记忆   左外连接中写在左边的表是那个内容多的(也就是A表一个都不能少的) 右外连接中写在右边的表内容多(也就是B表一个都不能少)   这样你就会发现  A left join B  结果就等于   B  right join  A

看例子:左连接 表a内容多  b 有补空

HR@ENMOEDU> select a.employee_id,a.last_name,b.department_name from employees a left join departments b on a.department_id=b.department_id;  

 EMPLOYEE_ID LAST_NAME                 DEPARTMENT_NAME

----------- ------------------------- ------------------------------

        112 Urman                     Finance

        111 Sciarra                   Finance

        110 Chen                      Finance

        109 Faviet                    Finance

        108 Greenberg                 Finance

        206 Gietz                     Accounting

        205 Higgins                   Accounting

        178 Grant

右连接:HR@ENMOEDU> select a.employee_id,a.last_name,b.department_name from employees a right join departments b on a.department_id=b.department_id;

EMPLOYEE_ID LAST_NAME                 DEPARTMENT_NAME

----------- ------------------------- ------------------------------

        108 Greenberg                 Finance

        111 Sciarra                   Finance

        112 Urman                     Finance

        113 Popp                      Finance

        109 Faviet                    Finance

        206 Gietz                     Accounting

        205 Higgins                   Accounting

                                      Treasury

                                      Corporate Tax

                                      Control And Credit

                                      Shareholder Services

全外连接:就是俩表都一个也不能少

HR@ENMOEDU> select a.employee_id,a.last_name,b.department_name from employees a full join departments b on a.department_id=b.department_id;

EMPLOYEE_ID LAST_NAME                 DEPARTMENT_NAME

----------- ------------------------- ------------------------------

        168 Ozer                       Sales

        169 Bloom                     Sales

        170 Fox                       Sales

        171 Smith                      Sales

        172 Bates                      Sales

        173 Kumar                     Sales

        174 Abel                       Sales

        175 Hutton                     Sales

        176 Taylor                      Sales

        177 Livingston                  Sales

        178 Grant                                  #右补空

         190 Gates                     Shipping

        191 Perkins                   Shipping

        192 Bell                      Shipping

        193 Everett                   Shipping

        194 McCain                    Shipping

        195 Jones                     Shipping

        196 Walsh                     Shipping

        197 Feeney                    Shipping

                                      NOC            #坐补空

                                      Manufacturing

                                      Government Sales

3)自连接:其实是内连接的一种特殊情况,只不过要连接的俩个表 是同一个表,比如说  你要得到比其经理来的早的员工的标号。那就只能用自连接了  

思路 把一个employees 表看成员工表a  再把另一个 employees 表看成经理表b  连接条件是员工表的经理编号=经理表员工编号   具体看下边:

HR@ENMOEDU> select a.EMPLOYEE_ID from employees a join employees b on a.MANAGER_ID=b.EMPLOYEE_ID  where a.hire_date

 

EMPLOYEE_ID

-----------

        122

        114

        102

        108

        205

        204

        203

        200

        105

        109

        185

总结:仔细思考一下 发现能用子查询得到的结果,都可以用连接来做,但反过来就不一定了,例如自连接中的例子,你要想用子查询 那就复杂了  本人暂时没办法用子查询得到结果。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29654823/viewspace-1244016/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
10年数据库管理员从业经历,熟悉Oracle、mysql、tidb、oceanbase、redis、 mongodb 、python等技术栈,持有11g ocm 、mysql 5.7 ocp 、tidb 5.0 ptcp、tidb 6.0 ptca、oceanbase obcp等

注册时间:2014-05-12

  • 博文量
    327
  • 访问量
    2149009