• 多表查询


    等值连接

    三个表之间的连接:

    select e.employee_id,e.department_id,d.department_name,l.city
    from employees e,departments d ,locations l
    where e.department_id = d.department_id and l.location_id = d.location_id;
    EMPLOYEE_ID DEPARTMENT_ID DEPARTMENT_NAME                CITY                         
    ----------- ------------- ------------------------------ ------------------------------
            100            90 Executive                      Seattle                        
            101            90 Executive                      Seattle                        
            102            90 Executive                      Seattle                        
            103            60 IT                             Southlake   

     注意:连接n个表,至少需要  n-1  个连接条件,如连接三个表至少需要两个连接条件

    非等值连接

    select  distinct grade_level ,lowest_sal,highest_sal from job_grades;
    GRADE_LEVEL LOWEST_SAL HIGHEST_SAL
    ----------- ---------- -----------
    E                15000       24999 
    C                 6000        9999 
    D                10000       14999 
    F                25000       40000 
    A                 1000        2999 
    B                 3000        5999 
    select distinct e.employee_id, e.last_name,e.salary, j.grade_level
    from employees e ,job_grades j
    where e.salary between j.lowest_sal and j.highest_sal;
    EMPLOYEE_ID LAST_NAME                     SALARY GRADE_LEVEL
    ----------- ------------------------- ---------- -----------
            201 Hartstein                      13000 D           
            205 Higgins                        12000 D           
            170 Fox                             9600 C           
            153 Olsen                           8000 C    

    与等值连接的不同在与过滤条件

    没有过滤条件会出现笛卡尔积错误

    -- 左外连接(左外联接):   左表中多一个, 需要在右表中加上一个

    select e.last_name,e.department_id,d.department_name
    from employees e,departments d 
    where e.department_id = d.department_id(+);
    LAST_NAME                 DEPARTMENT_ID DEPARTMENT_NAME              
    ------------------------- ------------- ------------------------------
    Wha_len                              10 Administration                 
    Fay                                  20 Marketing                                    
    Gietz                               110 Accounting                     
    Higgins                             110 Accounting                     
    Grant                                                                  
    
     选定了 107

    右外连接:与左外连接相对应

    注意左外连接 和右外连接不能同时存在

    -- 两表之间连接和  where+连接条件 效果 相同的    

    -- join ...on

    select e.last_name,e.department_id,d.department_name
    from employees e join departments d 
    on e.department_id = d.department_id;
    LAST_NAME                 DEPARTMENT_ID DEPARTMENT_NAME              
    ------------------------- ------------- ------------------------------
    King                                 90 Executive                      
    Kochhar                              90 Executive                      
    De Haan                              90 Executive                      
    Hunold                               60 IT           

    -- 三个表的连接: join...on后面接着join ...on

    select e.last_name,e.department_id,d.department_name,l.city
    from employees e join departments d 
    on e.department_id = d.department_id
    join locations l
    on d.location_id = l.location_id;
    LAST_NAME                 DEPARTMENT_ID DEPARTMENT_NAME                CITY                         
    ------------------------- ------------- ------------------------------ ------------------------------
    King                                 90 Executive                      Seattle                        
    Kochhar                              90 Executive                      Seattle                        
    De Haan                              90 Executive                      Seattle                        
    Hunold                               60 IT                             Southlake 

    --左外连接及右外连接:

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

    --满外连接

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

    -- 自连接

    --查询公司中员工 'Chen'  的manger的信息

    select emp.last_name,manager.last_name,manager.salary,manager.email 
    from employees emp,employees manager
    where emp.manager_id = manager.employee_id and lower(emp.last_name) = 'chen';
    LAST_NAME                 LAST_NAME                     SALARY EMAIL                   
    ------------------------- ------------------------- ---------- -------------------------
    Chen                      Greenberg                      12000 NGREENBE                  
    select * from employees where employee_id =(
                             select manager_id from employees 
                             where last_name = 'Chen'
    
    );
    All that work will definitely pay off
  • 相关阅读:
    BZOJ5311,CF321E 贞鱼
    POJ3208 Apocalypse Someday
    POJ1037 A decorative fence
    POJ1737 Connected Graph
    CF559C Gerald and Giant Chess
    NOI2009 诗人小G
    Problem 2726. -- [SDOI2012]任务安排
    POJ1821 Fence
    HDU5542 The Battle of Chibi
    POJ2376 Cleaning Shifts
  • 原文地址:https://www.cnblogs.com/afangfang/p/12545675.html
Copyright © 2020-2023  润新知