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.
原文地址:https://www.cnblogs.com/arcer/p/3024539.html