MySQL学习笔记(5)——MySQL中的数据类型和运算

5. 数据类型和运算符

5.1 MySQL 数据类型介绍

5.1.1 整数类型

数值型数据类型主要用来存储数字,MySQL提供了多种数值数据类型,不同的数据类型提供不同的取值范围,可以存储的值范围越大,其所需要的存储空间也会越大。MySQL主要提供的整数类型有TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)、BIGINT。整数类型的属性字段可以添加AUTO_INCREMENT自增约束条件。表5.1列出了MySQL中的数值类型。
在这里插入图片描述
在这里插入图片描述

显示宽度只用于显示,并不能限制取值范围和占用空间。例如:INT(3)会占用4字节的存储空间,并且允许的最大值不会是999,而是INT整型所允许的最大值。

5.1.2 浮点数类型和定点数类型

MySQL中使用浮点数和定点数来表示小数。浮点数类型有两种:单精度浮点类型(FLOAT)和双精度浮点类型(DOUBLE)。定点数类型只有一种:DECIMAL。浮点数类型和定点数类型都可以用(M,N)来表示。其中,M称为精度,表示总共的位数;N称为标度,表示小数的位数。
在这里插入图片描述DECIMAL类型不同于FLOAT和DOUBLE,DECIMAL实际是以串存放的,可能的最大取值范围与DOUBLE一样,但是其有效的取值范围由M和D的值决定。如果改变M而固定D,则其取值范围将随M的变大而变大。从表5.3可以看到,DECIMAL的存储空间并不是固定的,而由其精度值M决定的,占用M+2字节。
FLOAT和DOUBLE在不指定精度时,默认会按照实际的精度(由计算机硬件和操作系统决定),DECIMAL若不指定精度则默认为(10,0)。

不论是定点数还是浮点数类型,如果用户指定的精度超出精度范围,则会四舍五入。

创建表tmp2,其中字段x、y、z的数据类型依次为FLOAT(5,1)、DOUBLE(5,1)和DECIMAL(5,1),向表中插入数据5.12、5.15和5.123,SQL语句如下:

create table tmp2 (x float(5,1), y double (5,1), z decimal(5,1));

在这里插入图片描述

insert into tmp2 values(5.12,5.15, 5.123);

在这里插入图片描述

select *from tmp2;

在这里插入图片描述

5.1.3 日期与时间类型

MySQL中有多种表示日期的数据类型,主要有DATETIME、DATE、TIMESTAMP、TIME和YEAR。例如,当只记录年信息的时候,可以只使用YEAR类型,而没有必要使用DATE。每一个类型都有合法的取值范围,当指定确实不合法的值时系统将“零”值插入到数据库中
在这里插入图片描述

Year

(1)以4位字符串或者4位数字格式表示的YEAR,范围为‘1901’~‘2155’。输入格式为‘YYYY’或者YYYY。例如,输入‘2010’或2010,插入到数据库的值均为2010。(2)以2位字符串格式表示的YEAR,范围为‘00’到‘99’。‘00’~‘69’和‘70’~‘99’范围的值分别被转换为2000~2069和1970~1999范围的YEAR值。‘0’与‘00’的作用相同。插入超过取值范围的值将被转换为2000。(3)以2位数字表示的YEAR,范围为1~99。1~69和70~99范围的值分别被转换为2001~2069和1970~1999范围的YEAR值。注意:在这里0值将被转换为0000,而不是2000。

【例】创建数据表tmp3,定义数据类型为YEAR的字段y,向表中插入值2010、‘2010’、‘2166’,SQL语句如下:首先创建表tmp3

create table tmp3(y year);
insert into tmp3 values(2010),('2010');
insert into tmp3 values('2166') # 超过范围,不能正差插入

在这里插入图片描述

【例】向tmp3表中y字段插入2位字符串表示的YEAR值,分别为‘0’、‘00’、‘77’和‘10’,SQL语句如下:
①删除表中的数据:

DELETE FROM tmp3;

②向表中插入数据:

INSERT INTO tmp3 VALUES ('0'),('00'),('77'),('10');

③查看结果:

SELECT*FROM tmp3;

在这里插入图片描述
【例】向tmp3表中y字段插入2位数字表示的YEAR值,分别为0、78和11,SQL语句如下

DELETE FROM tmp3; # 删除表中的数据
INSERT INTO tmp3 VALUES (0),(78),(11);# 插入数据
SELECT*FROM tmp3; #查看结果

在这里插入图片描述

TIME

DATE类型用在仅需要日期值时,没有时间部分,在存储时需要3字节。日期格式为‘YYYY-MM-DD’。其中,YYYY表示年,MM表示月,DD表示日。在给DATE类型的字段赋值时,可以使用字符串类型或者数字类型的数据插入,只要符合DATE的日期格式即可

(1)以‘YYYY-MM-DD’或者‘YYYYMMDD’字符串格式表示的日期,取值范围为‘1000-01-01’~‘9999-12-3’。例如,输入‘2012-12-31’或者‘20121231’,插入数据库的日期都为2012-12-31。
(2)以‘YY-MM-DD’或者‘YYMMDD’字符串格式表示的日期,在这里YY表示两位的年值。包含两位年值的日期会令人模糊,因为不知道世纪。MySQL使用以下规则解释两位年值:‘00~69’范围的年值转换为‘2000~2069’;‘70~99’范围的年值转换为‘1970~1999’。例如,输入‘12-12-31’,插入数据库的日期为2012-12-31;输入‘981231’,插入数据的日期为1998-12-31。
(3)以YY-MM-DD或者YYMMDD数字格式表示的日期,与前面相似,00~69范围的年值转换为2000~2069,70~99范围的年值转换为1970~1999。例如,输入12-12-31插入数据库的日期为2012-12-31;输入981231,插入数据的日期为1998-12-31。
(4)使用CURRENT_DATE或者NOW(),插入当前系统日期。

【例】创建数据表tmp5,定义数据类型为DATE的字段d,向表中插入“YYYY-MM-DD”和“YYYYMMDD”字符串格式日期,SQL语句如下:

create table tmp5(d DATE); # 创建表tmp5
insert into tmp5 values('1998-08-08'),('19980808'),('20101010'); # 向表中插入“YYYY-MM-DD”和“YYYYMMDD”格式日期:
SELECT* FROM tmp5; #查看插入结果

在这里插入图片描述
【例】向tmp5表中插入“YY-MM-DD”和“YYMMDD”字符串格式日期,SQL语句如下

delete from temp5; # 删除表中的数据
insert into tmp5 values ('99-09-09'),('990909'),('000101'),('111111'); # 向表中插入“YY-MM-DD”和“YYMMDD”格式日期
select *from tmp5; # 查看插入结果

在这里插入图片描述
【例】向tmp5表中插入系统当前日期,SQL语句如下:

delete from tmp5;# 删除表中的数据
insert into tmp5 values(CURRENT_DATE()),(NOW()); # 向表中插入系统当前日期
selete*from tmp5; # 查看插入结果

在这里插入图片描述
CURRENT_DATE只返回当前日期值,不包括时间部分;NOW()函数返回日期和时间值,在保存到数据库时,只保留了其日期部分。

MySQL允许“不严格”语法:任何标点符号都可以用作日期部分之间的间隔符。例如,‘98-11-31’、‘98.11.31’、‘98/11/31’和‘98@11@31’是等价的,这些值也可以正确地插入到数据库中。

DATATIME

DATETIME类型用于需要同时包含日期和时间信息的值,在存储时需要8字节。日期格式为‘YYYY-MM-DD HH:MM:SS’。其中,YYYY表示年,MM表示月,DD表示日,HH表示小时,MM表示分钟,SS表示秒。在给DATETIME类型的字段赋值时,可以使用字符串类型或者数字类型的数据插入,只要符合DATETIME的日期格式即可。(1)以‘YYYY-MM-DD HH:MM:SS’或者‘YYYYMMDDHHMMSS’字符串格式表示的值,取值范围为‘1000-01-0100:00:00’~‘9999-12-3 23:59:59’。例如,输入‘2012-12-31 05: 05: 05’或者‘20121231050505’,插入数据库的DATETIME值都为2012-12-31 05: 05: 05。
(2)以‘YY-MM-DD HH:MM:SS’或者‘YYMMDDHHMMSS’字符串格式表示的日期,在这里YY表示两位的年值。与前面相同,‘00~69’范围的年值转换为‘2000~2069’,‘70~99’范围的年值转换为‘1970~1999’。例如,输入‘12-12-31 05: 05: 05’,插入数据库的DATETIME为2012-12-31 05: 05:05;输入‘980505050505’,插入数据库的DATETIME为1998-05-05 05: 05: 05。
(3)以YYYYMMDDHHMMSS或者YYMMDDHHMMSS数字格式表示的日期和时间。例如,输入20121231050505,插入数据库的DATETIME为2012-12-31 05:05:05;输入981231050505,插入数据的DATETIME为1998-12-31 05: 05: 05。
【例】创建数据表tmp6,定义数据类型为DATETIME的字段dt,向表中插入“YYYY-MM-DD HH:MM:SS”和“YYYYMMDDHHMMSS”字符串格式日期和时间值,SQL语句如下

create table tmp6(dt DATETIME); #创建表tmp6
insert into tmp6 values('1998-08-08 08:08:08'),('19980808080808'),('20101010101010'); # 向表中插入“YYYY-MM-DD HH:MM:SS”和“YYYYMMDDHHMMSS”格式日期
select*from tmp6;

在这里插入图片描述
【例】

delete from tmp6;
insert into tmp6 values('99-09-09 09:09:09'),('990909090909'),('101010101010');
select*from tmp6;

在这里插入图片描述

TIMESTAMP

TIMESTAMP的显示格式与DATETIME相同,显示宽度固定在19个字符,日期格式为YYYY-MM-DDHH:MM:SS,在存储时需要4字节。TIMESTAMP列的取值范围小于DATETIME的取值范围,为‘1970-01-01 00:00:01’UTC~‘2038-01-19 03:14:07’UTC。其中,UTC(CoordinatedUniversal Time)为世界标准时间,因此在插入数据时,要保证在合法的取值范围内。

5.1.4 文本字符串类型

字符串类型用来存储字符串数据,除了可以存储字符串数据之外,还可以存储其他数据,比如图片和声音的二进制数据。MySQL支持两类字符型数据:文本字符串和二进制字符串。文本字符串可以进行区分或者不区分大小写的串比较,还可以进行模式匹配查找。在MySQL中,文本字符串类型是指CHAR、VARCHAR、TEXT、ENUM和SET。
在这里插入图片描述
VARCHAR和TEXT类型与下一小节讲到的BLOB都是变长类型,其存储需求取决于列值的实际长度(在前面的表格中用L表示),而不是取决于类型的最大可能尺寸。例如,一个VARCHAR(10)列能保存最大长度为10个字符的字符串,实际的存储需要是字符串的长度L加上1字节(记录字符串的长度)。对于字符“abcd”,L是4而存储要求是5字节。本节将介绍这些数据类型的作用以及如何在查询中使用这些类型。

char和varchar 类型

CHAR(M)为固定长度字符串,在定义时指定字符串列长。当保存时在右侧填充空格,以达到指定的长度。M表示列长度,M的范围是0255个字符。例如,CHAR(4)定义了一个固定长度的字符串列,其包含的字符个数最大为4。当检索到CHAR值时,尾部的空格将被删除。VARCHAR(M)是长度可变的字符串,M表示最大列长度。M的范围是065535。VARCHAR的最大实际长度由最长的行的大小和使用的字符集确定,而其实际占用的空间为字符串的实际长度加1。例如,VARCHAR(50)定义了一个最大长度为50的字符串,如果插入的字符串只有10个字符,则实际存储的字符串为10个字符和一个字符串结束字符。VARCHAR在值保存和检索时尾部的空格仍保留
【例】下面将不同字符串保存到CHAR(4)和VARCHAR(4)列,说明CHAR和VARCHAR之间的差别
在这里插入图片描述
对比结果可以看到,CHAR(4)定义了固定长度为4的列,不管存入的数据长度为多少,所占用的空间均为4个字节;VARCHAR(4)定义的列所占的字节数为实际长度加1。
【例】创建tmp8表,定义字段ch和vch数据类型依次为CHAR(4)、VARCHAR(4),向表中插入数据“ab ”,SQL语句如下:

create table tmp8(
ch char(4),vch varchar(4)
);
insert into tmp8 values('ab  ', 'ab  ')
select concat ('(',ch,')'), concat ('(',vch,')') from tmp8;

在这里插入图片描述
从查询结果可以看到,ch在保存“ab ”时将末尾的两个空格删除了,而vch字段保留了末尾的两个空格。

TEXT类型

TEXT列保存非二进制字符串,如文章内容、评论等。当保存或查询TEXT列的值时,不删除尾部空格。Text类型分为4种:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。不同的TEXT类型的存储空间和数据长度不同。(1)TINYTEXT最大长度为255(28–1)字符的TEXT列。(2)TEXT最大长度为65535(216–1)字符的TEXT列。(3)MEDIUMTEXT最大长度为16777215(224–1)字符的TEXT列。(4)LONGTEXT最大长度为4294967295(232–1)或4GB字符的TEXT列。

ENUM 类型

ENUM是一个字符串对象,其值为表创建时在列规定中枚举的一列值。语法格式如下:字段名 ENUM (‘值1’,‘值2’,2‘,’值3‘,....'值n')
其中,“字段名”指将要定义的字段,“值n”指枚举列表中的第n个值。ENUM类型的字段在取值时,只能在指定的枚举列表中取,而且一次只能取一个。创建的成员中有空格时,其尾部的空格将自动被删除。ENUM值在内部用整数表示,并且每个枚举值均有一个索引值:列表值所允许的成员值从1开始编号,MySQL存储的就是这个索引编号。枚举最多可以有65535个元素。
例如,定义ENUM类型的列(‘first’,‘second’,‘third’),该列可以取的值和每个值的索引
在这里插入图片描述
【例】 创建表tmp9,定义ENUM类型的列enm(‘first’,‘second’,‘third’),查看列成员的索引值,SQL语句如下

create table tmp9(enm ENUM('first','second','third'));
insert into tmp9 values('first'),('second'),('third'),(NULL); #插入各个列值
select enm,enm+0 from tmp9;

在这里插入图片描述

ENUM列总有一个默认值:如果将ENUM列声明为NULL,NULL值则为该列的一个有效值,并且默认值为NULL;如果ENUM列被声明为NOT NULL,其默认值为允许的值列表的第1个元素

【例】创建表tmp10,定义INT类型的soc字段,ENUM类型的字段level,并且列表值为(‘excellent’,‘good’, ‘bad’),向表tmp10中插入数据(70,‘good’)、(90,1)、(75,2)、(50,3)、(100,‘best’),SQL语句如下

create table tmp10(soc INT,level enum('excellent','good','bad'));
insert into tmp10 values(70,'good'),(90,1),(75,2),(50,3);
select*from tmp10;

在这里插入图片描述

SET 类型

SET是一个字符串对象,可以有零或多个值。SET列最多可以有64个成员,其值为表创建时规定的一列值。指定包括多个SET成员的SET列值时,各成员之间用逗号(,)间隔开。语法格式如下:SET('值1','值2',...'值n')
与ENUM类型相同,SET值在内部用整数表示,列表中每一个值都有一个索引编号。当创建表时,SET成员值的尾部空格将自动被删除。与ENUM类型不同的是,ENUM类型的字段只能从定义的列值中选择一个值插入,而SET类型的列可从定义的列值中选择多个字符的联合。如果插入SET字段中列值有重复,则MySQL自动删除重复的值;插入SET字段的值的顺序并不重要,MySQL会在存入数据库时按照定义的顺序显示;如果插入了不正确的值,默认情况下,MySQL将忽视这些值,并给出警告。

【例】创建表tmp11,定义SET类型的字段s,取值列表为(‘a’, ‘b’, ‘c’, ‘d’),插入数据(‘a’)、(‘a,b,a’)、(‘c,a,d’)、(‘a,x,b,y’),SQL语句如下

create table tmp11(s set('a','b','c','d'));
insert into tmp11 values('a'),('a,b,c'),('c,a,d');
select*from tmp11;

在这里插入图片描述
从结果可以看到,对于SET来说,如果插入的值为重复的,则只取一个,例如插入“a,b,a”,则结果为“a,b”;如果插入了不按顺序排列的值,则自动按顺序插入,例如插入“c,a,d”,结果为“a,c,d”;如果插入了不正确的值,那么该值将被阻止插入,例如插入值“a,x,b,y”。

二进制字符串类型

MySQL中的二进制数据类型有BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。
在这里插入图片描述

BIT类型

BIT类型是位字段类型。M表示每个值的位数,范围为1~64。如果M被省略,默认为1。如果为BIT(M)列分配的值的长度小于M位,就在值的左边用0填充。例如,为BIT(6)列分配一个值b’101’,其效果与分配b’000101’相同。BIT数据类型用来保存位字段值。例如,以二进制的形式保存数据13(13的二进制形式为1101),在这里需要位数至少为4位的BIT类型,即可以定义列类型为BIT(4),大于二进制1111的数据是不能插入BIT(4)类型的字段中的。
【例】创建表tmp12,定义BIT(4)类型的字段b,向表中插入数据2、9、15

create table tmp12(b BIT(4));
insert into tmp12 values(2),(9),(15);
select bin(b+0) from tmp12;

在这里插入图片描述

b+0表示将二进制的结果转换为对应的数字的值,BIN()函数将数字转换为二进制。从结果可以看到,成功地将3个数插入表中

BINARY 和VARBINARY类型

BINARY和VARBINARY类型类似于CHAR和VARCHAR,不同的是它们包含二进制字节字符串。其使用的语法格式如下:列名称 BINARY(M) 或者 VARBINARY(M)
BINARY类型的长度是固定的,指定长度之后,不足最大长度的,将在它们右边填充‘\0’补齐以达到指定长度。例如:指定列数据类型为BINARY(3),当插入‘a’时,存储的内容实际为“a\0\0”,当插入“ab”时,实际存储的内容为“ab\0”,不管存储的内容是否达到指定的长度,其存储空间均为指定的值M。
VARBINARY类型的长度是可变的,指定好长度之后,其长度可以在0到最大值之间。例如:指定列数据类型为VARBINARY(20),如果插入的值的长度只有10,则实际存储空间为10加1,即实际占用的空间为字符串的实际长度加1。
【例】创建表tmp13,定义BINARY(3)类型的字段b和VARBINARY(3)类型的字段vb,并向表中插入数据‘5’,比较两个字段的存储空间。

create table tmp13(
b binary(3), vb varbinary(3)
);
insert into tmp13 values(5,5);
select length(b),length(vb) from tmp13;

在这里插入图片描述

可以看到,b字段的值数据长度为3,而vb字段的数据长度仅为插入的一个字符的长度1。b字段和vb字段的长度是截然不同的,因为b字段不足的空间填充了‘\0’,而vb字段则没有填充。

BLOB 类型

BLOB是一个二进制大对象,用来存储可变数量的数据。BLOB类型分为4种:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB,它们可容纳值的最大长度不同
在这里插入图片描述
BLOB列存储的是二进制字符串(字节字符串),TEXT列存储的是非二进制字符串(字符字符串)。BLOB列没有字符集,并且排序和比较基于列值字节的数值;TEXT列有一个字符集,并且根据字符集对值进行排序和比较。

5.3 常见运算符介绍

运算符连接表达式中的各个操作数,其作用是用来指明对操作数所进行的运算。
运算符是告诉MySQL执行特定算术或逻辑操作的符号。MySQL的内部运算符很丰富,主要有四大类,分别是算术运算符、比较运算符、逻辑运算符、位运算符。

  1. 算术运算符算术运算符用于各类数值运算,包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)。
  2. 比较运算符用于比较运算,包括大于(>)、小于(<)、等于(=)、大于等于(>=)、小于等于(<=)、不等于(!=),以及IN、BETWEENAND、IS NULL、GREATEST、LEAST、LIKE、REGEXP等。
  3. 逻辑运算符的求值所得结果均为1(TRUE)、0(FALSE),这类运算符有逻辑非(NOT或者!)、逻辑与(AND或者&&)、逻辑或(OR或者||)、逻辑异或(XOR)。
  4. 位运算符参与运算的操作数按二进制位进行运算,包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)6种。

在Windows平台下,MySQL是不区分大小写的,因此字符串比较函数也不区分大小写。如果想执行区分大小写的比较,可以在字符串前面添加BINARY关键字。例如,默认情况下,‘a’=‘A’的返回结果为1,如果使用BINARY关键字,即BINARY‘a’=‘A’,则结果为0。在区分大小写的情况下,‘a’与‘A’并不相同。

5.3.1 算数运算符

在这里插入图片描述
【例:加减运算】创建表tmp14,定义数据类型为INT的字段num,插入值64,对num值进行算术运算。

create table tmp14(num int); #创建表tmp14
insert into tmp14 value(64); #向字段num插入数据64
select num,num+10,num-3+5,num+5-3,num+36.5 from tmp14; #对num值进行加法和减法运算 

在这里插入图片描述
【例: 乘除运算】对tmp14表中的num进行乘法、除法运算。

select num,num*2,num/2,num/3,num%3 from tmp14;

在这里插入图片描述
【例: 用0除num】
在数学运算时,除数为0的除法是没有意义的,因此除法运算中的除数不能为0,如果被0除,则返回结果为NULL。

select num,num/0,num%0 from tmp14;

在这里插入图片描述

5.3.2 比较运算符

一个比较运算符的结果总是1、0或者是NULL。比较运算符经常在SELECT的查询条件子句中使用,用来查询满足指定条件的记录。

在这里插入图片描述

  1. 等于运算符(=)
    等号(=)用来判断数字、字符串和表达式是否相等:如果相等,返回值为1;否则返回值为0。
    数值比较时有如下规则:
    (1)若有一个或两个参数为NULL,则比较运算的结果为NULL。
    (2)若同一个比较运算中的两个参数都是字符串,则按照字符串进行比较。
    (3)若两个参数均为整数,则按照整数进行比较。
    (4)若用字符串和数字进行相等判断,则MySQL可以自动将字符串转换为数字。

【例: ‘=’】

select 1=0,'2'=2,2=2,'0.02'=0,'b'='b',(1+3)=(2+2),NULL=NULL;

在这里插入图片描述

  1. 安全等于运算符(<=>)

这个操作符和=操作符执行相同的比较操作,不过<=>可以用来判断NULL值。在两个操作数均为NULL时,其返回值为1,而不为NULL;当一个操作数为NULL时,其返回值为0,而不为NULL。
【例:<=>】

select 1<=>0,'2'<=>2,2<=>2,'0.02'<=>0,'b'<=>'b',(1+3)<=>(2+2),NULL<=>NULL;

在这里插入图片描述

  1. 不等于运算符(<>或者!=)
    ‘<>’或者‘!=’用于判断数字、字符串、表达式不相等的判断:如果不相等,返回值为1;否则返回值为0。这两个运算符不能用于判断空值NULL。
    【例:<>】
select 'good'<>'god',1<>2,4!=4,5.5!=5,(1+3)!=(2+1),NULL<>NULL;

在这里插入图片描述

  1. 小于等于运算符(<=)
    ‘<=’用来判断左边的操作数是否小于等于右边的操作数:如果小于等于,返回值为1;否则返回值为0。‘<=’不能用于判断空值NULL。
    【例:<=】
select 'good'<='god',1<=2,4<=4,5.5<=5,(1+3)<=(2+1),NULL<=NULL;

在这里插入图片描述

  1. 小于运算符(<)
    ‘<’运算符用来判断左边的操作数是否小于右边的操作数:如果小于,返回值为1;否则返回值为0。‘<’不能用于判断空值NULL。
  2. 大于等于运算符(>=)
    ‘>=’运算符用来判断左边的操作数是否大于等于右边的操作数:如果大于等于,返回值为1;否则返回值为0。‘>=’不能用于判断空值NULL
  3. 大于运算符(>)
    ‘>’运算符用来判断左边的操作数是否大于右边的操作数:如果大于,返回值为1;否则返回值为0。‘>’不能用于判断空值NULL。
  4. IS NULL(ISNULL)和IS NOT NULL运算符
    IS NULL和ISNULL检验一个值是否为NULL:如果为NULL,返回值为1;否则返回值为0。IS NOTNULL检验一个值是否为非NULL:如果是非NULL,返回值为1;否则返回值为0。
select null is null,isnull(null),isnull(10),10 is not null;

在这里插入图片描述

  1. BETWEEN AND运算符
    语法格式为:expr BETWEEN min AND max。假如expr大于等于min且小于等于max,则BETWEEN的返回值为1,否则返回值为0。
select 4 between 2 and 5, 4 between 4 and 6, 12 between 9 and 10;

select 'x' between 'f' and 'g','b' between 'a' and 'c';

在这里插入图片描述
在这里插入图片描述

  1. LEAST运算符
    语法格式为:LEAST(值1,值2,…,值n)。其中,“值n”表示参数列表中有n个值。在有两个或多个参数的情况下,返回最小值。假如任意一个自变量为NULL,则LEAST()的返回值为NULL。
select least(2,0),least(20,3,100),least('a','b','c'),least(10,NULL);

在这里插入图片描述

  1. GREATEST (value1,value2,…)

语法格式为:GREATEST(值1,值2,…,值n)。其中,n表示参数列表中有n个值。当有两个或多个参数时,返回值为最大值。假如任意一个自变量为NULL,则GREATEST()的返回值为NULL。

  1. IN、NOT IN运算符
    IN运算符用来判断操作数是否为IN列表中的其中一个值:如果是,返回值为1;否则返回值为0。NOT IN运算符用来判断表达式是否为IN列表中的其中一个值:如果不是,返回值为1;否则返回值为0。
    【IN、NOT IN】
select 2 in (1,3,5,'thks'),'thks' in (1,3,5,'thks');
select 2 not in (1,3,5,'thks'),'thks' not in (1,3,5,'thks');

在这里插入图片描述
在这里插入图片描述
【存在NULL值时的IN查询】

select null in (1,3,5,'thks'),10 in (1,3,NULL,'thks');

在这里插入图片描述

  1. LIKE
    LIKE运算符用来匹配字符串,语法格式为:expr LIKE匹配条件。如果expr满足匹配条件,则返回值为1(TRUE);如果不匹配,则返回值为0(FALSE)。expr或匹配条件中任何一个为NULL,则结果为NULL。

(1)%,匹配任何数目的字符,甚至包括零字符。
(2)_,只能匹配一个字符。

select 'stud' like 'stud', 'stud' like 'stu_','stud' like '%d','stud' like 't_ _ _','s' like null;

在这里插入图片描述

  1. regexp
    REGEXP运算符用来匹配字符串,语法格式为:expr REGEXP匹配条件。如果expr满足匹配条件,返回1;如果不满足,则返回0。若expr或匹配条件任意一个为NULL,则结果为NULL。
    REGEXP运算符在进行匹配时,常用的有下面几种通配符:
    (1)‘^’匹配以该字符后面的字符开头的字符串。
    (2)‘$’匹配以该字符后面的字符结尾的字符串。
    (3)‘.’匹配任何一个单字符。
    (4)“[…]”匹配在方括号内的任何字符。例如,“[abc]”匹配“a”“b”或“c”。为了命名字符的范围,使用一个‘-’。“[a-z]”匹配任何字母,而“[0-9]”匹配任何数字。
    (5)‘’匹配零个或多个在它前面的字符。例如,“x”匹配任何数量‘x’字符,“[0-9]”匹配任何数量的数字,而“”匹配任何数量的任何字符。
select 'ssky' regexp '^s','ssky'regexp'y$','ssky' regexp '.sky','ssky' regexp'[ab]';

在这里插入图片描述

5.3.3 逻辑运算符

在SQL中,所有逻辑运算符的求值所得结果均为TRUE、FALSE或NULL。在MySQL中,它们体现为1(TRUE)、0(FALSE)和NULL。
在这里插入图片描述

  1. NOT 或者!
    逻辑非运算符NOT或者!表示当操作数为0时,所得值为1;当操作数为非零值时,所得值为0;当操作数为NULL时,所得的返回值为NULL。
select not 10, not (1-1), not -5,not null, not 1+1;
select !10, !(1-1), !-5,! null, !1+1;

在这里插入图片描述
在这里插入图片描述
由结果可以看到,前4列“NOT”和“!”的返回值都相同。为什么最后1列会出现不同的值呢?这是因为“NOT”与“!”的优先级不同。“NOT”的优先级低于“+”,因此“NOT 1+1”相当于“NOT(1+1)”,先计算“1+1”,然后再进行NOT运算,因为操作数不为0,因此NOT 1+1的结果是0;相反,“!”的优先级要高于“+”运算,因此“! 1+1”相当于“(!1)+1”,先计算“!1”,结果为0,再加1,最后结果为1。

  1. AND 或者 &&
    逻辑与运算符AND或者&&表示当所有操作数均为非零值并且不为NULL时,计算所得结果为1;当一个或多个操作数为0时,所得结果为0;其余情况返回值为NULL。
select 1 && -1, 1 and 0,1 && null, 0 and null;

在这里插入图片描述

  1. OR或者||
    逻辑或运算符OR或者||表示当两个操作数均为非NULL值且任意一个操作数为非零值时,结果为1,否则结果为0;当有一个操作数为NULL,且另一个操作数为非零值时,则结果为1,否则结果为NULL;当两个操作数均为NULL时,则所得结果为NULL。
select 1 or -1 or 0,1||2,1 or null, null||null;

在这里插入图片描述

  1. XOR
    逻辑异或运算符XOR表示当任意一个操作数为NULL时,返回值为NULL;对于非NULL的操作数,如果两个操作数都是非0值或者都是0值,则返回结果为0;如果一个为0值、另一个为非0值,返回结果为1。
select 1 xor 1, 0 xor 0,1 xor 0, 1 xor null, 1 xor 1 xor 1;

在这里插入图片描述

5.3.4 位运算符

在这里插入图片描述

  1. 位或运算符(|)
    位或运算的实质是将参与运算的几个数据按照对应的二进制数逐位进行逻辑或运算。对应的二进制位有一个或两个为1则该位的运算结果为1,否则为0。
select 10|15, 9|4|2;

在这里插入图片描述
2. 位与运算符(&)
位与运算的实质是将参与运算的几个操作数按照对应的二进制数逐位进行逻辑与运算。对应的二进制位都为1则该位的运算结果为1,否则为0。

select 10&15, 9&4&2;

在这里插入图片描述

  1. 位异或运算符 (^)
    位异或运算的实质是将参与运算的两个数据按照对应的二进制数逐位进行逻辑异或运算。对应位的二进制数不同时,对应位的结果才为1。如果两个对应位数都为0或者都为1,则对应位的结果为0。
select 10^15, 1^0,1^1;

在这里插入图片描述

  1. 位左移运算符(<<)
    位左移运算符<<使指定的二进制值的所有位都左移指定的位数。左移指定位数之后,左边高位的数值将被移出并丢弃,右边低位空出的位置用0补齐。语法格式为:expr<<n。其中,n指定值expr要移位的位数。
select 1<<2,4<<2;

在这里插入图片描述

  1. 位右移运算符(>>)
    位右移运算符>>使指定的二进制值的所有位都右移指定的位数。右移指定位数之后,右边低位的数值将被移出并丢弃,左边高位空出的位置用0补齐。语法格式为:expr>>n。其中,n指定值expr要移位的位数。
select 1>>1, 16>>2;

在这里插入图片描述

  1. 位取反运算符(~)
    位取反运算的实质是将参与运算的数据按照对应的二进制数逐位反转,即1取反后变为0、0取反后变为1。
select 5& ~1;

在这里插入图片描述

5.3.5 运算符的优先级

级别高的运算符先进行计算,如果级别相同,MySQL按表达式的顺序从左到右依次计算。当然,在无法确定优先级的情况下,可以使用圆括号()来改变优先级。
在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zyw2002

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值