• day45---mysql数据库基本操作初阶(二)


    mysql数据库基本操作初阶(二)

    数据库存储引擎

    是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL的核心就是插件式存储引擎。
    
    • 如何查看数据库存储引擎
    mysql> show engines;
    

    图1 数据库存储引擎

    mysql主要存储引擎

    • innodb
    InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),其它存储引擎都是非事务安全表,支持行锁定和外键,MySQL5.5以后默认使用InnoDB存储引擎。
    
    • myisam
    MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事务,不支持外键。是MySQL5.5版本之前默认的存储引擎。
    
    • memory
    MEMORY存储引擎将表中的数据存储到内存中,为查询和引用其他表数据提供快速访问。断电数据丢失
    
    • blackhole
    无论存什么,都立刻消失(黑洞),黑洞存储引擎,可以应用于主备复制中的分发主库。
    

    图2 存储引擎对比图

    建表时候指定存储引擎

    mysql> create table t1(id int, name varchar(16)) engine=innodb;
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> create table t2(id int, name varchar(16)) engine=myisam;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> create table t3(id int, name varchar(16)) engine=memory;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> create table t4(id int, name varchar(16)) engine=blackhole;
    Query OK, 0 rows affected (0.00 sec)
    
    • 在配置文件中指定存储引擎
    default-storage-engine=INNODB
    
    [root@surpass ~]# cat /etc/my.cnf
    [mysql]
    # 设置mysql客户端默认字符集
    default-character-set=utf8
    socket=/var/lib/mysql/mysql.sock
    [mysqld]
    skip-name-resolve
    #设置3306端口
    port=3306
    socket=/var/lib/mysql/mysql.sock
    # 设置mysql的安装目录
    basedir=/usr/local/mysql
    # 设置mysql数据库的数据的存放目录
    datadir=/usr/local/mysql/data
    # 允许最大连接数
    max_connections=200
    # 服务端使用的字符集默认为8比特编码的latin1字符集
    character-set-server=utf8
    # 创建新表时将使用的默认存储引擎
    default-storage-engine=INNODB
    lower_case_table_names=1
    max_allowed_packet=16M
    [root@surpass ~]# 
    
    • 查看刚刚创建的4张表
    [root@surpass day45]# ls
    db.opt  t1.frm  t1.ibd  t2.frm  t2.MYD  t2.MYI  t3.frm  t4.frm
    

    innodb: 有表结构,存储数据

    myisam:有表结构,存储数据,查询索引

    后两者只有表结构

    memory,在重启mysql或者重启机器后,表内数据清空
    blackhole,往表内插入任何数据,都相当于丢入黑洞,表内永远不存记录
    

    创建表的完整语法

    create table t1(
        id int(11) not Null,
        name varchar(16),
        gender enum("male","female"),
        hobby set("dbj","hecha")
    )
    

    action

    """
    1 在同一张表中字段名不能重复
    2 宽度和约束条件是可选的(可写可不写) 而字段名和字段类型是必须的
    	约束条件写的话 也支持写多个
        字段名1 类型(宽度) 约束条件1 约束条件2...,
    3 最后一行不能有逗号
    """
    

    基本数据类型

    • 整型
    TINYINT SMALLINT MEDUIMINT INT BIGINT
    

    作用:存储年龄、等级、id、号码等等

    """
    TINYINT:默认情况下是有符号的
    超出后只会存储可接受的最大值
    
    无符号(8位):0~255
    有符号(7位,还有一位标记正负):-127~128
    
    mysql> create table t5(id tinyint);
    mysql> insert into t5 values(-129),(258);
    
    约束条件之无符号 unsigned
    mysql> create table t6(id tinyint unsigned);
    mysql> insert into t6 values(0),(254);
    
    """
    # 默认情况下整型都是带符号的
    
    """
    针对整型 括号内的宽度到底是干嘛的
    特例:只有整型括号里面的数字不是表示限制位数
    
    如果数字没有超出8位 那么默认用空格填充至8位
    如果数字超出了8位 那么有几位就存几位(但是还是要遵守最大范围)
    
    
    # 用0填充至8位
    mysql> create table t8(id int(8) zerofill);
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> insert into t8 values(11);
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from t8;
    +----------+
    | id       |
    +----------+
    | 00000011 |
    +----------+
    1 row in set (0.01 sec)
    
    """
    
    

    严格模式

    • 如何查看严格模式
    mysql> show variables like "%mode";
    

    模糊匹配/查询:

    关键字 like
    %:匹配任意多个字符
    _:匹配任意单个字符

    • 修改严格模式
    set session  只在当前窗口有效
    set global   全局有效
        
    set global sql_mode = 'STRICT_TRANS_TABLES';
        
    修改完之后 重新进入服务端即可
    

    action

    设置是替换
    set global sql_mode ='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION'
    

    浮点型

    float double decimal
    
    • 存储限制
    # 存储限制
    float(255,30)  # 总共255位 小数部分占30位
    double(255,30)  # 总共255位 小数部分占30位
    decimal(65,30)  # 总共65位 小数部分占30位
    
    float < double < decima
    # 要结合实际应用场景 三者都能使用
    

    字符类型

    """
    char(4) 定长 数据超过四个字符直接报错 不够四个字符空格补全
    varchar(4) 变长 数据超过四个字符直接报错 不够有几个存几个
    """
    """
    create table t18(name char(4));
    create table t19(name varchar(4));
    
    insert into t18 values('a');
    insert into t19 values('a');
    
    # 介绍一个小方法 char_length统计字段长度
    select char_length(name) from t18;
    select char_length(name) from t19;
    """
    首先可以肯定的是 char硬盘上存的绝对是真正的数据 带有空格的
    但是在显示的时候MySQL会自动将多余的空格剔除
    """
    
    # 再次修改sql_mode 让MySQL不要做自动剔除操作
    set global sql_mode = 'STRICT_TRANS_TABLES,PAD_CHAR_TO_FULL_LENGTH';
    

    char和varchar

    """
    char
    	缺点:浪费空间
    	优点:存取都很简单
    		直接按照固定的字符存取数据即可
    		jason egon alex wusir tank 
    		存按照五个字符存 取也直接按照五个字符取
    		
    varchar
    	优点:节省空间
    	缺点:存取较为麻烦
    		1bytes+jason 1bytes+egon 1bytes+alex 1bytes+tank 
    		
    		存的时候需要制作报头
    		取的时候也需要先读取报头 之后才能读取真实数据
    		
    以前基本上都是用的char 其实现在用varchar的也挺多
    """
    
    补充:
        进来公司之后你完全不需要考虑字段类型和字段名
        因为产品经理给你发的邮件上已经全部指明了
    

    时间类型

    • 分类
    date:年月日 2020-5-4
    
    datetime:年月日时分秒  2020-5-4 11:11:11
    
    time:时分秒11:11:11
    
    Year:2020
    
    """
    create table student(
    	id int,
        name varchar(16),
        born_year year,
        birth date,
        study_time time,
        reg_time datetime
    );
    insert into student values(1,'egon','1880','1880-11-11','11:11:11','2020-11-11 11:11:11');
    """
    

    枚举和集合类型

    • 分类
    """
    枚举(enum)  多选一
    集合(set)   多选多
    """
    
    • 使用
    create table user(
    	id int,
        name char(16),
        gender enum('male','female','others')
    );
    insert into user values(1,'jason','male');  正常
    insert into user values(2,'egon','xxxxooo');  报错
    # 枚举字段 后期在存数据的时候只能从枚举里面选择一个存储 
    
    
    create table teacher(
    	id int,
        name char(16),
        gender enum('male','female','others'),
        hobby set('read','DBJ','hecha')
    );
    insert into teacher values(1,'jason','male','read');  正常
    insert into teacher values(2,'egon','female','DBJ,hecha');  正常
    insert into teacher values(3,'tank','others','生蚝'); 报错
    # 集合可以只写一个  但是不能写没有列举的
    
  • 相关阅读:
    bzoj1660[Usaco2006 Nov]Bad Hair Day 乱发节*
    bzoj1624[Usaco2008 Open] Clear And Present Danger 寻宝之路*
    bzoj1617[Usaco2008 Mar]River Crossing渡河问题*
    bzoj1681[Usaco2005 Mar]Checking an Alibi 不在场的证明*
    bzoj1631[Usaco2007 Feb]Cow Party*
    bzoj1854[Scoi2010]游戏
    bzoj2338[HNOI2011]数矩形
    bzoj1096[ZJOI2007]仓库建设
    继承原理、派生重用
    面向对象三大特性——继承(含派生)
  • 原文地址:https://www.cnblogs.com/surpass123/p/12829422.html
Copyright © 2020-2023  润新知