天天看点

多表查询,内连接(隐式、显示),外连接(左外、右外、基础表)

隐式内连接: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='老王'