首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Oracle学习笔记_04_多表查询

Oracle学习笔记_04_多表查询

作者头像
shirayner
发布2018-08-10 11:15:19
4090
发布2018-08-10 11:15:19
举报
文章被收录于专栏:Java成神之路Java成神之路

一.概念:

1.多表连接有以下几种分法:

                                    (1)内连接           vs          外连接 (左、右、满)

                                    (2)等值连接        vs         不等值连接

                                    (3)非自连接        vs         自连接

2.笛卡尔集:  所有表中的所有行互相连接

   产生条件:(1)多表查询没有连接条件          

                     (2)连接条件无效

3. 内连接   :  结果集中不包含一个表与另一个表不匹配的行

    外连接   :  两个表在连接过程中除了返回满足连接条件的行以外(这里的数据是内连接查询到的),还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接

    满外连接: 返回左表中和右表中不满足条件的行

 4.注意:      当列名为多个表共有时,列名必须被限制。

二.1999 语法连接

语法:

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)];

1.join  ...  on...  (推荐使用)

 自然连接中是以具有相同名字的列为连接条件的,而 JOIN...ON ...子句并不要求两张表含有相同名字的列。

ON 子句使语句具有更高的易读性。

select  字段...

from  表1   join  表2

on    表1和表2的连接条件
join  表3
on    表1(或表2)和表3的连接条件

(1)两张表的等值连接

select  last_name, department_name
from employees e join departments d
on e.department_id = d.department_id;

(2)使用 join.. on..创建多表连接:三张表的等值连接

select last_name,e.department_id,department_name,city
from employees e  join departments d
on e.department_id = d.department_id 
join locations l
on d.location_id = l.location_id;

2.CROSS   JOIN ( 不推荐 )

     使用 CROSS   JOIN  会产生叉集,叉集与笛卡尔集相同。

SELECT last_name, department_name
FROM   employees
CROSS JOIN departments ;

3.  natural    join   (不推荐)

    自然连接:   NATURAL  JOIN 子句,会以两个表中具有相同名字的列为条件创建等值连接。

    注:  如果只是列名相同而数据类型不同,则会产生错误。

   employees表 和 departments表 有两个相同字段。使用NATURAL  JOIN ,会自动以这两个字段作为连接条件。

select last_name,department_name
from employees natural join departments;

以上代码与下面代码相同:

select last_name,department_name
from employees e,departments d
where e.department_id = d.department_id   and  e.manager_id = d.manager_id;

4.join .. using ...    (不推荐)

背景:由 NATURAL JOIN 子句创建等值连接,会将这些相同列都作为连接条件。而有时我们只需要其中某些列,这是就可以使用using子句指定等值连接中需要用到的列。

作用:在有多个列满足条件时,可以使用 USING 子句 指定等值连接中需要用到的列。

局限:按照指定的列作为连接条件。但是要求指定的列,在两个表中列名相同。

注:        不要给选中的列中加上表名前缀或别名。        JOIN 和 USING 子句经常同时使用。

以上都是内连接

三.外连接

1.左外连接

 左外连接:除了查询到满足条件的行之外,返回左表中不满足条件的行。主要有两种实现方式:

(1) left  outer  join... on...

select last_name ,department_name
from employees e  left outer join departments d
on e.department_id = d.department_id;

(2) +

select e.employee_id,e.department_id,d.department_name
from employees e,departments d
where e.department_id = d.department_id(+);       --左边有,右边没,故右加

2.右外连接

右外连接:返回右表中不满足条件的行。主要有两种实现方式:

(1) right  outer  join... on...

select employee_id,last_name,e.department_id,department_name
from employees e right outer join departments d
on e.department_id = d.department_id;

(2) +

select employee_id,e.department_id,department_name
from employees e,departments d
where e.department_id(+) = d.department_id;

3.满外连接

 满外连接:同时返回左表和右表中不满足条件的行

select employee_id,last_name,e.department_id,department_name
from employees e full outer join departments d
on e.department_id = d.department_id;

四.补充

1.自连接

select emp.employee_id,emp.last_name,mgr.last_name
from employees emp,employees mgr
where emp.manager_id = mgr.employee_id;
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-07-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.概念:
  • 二.1999 语法连接
    • 1.join  ...  on...  (推荐使用)
      • 2.CROSS   JOIN ( 不推荐 )
        • 3.  natural    join   (不推荐)
          • 4.join .. using ...    (不推荐)
          • 三.外连接
            • 1.左外连接
              • 2.右外连接
                • 3.满外连接
                • 四.补充
                  • 1.自连接
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档