在MySQL数据库中,每一条数据都有数据类型,MySQL支持的数据类型主要分成3类:数值类型、字符串(字符)类型、日期和时间类型。数据类型描述使用以下约定:
示例:FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
约束条件就是给字段加约束,使该字段存储的值更加符合我们的预期。常用的约束如下:
数字类型总体可分为整型、浮点型和定点型三类。
数据类型 | 取值范围 | 单位 | 说明 |
---|---|---|---|
TINYINT | 有符号值:-27~27-1 无符号值:0~28-1 |
1byte | 最小的整数 |
BIT | 0/1(false/ture) | 1bit | 二进制的一位 |
BOOL | 有符号值:-27~27-1 无符号值:0~28-1 |
1byte | 实际上是TINYINT 插入false/true会存储为0/1 |
SMALLINT | 有符号值:-215~215-1 无符号值:0~216-1 |
2byte | 小型整数 |
MEDIUMINT | 有符号值:-223~223-1 无符号值:0~224-1 |
3byte | 中型整数 |
INT | 有符号值:-231~231-1 无符号值:0~232-1 |
4byte | 标准整数 |
BIGINT | 有符号值:-263~263-1 无符号值:0~264-1 |
8byte | 大型整数 |
创建格式:
TINYINT[(M)] [UNSIGNED] [ZEROFILL]
;BOOL[(M)] [UNSIGNED] [ZEROFILL]
;SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
;MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
;INT[(M)] [UNSIGNED] [ZEROFILL]
;BIGINT[(M)] [UNSIGNED] [ZEROFILL]
。
下面示例分析一下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ul67YU6L-1628318150490)(images/数值类型分析.png)]
DECIMAL[(M,D)] [UNSINED] [ZEROFILL]
存储精确的数值。它的范围的可变的,小数点和(负数) -符号不计入 M,M的范围是1到65。D范围为0到30,且D不得大于M。它可自定义长度,比如定义一个叫amount的列存储6为数值,小数点后2位:
--范围-9999.99~9999.99
amount DECIMAL(6,2)
**当D不写默认为0,M写默认为10,如DECIMAL(M)等价于DECIMAL(M,0),如DECIMAL等价于DECIMAL(10,0)。**它经常配合ZEROFILL表示货币。DECIMAL也存在存储时精度丢失的问题。
当MySQL将值存储在超出列数据类型允许范围的数值列中时,结果取决于当时生效的SQL模式:
在我们的配置文件中可以看到SQL模式的配置,关于SQL模式详情请看SQL模式官方文档(全英文,看不懂看不懂)。
在创建数据表时,能选小的数据类型尽量选择小的数据类型,节省内存的同时还能提高查询效率。
字符串类型分为3类:普通的文本字符串类型(CHAR和VARCHAR)、可变类型(TEXT和BLOB)和特殊类型(SET和ENUM)。
[national] CHAR[(M)] [binary|ASCII|unicode](0~255byte)
M表示字符数和字节数,取值范围0~255,存储时始终用空格填充指定长度,M不写默认为1。其中national关键字指定使用的默认字符集,binary指定是否区分大小写(默认区分),ASCII和unicode指定使用字符集。
[national] VARCHAR[(M)] [binary](0~65535byte)
可变长度的字符串,M表示字符最大长度和字节数,范围是0~65535,存储时实际占用**L+1(L<=M,L为实际长度)**个字节。
类型 | 最大长度(字节数) | 说明 |
---|---|---|
TINYBLOB | 28-1 | 小BLOB字段 |
TINYTEXT | 28-1 | 小TEXT字段 |
BLOB | 216-1 | 常规的BLOB字段 |
TEXT | 216-1 | 常规的TEXT字段 |
MEDIUMBLOB | 224-1 | 中型的BLOB字段 |
MEDIUTEXT | 224-1 | 中型的TEXT字段 |
LONGBLOB | 232-1 | 长型的BLOB字段 |
LONGTEXT | 232-1 | 长型的TEXT字段 |
BLOB类型用于存储二进制文件,图片、音频、视频等。针对于BLOB系列类型的间接点我。
类型 | 最大值 | 说明 |
---|---|---|
ENUM(‘value1’,‘vaule2’,…) | 65535 | 字符串对象,该对象可以是选取范围内的一个值或NULL |
SET(‘value1’,‘value2’,…) | 64 | 字符串对象,该对象可以是选取范围内的多个值或NULL |
下面对于ENUM和SET类型演示一下使用方式:
ENUM
--1.创建数据库enum_db
create table enum_db(
id int(4) not null primary key auto_increment,
gender ENUM('男','女','x')
) auto_increment = 1;
--2.插入在范围内的数据
insert into enum_db(gender) values('男');
insert into enum_db(gender) values('x');
insert into enum_db(gender) values('女');
--3.查询表的数据
mysql> select * from enum_db;
+----+--------+
| id | gender |
+----+--------+
| 1 | 男 |
| 2 | x |
| 3 | 女 |
+----+--------+
3 rows in set (0.00 sec)
SET
--1.创建数据库enum_set
create table set_db(
id int(4) not null primary key auto_increment,
options SET('钱','车','房','头发')
) auto_increment = 1;
--2.插入数据
insert into set_db(options) values('钱,车');
insert into set_db(options) values('钱,房');
insert into set_db(options) values('钱,车,房,头发');
--3.查询数据表
mysql> select * from set_db;
+----+--------------------+
| id | options |
+----+--------------------+
| 1 | 钱,车 |
| 2 | 钱,房 |
| 3 | 钱,车,房,头发 |
+----+--------------------+
3 rows in set (0.00 sec)
看到这里,就再拿出来一点私货物。在创建表时,使用字符串类型时应遵循以下原则:
- 速度优先,使用CHAR。
- 节省空间,使用VARCHAR。
- 将列中的内容限制在一定范围内选择一种,使用ENUM。
- 将列中的内容限制在一定范围内选择多种,使用SET。
- 要搜索的内容不区分大小写,使用TEXT。
- 要搜索的内容区分大小写,使用BLOB。
-838:59:59
到838:59:59
,日期格式D HH:mm:SS。D表示天。1000-01-01
到 9999-12-31
,日期格式YYYY-MM-DD。1000-01-01 00:00:00
到 9999-12-31 23:59:59
。日期格式YYYY-MM-DD HH:mm:SS。1970-01-01 00:00:00
UTC到2037年某个时间。格式YYYY-MM-DD HH:mm:SS。下面就展示一些示例:
TIME
TIME的范围是 -838:59:59
到838:59:59
,所以TIME不仅仅可以表示一天中的时,还可以表示两个时间间隔。
--示例
--1.键表
create table time_db(
id int(4) not null primary key auto_increment,
mytime TIME
) auto_increment = 1;
--2.插入数据
--2.1正常时间插入
insert into time_db(mytime) values('21:08:06');
--2.2带天数的时间插入 -2*24-21 = -69h
insert into time_db(mytime) values('-2 21:08:06');
--2.3有一个冒号默认从小时开始算起
insert into time_db(mytime) values('22:08');
--2.4没有冒号没有天数从秒开始算
insert into time_db(mytime) values('30');
--2.5有天数,没有冒号,从小时开始算
insert into time_db(mytime) values('2 10');
--2.6直接使用数值代替也可
insert into time_db(mytime) values(210806);
--3.查看数据
mysql> select * from time_db;
+----+-----------+
| id | mytime |
+----+-----------+
| 1 | 21:08:06 |
| 2 | -69:08:06 | -- (-2*24-21=-69)
| 3 | 22:08:00 |
| 4 | 00:00:30 |
| 5 | 58:00:00 |
| 6 | 21:08:06 |
+----+-----------+
6 rows in set (0.00 sec)
DATE
格式YYYY-MM-DD
--1.建表
create table data_db(
id int(4) not null primary key auto_increment,
mydata DATE
)auto_increment = 1;
--2.插入数据
insert into data_db(mydata) values(20210806);
insert into data_db(mydata) values('2021-06-01');
--3.查询数据
mysql> select * from data_db;
+----+------------+
| id | mydata |
+----+------------+
| 1 | 2021-08-06 |
| 2 | 2021-06-01 |
+----+------------+
2 rows in set (0.00 sec)
DATETIME
格式YYYY-MM-DD HH:mm:SS
--1.建表
create table datatime_db(
id int(4) not null primary key auto_increment,
mydatatime DATETIME
)auto_increment = 1;
--2.插入数据
--2.1直接插入 年月日 时分秒 组合数字
insert into datatime_db(mydatatime) values(20210806210134);
--2.2正常插入
insert into datatime_db(mydatatime) values('2021-08-06 21:01:34');
--2.3没有时分秒默认为00:00:00
insert into datatime_db(mydatatime) values('2021-08-06');
--3.查看数据
mysql> select * from datatime_db;
+----+---------------------+
| id | mydatatime |
+----+---------------------+
| 1 | 2021-08-06 21:01:34 |
| 2 | 2021-08-06 21:01:34 |
| 3 | 2021-08-06 00:00:00 |
+----+---------------------+
3 rows in set (0.00 sec)
TIMESTAMP
格式YYYY-MM-DD HH:mm:SS
,和DATETIME使用差不多,但是范围相对较小
create table timestamp_db(
id int(4) not null primary key auto_increment,
mytimestamp TIMESTAMP
)auto_increment = 1;
insert into timestamp_db(mytimestamp) values(20210806210134);
insert into timestamp_db(mytimestamp) values('2021-08-06 21:01:34');
insert into timestamp_db(mytimestamp) values('2021-08-06');
--查询数据
mysql> select * from timestamp_db;
+----+---------------------+
| id | mytimestamp |
+----+---------------------+
| 1 | 2021-08-06 21:01:34 |
| 2 | 2021-08-06 21:01:34 |
| 3 | 2021-08-06 00:00:00 |
+----+---------------------+
3 rows in set (0.00 sec)
YEAR就不演示了。建表时选择合适的字段非常的重要,尽量减少修改字段。
MySQL中的运算符分为算术运算符、比较运算符、逻辑运算符和位运算符。
对于常见的运算符就不做使用演示,对于不常见的运算符就做出一些简单的使用演示
算术符号 | 作用 |
---|---|
+ | 加法运算 |
- | 减法运算 |
* | 乘法运算 |
/ | 除法运算 |
% | 求余运算 |
DIV | 除法运算,同/ |
MOD | 求余运算,同% |
在除法运算和求余运算中,如果第二个参数是0,结果返回NULL,下面进行简单的使用演示
--1.DIV 查询id为 5 DIV 2的数据(5div2==2)
mysql> SELECT * FROM timestamp_db WHERE id = 5 DIV 2;
+----+---------------------+
| id | mytimestamp |
+----+---------------------+
| 2 | 2021-08-06 21:01:34 |
+----+---------------------+
1 row in set (0.00 sec)
--2.MOD 查询id为 5 MOD 2的数据(5mod2==1)
mysql> SELECT * FROM timestamp_db where id = 5 MOD 2;
+----+---------------------+
| id | mytimestamp |
+----+---------------------+
| 1 | 2021-08-06 21:01:34 |
+----+---------------------+
1 row in set (0.00 sec)
--3.如果第二个参数为0,div或mod得到结果为null
mysql> select 1 DIV 0,1 MOD 0;
+---------+---------+
| 1 DIV 0 | 1 MOD 0 |
+---------+---------+
| NULL | NULL |
+---------+---------+
1 row in set, 2 warnings (0.00 sec)
对于=,>,<,>=,<=
这里就不再细说,大家都知道是它们是什么,也知道怎么用,下面详细看一下不常见的或者是数据库中独有的比较运算符:
比较运算符 | 名称 | 示例 |
---|---|---|
= | 等于 | id=2 |
> | 大于 | id>2 |
>= | 大于等于 | id>=2 |
< | 小于 | id<2 |
<= | 小于等于 | id<=2 |
!= 或 <> | 不大于 | id!=2或id<>2 |
IS NULL | n/a(Not applicable) | id IS NULL |
IS NOT NULL | n/a | id IS NOT NULL |
BETWEEN … AND … | n/a | id BETWEEN 2 AND 12 |
IN | n/a | id IN(1,2,3) |
NOT IN | n/a | id NOT IN(1,2,3) |
LIKE | 模式匹配 | name LIKE(‘shi%’) |
NOT LIKE | 模式匹配 | name NOT LIKE(‘shi%’) |
REGEXP | 正则表达式 | name REGEXP ‘a$’ |
上面的LIKE示例中%做出解释:
_
表示匹配任意一个字符,%
表示匹配任意多个字符。
对REGEXP进行使用演示:
使用REGEXP非常的简单,在正则表达式中**:
^
匹配字符串开头,$
匹配字符串结尾,.
匹配字符串中一个字符。且满足条件返回1,不满足条件返回0**。
--1.建表
CREATE TABLE user_db(
id INT(4) NOT NULL PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(32) NOT NULL
);
--2.插入数据
INSERT INTO user_db(username) VALUES('abc'),('acb'),('bcd'),('bdc'),('cde'),('ced');
--3.使用正则表达式查询数据
--匹配的分别是:开头是a字符串;开头是b的字符串;末尾是c的字符串,字符+c+字符 组成的字符串
mysql> SELECT username,username REGEXP 'a' 开头a,username REGEXP '^b' 开头b,
username REGEXP 'c$' 末尾c,username REGEXP '.c.' 字符c字符 FROM user_db;
+----------+---------+---------+---------+---------------+
| username | 开头a | 开头b | 末尾c | 字符c字符 |
+----------+---------+---------+---------+---------------+
| abc | 1 | 0 | 1 | 0 |
| acb | 1 | 0 | 0 | 1 |
| bcd | 0 | 1 | 0 | 1 |
| bdc | 0 | 1 | 1 | 0 |
| cde | 0 | 0 | 0 | 0 |
| ced | 0 | 0 | 0 | 0 |
+----------+---------+---------+---------+---------------+
6 rows in set (0.00 sec)
逻辑运算符和位运算符都有 与(&)、或(|)和异或(^) 等操作,但是位运算符必须把数值先变成二进制在运算,逻辑运算符直接进行运算,只返回true/false(1/0)。
符号 | 作用 |
---|---|
&& 或 AND | 与 |
|| 或 OR | 或 |
! 或 NOT(针对一个参数) | 非 |
XOR | 异或 |
使用示例,还是以上面比较运算符的数据库为例查询使用:
--1.查看数据库数据
mysql> SELECT * FROM user_db;
+----+----------+
| id | username |
+----+----------+
| 1 | abc |
| 2 | acb |
| 3 | bcd |
| 4 | bdc |
| 5 | cde |
| 6 | ced |
+----+----------+
6 rows in set (0.00 sec)
--2.进行&& AND,|| OR的演示
--&&和AND左右为真则返回1,||和OR左右有一个为真返回1
mysql> SELECT id,id && 1,id AND 1,id || 1,id OR 1 FROM user_db;
+----+---------+----------+---------+---------+
| id | id && 1 | id AND 1 | id || 1 | id OR 1 |
+----+---------+----------+---------+---------+
| 1 | 1 | 1 | 1 | 1 |
| 2 | 1 | 1 | 1 | 1 |
| 3 | 1 | 1 | 1 | 1 |
| 4 | 1 | 1 | 1 | 1 |
| 5 | 1 | 1 | 1 | 1 |
| 6 | 1 | 1 | 1 | 1 |
+----+---------+----------+---------+---------+
6 rows in set (0.00 sec)
--3.进行! NOR,XOR的使用演示
mysql> SELECT id,!id,NOT id,id XOR 1,id XOR 0 FROM user_db;
+----+-----+--------+----------+----------+
| id | !id | NOT id | id XOR 1 | id XOR 0 |
+----+-----+--------+----------+----------+
| 1 | 0 | 0 | 0 | 1 |
| 2 | 0 | 0 | 0 | 1 |
| 3 | 0 | 0 | 0 | 1 |
| 4 | 0 | 0 | 0 | 1 |
| 5 | 0 | 0 | 0 | 1 |
| 6 | 0 | 0 | 0 | 1 |
+----+-----+--------+----------+----------+
6 rows in set (0.00 sec)
位运算符是在二进制数上进行计算的运算符,位运算符先将操作数变成二进制数,进行位运算以后,在变为十进制数放回结果。MySQL支持的位运算符有:&,|,~,^,<<,>>
。针对于二进制位运算符的分析请点击我。
符号 | 作用 |
---|---|
& | 按位与,1与1得1,0与0得0 |
| | 按位或,1和任何数进行或运算得1,0或0得0 |
~ | 按位取反,1取反后变成0,0取反后变成1 |
^ | 按位异或,相同的两个数异或得0,不相同的两个数异或得1 |
<< | 按位左移,m< |
>> | 按位右移,m>>n 表示m的二进制数向右移动n位,左边补n个0 |
优先级 | 运算符 |
---|---|
最低 | =(赋值运算) |
XOR | |
&&,AND | |
NOT | |
BETWEEN、CASE、WHEN、THEN、ELSE | |
=,<=>,>=,>,<=,<,<>,!=,IS,LIKE,REGEXP,IN | |
& | |
<<,>> | |
-,+ | |
*,/,%, | |
^ | |
~ | |
最高 | ! |