zoukankan      html  css  js  c++  java
  • MySQL第三讲

    昨日内容回顾
    公钥私钥

    数据库存储引擎

    MyISAM
    是5.5版本之前默认的存储引擎
    存取数据的速度较快、但是安全性偏差
    三个文件
    结构、索引、数据

    InnoDB
    5.5版本及之后默认的存储引擎
    存取数据的速度较MyISAM偏慢、但是安全性更高、能够支持更多的功能
    两个文件
    结构、数据

    BlackHole
    黑洞
    存什么就消失什么
    一个文件
    结构

    memory
    内存
    所有的数据都是直接保存在内存中的断电立刻丢失
    一个文件
    结构
    创建表的完整语法

    create table 表名(
    字段名1 字段类型(宽度) 约束条件1 约束条件2 约束条件3,
    字段名2 字段类型(宽度) 约束条件1 约束条件2 约束条件3,
    字段名3 字段类型(宽度) 约束条件1 约束条件2 约束条件3,
    字段名4 字段类型(宽度) 约束条件1 约束条件2 约束条件3
    );
    """
    注意事项
    1.宽度、约束条件不是必须的可写可不写
    2.最后一个不能加逗号
    3.约束条件可以有多个 空格隔开即可
    """
    严格模式

    能让数据库少干活就尽可能的少干活

    show variables like '%mode%'

    sql_mode严格模式
    5.6版本及以前的默认没有任何的严格模式
    往后的版本默认都有严格模式
    STRICT_TRANS_TABLES

    set global sql_mode = 'STRICT_TRANS_TABLES'
    设置完成后只需要退出客户端重新进入即可
    整型

    tinyint 1个字节(bytes)
    smallint 2个字节(bytes)
    int 4个字节(bytes)
    bigint 8个字节(bytes)
    """
    单位换算
    8bit >>> 00000000
    8bit = 1bytes
    1024bytes = 1KB
    1024KB = 1MB
    1024MB = 1GB
    1024GB = 1TB
    1024TB = 1PB
    """

    针对整型字段类型无序添加宽度

    因为它自带的宽度已经足够使用了,并且也不是用来限制存储长度的
    浮点型

    float(255,30)
    double(255,30)
    decimal(65,30)

    第一个数字表示的是总共多少位、第二个数字表示的小数部分占多少位

    精确度
    float < double < decimal

    """
    有时候如果遇到了某个数据类型精确度的问题
    那么你可以尝试着用其他数据类型来存储
    在工作中我们开发会经常使用字符串来存储看似是数字的数据
    """
    字符类型

    char(4) # 定长最大只能存储四个字符、超出直接报错、不超默认用空格补全
    varchar(4) # 变长最大只能存储四个字符、超出直接报错、不超有几个存几个
    """
    5.6版本及之前如果你不设置严格模式,插入数据的时候是不会报错的
    name char(4)

    values('jason')
    1.没有设置只会存储jaso
    2.设置之后才会报错
    

    """
    char(4)
    存取数据的速度都很快(暴力)
    浪费存储空间

    varchar(4)
    节省存储空间
    存取数据的速度较于char都很慢

    char与varchar在后面创建表的时候都可以使用、具体还可以结合业务逻辑来

    日期类型

    date 年月日
    time 时分秒
    datetime 年月日时分秒
    year 年
    ...
    枚举与集合类型

    枚举类似于多选一
    enum('male','female','others')

    集合类似于多选多(也可以只选一个)
    set('read','study','music','running')
    约束条件

    """
    在插入数据的时候有两种插入方式
    1.insert into t1 values()
    t1表里面有几个字段你括号里面就要对应给几个数据

    2.insert into t1(name,password) values()
    	按照括号内书写的字段添加数据
    

    """
    1.not null 非空
    id int not null

    2.default 默认值
    name char(16) default 'jason'
    id int default 666
    该字段你给值的情况就用默认的如果你给了就用你的

    3.unique 唯一
    1.单列唯一
    id int unique
    id字段的数据不能重复

    2.联合唯一
    	host char(16) 
    	port int
    	unique(host,port)
    

    4.primary key 主键
    """
    在InnoDB存储引擎下
    1.规定了一张表有且必须要有一个主键

    2.如果你没有指定主键那么会有两种补救措施
    2.1 会从上往下寻找一个not null unique的字段自动升级为主键
    2.2 就会用一个内部隐藏的字段(迫不得已)
    """

    约束效果等价于not null unique

    但是还有额外的功能 提高查询数据的速度

    id int primary key
    一般情况下一张表中都会有一个id字段并且该字段一般就是主键字段

    5.auto_increment 自增
    """
    auto_increment不能单独使用
    必须配合
    primary key
    unique一起使用

    错误案例
    id int auto_increment
    """
    id int primary key auto_increment
    name char(16)

    insert into t1(name) values('jason')
    如果你没有写括号说明需要填写的字段 那么默认需要你自己给
    今日内容概要
    表与表之间的关系

    如何确定

    如何建立

    操作表的其他命令

    表与表之间关系
    """
    表与表之间的关系只有四种
    一对多
    多对多
    一对一
    没有关系
    """

    我们的员工表有哪些不足之处
    1.表结构不清晰(侧重点不清晰)
    2.录入的数据有很多是重复的(浪费存储空间)
    3.在修改数据的时候扩展性很差(修改的数据条目非常多)

    如果将员工表一分为二到底是优化了还是复杂了
    上述的三个问题都解决了

    如何限制字段输入的值
    create table emp(
    id int primary key auto_increment,
    name char(16),
    age int,
    dep_id int,
    foreign key(dep_id) references dep(id)
    # 将本表中的dep_id字段跟dep表中的id字段建立关系
    );
    create table dep(
    id int primary key auto_increment,
    dep_name char(32),
    dep_desc char(64)
    );
    一对多关系判断
    """
    在判断表关系的时候一定要
    换位思考(要站在双方的角度思考问题)
    """
    一对多的表关系判断
    以员工表为例
    1.先站在员工表的基础之上
    问一个员工能否对应多个部门 不可以

    2.再站在部门表的基础之上
    	问一个部门能否对应多个员工		可以
    
    下结论
    	员工跟部门是单向的
        只要是单向的那么表关系就是 一对多
    

    """
    只要有一个是可以的就是一对多的关系
    """

    一旦确立了表关系之后 关系字段应该放在哪张表???

    表关系如果是一对多的话 那么外键字段建在多的一方
    员工表是多的一方 所有外键字段放在员工表里面 dep_id

    dep_id就是外键字段(用来表示表与表之间关系的)
    

    create table emp(
    id int primary key auto_increment,
    name char(16),
    age int,
    dep_id int,
    foreign key(dep_id) references dep(id)
    # 将本表中的dep_id字段跟dep表中的id字段建立关系
    );
    create table dep(
    id int primary key auto_increment,
    dep_name char(32),
    dep_desc char(64)
    );
    创建外键字段注意事项
    1.要创建被关联表(没有外键字段的表)

    2.插入数据要先录入被关联表的数据才能录入关联表的数据(没有外键字段的表)
    insert into dep(dep_name,dep_desc) values
    ('外交部','搞外交'),
    ('讲师部','教书育人'),
    ('技术部','技术能力有限部门');

    insert into emp(name,age,dep_id) values
    ('jason',18,1),
    ('tony',32,2),
    ('jack',30,2),
    ('tom',45,2),
    ('kevin',18,3);

    3.关系表之间数据的同步更新同步删除

    外键创建好了之后 被关联表的id字段无法修改

    update dep set id=200 where id=1;

    外键创建好了之后 被关联表的数据无法删除

    delete from dep where id=1;

    create table emp(
    id int primary key auto_increment,
    name char(16),
    age int,
    dep_id int,
    foreign key(dep_id) references dep(id)
    on update cascade # 同步更新
    on delete cascade # 同步删除
    );
    create table dep(
    id int primary key auto_increment,
    dep_name char(32),
    dep_desc char(64)
    );
    多对多关系
    以图书跟作者表为例

    判断表关系查看群内截图即可

    create table book(
    id int primary key auto_increment,
    title varchar(16),
    price float(10,2),
    author_id int,
    foreign key(author_id) references author(id)
    on update cascade # 同步更新
    on delete cascade # 同步删除
    )

    create table author(
    id int primary key auto_increment,
    name char(16),
    gender enum('male','female','others') default 'male',
    book_id int,
    foreign key(book_id) references book(id)
    on update cascade # 同步更新
    on delete cascade # 同步删除
    )
    """针对多对多的表关系,需要你创建一个第三张表来专门存储"""
    create table book(
    id int primary key auto_increment,
    title varchar(16),
    price float(10,2)
    );

    create table author(
    id int primary key auto_increment,
    name char(16),
    gender enum('male','female','others') default 'male'
    );

    create table book2author(
    id int primary key auto_increment,

    book_id int,
    foreign key(book_id) references book(id) 
    on update cascade  # 同步更新
    on delete cascade,  # 同步删除
    
    author_id int,
    foreign key(author_id) references author(id) 
    on update cascade  # 同步更新
    on delete cascade  # 同步删除
    

    );

    图书表和作者表里面的数据随意的插入都没有问题
    只要确保在插入图书和作者的第三张关系表的时候得注意
    insert into book(title,price) values
    ('阿甘正传',666.66),
    ('三体',999.66),
    ('曾国藩',789.66),
    ('西游记',123.66),
    ('聊斋',456.66);

    insert into author(name) values
    ('jason'),
    ('tony'),
    ('tom');

    insert into book2author(author_id,book_id) values
    (1,1),
    (1,2),
    (1,3),
    (2,1),
    (2,4),
    (2,5),
    (3,1),
    (3,2);

    第三张表分别跟另外两张表是有删除和更新关系的 两张表之间现在没有任何影响
    delete from author where name='tom';

    多对多表关系的维护只需要第三张表来维护即可
    一对一关系
    实际案例
    1.qq用户信息展示
    一张表中用户的信息非常多,但是并不是所有的信息都是需要经常使用的
    那么这种情况下就可以将一张表拆分成两张表 然后做一对一的表关系

    create table authordetail1(
    id int primary key auto_increment,
    phone int,
    addr char(255)
    );

    create table author(
    id int primary key auto_increment,
    name char(4),
    age int,
    authordetail_id int unique,
    foreign key(authordetail_id) references authordetail1(id)
    on update cascade
    on delete cascade
    );
    外键字段总结
    一对多外键字段建在多的那一方

    多对多外键字段建在第三方表中

    一对一外键字段建在任何一方都可以,但是推荐你建在查询频率较高的那张表中
    修改表操作

    mysql对大小写不敏感!!!

    语法:

    1. 修改表名
      ALTER TABLE 表名
      RENAME 新表名;
    2. 增加字段
      ALTER TABLE 表名
      ADD 字段名 数据类型 [完整性约束条件…],
      ADD 字段名 数据类型 [完整性约束条件…];
      ALTER TABLE 表名
      ADD 字段名 数据类型 [完整性约束条件…] FIRST;
      ALTER TABLE 表名
      ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名;
    3. 删除字段
      ALTER TABLE 表名
      DROP 字段名;
    4. 修改字段 # modify只能改字段数据类型完整约束,不能改字段名,但是change可以!
      ALTER TABLE 表名
      MODIFY 字段名 数据类型 [完整性约束条件…];
      ALTER TABLE 表名
      CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];
      ALTER TABLE 表名
      CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
    为了舒适的结果,眼前的坎坷路程即使再长都是值得的。
  • 相关阅读:
    jquery 拼图小游戏
    重要参考SQL
    SQL Server save transaction
    SelectList类的构造函数
    一步步教你整合SSM框架(Spring MVC+Spring+MyBatis)详细教程重要
    springMVC,spring和Hibernate整合(重要)
    delphi环境变量
    C# Chart 点击获取当前点击坐标和Series
    如何修改 app.config 的配置信息
    C#中使用设置(Settings.settings) Properties.Settings.Default .(配置文件相当重要)
  • 原文地址:https://www.cnblogs.com/abudrSatan1998/p/13398087.html
Copyright © 2011-2022 走看看