天天看點

多表查詢,内連接配接(隐式、顯示),外連接配接(左外、右外、基礎表)

隐式内連接配接:select user_name as ‘昵稱’,gname as ‘遊戲名稱’,score as ‘分數’

from users,games,scores

where users.user_qq=scores.user_qq

and games.gno=scores.gno

隐式内連接配接文法 select 字段名 from 表1,表2 [ ,表3… ] where 連接配接條件 [ and 查詢/連接配接條件 … ];

from子句後面直接出現多個表名,這種連接配接方式即屬于内連接配接,是隐式連接配接

顯式内連結:select col_list from table1 inner join table2 on table1.col=table2.col

顯式内連接配接文法 select 字段名 from 表1 join 表2 on 連接配接條件 [ join 表3 on 連接配接條件 … where 查詢條件 … ];

顯示内連接配接比隐式内連接配接相同情況下更快。on是連接配接條件的限定

外連接配接:

分為左外連接配接和右外連接配接

外連接配接特點:

做連接配接的兩個表地位不相等,其中有一張是基礎表

基礎表中的每條資料必須出現,即使另外一張表中沒有資料與之比對,也要用Null補齊

左外連接配接時左表為基礎表,右外連接配接時右表為基礎表

語句中先出現的表為‘左表’,後出現的表為‘右表’

select col_list

from table1 left|right| join table2

on table1.col=table2.col

(left代表左外連接配接,right代表右外連接配接)

例如:查詢所有玩家關于5号遊戲的分數資訊

select user_name as ‘昵稱’,

gno as ‘遊戲編号’,

score as ‘分數’

from users u left join scores s

on u.user_qq=s.user_qq

and s.gno=5

(如果把left去掉,則變成了内連接配接,那麼沒有玩過5号遊戲的玩家就不會被顯示出來)

下面是一個老王的例子:

select * from pe_user;

角色表

select * from pe_role;

角色使用者表(中間表) 得知 一個使用者屬于哪個角色

select * from pe_role_user;

** 權限表(功能表,子產品表)**

select * from ss_module;

角色權限表(中間表) 得知 一個角色有哪些權限

select * from pe_role_module;

隐式内連接配接

select m.name from pe_user u,pe_role_user ru,pe_role r,pe_role_module rm,ss_module m
where u.user_id = ru.user_id 
and ru.role_id = r.role_id 
and r.role_id =  rm.role_id
and rm.module_id = m.module_id
and u.user_name='老王'
           

顯示内連接配接

select m.name from pe_user u inner join pe_role_user ru inner join pe_role r inner join pe_role_module rm inner join ss_module m
on u.user_id = ru.user_id 
and ru.role_id = r.role_id 
and r.role_id =  rm.role_id
and rm.module_id = m.module_id
and u.user_name='老王'