外键与单表查询

  • 日期类型

    datetimedatetimeyear
  • 枚举与集合

    多选一enum    gender enum()多选多(多选一)set    hobbies set()
  • 创建表的完整语法

    create table 表名(字段名1 字段类型(数字) 约束条件    字段名1 字段类型(数字) 约束条件    字段名1 字段类型(数字) 约束条件    );1.字段名 字段类型必须有值2.约束条件可循啊3.约束条件可以同时有多个4.最后一个数据后面没有逗号
  • 约束条件

    1.unsigned2.zerofill3.not null4.default5.unique6.primary key'''针对主键1.innodb存储引擎规定了所有的表有且只有主键没有主键但是有非空且唯一的字段自动升级为主键没有任何键字段,采用非内部隐藏的(无法使用,查询效率低)2.所有的表·都应该有一个id字段,并且id字段应该设置为主键'''7.aith_increment主要就是用于主键自增使用结论:表创建基础命令 id int primary key auto_increment

    主键自增的特点

不会因为删除操作而重置
delete from

只删除数据

要重置的花必须使用
truncate

清空数据并重置主键(其实不如直接创建新表来着)

修改表的操作```pythonalter 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;

今日内容概要

主题:表与表之间

  • 外键前戏

    • 表关系的判断准则

    • 表关系之一对多

    • 外键字段的约束

    • 表关系之多对多

    • 表关系之一对一

    • 作业

    • 单表查询(重点)

      selectfromwheregroup byhavingdistinctorder bylimitregexp

今日内容详细

外键前戏

# 创建一张员工为例id name age dep_name dep_desc'''缺点:1.表结构不清晰既可以看成是员工表也可以看做是部门表2.浪费存储资源部分数据反复3.可扩展性差修改数据条目重复太多'''# 如何解决上述三个问题拆表id nameageiddep_namedep_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.代码敲一遍将敲完之后的截图花群里

来源:https://www.icode9.com/content-4-810901.html

(0)

相关推荐