MySQL之union聯(lián)合查詢的實(shí)現(xiàn)
UNION 的含義是“聯(lián)合,并集,結(jié)合”,在MySQL中可以將多個(gè)查詢語句的結(jié)果合并成一個(gè)結(jié)果集,在MySQL 不支持FULL OUTER JOIN 的情況下,彌補(bǔ)了“并集” 查詢的短板。
聯(lián)合查詢:
關(guān)鍵字union,作用就是將多條查詢語句的結(jié)果合并成一個(gè)結(jié)果集。
案例:(查詢部門編號(hào)大于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是應(yīng)用場(chǎng)景:
比如在我們有個(gè)數(shù)據(jù)庫(kù)中的老師表和學(xué)生表,兩者之間沒有直接的關(guān)聯(lián)關(guān)系,但是又有一些共通性,但是現(xiàn)在我們想要查詢學(xué)校所有男老師和男學(xué)生的信息(學(xué)生和老師的編號(hào),姓名,出現(xiàn)日期,性別),這個(gè)時(shí)候就是應(yīng)用union的時(shí)候。
SELECT `tno` 編號(hào),`tname`,`tsex`,`tbirthday` FROM `teachers` WHERE `tsex`='男' UNION SELECT `sno`,`sname`,`ssex`,`sbirthday` FROM `students` WHERE `ssex`='男';
聯(lián)合查詢的特點(diǎn):
- 聯(lián)合查詢的兩個(gè)子查詢的查詢字段個(gè)數(shù)要一致
- 要求聯(lián)合查詢的子查詢的查詢列表順序要在內(nèi)容上保持一致
- 使用union聯(lián)合默認(rèn)會(huì)自動(dòng)去重,如果不想去重可以將union改為union all
聯(lián)合查詢的規(guī)則
聯(lián)合查詢是有一定使用規(guī)則的,如果不加注意,MySQL就有可能執(zhí)行報(bào)錯(cuò),或意義混亂
1、多條查詢語句的查詢列數(shù)必須保持一致,否則報(bào)錯(cuò)。
2、多條查詢語句的列值類型和順序最好保持一致。
3、UNION 關(guān)鍵字默認(rèn)不查詢重復(fù)記錄,但只要有一個(gè)字段不一樣就認(rèn)為是兩條記錄。
規(guī)則一:查詢列數(shù)必須保持一致
其實(shí)很好理解,如果要將兩個(gè)結(jié)果集合并,那么就需要將列數(shù)統(tǒng)一,MySQL對(duì)此作了嚴(yán)格的限制,不會(huì)以 NULL 值顯示沒有查詢?cè)摿械牟樵冇涗?,這是為了保證數(shù)據(jù)的準(zhǔn)確性,原因是 NULL 也是一種值。
SELECT emp_id 編號(hào), emp_name 姓名, dept_id 所屬部門或班級(jí), manager_id FROM emp UNION SELECT stu_id 編號(hào), stu_name 姓名, class_id 所屬部門或班級(jí) FROM student
規(guī)則二:列值類型和順序最好保持一致
“最好” 的意思是 “我們可以不這樣做,但皮一下并沒有什么意義”。
比如,我們將stu_name 與 class_id 調(diào)換順序:
SELECT emp_id 編號(hào), emp_name 姓名, dept_id 所屬部門或班級(jí) FROM emp UNION SELECT stu_id 編號(hào), class_id 姓名, stu_name 所屬部門或班級(jí) FROM student LIMIT 15
MySQL雖然不會(huì)報(bào)錯(cuò),但結(jié)果已經(jīng)不具有什么使用意義了。另外,列的別名其實(shí)并不需要完全統(tǒng)一,多條查詢語句中如果出現(xiàn)不統(tǒng)一的列名,MySQL會(huì)默認(rèn)使用第一條查詢語句的列名。如:
SELECT emp_id 編號(hào), emp_name 姓名, dept_id 所屬部門或班級(jí) FROM emp UNION SELECT stu_id, stu_name, class_id FROM student LIMIT 15
但為了保證可讀性,建議為每條查詢語句指定相同的列名,保持統(tǒng)一格式。
規(guī)則三:UNION 默認(rèn)去重
UNION 關(guān)鍵字不會(huì)查詢重復(fù)的記錄,但重復(fù)的記錄并不是簡(jiǎn)簡(jiǎn)單單的“看上去重復(fù)”或“主鍵重復(fù)”,記錄中只要有一個(gè)字段不一致,UNION 就會(huì)老老實(shí)實(shí)的將他們都查詢出來。
UNION 與 UNION ALL
UNION 關(guān)鍵字是去重的聯(lián)合查詢,如果非要將所有記錄都查詢出來,不忽略重復(fù)的記錄,那么可以使用 UNION ALL ,對(duì)比來看一下:
SELECT * FROM emp UNION SELECT * FROM emp
UNION 的結(jié)果:
SELECT * FROM emp UNION ALL SELECT * FROM emp
UNION ALL 的結(jié)果:
到此這篇關(guān)于MySQL之union聯(lián)合查詢的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)MySQL union聯(lián)合查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
有效查詢MySQL表中重復(fù)數(shù)據(jù)的方法和技巧分享
在MySQL數(shù)據(jù)庫(kù)中,偶爾會(huì)遇到需要查找表中出現(xiàn)的重復(fù)數(shù)據(jù)的情況,這種情況下,我們可以通過編寫一些SQL查詢語句輕松地找到并處理這些重復(fù)行,本文將介紹一些常見的方法和技巧,幫助你有效地查詢MySQL表中的重復(fù)數(shù)據(jù),需要的朋友可以參考下2023-10-10MySQL多表查詢與7種JOINS的實(shí)現(xiàn)舉例
最近學(xué)習(xí)了多表查詢,對(duì)此做一些筆記的整理,下面這篇文章主要給大家介紹了關(guān)于MySQL多表查詢與7種JOINS實(shí)現(xiàn)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02MySQL數(shù)據(jù)庫(kù)InnoDB引擎主從復(fù)制同步經(jīng)驗(yàn)總結(jié)
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)InnoDB引擎主從復(fù)制同步經(jīng)驗(yàn)總結(jié),本文總結(jié)了設(shè)置主從復(fù)制時(shí)遇到的一些錯(cuò)誤和解決方法,需要的朋友可以參考下2015-01-01如何區(qū)分MySQL的innodb_flush_log_at_trx_commit和sync_binlog
這篇文章主要介紹了如何區(qū)分MySQL的innodb_flush_log_at_trx_commit和sync_binlog,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下2021-02-02