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