mysql第五天

表设计之关联关系

一对一:

  • 什么是一对一:有两张表A和B,A表中有一条数据对应B表中的一条数据称为一对一关系
  • 应用场景: 用户表和用户信息扩展表,商品表和商品信息扩展
  • 如何建立关系:在从表中添加一个字段记录主表的id,用户表和用户信息扩展表中,用户表为主表,信息扩展表为从表,用户表中的id 称为主键, 从表中记录主表id的字段称为外键,主键用来表示数据的唯一性,外键用来和其它表建立关系.

  • 练习:创建user(id,username,password)和userinfo(id,nick,age,phone)两张表然后往两个表里面各插入3条有关系的数据 create table user(id int primary key auto_increment,username varchar(10),password varchar(10)); create table userinfo(id int,nick varchar(10),age int,phone varchar(15));

  • 插入数据 insert into user values(null,'libai','admin'),(null,'lisi','admin'),(null,'liubei','123'); insert into userinfo values(1,'李白',25,'13838383388'),(2,'李四',15,'131223232'),(3,'刘备',40,'2342342');
  • 查询每一个用户的用户名,昵称,电话 select u.username,ui.nick,ui.phone from user u join userinfo ui on u.id=ui.id;
  • 查询名字叫李白的所有信息 select * from user u join userinfo ui on u.id=ui.id where ui.nick='李白';

一对多

  • 什么是一对多:AB两张表中A表中一条数据对应B表中多条数据,并且B表中一条数据对应A表中一条数据,两张表的关系称为一对多.
  • 应用场景:部门和员工,商品和分类等
  • 如何建立关系: 一对多的两张表,在多的表中添加一个字段记录另外一张表的id.
  • 练习:创建temp(id,name,sal,deptid),tdept(id,name,loc), 两张表中插入数据:部门表插入神仙部loc为西天, 妖怪部 loc为盘丝洞, 员工表插入,猪八戒,孙悟空,蜘蛛精和白骨精. create table temp(id int primary key autoincrement,name varchar(10),sal double,deptid int); create table tdept(id int primary key autoincrement,name varchar(10),loc varchar(20)); insert into tdept values(null,'神仙','西天'),(null,'妖怪','盘丝洞'); insert into temp values(null,'猪八戒',2000,1),(null,'孙悟空',3000,1),(null,'蜘蛛精',1000,2),(null,'白骨精',4000,2);

  • 查询每个部门对应的每个员工 select * from temp e join tdept d on e.deptid=d.id

  • 查询每个员工对应的每个部门只显示工资大于2000的信息, select * from temp e join tdept d on e.deptid=d.id where e.sal>2000;

多对多

  • 什么是多对多:AB两张表,A表中的一条数据对应B表的多条数据,同时B表的一条数据对应A表的多条数据,这种关系称为多对多
  • 应用场景: 老师表和学生表,用户表和角色表
  • 如何建立关系:需要创建一个关系表,在关系表中记录两个表的id.
  • 练习: 创建老师(id,name)和学生表(id,name),创建老师和学生关系表ts(tid,sid) create table teacher(id int primary key autoincrement,name varchar(10)); create table student(id int primary key autoincrement,name varchar(10)); create table ts(tid int,sid int);

    insert into teacher values(null,'唐僧'),(null,'刘备'),(null,'苍老师');
    insert into student values(null,'悟空'),(null,'关羽'),(null,'小明');
    
  • 关系表中插入数据唐僧是悟空和小明的老师,刘备是关羽的老师,苍老师是所有人的老师 insert into t_s values(1,1),(1,3),(2,2),(3,1),(3,2),(3,3);
  • 查询老师和学生表中 每个学生名子和对应的老师名字 select s.name,t.name from teacher t join t_s ts on t.id=ts.tid join student s on ts.sid=s.id;
  • 查询苍老师的所有学生姓名 select s.name from teacher t join t_s ts on t.id=ts.tid join student s on ts.sid=s.id where t.name='苍老师';
  • 查询小明的所有老师 select t.name from teacher t join t_s ts on t.id=ts.tid join student s on ts.sid=s.id where s.name='小明';
  • 子查询方式: select name from teacher where id in(select tid from t_s where sid=(select id from student where name='小明'));

自关联

  • 什么是自关联:在一张表中有一个字段指向当前表的id,这种称为自关联
  • 是什么时候使用自关联:当保存的数据有层级关系并且不确定有多少层的时候使用自关联.
  • 查询员工姓名和对应的上级姓名

    select e.ename,m.ename
    from emp e join emp m
    on e.mgr=m.empno
    

连接方式和关联关系

  • 连接方式:包括内连接和外连接(左外和右外),是指通过sql查询两张表数据时使用的查询方式.
  • 关联关系:包括一对一,一对多,多对多,是指设计表时两张表之间存在的逻辑关系.

案例:权限管理的表设计

  1. 创建db5数据库并use,创建5张表: user(id,name),role(id,name),module(id,name), 用户和角色关系表ur(uid,rid), 角色和权限关系表rm(rid,mid) create table user(id int primary key auto_increment,name varchar(10)); create table role(id int primary key autoincrement,name varchar(10)); create table module(id int primary key autoincrement,name varchar(10));

    create table u_r(uid int,rid int);
    create table r_m(rid int,mid int);
    
  2. 插入数据user:刘德华,张学友,凤姐 role:男游客,男会员,女游客,女管理员 module:男浏览,男发帖,女浏览,女发帖,女删帖 insert into user values(null,'刘德华'),(null,'张学友'),(null,'凤姐'); insert into role values(null,'男游客'),(null,'男会员'),(null,'女游客'),(null,'女管理员'); insert into module values(null,'男浏览'),(null,'男发帖'),(null,'女浏览'),(null,'女发帖'),(null,'女删帖');
  3. 建立关系 刘德华是男游客 张学友是男会员,凤姐是女游客和男会员, 男游客对应男浏览 男会员对应男浏览和男发帖 女游客对应女浏览,女管理员对应女浏览女发帖和女删帖 insert into ur values(1,1),(2,2),(3,3),(3,2); insert into rm values(1,1),(2,1),(2,2),(3,3),(4,3),(4,4),(4,5);
  4. 做题:
  5. 查询每个用户对应的所有权限

    select u.name,m.name
    from user u join u_r ur
    on u.id=ur.uid
    join r_m rm
    on ur.rid=rm.rid
    join module m
    on rm.mid=m.id;
    
  6. 查询刘德华对应的所有权限

    select u.name,m.name
    from user u join u_r ur
    on u.id=ur.uid
    join r_m rm
    on ur.rid=rm.rid
    join module m
    on rm.mid=m.id
    where u.name='刘德华';
    
  7. 有男发帖的用户都有哪些

    select u.name,m.name
    from user u join u_r ur
    on u.id=ur.uid
    join r_m rm
    on ur.rid=rm.rid
    join module m
    on rm.mid=m.id
    where m.name='男发帖';

猜你喜欢

转载自blog.csdn.net/anqing_liu/article/details/80473373