zoukankan      html  css  js  c++  java
  • Oracle_SQL(5) 连接和子查询

    一、连接join
    一般分类:
    inner join: 内连接,又叫等值连接,只返回两个表中连接字段相等的行。
    left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录。
    right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录。
    full join:外连接,返回两个表中的行:left join + right join。
    cross join:笛卡尔积,就是第一个表的行数乘以第二个表的行数。
    oracle分类:等值连接 =
    外连接(左外连接、右外连接、全连接)=(+)
    笛卡尔积
    update emp set deptno=null where empno=7839;
    1.内连接等值连接
    select emp.*,dept.* from emp,dept where emp.deptno=dept.deptno;
    select emp.*,dept.*
    from emp inner join dept on emp.deptno=dept.deptno;

    2.左连接左外连接
    select emp.*,dept.* from emp,dept where emp.deptno=dept.deptno(+);
    select emp.*,dept.*
    from emp left join dept on emp.deptno=dept.deptno;
    3.右连接右外连接
    select emp.*,dept.* from emp,dept where emp.deptno(+)=dept.deptno;
    select emp.*,dept.*
    from emp right join dept on emp.deptno=dept.deptno;
    4.外连接全连接
    select emp.*,dept.* from emp,dept where emp.deptno=dept.deptno(+)
    union
    select emp.*,dept.* from emp,dept where emp.deptno(+)=dept.deptno;

    select emp.*,dept.*
    from emp full join dept on emp.deptno=dept.deptno;
    5.笛卡尔积
    select emp.*,dept.* from emp,dept;
    select emp.*,dept.* from emp cross join dept;

    二、子查询
    在查询语句的select、from、where部分再嵌入一个查询语句,
    这个被嵌入的查询语句称为子查询。
    子查询可以被多层嵌套。
    1.select子查询
    select emp.*,
    (select dname from dept where dept.deptno=emp.deptno) as dname
    from emp;
    2.from子查询
    select emp.*,dept1.* from emp,
    (select * from dept where dname in ('RESEARCH','SALES')) dept1
    where dept1.deptno=emp.deptno;
    3.where子查询
    select emp.* from emp where emp.deptno in
    (select deptno from dept where dname in ('RESEARCH','SALES'));

    select emp.* from emp where exists
    (select 1 from dept where dept.deptno=emp.deptno
    and dname in ('RESEARCH','SALES'));
    4.对应的连接查询
    select emp.*,dept.* from emp,dept
    where dept.deptno=emp.deptno and dname in ('RESEARCH','SALES');
    5.总结:一般连接查询效率是最高,但受到数据质量的限制比较多,
    且不容易写出sql或sql的健壮性不足。
    比如:要查出所有职员的部门名称,用连接查询时需要考虑每个职员是否有部门编号,
    如果都有部门编号时,可以用等值连接书写;
    如果存在没有部门编号的职员时,就要考虑用外连接,至于时左外连接还是右外连接还和职员表与部门表的位置有关;
    这就增加的书写sql的难度,并增加的错误出现的概率。
    用select子查询示例的方式书写就不用考虑这些问题,简化的编写sql的难度,
    且不用考虑数据的真实情况。
    但如果要查询的字段比较多时,select子查询示例的方式又比较低效,
    所以需要综合考虑。
    在结果正确的前提下考虑sql程序的健壮性、效率。

    三、谓词查询
    0.in 某列的值属于集合成员中的一个成员
    select emp.* from emp where emp.deptno in
    (select deptno from dept where dname in ('RESEARCH','SALES'));
    1.exists 总存在一个值满足条件
    select emp.* from emp where exists
    (select 1 from dept where dept.deptno=emp.deptno
    and dname in ('RESEARCH','SALES'));
    2.not exists 不存在任何值满足条件
    select emp.* from emp where not exists
    (select 1 from dept where dept.deptno=emp.deptno
    and dname in ('RESEARCH','SALES'));
    3.any 某列的值满足一个条件即可
    select emp.* from emp where emp.deptno = any
    (select deptno from dept where dname in ('RESEARCH','SALES'));
    4.some 满足集合中的某些值
    select emp.* from emp where emp.deptno = some
    (select deptno from dept where dname in ('RESEARCH','SALES'));
    5.all 某列的值满足子查询中所有值的记录
    select emp.* from emp where emp.deptno = all
    (select deptno from dept where dname in ('RESEARCH','SALES'));
    select * from emp where emp.deptno <
    all(select deptno from dept where dname in ('RESEARCH','SALES'));
    6.总结:
    exists、any、some与in的功能是类似的,not exists、all与not in功能类似;
    any、some、all比起in来不方便理解,基本不在实际中使用;
    exists和not exists要比in和not in效率高,所以需要重点掌握。
    如果对exists和not exists理解有困难的话,
    可以先用in和not in写出sql,在按照格式修改为exists和not exists即可。

    四、查询结果的并、交、差
    1.union 并(去重)
    select emp.*,dept.* from emp,dept where emp.deptno=dept.deptno(+)
    union
    select emp.*,dept.* from emp,dept where emp.deptno(+)=dept.deptno;
    2.union all 并(不去重)
    select emp.*,dept.* from emp,dept where emp.deptno=dept.deptno(+)
    union all
    select emp.*,dept.* from emp,dept where emp.deptno(+)=dept.deptno;
    3.intersect 交
    select emp.*,dept.* from emp,dept where emp.deptno=dept.deptno(+)
    intersect
    select emp.*,dept.* from emp,dept where emp.deptno(+)=dept.deptno;
    等价与等值连接
    select emp.*,dept.* from emp,dept where emp.deptno=dept.deptno;
    4.minus 差
    select emp.*,dept.* from emp,dept where emp.deptno=dept.deptno(+)
    minus
    select emp.*,dept.* from emp,dept where emp.deptno(+)=dept.deptno;
    差操作的结果的两个查询的位置有关:
    select emp.*,dept.* from emp,dept where emp.deptno(+)=dept.deptno
    minus
    select emp.*,dept.* from emp,dept where emp.deptno=dept.deptno(+);

    五、子查询对增删改功能的增强
    1.批量新增
    语法:insert into <表名> (列名,...) 子查询;
    insert into dept
    (select empno/100 as deptno,ename as dname,ename as loc
    from emp where job='MANAGER');
    2.批量修改
    语法:update <表名> set <列名1>=<表达式1>,... where 子查询;
    update emp set sal=sal+500 where deptno in
    (select deptno from dept where dname in ('RESEARCH','SALES'));
    3.批量删除
    语法:delete from <表名> where 子查询;
    delete from emp where emp.deptno in
    (select deptno from dept where dname in ('RESEARCH','SALES'));

  • 相关阅读:
    [译]javascript中的条件语句
    [译]Javascript substring实例
    [译]Javasctipt中的substring
    [译]在Javascript中将string转化成numbers
    [译]Javascript基础
    [译]我们应该在HTML文档中何处放script标签
    [译]内联Javascript vs 外置Javascript
    [译]学习Javascript的工具
    MYSQL 重新设置自增值
    LINUX下的ssh登录之后的文件远程copy:scp命令(接前文ssh登录)
  • 原文地址:https://www.cnblogs.com/BradMiller/p/9279526.html
Copyright © 2011-2022 走看看