以前,被子查詢這種語句弄得超迷糊,然後在交大的學習平台上發現原來很多情況都不需要子查詢,直接乙個where就搞定了,但是並不了解哪些對應關係。
但是啊,不知道其他初學者有沒有這種感受:看網上哪些例子是非常懂的,然而自己用在專案中,思維卻卡機了。無奈之下,我還是繼續研究了哪位大神的原始碼,如下:
select r.roleid,r.rolename,r.deptid,d.deptname,group_concat(m.menuname separator ',' ) menuname
from js_role r
left join js_role_menu rm on r.roleid = rm.roleid
left join js_menu m on m.menuid = rm.menuid
left join js_dept d on d.deptid = r.deptid
group by r.roleid
注:group_concat(m.menuname separator 『,』 ) - 表示:按組,合併列表中的menuname欄位並以』,'分隔
當時要查的四張表,分別是部門表,角色表,角色_選單表和選單表,要查出每個角色的許可權,以及部門名稱。
附上表的資料:
角色_選單表就相當於許可權表,存放的是角色的id和授權選單的id。
然後當時寫了乙個sql:
select r.roleid,r.rolename,r.deptid,d.deptname,
group_concat(m.menuname separator ',') menuname
from
js_dept d,js_role r,js_role_menu rm,js_menu m
where d.deptid = r.deptid
and rm.roleid = r.roleid
and m.menuid = rm.menuid
group by r.roleid
還是相當輕鬆的,然後我就結合了兩種方法去對比理解了。
首先主表為js_role,第乙個left join,將js_role_model新增至末尾,同理,第三個第四個表都被join到了主表上面,至group by之前,其實這個表大概的樣子就是
表名js_role表
js_role_menu表
js_menu表
js_user表
有沒有發現用where寫sql語句中的from和這張表是完全對應的,而其他的關鍵字比如join中的on對應的就是where … and … ,對應了關係拆解開來就很容易理解了。
因為這個例子裡都是用***id來做條件篩選,id不可能為空,所以如果執行途中有一條沒有對應,那麼它之後連線上的所有表內容全都為null,符合開發的要求(shiro框架)。
好了,來總結一下left join的效果:
2023年4月3日 10:06:01 更新
關於left join的應用,時間久了就會有一種心境的變化,包括開發也一樣。所以如果時間足夠,不需要刻意去了解left join的高階使用,在開發中可以有多種方式達到類似的效果,等你熟練掌握了其他方式之後,left join也一點就通了,反之亦然。
Sql語句中的DDL語句
資料庫模式定義語言ddl data definition language 是用於描述資料庫中要儲存的現實世界實體的語言。主要由create 新增 alter 修改 drop 刪除 和 truncate 刪除 四個關鍵字完成。create database 資料庫名 建立乙個資料庫 create d...
sql查詢語句中
sql查詢語句中select t.status,t.rowid from person t where t.status 2,此處查詢的是status不等於2的記錄,並過濾掉status為null的記錄。注意 此處不管status是integer型別還是long型別,都會過濾掉status為null...
SQL語句中 ( ) 含義
表示外連線。條件關聯時,一般只列出表中滿足連線條件的資料。如果條件的一邊出現 則可列出該表中在條件另一側的資料為空的那些記錄。比如兩個表 員工表和工資表。員工表中有總經理 a b c四條記錄,工資表中只有a b c三人的記錄。如果寫如下語句 select 姓名,工資 from 員工表,工資表 whe...