大白话从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 时间戳类型
- 时间戳类型在显示方面和datetime是一样的, 在存储上不一样
- 范围从 1970-1-1 0:0:0 到 2038-1-19 11:14:07
- 时间戳使用 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
sqlcreate 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
CHAR
与 VARCHAR
类型的区别:
-
允许的最大值范围不同。
注意:无论是char(n)还是varchar(n),n表示的都是字符数,而不是字节数。
- char(n)类型里,无论数据库使用的是哪种编码方式,n的最大取值都只能取到255,char = char(1),char(0)只能存""和null,
- varchar(n)类型里,如果使用的是Latin1编码,最大值允许到65535(但是实际取值只能到65532,还要保留三个字节用来记录长度);如果使用的是UTF8编码,最大值允许到21845(但是实际取值只能到21844,还要保留一个字符用来记录长度)。
-
数据库内存存储的长度不同。
- char(n)类型里,无论输入的内容是什么,存储的长度都是 n个字符。例如,数据类型char(10),写入字符串'张三',在数据库里存入的数据长度是10个字符,所占字节数为n * 编码集编码一个字符需要的最大字节。
- varchar(n)类型里,存储的长度是不固定可变的。
-
对于空格的处理不同。
- char类型在存储字符串时,会将右侧末尾的空格去掉。
- varchar类型在存储字符串时,会将右侧末尾的空格保留。
luacreate 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)
多选一的时候使用的一种数据类型
在前端使用单选框的时候, 枚举类型可以发挥作用
枚举类型的优点:
- 限制了可选值
- 节省空间
- 运行效率高
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初体验到这就结束啦,如果您感觉有帮助的话,请点赞收藏,您的点赞是我创作的动力。