1.union:可以將查詢結果相加
union用于將查詢結果相加,尤其是將兩張毫無關系的表中的數據,拼接在一起顯示的時候。
但是有一個前提條件:不同結果進行拼接的時候,列數必須相同。
利用下方的數據說明union的用法:
1)union all:不能去重
2)union:可以達到去重的效果。
2.limit:分頁查詢全靠它
1)對limit用法的一些說明
① limit是mysql中特有的,其他數據庫中沒有,不通用;
② limit取結果集中的部分數據,這是它的作用;
③ limit是sql語句最后執(zhí)行的一個環(huán)節(jié);
limit的使用語法:
limit startindex,length; 其中startindex表示起始位置,從0開始,0表示第一條數據,length表示取幾個。
2)案例說明
數據源如下:
① 取出工資前五名的員工,顯示其信息。
②找出工資排名在第4到第9名的員工。
3)通用的標準分頁sql
根據上圖可以發(fā)現:
拿百度瀏覽器進行說明:
3.exists用法:又稱"相關子查詢"
1)帶你理解exists的執(zhí)行原理
數據源如下:
① 當返回結果是一行記錄的情況
② 當返回結果是多行記錄的情況
③ 原理解釋
從上圖演示可以發(fā)現,不管exists關鍵字后面的sql語句,不管是查詢出一條結果,還是多條結果,只要查出結果,整個結果就是true,而mysql中true就用1表示,所以最終結果就是1。一旦exists關鍵字后面的sql語句,查詢不出任何一條結果的時候,最終的返回值就是false,在mysql中false就用0表示,所以最終結果就是0。
2)案例演示
利用下方的數據源,完成如下兩個練習題。
① 查詢jobs表中,哪個工作有人做?
② 查詢jobs表中,哪個工作沒有人做?
3)一張圖說明exists子查詢的原理
解釋如下:
"有一個a公司,公司中所有的工作都在jobs表,emp表中可以看到哪些工作已經被做了"
select jobs.job
from jobs
where not exists(select * from emp where jobs.job=emp.job);
1)搞清楚你要得到的結果是什么。
這里你要得到的是"哪些工作沒有人做",也就是說返回的結果來自于jobs表,但是
"怎么知道哪些工作有人做,哪些沒人做呢?",這就需要我們對照emp表。
2)首先從jobs表中,取出第一條記錄,扔進到emp表中和該表的每一行進行匹配。當匹
配到第一行的時候,由于emp表中的每一行都有8列,你究竟想匹配什么呢?是不是應該明
確指明以下,也就是"where jobs.job=emp.job"這個條件,這個條件表明,我從jobs
表中取出第一條記錄,去和emp中每一行進行匹配,并且我更為明確,我是和你第一行的
job字段進行匹配,你只需要看看jobs.job和emp.job是否相等,如果相等,返回該條記
錄,接著,拿著第一行再往下依次匹配,只要是jobs.job和emp.job是否相等,就返回
該條記錄。因此jobs中的第一行和emp中每一行進行匹配,就會返回一個結果集。
3)再看exists關鍵字,exists()返回的結果是true或者false,當括號中有值的時候,
就是存在,返回的是true;當括號中沒有值的時候,返回的是false。根據(1)中,我們
已經知道,jobs中的第一行和emp中每一行匹配后,返回了一個結果集,也就證明有返回
值,因此exists()返回的結果是true。
4)當在exists()前面加了一個not,表示取反。exists()返回的是true,not exists()
返回的就是false。
5)根據上述敘述,當not exists()變?yōu)閒alse后,原始語句就相當于變?yōu)椋?br />
select jobs.job from jobs where false;
因此,第一行clerk不能被取出來。
6)接著,再拿jobs中的第二行"salesman",去和emp表中的每一行進行一一匹配,依然重
復上述步驟。
以上就是mysql系列一文讀懂union(all)與limit及exists關鍵字教程的詳細內容,更多關于mysql系列union(all)與limit及exists關鍵字的資料請關注服務器之家其它相關文章!
原文鏈接:https://huang-tong-xue.blog.csdn.net/article/details/107434783