• 从0开始回顾Mysql --- MySQL初体验


    大白话从0开始回顾MySQL,去除了一些繁琐的操作的演示以及内容,如MySQL安装等,本篇文章适合复习MySQL语法,学习MySQL语句,对MySQL不太熟练的同学,希望对大家有一些帮助。

    MySQL初体验

    首先,我将Mysql安装到了如下位置

    image.png
    我们点进bin目录(bin目录存放了许多可执行文件)

    image.png
    通常,我们是可以双击执行这些bin目录下的可执行文件,常常会出现错误,我们需要传递一些参数让它们正常运行,如bin目录下有许多客户端程序,比方说:mysqladmin,mysqldump,mysqlcheck等,我们启动客户端可执行文件一般参数格式如下:

    mysql -h主机名 -u用户名 -p密码 (-p和密码之间不要有空格)

    image.png
    本机连接可以忽略-h,连接成功的前提是必须开启服务器程序,可以在任务管理器中查看

    image.png
    虽然之后编写sql语句可能不在小黑框中编写,我们还是需要简单介绍一下MySQL语句的注意事项

    • 书写结束符号

      • ;
      • \g
      • \G(不以表格形式展现)

    image.png

    • 没有大小写问题 (NOW)
    • 语句可以随意换行
    • 可以一次性提交多个语句
    • 使用\c放弃本次操作
    • 字符串表示

    image.png

    MySQL数据类型

    Mysql把数据存到表中,表由若干行组成,每一行由若干列组成,下图是一张文章表

    image.png
    一行代表一个文章的基本信息,一列代表基本信息的一个属性,每个属性有一定格式,不同格式是不能乱填的,比如不能把title填到用户Id中,为了更好的规范表数据,MySQL设计者针对属性不同格式定义的不同的数据类型。

    数值类型

    • 整数类型

    计算机采用若干个二进制来表示数字,一个二进制位只能表示21种信息,也就是0和1。

     无符号整数  :符号1就表示1,符号0表示0,数字范围(0 ~ 1),
     有符号整数  :最左端的二进制数表示正负号,符号1就表示-1,
     符号0表示0, 数字范围(-1 ~ 0)
    
    • 1
    • 2
    • 3
    二进制位无符号数代表数值有符号代表数值
    0 000
    0 111
    1 02-2
    1 13-1

    一个二进制位所能存储的信息实在太少,计算机一般采用8个二进制位作为分配空间的基本单位,也就是一个字节(Byte),我们采用的字节数越多,意味着数值范围就越大,但消耗的存储空间也就多,所以我们可以是根据字节数的不同,将整数划分为以下几个类型

    image.png

    在数据类型后面加上UNSIGNED单词,表明是无符号数,在数据类型后面加上SIGNED单词或者不加,表明有符号数

    create table t3(
        age tinyint unsigned
    );
    
    • 1
    • 2
    • 3

    在数据类型后面加,显示宽度 (zerofill),整型显示宽度, 位数不足时用 0 填充

    create table t7(
        id int(10) zerofill primary key auto_increment,
        name char(32)
    );
    insert into t7 values(12345, '5个');
    insert into t7 values(1234567890, '10个');
    insert into t7 values(123456789012, '12个');
    select * from t7;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    image.png

    浮点数类型

    image.png

    create table t5 (
        a float(10, 2),
        b double(10, 2),
        c decimal(10, 2)
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5

    注意:浮点数表示小数是不准确的,比如0.3用二进制是无限循环小数,有时候是需要进行取舍的, MySQL8.0之后float和double不推荐使用(M,D)格式,直接使用float和double即可

    如果我们事先知道小数的范围,就可以使用float(M,D)和double(M,D)这种格式,M 是支持多少个长度, D 是小数点后面的位数

    如果想要精准的保存小数,我们可以采用定点数DECIMAL(M, D),M的最大值为65, D的最大值为30,D的值不能超过M的值它占用的存储空间与M和D有关,这和它是如何解决小数因为取舍不精确有关,它将小数点分割开,将小数点左右俩个十进制整数分别存储下来,关于它是如何分配的便简单概述,感兴趣的同学可以网上寻找。

    • 从小数点分别向左向右每隔9个十进制划为一组,不足9个十进制也同样进行
    组中的十进制位数占用内存大小
    1或 21字节
    3 或 42字节
    5 或 63字节
    7 或 8 或 94字节

    很多场景并不需要精细化处理,比如0.3元可以转化成20分进行存储,这样使用整数存储即可,还有在float,double,decimal类型后面添加unsigned是没有必要的,并不会增加它们所能表示的正数范围

    日期和时间类型

    image.png

    • datetime
    create table datetime_test (
        create_at datetime
    );
    
    insert into datetime_test values('2019-4-2 16:54:00');
    insert into datetime_test values('2019/4/2 16:54:00');
    insert into datetime_test values(now());
    -- 年份最大支持4个长度
    insert into datetime_test values('10000/4/2 16:54:00');  -- 错误
    insert into datetime_test values('9999/4/2 16:54:00');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • time
    create table time_test (
        create_at time
    );
    
    insert into time_test values('12:12:12');
    insert into time_test values('100:12:12');
    insert into time_test values('-100:12:12');
    insert into time_test values('10 10:12:12');
    -- 时间的范围是: [-838:59:59 - 838:59:59]
    insert into time_test values('839:12:12'); -- 错误的
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • timestamp 时间戳类型
    1. 时间戳类型在显示方面和datetime是一样的, 在存储上不一样
    2. 范围从 1970-1-1 0:0:0 到 2038-1-19 11:14:07
    3. 时间戳使用 4 个字节表示
    4. 该值大小与存储的位长有关: 2  ** (4* 8 - 1)
    create table timestamp_test (
        create_time timestamp
    );
    
    insert into timestamp_test values(now());
    insert into timestamp_test values('2038-1-19 11:14:07');  -- 时间戳最大值
    insert into timestamp_test values('2038-1-19 11:14:08');  -- 错误
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • year

      create table `year`(    create_at_year);
      -- 从1900年开始 - 1900+255
      insert into `year` values(now());
      insert into `year` values('2155'); 
      -- 年份最大值
      insert into `year` values('2156'); -- 错误
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

    在MySQL 5.6.4版本之后,DATETIME存储空间被优化成了5字节,提供对毫秒,微秒的支持,比如DATETIME(0)表示精确到秒,DATETIME(3)表示精确到毫秒,小时秒位在0~6之间选择,保留的小数秒位不同,需要增加的内存空间也不同

    保留的小数秒位额外需要增加的存储空间
    00字节
    1或 21字节
    3或42字节
    5或 63字节

    字符串类型

    image.png

    表一行数据字节数不能超过165535字节,这个对text是不生效的

    字符编码 : 字符是面向人的概念, 字节是面向计算机的概念,根据字符使用的字节数量是否是固定的可以分为下面俩种

    1.固定长度编码 :ASCII编码采用一字节,GB2312采用2字节

    2.可变长度编码 :UTF-8采用1~ 4字节编码,GB2312采用1~2字节编码,Mysql中使用的utf8mb4就是正宗的UTF-8

    CHAR 与 VARCHAR 类型的区别:

    1. 允许的最大值范围不同。

      注意:无论是char(n)还是varchar(n),n表示的都是字符数,而不是字节数。

      • char(n)类型里,无论数据库使用的是哪种编码方式,n的最大取值都只能取到255,char = char(1),char(0)只能存""和null,
      • varchar(n)类型里,如果使用的是Latin1编码,最大值允许到65535(但是实际取值只能到65532,还要保留三个字节用来记录长度);如果使用的是UTF8编码,最大值允许到21845(但是实际取值只能到21844,还要保留一个字符用来记录长度)。
    2. 数据库内存存储的长度不同。

      • char(n)类型里,无论输入的内容是什么,存储的长度都是 n个字符。例如,数据类型char(10),写入字符串’张三’,在数据库里存入的数据长度是10个字符,所占字节数为n * 编码集编码一个字符需要的最大字节。
      • varchar(n)类型里,存储的长度是不固定可变的。
    3. 对于空格的处理不同。

      • char类型在存储字符串时,会将右侧末尾的空格去掉。
      • varchar类型在存储字符串时,会将右侧末尾的空格保留。
      create table student (id int primary key auto_increment ,name char(20),city varchar(20));  -- 创建数据表
      insert into student values(0,'  zhangsan   ','   shanghai    '); -- 插入数据
      
      select concat(id,name,'good') from student where id=1;
      /*
      从查询的结果中可以看到,name左侧的空格保留了,但是右侧的空格被去掉了
      +------------------------+
      | concat(id,name,'good') |
      +------------------------+
      | 1  zhangsangood        |
      +------------------------+
      */
      select name,length(name) from student where id=1;
      /*
      从查询的结果中可以看到,长度只包括左边的空格,不包括右边的空格
      +------------+--------------+
      | name       | length(name) |
      +------------+--------------+
      |   zhangsan |           10 |
      +------------+--------------+
      */
      
      select concat(id,city,'good') from student where id=1;
      /*
      从查询的结果中可以看到,city右侧的空格也保留了
      +------------------------+
      | concat(id,city,'good') |
      +------------------------+
      | 1   shanghai    good   |
      +------------------------+
      */
      select city,length(city) from student where id=1;
      /*
      从查询的长度中也可以看到,city两端的空格都被保留了
      +-----------------+--------------+
      | city            | length(city) |
      +-----------------+--------------+
      |    shanghai     |           15 |
      +-----------------+--------------+
      */
      Copy
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
    • binary和varbinary类似于char和varchar,不同的是它们包含二进制字符串,不支持模糊查询之类的,BINARY(M)和VARBINARY这个M存的是最大字节数。

    枚举(enum)

    多选一的时候使用的一种数据类型

    在前端使用单选框的时候, 枚举类型可以发挥作用

    枚举类型的优点:

    1. 限制了可选值
    2. 节省空间
    3. 运行效率高
    create table t6(
        name varchar(32),
        sex enum('男','女','保密') default '保密'
    );
    
    -- 枚举类型的计数默认从1开始
    insert into t6 set name='王宝强',sex=1;
    Copy
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    集合(set)

    SET最多可以有64个不同的成员。类似于复选框, 有多少可以选多少。

    create table t7 (
        name varchar(32),
        hobby set('吃','睡','玩','喝','抽')
    );
    
    insert into t7 values('张三','睡,抽,玩,吃,喝');
    insert into t7 values('李四','睡,抽');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    BIT类型

    类型占用存储空间含义
    BIT(M)近似(M +7)/ 8存储M个二进制位的值

    BLOG类型

    这个可以用来存储图片,压缩文件,音频等,但我们通常将他们村在文件系统中,然后将路径存到数据库表中

    MySQL初体验到这就结束啦,如果您感觉有帮助的话,请点赞收藏,您的点赞是我创作的动力。

  • 相关阅读:
    断言(assert)的用法
    mongodb 复制集部署(主从升级版)
    初级篇—第三章多表查询
    11-散列2 Hashing(浙大数据结构PTA习题)
    详解Postman使用
    澳大利亚昆士兰大学ARC信息复原力培训中心博士后
    QT中Shader类与多VAO、VBO的使用
    java计算机毕业设计ssm驾校预约考试管理系统a3cf7(附源码、数据库)
    基于PHP+MySQL大连真爱果汁厂管理系统的设计与实现
    springboot实现邮箱发送(激活码)功能
  • 原文地址:https://blog.csdn.net/qq_52416556/article/details/136435262