第 17 章 組合查詢
17.1 組合查詢
MySQL 允許執(zhí)行多個查詢(多條 SELECT 語句),并將結果作為單個查詢集返回
17.2 創(chuàng)建組合查詢
可用 UNION 操作符來組合數條 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 語句,并把輸出組合成單個查詢結果集
17.2.2 UNION 規(guī)則
1. UNION 必須由兩條或兩條以上的 SELECT 語句組成,語句之間用 UNION 分隔
2. UNION 中的每個查詢必須包含相同的列、表達式或聚集函數(不管各個列不需要以相同的次序列出)
3. 列數據類型必須兼容:類型不必完全相同,但必須是 DBMS 可用隱含地轉換的類型(例如,不同的數值類型或不同的日期類型)
17.2.3 包含或取消重復的行
輸入: 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 默認自動去除了重復的行,可使用 UNION ALL 返回所有匹配的行
17.2.4 對組合查詢結果排序
輸入: 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 組合查詢時,只能使用一條 ODER BY 子句,它必須出現在最后一條 SELECT 語句之后。但實際上 MySQL 將用它來排序所有 SELECT 語句返回的所有結果