zoukankan      html  css  js  c++  java
  • 高级查询,关联查询

    高级查询

    1.关联查询
    作用:可以跨越多表查询

    --查询出员工的名字和他所在部门的的名字
    //错误
    select first_name,name from s_emp,s_dept;
    //错误的原因:
    产生笛卡尔积(在查询两张表的时候,一张表中的数据与另一张表中的数据一一匹配),产生了冗余数据。

    //古老的写法:
    select first_name,name from s_emp,s_dept where s_emp.deop_id = s_dept.id;

    //现在的写法:
    select e.first_name,d.name from s_emp e
    join s_dept d on e.dept_id = d.id;


    语法:
    select 列,列,列
    from 表1 join 表2
    on 表1外键=表2主键


    案例:
    -- 找出Sales 部门的所有员工
    select * from s_emp e
     join s_dept d on e.dept_id=d.id
     where d.name = 'Sales';

    -- 找出在 Asia 地区工作的员工
    select  * from s_emp e
    join s_dept d on e.dept_id = d.id
    join s_region r on d.region_id = r.id
    where r.name  = 'Asia';

    --找出客户'Hamada Sport' 的所有订单号、费用、下订日期
    select o.id,o.total,o.date_ordered,c.name from s_ord o
    join s_customer c on o.customer_id = c.id
    where c.name ='Hamada Sport';


    --找出所有在'Asia'客户的信息
    select * from s_region r
    join s_customer c on c.region_id = r.id
    where r.name  = 'Asia';



    练习:

    --查询出客户名字叫unisports的订单信息
    select o.* from s_ord o
    join s_customer c on o.customer_id = c.id
    where lower(c.name) =lower('unisports');
     
    --查询出设在北美的的部门名称
    select s.name from s_dept s
    join s_region r on s.region_id = r.id
    where r.name = 'North America';

    --查询出在北美工作的员工姓名、工资、入职日期和职位
    select e.first_name, e.salary ,e.start_date,e.title from s_emp e
    join s_dept d on e.dept_id = d.id
    join s_region r on d.region_id  =r.id
    where r.name = 'North America';

    --查询出所有客户名,及其订单号
    select c.name,o.id from s_customer c
    left join s_ord o on o.customer_id = c.id
    order by c.name
    ;






    2.外联接


      左外联[left outer join]
        以关联的左边为准,即使右边没有与之匹配的记录,则左边的记录也要
        出现在结果集中,右边全部以NULL值显示。

      右外联[right outer join]
        以关联的右边为准,即使左边没有与之匹配的记录,则右边的记录也要
        出现在结果集中,左边全部以NULL值显示。
        
    补充:全外联,交叉外联
        
        
    --查询出所有客户名,及其订单号
    select c.name,o.id from s_customer c
    left join s_ord o on o.customer_id = c.id
    order by c.name
    ;

    --查询所有订单号,订单费用以及订单所对应的客户名
    select c.name,o.id,o.total from s_customer c
    right join s_ord o on o.customer_id = c.id;



    --找出Womansport所购买的订单信息(订单编号,费用,支付方式)
    select o.id,o.total,o.payment_type from s_ord o
    right join s_customer c on o.customer_id = c.id
    where c.name = 'Womansport';

    --找出Operations部门工作的员工名,工资,并且按照工资降序排列
    select e.first_name,e.salary from s_emp e
    left join s_dept d on e.dept_id  =d.id
    where d.name  = 'Operations'
    order by e.salary desc;
    注意:如何验证:
    --第一步:select * from s_emp;select  * from s_dept;查看员工人数和部门个数,以及是否存在员工没有分配部门的 情况,和是否存在新部门没有员工的情况
    --第二步:如果存在员工没有分配部门,那么以员工表为主表
    --第三部:如果存在新部门没有员工的情况,以部门表为主表

        

    自关联:
    -- 查询出所有的员工名以及员工的上司名
    select e.firstname,m.fitstname from s_emp e
    left join s_emp m on e.manager_id = m.id;


    ----
    注:关联的条件不一定总是做等值比较的。

  • 相关阅读:
    [原]Google的小Bug
    [原]安装Oracle 11g R2 遇到的两个小问题及解决方法
    [原]关于数据库是否使用索引的讨论,我想说的
    [原]在新服务器中找到了上个世纪的产物
    Oracle db_block_checking和db_block_checksum 两个参数区别
    [原]16路的PC服务器
    [原]第一次遭遇Oracle的Bug,纪念一下 |ORA00600 kmgs_pre_process_request_6|
    Oracle 隐含参数的查询
    [原]nginx折腾记(HTTP性能能测试,与Apache对比)
    [原]Oracle Control File 意外情况研究
  • 原文地址:https://www.cnblogs.com/w-xibao/p/7816343.html
Copyright © 2011-2022 走看看