php
mysql
sql
閱讀約 8 分鐘
本篇文章主要介紹使用union
操作符將多個select
查詢組合成乙個結果集。本文參考《mysql
必知必會》+工作實踐融合
在大多數開發中,使用一條select
查詢就會返回乙個結果集。如果,我們想一次性查詢多條sql語句,並將每一條select
查詢的結果合併成乙個結果集返回。就需要用到union
操作符,將多個select
語句組合起來,這種查詢被稱為並(union
)或者復合查詢。
組合查詢適用於下面兩種情境中:
從多個表中查詢出相似結構的資料,並且返回乙個結果集
從單個表中多次select
查詢,將結果合併成乙個結果集返回。
我們通過乙個簡單的示例來認識一下union
組合查詢。
建立乙個使用者表
首先分兩次查詢使用者表,然後再組合查詢
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
的使用者
下面我們組合這兩條sql
語句:
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
allselect 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
,就是我們剛剛新增用於區別表的字段。 MySQL必知必會十七 組合查詢
mysql允許執行多個查詢 多條select語句 並將結果作為單個查詢結果集返回。這些組合查詢通常稱為並 union 或復合查詢 compound query 有兩種基本情況,其中需要使用組合查詢 mysql select vend id,prod id,prod price from produc...
MySQL必知必會 十四 組合查詢
開始線 mysql也允許執行多個查詢,並將結果作為單個查詢結果集返回,這些組合查詢通常稱為並或復合查詢 有兩種基本情況,其中需要使用組合查詢 1.在單個查詢中從不同的表返回類似結構的資料 2.對單個表執行多個查詢,按單個查詢返回資料 可用union操作符來組合數條sql查詢 查詢 小於等於5的所有物...
mysql必知必會 子查詢 組合查詢
一.子查詢 巢狀在其他查詢中的查詢。二.利用子查詢進行過濾 表orders包含訂單號 客戶id 訂單日期的每個訂單 表orderitems儲存各個訂單的物品 表customers儲存客戶資訊。如 現在我們要檢索出訂購物品tnt2的所有客戶 1 檢索包含物品tnt2的所有訂單號 2 根據訂單號檢索出所...