外键与单表查询

昨日内容回顾

  • 日期类型

    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.代码敲一遍
	将敲完之后的截图花群里
posted @ 2021-01-05 21:54  KaiLun  阅读(163)  评论(0)    收藏  举报