測試必備的Mysql常用sql語句系列
https://www.cnblogs.com/poloyy/category/1683347.html
前言
- 其實Mysql並沒有全連接,Oracle才有全連接(full join)
- 但是在MySQL中,union關鍵字可以達到同樣的效果,所以這里也要介紹下union
union 的語法格式
[sql1] UNION [ALL | DISTINCT] [sql2] UNION [ALL | DISTINCT] [sql3] ....
語法格式說明
- sql1、sql2、sql3:平時寫的查詢 sql,可以連接很多條 sql
- ALL:可選參數,返回所有結果集,包含重復數據
- distinct:可選參數,刪除結果集中重復的數據(默認只寫 union 也會刪除重復數據,所以不加也沒事)
先看看dept、emp表有什么數據
dept表
emp表
union all 的栗子
select * from emp as a left join dept as b on a.dept_id = b.id union all select * from emp as a right join dept as b on a.dept_id = b.id;
藍色圈子:第一條 sql 的查詢結果
紅色圈子:第二條 sql 的查詢結果
union 的栗子
select * from emp as a left join dept as b on a.dept_id = b.id union select * from emp as a right join dept as b on a.dept_id = b.id;
上圖是去重之后的結果,而沒有去重的結果可以看union all 的栗子或者下圖
紅色圈住的部分就是重復的數據,union 會進行去重,只保留一份數據
知識點(重點)
-
使用 union 連接的多條sql,每個 sql 查詢出來的結果集的字段名稱要一致【只需要名稱一致即可,順序可以不同,但建議相同】,可以看看下面的栗子
-
最終 union 連接查詢的結果集的字段順序會以第一個 sql 查出來結果集的字段順序為基准
union 連接的兩條 sql ,各自指定的字段順序不相同的栗子
select name,id,leader,is_enable,dept_id from emp where dept_id = 1 union select * from emp where leader = 0
從上圖可以看出,第二條 sql 查出來的字段順序和最終結果集字段順序明顯不一樣,導致數據錯亂的問題
所以!!union 連接的每條 sql 指定的字段順序最好一致!!
所以!!union 連接的每條 sql 指定的字段順序最好一致!!
所以!!union 連接的每條 sql 指定的字段順序最好一致!!
select * from emp where dept_id = 1 union select id,name,dept_id,leader,is_enable from emp where leader = 0