暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL学习之旅

DATA ANALYSIS SHARING 2021-08-29
332

点击蓝字 关注我们

char与varchar对比

char(4)

    不超过4个字符 还是存四个字符(空格填充)

varchar(4)

    不超过4个字符 有几个存几个


char

     优点:整存整取 不会出现数据错乱 速度快

     缺点:浪费存储空间

varchar

     优点:节省存储空间

     缺点:存取数据的速度较于char偏慢


到底使用char还是varchar?


    其实二者都有应用场景

    一般情况下推荐使用varchar

    但是具体结合实际需求(产品经理 架构师...)

枚举与集合类型

枚举

    多选一

create table user1(

    id int,

    name varchar(16),

    gender enum('male','female','others')

);

# 列举可以写入的数据   不在范围之内直接报错(严格模式)



集合

    多选多(包括多选一)

create table user2(

    id int,

    name varchar(16),

    hobby set('read','study','run','ball')

);    

·新日期类型·

datetime      年月日时分秒

date          年月日

time          时分秒

year           年


create table user3(

    id int,

    name varchar(16),

    reg_time datetime,

    birthday date,

    study_time time,

    stime year

);

# 我们在录入时间数据的时候 其实都是直接借助于获取时间的模块

# 只做模拟演示  自己写时间

insert into user3 values(1,'jason','2000-11-11 11:11:11',

'1995-01-21','12:30:00','2020');   

创建表的完整语法

create table 表名(

    字段名1 字段类型(宽度 约束条件),

    字段名2 字段类型(宽度 约束条件),

    字段名3 字段类型(宽度 约束条件)

);

1.字段名和字段类型是必须的 宽度和约束条件是可选的

2.约束条件可以有多个!!!

3.最后一个字段结尾不要加逗号

约束条件

1.unsigned           无符号

create table t1(id tinyint);

create table t2(id tinyint unsigned);

insert into t1 values(255);

insert into t2 values(255);


2.zerofill         0填充

create table t3(id tinyint zerofill);

insert into t3 values(1);


3.not null        非空

create table t4(name varchar(16) not null);

insert t4 values();    # 报错  必须给个值

insert t4 values('');  # 不报错


4.default    默认值

create table t5(

    name varchar(16),

    gender varchar(16) default 'male'

);

"""

在插入数据的时候也可以指定字段  不指定默认就是按照顺序依次传值

insert into t5(name) values(值)

"""


#####       复杂    #####


5.unique          唯一

# 单列唯一

create table t6(

    id int,

    name varchar(16) unique

);

insert into t6(id,name) values(1,'jason'),(2,'jason');

# 多列唯一(联合唯一)

create table t7(

    id int,

    host varchar(16),

    port int,

    unique (host,port)

);

insert into t7 values(1,'127.0.0.1',8080),(2,'127.0.0.2',8080),

(3,'127.0.0.1',8080);


6.primary key      主键


    特点:1.主键在约束条件上相当于是not null + unique(非空且唯一)

    # 单列主键

    create table t8(

        id int primary key    # id int not null unique

    );

    # 多列主键(联合主键) 本质还是一个主键 并且这种情况使用较少

    create table t9(

        ip char(16),

        port int,

        primary key(ip,port)

    );

    2.由于5.6及之后的版本存储引擎都是InnoDB

    该引擎规定了所有的表都必须有且只有一个主键

    '''1.没有设置主键也没有其他约束条件'''

        InnoDB为了能够创建出表  会自动采取内部隐藏的字段作为主键

        隐藏意味我们无法使用到该主键  是没有意义的!!!

    '''2.没有设置主键但是有其他约束条件'''

        InnoDB会自上而下的将一个非空且唯一的字段升级为主键使用

        create table t12(

            id int,

            name char(16),

            age int not null unique,

            addr char(16) not null unique

        );

        字段将age升级为主键

        总结:以后我们在创建表的时候一定要自己指定主键

        并且主键一般都是序号 用来唯一标识数据

        所以主键一般情况下都是设置给表中的第一个id字段

            uid sid pid cid只要是用来标识数据唯一性即可


7.auto_increment      自增

    是专门用来给主键使用的 目的就是让主键能够自己增加不需要人为数数

    create table t13(

        id int primary key auto_increment,

        name char(16)

    );

    insert into t13(name) values('jason'),('kevin'),('tony');


以后创建表的时候固定写序号字段

    create table t1(

    id int primary key auto_increment,

    ....

    );

在写入数据的时候也不需要考虑主键字段了



生命在于运动

外键也属于约束条件 但是功能是用来建立表与表之间的关系

属于特殊的约束条件


# 前戏

创建一张公司里面的员工表

id name    age   dep_name     dep_desc


缺陷:

    1.表含义不明确(可以忽略)

    2.数据存在重复浪费存储空间(可以忽略)

    3.数据修改极其繁琐 不便于扩展(不能忽略)


    措施:

        将员工表一分为二

            员工表

               id name age 

            部门表  

               id dep_name dep_desc


外键字段(关系字段)的由来

部门编号 对应的就是部门表里面的主键字段

表关系

1.一对多关系

2.多对多关系

3.一对一关系

4.没有关系


# 表关系判断 遵循"换位思考"原则即可


员工表与部门表为例

    1.先站在员工表

        问:一个员工能否对应多个部门

           结论:不可以

    2.再站在部门表

        问:一个部门能否对应多个员工

           结论:可以

    总结:一个可以一个不可以 那么这种关系就是"一对多"


create table emp(

    id int primary key auto_increment,

    name char(16),

 gender enum('male','female') not null default 'male',

    dep_id int,

    foreign key(dep_id) references dep(id)

);

create table dep(

    id int primary key auto_increment,

    dep_name char(10),

    dep_comment char(60)

);

# 基于换位思考得出员工表与部门表是一对多的外键关系

"""

针对一对多的外键关系

    关系字段建在多的一方(员工表就是多)

"""

外键约束

1.在创建表的时候需要先创建被关联表

    简单理解:先创建没有外键字段的表再创建有外键字段的表

2.在第一次录入数据的时候需要先录入被关联表之后再录入关联表

    简单理解:先录入没有外键字段的表再录入有外键字段的表

3.涉及到编辑和删除操作

    修改数据

        # 修改部门编号   不行

        # 删除部门数据   不行

"""针对关系字段的修改与删除如何解决"""

级联更新  级联删除

create table dep1(

    id int primary key auto_increment,

    dep_name char(10),

    dep_comment char(60)

);

create table emp1(

    id int primary key auto_increment,

    name char(16),

    gender enum('male','female') not null default 'male',

    dep_id int,

    foreign key(dep_id) references dep1(id)

    on update cascade

    on delete cascade   # 这三句为一句 没有逗号

);   

多对多关系

以图书表与作者表为例

1.先站在图书表的角度

问:一本书能否对应多个作者

        结论:可以

2.再站在作者表的角度

问:一名作者能否对应多本书

        结论:可以

结论:两边都可以 那么表关系就是"多对多"


# SQL实现(先写基础的字段 之后再添加外键字段)

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),

 age int

);

"""针对多对多关系

    外键字段不能直接建在关系表中

        需要再额外创建一张专门用来存储关系的第三张表

"""

create table book2author(

 id int primary key auto_increment,

 book_id int,

 author_id int,

 foreign key(author_id) references author(id)

 on update cascade

 on delete cascade,

 foreign key(book_id) references book(id)

  on update cascade

  on delete cascade

);

一对一关系

以用户表与用户详情表为例

1.先站在用户表角度

    问:一个用户能否对应多个用户详情

            结论:不可以

    2.再站在用户详情表

    问:一个用户详情能否对应多个用户

            结论:不可以

总结:两个都不可以 那么表关系就是"一对一关系"(没有关系的话直接就能看出来)


"""针对一对一表关系

   外键字段建在任何一方都可以,推荐建在查询频率较高的表中

"""

create table user(

    id int primary key auto_increment,

    addr varchar(32),

    age int,

    user_detail_id int unique,

 foreign key(user_detail_id) references user_detail(id)

    on update cascade

    on delete cascade

);

create table user_detail(

    id int primary key auto_increment,

    addr varchar(32),

    phone bigint

);


文章转载自DATA ANALYSIS SHARING,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论