首頁 > 軟體

MySQL資料庫之聯合查詢 union

2022-06-01 14:06:14

前言:

將多個查詢結果的結果集合併到一起(縱向合併),欄位數不變,多個查詢結果的記錄數合併

1、應用場景

  • 同一張表中不同結果合併到一起展示:男生升高升序,女生升高降序
  • 資料量較大的表,進行分表操作,將每張表的資料合併起來顯示

2、基本語法

select 語句
union [union 選項]
select 語句;

union 選項 和select 選項基本一致

  • distinct 去重,預設
  • all 儲存所有結果
mysql> select * from my_student;
+----+--------+----------+------+--------+
| id | name   | class_id | age  | gender |
+----+--------+----------+------+--------+
|  1 | 劉備   |        1 |   18 |      2 |
|  2 | 李四   |        1 |   19 |      1 |
|  3 | 王五   |        2 |   20 |      2 |
|  7 | 張飛   |        2 |   21 |      1 |
|  8 | 關羽   |        1 |   22 |      2 |
|  9 | 曹操   |        1 |   20 |   NULL |
+----+--------+----------+------+--------+

-- 預設選項:distinct
select * from my_student
union
select * from my_student;
+----+--------+----------+------+--------+
| id | name   | class_id | age  | gender |
+----+--------+----------+------+--------+
|  1 | 劉備   |        1 |   18 |      2 |
|  2 | 李四   |        1 |   19 |      1 |
|  3 | 王五   |        2 |   20 |      2 |
|  7 | 張飛   |        2 |   21 |      1 |
|  8 | 關羽   |        1 |   22 |      2 |
|  9 | 曹操   |        1 |   20 |   NULL |
+----+--------+----------+------+--------+


select * from my_student
union all
select * from my_student;
+----+--------+----------+------+--------+
| id | name   | class_id | age  | gender |
+----+--------+----------+------+--------+
|  1 | 劉備   |        1 |   18 |      2 |
|  2 | 李四   |        1 |   19 |      1 |
|  3 | 王五   |        2 |   20 |      2 |
|  7 | 張飛   |        2 |   21 |      1 |
|  8 | 關羽   |        1 |   22 |      2 |
|  9 | 曹操   |        1 |   20 |   NULL |
|  1 | 劉備   |        1 |   18 |      2 |
|  2 | 李四   |        1 |   19 |      1 |
|  3 | 王五   |        2 |   20 |      2 |
|  7 | 張飛   |        2 |   21 |      1 |
|  8 | 關羽   |        1 |   22 |      2 |
|  9 | 曹操   |        1 |   20 |   NULL |
+----+--------+----------+------+--------+

-- 只需要保證欄位數量一樣,不需要每次拿到的資料型別都一樣
-- 只保留第一個select的欄位名
select id, name, age from my_student
union all
select name, id, age  from my_student;
+--------+--------+------+
| id     | name   | age  |
+--------+--------+------+
| 1      | 劉備   |   18 |
| 2      | 李四   |   19 |
| 3      | 王五   |   20 |
| 7      | 張飛   |   21 |
| 8      | 關羽   |   22 |
| 9      | 曹操   |   20 |
| 劉備   | 1      |   18 |
| 李四   | 2      |   19 |
| 王五   | 3      |   20 |
| 張飛   | 7      |   21 |
| 關羽   | 8      |   22 |
| 曹操   | 9      |   20 |
+--------+--------+------+

3、order by的使用

聯合查詢中,使用order by, select語句必須使用括號

(select * from my_student where gender = 1 order by age desc)
union
(select * from my_student where gender = 2 order by age asc);
+----+--------+----------+------+--------+
| id | name   | class_id | age  | gender |
+----+--------+----------+------+--------+
|  2 | 李四   |        1 |   19 |      1 |
|  7 | 張飛   |        2 |   21 |      1 |
|  1 | 劉備   |        1 |   18 |      2 |
|  3 | 王五   |        2 |   20 |      2 |
|  8 | 關羽   |        1 |   22 |      2 |
+----+--------+----------+------+--------+

-- order by 要生效,必須使用limit 通常大於表的記錄數
(select * from my_student where gender = 1 order by age desc limit 10)
union
(select * from my_student where gender = 2 order by age asc limit 10);
+----+--------+----------+------+--------+
| id | name   | class_id | age  | gender |
+----+--------+----------+------+--------+
|  7 | 張飛   |        2 |   21 |      1 |
|  2 | 李四   |        1 |   19 |      1 |
|  1 | 劉備   |        1 |   18 |      2 |
|  3 | 王五   |        2 |   20 |      2 |
|  8 | 關羽   |        1 |   22 |      2 |
+----+--------+----------+------+--------+

到此這篇關於MySQL資料庫之聯合查詢 union的文章就介紹到這了,更多相關MySQL聯合查詢 union內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com