zoukankan      html  css  js  c++  java
  • Mysql表操作

    一、Mysql存储引擎

    1.innodb

    MySql 5.6 版本默认的存储引擎。查询速度较myisam更慢,但是更安全InnoDB 是一个事务安全的存储引擎,它具备提交、回滚以及崩溃恢复的功能以保护用户数据。

    2.myisam

    MyISAM既不支持事务、也不支持外键、其优势是访问速度快,但是表级别的锁定限制了它在读写负载方面的性能,因此它经常应用于只读或者以读为主的数据场景。

    3.memory

    在内存中存储所有数据,应用于对非关键数据由快速查找的场景。Memory类型的表访问数据非常快,因为它的数据是存放在内存中的,并且默认使用HASH索引,但是一旦服务关闭,表中的数据就会丢失

    4.blackhole

    黑洞存储引擎,类似于 Unix 的 /dev/null,Archive 只接收但却并不保存数据。对这种引擎的表的查询常常返回一个空集。这种表可以应用于 DML 语句需要发送到从服务器,但主服务器并不会保留这种数据的备份的主从配置中。

     

    存储引擎相关操作

    查看当前的默认存储引擎:
    
    mysql> show variables like "default_storage_engine";
    
    查询当前数据库支持的存储引擎
    
    mysql> show engines G;

    二、创建表的完整语法

    #语法:
    create table 表名(
    字段名1 类型[(宽度) 约束条件],
    字段名2 类型[(宽度) 约束条件],
    字段名3 类型[(宽度) 约束条件]
    );
    
    #注意:
    1. 在同一张表中,字段名不能相同
    2. 宽度和约束条件可选,字段名和类型是必须的
    3. 最后一个字段后不能加逗号!
    
    # 补充:
    # 1.宽度指的是对存储数据的限制
    create table userinfo(name char);
    insert into userinfo values('jason');
    """
    1.没有安全模式的数据库版本,能够存放数据但是只会存进去一个j
    2.最新数据库版本直接报错提示无法存储:Data too long for column 'name' at row 1
    """
    
    # 2.约束条件初识>>> null 与 nut null
    create table t1(id int,name char not null);
    insert into t1 values(1,'j');  # 正常存储
    insert into t1 values(2,null);  # 报错
    
    # 总结 类型与约束条件区别
    # 类型:限制字段必须以什么样的数据类型存储
    # 约束条件:约束条件是在类型之外添加一种额外的限制

    三、基本数据类型

    1.整型

    • 分类:TINYINT SMALLINT MEDIUMINT INT BIGINT

    • 作用:存储年龄,等级,id,各种号码等

    类型存储范围:参考图片http://www.cnblogs.com/linhaifeng/articles/7233411.html

    验证整型字段有无符号及范围

    TINYINT
    默认是否有符号 默认是带有符号的(-128,127)
    超出限制会如何 超出之后只会存最大值或者最小值

            create table t6(id TINYINT);
            
            
            not null  不能为空
            unsigned  无正负符号
            zerofill  0填充多余的位数

    char后面的数字是用来限制存储数据的长度的

    特例:只有INT后面的数字不是用来限制存储数据的长度 而是用来控制展示的数据的位数
    int(8) 够/超8位有几位存几位,不够8位空格填充

    修改约束条件 不够8位的情况下 用0填充

    强调:**对于整型来说,数据类型后的宽度并不是存储限制,
    而是显示限制,所以在创建表时,
    如果字段采用的是整型类型,完全无需指定显示宽度, 默认的显示宽度,足够显示完整当初存放的数据

    只要是整型 都不需要指定宽度 因为有默认的宽度 足够显示对应的数据

    2.浮点型

    float(255,30) 总共255位 小数部分占30位
    double(255,30) 总共255位 小数部分占30位
    decimal(65,30) 总共65位 小数部分占30位
    
    create table t12(id FLOAT(255,30));
    create table t13(id DOUBLE(255,30));
    create table t14(id DECIMAL(65,30));
    
    
    insert into t12 values(1.111111111111111111111111111111);
    insert into t13 values(1.111111111111111111111111111111);
    insert into t14 values(1.111111111111111111111111111111);
    
    精确度
    float < double < decimal

    3.字符类型

    char(4) # 最大只能存四个字符 超出来会直接报错 如果少了 会自动用空格填充
    varchar(4) # 最大只能存四个字符 超出来会直接报错 如果少了 有几个存几个

    mysql在存储char类型字段的时候 硬盘上确确实实存的是固定长度的数据
    但是再取出来的那一瞬间 mysql会自动将填充的空格去除

    char与varchar的使用区别

        char定长
            1.浪费空间
            2.存取速度快
        varchar变长
            1.节省空间
            2.存取速度慢(较于char比较慢)
                存的时候 需要给数据讲一个记录长度的报头
                取的时候 需要先读取报头才能读取真实数据


    char(4) 
    取的时候方便 
    直接按固定的长度取即可

    varchar(4)

    取的时候比较繁琐了 无法知道数据到底多长

     

    四、日期类型

    分类
    
    - date:2019-05-01
    - time:11:11:11
    - Datetime: 2019-01-02 11:11:11
    - Year:2019

    五、严格模式

    模糊匹配
    like
    %匹配任意多个字符
    _匹配任意一个字符

    show variables like "%mode%";  # 查看数据库配置中变量名包含mode的配置参数
    # 修改安全模式
    set session # 只在当前操作界面有效
    set global  # 全局有效
    
    set global sql_mode ='STRICT_TRANS_TABLES'
    # 修改完之后退出当前客户端重新登陆即可

    六、枚举与集合类型

    分类

    • 枚举enum 多选一

    • 集合set 多选多

    create table user(
        id int,
      name char(16),
      gender enum('male','female','others')
    );
    insert into user values(1,'jason','xxx')  # 报错
    insert into user values(2,'egon','female')  # 正确!
    
    
    create table teacher(
        id int,
      name char(16),
      gender enum('male','female','others'),
      hobby set('read','sleep','sanna','dbj')
    );
    insert into teacher values(1,'egon','male','read,sleep,dbj')  # 集合也可以只存一个

    七、约束条件

        not null  不能为空
        default   给某个字段设置默认值(当用户写了的时候用用户的,当用户没有写就用默认值)
        create table t17(id int,name char(16) default 'jason');    
            
        
        往表中插入数据的时候  可以指定字段进行插入 不需要全部都插
        insert into t17(name,id) values('egon',2);

    primary key+auto_increment

    # 单从约束角度来说primary key就等价于not null unique
    create table t11(id int primary key);
    desc t11;
    insert into t11 values(1),(1);  # 报错
    insert into t11 values(1),(2);
    
    # 除了约束之外,它还是innodb引擎组织数据的依据,提升查询效率
    """
    强调:
    1.一张表中必须有且只有一个主键,如果你没有设置主键,那么会从上到下搜索直到遇到一个非空且唯一的字段自动将其设置为主键
    """
    create table t12(
        id int,
      name char(16),
      age int not null unique,
      addr char(16) not null unique
    )engine=innodb;
    desc t12;
    """
    2.如果表里面没有指定任何的可以设置为主键的字段,那么innodb会采用自己默认的一个隐藏字段作为主键,隐藏意味着你在查询的时候无法根据这个主键字段加速查询了
    索引:类似于书的目录,没有主键就相当于一页一页翻着查
    3.一张表中通常都应该有一个id字段,并且通常将改id字段作成主键
    """
    # 联合主键:多个字段联合起来作为表的一个主键,本质还是一个主键
    create table t18(
        ip char(16),
      port int,
      primary key(ip,port)
    );
    desc t18;
    
    # 主键id作为数据的编号,每次最好能自动递增
    create table t13(
        id int primary key auto_increment,
      name char(16)
    );
    insert into t13(name) values('jason'),('jason'),('jason');  # id字段自动从1开始递增
    # 注意:auto_increment通常都是加在主键上,并且只能给设置为key的字段加
    联合主键:多个字段联合起来作为表的一个主键,本质还是一个主键!!!
                !!!!!ps:innodb引擎中一张表有且只有一个主键!!!!!!

    unique

    # 单列唯一
    create table user1(
        id int unique, 
      name char(16)
    );
    insert into user1 values(1,'jason'),(1,'egon')  # 报错
    insert into user1 values(1,'jason'),(2,'egon')  # 成功
    
    # 联合唯一
    create table server(
        id int,
      ip char(16),
      port int,
      unique(ip,port)
    )
    insert into server values(1,'127.0.0.1',8080);
    insert into server values(2,'127.0.0.1',8080);  # 报错
    insert into server values(1,'127.0.0.1',8081);

    补充:

    delete from tb1;
    强调:上面的这条命令确实可以将表里的所有记录都删掉,但不会将id重置为0,
    所以收该条命令根本不是用来清空表的,delete是用来删除表中某一些符合条件的记录
    delete from tb1 where id > 10;
    
    如果要清空表,使用truncate tb1;
    作用:将整张表重置,id重新从0开始记录






  • 相关阅读:
    CUDA[2] Hello,World
    mysql操作
    virsh 连接虚拟机 (vnc 或 控制台)
    ssh访问流程
    使用ceph-deploy进行ceph安装
    openstack 的horizon的结构
    django 后台格式化数据库查询出的日期
    web 应用的部署
    工具
    python性能优化
  • 原文地址:https://www.cnblogs.com/xiongying4/p/11380225.html
Copyright © 2011-2022 走看看