本篇文章主要介紹使用Union
操做符將多個SELECT
查詢組合成一個結果集。本文參考《Mysql
必知必會》+工做實踐融合mysql
在大多數開發中,使用一條SELECT
查詢就會返回一個結果集。若是,咱們想一次性查詢多條SQL語句,並將每一條SELECT
查詢的結果合併成一個結果集返回。就須要用到Union
操做符,將多個SELECT
語句組合起來,這種查詢被稱爲並(Union
)或者複合查詢。sql
組合查詢適用於下面兩種情境中:數據庫
從多個表中查詢出類似結構的數據,而且返回一個結果集segmentfault
從單個表中屢次SELECT
查詢,將結果合併成一個結果集返回。函數
咱們經過一個簡單的示例來認識一下Union
組合查詢。post
建立一個用戶表spa
首先分兩次查詢用戶表,而後再組合查詢3d
select user_id,user_nickname,user_status from yy_user where user_status = 1 // 第一次查詢
select user_id,user_nickname,user_status from yy_user where user_id > 3 // 第二次查詢
第一條SQL
查詢了user_status=1
的用戶,第二條查詢了user_id > 3
的用戶code
下面咱們組合這兩條SQL
語句:blog
select user_id,user_nickname,user_status from yy_user where user_status = 1 UNION select user_id,user_nickname,user_status from yy_user where user_id > 3
這條語句由前面的兩條語句組成,經過Union
組合了兩條SELECT
,而且把結果集合並後輸出。這條組合查詢也可使用同等where
語句來替代:
select user_id,user_nickname,user_status from yy_user where user_status = 1 or user_id > 3;
where
和Union
在多數狀況下均可以實現相同的結果集。where
能夠實現的語句必定可使用Union
語句來實現。可是反過來就不必定正確了,好比下面將會說到的去重和不去重。
另外,在單表中使用Union
比where
多條件查詢較爲複雜。而從多張表中獲取數據,使用Union
會相對於簡單些。
Union
有他的強大之處,詳細介紹以前,首先明確一下Union
的使用注意規則。
Union
必須由兩條或者兩條以上的SELECT
語句組成,語句之間使用Union
連接。
Union
中的每一個查詢必須包含相同的列、表達式或者聚合函數,他們出現的順序能夠不一致(這裏指查詢字段相同,表不必定同樣)
列的數據類型必須兼容,兼容的含義是必須是數據庫能夠隱含的轉換他們的類型
咱們觀察一下上面兩條語句,第一條SELECT
返回了2條數據;第二條SELECT
也返回了2條數據。
可是Union
最終的結果返回了3條數據,而不是4條。mysql
在查詢結果集中幫咱們自動去除了重複的行(重複的行是李四),把兩條李四合並了。
通常狀況下這樣結果是好的,可是若是須要的狀況下,咱們可使用Union All
操做符來取消自動合併功能。
select user_id,user_nickname,user_status from yy_user where user_status = 1 UNION ALL select user_id,user_nickname,user_status from yy_user where user_id > 3
這一次mysql
沒有幫咱們去除重複,在查詢結果中,咱們也看到了兩條重複的李四。
以前咱們說過where
和Union
的區別,這裏Union All
能夠返回重複的數據,就是where
子句完成不了的工做。
使用Union
組合查詢時,只能使用一條order by
子句對結果集進行排序,並且必須出如今最後一條出現的SELECT
語句以後。由於`Union
不容許對於部分結果集進行排序,只能針對最終檢索出來的結果集進行排序。
注意:因爲在多表組合查詢時候,可能表字段並不相同。因此,在對於結果集排序的時候須要使用檢索出來的共同字段。
(select user_id,user_nickname,user_status from yy_user where user_status = 1) UNION ALL (select user_id,user_nickname,user_status from yy_user where user_id > 3) order by user_id desc
上面檢索的字段user_id
必須存在於結果集中。
大型項目中數據常常分佈在不一樣的表,檢索的時候須要組合查詢出來。多表查詢的時候,並不要求兩個表徹底相同,只須要你檢索的字段結構類似就能夠。
咱們已經有一張user
表,假設搜索時候咱們須要將用戶暱稱和博客文章標題一同混合檢索。
看下上面的posts
表,posts_name
和user_nickname
類型相同,而posts_id
和user_id
類型相同,post_status
和user_status
類型相同。儘管他們的名稱不相同。
咱們能夠這麼來檢索:
select posts_id,posts_name,posts_status from yy_posts UNION select user_id,user_nickname,user_status from yy_user
從上面的檢索結果能看出,咱們將兩個表的數據組合了起來。Union
檢索遇到不一致的字段名稱時候,會使用第一條SELECT
的查詢字段名稱,或者你使用別名來改變查詢字段名稱。
上一個例子中,咱們組合查詢了user
表和posts
表。雖然結果混合在一塊兒沒有任何問題,可是當顯示到頁面的時候,咱們須要給用戶和文章不一樣的連接或者其餘的區分。因此咱們必須肯定該條記錄來自於哪張表,咱們能夠添加一個別名來做爲表名。
select posts_id,posts_name,posts_status,'users' as table_name from yy_posts UNION select user_id,user_nickname,user_status,'posts' as table_name from yy_user
注意SQL
語句中的'users' as table_name
。對應的是圖片裏的table_name
,就是咱們剛剛添加用於區別表的字段。
星空幻穎,嚴穎
我的主頁:segmentfault
我的博客:地址 不過很久沒有更新了,噗噗噗