mysql中UNION和UNION ALL聯合查詢

2021-09-20 17:02:12 字數 3594 閱讀 7438

**:

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中union和union all的區別?

mysql中union和union all都是用來對子查詢後結果列進行合併用的,兩者最大的區別時union合併後沒有重複資料,union all後會有重複資料,兩者的列必須相同,數量相同,資料型別相似.我們可以做個測試,首先建立兩個表,分別為country和country2 建立表一 country...

Mysql中的Union和Union All查詢

union 用於合併兩個或多個 select 語句的結果集,並消去表中任何重複行。union 內部的 select 語句必須擁有相同數量的列,列也必須擁有相似的資料型別。同時,每條 select 語句中的列的順序必須相同。select name from a union select name fr...

MySql中UNION與UNION ALL的區別

union用的比較多union all是直接連線,取到得是所有值,記錄可能有重複 union 是取唯一值,記錄沒有重複1 union 的語法如下 sql 語句 1 union sql 語句 2 2 union all 的語法如下 sql 語句 1 union all sql 語句 2 效率 unio...