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

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

MySQL初体验

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

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

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

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

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

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

  • 书写结束符号

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

MySQL数据类型

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

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

数值类型

  • 整数类型

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

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

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

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

arduino 复制代码
create table t3(
    age tinyint unsigned
);

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

sql 复制代码
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;

浮点数类型

scss 复制代码
create table t5 (
    a float(10, 2),
    b double(10, 2),
    c decimal(10, 2)
);

注意:浮点数表示小数是不准确的,比如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或 2 1字节
3 或 4 2字节
5 或 6 3字节
7 或 8 或 9 4字节

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

日期和时间类型

  • datetime
sql 复制代码
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');
  • time
sql 复制代码
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'); -- 错误的
  • timestamp 时间戳类型
  1. 时间戳类型在显示方面和datetime是一样的, 在存储上不一样
  2. 范围从 1970-1-1 0:0:0 到 2038-1-19 11:14:07
  3. 时间戳使用 4 个字节表示
  4. 该值大小与存储的位长有关: 2 ** (4* 8 - 1)
sql 复制代码
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');  -- 错误
  • year

    sql 复制代码
    create table `year`(    create_at_year);
    -- 从1900年开始 - 1900+255
    insert into `year` values(now());
    insert into `year` values('2155'); 
    -- 年份最大值
    insert into `year` values('2156'); -- 错误

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

保留的小数秒位 额外需要增加的存储空间
0 0字节
1或 2 1字节
3或4 2字节
5或 6 3字节

字符串类型

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

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

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

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

CHARVARCHAR 类型的区别:

  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类型在存储字符串时,会将右侧末尾的空格保留。
    lua 复制代码
    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
  • binary和varbinary类似于char和varchar,不同的是它们包含二进制字符串,不支持模糊查询之类的,BINARY(M)和VARBINARY这个M存的是最大字节数。

枚举(enum)

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

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

枚举类型的优点:

  1. 限制了可选值
  2. 节省空间
  3. 运行效率高
sql 复制代码
create table t6(
    name varchar(32),
    sex enum('男','女','保密') default '保密'
);

-- 枚举类型的计数默认从1开始
insert into t6 set name='王宝强',sex=1;
Copy

集合(set)

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

sql 复制代码
create table t7 (
    name varchar(32),
    hobby set('吃','睡','玩','喝','抽')
);

insert into t7 values('张三','睡,抽,玩,吃,喝');
insert into t7 values('李四','睡,抽');

BIT类型

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

BLOG类型

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

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

相关推荐
海绵波波10726 分钟前
flask后端开发(1):第一个Flask项目
后端·python·flask
KELLENSHAW2 小时前
MySQL45讲 第三十七讲 什么时候会使用内部临时表?——阅读总结
数据库·mysql
一只淡水鱼662 小时前
【mybatis】详解 # 和 $ 的区别,两者分别适用于哪种场景,使用 $ 不当会造成什么影响
sql·spring·mybatis·sql注入
四七伵2 小时前
MySQL外键类型与应用场景总结:优缺点一目了然
mysql
core5123 小时前
flink cdc各种数据库 jar下载地址
mysql·oracle·flink·jar·oceanbase·cdc
AI人H哥会Java3 小时前
【Spring】控制反转(IoC)与依赖注入(DI)—IoC容器在系统中的位置
java·开发语言·spring boot·后端·spring
凡人的AI工具箱3 小时前
每天40分玩转Django:Django表单集
开发语言·数据库·后端·python·缓存·django
奔跑草-3 小时前
【数据库】SQL应该如何针对数据倾斜问题进行优化
数据库·后端·sql·ubuntu
中國移动丶移不动3 小时前
Java 并发编程:原子类(Atomic Classes)核心技术的深度解析
java·后端
别致的影分身4 小时前
MySQL 常用程序介绍
数据库·mysql