MySQL必知必會 組合查詢(Union)

2022-05-01 01:09:10 字數 4198 閱讀 3715

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;

whereunion在多數情況下都可以實現相同的結果集。where可以實現的語句一定可以使用union語句來實現。但是反過來就不一定正確了,比如下面將會說到的去重和不去重。

另外,在單錶中使用unionwhere多條件查詢較為複雜。而從多張表中獲取資料,使用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沒有幫我們去除重複,在查詢結果中,我們也看到了兩條重複的李四。

之前我們說過whereunion的區別,這裡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_nameuser_nickname型別相同,而posts_iduser_id型別相同,post_statususer_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 根據訂單號檢索出所...