mysql数据类型之四逻辑型_第四章 MySQL数据类型和运算符

5.1 MySQL数据类型介绍

一、数据类型简介

(1) 数据表由多列字段构成,每一个字段指定了不同的数据类型,指定了数据类型之后,也就决定了向字段插入的数据内容

(2) 不同的数据类型也决定了MySQL在存储它们的时候使用的方式,以及在使用它们的时候选择什么运算符号进行运算

(3) 数值数据类型:TINYINT、SMALINT、MEDIUMINT、INT、BIGINT、FLOAT、DOUBLE、DECIMAL

(4) 日期/时间类型:YEAR、TIME、DATE、DATETIME、TIMESTAMP

(5) 字符串类型:CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM、SET

一、数值类型简介

(1) 数值类型主要用来存储数字,不同的数值类型提供不同的取值范围,可以存储的值范围越大,所需要的存储空间也越大

(2) 数值类型分为:①整数类型②浮点数类型③定点数类型

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

2、浮点数类型和定点数类型

(1) MySQL 中使用浮点数和定点数来表示小数,浮点数有两种类型:单精度浮点数(FLOAT)和双精度浮点数(DOUBLE),定点数只有DECIMAL

(2) 浮点数和定点数都可以用(M,N)来表示,其中M是精度,表示总共的位数,N是标度,表示小数的位数

(3) DECIMAL 实际是以字符串形式存放的,在对精度要求比较高的时候(如货币、科学数据等)使用DECIMAL类型会比较好

(4) 浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围,它的缺点是会引起精度问题

类型名称 说明 存储需求 有符号的取值范围 无符号的取值范围

FLOAT 单精度浮点数 4个字节 -3.402823466EE+38 ~ -1.175494251E-38 0 和1.175494351E-308 ~ 3.402823466EE+38

DOUBLE 双精度浮点数 8个字节 -1.7976931348623157E+308 ~ -2.2250738585072014E-308 0 和2.2250738585072014E-308 ~ 1.7976931348623157E+308

DECIMAL 压缩的"严格"定点数 M+2个字节  不固定 不固定

MySQL 日期/时间类型

(1) MySQL 有多种表示日期的数据类型,比如,当只记录年信息的时候,可以使用YEAR类型,而没有必要使用DATE类型

(2) 每一个类型都有合法的取值范围,当指定确实不合法的值时系统将"零"值插入到数据库中

类型名称 日期格式 日期范围 存储需求

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-DD HH:MM:SS 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 8字节

TIMESTAMP YYYY-MM-DD HH:MM:SS 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC 4字节

1、YEAR

(1) 格式:以4位字符串格式表示的YEAR,范围为'1901' ~ '2155'

(2) 格式:以4位数字格式表示的YEAR,范围为1901 ~ 2155

(3) 格式:以2位字符串格式表示的YEAR,范围为'00' ~ '99',其中,'00' ~ '69'被转换为2000 ~ 2069,'70' ~ '99'被转换为1970 ~ 1999

(4) 格式:以2位数字格式表示的YEAR,范围为1 ~ 99,其中,1 ~ 69被转换为2001 ~ 2069,70 ~ 99被转换为1970 ~ 1999

2、TIME

(1) TIME 类型的格式为HH:MM:SS,HH表示小时,MM表示分钟,SS表示秒

(2) 格式:以'HHMMSS'格式表示的TIME,例如'101112'被理解为10:11:12,但如果插入不合法的时间,如'109712',则被存储为00:00:00

(3) 格式:以'D HH:MM:SS'字符串格式表示的TIME,其中D表示日,可以取0 ~ 34之间的值,在插入数据库的时候D会被转换成小时,如'2 10:10'在数据库中表示为58:10:00,即2x24+10 = 58

3、DATE

(1) DATE 类型的格式为YYYY-MM-DD,其中,YYYY表示年,MM表示月,DD表示日

(2) 格式:'YYYY-MM-DD'或'YYYYMMDD',取值范围为'1000-01-01' ~ '9999-12-3'

(3) 格式:'YY-MM-DD'或'YYMMDD',这里YY表示两位的年值,范围为'00' ~ '99',其中,'00' ~ '69'被转换为2000 ~ 2069,'70' ~ '99'被转换为1970 ~ 1999

(4) 格式:YY-MM-DD或YYMMDD,数字格式表示的日期,其中YY范围为00 ~ 99,其中,00 ~ 69被转换为2000 ~ 2069,70 ~ 99被转换为1970 ~ 1999

4、DATETIME

(1) DATETIME 类型的格式为YYYY-MM-DD HH:MM:SS,其中,YYYY表示年,MM表示月,DD表示日,HH表示小时,MM表示分钟,SS表示秒

(2) 格式:'YYYY-MM-DD HH:MM:SS'或'YYYYMMDDHHMMSS',字符串格式,取值范围为'1000-01-01 00:00:00' ~ '9999-12-31 23:59:59'

(3) 格式:'YY-MM-DD HH:MM:SS'或'YYMMDDHHMMSS',字符串格式,其中YY范围为'00' ~ '99',其中,'00' ~ '69'被转换为2000 ~ 2069,'70' ~ '99'被转换为1970 ~ 1999

(4) 格式:YYYYMMDDHHMMSS或YYMMDDHHMMSS,数字格式,取值范围同上

5、TIMESTAMP

(1) TIMESTAMP 类型的格式为YYYY-MM-DD HH:MM:SS,显示宽度固定在19个字符

(2) TIMESTAMP 与DATETIME的区别在于,TIMESTAMP的取值范围小于DATETIME的取值范围

(3) TIMESTAMP 的取值范围为1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC,其中UTC是世界标准时间,存储时会对当前时区进行转换,检索时再转换回当前时区

二、字符串类型

(1) 字符串类型用来存储字符串数据,还可以存储比如图片和声音的二进制数据

(2) MySQL 支持两种字符串类型:文本字符串和二进制字符串

文本字符串类型 说明 存储需求

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

MEDIUMTEXT 中等大小的文本字符串 L+3 字节,在此L < 2^24

LONGTEXT 大的文本字符串 L+4 字节,在此L < 2^32

ENUM 枚举类型,只能有一个枚举字符串值 1 或2个字节,取决于枚举值的数目(最大值65535)

SET 一个设置,字符串对象可以有零个或多个SET成员 1, 2, 3, 4 或8个字节,取决于集合成员的数量(最多64个成员)

二进制字符串类型 说明 存储需求

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

MEIDUMBLOB(M) 中等大小的BLOB L+3 字节,在此L < 2^24

LONGBLOB(M) 非常大的BLOB L+4 字节,在此L < 2^32

1、CHAR和VARCHAR

(1) CHAR(M) 为固定长度的字符串,在定义时指定字符串列长,当保存时在右侧填充空格以达到指定的长度,M表示列长度,取值范围是0~255个字符,例如,CHAR(4)定义了一个固定长度的字符串列,其包含的字符个数最大为4,当检索到CHAR值时,尾部的空格将被删掉

(2) VARCHAR(M) 为可变长度的字符串,M表示最大列长度,取值范围是0~65535,VARCHAR的最大实际长度由最长的行的大小和使用的字符集确定,而其实际占用的空间为字符串的实际长度加一(一个字符串结束符)

插入值 CHAR(4) 存储需求 VARCHAR(4) 存储需求

'' '    ' 4个字节 ' 1个字节

'ab' 'ab  ' 4个字节 'ab' 3个字节

'abc' 'abc' 4个字节 'abc' 4个字节

'abcd' 'abcd' 4个字节 'abcd' 5个字节

'abcde' 'abcd' 4个字节 'abcd' 5个字节

2、TEXT

(1) TINYTEXT 最大长度为255个字符

(2) TEXT 最大长度为65536个字符

(3) MEDIUMTEXT 最大长度为16777215个字符

(4) LONGTEXT 最大长度为4294967295个字符

3、ENUM

(1) 在基本的数据类型中,无外乎就是些数字和字符,但是某些事物是较难用数字和字符来准确地表示的。比如一周有七天,分别是Sunday、Monday、Tuesday、Wednesday、Thursday、Friday和Saturday。如果我们用整数0、1、2、3、4、5、6来表示这七天,那么多下来的那些整数该怎么办?而且这样的设置很容易让数据出错,即取值超出范围。我们能否自创一个数据类型,而数据的取值范围就是这七天呢?因此有了ENUM类型(Enumeration,枚举),它允许用户自己来定义一种数据类型,并且列出该数据类型的取值范围。ENUM是一个字符串对象,其值为表创建时在列规定中枚举(即列举)的一列值,语法格式为:字段名ENUM('值1','值2',..... '值n')   字段名指将要定义的字段,值n指枚举列表中的第n个值,ENUM类型的字段在取值时,只能在指定的枚举列表中取,而且一次只能取一个。如果创建的成员中有空格时,其尾部的空格将自动删除。ENUM值在内部用整数表示,每个枚举值均有一个索引值:列表值所允许的成员值从1开始编号,MySQL存储的就是这个索引编号。枚举最多可以有65535个元素。

mysql> CREATE TABLE tmp10

-> (

-> soc INT,

-> level ENUM('excellent', 'good', 'bad')                          # 自定义枚举值

-> );

mysql> INSERT INTO tmp10 values (70,'good'), (90,1), (75,2), (50,3) ;  # 插入数据,后面三个是根据索引来插入的

mysql> INSERT INTO tmp10 values (100,'best') ;                         # 如果插入一个没有定义过的枚举值'best'会报错

ERROR 1265 (01000): Data truncated for column 'level' at row 1

mysql> SELECT * FROM tmp10;

+------+-----------+

| soc  |   level   |

+------+-----------+

| 70   | good      |

| 90   | excellent |

| 75   | good      |

| 50   | bad       |

+------+-----------+

4、SET

(1) SET 是一个字符串对象,可以有零个或多个值,SET列最多可以有64个成员,其值为表创建时规定的一列值,语法:SET('值1','值2',...... '值n')

(2) 与ENUM类型相同,SET值在内部用整数表示,列表中每一个值都有一个索引编号

(3) 与ENUM类型不同的是,ENUM类型的字段只能从定义的列值中选择一个值插入,而SET类型的列可从定义的列值中选择多个字符的联合

(4) 如果插入SET字段中列值有重复,则MySQL自动删除重复的值,插入SET字段的值的顺序并不重要,MySQL会在存入数据库时,按照定义的顺序显示

mysql> CREATE TABLE tmp11 ( s SET('a', 'b', 'c', 'd') );        # 自定义SET字段的值

mysql> INSERT INTO tmp11 values ('a'), ('a,b,a'), ('c,a,d') ;   # 只能插入自定义的SET字段的值

mysql> INSERT INTO tmp11 values ('a,x,b,y');                    # 如果插入的不是自定义的值会报错

ERROR 1265 (01000): Data truncated for column 's' at row 1

mysql> SELECT * FROM tmp11;

+-------+

| s     |

+-------+

| a     |

| a,b   |

| a,c,d |

+-------+

5、BIT

(1) BIT 数据类型用来保存位字段值,即以二进制的形式来保存数据,如保存数据13,则实际保存的是13的二进制值,即1101

(2) BIT 是位字段类型,BIT(M)中的M表示每个值的位数,范围为1~64,如果M被省略,则默认为1,如果为BIT(M)列分配的值的长度小于M位,则在值得左边用0填充

(3) 如果需要位数至少为4位的BIT类型,即可定义为BIT(4),则大于1111的数据是不能被插入的

mysql> CREATE TABLE tmp12( b BIT(4) ) ;

mysql> INSERT INTO tmp12 VALUES (2), (9), (15) ;

mysql> SELECT BIN(b+0) FROM tmp12;

+----------+

| BIN(b+0) |

+----------+

| 10       |

| 1001     |

| 1111     |

+----------+

6、BINARY和VARBINARY

(1) BINARY 和VARBINARY类型类似于CHAR和VARCHAR,不同的是它们包含二进制字节字符串

(2) BINARY 类型的长度是固定的,指定长度之后,不足最大长度的,将在它们右边填充'\0'以补齐指定长度

(3) VARBINARY 类型的长度是可变的,指定长度之后,其长度可以在0到最大值之间

mysql> CREATE TABLE tmp13

-> (

-> b BINARY(3),       # 定义固定长度为3的BINARY类型

-> vb VARBINARY(30)   # 定义可变长度为30的VARBINARY类型

-> );

mysql> INSERT INTO tmp13 VALUES(5,5);

mysql> SELECT * FROM tmp13;

+------+------+

| b    | vb   |

+------+------+

| 5    | 5    |

+------+------+

mysql> SELECT length(b), length(vb) FROM tmp13;

+-----------+------------+

| length(b) | length(vb) |

+-----------+------------+    # BINARY占用的空间为固定的指定的值

| 3         | 1          |    # VARBINARY占用的空间为可变的插入的值

+-----------+------------+

7、BLOB

(1) BLOB 用来存储可变数量的二进制字符串,分为TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB四种类型

(2) BLOB 存储的是二进制字符串,TEXT存储的是文本字符串

(3) BLOB 没有字符集,并且排序和比较基于列值字节的数值;TEXT有一个字符集,并且根据字符集对值进行排序和比较

数据类型 存储范围

TINYBLOB 最大长度为255

BLOB 最大长度为65535

MEDIUMBLOB 最大长度为16777215

LONGBLOB 最大长度为4294967295

三、运算符介绍

1、MySQL算术运算符

(1) + :加法运算

(2) - :减法运算

(3) * :乘法运算

(4) / :除法运算,返回商

(5) % :求余运算,返回余数

mysql> CREATE TABLE tmp14 ( num INT ) ;

mysql> INSERT INTO tmp14 VALUE(64);

mysql> SELECT num, num+10, num-3, num*3, num/3, num%3 FROM tmp14;

+------+--------+-------+-------+---------+-------+

| num  | num+10 | num-3 | num*3 | num/3   | num%3 |

+------+--------+-------+-------+---------+-------+

| 64   | 74     | 61    | 192   | 21.3333 | 1     |

+------+--------+-------+-------+---------+-------+

运算符 作用

= 等于

<=> 安全的等于

<> 不等于,也可写成 !=

<= 小于等于

>= 大于等于

> 小于

IS  NULL 判断一个值是否为NULL

IS  NOT  NULL 判断一个值是否不为NULL

LEAST 当有两个或多个参数时,返回最小值

GREATEST 当有两个或多个参数时,返回最大值

BETWEEN  AND 判断一个值是否落在两个值之间

ISNULL 与 IS  NULL 作用相同

IN 判断一个值是否是 IN 列表中的任意一个值

NOT  IN 判断一个值是否不是 IN 列表中的任意一个值

LIKE 通配符匹配

REGEXP 正则表达式匹配

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      |

+-----+-------+-------------+-----------+

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           |

+-------+---------+---------------+-------------+

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       |

+---------------+------+------+--------+------------+

4、IS  NULL、ISNULL、IS  NOT  NULL

(1) IS  NULL 和ISNULL检验一个值是否为NULL,如果为NULL,返回值为1,否则返回值为0

(2) 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              |

+--------------+--------------+------------+----------------+

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                   |

+-------------------+-------------------+---------------------+

6、LEAST、GREATEST

(1) LEAST :当有两个或多个参数时,返回最小值,如果有一个值是NULL,则返回结果为NULL

(2) 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              |

+------------+--------------------+----------------+---------------+-------------------+

7、IN、NOT  IN

(1) IN :判断一个值是否是IN列表中的任意一个值

(2) 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                |

+--------------+------------------+

8、LIKE

(1) LIKE 运算符用来匹配字符串,如果匹配则返回1,如果不匹配则返回0

(2) LIKE 使用两种通配符:'%'用于匹配任何数目的字符,包括零字符 ;'_'只能匹配一个字符

mysql> SELECT 'stud' LIKE 'stu_', 'stud' LIKE 's___', 'stud' LIKE '%d' ;

+--------------------+--------------------+------------------+

| 'stud' LIKE 'stu_' | 'stud' LIKE 's___' | 'stud' LIKE '%d' |

+--------------------+--------------------+------------------+

| 1                  | 1                  | 1                |

+--------------------+--------------------+------------------+

9、REGEXP

(1) REGEXP 运算符用来匹配字符串,如果匹配则返回1,如果不匹配则返回0

(2) 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                    |

+--------------------+--------------------+----------------------+----------------------+

四、MySQL逻辑运算符

运算符 作用

NOT 或 ! 逻辑非

AND 或&& 逻辑与

OR 或|| 逻辑或

XOR 逻辑异或

1、逻辑非( NOT或 !)

(1) 当操作数为0时,所得值为1

(2) 当操作数为非0时,所得值为0

(3) 当操作数为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     |

+--------+-----+-----------+--------+---------+----------+

2、逻辑与( AND或&& )

(1) 当所有操作数均为非零值、并且不为NULL时,所得值为1

(2) 当一个或多个操作数为0时,所得值为0

(3) 其余情况所得值为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      |

+----------+--------+------------+-----------+

3、逻辑或( OR或|| )

(1) 当两个操作数均为非NULL值,且任意一个操作数为非零值时,结果为1,否则为0

(2) 当有一个操作数为NULL,且另一个操作数为非零值时,则结果为1,否则结果为NULL

(3) 当两个操作数均为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         |

+--------------+--------+-----------+--------------+

4、逻辑异或 ( XOR )

(1) a XOR b 的计算等同于( a AND (NOT b) )或( (NOT a) AND b )

(2) 当任意一个操作数为NULL时,返回值为NULL

(3) 对于非NULL的操作数,如果两个操作数都是非0值或者都是0值,则返回结果为0

(4) 如果一个为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、位或运算符( | ):对应的二进制位有一个或两个为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        |

+---------+-----------+

2、位与运算符( & ):对应的二进制位都为1,则该位的运算结果为1,否则为0

mysql> SELECT 10 & 15 , 9 & 4 & 2 ;

+---------+-----------+

| 10 & 15 | 9 & 4 & 2 |

+---------+-----------+

| 10      | 0         |

+---------+-----------+

3、位异或运算符( ^ ):对应的二进制位不相同时,结果为1,否则为0

mysql> SELECT 10 ^ 15 , 1 ^ 0 , 1 ^ 1 ;

+---------+-------+-------+

| 10 ^ 15 | 1 ^ 0 | 1 ^ 1 |

+---------+-------+-------+

| 5       | 1     | 0     |

+---------+-------+-------+

4、位左移运算符( << ):使指定的二进制位都左移指定的位数,左移指定位之后,左边高位的数值将被移出并丢弃,右边低位空出的位置用0补齐

mysql> SELECT 1<<2 , 4<<2 ;

+------+------+

| 1<<2 | 4<<2 |    # 1的二进制值为00000001,左移两位之后变成00000100,即十进制数4

+------+------+    # 4的二进制值为00000100,左移两位之后变成00010000,即十进制数16

| 4    | 16   |

+------+------+

5、位右移运算符( >> ):使指定的二进制位都右移指定的位数,右移指定位之后,右边低位的数值将被移出并丢弃,左边高位空出的职位用0补齐

mysql> SELECT 1>>1 , 16>>2 ;

+------+-------+

| 1>>1 | 16>>2 |

+------+-------+

| 0    | 4     |

+------+-------+

6、位取反运算符( ~ ):将对应的二进制数逐位反转,即1取反后变0,0取反后变1

mysql> SELECT 5 & ~1 ;

+--------+

| 5 & ~1 |

+--------+

| 4      |

+--------+

优先级

最低:=

|| or

XOR

&& AND

NOT

BETWEEN

= <=> >= <> <= <  > != IS LIKE IN REGEXP

|

&

<< >>

- +

* / %

-(负号) ~(位取反)

!

企业级使用的数据库

perconc   tengine

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值