前言
内容比较多,一下子可能会看不完,建议收藏,怕你们以后找不到我了。
MySQL数据类型介绍
数据表由多列字段构成,每一个字段指定了不同的数据类型,指定了数据类型之后,也就决定了向字段插入的数据内容;
不同的数据类型也决定了 MySQL 在存储它们的时候使用的方式,以及在使用它们的时候选择什么运算符号进行运算;
数值数据类型
:TINYINT 、SMALINT 、MEDIUMINT 、INT 、BIGINT 、FLOAT 、DOUBLE 、DECIMAL
日期/时间类型
:YEAR 、TIME 、DATE 、DATETIME 、TIMESTAMP
字符串类型
:CHAR 、VARCHAR 、BINARY 、VARBINARY 、BLOB 、TEXT 、ENUM 、SET
数值数据类型
- 数值类型主要用来
存储数字
,不同的数值类型提供不同的取值范围,可以存储的值范围越大,所需要的存储空间也越大 - 数值类型分为:①整数类型 ②浮点数类型 ③定点数类型
整数类型
INT家族合集,都表示数字,用法都一样,区别就是范围不一样而已(见上图),所以下面就以INT举例;
mysql> create table test2
-> (
-> id int(18) primary key auto_increment,
-> age int(3),
-> height int(4)
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test2 values(1,18,182),(2,20,184),(3,22,183);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from test2;
+------+------+--------+
| id | age | height |
+------+------+--------+
| 1 | 18 | 182 |
| 2 | 20 | 184 |
| 3 | 22 | 183 |
+------+------+--------+
3 rows in set (0.00 sec)
浮点数类型和定点数类型
- MySQL 中使用浮点数和定点数来表示
小数
,浮点数有两种类型:单精度浮点数(FLOAT)和双精度浮点数(DOUBLE),定点数只有DECIMAL
; - 浮点数和定点数都可以用
(M,N)
来表示,其中 M 是精度,表示总共的位数,N 是标度,表示小数的位数; - DECIMAL 实际是以字符串形式存放的,在对精度要求比较高的时候(如货币、科学数据等)使用DECIMAL 类型会比较好;
- 浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围,它的缺点是会引起精度问题
例子:
mysql> alter table test2 add t1 float(10,5);
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table test2 add t2 decimal(15,10);
Query OK, 0 rows affected (0.07 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> insert into test2 (t1) values(123.1234567);
Query OK, 1 row affected (0.00 sec)
mysql> insert into test2 (t2) values(12346.1234567);
Query OK, 1 row affected (0.01 sec)
mysql> select * from test2;
+----+------------+--------+-----------+------------------+
| id | age | height | t1 | t2 |
+----+------------+--------+-----------+------------------+
| 1 | 18 | 182 | NULL | NULL |
| 2 | 20 | 184 | NULL | NULL |
| 3 | 22 | 183 | NULL | NULL |
| 4 | 2155 | NULL | NULL | NULL |
| 5 | 21550 | NULL | NULL | NULL |
| 6 | 1234679826 | NULL | NULL | NULL |
| 7 | NULL | NULL |` 123.12346 `| NULL |
| 8 | NULL | NULL | NULL |` 12346.1234567000 `|
+----+------------+--------+-----------+------------------+
8 rows in set (0.00 sec)
从第条插入数据看出,小数点后不到10位会用0补充,
如果超过定义的小数点后面的范围即N的范围 ,则不会显示
mysql> insert into test2 (t1) values(12.12345678);
Query OK, 1 row affected (0.00 sec)
mysql> select * from test2;
+----+------------+--------+-----------+------------------+
| id | age | height | t1 | t2 |
+----+------------+--------+-----------+------------------+
| 1 | 18 | 182 | NULL | NULL |
| 2 | 20 | 184 | NULL | NULL |
| 3 | 22 | 183 | NULL | NULL |
| 4 | 2155 | NULL | NULL | NULL |
| 5 | 21550 | NULL | NULL | NULL |
| 6 | 1234679826 | NULL | NULL | NULL |
| 7 | NULL | NULL | 123.12346 | NULL |
| 8 | NULL | NULL | NULL | 12346.1234567000 |
| 9 | NULL | NULL |` 12.12346 `| NULL |
+----+------------+--------+-----------+------------------+
9 rows in set (0.00 sec)
MySQL 日期/时间类型
- MySQL 有多种表示日期的数据类型,比如,当只记录
年信息
的时候,可以使用 YEAR 类型,而没有必要使用 DATE 类型 - 每一个类型都有合法的取值范围,当指定确实不合法的值时系统将 “零” 值插入到数据库中
YEAR
- 格式:以4位字符串格式表示的 YEAR ,范围为 ‘1901’ ~ ‘2155’
- 格式:以4位数字格式表示的 YEAR ,范围为 1901 ~ 2155
- 格式:以2位字符串格式表示的 YEAR ,范围为 ‘00’ ~ ‘99’ ,其中,
'00' ~ '69' 被转换为 2000 ~ 2069
,'70' ~ '99' 被转换为 1970 ~ 1999
- 格式:以2位数字格式表示的 YEAR ,范围为 1 ~ 99 ,其中,
1 ~ 69 被转换为 2001 ~ 2069
,70 ~ 99 被转换为 1970 ~ 1999
看不懂???
举个例子一下就明白了
mysql> alter table classes add t1 YEAR;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> insert into classes (t1) values ('1999'),('2008'),('89'),('20');
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select * from classes;
+------+-----------+--------------+------+
| id | level | name | t1 |
+------+-----------+--------------+------+
| 1 | good | NULL | NULL |
| 2 | wxcellent | NULL | NULL |
| 3 | bad | NULL | NULL |
| NULL | NULL | lisi | NULL |
| NULL | NULL | chengjisihan | NULL |
| NULL | NULL | NULL | 1999 |
| NULL | NULL | NULL | 2008 |
| NULL | NULL | NULL | 1989 |
| NULL | NULL | NULL | 2020 |
+------+-----------+--------------+------+
9 rows in set (0.00 sec)
注意:这里也是有范围的,20世纪(1900)之前,22世纪中旬(2155)之后都不可用,那咋办?
emm
等到2156年吧,我就去告诉你!!!
mysql> insert into classes (t1) values (2156);
ERROR 1264 (22003): Out of range value for column 't1' at row 1
mysql> insert into classes (t1) values (1900);
ERROR 1264 (22003): Out of range value for column 't1' at row 1
TIME
- TIME 类型的格式为 HH:MM:SS ,HH 表示小时,MM 表示分钟,SS 表示秒;
- 格式:以 ‘HHMMSS’ 格式表示的 TIME ,例如
'101112'
被理解为10:11:12
,但如果插入不合法的时间,如 ‘109712’ ,则被存储为 00:00:00 - 格式:以 ‘D HH:MM:SS’ 字符串格式表示的 TIME ,
其中 D 表示日
,可以取 0 ~ 34 之间的值,在插入数据库的时候 D 会被转换成小时,如 ‘2 10:10’ 在数据库中表示为 58:10:00 ,即2x24+10 = 58
;
mysql> alter table classes add t2 time;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> insert into classes (t2) values ("17:29:54");
Query OK, 1 row affected (0.00 sec)
mysql> select * from classes;
+------+-----------+--------------+------+----------+
| id | level | name | t1 | t2 |
+------+-----------+--------------+------+----------+
| 1 | good | NULL | NULL | NULL |
| 2 | wxcellent | NULL | NULL | NULL |
| 3 | bad | NULL | NULL | NULL |
| NULL | NULL | lisi | NULL | NULL |
| NULL | NULL | chengjisihan | NULL | NULL |
| NULL | NULL | NULL | 1999 | NULL |
| NULL | NULL | NULL | 2008 | NULL |
| NULL | NULL | NULL | 1989 | NULL |
| NULL | NULL | NULL | 2020 | NULL |
| NULL | NULL | NULL | NULL | 17:29:54 |
+------+-----------+--------------+------+----------+
10 rows in set (0.00 sec)
mysql> insert into classes (t2) values("2102450");
Query OK, 1 row affected (0.00 sec)
mysql> insert into classes (t2) values("2 10:24:50");
Query OK, 1 row affected (0.00 sec)
date
- DATE 类型的格式为 YYYY-MM-DD ,其中,YYYY 表示年,MM 表示月,DD 表示日;
- 格式:
'YYYY-MM-DD' 或 'YYYYMMDD'
,取值范围为'1000-01-01' ~ '9999-12-3';
- 格式:
'YY-MM-DD' 或 'YYMMDD'
,这里 YY 表示两位的年值,范围为 ‘00’ ~ ‘99’ ,其中,'00' ~ '69' 被转换为 2000 ~ 2069
,'70' ~ '99' 被转换为 1970 ~ 1999
;
mysql> insert into test1 (日期) values('20200617');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test1 (日期) values('2020-06-16');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test1 (日期) values('200615');
Query OK, 1 row affected (0.01 sec)
mysql> select * from test1;
+---------+---------------------+------------+
| s | location | 日期 |
+---------+---------------------+------------+
| a | NULL | NULL |
| a,b,d | NULL | NULL |
| a,b,c,d | NULL | NULL |
| NULL | This is an example! | NULL |
| NULL | haha123.com! | NULL |
| NULL | NULL | 2020-06-17 |
| NULL | NULL | 2020-06-16 |
| NULL | NULL | 2020-06-15 |
+---------+---------------------+------------+
7 rows in set (0.00 sec)
DATETIME
- DATETIME 类型的格式为
YYYY-MM-DD HH:MM:SS
,其中,YYYY 表示年,MM 表示月,DD 表示日,HH 表示小时,MM 表示分钟,SS 表示秒 - 格式:‘YYYY-MM-DD HH:MM:SS’ 或 ‘YYYYMMDDHHMMSS’ ,字符串格式,取值范围为 ‘1000-01-0100:00:00’ ~ ‘9999-12-31 23:59:59’
- 格式:‘YY-MM-DD HH:MM:SS’ 或 ‘YYMMDDHHMMSS’ ,字符串格式,其中 YY 范围为 ‘00’ ~ ‘99’ ,其中,
'00' ~ '69' 被转换为 2000 ~ 2069
,'70' ~ '99' 被转换为 1970 ~ 1999
; - 格式:YYYYMMDDHHMMSS 或 YYMMDDHHMMSS ,数字格式,取值范围同上
mysql> alter table test1 add datetime datetime;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> insert into test1 (datetime) values ("2020-06-17 21:40:56");
Query OK, 1 row affected (0.00 sec)
mysql> select * from test1;
+---------+---------------------+------------+---------------------+
| s | location | 日期 | datetime |
+---------+---------------------+------------+---------------------+
| a | NULL | NULL | NULL |
| a,b,d | NULL | NULL | NULL |
| a,b,c,d | NULL | NULL | NULL |
| NULL | This is an example! | NULL | NULL |
| NULL | haha123.com! | NULL | NULL |
| NULL | NULL | 2020-06-17 | NULL |
| NULL | NULL | 2020-06-16 | NULL |
| NULL | NULL | 2020-06-15 | NULL |
| NULL | NULL | NULL | 2020-06-17 21:40:56 |
+---------+---------------------+------------+---------------------+
9 rows in set (0.00 sec)
TIMESTAMP
- TIMESTAMP 类型的格式为
YYYY-MM-DD HH:MM:SS
,显示宽度固定在19个字符; - TIMESTAMP 与 DATETIME 的区别在于,TIMESTAMP 的取值范围
小于
DATETIME 的取值范围; - TIMESTAMP 的取值范围为
1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC
,其中 UTC 是世界标准时间,存储时会对当前时区进行转换,检索时再转换回当前时区.
mysql> alter table test1 add timestamp timestamp;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> insert into test1 (timestamp) values ("2020-06-18 00:00:01");
Query OK, 1 row affected (0.00 sec)
mysql> select * from test1;
+---------+---------------------+------------+---------------------+---------------------+
| s | location | 日期 | datetime | timestamp |
+---------+---------------------+------------+---------------------+---------------------+
| a | NULL | NULL | NULL | 2020-06-17 21:53:36 |
| a,b,d | NULL | NULL | NULL | 2020-06-17 21:53:36 |
| a,b,c,d | NULL | NULL | NULL | 2020-06-17 21:53:36 |
| NULL | This is an example! | NULL | NULL | 2020-06-17 21:53:36 |
| NULL | haha123.com! | NULL | NULL | 2020-06-17 21:53:36 |
| NULL | NULL | 2020-06-17 | NULL | 2020-06-17 21:53:36 |
| NULL | NULL | 2020-06-16 | NULL | 2020-06-17 21:53:36 |
| NULL | NULL | 2020-06-15 | NULL | 2020-06-17 21:53:36 |
| NULL | NULL | NULL | 2020-06-17 21:40:56 | 2020-06-17 21:53:36 |
| NULL | NULL | NULL | NULL | 2020-06-18 00:00:01 |
+---------+---------------------+------------+---------------------+---------------------+
10 rows in set (0.01 sec)
# 配置完会发现除了修改的时间戳其他的都已经改成了本地的时间
字符串类型
- 字符串类型用来存储字符串数据,还可以存储比如图片和声音的二进制数据
- MySQL 支持两种字符串类型:
文本字符串
和二进制字符串
文本字符串如下:
CHAR 和 VARCHAR
- CHAR(M) 为
固定长度的字符串
,在定义时指定字符串列长,当保存时在右侧填充空格以达到指定的长度,M 表示列长度,取值范围是 0~255 个字符
,例如,CHAR(4) 定义了一个固定长度的字符串列,其包含的字符个数最大为 4,当检索到 CHAR 值时,尾部的空格将被删掉; - VARCHAR(M) 为可变长度的字符串,M 表示最大列长度,
取值范围是 0~65535
;
# CHAR固定字符串
mysql> alter table classes add name char(4);
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> insert into classes (name) values("lisi");
Query OK, 1 row affected (0.01 sec)
mysql> insert into classes (name) values("chengjisihan");
ERROR 1406 (22001): Data too long for column 'name' at row 1
mysql>
# VARCHAR可变字符串
mysql> alter table classes modify name varchar(25);
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> insert into classes (name) values("chengjisihan");
Query OK, 1 row affected (0.01 sec)
mysql> select * from classes
-> ;
+------+-----------+--------------+
| id | level | name |
+------+-----------+--------------+
| 1 | good | NULL |
| 2 | excellent | NULL |
| 3 | bad | NULL |
| NULL | NULL | lisi |
| NULL | NULL | chengjisihan |
+------+-----------+--------------+
5 rows in set (0.01 sec)
TEXT
- TINYTEXT 最大长度为
255
个字符 - TEXT 最大长度为
65536
个字符 - MEDIUMTEXT 最大长度为
16777215
个字符 - LONGTEXT 最大长度为
4294967295
个字符
注:TEXT家族用法都一样,只是长度不同,就不一一举例了,根据自己的需求改变长度即可
mysql> alter table test1 add location text;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc test1;
+----------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+-------+
| s | set('a','b','c','d') | YES | | NULL | |
| location | text | YES | | NULL | |
+----------+----------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> insert into test1(location) values("This is an example");
Query OK, 1 row affected (0.00 sec)
mysql> select * from test1;
+---------+--------------------+
| s | location |
+---------+--------------------+
| a | NULL |
| a,b,d | NULL |
| a,b,c,d | NULL |
| NULL | This is an example |
+---------+--------------------+
4 rows in set (0.00 sec)
ENUM
ENUM 是一个字符串对象,其值为表创建时在列规定中枚举(即列举)的一列值
,即就像做多选题一样,只能在给出的选项里面选择,语法格式为:字段名 ENUM ('值1', '值2', ..... '值n')
字段名指将要定义的字段,值 n 指枚举列表中的第 n 个值,ENUM类型的字段在取值时,只能在指定的枚举列表中取
,而且一次只能取一个,列表值所允许的成员值从 1 开始编号,MySQL 存储的就是这个索引编号。
mysql> create table classes
-> (
-> id int,
-> level enum('excellent','good','bad')
-> );
Query OK, 0 rows affected (0.01 sec)
mysql>
mysql> insert into classes values(1,'good'),(2,1),(3,3); #后两个根据索引插入的
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from classes;
+------+-----------+
| id | level |
+------+-----------+
| 1 | good |
| 2 | excellent |
| 3 | bad |
+------+-----------+
3 rows in set (0.00 sec)
mysql> insert into classes values(4,'best'); // 如果插入一个没有定义过的枚举值'best'会报错
ERROR 1265 (01000): Data truncated for column 'level' at row 1
SET
- SET 是一个字符串对象,可以有零个或多个值,SET 列最多可以有 64 个成员,其值为表创建时规定的一列值,语法:
SET('值1','值2',...... '值n')
- 与 ENUM 类型相同,SET 值在内部用整数表示,列表中每一个值都有一个索引编号;
- 与 ENUM 类型不同的是,ENUM 类型的字段只能从定义的列值中选择一个值插入,而 SET 类型的列可从定义的列值中选择
多个字符的联合
; - 如果插入 SET 字段中列值有重复,则 MySQL
自动删除重复的值
,插入 SET 字段的值的顺序并不重要,MySQL 会在存入数据库时,按照定义的顺序显示
mysql> create table test1 (s set('a','b','c','d'));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test1 values ('a'),('a,b,a,d'),('d,b,a,c');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from test1;
+---------+
| s |
+---------+
| a |
| a,b,d |
| a,b,c,d |
+---------+
3 rows in set (0.00 sec)
二进制字符串如下:
二进制字符串会应用到一些安全系数要求比较高的场景
BIT
- BIT 数据类型用来保存位字段值,即以
二进制的形式来保存数据
,如保存数据 13,则实际保存的是 13 的二进制值,即 1101; - BIT 是位字段类型,
BIT(M) 中的 M 表示每个值的位数
,范围为 1~64 ,如果 M 被省略,则默认为 1 ,如果为 BIT(M) 列分配的值的长度小于 M 位,则在值得左边用 0 填充; - 如果需要位数至少为 4 位的 BIT 类型,即可定义为 BIT(4) ,则最大 可插入的数据为15(1111);
mysql> create table test2(b BIT(4));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test2 values (2),(9),(15);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from test2;
+------+
| b |
+------+
| |
| |
| |
+------+
3 rows in set (0.00 sec)
mysql> select BIN(b+0) from test2;
+----------+
| BIN(b+0) |
+----------+
| 10 |
| 1001 |
| 1111 |
+----------+
3 rows in set (0.00 sec)
mysql> insert into test2 values (16);
ERROR 1406 (22001): Data too long for column 'b' at row 1
mysql>
# M定义为4最大十进制数为15,至于为什莫,参考100以内自然数二进制转换
BINARY 和 VARBINARY
- BINARY 和 VARBINARY 类型类似于
CHAR 和 VARCHAR
,不同的是它们包含二进制字节字符串; - BINARY 类型的长度是固定的,指定长度之后,不足最大长度的,将在它们右边填充 ‘\0’ 以补齐指定长度;
- VARBINARY 类型的长度是可变的,指定长度之后,其长度可以在
0 到最大值之间
,
mysql> create table test3
-> (
-> b binary(3), # 定义固定长度为3的BINARY类型
-> vb varbinary(30) # 定义可变长度为30的VARBINARY类型
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test3 values(5,5);
Query OK, 1 row affected (0.00 sec)
mysql> select * from test3;
+------+------+
| b | vb |
+------+------+
| 5 | 5 |
+------+------+
1 row in set (0.00 sec)
mysql> select length(b),length(vb) from test3;
+-----------+------------+
| length(b) | length(vb) |
+-----------+------------+
| 3 | 1 | # BINARY占用的空间为固定的指定的值
| | | # VARBINARY占用的空间为可变的插入的值
+-----------+------------+
1 row in set (0.00 sec)
插入多行值以后,发现下面情况,定义的binary占用空间是固定值,varbinary可变,并且定义长度为30,包括的范围是0到最大值;
mysql> select * from test3;
+------+--------+
| b | vb |
+------+--------+
| 5 | 5 |
| 2 | 5 |
| 8 | 5 |
| 8 | 8 |
| 25 | 100 |
| 100 | 625 |
| 100 | 1625 |
| 100 | 0 |
| 100 | 165254 |
+------+--------+
9 rows in set (0.00 sec)
mysql> select length(b),length(vb) from test3;
+-----------+------------+
| length(b) | length(vb) |
+-----------+------------+
| 3 | 1 |
| 3 | 1 |
| 3 | 1 |
| 3 | 1 |
| 3 | 3 |
| 3 | 3 |
| 3 | 4 |
| 3 | 1 |
| 3 | 6 |
+-----------+------------+
9 rows in set (0.00 sec)
运算符介绍
根据运算符的作用,我们大致可分为4类
- 比较运算符
- 算术运算符
- 逻辑运算符
- 位移运算符
比较运算符
等于运算符 ( = )
等于运算符用来判断数字
、字符串
和表达式
是否相等,如果相等,则返回值为 1 ,否则返回值为 0 ,如果有一个值是NULL
,则比较结果为 NULL
mysql> select 1=0,'2'=2,(1+3)=(2+2),1=null;
+-----+-------+-------------+--------+
| 1=0 | '2'=2 | (1+3)=(2+2) | 1=null |
+-----+-------+-------------+--------+
| 0 | 1 | 1 | NULL |
+-----+-------+-------------+--------+
1 row in set (0.00 sec)
安全等于运算符 ( <=> )
这个操作符和等于运算符(=)的作用一致,只不过多了一个功能,就是可以判断 NULL 值
mysql> select 1<=>0,'2'<=>2,(1+3)<=>(2+2),1<=>null;
+-------+---------+---------------+----------+
| 1<=>0 | '2'<=>2 | (1+3)<=>(2+2) | 1<=>null |
+-------+---------+---------------+----------+
| 0 | 1 | 1 | 0 |
+-------+---------+---------------+----------+
1 row in set (0.00 sec)
不等于运算符 ( <> 或 != )
不等于运算符用于判断数字
、字符串
、表达式
是否不相等,如果不相等则返回 1
,否则返回0
,但是不能判断NULL 值
;
mysql> select 'good'<>'god',1<>2,4!=4,null!=null;
+---------------+------+------+------------+
| 'good'<>'god' | 1<>2 | 4!=4 | null!=null |
+---------------+------+------+------------+
| 1 | 1 | 0 | NULL |
+---------------+------+------+------------+
1 row in set (0.01 sec)
IS NULL 、ISNULL 、IS NOT NULL
- IS NULL 和 ISNULL 检验一个值是否为 NULL ,如果为
NULL
,返回值为1
,否则返回值为0
; - IS NOT NULL 检验一个值是否不为 NULL ,如果
不为 NULL
,返回值为1
,否则返回值为0
;
样板:
mysql> select * from test2;
+----+------------+--------+-----------+------------------+
| id | age | height | t1 | t2 |
+----+------------+--------+-----------+------------------+
| 1 | 18 | 182 | NULL | NULL |
| 2 | 20 | 184 | NULL | NULL |
| 3 | 22 | 183 | NULL | NULL |
| 4 | 2155 | NULL | NULL | NULL |
| 5 | 21550 | NULL | NULL | NULL |
| 6 | 1234679826 | NULL | NULL | NULL |
| 7 | NULL | NULL | 123.12346 | NULL |
| 8 | NULL | NULL | NULL | 12346.1234567000 |
| 9 | NULL | NULL | 12.12346 | NULL |
+----+------------+--------+-----------+------------------+
9 rows in set (0.00 sec)
mysql> select t1 is null from test2 where id=1;
+------------+
| t1 is null |
+------------+
| 1 |
+------------+
1 row in set (0.00 sec)
mysql> select t1 is not null from test2 where id=1;
+----------------+
| t1 is not null |
+----------------+
| 0 |
+----------------+
1 row in set (0.00 sec)
BETWEEN AND
用于判断一个值是否落在两个值之间,正确返回1,否则返回0;
mysql> select age between 16 and 20 from test2 where id=1;
+-----------------------+
| age between 16 and 20 |
+-----------------------+
| 1 |
+-----------------------+
1 row in set (0.00 sec)
mysql>
LEAST 、GREATEST
- LEAST :当有两个或多个参数时,返回最小值,如果有一个值是 NULL ,则返回结果为 NULL
- GREATEST :当有两个或多个参数时,返回最大值,如果有一个值是 NULL ,则返回结果为 NULL
mysql> select least (2,0);
+-------------+
| least (2,0) |
+-------------+
| 0 |
+-------------+
1 row in set (0.00 sec)
mysql> select greatest (2,0);
+----------------+
| greatest (2,0) |
+----------------+
| 2 |
+----------------+
1 row in set (0.01 sec)
IN 、NOT IN
- IN :判断一个值是否是 IN 列表中的任意一个值
- NOT IN :判断一个值是否不是 IN 列表中的任意一个值
mysql> select 2 in (1,3,5),2 not in (1,3,5);
+--------------+------------------+
| 2 in (1,3,5) | 2 not in (1,3,5) |
+--------------+------------------+
| 0 | 1 |
+--------------+------------------+
1 row in set (0.00 sec)
LIKE
- LIKE 运算符用来匹配字符串,如果匹配则返回
1
,如果不匹配则返回0
; - LIKE 使用两种通配符:
'%'
用于匹配任何数目的字符,包括零字符 ;'_'
只能匹配一个字符
mysql> select height like '18%' from test2;
+-------------------+
| height like '18%' |
+-------------------+
| 1 |
| 1 |
| 1 |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
+-------------------+
9 rows in set (0.00 sec)
PS:这里要注意和select查询时的模糊查询,在运算符里面给你回传的结果是1或0,只是有没有的问题,模糊查询回传的是查询结果,一般会和where条件语句连接词一起使用,如下
mysql> select * from test2 where height like '18%';
+----+------+--------+------+------+
| id | age | height | t1 | t2 |
+----+------+--------+------+------+
| 1 | 18 | 182 | NULL | NULL |
| 2 | 20 | 184 | NULL | NULL |
| 3 | 22 | 183 | NULL | NULL |
+----+------+--------+------+------+
3 rows in set (0.00 sec)
REGEXP
- REGEXP 运算符用来匹配字符串,如果匹配则返回
1
,如果不匹配则返回0
; - REGEXP 使用几种通配符:
‘^’ 用于匹配以什么开头的字符串
‘$’ 用于匹配以什么结尾的字符串
‘.’ 用于匹配任何一个单字符串
‘[…]’ 用于匹配在方括号内的任何字符
‘*’ 用于匹配零个或多个在它前面的字符
mysql> select age regexp '^2' from test2;
+-----------------+
| age regexp '^2' |
+-----------------+
| 0 |
| 1 |
| 1 |
| 1 |
| 1 |
| 0 |
| NULL |
| NULL |
| NULL |
+-----------------+
9 rows in set (0.00 sec)
PS:通常也被应用到select查询中,也叫正则表达式查询,
mysql> select * from test2 where age regexp '^2';
+----+-------+--------+------+------+
| id | age | height | t1 | t2 |
+----+-------+--------+------+------+
| 2 | 20 | 184 | NULL | NULL |
| 3 | 22 | 183 | NULL | NULL |
| 4 | 2155 | NULL | NULL | NULL |
| 5 | 21550 | NULL | NULL | NULL |
+----+-------+--------+------+------+
4 rows in set (0.00 sec)
算术运算符
- +:加法运算
- -:减法运算
- *:乘法运算
- / :除法运算,返回商
- % :求余运算,返回余数
mysql> create table test3 (num int);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test3 values(64);
Query OK, 1 row affected (0.00 sec)
mysql> select num,num+10,num-3,num*3,num/3,num%3 from test3;
+------+--------+-------+-------+---------+-------+
| num | num+10 | num-3 | num*3 | num/3 | num%3 |
+------+--------+-------+-------+---------+-------+
| 64 | 74 | 61 | 192 | 21.3333 | 1 |
+------+--------+-------+-------+---------+-------+
1 row in set (0.00 sec)
mysql>
逻辑运算符
逻辑非 ( NOT 或 !)
- 当操作数为 0 时,所得值为 1
- 当操作数为非 0 时,所得值为 0
- 当操作数为 NULL 时,所得值为 NULL
mysql> select not 10,not 10-10,!(10-5),! null;
+--------+-----------+---------+--------+
| not 10 | not 10-10 | !(10-5) | ! null |
+--------+-----------+---------+--------+
| 0 | 1 | 0 | NULL |
+--------+-----------+---------+--------+
1 row in set (0.00 sec)
逻辑与 ( AND 或 && )
- 当所有操作数均为非零值、并且不为 NULL 时,所得值为 1
- 当一个或多个操作数为 0 时,所得值为 0
- 其余情况所得值为 NULL
mysql> select 10 and 5,(10-10) and 5,5 && null;
+----------+---------------+-----------+
| 10 and 5 | (10-10) and 5 | 5 && null |
+----------+---------------+-----------+
| 1 | 0 | NULL |
+----------+---------------+-----------+
1 row in set (0.00 sec)
逻辑或 ( OR 或 || )
- 当两个操作数均为非 NULL 值,且任意一个操作数为非零值时,结果为 1 ,否则为 0
- 当有一个操作数为 NULL ,且另一个操作数为非零值时,则结果为 1 ,否则结果为 NULL
- 当两个操作数均为 NULL 时,则所得结果为 NULL
mysql> select (5*2)||(0*5),(5*3)||(5-3),null||(5/2),null||null;
+--------------+--------------+-------------+------------+
| (5*2)||(0*5) | (5*3)||(5-3) | null||(5/2) | null||null |
+--------------+--------------+-------------+------------+
| 1 | 1 | 1 | NULL |
+--------------+--------------+-------------+------------+
1 row in set (0.00 sec)
逻辑异或 ( XOR )
a XOR b
的计算等同于( a AND (NOT b) )
或( (NOT a) AND b )
- 当任意一个操作数为 NULL 时,返回值为 NULL
- 对于非 NULL 的操作数,如果两个操作数都是非 0 值或者都是 0 值,则返回结果为 0
- 如果一个为 0 值,另一个为非 0 值,返回结果为 1
mysql> select 1 xor 1,1 xor 0,1 xor null;
+---------+---------+------------+
| 1 xor 1 | 1 xor 0 | 1 xor null |
+---------+---------+------------+
| 0 | 1 | NULL |
+---------+---------+------------+
1 row in set (0.00 sec)
位运算符
全部针对二进制形式进行的操作
位或运算符 ( | )
对应的二进制位有一个或两个为 1 ,则该位的运算结果为 1 ,否则为 0
mysql> select 10 | 15 , 9 | 4 | 2 ;
+---------+-----------+
| 10 | 15 | 9 | 4 | 2 | # 10的二进制为1010,15的二进制为1111,按位或运算之后结果为1111,即15
+---------+-----------+ # 9的二进制为1001,4为0100,2的二进制为0010,按位或运算之后1111,也是15
| 15 | 15 |
+---------+-----------+
1 row in set (0.00 sec)
****************************************************************
为什么是15?我们来用二进制算一下,以第一组为例
128 64 32 16 8 4 2 1 #二进制
1 0 1 0 #二进制10的表示
1 1 1 1 #二进制15的表示
根据位或规则得 `1 1 1 1`,对应起来十进制数就是15
位与运算符 ( & )
对应的二进制位都为 1 ,则该位的运算结果为 1 ,否则为 0
mysql> select 10 & 15 , 9 & 4 & 2 ;
+---------+-----------+
| 10 & 15 | 9 & 4 & 2 |
+---------+-----------+
| 10 | 0 |
+---------+-----------+
1 row in set (0.00 sec)
位异或运算符 ( ^ )
对应的二进制位不相同时,结果为 1 ,否则为 0
mysql> select 10 ^ 15 , 9 ^ 4 ^ 2 ;
+---------+-----------+
| 10 ^ 15 | 9 ^ 4 ^ 2 |
+---------+-----------+
| 5 | 15 |
+---------+-----------+
1 row in set (0.00 sec)
位左移运算符 ( << )
使指定的二进制位都左移指定的位数,左移指定位之后,左边高位的数值将被移出并丢弃,右边低位空出的位置用 0 补齐
mysql> select 1<<2 , 4<<2 ;
+------+------+
| 1<<2 | 4<<2 | # 1的二进制值为00000001,左移两位之后变成00000100,即十进制数4
+------+------+ # 4的二进制值为00000100,左移两位之后变成00010000,即十进制数16
| 4 | 16 |
+------+------+
位右移运算符 ( >> )
使指定的二进制位都右移指定的位数,右移指定位之后,右边低位的数值将被移出并丢弃,左边高位空出的职位用 0 补齐
mysql> select 1>>1,16>>2;
+------+-------+
| 1>>1 | 16>>2 |
+------+-------+
| 0 | 4 |
+------+-------+
1 row in set (0.00 sec)
位取反运算符 ( ~ )
将对应的二进制数逐位反转,即 1 取反后变 0 , 0 取反后变 1
mysql> select 5 & ~1;
+--------+
| 5 & ~1 |
+--------+
| 4 |
+--------+
1 row in set (0.00 sec)
************************************************************
4是怎么得来的?
5=0101
~1=1110
位与以后得0100,换成十进制就是4
运算符优先级比较
从低到高:
=(赋值运算) || or
XOR
&& AND
NOT
BETWEEN
=(比较运算) , <=>, >=, <>, <=, < > , != ,IS, LIKE, IN ,REGEXP
|&
<< >>
- +
* / %
-(负号) ~(位取反) !