• Chapter 08Using the Set Operators


    Objectives

    After completing this lesson,you should be able to do the following:

    • Describe set operators.
    • Use a set operator to combine multiple queries into a single query.
    • Control the order of rows returned.

    Lesson Agenda

    • Set Operators:Types and guidelines
    • Tables used in this lesson
    • UNION and UNION ALL operator
    • INTERSECT operator
    • MINUS operator
    • Matching the SELEC T statements
    • Using the ORDER BY clause in set operators

    Set Operators


    UNION ALL   不考虑重复元素
    UNION       考虑重复元素,会去掉重复的元素
    INTERSECT    求交集元素信息
    MINUS             两个集合相减

    Set Operator Guidelines

    • The expressions in the SELECT lists must match in number.
    • The data type of each column in the second query must match the data type of its correspongding column in the first query
    • Parentheses can be used to alter the sequence of execution
    • ORDER BY clause appear only at the very end of the statement.

    The Oracle Server and Set Operator

    • Duplicate rows are automatically eliminated execpt in UNIION ALL.
    • Column names from the first query appear in the result.
    • The output is sorted in ascending order by default except in UNION ALL.

    /*
     1、按照查询的第一列进行排序.除了UNION ALL。
     2、另外,如果第一列是CHAR(10),第二列是CHAR(20),那么最终的结果将是按照CHAR(20)进行输出.计算原则:按照最长的算
     3、集合操作,是不忽略NULL VALUE的.
    */

    Tables Used in This Lesson

    • The tables used in this lesson are:
    • EMPLOYEES:Provides details regarding all current employees
    • JOB_HISTORY:Records the details of the start date and end date of the former job,and the job identification number and department when an employee switches jobs

    UNION Operator

    Using the UNION Operator

    • Display the current and previous job details of all employees.
    • Display each employee only once.
    View Code
    SQL>  SELECT employee_id,job_id FROM employees
      2   UNION
      3   SELECT employee_id,job_id FROM job_history;
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            100 AD_PRES
            101 AC_ACCOUNT
            101 AC_MGR
            101 AD_VP
            102 AD_VP
            102 IT_PROG
            103 IT_PROG
            104 IT_PROG
            105 IT_PROG
            106 IT_PROG
            107 IT_PROG
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            108 FI_MGR
            109 FI_ACCOUNT
            110 FI_ACCOUNT
            111 FI_ACCOUNT
            112 FI_ACCOUNT
            113 FI_ACCOUNT
            114 PU_MAN
            114 ST_CLERK
            115 PU_CLERK
            116 PU_CLERK
            117 PU_CLERK
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            118 PU_CLERK
            119 PU_CLERK
            120 ST_MAN
            121 ST_MAN
            122 ST_CLERK
            122 ST_MAN
            123 ST_MAN
            124 ST_MAN
            125 ST_CLERK
            126 ST_CLERK
            127 ST_CLERK
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            128 ST_CLERK
            129 ST_CLERK
            130 ST_CLERK
            131 ST_CLERK
            132 ST_CLERK
            133 ST_CLERK
            134 ST_CLERK
            135 ST_CLERK
            136 ST_CLERK
            137 ST_CLERK
            138 ST_CLERK
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            139 ST_CLERK
            140 ST_CLERK
            141 ST_CLERK
            142 ST_CLERK
            143 ST_CLERK
            144 ST_CLERK
            145 SA_MAN
            146 SA_MAN
            147 SA_MAN
            148 SA_MAN
            149 SA_MAN
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            150 SA_REP
            151 SA_REP
            152 SA_REP
            153 SA_REP
            154 SA_REP
            155 SA_REP
            156 SA_REP
            157 SA_REP
            158 SA_REP
            159 SA_REP
            160 SA_REP
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            161 SA_REP
            162 SA_REP
            163 SA_REP
            164 SA_REP
            165 SA_REP
            166 SA_REP
            167 SA_REP
            168 SA_REP
            169 SA_REP
            170 SA_REP
            171 SA_REP
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            172 SA_REP
            173 SA_REP
            174 SA_REP
            175 SA_REP
            176 SA_MAN
            176 SA_REP
            177 SA_REP
            178 SA_REP
            179 SA_REP
            180 SH_CLERK
            181 SH_CLERK
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            182 SH_CLERK
            183 SH_CLERK
            184 SH_CLERK
            185 SH_CLERK
            186 SH_CLERK
            187 SH_CLERK
            188 SH_CLERK
            189 SH_CLERK
            190 SH_CLERK
            191 SH_CLERK
            192 SH_CLERK
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            193 SH_CLERK
            194 SH_CLERK
            195 SH_CLERK
            196 SH_CLERK
            197 SH_CLERK
            198 SH_CLERK
            199 SH_CLERK
            200 AC_ACCOUNT
            200 AD_ASST
            201 MK_MAN
            201 MK_REP
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            202 MK_REP
            203 HR_REP
            204 PR_REP
            205 AC_MGR
            206 AC_ACCOUNT
    
    115 rows selected.

    UNION ALL Operator

    Using the UNION ALL Operator

    • Display the current and previous departments of all employees.
    View Code
    SQL> SELECT employee_id,job_id FROM employees
      2  UNION ALL
      3  SELECT employee_id,job_id FROM job_history
      4  ORDER BY employee_id;
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            100 AD_PRES
            101 AD_VP
            101 AC_ACCOUNT
            101 AC_MGR
            102 AD_VP
            102 IT_PROG
            103 IT_PROG
            104 IT_PROG
            105 IT_PROG
            106 IT_PROG
            107 IT_PROG
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            108 FI_MGR
            109 FI_ACCOUNT
            110 FI_ACCOUNT
            111 FI_ACCOUNT
            112 FI_ACCOUNT
            113 FI_ACCOUNT
            114 PU_MAN
    
            114 ST_CLERK
            115 PU_CLERK
            116 PU_CLERK
            117 PU_CLERK
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            118 PU_CLERK
            119 PU_CLERK
            120 ST_MAN
            121 ST_MAN
            122 ST_MAN
            122 ST_CLERK
            123 ST_MAN
            124 ST_MAN
            125 ST_CLERK
            126 ST_CLERK
            127 ST_CLERK
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            128 ST_CLERK
            129 ST_CLERK
            130 ST_CLERK
            131 ST_CLERK
            132 ST_CLERK
            133 ST_CLERK
            134 ST_CLERK
            135 ST_CLERK
            136 ST_CLERK
            137 ST_CLERK
            138 ST_CLERK
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            139 ST_CLERK
            140 ST_CLERK
            141 ST_CLERK
            142 ST_CLERK
            143 ST_CLERK
            144 ST_CLERK
            145 SA_MAN
            146 SA_MAN
            147 SA_MAN
            148 SA_MAN
            149 SA_MAN
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            150 SA_REP
            151 SA_REP
            152 SA_REP
            153 SA_REP
            154 SA_REP
            155 SA_REP
            156 SA_REP
            157 SA_REP
            158 SA_REP
            159 SA_REP
            160 SA_REP
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            161 SA_REP
            162 SA_REP
            163 SA_REP
            164 SA_REP
            165 SA_REP
            166 SA_REP
            167 SA_REP
            168 SA_REP
            169 SA_REP
            170 SA_REP
            171 SA_REP
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            172 SA_REP
            173 SA_REP
            174 SA_REP
            175 SA_REP
            176 SA_REP
            176 SA_MAN
            176 SA_REP
            177 SA_REP
            178 SA_REP
            179 SA_REP
            180 SH_CLERK
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            181 SH_CLERK
            182 SH_CLERK
            183 SH_CLERK
            184 SH_CLERK
            185 SH_CLERK
            186 SH_CLERK
            187 SH_CLERK
            188 SH_CLERK
            189 SH_CLERK
            190 SH_CLERK
            191 SH_CLERK
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            192 SH_CLERK
            193 SH_CLERK
            194 SH_CLERK
            195 SH_CLERK
            196 SH_CLERK
            197 SH_CLERK
            198 SH_CLERK
            199 SH_CLERK
            200 AD_ASST
            200 AD_ASST
            200 AC_ACCOUNT
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            201 MK_MAN
            201 MK_REP
            202 MK_REP
            203 HR_REP
            204 PR_REP
            205 AC_MGR
            206 AC_ACCOUNT
    
    117 rows selected.

    INTERSECT Operator

    Using the INTERSECT Operator

    • Display the employee IDs and IDs of those employees who currently have a job tilte that is the same as their previous one(that is,the changed jobs but have gone back to doing the same job they did previously).
    View Code
    SQL> SELECT employee_id,job_id
      2  FROM employees
      3  INTERSECT
      4  SELECT employee_id,job_id
      5  FROM job_history;
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            176 SA_REP
            200 AD_ASST

    /*
     查询出来的交集,说明employees、job_history表中都存在记录.
    */

    MINUS Operator

    Using the MINUS Operator

    • Display the employee IDs of those employees who have not changed their jobs even once.
    View Code
    SQL> SELECT employee_id,job_id FROM employees
      2  MINUS
      3  SELECT employee_id,job_id FROM job_history;
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            100 AD_PRES
            101 AD_VP
            102 AD_VP
            103 IT_PROG
            104 IT_PROG
            105 IT_PROG
            106 IT_PROG
            107 IT_PROG
            108 FI_MGR
            109 FI_ACCOUNT
            110 FI_ACCOUNT
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            111 FI_ACCOUNT
            112 FI_ACCOUNT
            113 FI_ACCOUNT
            114 PU_MAN
            115 PU_CLERK
            116 PU_CLERK
            117 PU_CLERK
            118 PU_CLERK
            119 PU_CLERK
            120 ST_MAN
            121 ST_MAN
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            122 ST_MAN
            123 ST_MAN
            124 ST_MAN
            125 ST_CLERK
            126 ST_CLERK
            127 ST_CLERK
            128 ST_CLERK
            129 ST_CLERK
            130 ST_CLERK
            131 ST_CLERK
            132 ST_CLERK
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            133 ST_CLERK
            134 ST_CLERK
            135 ST_CLERK
            136 ST_CLERK
            137 ST_CLERK
            138 ST_CLERK
            139 ST_CLERK
            140 ST_CLERK
            141 ST_CLERK
            142 ST_CLERK
            143 ST_CLERK
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            144 ST_CLERK
            145 SA_MAN
            146 SA_MAN
            147 SA_MAN
            148 SA_MAN
            149 SA_MAN
            150 SA_REP
            151 SA_REP
            152 SA_REP
            153 SA_REP
            154 SA_REP
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            155 SA_REP
            156 SA_REP
            157 SA_REP
            158 SA_REP
            159 SA_REP
            160 SA_REP
            161 SA_REP
            162 SA_REP
            163 SA_REP
            164 SA_REP
            165 SA_REP
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            166 SA_REP
            167 SA_REP
            168 SA_REP
            169 SA_REP
            170 SA_REP
            171 SA_REP
            172 SA_REP
            173 SA_REP
            174 SA_REP
            175 SA_REP
            177 SA_REP
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            178 SA_REP
            179 SA_REP
            180 SH_CLERK
            181 SH_CLERK
            182 SH_CLERK
            183 SH_CLERK
            184 SH_CLERK
            185 SH_CLERK
            186 SH_CLERK
            187 SH_CLERK
            188 SH_CLERK
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            189 SH_CLERK
            190 SH_CLERK
            191 SH_CLERK
            192 SH_CLERK
            193 SH_CLERK
            194 SH_CLERK
            195 SH_CLERK
            196 SH_CLERK
            197 SH_CLERK
            198 SH_CLERK
            199 SH_CLERK
    
    EMPLOYEE_ID JOB_ID
    ----------- ----------
            201 MK_MAN
            202 MK_REP
            203 HR_REP
            204 PR_REP
            205 AC_MGR
            206 AC_ACCOUNT
    
    105 rows selected.

    Matching the SELECT Statements

    • Using the UNION operator,display the location ID,department name,and the state where it is located.
    • You must match the data type(using the TO_CHAR function or any other conversion functions) when columns do not exist in one ore the other table.
    View Code
    SQL> SELECT location_id,department_name "Department",TO_CHAR(NULL) "Warehouse location" FROM departments
      2  UNION
      3  SELECT location_id,TO_CHAR(NULL) "Department",state_province FROM locations;
    
    LOCATION_ID Department                     Warehouse location
    ----------- ------------------------------ -------------------------
           1000
           1100
           1200                                Tokyo Prefecture
           1300
           1400 IT
           1400                                Texas
           1500 Shipping
           1500                                California
           1600                                New Jersey
           1700 Accounting
           1700 Administration
    
    LOCATION_ID Department                     Warehouse location
    ----------- ------------------------------ -------------------------
           1700 Benefits
           1700 Construction
           1700 Contracting
           1700 Control And Credit
           1700 Corporate Tax
           1700 Executive
           1700 Finance
           1700 Government Sales
           1700 IT Helpdesk
           1700 IT Support
           1700 Manufacturing
    
    LOCATION_ID Department                     Warehouse location
    ----------- ------------------------------ -------------------------
           1700 NOC
           1700 Operations
           1700 Payroll
           1700 Purchasing
           1700 Recruiting
           1700 Retail Sales
           1700 Shareholder Services
           1700 Treasury
           1700                                Washington
           1800 Marketing
           1800                                Ontario
    
    LOCATION_ID Department                     Warehouse location
    ----------- ------------------------------ -------------------------
           1900                                Yukon
           2000
           2100                                Maharashtra
           2200                                New South Wales
           2300
           2400 Human Resources
           2400
           2500 Sales
           2500                                Oxford
           2600                                Manchester
           2700 Public Relations
    
    LOCATION_ID Department                     Warehouse location
    ----------- ------------------------------ -------------------------
           2700                                Bavaria
           2800                                Sao Paulo
           2900                                Geneve
           3000                                BE
           3100                                Utrecht
           3200                                Distrito Federal,
    
    50 rows selected.

    Matching the SELECT Statement:Example

    • Using the UNION operator,display the employee_id,job_id,and salary of all employees.
    View Code
    SQL> SELECT employee_id,job_id,salary FROM employees
      2  UNION
      3  SELECT employee_id,job_id,0 FROM job_history;
    
    EMPLOYEE_ID JOB_ID         SALARY
    ----------- ---------- ----------
            100 AD_PRES         24000
            101 AC_ACCOUNT          0
            101 AC_MGR              0
            101 AD_VP           17000
            102 AD_VP           17000
            102 IT_PROG             0
            103 IT_PROG          9000
            104 IT_PROG          6000
            105 IT_PROG          4800
            106 IT_PROG          4800
            107 IT_PROG          4200
    
    EMPLOYEE_ID JOB_ID         SALARY
    ----------- ---------- ----------
            108 FI_MGR          12008
            109 FI_ACCOUNT       9000
            110 FI_ACCOUNT       8200
            111 FI_ACCOUNT       7700
            112 FI_ACCOUNT       7800
            113 FI_ACCOUNT       6900
            114 PU_MAN          11000
            114 ST_CLERK            0
            115 PU_CLERK         3100
            116 PU_CLERK         2900
            117 PU_CLERK         2800
    
    EMPLOYEE_ID JOB_ID         SALARY
    ----------- ---------- ----------
            118 PU_CLERK         2600
            119 PU_CLERK         2500
            120 ST_MAN           8000
            121 ST_MAN           8200
            122 ST_CLERK            0
            122 ST_MAN           7900
            123 ST_MAN           6500
            124 ST_MAN           5800
            125 ST_CLERK         3200
            126 ST_CLERK         2700
            127 ST_CLERK         2400
    
    EMPLOYEE_ID JOB_ID         SALARY
    ----------- ---------- ----------
            128 ST_CLERK         2200
            129 ST_CLERK         3300
            130 ST_CLERK         2800
            131 ST_CLERK         2500
            132 ST_CLERK         2100
            133 ST_CLERK         3300
            134 ST_CLERK         2900
            135 ST_CLERK         2400
            136 ST_CLERK         2200
            137 ST_CLERK         3600
            138 ST_CLERK         3200
    
    EMPLOYEE_ID JOB_ID         SALARY
    ----------- ---------- ----------
            139 ST_CLERK         2700
            140 ST_CLERK         2500
            141 ST_CLERK         3500
            142 ST_CLERK         3100
            143 ST_CLERK         2600
            144 ST_CLERK         2500
            145 SA_MAN          14000
            146 SA_MAN          13500
            147 SA_MAN          12000
            148 SA_MAN          11000
            149 SA_MAN          10500
    
    EMPLOYEE_ID JOB_ID         SALARY
    ----------- ---------- ----------
            150 SA_REP          10000
            151 SA_REP           9500
            152 SA_REP           9000
            153 SA_REP           8000
            154 SA_REP           7500
            155 SA_REP           7000
            156 SA_REP          10000
            157 SA_REP           9500
            158 SA_REP           9000
            159 SA_REP           8000
            160 SA_REP           7500
    
    EMPLOYEE_ID JOB_ID         SALARY
    ----------- ---------- ----------
            161 SA_REP           7000
            162 SA_REP          10500
            163 SA_REP           9500
            164 SA_REP           7200
            165 SA_REP           6800
            166 SA_REP           6400
            167 SA_REP           6200
            168 SA_REP          11500
            169 SA_REP          10000
            170 SA_REP           9600
            171 SA_REP           7400
    
    EMPLOYEE_ID JOB_ID         SALARY
    ----------- ---------- ----------
            172 SA_REP           7300
            173 SA_REP           6100
            174 SA_REP          11000
            175 SA_REP           8800
            176 SA_MAN              0
            176 SA_REP              0
            176 SA_REP           8600
            177 SA_REP           8400
            178 SA_REP           7000
            179 SA_REP           6200
            180 SH_CLERK         3200
    
    EMPLOYEE_ID JOB_ID         SALARY
    ----------- ---------- ----------
            181 SH_CLERK         3100
            182 SH_CLERK         2500
            183 SH_CLERK         2800
            184 SH_CLERK         4200
            185 SH_CLERK         4100
            186 SH_CLERK         3400
            187 SH_CLERK         3000
            188 SH_CLERK         3800
            189 SH_CLERK         3600
            190 SH_CLERK         2900
            191 SH_CLERK         2500
    
    EMPLOYEE_ID JOB_ID         SALARY
    ----------- ---------- ----------
            192 SH_CLERK         4000
            193 SH_CLERK         3900
            194 SH_CLERK         3200
            195 SH_CLERK         2800
            196 SH_CLERK         3100
            197 SH_CLERK         3000
            198 SH_CLERK         2600
            199 SH_CLERK         2600
            200 AC_ACCOUNT          0
            200 AD_ASST             0
            200 AD_ASST          4400
    
    EMPLOYEE_ID JOB_ID         SALARY
    ----------- ---------- ----------
            201 MK_MAN          13000
            201 MK_REP              0
            202 MK_REP           6000
            203 HR_REP           6500
            204 PR_REP          10000
            205 AC_MGR          12008
            206 AC_ACCOUNT       8300
    
    117 rows selected.

    Using the ORDER BY Clause in Set Operations

    • The ORDER BY clause can appear only once at the end of the compound query.
    • Component queries cannot have individual ORDER BY clauses.
    • ORDER BY clause recognizes only the columns of the first SELECT query.
    • By default,the first column of the first SELECT query is used to sort the output in an ascending order.
    set_opt_sort_01
    SELECT location_id,department_name "Dep",TO_CHAR(NULL) "Location" FROM departments ORDER BY location_id
    UNION
    SELECT location_id,TO_CHAR(NULL) "Dep",state_province "Location" FROM locations ORDER BY state_province;
    
    #execute results:
    #SQL> @/RealData/oracle/scripts/set_opt_sort_error.sql
    #UNION
    #*
    #ERROR at line 2:
    #ORA-00933: SQL command not properly ended
    ~
    set_opt_sort_02
    SELECT location_id,department_name "Dep",TO_CHAR(NULL) "Location" FROM departments
    UNION
    SELECT location_id,TO_CHAR(NULL) "Dep",state_province "Location" FROM locations ORDER BY state_province;
    
    #executes results
    #SQL> @/RealData/oracle/scripts/set_opt_sort_right.sql
    #SELECT location_id,TO_CHAR(NULL) "Dep",state_province "Location" FROM locations ORDER BY state_province
                                                                                             *
    #ERROR at line 3:
    #ORA-00904: "STATE_PROVINCE": invalid identifier
    #说明ORDER BY 的字段必须是以第一个查询的字段进行选择,而不能选择其他的查询List.
    set_opt_sort_03
    SELECT location_id,department_name "Dep",TO_CHAR(NULL) "Location" FROM departments
    UNION
    SELECT location_id,TO_CHAR(NULL) "Dep",state_province "Location" FROM locations ORDER BY 2;

    Summary

    In this lesson,you should have learned how to use:

    • UNION to return all distinct rows
    • UNION ALL return all rows,including duplicates.
    • INTERSECT to return all rows that are shared by both queries
    • MINUS to return all distinct rows that are selected by the first query,bu not by the second.
    • ORDER BY only at the very end of the statement.
  • 相关阅读:
    正经学C#_循环[do while,while,for]:[c#入门经典]
    Vs 控件错位 右侧资源管理器文件夹点击也不管用,显示异常
    asp.net core 获取当前请求的url
    在实体对象中访问导航属性里的属性值出现异常“There is already an open DataReader associated with this Command which must be
    用orchard core和asp.net core 3.0 快速搭建博客,解决iis 部署https无法登录后台问题
    System.Data.Entity.Core.EntityCommandExecution The data reader is incompatible with the specified
    初探Java设计模式3:行为型模式(策略,观察者等)
    MySQL教程77-CROSS JOIN 交叉连接
    MySQL教程76-HAVING 过滤分组
    MySQL教程75-使用GROUP BY分组查询
  • 原文地址:https://www.cnblogs.com/arcer/p/3024539.html
Copyright © 2020-2023  润新知