MySQL之union聯(lián)合查詢的實現(xiàn)
UNION 的含義是“聯(lián)合,并集,結合”,在MySQL中可以將多個查詢語句的結果合并成一個結果集,在MySQL 不支持FULL OUTER JOIN 的情況下,彌補了“并集” 查詢的短板。
聯(lián)合查詢:
關鍵字union,作用就是將多條查詢語句的結果合并成一個結果集。
案例:(查詢部門編號大于100或名字中含有a字符的員工信息)
select * from employees where department_id>100 or last_name like '%a%';
用聯(lián)合查詢演示:
select * from employees where department_id>100 union select * from employees where last_name like '%a%';
union是應用場景:
比如在我們有個數(shù)據(jù)庫中的老師表和學生表,兩者之間沒有直接的關聯(lián)關系,但是又有一些共通性,但是現(xiàn)在我們想要查詢學校所有男老師和男學生的信息(學生和老師的編號,姓名,出現(xiàn)日期,性別),這個時候就是應用union的時候。
SELECT `tno` 編號,`tname`,`tsex`,`tbirthday` FROM `teachers` WHERE `tsex`='男' UNION SELECT `sno`,`sname`,`ssex`,`sbirthday` FROM `students` WHERE `ssex`='男';
聯(lián)合查詢的特點:
- 聯(lián)合查詢的兩個子查詢的查詢字段個數(shù)要一致
- 要求聯(lián)合查詢的子查詢的查詢列表順序要在內(nèi)容上保持一致
- 使用union聯(lián)合默認會自動去重,如果不想去重可以將union改為union all
聯(lián)合查詢的規(guī)則
聯(lián)合查詢是有一定使用規(guī)則的,如果不加注意,MySQL就有可能執(zhí)行報錯,或意義混亂
1、多條查詢語句的查詢列數(shù)必須保持一致,否則報錯。
2、多條查詢語句的列值類型和順序最好保持一致。
3、UNION 關鍵字默認不查詢重復記錄,但只要有一個字段不一樣就認為是兩條記錄。
規(guī)則一:查詢列數(shù)必須保持一致
其實很好理解,如果要將兩個結果集合并,那么就需要將列數(shù)統(tǒng)一,MySQL對此作了嚴格的限制,不會以 NULL 值顯示沒有查詢該列的查詢記錄,這是為了保證數(shù)據(jù)的準確性,原因是 NULL 也是一種值。
SELECT emp_id 編號, emp_name 姓名, dept_id 所屬部門或班級, manager_id FROM emp UNION SELECT stu_id 編號, stu_name 姓名, class_id 所屬部門或班級 FROM student

規(guī)則二:列值類型和順序最好保持一致
“最好” 的意思是 “我們可以不這樣做,但皮一下并沒有什么意義”。
比如,我們將stu_name 與 class_id 調(diào)換順序:
SELECT emp_id 編號, emp_name 姓名, dept_id 所屬部門或班級 FROM emp UNION SELECT stu_id 編號, class_id 姓名, stu_name 所屬部門或班級 FROM student LIMIT 15

MySQL雖然不會報錯,但結果已經(jīng)不具有什么使用意義了。另外,列的別名其實并不需要完全統(tǒng)一,多條查詢語句中如果出現(xiàn)不統(tǒng)一的列名,MySQL會默認使用第一條查詢語句的列名。如:
SELECT emp_id 編號, emp_name 姓名, dept_id 所屬部門或班級 FROM emp UNION SELECT stu_id, stu_name, class_id FROM student LIMIT 15

但為了保證可讀性,建議為每條查詢語句指定相同的列名,保持統(tǒng)一格式。
規(guī)則三:UNION 默認去重
UNION 關鍵字不會查詢重復的記錄,但重復的記錄并不是簡簡單單的“看上去重復”或“主鍵重復”,記錄中只要有一個字段不一致,UNION 就會老老實實的將他們都查詢出來。
UNION 與 UNION ALL
UNION 關鍵字是去重的聯(lián)合查詢,如果非要將所有記錄都查詢出來,不忽略重復的記錄,那么可以使用 UNION ALL ,對比來看一下:
SELECT * FROM emp UNION SELECT * FROM emp
UNION 的結果:

SELECT * FROM emp UNION ALL SELECT * FROM emp
UNION ALL 的結果:

到此這篇關于MySQL之union聯(lián)合查詢的實現(xiàn)的文章就介紹到這了,更多相關MySQL union聯(lián)合查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
mysql 5.7.17 安裝配置方法圖文教程(ubuntu 16.04)
這篇文章主要為大家分享了ubuntu 16.04下mysql 5.7.17 安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01
MySQL優(yōu)化案例之隱式字符編碼轉(zhuǎn)換
這篇文章主要介紹了MySQL優(yōu)化案例之隱式字符編碼轉(zhuǎn)換,隱式類型轉(zhuǎn)換也會導致同樣的放棄走樹搜索,更多相關內(nèi)容具有一定的參考價值,需要的朋友可以參考一下2022-07-07
MySQL數(shù)據(jù)庫表的合并與分區(qū)實現(xiàn)介紹
今天我們來聊聊處理大數(shù)據(jù)時Mysql的存儲優(yōu)化。當數(shù)據(jù)達到一定量時,一般的存儲方式就無法解決高并發(fā)問題了。最直接的MySQL優(yōu)化就是分區(qū)分表,以下是我個人對分區(qū)分表的筆記2022-09-09

