mysql中的union操作(整理)
一、總結
一句話總結:
union兩側的字段數和字段類型要是一樣的
union可以接多個
orderby和排序可以在最后的union組合之后
1、union簡單實例?
SELECT country FROM Websites UNION SELECT country FROM apps ORDER BY country;
2、UNION和UNION ALL的區別是什么?
UNION 語句:用於將不同表中相同列中查詢的數據展示出來;(不包括重復數據)
UNION ALL 語句:用於將不同表中相同列中查詢的數據展示出來;(包括重復數據)
3、laravel中union使用實例?
query2中 union(query1)
$select_field=['comment_lessons.*','users.name','users.id','lessons.l_title','lessons.l_id']; //1、這是所有我發的,我回復的或者我評論的:這里我並不需要知道自己的信息 //這是我回復別人的 $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); //2、這是所有回復我的,我需要知道用戶的信息 $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();
4、union重復的問題?
select一般不產生重復數據,所以默認不消除重復記錄,需要消除使用select DISTINCT.消除重復
union大多數產生重復數據,默認是消除重復數據,使用union all 不消除重復數據
5、為什么在union在字句中排序沒有意義?
對用戶不可見:ORDER BY子句不能出現在由UNION操作組合的兩個SELECT中。不管怎樣,排序兩個查詢結果集並沒有太多的意義,因為它們被直接加入到UNION操作中,對用戶是不可見的。
字段未命名:因為由UNION操作生成的字段是沒有命名的,ORDERBY子句必須按字段編號指定字段。
二、MySQL UNION 操作符(基礎)
轉自或參考:MySQL UNION 操作符
https://www.cnblogs.com/hetaoyuan/p/11616172.html">MySQL UNION 操作符
描述
MySQL UNION 操作符用於連接兩個以上的 SELECT 語句的結果組合到一個結果集合中。多個 SELECT 語句會刪除重復的數據。
語法
MySQL UNION 操作符語法格式:
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: 要檢索的列。
-
tables: 要檢索的數據表。
-
WHERE conditions: 可選, 檢索條件。
-
DISTINCT: 可選,刪除結果集中重復的數據。默認情況下 UNION 操作符已經刪除了重復數據,所以 DISTINCT 修飾符對結果沒啥影響。
-
ALL: 可選,返回所有結果集,包含重復數據。
演示數據庫
下面是選自 "Websites" 表的數據:
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
三、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創建了索引,插入會相對變慢
四、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使用