• Oracle的多表查询


    多表查询概念:   

        所谓多表查询,又称表联合查询,即一条语句涉及到的表有多张,数据通过特定的连接进行联合显示。

    基本语法:

    select column_name,....

    from table1,table2

    条件。。。。

    select dept_id,name

    from s_emp,s_dept

    s_emp s_dept

    last_name   dept_id id      name

    zhangsan 41 41      est

    lisi           42 42     develop

    学前须知:

    笛卡尔积

    在数学中,两个集合XY的笛卡尓积(Cartesian product),又称直积,表示为X × Y.

    假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}

    在数据库中,如果直接查询俩张表,那么其查询结果就会产生笛卡尔积

    例如:

    select *

    from s_emp,s_dept;

    连接查询分类:

    为了在多表查询中避免笛卡尔积的产生,我们可以使用连接查询来解决这个问题.

    连接查询分为:

    1.等值连接

    2.不等值连接

    3.外连接

    左外连接

    右外连接

    全连接

    4.自连接

    等值连接:利用一张表中某列的值和另一张表中某列的值相等的关系,把俩张表连接起来。

    语法:

    select tb_name.col_name,tb_name.col_name,...

    from tb_name,tb_name,...

    where tb_name.col_name = tb_name.col_name

    and

          tb_name.col_name = tb_name.col_name

    ...

    需求:查看每个员工的idlast_name以及所属部门名称

    select s_emp.id,last_name,s_dept.name

    from s_emp ,s_dept

    where s_emp.detp_id = s_dept.id;

    有时为了简化操作,或者表述更加清楚,可以给每张表起别名

    select e.id,e.last_name,d.name

    from s_emp e ,s_dept d

    where d.detp_id = d.id;

    不等连接: 使用的是除=以外的操作符号的多表查询

    例如:使用between and

    select t1.col_name,t2.col_name

    from t1,t2

    where t1.col_name between t2.col_name

    and t2.col_name;

    外连接:当一个表的记录在另外一张表中不存在的时候,我们依旧需要显示,使用外连接即可。

    外连接分为:

    右外连接(right join/right outer join)

    左外连接(left join/left outer join)

    全外连接(full join/ full outer join)

    右外连接的语法:

    select tb_name,col_name,...

    from tb_name1,tb_name2

    where

    tb_name1.col_name (+)= tb_name2.col_name;

    or

    select tb_name,col_name,

    from tb_name1 right outer join tb_name2

    where .......

    意义:右外连接表示右边表(=号右边的表)中的记录在左边表中不存在的时候,右边表的记录依旧显示。

    select c.id,c.name,e.last_name

    from s_customer c,s_emp e

    where c.id (+)= c.sales_rep_id;

    左外连接的语法:

    select tb_name,col_name,...

    from tb_name1,tb_name2

    where

    tb_name1.col_name = tb_name2.col_name(+);

    or

    select tb_name,col_name,...

    from tb_name1 left outer join tb_name2

    where

    tb_name1.col_name = tb_name2.col_name(+);

    意义:左外连接表示左边表(=号左边的表)中的记录在右边表中不存在的时候,左边表的记录依旧显示。

    需求:查看s_customer中所有客户的id和名字以及该客户所对应的负责员工的idlast_name

    表之间的连接列

    s_customer 表中的sales_rep_id

    s_emp      表中的id

    select c.id,c.name,e.last_name

    from s_customer c,s_emp e

    where c.sales_rep_id = e.id;

    自连接

    实质就是一张表当多张表用,即一张表中的某列的值取决于自己的某一列

    需求:查看每一个员工的经理名字

    语法:

    select ...

    from tb_name t1,tb_name t2

    where t1.col_name = t2.ano_col_name

    select e1.id,e1.last_name,e1.manager_id,e2.last_name

    from s_emp e1,s_emp e2

    where e1.manager_id = e2.id;

    集合连接:对查询结果集的操作。

    union:将上下结果取并集,去除掉重复的记录(重复的只显示一次)

    union all:将上下结果全部显示

    minus:取差集 A-B

    intersect:取交集

    前提条件是:两个结果集中查询的列要完全一致。

    伪列:

    oracle中的伪列 rownum

    伪列rownum,就像表中的列一样,但是在表中并不存储。伪列只能查询,不能进行增删改操作。它会根据返回的结果为每一条数据生成一个序列化的数字.rownumoracle才有的伪列

    rownum 所能作的操作:

    rownum 只能等于1  如果让其等于其他数 则查不到数据

    例如:

    select last_name

    from s_emp

    where rownum=1

    rownum 大于0      如果让其大于其他数 则查不到数据

    例如:

    select last_name

    from s_emp

    where rownum>0

    rownum 可以小于任何数

    例如:

    select last_name

    from s_emp

    where rownum<7

  • 相关阅读:
    STRIDE威胁分析与DREAD威胁评价
    HashMap 几大问题
    java 集合中的错误检测机制
    科创人·StreamNative翟佳:开源模式价值为王,基础软件的未来在国内社区
    科创人·云柚智能CEO汤峥嵘:价值观一致奠定共事基础,技术创新加速行业变革
    科创人·微软中国CTO韦青:数智时代创业得跳下巨人肩膀,还需掌握基础知识和逻辑能力
    科创人研习社·微智云CEO 张虎:从CTO到创始人关键是扩大视野半径
    科创人·天云数据CEO雷涛:打造正确理解数智的认知体系
    neovim环境与vim简单使用
    MIT6.828——Lab3 PartA(麻省理工操作系统实验)
  • 原文地址:https://www.cnblogs.com/yzqm666/p/5859824.html
Copyright © 2020-2023  润新知