關於mysql 聯表使用count的乙個問題

2021-07-31 12:26:18 字數 970 閱讀 7582

今天遇到了乙個sql問題,及理解過程記錄下

select a.id as id,

count(b.id)

from a a left join b b on a.id = b.aid

a表可以理解為班級表

b表為學生表,現在用以上語句試圖求出每個班級下多少個學生

這個語句在oracle中,是有問題的,會直接報錯,因為oracle要求非聚合函式的字段都必須進行分組

但是在mysql中不一樣,所以以下分析是針對mysql的

這個語句執行出來貌似mysql自動完成了分組,其實是有細微差別的

當a表有資料時,則很正常

但是當a表為空資料時,執行以上語句,得到以下結果

null,0

從這個結果上看,和分組之後的結果就不一樣了,增加分組

select a.id as id,

count(b.id)

from a a left join b b on a.id = b.aid

group by a.id

得到的結果是無記錄

分析如下:

其實兩個表的關聯,可以理解為,兩個表的所有列合併在一起,所有資料根據連線條件進行笛卡爾積之後得到的乙個大的臨時表,之後的所有過濾或其它函式之類的,就針對這個大的臨時表進行操作

前者的寫法,等同於

select a.id as id,

count(*)

from a a left join b b on a.id = b.aid

其聯合後的臨時表,其實是乙個空表

那麼使用count函式後,資料庫會生成乙個除了count(*)有值,其它欄位都為null的結果集,以顯示count(*) 的計算結果,所以前者就得到了null,0這樣的結果集

而使用分組函式之後,分組函式的特點是,會忽略null值,從而得到正確結果

結論:為了防止此問題的出現,在寫sql時一定要規範,使用了聚合函式的查詢,其它字段必須增加分組函式。

關於聯表更新

例項sql update tblnmdevice t1 set t1.keystr select t2.displayname from tblbusinesssys t2 join tblbusinessdeviceunion t3 on t2.tbluuid t3.businessid wher...

mysql聯表速查

select a.b.from a inner join join b on a.id b.id select a.b.from a left join b on a.id b.id select a.b.from a left join b on a.id b.id where b.id is n...

MySQL聯表查詢

顯示所有員工名字 emp.ename 員工工資 emp.sal 及所在部門的名字 dept.dname 笛卡爾積 emp num dept num 聯表查詢時一定要帶上關聯條件 select ename,sal,dname from emp,dept where emp.deptno dept.de...