来自拉钩教育-JAVA就业集训营
1. 多表
2. 多表关系设计
3. 多表查询
4. 子查询 (SubQuery)
----------------------------------------------------------
1. 多表
1.1 多表简述
实际开发中,一个项目通常需要很多张表才能完成。
例如一个商城项目的数据库,需要有很多张表:用户表、分类表、商品表、订单表....
1.2 单表的缺点
1.2.1 数据准备
1.创建一个数据库db3
create database db3 character set utf8;
数据库中 创建一个员工表 emp ,
包含如下列 eid, ename, age, dep_name, dep_location
eid 为主键并 自动增长, 添加 5 条数据
# 创建emp表 主键自增
create table emp(
eid int primary key auto_increment,
ename varchar(20),
age int,
dep_name varchar(20),
dep_location varchar(20)
);
1.2.2 单表的问题
冗余, 同一个字段中出现大量的重复数据
image.png
1.3 解决方案
1.3.1 设计为两张表
多表方式设计
department 部门表 : id, dep_name, dep_location
employee 员工表: eid, ename, age, dep_id
删除emp表, 重新创建两张表
# 创建部门表
# 一方,主表
CREATE TABLE department(
id INT PRIMARY KEY AUTO_INCREMENT,
dep_name VARCHAR(30),
dep_location VARCHAR(30)
);
# 创建员工表
# 多方 ,从表
CREATE TABLE employee(
eid INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(20),
age INT,
dept_id INT
);
1.3.2 表关系分析
部门表与员工表的关系
image.png
员工表中有一个字段dept_id 与部门表中的主键对应,员工表的这个字段就叫做 外键
拥有外键的员工表 被称为 从表, 与外键对应的主键所在的表叫做 主表
1.3.3 多表设计上的问题
# 插入一条 不存在部门的数据
insert into employee (ename,age,dept_id) values('无名',35,3);
image.png
实际上我们应该保证,员工表所添加的 dept_id , 必须在部门表中存在.
解决方案:
使用外键约束,约束 dept_id ,必须是 部门表中存在的id
1.4 外键约束
1.4.1 什么是外键
外键指的是在 从表 中 与 主表 的主键对应的那个字段,比如员工表的 dept_id,就是外键
使用外键约束可以让两张表之间产生一个对应关系,从而保证主从表的引用的完整性
image.png
多表关系中的主表和从表
主表: 主键id所在的表, 约束别人的表
从表: 外键所在的表多, 被约束的表
image.png
1.4.2 创建外键约束
语法格式:
1.新建表时添加外键
[constraint][外键约束名] foreign key (外键字段名) references 主表名(主键字段名)
2.已有表添加外键
alter table 从表 add [constraint][外键约束名] foreign key (