第 17 章 組合查詢
17.1 組合查詢
MySQL 允許執(zhí)行多個(gè)查詢(多條 SELECT 語(yǔ)句),并將結(jié)果作為單個(gè)查詢集返回
17.2 創(chuàng)建組合查詢
可用 UNION 操作符來(lái)組合數(shù)條 SQL 查詢
17.2.1 使用 UNION
輸入: SELECT user.USER FROM user UNION SELECT global_grants.USER FROM global_grants;
輸出:
+------------------+
| USER ? ? ? ? ? ? |
+------------------+
| root ? ? ? ? ? ? |
| mysql.infoschema |
| mysql.session ? ?|
| mysql.sys ? ? ? ?|
+------------------+
分析: UNION 指示 MySQL 執(zhí)行兩條 SELECT 語(yǔ)句,并把輸出組合成單個(gè)查詢結(jié)果集
17.2.2 UNION 規(guī)則
1. UNION 必須由兩條或兩條以上的 SELECT 語(yǔ)句組成,語(yǔ)句之間用 UNION 分隔
2. UNION 中的每個(gè)查詢必須包含相同的列、表達(dá)式或聚集函數(shù)(不管各個(gè)列不需要以相同的次序列出)
3. 列數(shù)據(jù)類(lèi)型必須兼容:類(lèi)型不必完全相同,但必須是 DBMS 可用隱含地轉(zhuǎn)換的類(lèi)型(例如,不同的數(shù)值類(lèi)型或不同的日期類(lèi)型)
17.2.3 包含或取消重復(fù)的行
輸入: SELECT user.USER FROM user UNION ALL SELECT global_grants.USER FROM global_grants;
輸出:
+------------------+
| USER ? ? ? ? ? ? |
+------------------+
| root ? ? ? ? ? ? |
| mysql.infoschema |
| mysql.session ? ?|
| mysql.sys ? ? ? ?|
| mysql.infoschema |
| mysql.session ? ?|
| mysql.session ? ?|
| mysql.session ? ?|
| mysql.session ? ?|
| mysql.session ? ?|
| mysql.session ? ?|
| mysql.session ? ?|
| mysql.sys ? ? ? ?|
| root ? ? ? ? ? ? |
| root ? ? ? ? ? ? |
| root ? ? ? ? ? ? |
| root ? ? ? ? ? ? |
| root ? ? ? ? ? ? |
| root ? ? ? ? ? ? |
| root ? ? ? ? ? ? |
| root ? ? ? ? ? ? |
| root ? ? ? ? ? ? |
| root ? ? ? ? ? ? |
| root ? ? ? ? ? ? |
| root ? ? ? ? ? ? |
| root ? ? ? ? ? ? |
| root ? ? ? ? ? ? |
| root ? ? ? ? ? ? |
| root ? ? ? ? ? ? |
| root ? ? ? ? ? ? |
| root ? ? ? ? ? ? |
| root ? ? ? ? ? ? |
| root ? ? ? ? ? ? |
| root ? ? ? ? ? ? |
| root ? ? ? ? ? ? |
| root ? ? ? ? ? ? |
| root ? ? ? ? ? ? |
| root ? ? ? ? ? ? |
| root ? ? ? ? ? ? |
| root ? ? ? ? ? ? |
| root ? ? ? ? ? ? |
| root ? ? ? ? ? ? |
+------------------+
分析: UNION 默認(rèn)自動(dòng)去除了重復(fù)的行,可使用 UNION ALL 返回所有匹配的行
17.2.4 對(duì)組合查詢結(jié)果排序
輸入: SELECT user.USER FROM user UNION SELECT global_grants.USER FROM global_grants ORDER BY USER;
輸出:
+------------------+
| USER ? ? ? ? ? ? |
+------------------+
| mysql.infoschema |
| mysql.session ? ?|
| mysql.sys ? ? ? ?|
| root ? ? ? ? ? ? |
+------------------+
分析: 在用 UNION 組合查詢時(shí),只能使用一條 ODER BY 子句,它必須出現(xiàn)在最后一條 SELECT 語(yǔ)句之后。但實(shí)際上 MySQL 將用它來(lái)排序所有 SELECT 語(yǔ)句返回的所有結(jié)果