1. 程式人生 > >Mysql聯合查詢UNION和UNION ALL的使用介紹

Mysql聯合查詢UNION和UNION ALL的使用介紹

組合 ans per ext 輸入 and nbsp 理解 des

一、UNION和UNION ALL的作用和語法

UNION 用於合並兩個或多個 SELECT 語句的結果集,並消去表中任何重復行。
UNION 內部的 SELECT 語句必須擁有相同數量的列,列也必須擁有相似的數據類型。
同時,每條 SELECT 語句中的列的順序必須相同.
SQL UNION 語法:

復制代碼 代碼如下: SELECT column_name FROM table1
UNION
SELECT column_name FROM table2
註釋:默認地,UNION 操作符選取不同的值。如果允許重復的值,請使用 UNION ALL。
當 ALL 隨 UNION 一起使用時(即 UNION ALL),不消除重復行
SQL UNION ALL 語法
復制代碼
代碼如下: SELECT column_name FROM table1
UNION ALL
SELECT column_name FROM table2
註釋:另外,UNION 結果集中的列名總是等於 UNION 中第一個 SELECT 語句中的列名。
註意:1、UNION 結果集中的列名總是等於第一個 SELECT 語句中的列名
2、UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每條 SELECT 語句中的列的順序必須相同


二、union的用法及註意事項

union:聯合的意思,即把兩次或多次查詢結果合並起來。
要求:兩次查詢的列數必須一致
推薦:列的類型可以不一樣,但推薦查詢的每一列,想對應的類型以一樣
可以來自多張表的數據:多次sql語句取出的列名可以不一致,此時以第一個sql語句的列名為準。
如果不同的語句中取出的行,有完全相同(這裏表示的是每個列的值都相同),那麽union會將相同的行合並,最終只保留一行。也可以這樣理解,union會去掉重復的行。
如果不想去掉重復的行,可以使用union all。
如果子句中有order by,limit,需用括號()包起來。推薦放到所有子句之後,即對最終合並的結果來排序或篩選。
如:

復制代碼 代碼如下: (select * from a order by id) union (select * from b order id);

在子句中,order by 需要配合limit使用才有意義。如果不配合limit使用,會被語法分析器優化分析時去除。

三、學習例子

下面的例子中使用的原始表:
Employees_China:

復制代碼 代碼如下: E_ID E_Name
01 Zhang, Hua
02 Wang, Wei
03 Carter, Thomas
04 Yang, Ming
Employees_USA:
復制代碼 代碼如下: E_ID E_Name
01 Adams, John
02 Bush, George
03 Carter, Thomas
04 Gates, Bill

使用 UNION 命令實例

列出所有在中國和美國的不同的雇員名:

復制代碼 代碼如下: SELECT E_Name FROM Employees_China
UNION
SELECT E_Name FROM Employees_USA
結果:
復制代碼 代碼如下: E_Name
Zhang, Hua
Wang, Wei
Carter, Thomas
Yang, Ming
Adams, John
Bush, George
Gates, Bill
註釋:這個命令無法列出在中國和美國的所有雇員。在上面的例子中,我們有兩個名字相同的雇員,他們當中只有一個人被列出來了。UNION 命令只會選取不同的值。

使用 UNION ALL 命令實例

UNION ALL 命令和 UNION 命令幾乎是等效的,不過 UNION ALL 命令會列出所有的值。

復制代碼 代碼如下: SQL Statement 1
UNION ALL
SQL Statement 2

實例:
列出在中國和美國的所有的雇員:

復制代碼 代碼如下: SELECT E_Name FROM Employees_China
UNION ALL
SELECT E_Name FROM Employees_USA
結果
復制代碼 代碼如下: E_Name
Zhang, Hua
Wang, Wei
Carter, Thomas
Yang, Ming
Adams, John
Bush, George
Carter, Thomas
Gates, Bill


四、項目使用例子

web項目中經常會碰到整站搜索的問題,即客戶希望在網站的搜索框中輸入一個詞語,然後在整個網站中只要包含這個詞的頁面都要出現在搜索結果中。由於一個web項目不可能用一張表就全部搞定的,所以這裏一般都是要用union聯合搜索來解決整個問題的。

下面列舉一下本次使用的union聯合搜索的sql語句:

復制代碼 代碼如下:
select * from

(SELECT `id`,`subject` FROM `article` WHERE `active`=‘1‘ AND `subject` LIKE ‘%調整圖片%‘ ORDER BY `add_time` DESC)

as t1

union all

select * from

(SELECT `id`,`class_name` AS `subject` FROM `web_class` WHERE `active`=‘1‘ AND `class_name` LIKE ‘%調整圖片%‘ ORDER BY `class_id` DESC)

as t2

union

select * from

(SELECT `id`,`subject` FROM `article` WHERE `active`=‘1‘ AND (`subject` LIKE ‘%調整%‘ OR `subject` LIKE ‘%圖片%‘) ORDER BY `add_time` DESC)

as t3;

以上SQL語句的聯合查詢主要用到了union all和union,至於這兩者的區別就是union all會列舉所有符合條件的查詢結果,而union會將所有符合條件的查詢結果做一下去除重復結果的篩選。

對於以上SQL語句的解釋就是由於article表和web_class表分屬兩個不同的表,所以這裏不用去除重復結果。然而以上聯合查詢的第三個分支的sql查詢語句是由分詞然後組合出來的查詢語句,這條sql語句查詢的結果是肯定包含第一個分支sql語句的查詢結果的,這裏就顯得沒必要了,所以沒有使用all而去掉重復的查詢結果。

如對本文有疑問,請提交到交流社區,廣大熱心網友會為你解答!! 點擊進入社區

您可能感興趣的文章:

  • 詳解Mysql多表聯合查詢效率分析及優化
  • 對MySQL幾種聯合查詢的通俗解釋
  • Mysql聯合查詢UNION和Order by同時使用報錯問題的解決辦法
  • 深入sql多表差異化聯合查詢的問題詳解
  • mysql多表聯合查詢返回一張表的內容實現代碼
  • SQL語言查詢基礎:連接查詢 聯合查詢 代碼
  • SQL 聯合查詢與XML解析實例詳解
  • ---例子-------
  • SELECT ‘業務日期‘, ‘大區‘, ‘小區‘, ‘開單部門‘, ‘訂單號‘, ‘運單號‘, ‘包裹號‘, ‘運輸方式‘, ‘運費‘, ‘提包費‘, ‘中轉費‘, ‘叉車費‘, ‘其他費‘, ‘代收貨款‘, ‘折扣‘, ‘金額合計‘, ‘現付‘, ‘欠付‘, ‘提付‘, ‘送貨費‘, ‘保價費‘, ‘備註‘, ‘操作人‘, ‘操作時間‘, ‘創建人‘, ‘創建時間‘, ‘運輸方式名稱‘
    UNION
    SELECT main.*,
    trans_way.code_name AS trans_way_name
    FROM tms.tms_settle_income_day main
    LEFT JOIN
    tms.cip_admin_codes trans_way ON
    trans_way.domain_id = ‘product_type‘ AND
    main.trans_way = trans_way.code_type

Mysql聯合查詢UNION和UNION ALL的使用介紹