Mysql常用sql語句(18)- union 全連接


測試必備的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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM