PS: 1个字节=8位二进制数。
一、数据类型
创建数类型的作用:
-
数据表由多列字段构成,每一个字段指定了不同的数据类型,指定了数据类型之后,也就决定了向字段插入的数据内容
-
不同的数据类型也决定了 MySQL 在存储它们的时候使用的方式,以及在使用它们的时候选择什么运算符号进行运算
Mysql的数据类型主要包括以下四大类:
- 整数类型
- 浮点数类型
- 日期时间类型
- 字符串类型
1.整数类型
类型名称 | 说明 | 存储需求 | 有符号的取值范围 | 无符号的取值范围 |
---|---|---|---|---|
tinyint | 很小的整数 | 1个字节 | -128~127 | 0~255 |
smallint | 小的整数 | 2个字节 | -32768 ~ 32767 | 0 ~ 65535 |
mediumint | 中等大小的整数 | 3个字节 | -8388608 ~ 8388607 | 0 ~ 16777215 |
int | 普通大小的整数 | 4个字节 | -2147483648 ~ 2147483647 | 0 ~ 4294967295 |
bigint | 大整数 | 8个字节 | -9223372036854775808 ~9223372036854775807 | 0~18446744073709551615 |
mysql> create database test;
Query OK, 1 row affected (0.00 sec)
mysql> use test;
Database changed
#有符号的取值范围
mysql> create table t1 (a tinyint,b smallint ,c mediumint, d int,e bigint);
Query OK, 0 rows affected (0.11 sec)
mysql> desc t1;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| a | tinyint(4) | YES | | NULL | |
| b | smallint(6) | YES | | NULL | |
| c | mediumint(9) | YES | | NULL | |
| d | int(11) | YES | | NULL | |
| e | bigint(20) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
# 添加值在取值的范围内即可添加,超过则无
mysql> insert into t1 (a,b,c,d,e) values(-128,-32768,-8388608,-2147483648,-9223372036854775808);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t1 (a,b,c,d,e) values(127,32767,8388607,2147483647,9223372036854775807);
Query OK, 1 row affected (0.01 sec)
mysql> select * from t1;
+------+--------+----------+-------------+----------------------+
| a | b | c | d | e |
+------+--------+----------+-------------+----------------------+
| -128 | -32768 | -8388608 | -2147483648 | -9223372036854775808 |
| 127 | 32767 | 8388607 | 2147483647 | 9223372036854775807 |
+------+--------+----------+-------------+----------------------+
2 rows in set (0.00 sec)
#超过取值范围则不可插入数据
mysql> insert into t1 (a) values(128);
ERROR 1136 (21S01): Column count doesn't match value count at row 1'
# 无符号的取值范围
mysql> create table one (a tinyint unsigned ,b smallint unsigned, c mediumint unsigned,d int unsigne
ed, e bigint unsigned);
Query OK, 0 rows affected (0.12 sec)
# 添加值在取值的范围内即可添加,超过则无
mysql> insert into one(a,b,c,d,e) values (0,0,0,0,0);
Query OK, 1 row affected (0.00 sec)
mysql> insert into one(a,b,c,d,e) values (255,65535,16777215,4294967295,18446744073709551615);
Query OK, 1 row affected (0.00 sec)
mysql> select * from one;
+------+-------+----------+------------+----------------------+
| a | b | c | d | e |
+------+-------+----------+------------+----------------------+
| 0 | 0 | 0 | 0 | 0 |
| 255 | 65535 | 16777215 | 4294967295 | 18446744073709551615 |
+------+-------+----------+------------+----------------------+
2 rows in set (0.00 sec)
# 超过取值范围则插入不仅数据
mysql> insert into one(a) values (-1);
ERROR 1264 (22003): Out of range value for column 'a' at row 1
2.浮点数类型
- MySQL 中使用浮点数和定点数来表示小数,浮点数有两种类型:单精度浮点数(FLOAT)和双精度浮点数(DOUBLE),定点数只有 DECIMAL
- 浮点型和定点型可以用类型名称后加(M,D)来表示,M表示该值的总共长度,D表示小数点后面的长度,M和D又称为精度和标度,如float(7,4)的 可显示为-999.9999,MySQL保存值时进行四舍五入,如果插入999.00009,则结果为999.0001。对于decimal,M是最大位数(精度),范围是1到65。可不指定,默认值是10。D是小数点右边的位数(小数位)。范围是0到30,并且不能大于M,可不指定,默认值是0,N 是标度,表示小数的位数。
- DECIMAL 实际是以字符串形式存放的,在对精度要求比较高的时候(如货币、科学数据等)使用DECIMAL 类型会比较好
- 浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围,它的缺点是会引起精度问题
类型名称 | 含义 | 有符号的取值范围 | 无符号的取值范围 |
---|---|---|---|
float | 单精度浮点数 | 4个字节 | -3.402823466EE+38 ~ -1.175494251E-38 |
double | 双精度浮点数 | 8个字节 | -1.7976931348623157E+308 ~-2.2250738585072014E-308 |
decimal | 压缩的“严格”定点数 | M+2个字节(M不固定) | 不固定 |
mysql> create table t2
-> (
-> a float(5,2),
-> b double(10,5),
-> c decimal(10,5)
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> insert into t2 values (12.1234567,12.123456,12.1234567);
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from t2;
+-------+----------+----------+
| a | b | c |
+-------+----------+----------+
| 12.12 | 12.12346 | 12.12346 |
+-------+----------+----------+
1 row in set (0.00 sec)
3.日期、时间类型
- MySQL 有多种表示日期的数据类型,比如,当只记录年信息的时候,可以使用 YEAR 类型,而没有必要使用 DATE 类型
- 每一个类型都有合法的取值范围,当指定确实不合法的值时系统将 “零” 值插入到数据库中
类型名称 | 日期格式 | 日期范围 | 存储需求 |
---|---|---|---|
year | YYYY | 1901 ~ 2155 | 1字节 |
time | HH:MM:SS | -838:59:59 ~ 838:59:59 | 3字节 |
date | YYYY-MM-DD | 1000-01-01 ~ 9999-12-31 | 3字节 |
datetime | YYYY-MM-DDHH:MM:SS | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 8字节 |
timestamp | YYYY-MM-DDHH:MM:SS | 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07UTC | 4字节 |
- UTC:UTC 是世界标准时间,存储时会对当前时区进行转换,检索时再转换回当前时区
mysql> create table t3
-> (
-> a1 year,
-> a2 time,
-> a3 date,
-> a4 datetime,
-> a5 timestamp
-> );
Query OK, 0 rows affected (0.12 sec)
mysql> insert into t3(a1,a2,a3,a4,a5) values('2154','12:12:12','2002-01-15','2002-01-15 12:12:12','2001-01-15 00:00:01');
Query OK, 1 row affected (0.01 sec)
mysql> select * from t3;
+------+----------+------------+---------------------+---------------------+
| a1 | a2 | a3 | a4 | a5 |
+------+----------+------------+---------------------+---------------------+
| NULL | NULL | NULL | NULL | 2020-11-29 22:08:20 |
| 2154 | 12:12:12 | 2002-01-15 | 2002-01-15 12:12:12 | 2001-01-15 00:00:01 |
+------+----------+------------+---------------------+---------------------+
2 rows in set (0.00 sec)
4.字符串类型
-
字符串类型用来存储字符串数据,还可以存储比如图片和声音的二进制数据
-
MySQL 支持两种字符串类型:文本字符串和二进制字符串
4.1 文本字符串
类型 | 含义 | 存储需求 |
---|---|---|
char(M) | 固定长度的文本字符串 | M 字节,1 <= M <= 255 |
varchar(M) | 可变长度的文本字符串 | L+1 字节,在此 L <= M 和 1 <= M <= 255 |
tinytext | 非常小的文本字符串 | L+1 字节,在此 L < 2^8 |
text | 小的文本字符串 | L+2 字节,在此 L < 2^16 |
emdiumtext | 中等大小的文本字符串 | L+3 字节,在此 L < 2^24 |
longtext | 大的文本字符串 | L+4 字节,在此 L < 2^32 |
enum | 枚举类型,只能有一个枚举字符串值 | 1 或 2 个字节,取决于枚举值的数目(最大值65535) |
set | 一个设置,字符串对象可以有零个或多个SET成员 | 1, 2, 3, 4 或 8 个字节,取决于集合成员的数量(最多64个成员) |
char和varchar的区别:
- char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格,varchar不限于此;
- char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),所以varchar(4),存入3个字符将占用4个字节;
- char类型的字符串检索速度要比varchar类型的快;
varchar和text的区别:
- varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字节;
- text类型不能有默认值;
- varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用;
enum
mysql> create tbale emun
-> (
-> soc int,
-> level enum('excellent','good','bad') #自定义枚举值
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> insert into emun values(100,'excellent'),(70,'good'),(50,'bad');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from emun;
+------+-----------+
| soc | level |
+------+-----------+
| 100 | excellent |
| 70 | good |
| 50 | bad |
+------+-----------+
3 rows in set (0.00 sec)
set
扫描二维码关注公众号,回复:
12353122 查看本文章
- SET 是一个字符串对象,可以有零个或多个值,SET 列最多可以有 64 个成员,其值为表创建时规定的一列值,语法:SET(‘值1’,‘值2’,… ‘值n’)
- 与 ENUM 类型相同,SET 值在内部用整数表示,列表中每一个值都有一个索引编号
- 与 ENUM 类型不同的是,ENUM 类型的字段只能从定义的列值中选择一个值插入,而 SET 类型的列可从定义的列值中选择多个字符的联合
- 如果插入 SET 字段中列值有重复,则 MySQL 自动删除重复的值,插入 SET 字段的值的顺序并不重要,MySQL 会在存入数据库时,按照定义的顺序显示
#自定义SET字段的值
mysql> CREATE TABLE seta ( s SET('a', 'b', 'c', 'd') );
Query OK, 0 rows affected (0.01 sec)
#只能插入自定义的set字段的值
mysql> insert into seta values('a'),('a,b,a'),('c,a,d');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
#如果插入的不是自定义的值会报错
mysql> insert into seta values ('a,x,b,y');
ERROR 1265 (01000): Data truncated for column 's' at row 1
mysql> select * from seta;
+-------+
| s |
+-------+
| a |
| a,b |
| a,c,d |
+-------+
3 rows in set (0.00 sec)
4.2 二进制字符串
类型 | 含义 | 存储需求 |
---|---|---|
bit(M) | 位字段类型 | 大约(M+7)/8 个字节 |
binary(M) | 固定长度的二进制字符串 | M个字节 |
varbinary(M) | 可变长度的二进制字符串 | M+1个字节 |
tinyblob(M) | 非常小的BLOB | L+1 字节,在此 L < 2^8 |
blob(M) | 小的BLOB | L+2 字节,在此 L < 2^16 |
mediumblob(M) | 中等大小的BLOB | L+3 字节,在此 L < 2^24 |
longblob(M) | 非常大的BLOB | L+4 字节,在此 L < 2^32 |
bit
- BIT 数据类型用来保存位字段值,即以二进制的形式来保存数据,如保存数据 13,则实际保存的是 13 的二进制值,即 1101
- BIT 是位字段类型,BIT(M) 中的 M 表示每个值的位数,范围为 1~64 ,如果 M 被省略,则默认为 1 ,如果为 BIT(M) 列分配的值的长度小于 M 位,则在值得左边用 0 填充
- 如果需要位数至少为 4 位的 BIT 类型,即可定义为 BIT(4) ,则大于 1111 的数据是不能被插入的
mysql> create table bit (a bit(4));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into bit values (2),(9),(15);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select (a+0) from bit;
+-------+
| (a+0) |
+-------+
| 2 |
| 9 |
| 15 |
+-------+
3 rows in set (0.00 sec)
binary和varbinary
- BINARY 和 VARBINARY 类型类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字节字符串
- BINARY 类型的长度是固定的,指定长度之后,不足最大长度的,将在它们右边填充 ‘\0’ 以补齐指定长度
- VARBINARY 类型的长度是可变的,指定长度之后,其长度可以在 0 到最大值之间
mysql> create table t4
-> (
-> a binary(3), # 定义固定长度为3的BINARY类型
-> vb varbinary(30) # 定义可变长度为30的VARBINARY类型
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> insert into t4 values(5,5);
Query OK, 1 row affected (0.01 sec)
mysql> select * from t4;
+------+------+
| a | vb |
+------+------+
| 5 | 5 |
+------+------+
1 row in set (0.00 sec)
mysql> select length(a),length(vb) from t4;
+-----------+------------+
| length(a) | length(vb) |
+-----------+------------+ # BINARY占用的空间为固定的指定的值
| 3 | 1 | # VARBINARY占用的空间为可变的插入的值
+-----------+------------+
1 row in set (0.00 sec)
blob
- BLOB 用来存储可变数量的二进制字符串,分为 TINYBLOB 、BLOB 、MEDIUMBLOB 、LONGBLOB 四种类型
- BLOB 存储的是二进制字符串,TEXT 存储的是文本字符串
- BLOB 没有字符集,并且排序和比较基于列值字节的数值;TEXT 有一个字符集,并且根据字符集对值进行排序和比较 数据类型 |存储范围| —|---|—| TINYBLOB |最大长度为255 BLOB |最大长度为65535MEDIUMBLOB| 最大长度为16777215 LONGBLOB |最大长度为4294967295
二、运算符
1.算数运算符
运算符 | 描述 |
---|---|
+ | 加法运算 |
- | 减法运算 |
* | 乘法运算 |
/ | 除法运算,返回商 |
% | 求余运算,返回余数 |
- 在除法运算和模运算中,如果除数为0,将是非法除法,返回结果为NULL!
mysql> create table t1 (num int);
Query OK, 0 rows affected (0.13 sec)
mysql> insert into t1 values(90);
Query OK, 1 row affected (0.16 sec)
mysql> select num , num+10,num-3,num*3,num/3,num%3 from t1;
+------+--------+-------+-------+---------+-------+
| num | num+10 | num-3 | num*3 | num/3 | num%3 |
+------+--------+-------+-------+---------+-------+
| 100 | 110 | 97 | 300 | 33.3333 | 1 |
+------+--------+-------+-------+---------+-------+
1 row in set (0.01 sec)
2.比较运算符
- select 语句中的条件语句经常要使用比较运算符。通过这些比较运算符,可以判断表中的哪些记录是符合条件的,比较结果为真,则返回1,为假则返回0,比较结果不确定则返回NULL。
运算符 | 描述 |
---|---|
= | 等于 |
<=> | 安全的等于 |
<> | 不等于或者!= |
<= | 小于等于 |
>= | 大于等于 |
> | 大于 |
IS NULL | 检验一个值是否为 NULL |
IS NOT NULL | 检验一个值是否不为 NULL |
LEAST | 当有两个或多个参数时,返回最小值 |
GREATEST | 当有两个或多个参数时,返回最大值 |
BETWEEN AND | 判断一个值是否落在两个值之间 |
IS BULL | 与 IS NULL作用相同 |
IN | 判断一个值是否是 IN 列表中的任意一个值 |
NOT IN | 判断一个值是否不是 IN 列表中的任意一个值 |
LIKE | 通配匹配 |
REGEXP | 正则表达式匹配 |
2.1 =
- 等于运算符用来判断数字、字符串和表达式是否相等,如果相等,则返回值为 1 ,否则返回值为 0 ,如果有一个值是 NULL ,则比较结果为 NULL
mysql> select 1=0, '2'=2, (1+3)=(2+2), null=null;
+-----+-------+-------------+-----------+
| 1=0 | '2'=2 | (1+3)=(2+2) | null=null |
+-----+-------+-------------+-----------+
| 0 | 1 | 1 | NULL |
+-----+-------+-------------+-----------+
1 row in set (0.00 sec)
2.2 <=>
- 和等于运算符(=)的作用一致,只不过多了一个功能,就是可以判断 NULL 值
mysql> select 1<=>0, '2'<=>2,(1+3)<=>(2+2),null<=>null;
+-------+---------+---------------+-------------+
| 1<=>0 | '2'<=>2 | (1+3)<=>(2+2) | null<=>null |
+-------+---------+---------------+-------------+
| 0 | 1 | 1 | 1 |
+-------+---------+---------------+-------------+
1 row in set (0.01 sec)
2.3 <> 和 !=
- 不等于运算符用于判断数字、字符串、表达式是否不相等,如果不相等则返回 1,否则返回 0 ,但是不能判断NULL 值
mysql> select 'good'<>'god' ,1<>2, 4!=4, 5.5!=5, null<>null;
+---------------+------+------+--------+------------+
| 'good'<>'god' | 1<>2 | 4!=4 | 5.5!=5 | null<>null |
+---------------+------+------+--------+------------+
| 1 | 1 | 0 | 1 | NULL |
+---------------+------+------+--------+------------+
1 row in set (0.00 sec)
2.4 IS NULL 、IS NOT NULL
- IS BULL是检验一个值是否为 NULL ,如果为 NULL ,返回值为 1,否则返回值为 0
- IS NOT NULL 是检验一个值是否不为 NULL ,如果不为 NULL ,返回值为 1,否则返回值为 0
mysql> select null is null ,isnull(null), isnull(10), 10 is not null;
+--------------+--------------+------------+----------------+
| null is null | isnull(null) | isnull(10) | 10 is not null |
+--------------+--------------+------------+----------------+
| 1 | 1 | 0 | 1 |
+--------------+--------------+------------+----------------+
1 row in set (0.00 sec)
2.5 BETWEEN AND
mysql> select 4 between 2 and 5 , 4 between 4 and 6, 12 between 9 and 10 ;
+-------------------+-------------------+---------------------+
| 4 between 2 and 5 | 4 between 4 and 6 | 12 between 9 and 10 |
+-------------------+-------------------+---------------------+
| 1 | 1 | 0 |
+-------------------+-------------------+---------------------+
1 row in set (0.00 sec)
2.6 LEAST 、GREATEST
- LEAST :当有两个或多个参数时,返回最小值,如果有一个值是 NULL ,则返回结果为 NULL
- GREATEST :当有两个或多个参数时,返回最大值,如果有一个值是 NULL ,则返回结果为 NULL
mysql> select least (2,0), least('a','c','b'), least(10, null), greatest(2,0), greatest(10,null);
+-------------+--------------------+-----------------+---------------+-------------------+
| least (2,0) | least('a','c','b') | least(10, null) | greatest(2,0) | greatest(10,null) |
+-------------+--------------------+-----------------+---------------+-------------------+
| 0 | a | NULL | 2 | NULL |
+-------------+--------------------+-----------------+---------------+-------------------+
1 row in set (0.00 sec)
2.7 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)
2.8 LIKE
- LIKE 运算符用来匹配字符串,如果匹配则返回 1,如果不匹配则返回 0
- LIKE 使用两种通配符:’%’ 用于匹配任何数目的字符,包括零字符 ; ‘_’ 只能匹配一个字符
mysql> select 'stud' like 'stu_', 'stud' like 's___', 'stud' like '%d';
+--------------------+--------------------+------------------+
| 'stud' like 'stu_' | 'stud' like 's___' | 'stud' like '%d' |
+--------------------+--------------------+------------------+
| 1 | 1 | 1 |
+--------------------+--------------------+------------------+
1 row in set (0.00 sec)
2.9 REGEXP
-
REGEXP 运算符用来匹配字符串,如果匹配则返回 1,如果不匹配则返回 0
-
REGEXP 使用几种通配符:
- ‘^’ 用于匹配以什么开头的字符串
- ‘$’ 用于匹配以什么结尾的字符串
- ‘.’ 用于匹配任何一个单字符串
- ‘[…]’ 用于匹配在方括号内的任何字符
- ‘*’ 用于匹配零个或多个在它前面的字符
mysql> select 'ssky' regexp '^s', 'ssky' regexp 'y$', 'ssky' regexp '.sky', 'ssky' regexp '[ab]';
+--------------------+--------------------+----------------------+----------------------+
| 'ssky' regexp '^s' | 'ssky' regexp 'y$' | 'ssky' regexp '.sky' | 'ssky' regexp '[ab]' |
+--------------------+--------------------+----------------------+----------------------+
| 1 | 1 | 1 | 0 |
+--------------------+--------------------+----------------------+----------------------+
1 row in set (0.00 sec)
3.逻辑运算符
- 逻辑运算符用来判断表达式的真假。如果表达式是真,结果返回 1。如果表达式是假,结果返回 0!
运算符 | 含义 |
---|---|
NOT或! | 逻辑非 |
AND或&& | 逻辑与 |
OR或II | 逻辑或 |
XOR | 逻辑异或 |
3.1 逻辑非 ( NOT 或 !)
- 当操作数为 0 时,所得值为 1
- 当操作数为非 0 时,所得值为 0
- 当操作数为 NULL 时,所得值为 NULL
mysql> select not 10, !10 , not (1-1) , !(1-1),not 1+1, not null;
+--------+-----+-----------+--------+---------+----------+
| not 10 | !10 | not (1-1) | !(1-1) | not 1+1 | not null |
+--------+-----+-----------+--------+---------+----------+
| 0 | 0 | 1 | 1 | 0 | NULL |
+--------+-----+-----------+--------+---------+----------+
1 row in set (0.00 sec)
3.2 逻辑与 ( AND 或 && )
- 当所有操作数均为非零值、并且不为 NULL 时,所得值为 1
- 当一个或多个操作数为 0 时,所得值为 0
- 其余情况所得值为 NULL
mysql> select 1 and -1 ,1 && 0, 0 and null, 1 && null;
+----------+--------+------------+-----------+
| 1 and -1 | 1 && 0 | 0 and null | 1 && null |
+----------+--------+------------+-----------+
| 1 | 0 | 0 | NULL |
+----------+--------+------------+-----------+
1 row in set (0.00 sec)
3.3 逻辑或 ( OR 或 || )
- 当两个操作数均为非 NULL 值,且任意一个操作数为非零值时,结果为 1 ,否则为 0
- 当有一个操作数为 NULL ,且另一个操作数为非零值时,则结果为 1 ,否则结果为 NULL
- 当两个操作数均为 NULL 时,则所得结果为 NULL
mysql> select 1 or -1 or 0 , 1 || 2 , 0 or null , null || null;
+--------------+--------+-----------+--------------+
| 1 or -1 or 0 | 1 || 2 | 0 or null | null || null |
+--------------+--------+-----------+--------------+
| 1 | 1 | NULL | NULL |
+--------------+--------+-----------+--------------+
1 row in set (0.00 sec)
3.4 逻辑异或 ( 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, 0 xor 0 , 1 xor 0 , 1 xor null ,1 xor 1 xor 1;
+---------+---------+---------+------------+---------------+
| 1 xor 1 | 0 xor 0 | 1 xor 0 | 1 xor null | 1 xor 1 xor 1 |
+---------+---------+---------+------------+---------------+
| 0 | 0 | 1 | NULL | 1 |
+---------+---------+---------+------------+---------------+
1 row in set (0.00 sec)
4.位运算符
运算符 | 含义 |
---|---|
| | 位或 |
& | 位与 |
^ | 位异或 |
<< | 位左移 |
>> | 位右移 |
~ | 位取反 |
4.1 位或运算符 ( | )
- 对应的二进制位有一个或两个为 1 ,则该位的运算结果为 1 ,否则为 0
mysql> select 10 | 15 , 9 | 4 | 2 ;
+---------+-----------+
| 10 | 15 | 9 | 4 | 2 |
+---------+-----------+
| 15 | 15 |
+---------+-----------+
1 row in set (0.00 sec)
4.2 位与运算符 ( & )
- 对应的二进制位都为 1 ,则该位的运算结果为 1 ,否则为 0
mysql> select 10 & 15 , 9 & 4 & 2 ;
+---------+-----------+
| 10 & 15 | 9 & 4 & 2 |
+---------+-----------+
| 10 | 0 |
+---------+-----------+
1 row in set (0.00 sec)
4.3 位异或运算符 ( ^ )
- 对应的二进制位不相同时,结果为 1 ,否则为 0
mysql> select 10 ^ 15 , 1 ^ 0, 1^1;
+---------+-------+-----+
| 10 ^ 15 | 1 ^ 0 | 1^1 |
+---------+-------+-----+
| 5 | 1 | 0 |
+---------+-------+-----+
1 row in set (0.00 sec)
4.4 位左移运算符 ( << )
- 指定的二进制位都左移指定的位数,左移指定位之后,左边高位的数值将被移出并丢弃,右边低位空出的位置用 0 补齐
mysql> select 1<<2 , 4<<2;
+------+------+
| 1<<2 | 4<<2 |
+------+------+
| 4 | 16 |
+------+------+
1 row in set (0.00 sec)
4.5 位右移运算符 ( >> )
- 指定的二进制位都右移指定的位数,右移指定位之后,右边低位的数值将被移出并丢弃,左边高位空出的职位用 0 补齐
mysql> select 1>>1 ,16>>2;
+------+-------+
| 1>>1 | 16>>2 |
+------+-------+
| 0 | 4 |
+------+-------+
1 row in set (0.00 sec)
4.6 位取反运算符(~)
- 将对应的二进制数逐位反转,即 1 取反后变 0 ,0 取反后变 1
mysql> select 5 & ~1;
+--------+
| 5 & ~1 |
+--------+
| 4 |
+--------+
1 row in set (0.00 sec)
关于上述的返回值解释:SQL语句是将5和进行位取反的数字1进行位与运算(&),位于运算的原则是对应的二进制位都位1,则该位为1,否则为0,5的二进制数为0101,1的二进制数为0001,1进行位取反后的值就是1110,那么0101和1110进行位与运算的结果就是0100,也就是4!
5.运算符优先级
- 最低优先级为:”:=”;最高优先级为: !、BINARY、 COLLATE。**
优先级顺序 | 运算符 |
---|---|
1 | := |
2 | ||、OR、XOR |
3 | &&、AND |
4 | NOT |
5 | BETWEEN、CASE、WHEN、THEN、ELSE |
6 | =、<=>、>=、>、 < 、<> 、!= 、IS 、LIKE 、REGEXP 、IN |
7 | | |
8 | & |
9 | <<、>> |
10 | -、+ |
11 | *、/、DIV、 %、MOD |
12 | ^ |
13 | -(一元减号)、~(一元比特翻转) |
14 | ! |