外键与单表查询
昨日内容回顾
-
日期类型
date time datetime year -
枚举与集合
多选一 enum gender enum() 多选多(多选一) set hobbies set() -
创建表的完整语法
create table 表名( 字段名1 字段类型(数字) 约束条件 字段名1 字段类型(数字) 约束条件 字段名1 字段类型(数字) 约束条件 ); 1.字段名 字段类型必须有值 2.约束条件可循啊 3.约束条件可以同时有多个 4.最后一个数据后面没有逗号 -
约束条件
1.unsigned 2.zerofill 3.not null 4.default 5.unique 6.primary key ''' 针对主键 1.innodb存储引擎规定了所有的表有且只有主键 没有主键但是有非空且唯一的字段自动升级为主键 没有任何键字段,采用非内部隐藏的(无法使用,查询效率低) 2.所有的表·都应该有一个id字段,并且id字段应该设置为主键 ''' 7.aith_increment 主要就是用于主键自增使用 结论: 表创建基础命令 id int primary key auto_increment主键自增的特点
不会因为删除操作而重置
delete from
只删除数据
要重置的花必须使用
truncate
清空数据并重置主键(其实不如直接创建新表来着)
修改表的操作
```python
alter table t1 add pwd int;
alter table t1 add pid int first;
alter table t1 add phone int after pwd;
alter table t1 drop pid;
# 针对已经有数据的表,添加字段的时候应该给该字段先设置一个默认值
复制表(了解)
# sql语句的查询结构我们可以看成是一张存在于内存中的虚拟表
# 只复制数据
create table t2 select * from t1;
# 之复制表结构
create table t3 like t1;
今日内容概要
主题:表与表之间
-
外键前戏
-
表关系的判断准则
-
表关系之一对多
-
外键字段的约束
-
表关系之多对多
-
表关系之一对一
-
作业
-
单表查询(重点)
select from where group by having distinct order by limit regexp
-
今日内容详细
外键前戏
# 创建一张员工为例
id name age dep_name dep_desc
'''
缺点:
1.表结构不清晰
既可以看成是员工表也可以看做是部门表
2.浪费存储资源
部分数据反复
3.可扩展性差
修改数据条目重复太多
'''
# 如何解决上述三个问题
拆表
id name age
id dep_name dep_desc
'''
虽然拆表解决了上述三个问题,但是信息的对应变得不明确
'''
在员工表创建一个字段,使两个表关系对应起来
结论:
我们将记录表与表之间的关系字段称之为'外键'
表关系的判断准则
'''换位思考'''
一定要站在双方的角度思考才能够下结论,不能单独拿出一方的结果作为结论依据
表关系之'一对多'
以员工表为例
1.先站在运功表的基础上
问:员工标的一条数据能否对应多个部门
结论:不可以
2.再站在部门表的基础上
问:部门表的一台数据能否对应员工表里的多条数据
结论:可以
'''
换位思考完成之后才可以判断表与表之间的关系
一个可以一个不可以表与表之间的关系就是'一对多'
在mysql里一对多,多对一都称之为一对多
'''
# 针对一对多的表关系,维护关系的字段建在哪一方呢
建在多的一方(案列中文建在员工表中)
# sql语句实现
刚开始不熟练的情况下可以先创建基础表,之后再考虑外键字段
create table emp(
id int prumary key auto_increment,
name varchar(32),
age int,
dep_id int,
foreigen key(dep_id) references dep(id)
);
create table dep(
id int prumary key auto_increment,
dep_name varchar(32),
dep_desc varchar(64)
);

外键字段的约束
1.在创建表的时候,要先创建被关联表(没有外键字段的表)
2.在插入数据时一定要先插入被关联表(没有外键字段的表)
# 被关联表中一定要现有数据才可以插入关联表数据
3.无法直接更新或者删除被关联表的关系字段(没有外键字段的表)
# 针对该问题解决方案 级联更新,级联删除
create table dep1(
id int primary key auto_increment,
dep_name varchar(32),
dep_desc varchar(64)
);
create table emp1(
id int primary key auto_increment,
name varchar(32),
age int,
dep_id int,
foreign key(dep_id) references dep1(id)
on update cascade
on delete cascade
);

表关系之多对多
以作者与书的关系
1.站在书
问:书里面的一条数据能否对应多个作者
结论:可以
2.再站在作者的角度
问:一个作者能否写多本书
结论:可以
'''
换位思考完成之后才可以判断表与表之间的关系
一个可以另一个也可以表与表之间的关系就是'多对多'
'''
# 针对多对多的表关系,维护关系的外键字段建在哪一方?
'''
针对多对多的表关系,外键字段不建在任意表中,而是新建一张表关联两张表
两张关系表之间没有直接联系,全部关系全部依赖于第三张关系表,并且可以不绑定关系,但是关系表中出现的值需要在两张表之中先出现
'''
create table book(
id int primary key auto_increment,
title varchar(32),
price float(8,2)
);
create table author(
id int primary key auto_increment,
name varchar(32),
phone int
);
'''
create table boo_author(
id int primary key auto_inrement,
author_id int,
book_id int,
foreign key(book_id) references book(id)
on update cascade
on delete cascade,
foreign key(author_id) references author(id)
on update cascade
on delete cascade
);
'''
create table book2author(
id int primary key auto_increment,
author_id int,
book_id int,
foreign key(book_id) references book(id)
on update cascade
on delete cascade,
foreign key(author_id) references author(id)
on update cascade
on delete cascade
);

表关系之'一对一'
1.QQ用户表与用户详情表
先站在用户表
问:用户表里面的数据能否对应多个用户详情
结论:不可以
再站在用户详情表
问:用户详情表能否对应多个用户表
'''
换位思考完成之后才可以判断表与表之间的关系
一个不可以另一个也不可以表与表之间的关系就是'一对一'(或者没关系)
'''
# 针对一对一的表关系,维护关系的外键字段建在哪一方?
'''
针对一对一的表关系,外键字段可以建在任意一张表,但是推荐建在热数据表格中,且数据需拥有唯一性
unique
'''
create table user(
id int primary key auto_increment,
name varchar(32),
phone int,
detail_id int unique,
foreign key(detail_id) references userDetail(id)
on update cascade
on delete cascade
);
create table userDetail(
id int primary key auto_increment,
addr varchar(32),
phone int
);
2.客户表与学生表

作业
1.笔记抄写
2.代码敲一遍
将敲完之后的截图花群里

浙公网安备 33010602011771号