鍍金池/ 教程/ 數(shù)據(jù)庫/ MariaDB Union All運(yùn)算符
MariaDB比較運(yùn)算符
MariaDB查詢數(shù)據(jù)
MariaDB Like子句
MariaDB Sum()函數(shù)
MariaDB過程
MariaDB限制返回記錄
MariaDB Count()函數(shù)
MariaDB更新數(shù)據(jù)
MariaDB導(dǎo)出數(shù)據(jù)
MariaDB Intersect運(yùn)算符
MariaDB函數(shù)
MariaDB Min()函數(shù)
MariaDB創(chuàng)建數(shù)據(jù)庫
MariaDB Avg()函數(shù)
MariaDB刪除數(shù)據(jù)
MariaDB條件
MariaDB功能特點(diǎn)
MariaDB創(chuàng)建表
MariaDB左外連接
MariaDB Union運(yùn)算符
MariaDB安裝
MariaDB選擇數(shù)據(jù)庫
MariaDB Max()函數(shù)
MariaDB Where子句
MariaDB右外連接
MariaDB內(nèi)連接
MariaDB截?cái)啾?/span>
MariaDB Order By子句
MariaDB教程
MariaDB正則表達(dá)式
MariaDB Union All運(yùn)算符
MariaDB Distinct子句
MariaDB修改表
MariaDB刪除表
MariaDB插入數(shù)據(jù)
MariaDB From子句
MariaDB刪除數(shù)據(jù)庫
MariaDB簡介
MariaDB數(shù)據(jù)類型

MariaDB Union All運(yùn)算符

MariaDB UNION ALL操作符與UNION操作符相同,但不會刪除重復(fù)的記錄。它返回查詢中的所有行,并且不刪除各種SELECT語句之間的重復(fù)行。

語法

SELECT expression1, expression2, ... expression_n  
FROM tables  
[WHERE conditions]  
UNION ALL  
SELECT expression1, expression2, ... expression_n  
FROM tables  
[WHERE conditions];

注意:UNION All運(yùn)算符中的每個SELECT語句在具有相似數(shù)據(jù)類型的結(jié)果集中必須具有相同數(shù)量的字段。

1. 使用UNION ALL操作符返回單個字段

下面來看一個從多個SELECT語句返回一個字段的UNION運(yùn)算符的例子。(兩個表具有相同的公共字段)。

假設(shè)有兩張表:studentsteachers。對應(yīng)的表結(jié)構(gòu)和數(shù)據(jù)如下 -

students表中的數(shù)據(jù):

MariaDB [testdb]> select * from students;
+------------+--------------+-----------------+----------------+
| student_id | student_name | student_address | admission_date |
+------------+--------------+-----------------+----------------+
|          1 | Maxsu        | Haikou          | 2017-01-07     |
|          2 | JMaster      | Beijing         | 2016-05-07     |
|          3 | Mahesh       | Guangzhou       | 2016-06-07     |
|          4 | Kobe         | Shanghai        | 2016-02-07     |
|          5 | Blaba        | Shenzhen        | 2016-08-07     |
+------------+--------------+-----------------+----------------+
5 rows in set (0.00 sec)

teachers表中的數(shù)據(jù):

USE testdb;
DROP TABLE teachers;
CREATE TABLE teachers(  
    teacher_id INT NOT NULL AUTO_INCREMENT,  
    name VARCHAR(100) NOT NULL,  
    address VARCHAR(40) NOT NULL,  
    admission_date DATE,  
    PRIMARY KEY ( teacher_id )
);
-- 插入數(shù)據(jù)
INSERT INTO teachers  
(teacher_id, name, address, admission_date)  
VALUES(1,'Maxsu','Haikou','2013-06-07 00:00:00');

INSERT INTO teachers  
(teacher_id, name, address, admission_date)  
VALUES(2,'張?zhí)旖?jīng)','廣州','2013-08-08 00:00:00');

INSERT INTO teachers  
(teacher_id, name, address, admission_date)  
VALUES(3,'李四光','三亞','2014-09-07 00:00:00');

經(jīng)過上創(chuàng)建和插入數(shù)據(jù),現(xiàn)在teachers表中擁有以下數(shù)據(jù)記錄 -

MariaDB [testdb]> select * from teachers;
+------------+--------+---------+----------------+
| teacher_id | name   | address | admission_date |
+------------+--------+---------+----------------+
|          1 | Maxsu  | Haikou  | 2013-06-07     |
|          2 | 張?zhí)旖?jīng) | 廣州    | 2013-08-08     |
|          3 | 李四光 | 三亞    | 2014-09-07     |
+------------+--------+---------+----------------+
3 rows in set (0.00 sec)

假設(shè)現(xiàn)在要查詢所有學(xué)生和老師的姓名,以及他們的地址,可參考以下查詢語句 -

SELECT student_name AS name, student_address as address
FROM Students
UNION ALL
SELECT name,address
FROM teachers;

執(zhí)行上面查詢語句,得到以下結(jié)果 -

MariaDB [testdb]> SELECT student_name AS name, student_address as address
    -> FROM Students
    -> UNION ALL
    -> SELECT name,address
    -> FROM teachers;
+---------+-----------+
| name    | address   |
+---------+-----------+
| Maxsu   | Haikou    |
| JMaster | Beijing   |
| Mahesh  | Guangzhou |
| Kobe    | Shanghai  |
| Blaba   | Shenzhen  |
| Maxsu   | Haikou    |
| 張?zhí)旖?jīng)  | 廣州      |
| 李四光  | 三亞      |
+---------+-----------+
8 rows in set (0.00 sec)

注:如果這里不使用UNION ALL,而是使用UNION,那么查詢結(jié)果是什么?

它顯示了兩個表中重復(fù)的name列的值 - 'Maxsu'

2. 具有ORDER BY子句的UNION運(yùn)算符

使用ORDER BY子句的UNION運(yùn)算符從兩個表中檢索多個列。參考以下語句 -

SELECT student_id, student_name  
FROM Students  
WHERE student_name = 'Maxsu'  
UNION  ALL
SELECT teacher_id, address
FROM teachers  
WHERE teacher_id < 3 
ORDER BY 1;

執(zhí)行上面示例代碼,得到以下結(jié)果 -

MariaDB [testdb]> SELECT student_id, student_name
    -> FROM Students
    -> WHERE student_name = 'Maxsu'
    -> UNION  ALL
    -> SELECT teacher_id, address
    -> FROM teachers
    -> WHERE teacher_id < 3
    -> ORDER BY 1;
+------------+--------------+
| student_id | student_name |
+------------+--------------+
|          1 | Haikou       |
|          1 | Maxsu        |
|          2 | 廣州         |
+------------+--------------+
3 rows in set (0.00 sec)

3. 一些其它的用法

具有不同列名的表之間的UNION:

(SELECT e_name AS name, email FROM employees)
UNION ALL
(SELECT c_name AS name, email FROM customers);

指定UNION的全局順序并限制總行數(shù):

(SELECT name, email FROM employees)
UNION ALL
(SELECT name, email FROM customers)
ORDER BY name LIMIT 10;

添加一個常數(shù)行:

(SELECT 'John Doe' AS name, 'john.doe@example.net' AS email)
UNION ALL
(SELECT name, email FROM customers);

不同的類型:

SELECT CAST('x' AS CHAR(1)) UNION ALL SELECT REPEAT('y',4);
+----------------------+
| CAST('x' AS CHAR(1)) |
+----------------------+
| x                    |
| yyyy                 |
+----------------------+

按照每個SELECT使用排序列的順序返回結(jié)果:

(SELECT 1 AS sort_column, e_name AS name, email FROM employees)
UNION ALL
(SELECT 2, c_name AS name, email FROM customers) ORDER BY sort_column;