mysql中的union操做(整理)

mysql中的union操做(整理)

1、總結

一句話總結:

union兩側的字段數和字段類型要是同樣的
union能夠接多個
orderby和排序能夠在最後的union組合以後

 

一、union簡單實例?

SELECT country FROM Websites UNION SELECT country FROM apps ORDER BY country;

 

二、UNION和UNION ALL的區別是什麼?

UNION 語句:用於將不一樣表中相同列中查詢的數據展現出來;(不包括重複數據)
UNION ALL 語句:用於將不一樣表中相同列中查詢的數據展現出來;(包括重複數據)

 

三、laravel中union使用實例?

query2中 union(query1)
$select_field=['comment_lessons.*','users.name','users.id','lessons.l_title','lessons.l_id']; //一、這是全部我發的,我回復的或者我評論的:這裏我並不須要知道本身的信息 //這是我回復別人的
  $lesson_comments_active=CommentLesson::where('cl_u_id',$u_id) ->leftJoin('users', 'comment_lessons.cl_to_u_id', '=', 'users.id') ->join('lessons', 'comment_lessons.cl_l_id', '=', 'lessons.l_id') ->select($select_field); //二、這是全部回覆個人,我須要知道用戶的信息
  $lesson_comments=CommentLesson::where('cl_to_u_id',$u_id) ->join('users', 'comment_lessons.cl_u_id', '=', 'users.id') ->join('lessons', 'comment_lessons.cl_l_id', '=', 'lessons.l_id') ->union($lesson_comments_active) ->orderBy('cl_created_at','desc')->offset($offset)->limit($per_page_item_num) ->select($select_field)->get();

 

 

四、union重複的問題?

select通常不產生重複數據,因此默認不消除重複記錄,須要消除使用select DISTINCT.消除重複
union大多數產生重複數據,默認是消除重複數據,使用union all 不消除重複數據

 

五、爲何在union在字句中排序沒有意義?

對用戶不可見:ORDER BY子句不能出如今由UNION操做組合的兩個SELECT中。無論怎樣,排序兩個查詢結果集並無太多的意義,由於它們被直接加入到UNION操做中,對用戶是不可見的。
字段未命名:由於由UNION操做生成的字段是沒有命名的,ORDERBY子句必須按字段編號指定字段。

 

 

 

2、MySQL UNION 操做符(基礎)

轉自或參考:MySQL UNION 操做符
https://www.cnblogs.com/hetaoyuan/p/11616172.html">MySQL UNION 操做符html

 

描述

MySQL UNION 操做符用於鏈接兩個以上的 SELECT 語句的結果組合到一個結果集合中。多個 SELECT 語句會刪除重複的數據。mysql

語法

MySQL UNION 操做符語法格式:laravel

SELECT expression1, expression2, ... expression_n FROM tables [WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n FROM tables [WHERE conditions];

參數

  • expression1, expression2, ... expression_n: 要檢索的列。sql

  • tables: 要檢索的數據表。數據庫

  • WHERE conditions: 可選, 檢索條件。express

  • DISTINCT: 可選,刪除結果集中重複的數據。默認狀況下 UNION 操做符已經刪除了重複數據,因此 DISTINCT 修飾符對結果沒啥影響。app

  • ALL: 可選,返回全部結果集,包含重複數據。less


演示數據庫

下面是選自 "Websites" 表的數據:post

mysql> SELECT * FROM Websites; +----+--------------+---------------------------+-------+---------+
| id | name         | url                       | alexa | country |
+----+--------------+---------------------------+-------+---------+
| 1  | Google       | https://www.google.cm/    | 1     | USA     |
| 2  | 淘寶          | https://www.taobao.com/   | 13    | CN      |
| 3  | 菜鳥教程      | http://www.runoob.com/    | 4689  | CN      |
| 4  | 微博          | http://weibo.com/         | 20    | CN      |
| 5  | Facebook     | https://www.facebook.com/ | 3     | USA     |
| 7  | stackoverflow | http://stackoverflow.com/ |   0 | IND     |
+----+---------------+---------------------------+-------+---------+

下面是 "apps" APP 的數據:網站

mysql> SELECT * FROM apps; +----+------------+-------------------------+---------+
| id | app_name   | url                     | country |
+----+------------+-------------------------+---------+
|  1 | QQ APP     | http://im.qq.com/       | CN      |
|  2 | 微博 APP | http://weibo.com/       | CN      |
|  3 | 淘寶 APP | https://www.taobao.com/ | CN      |
+----+------------+-------------------------+---------+
3 rows in set (0.00 sec)

SQL UNION 實例

下面的 SQL 語句從 "Websites" 和 "apps" 表中選取全部不一樣的country(只有不一樣的值):

實例:

SELECT country FROM Websites UNION
SELECT country FROM apps ORDER BY country;

註釋:UNION 不能用於列出兩個表中全部的country。若是一些網站和APP來自同一個國家,每一個國家只會列出一次。UNION 只會選取不一樣的值。請使用 UNION ALL 來選取重複的值!


SQL UNION ALL 實例

下面的 SQL 語句使用 UNION ALL 從 "Websites" 和 "apps" 表中選取全部的country(也有重複的值):

實例

SELECT country FROM Websites UNION ALL
SELECT country FROM apps ORDER BY country; 執行以上 SQL 輸出結果以下:

帶有 WHERE 的 SQL UNION ALL

下面的 SQL 語句使用 UNION ALL 從 "Websites" 和 "apps" 表中選取全部的中國(CN)的數據(也有重複的值):

實例

SELECT country, name FROM Websites WHERE country='CN'
UNION ALL
SELECT country, app_name FROM apps WHERE country='CN'
ORDER BY country;

執行以上 SQL 輸出結果以下:

 

NION 語句:用於將不一樣表中相同列中查詢的數據展現出來;(不包括重複數據)

UNION ALL 語句:用於將不一樣表中相同列中查詢的數據展現出來;(包括重複數據)

使用形式以下:

SELECT 列名稱 FROM 表名稱 UNION SELECT 列名稱 FROM 表名稱 ORDER BY 列名稱; SELECT 列名稱 FROM 表名稱 UNION ALL SELECT 列名稱 FROM 表名稱 ORDER BY 列名稱;

轉載:https://www.runoob.com/mysql/mysql-union-operation.html

 

3、mysql中的union用法

轉自或參考:mysql中的union用法 - 簡書
https://www.jianshu.com/p/b8f7f122f8a4

 

UNION在mysql中被稱爲集合操做,操做類型分爲兩種:UNION DISTINCT 和  UNION ALL;注意:UNION和UNION DISTINCT是同樣的功能。UNION功能爲合併多個查詢的結果並去重,UNION ALL的功能爲合併多個查詢的結果不去重。

集合操做時,兩邊的輸入必須擁有相同的列數,若是數據類型不一樣的話,mysql會自動進行隱式轉化 ;同時,結果列的名稱由第一個查詢的列的名稱決定。下面看一下例子:

sql語句爲:SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION SELECT 'abc' as a,'haha',4 FROM DUAL;結果是:

 

 

若是是:SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION ALL SELECT 'abc' as a,'haha',4 FROM DUAL;

 

 

若是兩次查詢的列個數不一致,如:SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION ALL SELECT 'abc' as a,'haha' FROM DUAL;

在多個列查詢時,只要有一個列的數據不一致時,都是沒法去重的;也就是去重是每一個列的數據徹底一致,好比:SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION DISTINCT SELECT 'abc' as a,'haha',5 FROM DUAL;

 

 

這幾個例子能夠看出UNION (DISTINCT) 與 UNION ALL的用法了吧,下面講一下UNION (DISTINCT)的實現方式:

一:建立一張虛擬表;

二:對這張虛擬表的列添加惟一索引,即UNIQUE INDEX;

三:將結果插入虛擬表

四:返回虛擬表; 

如何判斷是否建立一個虛擬表,咱們能夠經過一下語句判斷:

SHOW STATUS LIKE 'Created_tmp_tables'; 

SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION SELECT 'abc' as a,'haha',4 FROM DUAL;

SHOW STATUS LIKE 'Created_tmp_tables';                                                                                                             結果是:

 

 

 

 

可見結果3比結果1多1,在操做第二個 UNION語句時建立了一個虛擬表;若是UNION建立了索引,插入會相對變慢

 

 

4、mysql 中union使用

轉自或參考:mysql 中union使用
https://blog.csdn.net/csdn13257081409/article/details/79573500

 

1.

 

 

2.union重複的問題:

select通常不產生重複數據,因此默認不消除重複記錄,須要消除使用select DISTINCT.消除重複

union大多數產生重複數據,默認是消除重複數據,使用union all 不消除重複數據

3.union 和order by

union不能兩個子查詢都是用order by,他並非將每一個子查詢一個一個查詢出來後聯接在一塊兒,數據庫是將整段查詢語句理解以後統一查詢獲得的是整個的數據集合,只能在最後一個查詢語句後面加,或者使用select from(...union...) order by

select * from [IND] where INDID>10 union select * from [IND] where INDID<9 order by INDID desc

 

 

 

 

4.多個Union使用

相關文章
相關標籤/搜索