一、表设计之关联关系
-
外键:主键是用于表示数据的唯一性字段,外键是用于建立关联关系的字段,值通常指向另一张表的主键
-
一对一
-
什么是一对一的关系:有A,B两张表,A表中一条数据对应B表中的一条数据,称之为一对一的关系
-
应用场景:用户表和用户详情表,商品表和商品信息扩展表
-
如何建立关系:在从表中添加外键执行主表的主键
-
练习:创建User(id,username,password)和user_info表(uid,nick,age,phone,address)然后插入以下数据
1 李白 libai123 太白 28 13838283388 四川江邮 2 杜甫 dufu123 子美 24 13232323322 四川成都 3 白居易 bai123 乐天 27 13131313311 河南郑州
-- 创建表 create table user( id int primary key auto_increment, #主表的主键 username varchar(50), password varchar(50) ); create table user_info( uid int, #从表的外键,指向主表的主键 nick varchar(50), age int, phone varchar(50), address varchar(50) ); -- 添加数据 insert into user values (null,'李白','libai123'), (null,'杜甫','dufu123'), (null,'白居易','bai123'); insert into user_info values (1,'太白',28,'13838283388','四川江邮'), (2,'子美',24,'13232323322','四川成都'), (3,'乐天',27,'13131313311','河南郑州');
-
查询每一个用户的用户名,昵称和电话
select u.username,ui.nick,ui.phone from user u left join user_info ui on u.id = ui.uid;
-
查询太白的用户名和密码
select u.username,u.password from user u left join user_info ui on u.id = ui.uid where ui.nick = '太白'
-
查询白居易的昵称和家庭住址
select ui.nick,ui.address from user u left join user_info ui on u.id = ui.uid where u.username = '白居易'
-
-
一对多
-
什么是一对多的关系,有A,B两张表,A表中的一条数据对应B表中的多条数据,同时B表中的一条数据对应A表中的一条数据
-
应用场景:员工表和部门表,商品表和商品分类表
-
如何建立关系:在多的表中添加外键指向另一张表的主键
-
练习
-
创建 t_emp(id,name,sal,dept_id) 和t_dept(id,name, loc)
create table t_emp( id int primary key auto_increment, name varchar(50), sal double, dept_id int # 外键 指向t_dept表的主键 ); create table t_dept( id int primary key auto_increment, name varchar(50), loc varchar(50) )
-
保存以下数据
1 诸葛亮 3000 法师部 A国 2 周瑜 2000 法师部 A国 3 关羽 1500 战士部 B国 4 张飞 1000 战士部 B国 5 孙尚香 5000 射手部 C国
insert into t_dept values (null,'法师部','A国'), #1 (null,'战士部','B国'), #2 (null,'射手部','C国'); #3 insert into t_emp values (null,'诸葛亮',3000,1), (null,'周瑜',2000,1), (null,'关羽',1500,2), (null,'张飞',1000,2), (null,'孙尚香',5000,3)
-
查询每个员工的名字和所在部门的名称
SELECT e.name,d.name FROM t_emp e LEFT JOIN t_dept d ON e.dept_id = d.id
-
查询A国的员工姓名
SELECT e.name FROM t_emp e LEFT JOIN t_dept d ON e.dept_id = d.id WHERE d.loc='A国'
-
查询张飞的部门名称
SELECT d.name FROM t_emp e LEFT JOIN t_dept d ON e.dept_id = d.id WHERE e.name='张飞'
-
查询工资在2000以下员工的姓名,所在地
SELECT e.name,d.loc FROM t_emp e LEFT JOIN t_dept d ON e.dept_id = d.id WHERE e.sal <2000
-
-
-
-
多对多
-
什么是多对多:A B两张表,A表中的一条数据对应B表中的多条数据,同时B表中的一条数据对应A表中的多条数据
-
应用场景:学生表和老师表
-
如何建立关系:创建一个关系表,两个字段,分别执行另外两张表的主键
-
练习:
-
创建student(id,name)表和teacher(id,name) 和关系表
-
保存以下数据
张老师: 张三,李四,刘红,赵小绿,钱小能 李老师:张三,赵小绿,李小红,江波,西门长海 孙老师:江波,张三,钱枫,刘红,赵德柱 王老师:西门长海,赵德柱,江波,钱小能,李菲菲
-
表设计
创建表并添加数据
create table student( id int primary key auto_increment, name varchar(30) ); insert into student values (null,'张三'),(null,'李四'),(null,'刘红'), (null,'赵小绿'),(null,'钱小能'),(null,'李晓红'), (null,'江波'),(null,'西门长海'),(null,'钱枫'), (null,'赵德柱'),(null,'李菲菲'); create table teacher( id int primary key auto_increment, name varchar(50) ); insert into teacher values (null,'张老师'),(null,'李老师'), (null,'孙老师'),(null,'王老师'); create table s_t_table( t_id int, s_id int ); insert into s_t_table values (1,1),(1,2),(1,3),(1,4),(1,5), (2,1),(2,4),(2,6),(2,7),(2,8), (3,7),(3,1),(3,9),(3,3),(3,10), (4,8),(4,10),(4,7),(4,5),(4,11);
-
查询每个学生对应的老师
SELECT s.name,t.name FROM student s LEFT JOIN s_t_table stt ON s.id = stt.s_id LEFT JOIN teacher t ON t.id = stt.t_id;
-
查询孙老师的学生有哪些
SELECT s.name FROM student s LEFT JOIN s_t_table stt ON s.id = stt.s_id LEFT JOIN teacher t ON t.id = stt.t_id WHERE t.name = '孙老师'
-
查询江波的老师是谁
SELECT t.name FROM student s LEFT JOIN s_t_table sst ON s.id = sst.s_id LEFT JOIN teacher t ON t.id = sst.t_id WHERE s.name = '江波'
-
-
二、自关联
-
当前表的外键指向当前表的主键,这种关联方式叫做自关联
-
应用场景:需要保存上下级关系的时候( Z-Tree)
-
查询时使用内连接即可 join on
-
查询员工姓名和对应的主管名称
SELECT e.ename,m.ename FROM emp e JOIN emp m ON e.mgr = m.empno
三、连接方式和关联关系
-
连接方式:包括 等值连接 、内连接,外连接(左外连接,右外连接) 是指查询多张表(等值连接和内连接是把一张表看做两张表的)数据的时候使用的查询方式
-
关联关系:包括:一对一 , 一对多, 多对多, 是指设计表的时候,两张表之间存在的逻辑关系