1. 程式人生 > >mysql資料庫(入門)五

mysql資料庫(入門)五

關聯關係之表設計

  • 外來鍵: 用來建立關係的欄位稱為外來鍵
  • 主鍵: 用來表示資料唯一性的欄位稱為主鍵

一對一

  • 有AB兩張表,A表中的一條資料對應B表中的一條資料同時B表一條對應A表一條,這種關係稱為一對一
  • 應用場景:商品表和商品詳情表,
  • 如何建立關係: 在從表中新增外來鍵,外來鍵的值指向主表的主鍵

練習:請設計表儲存以下資料

  • 使用者名稱:wukong 密碼:123456 暱稱:齊天大聖 電話:13733666633 地址:花果山
  • 使用者名稱:bajie 密碼:abcd 暱稱:二師兄 電話:13833446622 地址:高老莊
  • 使用者名稱:libai 密碼:aabbcc 暱稱:李白 電話:13355668877 地址:語文書裡
    create table user(id int primary key auto_increment,username varchar(10),password varchar(10));
    create table userinfo(userid int,nick varchar(10),tel varchar(15),address varchar(20));
    insert into user values(null,'wukong','123456'),(null,'bajie','bacd'),(null,'libai','aabbcc');
    insert into userinfo values(1,'齊天大聖','13833446622','花果山'),(2,'二師兄','13833446622','高老莊'),(3,'李白','13833446622','語文書裡');
    
  • 完成以下查詢:

  • 查詢李白的使用者名稱和密碼是什麼
    select u.username,u.password
    from user u join userinfo ui
    on u.id=ui.userid
    where ui.nick='李白';
    
  • 查詢每一個使用者的所有資訊
    select *
    from user u join userinfo ui
    on u.id=ui.userid;
    
  • 查詢使用者名稱bajie 的暱稱是什麼
    select ui.nick
    from user u join userinfo ui
    on u.id=ui.userid
    where u.username='bajie';
    
  • 一對多

    • AB兩張表,A表中的一條資料對應B表中的多條資料,同時B表中的一條資料對應A表中的一條資料,稱為一對多
    • 應用場景: 員工-部門, 商品-分類
    • 如何建立關係: 在多的一端新增外來鍵指向另外一張表的主鍵

    練習:建立表儲存以下資料 t_emp t_dept

  • 悟空 28歲 3000月薪 神仙部 花果山
  • 劉備 34歲 8000月薪 三國部 蜀國
  • 路飛 18歲 1000月薪 海賊部 日本
  • 八戒 30歲 4000月薪 神仙部 花果山
      create table t_emp(empno int primary key auto_increment,ename varchar(10),age int,sal int,deptno int);
        create table t_dept(deptno int primary key auto<em>increment,dname varchar(10),loc varchar(10));
        insert into t_dept values(null,'神仙部','花果山'),(null,'三國部','蜀國'),(null,'海賊部','日本');
        insert into t_emp values(null,'悟空',28,3000,1),(null,'劉備',34,8000,2),(null,'路飛',18,1000,3),(null,'八戒',30,4000,1);
    
  • 做題:
  • 查詢每個員工的姓名和部門名
    select e.ename,d.dname
    from t_emp e join t_dept d
    on e.deptno=d.deptno;
    
  • 查詢工作在花果山的員工姓名及工資
    select e.ename,e.sal
    from t_emp e join t_dept d
    on e.deptno=d.deptno
    where d.loc='花果山';
    
  • 多對多

    • AB兩張表,A表中一條資料對應B表中多條資料同時B表中一條資料對應A表中多條,稱為多對多
    • 應用場景: 老師-學生 使用者-角色
    • 如何建立關係:需要建立新的關係表,表中新增兩個外來鍵,指向兩個主表的主鍵

    練習:建立表儲存以下資料

  • 唐僧的學生有:悟空,大哥
  • 蒼老師的學生有: 大哥,大姐
    create table teacher(id int primary key auto_increment,name varchar(10));
    create table student(id int primary key auto_increment,name varchar(10));
    create table t_s(tid int,sid int);
    insert into teacher values(null,'唐僧'),(null,'老師');
    insert into student values(null,'悟空'),(null,'大哥'),(null,'大姐');
    insert into t_s values(1,1),(1,2),(2,2),(2,3);
    
  • 查詢蒼老師的學生姓名
    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='大哥'
    
  • 表設計之許可權管理案例

    • 建立三張主表user(id,name) role(id,name) module(id,name) 和兩張關係表 u_r(uid,rid)(使用者和角色) r_m(rid,mid)(角色和許可權)

      create table user(id int primary key auto_increment,name varchar(10));	 
      create table role(id int primary key auto_increment,name varchar(10));	
      create table module(id int primary key auto_increment,name varchar(10));
      create table u_r(uid int,rid int);
      create table r_m(rid int,mid int);
      
  • 儲存以下資料: 使用者表:劉德華,貂蟬

    insert into user values(null,'劉德華'),(null,'貂蟬');
    角色表:男遊客,男管理員,女遊客,女會員
    insert into role values(null,'男遊客'),(null,'男管理員'),(null,'女遊客'),(null,'女會員');
    許可權表:男瀏覽,男發帖,男刪帖,女瀏覽,女發帖
    insert into module values(null,'男瀏覽'),(null,'男發帖'),(null,'男刪帖'),(null,'女瀏覽'),(null,'女發帖');
    關係:男遊客-&gt;男瀏覽;男管理員-&gt;男瀏覽,男發帖,男刪帖;女遊客-》女瀏覽;女會員-》女瀏覽,女發帖
    劉德華-》男管理員和女遊客
    貂蟬-》女會員和男遊客
    insert into r_m values(1,1),(2,1),(2,2),(2,3),(3,4),(4,4),(4,5);
    insert into u_r values(1,2),(1,3),(2,4),(2,1);
    
  • 練習:
  • 查詢每個使用者對應的所有許可權
    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;
    
  • 查詢劉德華的所有許可權
    select 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='劉德華';
    
  • 查詢擁有男瀏覽許可權的使用者都是誰
    select u.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='男瀏覽';