54.Oracle数据库SQL开发之 高级查询——使用集合操作符
集合操作符有如下图1 :
使用集合操作符的时候,必须牢记一个限制条件:所有查询返回的列数以及列的类型必须匹配,但列名可以不同。
执行如下:
store@PDB1> select product_id,product_type_id,namefrom products;
PRODUCT_ID PRODUCT_TYPE_ID NAME
---------- --------------- ------------------------------
1 1 Modern Science
2 1 Chemistry
3 2 Supernova
4 2 Tank War
5 2 Z Files
6 2 2412: The Return
7 3 Space Force 9
8 3 From Another Planet
9 4 Classical Music
10 4 Pop 3
11 4 Creative Yell
12 My Front Line
12 rows selected.
从more_products表中检索prd_id,prd_type_id和name列:
store@PDB1> select prd_id,prd_type_id,name frommore_products;
PRD_ID PRD_TYPE_ID NAME
---------- -----------------------------------------
1 1 Modern Science
2 1 Chemistry
3 Supernova
4 2 Lunar Landing
5 2 Submarine
1. 使用UNION ALL操作符
UNION ALL操作符返回查询检索出的所有行,包括重复行。
例如:
store@PDB1> select product_id,product_type_id,namefrom products union all select prd_id,prd_type_id,name from more_products;
PRODUCT_ID PRODUCT_TYPE_ID NAME
---------- ---------------------------------------------
1 1 Modern Science
2 1 Chemistry
3 2 Supernova
4 2 Tank War
5 2 Z Files
6 2 2412: The Return
7 3 Space Force 9
8 3 From Another Planet
9 4 Classical Music
10 4 Pop 3
11 4 Creative Yell
12 My Front Line
1 1 Modern Science
2 1 Chemistry
3 Supernova
4 2 Lunar Landing
5 2 Submarine
17 rows selected.
使用ORDER BY 子句根据两个查询中列的位置对行排序。
store@PDB1> select product_id,product_type_id,namefrom products union all select prd_id,prd_type_id,name from more_products orderby 1;
PRODUCT_ID PRODUCT_TYPE_ID NAME
---------- ---------------------------------------------
1 1 Modern Science
1 1 Modern Science
2 1 Chemistry
2 1 Chemistry
3 2 Supernova
3 Supernova
4 2 Tank War
4 2 Lunar Landing
5 2 Submarine
5 2 Z Files
6 2 2412: The Return
7 3 Space Force 9
8 3 From Another Planet
9 4 Classical Music
10 4 Pop 3
11 4 Creative Yell
12 My Front Line
17 rows selected.
根据第一列进行排序。
2. 使用UNION操作符
UNION操作符返回查询检索出的所有非重复行。
store@PDB1> select product_id,product_type_id,namefrom products union select prd_id,prd_type_id,name from more_products;
PRODUCT_ID PRODUCT_TYPE_ID NAME
---------- ---------------------------------------------
1 1 Modern Science
2 1 Chemistry
3 2 Supernova
3 Supernova
4 2 Lunar Landing
4 2 Tank War
5 2 Submarine
5 2 Z Files
6 2 2412: The Return
7 3 Space Force 9
8 3 From Another Planet
9 4 Classical Music
10 4 Pop 3
11 4 Creative Yell
12 My Front Line
15 rows selected.
3. 使用INTERSECT操作符
INTERSECT操作符返回两个查询检索出的共有行。
store@PDB1> select product_id,product_type_id,namefrom products intersect select prd_id,prd_type_id,name from more_products;
PRODUCT_ID PRODUCT_TYPE_ID NAME
---------- ---------------------------------------------
1 1 Modern Science
2 1 Chemistry
4. 使用MINUS操作符
MINUS操作符返回将第二个查询检索出的行从第一个查询检索出的行中减去之后剩余的行。
store@PDB1> select product_id,product_type_id,namefrom products minus select prd_id,prd_type_id,name from more_products;
PRODUCT_ID PRODUCT_TYPE_ID NAME
---------- ---------------------------------------------
3 2 Supernova
4 2 Tank War
5 2 Z Files
6 2 2412: The Return
7 3 Space Force 9
8 3 From Another Planet
9 4 Classical Music
10 4 Pop 3
11 4 Creative Yell
12 My Front Line
10 rows selected.
5. 组合使用集合操作符
可以使用多个集合操作符将两个以上的查询组合起来,一个操作符的返回值再提供给下一个操作符使用。默认条件下,集合操作符的求值顺序是从上至下,但是为了防止ORACLE公司将来发布新版本时改变默认的运行模式,应该用圆括号指示正确的顺序。
例如:
store@PDB1> select product_id,product_type_id,namefrom product_changes;
PRODUCT_ID PRODUCT_TYPE_ID NAME
---------- --------------- ------------------------------
1 1 Modern Science
2 1 New Chemistry
3 1 Supernova
13 2 Lunar Landing
14 2 Submarine
15 2 Airplane
6 rows selected.
执行如下组合:
store@PDB1> (selectproduct_id,product_type_id,name from products union select prd_id,prd_type_id,namefrom more_products) intersect select product_id,product_type_id,name fromproduct_changes;
PRODUCT_ID PRODUCT_TYPE_ID NAME
---------- ---------------------------------------------
1 1 Modern Science