连表查询

########################## RBAC ################################
DROP TABLE IF EXISTS php34_privilege;
CREATE TABLE php34_privilege
(
	id smallint unsigned not null auto_increment,
	pri_name varchar(30) not null comment ‘权限名称‘,
	module_name varchar(10) not null comment ‘模块名称‘,
	controller_name varchar(10) not null comment ‘控制器名称‘,
	action_name varchar(10) not null comment ‘方法名称‘,
	parent_id smallint unsigned not null default ‘0‘ comment ‘上级权限的ID,0:代表顶级权限‘,
	primary key (id)
)engine=MyISAM default charset=utf8 comment ‘权限表‘;

DROP TABLE IF EXISTS php34_role_privilege;
CREATE TABLE php34_role_privilege
(
	pri_id smallint unsigned not null comment ‘权限的ID‘,
	role_id smallint unsigned not null comment ‘角色的id‘,
	key pri_id(pri_id),
	key role_id(role_id)
)engine=MyISAM default charset=utf8 comment ‘角色权限表‘;

DROP TABLE IF EXISTS php34_role;
CREATE TABLE php34_role
(
	id smallint unsigned not null auto_increment,
	role_name varchar(30) not null comment ‘角色名称‘,
	primary key (id)
)engine=MyISAM default charset=utf8 comment ‘角色表‘;

DROP TABLE IF EXISTS php34_admin_role;
CREATE TABLE php34_admin_role
(
	admin_id tinyint unsigned not null comment ‘管理员的id‘,
	role_id smallint unsigned not null comment ‘角色的id‘,
	key admin_id(admin_id),
	key role_id(role_id)
)engine=MyISAM default charset=utf8 comment ‘管理员角色表‘;

DROP TABLE IF EXISTS php34_admin;
CREATE TABLE php34_admin
(
	id tinyint unsigned not null auto_increment,
	username varchar(30) not null comment ‘账号‘,
	password char(32) not null comment ‘密码‘,
	is_use tinyint unsigned not null default ‘1‘ comment ‘是否启用 1:启用0:禁用‘,
	primary key (id)
)engine=MyISAM default charset=utf8 comment ‘管理员‘;
INSERT INTO php34_admin VALUES(1,‘root‘,‘bafcbdc80e0ca50e92abe420f506456b‘,1);

# 角色表 role
#id    role_name
#-------------
# 1        a
# 2        b

# 权限表 privilege
#id    pri_name
#-------------
# 1        a
# 2        b
# 3        c

# a角色拥有bc两个权限
#php34_role_privilege
#role_id   pri_id
#--------------------
#   1        2              -->  1这个角色拥有2这个权限
#   1        3              -->  1这个角色拥有3这个权限

# 有以上五张表之后写SQL取出管理员ID为3的管理员所拥有的所有的权限
# 流程:1. 先取出3这个管理员所在的角色ID
# SELECT role_id FROM  php34_admin_role WHERE admin_id=3
# 2. 再取出这些角色所拥有的权限的ID
# SELECT pri_id FROM php34_role_privilege WHERE role_id IN (1上面的结果)
# 3. 再根据权限ID取出这些权限的信息
# SELECT * FROM php34_privilege WHERE id IN(2的结果)
# 最终:
# SELECT * FROM php34_privilege WHERE id IN(
#	SELECT pri_id FROM php34_role_privilege WHERE role_id IN (
#		SELECT role_id FROM  php34_admin_role WHERE admin_id=3
#	)
# )
# 写法二、
# SELECT a.*
#   FROM php34_privilege a,php34_role_privilege b,php34_admin_role c
#    WHERE c.admin_id=3 AND b.pri_id=a.id AND b.role_id=c.role_id
# 写法三、
# SELECT b.*
#  FROM php34_role_privilege a
#   LEFT JOIN php34_privilege b ON a.pri_id=b.id
#   LEFT JOIN php34_admin_role c ON a.role_id=c.id
#    WHERE c.admin_id=3

  

时间: 2024-10-11 13:35:37

连表查询的相关文章

Mysql数据库理论基础之五--SELECT单多表查询、子查询、别名

一.简介 由MySQL AB公司开发,是最流行的开放源码SQL数据库管理系统,主要特点: 1.是一种数据库管理系统 2.是一种关联数据库管理系统 3.是一种开放源码软件,且有大量可用的共享MySQL软件 4.MySQL数据库服务器具有快速.可靠和易于使用的特点 5.MySQL服务器工作在客户端/服务器模式下,或嵌入式系统中 InnoDB存储引擎将InnoDB表保存在一个表空间内,该表空间可由数个文件创建.这样,表的大小就能超过单独文件的最大容量.表空间可包括原始磁盘分区,从而使得很大的表成为可能

web day16 数据库 完整性约束,mySQL编码问题,备份与恢复,多表查询

约束 * 约束是添加在列上的,用来约束列的! 1. 主键约束(唯一标识) ****非空*** ****唯一*** ****被引用**** * 当表的某一列被指定为主键后,该列就不能为空,不能有重复值出现. * 创建表时指定主键的两种方式: > CREATE TABLE stu( sid      CHAR(6) PRIMARY KEY, sname     VARCHAR(20), age         INT, gender     VARCHAR(10) ); 指定sid列为主键列,即为s

python3 mysql 多表查询

python3 mysql 多表查询 一.准备表 创建二张表: company.employee company.department #建表 create table department( id int, name varchar(20) ); create table employee( id int primary key auto_increment, name varchar(20), sex enum('male','female') not null default 'male'

07-查询操作(DQL)-多表查询

一. 综述   查询操作主要从两个方面来说:单表查询和多表查询. 多表查询包括:笛卡尔积.外键约束.内连接查询.外链接查询.自连接查询. 二 . 案例设计   1.  设计产品表(product).包括:主键id.产品名称(productName).分类编号(dir_id).零售价(salePrice).供应商(supplier).品牌(brand).折扣(cutoff).成本价(costPrice). 设计产品产品编号表( productdir). 包括:主键id.编号名称( dirName)

SQL联表查询

数据库中最最常用的语法----select.简单的select语法很直白: select column from table where expression: 从((from)存储数据的地方(table)按照(where)一定的条件(expression)查找(select)我要的数据(column); 但是在实际工作中用到的比较多的往往还是多联表查询,所以在这里记下自己学习多联表查询的心得. 首先聊一聊笛卡尔积,这是几乎所有数据库书籍在讲多联表查询时第一个要讲的东西,我等P民也只能是把笛卡尔

Day04 多表查询

1. 笛卡尔集 笛卡尔集会在下面条件下产生: 省略连接条件 连接条件无效 所有表中的所有行互相连接 为了避免笛卡尔集, 可以在 WHERE加入有效的连接条件. 2. Oracle连接 3. 等值连接 4. 表的别名 5. 连接多个表 6. 非等值连接 7. 内连接和外连接 8. 自连接 9. 1999连接 SQL语句的多表查询方式: 例如:按照department_id查询employees(员工表)和departments(部门表) 的信息. 方式一(通用型):SELECT ... FROM

mybatis之联表查询

今天碰到了一个问题,就是要在三张表里面各取一部分数据然后组成一个list传到前台页面显示.但是并不想在后台做太多判断,(因为涉及到for循环)会拉慢运行速度.正好用的框架是spring+springMVC+mybatis,所以很自然的就想到了联表查询. 一开始认为mybatis编写语句很简单,但是在编写的时候遇到了一些细节问题,所以发文记录一下. 先说一下背景: 框架:spring+springMVC+mybatis 表结构: 1.主表 2.从表 从表的uid对应主表的id,并将主表的id设为主

使用Entity Framework Core需要注意的一个全表查询问题

.NET Core 迁移工作如火如荼,今天在使用 Entity Frameowork Core(又名EF Core)时写了下面这样的 LINQ 查询表达式: .Where(u => u.Id == new Guid(userId)).FirstOrDefaultAsync(); 结果在 SQL Server Profiler 中发现竟然进行了全表查询. 之后将 new Guid(userId) 从表达式中移出,保存于一个局部变量中,使用这个局部变量进行查询,全表查询问题就解决了. var use

自动化运维Python系列之ForeignKey、relationship联表查询

一对多和多对多 数据库表结构设计是程序项目开发前的重要环节,后期数据库操作都是围绕着这个已经设计好的表结构进行,如果表结构设计有问题,整个程序项目就有存在需要整个推翻重构的风险... 数据库表结构除了简单的单表操作以外,还有一对多.多对多等. 一对多 基于SQLAlchemy我们可以先创建如下结构的2张表,然后来看看具体怎样通过外键ForeignKey或者relationship联表操作 创建表 from sqlalchemy.ext.declarative import declarative

MySQL数据库实验二:单表查询

实验二   单表查询 一.实验目的 理解SELECT语句的操作和基本使用方法. 二.实验环境 是MS SQL SERVER 2005的中文客户端. 三.实验示例 1.查询全体学生的姓名.学号.所在系. SELECT Sname,S#,Sdept FROM S: 2.查询全体学生的详细记录. SELECT  * FROM S: 3.查全体学生的姓名及其出生年份. SELECT Sname,2011-Sage    /*假定当年的年份为2011年*/ FROM S: 4.查询选修了课程的学生学号.