MYSQL多表聯(lián)查on和where的區(qū)別小結(jié)
一、背景
在一次對(duì)數(shù)據(jù)進(jìn)行統(tǒng)計(jì)的時(shí)候,需要對(duì)兩張表進(jìn)行關(guān)聯(lián),類(lèi)似于這樣的語(yǔ)句a left join b on a.id = b.id where b.name = xx。發(fā)現(xiàn)最終的結(jié)果和預(yù)期不一致,匯總之后的數(shù)據(jù)變少了。
一開(kāi)始還比較費(fèi)解,后面回過(guò)神來(lái)才發(fā)現(xiàn),犯了一個(gè)低級(jí)的錯(cuò)誤,就是在使用left join時(shí)過(guò)濾條件放到on后面還是where后面是有區(qū)別的,如果沒(méi)有搞清楚他們的區(qū)別,連表匯總的結(jié)果就會(huì)變少或者變多。
二、探究
student表
classes表
2.1、統(tǒng)計(jì)每個(gè)班級(jí)中女生的數(shù)量 錯(cuò)誤的寫(xiě)法
select a.name, count(b.name) as num from classes a left join students b on a.id = b.class_id where b.gender = 'F' group by a.name
查詢(xún)結(jié)果
正確的寫(xiě)法
select a.name, count(b.name) as num from classes a left join students b on a.id = b.class_id and b.gender = 'F' group by a.name
查詢(xún)結(jié)果
2.2、只統(tǒng)計(jì)"一班"的學(xué)生數(shù)量 錯(cuò)誤的寫(xiě)法
select a.name, count(b.name) as num from classes a left join students b on a.id = b.class_id and a.name = '一班' group by a.name
查詢(xún)結(jié)果
正確的寫(xiě)法
select a.name, count(b.name) as num from classes a left join students b on a.id = b.class_id where a.name = '一班' group by a.name
查詢(xún)結(jié)果
問(wèn)題一錯(cuò)誤的原因:由于在where條件中對(duì)右表限制,導(dǎo)致數(shù)據(jù)缺失(四班應(yīng)該有個(gè)為0的結(jié)果)。
問(wèn)題二錯(cuò)誤的原因:由于在on條件中對(duì)左表限制,導(dǎo)致數(shù)據(jù)多余(其他班的結(jié)果也出來(lái)了,還是錯(cuò)的)。on 后跟關(guān)聯(lián)表(從表)的過(guò)濾條件,如果再加篩選條件只針對(duì)關(guān)聯(lián)表!
on 后跟關(guān)聯(lián)表(從表)的過(guò)濾條件,where 后跟主表或臨時(shí)表的篩選條件(左連接為例,主表的數(shù)據(jù)都會(huì)查詢(xún)到,所以臨時(shí)表中必定包含主表所有的字段,需要給主表加什么篩選條件,直接給臨時(shí)表加效果相同) 。
三、總結(jié)
通過(guò)上面的問(wèn)題現(xiàn)象和分析,可以得出了結(jié)論:在left join語(yǔ)句中,左表過(guò)濾必須放where條件中,右表過(guò)濾必須放on條件中,這樣結(jié)果才能不多不少,剛剛好。
到此這篇關(guān)于MYSQL多表聯(lián)查on和where的區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)MYSQL on和where區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql數(shù)據(jù)庫(kù)中各種鎖歸納總結(jié)
相對(duì)于其他的數(shù)據(jù)庫(kù)而言,MySQL的鎖機(jī)制比較簡(jiǎn)單,最顯著的特點(diǎn)就是不同的存儲(chǔ)引擎支持不同的鎖機(jī)制,這篇文章主要給大家介紹了關(guān)于mysql數(shù)據(jù)庫(kù)中各種鎖歸納總結(jié)的相關(guān)資料,需要的朋友可以參考下2024-08-08centos上安裝mysql并設(shè)置遠(yuǎn)程訪(fǎng)問(wèn)的操作方法
這篇文章主要介紹了centos上安裝mysql并設(shè)置遠(yuǎn)程訪(fǎng)問(wèn)的操作方法,需要的朋友可以參考下2017-11-11Mysql sql慢查詢(xún)監(jiān)控腳本代碼實(shí)例
這篇文章主要介紹了Mysql sql慢查詢(xún)監(jiān)控腳本代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11MySQL for update鎖表還是鎖行校驗(yàn)(過(guò)程詳解)
在MySQL中,使用for update子句可以對(duì)查詢(xún)結(jié)果集進(jìn)行行級(jí)鎖定,以便在事務(wù)中對(duì)這些行進(jìn)行更新或者防止其他事務(wù)對(duì)這些行進(jìn)行修改,這篇文章主要介紹了MySQL for update鎖表還是鎖行校驗(yàn),需要的朋友可以參考下2024-02-02master and slave have equal MySQL server ids
Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids2013-07-07