MySQL的数据类型和运算符

1.MySQL数据类型介绍

MySQL支持多种数据类型,主要有数值类型、日期/时间类型和字符串类型。

(1)数值数据类型:包括整数类型TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,浮点小数数据类型FLOAT和DOUBLE,定点小数类型DECIMAL。

(2)日期/时间类型:包括YEAR、TIME、DATE、DATETIME和TIMESTAMP。

(3)字符串类型:包括CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET等。字符串类型又分为文本字符串和二进制字符串。

1.1整数类型

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

类型名称(默认宽度)说明存储需求有符号取值范围无符号取值范围
TINYINT(6)很小的整数1字节-128~1270~255
SMALLINT(6)小的整数2字节-32768~327670~65535
MEDIUMINT(9)中等大小的整数3字节-8388608~83886070~16777215
INT(11)普通大小的整数4字节-2147483648~21474836470~4294967295
BIGINT(20)大整数8字节-9223372036854775808~92233720368547758070~18446744073709551655
CREATE TABLE tb_emp1 (
    id INT(11) COMMENT '员工编号',
    NAME VARCHAR(25) COMMENT '员工名称',
    deptId INT(11) COMMENT '所在部门编号',
    salary FLOAT COMMENT '工资'
);

id字段的数据类型为INT(11),注意后面的数字11,表示的是该数据类型指定的显示宽度,指定能够显示的数值中数字的个数。例如,假设声明一个INT类型的字段:year INT(4),该声明指明,在year字段中的数据一般只显示4位数字的宽度。

在这里要注意,显示宽度和数据类型的取值范围是无关的。显示宽度只是指明MySQL最大可能显示的数字个数,数值的位数小于指定的宽度时会由空格填充,如果插入了大于显示宽度的值,只要该值不超过该类型整数的取值范围,数值依然可以插入,而且能够显示出来。例如,假如向year字段插入一个数值19999,当使用SELECT查询该列值的时候,MySQL显示的将是完整的带有5位数字的19999,而不是4位数字的值。其他整型数据类型也可以在定义表结构时指定所需要的显示宽度,如果不指定,系统就会为每一种类型指定默认的宽度值。

这些显示宽度能够保证显示每一种数据类型可以取到的取值范围内的所有值。例如,TINYINT有符号数和无符号数的取值范围分别为-128127和0255,由于负号占了一个数字位,因此TINYINT默认的显示宽度为4。同理,其他整数类型的默认显示宽度与其有符号数的最小值的宽度相同。不同的整数类型有不同的取值范围,并且需要不同的存储空间,因此,应该根据实际需要选择最合适的类型,这样有利于提高查询的效率和节省存储空间。

提示

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

1.2浮点数类型和定点数类型

MySQL中使用浮点数和定点数来表示小数。

浮点类型:FLOAT(单精度浮点类型)、DOUBLE(双精度浮点类型)。

定点类型:DECIMAL。

浮点类型和定点类型都可以用(M, N)来表示,其中M为精度,表示总共的位数;N为标度,表示小数的位数。

类型名称说明存储需求
FLOAT单精度浮点数4字节
DOUBLE双精度浮点数8字节
DECIMAL (M,D)压缩的"严格"定点数如果M>D,为M+2否则为D+2字节

DECIMAL类型不同于FLOAT和DOUBLE, DECIMAL实际是以串存放的,DECIMAL可能的最大取值范围与DOUBLE一样,但是其有效的取值范围由M和D的值决定。若改变M而固定D,则其取值范围将随M的变大而变大。从表可以看到,DECIMAL的存储空间并不是固定的,而是由其精度值M决定的,占用M+2个字节。

FLOAT类型的取值范围如下:

有符号的取值范围:-3.402823466E+38~-1.175494351E-38。

无符号的取值范围:0和1.175494351E-38~3.402823466E+38。

DOUBLE类型的取值范围如下:

有符号的取值范围:-1.7976931348623157E+308~-2.2250738585072014E-308。

无符号的取值范围:0和2.2250738585072014E-308~1.7976931348623157E+308。

提示

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

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

CREATE TABLE tmp2(x FLOAT(5,1), y DOUBLE(5,1), z DECIMAL(5,1));

向表中插入数据

mysql> INSERT INTO tmp2 VALUES(5.12, 5.15, 5.123);
Query OK, 1 row affected, 1 warning (0.01 sec)

在插入数据时,MySQL给出了一个警告信息,使用SHOW WARNINGS;语句查看警告信息:

mysql> SHOW WARNINGS;
+-------+------+----------------------------------------+
| Level | Code | Message                                |
+-------+------+----------------------------------------+
| Note  | 1265 | Data truncated for column 'z' at row 1 |
+-------+------+----------------------------------------+
1 row in set (0.00 sec)

可以看到FLOAT和DOUBLE在进行四舍五入时没有给出警告,而给出z字段数值被截断的警告。

mysql> SELECT * FROM tmp2;
+------+------+------+
| x    | y    | z    |
+------+------+------+
|  5.1 |  5.2 |  5.1 |
+------+------+------+
1 rows in set (0.00 sec)

FLOAT和DOUBLE在不指定精度时,默认会按照实际的精度(由计算机硬件和操作系统决定),DECIMAL若不指定精度,则默认为(10, 0)。

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

提示

在MySQL中,定点数以字符串形式存储,在对精度要求比较高的时候(如货币、科学数据等),使用DECIMAL类型比较好,另外两个浮点数进行减法和比较运算时也容易出问题,所以在使用浮点型时需要注意,并尽量避免做浮点数比较。

1.3日期与时间类型

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

类型名称日期格式日期范围存储需求
YEARYYYY1901~21551字节
TIMEHH:MM:SS-838:59:59~838:59:593字节
DATEYYYY-MM-DD1000-01-01~9999-12-313字节
DATETIMEYYYY-MM-DD HH:MM:SS1000-01-01 00:00:00~9999-12-31 23:59:598字节
TIMESTAMPYYYY-MM-DD HH:MM:SS1970-01-01 00:00:01 UTC~2038-01-19 03:14:07 UTC4字节

1.3.1YEAR

YEAR类型是一个单字节类型,用于表示年,在存储时只需要1字节。可以使用各种格式指定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。

提示

两位整数范围与两位字符串范围稍有不同,例如插入2000年,读者可能会使用数字格式的0表示YEAR,实际上,插入数据库的值为0000,而不是所希望的2000。只有使用字符串格式的’0’或’00’,才可以被正确地解释为2000。非法YEAR值将被转换为0000。

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

mysql> CREATE TABLE tmp3(  y YEAR );
Query OK, 0 rows affected (0.07 sec)

mysql> INSERT INTO tmp3 values(2010),('2010');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> INSERT INTO tmp3 values ('2166');
ERROR 1264 (22003): Out of range value for column 'y' at row 1

语句执行之后,MySQL给出了一条错误提示,使用SHOW查看错误信息:

mysql> SHOW WARNINGS;
+-------+------+--------------------------------------------+
| Level | Code | Message                                    |
+-------+------+--------------------------------------------+
| Error | 1264 | Out of range value for column 'y' at row 1 |
+-------+------+--------------------------------------------+
1 row in set (0.00 sec)

插入的第3个值2166超过了YEAR类型的取值范围,此时不能正常地执行插入操作,查看结果:

mysql> SELECT * FROM tmp3;
+------+
| y    |
+------+
| 2010 |
| 2010 |
+------+
2 rows in set (0.00 sec)

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

首先删除表中的数据:

mysql> DELETE FROM tmp3;
Query OK, 2 rows affected (0.00 sec)

mysql> INSERT INTO tmp3 values('0'),('00'),('77'),('10');
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tmp3;
+------+
| y    |
+------+
| 2000 |
| 2000 |
| 1977 |
| 2010 |
+------+
4 rows in set (0.00 sec)

字符串’0’和’00’的作用相同,分别都转换成了2000年;'77’转换为1977;'10’转换为2010。

例:向tmp3表中y字段插入2位数字表示表示的YEAR值,分别为0、78和11,SQL语句如下:

mysql> DELETE FROM tmp3;
Query OK, 4 rows affected (0.00 sec)

mysql> INSERT INTO tmp3 values(0),(78),(11);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tmp3;
+------+
| y    |
+------+
| 0000 |
| 1978 |
| 2011 |
+------+
3 rows in set (0.00 sec)

0被转换为0000;78被转换为1978;11被转换为2011。

1.3.2TIME

TIME类型用在只需要时间信息的值时,在存储时需要3字节。TIME类型的格式为’HH:MM:SS’, HH表示小时;MM表示分钟;SS表示秒。TIME类型的取值范围为-838:59:59~838:59:59,小时部分如此大的原因是TIME类型不仅可以用于表示一天的时间(必须小于24小时),还可以表示某个事件过去的时间或两个事件之间的时间间隔(可以大于24小时,甚至为负)。可以使用各种格式指定TIME值,下面一一介绍。

(1)'D HH:MM:SS’格式的字符串。还可以使用下面任何一种"非严格"的语法:‘HH:MM:SS’、‘HH:MM’、‘D HH:MM’、‘DHH’或’SS’。这里的D表示日,可以取0~34之间的值。在插入数据库时,D被转换为小时保存,格式为"D*24+HH"。

(2)'HHMMSS’格式的、没有间隔符的字符串或者HHMMSS格式的数值,假定是有意义的时间。例如,‘101112’被理解为’10:11:12’,但’109712’是不合法的(它有一个没有意义的分钟部分),存储时将变为00:00:00。

提示

为TIME列分配简写值时应注意,如果没有冒号,MySQL解释值时,假定最右边的两位表示秒。(MySQL解释TIME值为过去的时间而不是当天的时间)。例如,读者可能认为’1112’和1112表示11:12:00(11点过12分),但MySQL将它们解释为00:11:12(11分12秒)。同样’12’和12被解释为00:00:12。相反,若TIME值中使用冒号,则肯定被看作当天的时间。也就是说,'11:12’表示11:12:00,而不是00:11:12。

例: 创建数据表tmp4,定义数据类型为TIME的字段t,向表中插入值’10:05:05’,‘23:23’,‘2 10:10’,‘3 02’,‘10’,SQL语句如下:

mysql> CREATE TABLE tmp4( t TIME );
Query OK, 0 rows affected (0.07 sec)

mysql> INSERT INTO tmp4 values('10:05:05 '), ('23:23'), ('2 10:10'), ('3 02'),('10');
Query OK, 5 rows affected (0.02 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tmp4;
+----------+
| t        |
+----------+
| 10:05:05 |
| 23:23:00 |
| 58:10:00 |
| 74:00:00 |
| 00:00:10 |
+----------+
5 rows in set (0.00 sec)

'10:05:05’被转换为10:05:05;'23:23’被转换为23:23:00;'2 10:10’被转换为58:10:00,'3 02’被转换为74:00:00;'10’被转换成00:00:10。

提示

在使用’D HH’格式时,小时一定要使用双位数值,如果是小于10的小时数,应在前面加0。

例:向表tmp4中插入值’101112’,111213,‘0’,107010,SQL语句如下:

mysql> DELETE FROM tmp4;
Query OK, 5 rows affected (0.01 sec)

mysql> INSERT INTO tmp4 values('101112'),(111213),( '0');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> INSERT INTO tmp4 values ( 107010);
ERROR 1292 (22007): Incorrect time value: '107010' for column 't' at row 1

mysql> SHOW WARNINGS;
+-------+------+--------------------------------------------------------+
| Level | Code | Message                                                |
+-------+------+--------------------------------------------------------+
| Error | 1292 | Incorrect time value: '107010' for column 't' at row 1 |
+-------+------+--------------------------------------------------------+
1 row in set (0.00 sec)

在第二次插入记录的时候,数据超出了范围,原因是107010的分钟部分超过了60,分钟部分是不会超过60的,查看结果:

mysql> SELECT * FROM tmp4;
+----------+
| t        |
+----------+
| 10:11:12 |
| 11:12:13 |
| 00:00:00 |
+----------+
3 rows in set (0.00 sec)

'101112’被转换为10:11:12;111213被转换为11:12:13;'0’被转换为00:00:00;107010因为是不合法的值,因此不能被插入。

也可以使用系统日期函数向TIME字段列插入值。

例:向tmp4表中插入系统当前时间,SQL语句如下:

mysql> DELETE FROM tmp4;
Query OK, 3 rows affected (0.00 sec)

mysql> INSERT INTO tmp4 values (CURRENT_TIME) ,(NOW());
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tmp4;
+----------+
| t        |
+----------+
| 16:54:08 |
| 16:54:08 |
+----------+
2 rows in set (0.00 sec)

1.3.3DATE

DATE类型用在仅需要日期值时,没有时间部分,在存储时需要3字节。DATE类型的日期格式为’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语句如下:

mysql> CREATE TABLE tmp5(d DATE);
Query OK, 0 rows affected (0.03 sec)

向表中插入"YYYY-MM-DD"和"YYYYMMDD"字符串格式的日期:

mysql> INSERT INTO tmp5 values('1998-08-08'),('19980808'),('20101010');
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tmp5;
+------------+
| d          |
+------------+
| 1998-08-08 |
| 1998-08-08 |
| 2010-10-10 |
+------------+
3 rows in set (0.00 sec)

例:向tmp5表中插入"YY-MM-DD"和"YYMMDD"字符串格式日期,SQL语句如下:

mysql> DELETE FROM tmp5;
Query OK, 3 rows affected (0.01 sec)

向表中插入"YY-MM-DD"和"YYMMDD"格式日期:

mysql> INSERT INTO tmp5 values ('99-09-09'),( '990909'), ('000101') ,('111111');
Query OK, 4 rows affected (0.04 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tmp5;
+------------+
| d          |
+------------+
| 1999-09-09 |
| 1999-09-09 |
| 2000-01-01 |
| 2011-11-11 |
+------------+
4 rows in set (0.00 sec)

例:向tmp5表中插入YY-MM-DD和YYMMDD数字格式日期,SQL语句如下:

mysql> DELETE FROM tmp5;
Query OK, 4 rows affected (0.00 sec)

mysql> INSERT INTO tmp5 values (19990909),(990909), ( 000101) ,( 111111);
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tmp5;
+------------+
| d          |
+------------+
| 1999-09-09 |
| 1999-09-09 |
| 2000-01-01 |
| 2011-11-11 |
+------------+
4 rows in set (0.00 sec)

例:向tmp5表中插入系统当前日期,SQL语句如下:

mysql> DELETE FROM tmp5;
Query OK, 4 rows affected (0.01 sec)

mysql> INSERT INTO tmp5 values( CURRENT_DATE() ),( NOW() );
Query OK, 2 rows affected, 1 warning (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 1

mysql> SELECT * FROM tmp5;
+------------+
| d          |
+------------+
| 2021-07-19 |
| 2021-07-19 |
+------------+
2 rows in set (0.00 sec)

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

提示

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

1.3.4DATETIME

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-01 00: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-3105:05:05 ;输入981231050505,插入数据的DATETIME为1998-12-3105:05:05。

例:创建数据表tmp6,定义数据类型为DATETIME的字段dt,向表中插入"YYYY-MM-DD HH:MM:SS"和"YYYYMMDDHHMMSS"字符串格式日期和时间值,SQL语句如下:

mysql> CREATE TABLE tmp6(  dt DATETIME );
Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO tmp6 values('1998-08-08 08:08:08'),('19980808080808'),('20101010101010');
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tmp6;
+---------------------+
| dt                  |
+---------------------+
| 1998-08-08 08:08:08 |
| 1998-08-08 08:08:08 |
| 2010-10-10 10:10:10 |
+---------------------+
3 rows in set (0.00 sec)

例:向tmp6表中插入"YY-MM-DD HH:MM:SS"和"YYMMDDHHMMSS"字符串格式日期和时间值,SQL语句如下:

mysql> DELETE FROM tmp6;
Query OK, 3 rows affected (0.00 sec)

mysql> INSERT INTO tmp6 values('99-09-09 09:09:09'),('990909090909'),('101010101010');
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tmp6;
+---------------------+
| dt                  |
+---------------------+
| 1999-09-09 09:09:09 |
| 1999-09-09 09:09:09 |
| 2010-10-10 10:10:10 |
+---------------------+
3 rows in set (0.00 sec)

例:向tmp6表中插入YYYYMMDDHHMMSS 和YYMMDDHHMMSS数字格式日期和时间值,SQL语句如下:

mysql> DELETE FROM tmp6;
Query OK, 3 rows affected (0.00 sec)

mysql> INSERT INTO tmp6 values(19990909090909), (101010101010);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tmp6;
+---------------------+
| dt                  |
+---------------------+
| 1999-09-09 09:09:09 |
| 2010-10-10 10:10:10 |
+---------------------+
2 rows in set (0.00 sec)

例:向tmp6表中插入系统当前日期和时间值,SQL语句如下:

mysql> DELETE FROM tmp6;
Query OK, 2 rows affected (0.01 sec)

mysql> INSERT INTO tmp6 values( NOW() );
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM tmp6;
+---------------------+
| dt                  |
+---------------------+
| 2021-07-19 17:09:04 |
+---------------------+
1 row in set (0.00 sec)

NOW()函数返回当前系统的日期和时间值,格式为"YYYY-MM-DDHH:MM:SS"。

提示

MySQL允许"不严格"语法:任何标点符号都可以用作日期部分或时间部分之间的间隔符。例如,‘98-12-31 11:30:45’、‘98.12.31 11+30+45’、'98/12/31 113045’和’98@12@31 113045’是等价的,这些值都可以正确地插入数据库。

1.3.5TIMESTAMP

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

例:创建数据表tmp7,定义数据类型为TIMESTAMP的字段ts,向表中插入值’19950101010101’,‘950505050505’,‘1996-02-02 02:02:02’,‘97@03@03 03@03@03’,121212121212,NOW(),SQL语句如下:

mysql> CREATE TABLE tmp7( ts TIMESTAMP);
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO tmp7 values ('19950101010101'),
    -> ('950505050505'),
    -> ('1996-02-02 02:02:02'),
    -> ('97@03@03 03@03@03'),
    -> (121212121212),
    -> ( NOW() );
Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tmp7;
+---------------------+
| ts                  |
+---------------------+
| 1995-01-01 01:01:01 |
| 1995-05-05 05:05:05 |
| 1996-02-02 02:02:02 |
| 1997-03-03 03:03:03 |
| 2012-12-12 12:12:12 |
| 2021-07-20 10:34:17 |
+---------------------+
6 rows in set (0.00 sec)

提示

TIMESTAMP与DATETIME除了存储字节和支持的范围不同外,还有一个最大的区别就是:DATETIME在存储日期数据时,按实际输入的格式存储,即输入什么就存储什么,与时区无关;而TIMESTAMP值的存储是以UTC(世界标准时间)格式保存的,存储时对当前时区进行转换,检索时再转换回当前时区,即查询时,根据当前时区的不同,显示的时间值是不同的。

例:向tmp7表中插入当前日期,查看插入值,更改时区为东10区,再次查看插入值,SQL语句如下:

mysql> DELETE FROM tmp7;
Query OK, 6 rows affected (0.01 sec)

mysql> INSERT INTO tmp7 values( NOW() );
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM tmp7;
+---------------------+
| ts                  |
+---------------------+
| 2021-07-20 10:36:03 |
+---------------------+
1 row in set (0.00 sec)

mysql> set time_zone='+10:00';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM tmp7;
+---------------------+
| ts                  |
+---------------------+
| 2021-07-20 12:36:03 |
+---------------------+
1 row in set (0.00 sec)

因为东10区时间比东8区快2个小时,因此查询的结果经过时区转换之后,显示的值增加了2个小时。同样,时区每减小1,查询显示的日期中的小时数减1。

提示

如果为一个DATETIME或TIMESTAMP对象分配一个DATE值,结果值的时间部分被设置为’00:00:00’,因为DATE值未包含时间信息。如果为一个DATE对象分配一个DATETIME或TIMESTAMP值,结果值的时间部分被删除,因为DATE值未包含时间信息。

1.4字符串类型

字符串类型用来存储字符串数据,除了可以存储字符串数据之外,还可以存储其他数据,比如图片和声音的二进制数据。MySQL支持两类字符型数据:文本字符串和二进制字符串。MySQL中的文本字符串类型指CHAR、VARCHAR、TEXT、ENUM和SET。

类型名称说明存储需求
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个成员)

VARCHAR和TEXT类型是变长类型,其存储需求取决于列值的实际长度(在前面的表格中用L表示),而不是取决于类型的最大可能尺寸。例如,一个VARCHAR(10)列能保存最大长度为10个字符的一个字符串,实际的存储需要是字符串的长度L,加上1字节以记录字符串的长度。对于字符"abcd",L是4,而存储要求是5字节。

1.4.1CHAR和VARCHAR类型

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

VARCHAR(M)是长度可变的字符串,M表示最大列长度,范围是0~65 535个字符。VARCHAR的最大实际长度由最长的行的大小和使用的字符集确定,而其实际占用的空间为字符串的实际长度加1。例如,VARCHAR(50)定义了一个最大长度为50的字符串,若插入的字符串只有10个字符,则实际存储的字符串为10个字符和一个字符串结束字符。VARCHAR在值保存和检索时尾部的空格仍保留。

CHAR(4)与VARCHAR(4)存储的区别

插入值CHAR(4)存储需求VARCHAR(4)存储需求
‘’’ ’4字节‘’1字节
‘ab’'ab ’4字节‘ab’3字节
‘abc’'abc ’4字节‘abc’4字节
‘abcd’‘abcd’4字节‘abcd’5字节
‘abcdef’‘abcd’4字节‘abcd’5字节

提示

在表中,最后一行的值只有在使用"不严格"模式时,字符串才会被截断插入;如果MySQL使用"严格"模式,超过列长度的值不会被保存,并且会出现错误信息:“ERROR 1406 (22001): Data too long for column”,即字符串长度超过指定长度,无法插入。

CHAR(4)定义了固定长度为4的列,无论存入的数据长度为多少,所占用的空间均为4字节。VARCHAR(4)定义的列所占的字节数为实际长度加1。

当查询时,CHAR(4)和VARCHAR(4)的值并不一定相同

例:创建tmp8表,定义字段ch和vch数据类型依次为CHAR(4)、VARCHAR(4)向表中插入数据"ab ",SQL语句如下:

mysql> CREATE TABLE tmp8(
    -> ch  CHAR(4),  vch  VARCHAR(4)
    -> );
Query OK, 0 rows affected (0.06 sec)

mysql> INSERT INTO tmp8 VALUES('ab  ', 'ab  ');
Query OK, 1 row affected (0.02 sec)

mysql> SELECT concat('(', ch, ')'), concat('(',vch,')') FROM tmp8;
+----------------------+---------------------+
| concat('(', ch, ')') | concat('(',vch,')') |
+----------------------+---------------------+
| (ab)                 | (ab  )              |
+----------------------+---------------------+
1 row in set (0.01 sec)

ch在保存"ab"时将末尾的两个空格删除了,而vch字段保留了末尾的两个空格。

1.4.2TEXT类型

TEXT列保存非二进制字符串,如文章内容、评论等。当保存或查询TEXT列的值时,不删除尾部空格。TEXT类型分为4种:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。不同的TEXT类型的存储空间和数据长度不同。

(1)TINYTEXT最大长度为255(2^8-1)字符的TEXT列。

(2)TEXT最大长度为65535(2^16-1)字符的TEXT列。

(3)MEDIUMTEXT最大长度为16777215(2^24-1)字符的TEXT列。

(4)LONGTEXT最大长度为4294967295或4GB(2^32-1)字符的TEXT列。

1.4.3ENUM类型

ENUM是一个字符串对象,其值为表创建时在列规定中枚举的一列值。语法格式如下:

字段名 ENUM('值1','值2',...,'值n')

字段名指将要定义的字段,值n指枚举列表中的第n个值。ENUM类型的字段在取值时,只能在指定的枚举列表中取,而且一次只能取一个。如果创建的成员中有空格,其尾部的空格将自动被删除。ENUM值在内部用整数表示,每个枚举值均有一个索引值:列表值所允许的成员值从1开始编号,MySQL存储的就是这个索引编号。枚举最多可以有65535个元素。

例如定义ENUM类型的列(‘first’, ‘second’, ‘third’),该列可以取的值和每个值的索引如表所示。

索引
NULLNULL
‘’0
first1
second2
third3

ENUM值依照列索引顺序排列,并且空字符串排在非空字符串前,NULL值排在其他所有的枚举值前。

有一个方法可以查看列成员的索引值,

例:创建表tmp9,定义ENUM类型的列enm(‘first’,‘second’,‘third’),查看列成员的索引值,SQL语句如下:

mysql> CREATE TABLE tmp9( enm ENUM('first','second','third') );
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO tmp9 values('first'),('second') ,('third') , (NULL);
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> SELECT enm, enm+0 FROM tmp9;
+--------+-------+
| enm    | enm+0 |
+--------+-------+
| first  |     1 |
| second |     2 |
| third  |     3 |
| NULL   |  NULL |
+--------+-------+
4 rows in set (0.00 sec)

提示

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

例:创建表tmp10,定义INT类型的soc字段,ENUM类型的字段level,列表值为(‘excellent’,‘good’, ‘bad’),向表tmp10中插入数据’good’,1,2,3,‘best’,SQL语句如下:

mysql> CREATE TABLE tmp10 (soc INT, level enum('excellent', 'good','bad') );
Query OK, 0 rows affected (0.05 sec)

mysql> INSERT INTO tmp10 values(70,'good'), (90,1),(75,2),(50,3);
Query OK, 4 rows affected (0.03 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> INSERT INTO tmp10 values (100,'best');
ERROR 1265 (01000): Data truncated for column 'level' at row 1

这里系统提示错误信息,可以看到,由于字符串值"best"不在ENUM列表中,所以对数据进行了阻止插入操作,查询结果如下:

mysql> SELECT * FROM tmp10;
+------+-----------+
| soc  | level     |
+------+-----------+
|   70 | good      |
|   90 | excellent |
|   75 | good      |
|   50 | bad       |
+------+-----------+
4 rows in set (0.00 sec)

1.4.4SET类型

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语句如下:

mysql> CREATE TABLE tmp11 ( s SET('a', 'b', 'c', 'd'));
Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO tmp11 values('a'),( 'a,b,a'),('c,a,d');
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> INSERT INTO tmp11 values ('a,x,b,y');
ERROR 1265 (01000): Data truncated for column 's' at row 1

由于插入了SET列不支持的值,因此MySQL给出错误提示。

mysql> SELECT * FROM tmp11;
+-------+
| s     |
+-------+
| a     |
| a,b   |
| a,c,d |
+-------+
3 rows in set (0.00 sec)

1.5二进制类型

MySQL中的二进制数据类型有BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。

MySQL中的二进制字符串类型

类型名称说明存储需求
BIT(M)位字段类型大约(M+7)/8字节
BINARY(M)固定长度二进制字符串M字节
VARBINARY(M)可变长度二进制字符串M+1字节
TINYBLOB(M)非常小的BLOBL+1字节,在此L<2^8
BLOB(M)小BLOBL+2字节,在此L<2^16
MEDIUMBLOB(M)中等大小的BLOBL+3字节,在此L<2^24
LONGBLOB(M)非常大的BLOBL+4字节,在此L<2^32

1.5.1BIT类型

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、16。

mysql> CREATE TABLE tmp12( b BIT(4) );
Query OK, 0 rows affected (0.13 sec)

mysql> INSERT INTO tmp12 VALUES(2), (9), (15);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT BIN(b+0) FROM tmp12;
+----------+
| BIN(b+0) |
+----------+
| 10       |
| 1001     |
| 1111     |
+----------+
3 rows in set (0.00 sec)

b+0表示将二进制的结果转换为对应的数字的值,BIN()函数将数字转换为二进制。

提示

默认情况下,MySQL不可以插入超出该列允许范围的值,因而要确保插入的值在指定的范围内。

1.5.2BINARY和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’,比较两个字段的存储空间。

mysql> CREATE TABLE tmp13(
    -> b binary(3),  vb varbinary(30)
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO tmp13 VALUES(5,5);
Query OK, 1 row affected (0.01 sec)

查看两个字段存储数据的长度:

mysql> SELECT length(b), length(vb) FROM tmp13;
+-----------+------------+
| length(b) | length(vb) |
+-----------+------------+
|         3 |          1 |
+-----------+------------+
1 row in set (0.00 sec)

可以看到,b字段的值数据长度为3,而vb字段的数据长度仅为插入的一个字符的长度1。如果想要进一步确认"5"在两个字段中不同的存储方式,输入如下语句:

mysql> SELECT b,vb,b = '5', b='5\0\0',vb='5',vb = '5\0\0' FROM tmp13;
+------+------+---------+-----------+--------+--------------+
| b    | vb   | b = '5' | b='5\0\0' | vb='5' | vb = '5\0\0' |
+------+------+---------+-----------+--------+--------------+
| 5    | 5    |       0 |         1 |      1 |            0 |
+------+------+---------+-----------+--------+--------------+
1 row in set (0.00 sec)

由执行结果可以看出,b字段和vb字段的长度是截然不同的,因为b字段不足的空间填充了"\0",而vb字段则没有填充。

1.5.3BLOB类型

BLOB是一个二进制的对象,用来存储可变数量的数据。BLOB类型分为4种:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB,它们可容纳值的最大长度不同,如表所示。

数据类型存储范围
TINYBLOB最大长度为255(2^8-1)B
BLOB最大长度为65535(2^16-1)B
MEDIUMBLOB最大长度为16777215(2^24-1)B
LONGBLOB最大长度为4294967295(2^32-1)B或4GB

BLOB列存储的是二进制字符串(字节字符串);TEXT列存储的是非二进制字符串(字符字符串)。BLOB列没有字符集,并且排序和比较基于列值字节的数值;TEXT列有一个字符集,并且根据字符集对值进行排序和比较。

2.如何选择数据类型

MySQL提供了大量的数据类型,为了优化存储,提高数据库性能,在任何情况下均应使用最精确的类型(在所有可以表示该列值的类型中,该类型使用的存储最少)。

2.1整数和浮点数

如果不需要小数部分,就使用整数来保存数据;如果需要表示小数部分,就使用浮点数类型。对于浮点数据列,存入的数值会对该列定义的小数位进行四舍五入。例如,列的值的范围为1~99999,若使用整数,则MEDIUMINT UNSIGNED是最好的类型;若需要存储小数,则使用FLOAT类型。浮点类型包括FLOAT和DOUBLE类型。DOUBLE类型的精度比FLOAT类型高,因此,要求存储精度较高时,应选择DOUBLE类型。

2.2浮点数和定点数

浮点数FLOAT、DOUBLE相对于定点数DECIMAL的优势是:在长度一定的情况下,浮点数能表示更大的数据范围。但是由于浮点数容易产生误差,因此对精确度要求比较高时,建议使用DECIMAL来存储。DECIMAL在MySQL中是以字符串存储的,用于定义货币等对精确度要求较高的数据。在数据迁移中,float(M,D)是非标准SQL定义,数据库迁移可能会出现问题,最好不要这样使用。另外,两个浮点数进行减法和比较运算时也容易出现问题,因此在进行计算的时候,一定要小心。如果进行数值比较,最好使用DECIMAL类型。

2.3日期与时间类型

MySQL对于不同种类的日期和时间有很多的数据类型,比如YEAR和TIME。若只需要记录年份,则使用YEAR类型即可;若只记录时间,则只需使用TIME类型。

若同时需要记录日期和时间,则可以使用TIMESTAMP或者DATETIME类型。由于TIMESTAMP列的取值范围小于DATETIME的取值范围,因此存储范围较大的日期最好使用DATETIME。

TIMESTAMP也有一个DATETIME不具备的属性。默认情况下,当插入一条记录但并没有指定TIMESTAMP这个列值时,MySQL会把TIMESTAMP列设为当前的时间。因此,当需要插入记录,同时插入当前时间时,使用TIMESTAMP是方便的。另外,TIMESTAMP在空间上比DATETIME更有效。

2.4CHAR与VARCHAR之间的特点与选择

CHAR和VARCHAR的区别如下:

  • CHAR是固定长度字符,VARCHAR是可变长度字符。

  • CHAR会自动删除插入数据的尾部空格,VARCHAR不会删除尾部空格。

CHAR是固定长度,所以它的处理速度比VARCHAR快,但是它的缺点是浪费存储空间。所以对存储不大,但在速度上有要求的可以使用CHAR类型,反之可以使用VARCHAR类型来实现。

存储引擎对于选择CHAR和VARCHAR的影响如下。

  • 对于MyISAM存储引擎,最好使用固定长度的数据列代替可变长度的数据列。这样可以使整个表静态化,从而使数据检索更快,用空间换时间。

  • 对于InnoDB存储引擎,使用可变长度的数据列,因为InnoDB数据表的存储格式不分固定长度和可变长度,因此使用CHAR不一定比使用VARCHAR更好,但由于VARCHAR是按照实际的长度存储的,比较节省空间,因此对磁盘I/O和数据存储总量比较好。

2.5ENUM和SET

ENUM只能取单值,它的数据列表是一个枚举集合。它的合法取值列表最多允许有65535个成员。因此,在需要从多个值中选取一个时,可以使用ENUM。比如,性别字段适合定义为ENUM类型,每次只能从"男"或"女"中取一个值。

SET可取多个值。它的合法取值列表最多允许有64个成员。空字符串也是一个合法的SET值。在需要取多个值的时候,适合使用SET类型,比如要存储一个人的兴趣爱好,最好使用SET类型。

ENUM和SET的值是以字符串形式出现的,但在内部,MySQL以数值的形式存储它们。

2.6BLOB和TEXT

BLOB是二进制字符串,TEXT是非二进制字符串,两者均可存放大容量的信息。BLOB主要存储图片、音频信息等,而TEXT只能存储纯文本文件。

3.常见运算符介绍

运算符连接表达式中各个操作数的作用是用来指明对操作数进行的运算。运用运算符可以更加灵活地使用表中的数据,常见的运算符类型有算术运算符、比较运算符、逻辑运算符、位运算符。

3.1运算符概述

运算符是告诉MySQL执行特定算术或逻辑操作的符号。MySQL的内部运算符很丰富,主要有四大类,分别是算术运算符、比较运算符、逻辑运算符、位操作运算符。

3.2算术运算符

算术运算符用于各类数值的运算,包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)。

运算符作用
+加法运算
-减法运算
*乘法运算
/除法运算,返回商
%求余运算,返回余数

例:创建表tmp14,定义数据类型为INT的字段num,插入值64,对num值进行算术运算:

mysql> CREATE TABLE tmp14 ( num INT);
Query OK, 0 rows affected (0.10 sec)

mysql> INSERT INTO tmp14 value(64);
Query OK, 1 row affected (0.03 sec)

mysql> SELECT num, num+10, num-3+5, num+5-3, num+36.5 FROM tmp14;
+------+--------+---------+---------+----------+
| num  | num+10 | num-3+5 | num+5-3 | num+36.5 |
+------+--------+---------+---------+----------+
|   64 |     74 |      66 |      66 |    100.5 |
+------+--------+---------+---------+----------+
1 row in set (0.00 sec)

mysql> SELECT num, num *2, num /2, num/3, num%3 FROM tmp14;
+------+--------+---------+---------+-------+
| num  | num *2 | num /2  | num/3   | num%3 |
+------+--------+---------+---------+-------+
|   64 |    128 | 32.0000 | 21.3333 |     1 |
+------+--------+---------+---------+-------+
1 row in set (0.00 sec)

对num进行除法运算的时候,由于64无法被3整除,因此MySQL对num/3求商的结果保存到了小数点后面4位,结果为21.3333。

mysql> SELECT num, num / 0, num %0 FROM tmp14;
+------+---------+--------+
| num  | num / 0 | num %0 |
+------+---------+--------+
|   64 |    NULL |   NULL |
+------+---------+--------+
1 row in set (0.00 sec)

在数学运算中,除数为0的除法是没有意义的,因此除法运算中的除数不能为0,若除数为0,则返回结果为NULL。

3.3比较运算符

比较运算符用于比较运算,包括大于(>)、小于(<)、等于(=)、大于等于(>=)、小于等于(<=)、不等于(!=),以及IN、BETWEEN AND、ISNULL、GREATEST、LEAST、LIKE、REGEXP等。

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

运算符作用
=等于
<=>安全的等于
<>(!=)不等于
<=小于等于
>=大于等于
>大于
<小于
IS NULL判断一个值是否为NULL
IS NOT NULL判断一个值是否不为NULL
LEAST当有两个或多个参数时,返回最小值
GREATEST当有两个或多个参数时,返回最大值
BETWEEN AND判断一个值是否落在两个值之间
ISNULL与IS NULL的作用相同
IN判断一个值是IN列表中的任意一个值
NOT IN判断一个值不是IN列表中的任意一个值
LIKE通配符匹配
REGEXP正则表达式匹配

3.3.1等于运算符(=)

mysql> SELECT 1=0, '2'=2, 2=2,'0.02'=0, 'b'='b', (1+3) = (2+2),NULL=NULL;
+-----+-------+-----+----------+---------+---------------+-----------+
| 1=0 | '2'=2 | 2=2 | '0.02'=0 | 'b'='b' | (1+3) = (2+2) | NULL=NULL |
+-----+-------+-----+----------+---------+---------------+-----------+
|   0 |     1 |   1 |        0 |       1 |             1 |      NULL |
+-----+-------+-----+----------+---------+---------------+-----------+
1 row in set (0.00 sec)

在进行判断时,2=2和’2’=2的返回值相同,都为1。因为在进行判断时,MySQL自动进行了转换,把字符’2’转换成了数字2;‘b’='b’为相同的字符比较,因此返回值为1;表达式1+3和表达式2+2的结果都为4,因此结果相等,返回值为1;由于"="不能用于空值(NULL)的判断,因此返回值为NULL。

数值比较时有如下规则:

(1)若有一个或两个参数为NULL,则比较运算的结果为NULL。

(2)若同一个比较运算中的两个参数都是字符串,则按照字符串进行比较。

(3)若两个参数均为整数,则按照整数进行比较。

(4)若一个字符串和数字进行相等判断,则MySQL可以自动将字符串转换为数字。

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

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

mysql> SELECT 1<=>0, '2'<=>2, 2<=>2,'0.02'<=>0, 'b'<=>'b', (1+3) <=> (2+1),NULL<=>NULL;
+-------+---------+-------+------------+-----------+-----------------+-------------+
| 1<=>0 | '2'<=>2 | 2<=>2 | '0.02'<=>0 | 'b'<=>'b' | (1+3) <=> (2+1) | NULL<=>NULL |
+-------+---------+-------+------------+-----------+-----------------+-------------+
|     0 |       1 |     1 |          0 |         1 |               0 |           1 |
+-------+---------+-------+------------+-----------+-----------------+-------------+
1 row in set (0.00 sec)

3.3.3不等于运算符(<>或者!=)

"<>“或者”!="用于数字、字符串、表达式不相等的判断,若不相等,则返回值为1;否则返回值为0。这两个运算符不能用于判断空值(NULL)。

mysql> SELECT 'good'<>'god', 1<>2, 4!=4, 5.5!=5, (1+3)!=(2+1),NULL<>NULL;
+---------------+------+------+--------+--------------+------------+
| 'good'<>'god' | 1<>2 | 4!=4 | 5.5!=5 | (1+3)!=(2+1) | NULL<>NULL |
+---------------+------+------+--------+--------------+------------+
|             1 |    1 |    0 |      1 |            1 |       NULL |
+---------------+------+------+--------+--------------+------------+
1 row in set (0.00 sec)

3.3.4小于或等于运算符(<=)

"<=“用来判断左边的操作数是否小于或者等于右边的操作数,若小于或者等于,则返回值为1;否则返回值为0。”<="不能用于判断空值(NULL)。

mysql> SELECT 'good'<='god', 1<=2, 4<=4, 5.5<=5, (1+3) <= (2+1),NULL<=NULL;
+---------------+------+------+--------+----------------+------------+
| 'good'<='god' | 1<=2 | 4<=4 | 5.5<=5 | (1+3) <= (2+1) | NULL<=NULL |
+---------------+------+------+--------+----------------+------------+
|             0 |    1 |    1 |      0 |              0 |       NULL |
+---------------+------+------+--------+----------------+------------+
1 row in set (0.00 sec)

3.3.5小于运算符(<)

"<“运算符用来判断左边的操作数是否小于右边的操作数,若小于,则返回值为1;否则返回值为0。”<"不能用于判断空值(NULL)。

mysql> SELECT 'good'<'god', 1<2, 4<4, 5.5<5, (1+3) < (2+1),NULL<NULL;
+--------------+-----+-----+-------+---------------+-----------+
| 'good'<'god' | 1<2 | 4<4 | 5.5<5 | (1+3) < (2+1) | NULL<NULL |
+--------------+-----+-----+-------+---------------+-----------+
|            0 |   1 |   0 |     0 |             0 |      NULL |
+--------------+-----+-----+-------+---------------+-----------+
1 row in set (0.00 sec)

3.3.6大于或等于运算符(>=)

">=“运算符用来判断左边的操作数是否大于或者等于右边的操作数,若大于或者等于,则返回值为1;否则返回值为0。”>="不能用于判断空值(NULL)。

mysql> SELECT 'good'>='god', 1>=2, 4>=4, 5.5>=5, (1+3) >= (2+1),NULL>=NULL;
+---------------+------+------+--------+----------------+------------+
| 'good'>='god' | 1>=2 | 4>=4 | 5.5>=5 | (1+3) >= (2+1) | NULL>=NULL |
+---------------+------+------+--------+----------------+------------+
|             1 |    0 |    1 |      1 |              1 |       NULL |
+---------------+------+------+--------+----------------+------------+
1 row in set (0.00 sec)

3.3.7大于运算符(>)

">“运算符用来判断左边的操作数是否大于右边的操作数,若大于,则返回值为1;否则返回值为0。”>"不能用于判断空值(NULL)。

mysql> SELECT 'good'>'god', 1>2, 4>4, 5.5>5, (1+3) > (2+1),NULL>NULL;
+--------------+-----+-----+-------+---------------+-----------+
| 'good'>'god' | 1>2 | 4>4 | 5.5>5 | (1+3) > (2+1) | NULL>NULL |
+--------------+-----+-----+-------+---------------+-----------+
|            1 |   0 |   0 |     1 |             1 |      NULL |
+--------------+-----+-----+-------+---------------+-----------+
1 row in set (0.00 sec)

3.3.8IS NULL(ISNULL)和IS NOT NULL运算符

IS NULL和ISNULL用于检验一个值是否为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)

IS NULL和ISNULL的作用相同,只是格式不同。ISNULL和ISNOT NULL的返回值正好相反。

3.3.9BETWEEN AND运算符

语法格式为:expr BETWEEN min AND max。若expr大于或等于min且小于或等于max,则BETWEEN的返回值为1,否则返回值为0。

mysql> SELECT 4 BETWEEN 4 AND 6, 4 BETWEEN 4 AND 6,12 BETWEEN 9 AND 10;
+-------------------+-------------------+---------------------+
| 4 BETWEEN 4 AND 6 | 4 BETWEEN 4 AND 6 | 12 BETWEEN 9 AND 10 |
+-------------------+-------------------+---------------------+
|                 1 |                 1 |                   0 |
+-------------------+-------------------+---------------------+
1 row in set (0.00 sec)

mysql> SELECT  'x' BETWEEN 'f' AND 'g', 'b' BETWEEN 'a' AND 'c';
+-------------------------+-------------------------+
| 'x' BETWEEN 'f' AND 'g' | 'b' BETWEEN 'a' AND 'c' |
+-------------------------+-------------------------+
|                       0 |                       1 |
+-------------------------+-------------------------+
1 row in set (0.00 sec)

3.3.10LEAST运算符

语法格式为:LEAST(值1,值2,...,值n),其中值n表示参数列表中有n个值。在有两个或多个参数的情况下,返回最小值。若任意一个自变量为NULL,则LEAST()的返回值为NULL。

mysql> SELECT least(2,0), least(20.0,3.0,100.5), least('a','c','b'),least(10,NULL);
+------------+-----------------------+--------------------+----------------+
| least(2,0) | least(20.0,3.0,100.5) | least('a','c','b') | least(10,NULL) |
+------------+-----------------------+--------------------+----------------+
|          0 |                   3.0 | a                  |           NULL |
+------------+-----------------------+--------------------+----------------+
1 row in set (0.00 sec)

3.3.11GREATEST(value1,value2,…)

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

mysql> SELECT greatest(2,0), greatest(20.0,3.0,100.5), greatest('a','c','b'),greatest(10,NULL);
+---------------+--------------------------+-----------------------+-------------------+
| greatest(2,0) | greatest(20.0,3.0,100.5) | greatest('a','c','b') | greatest(10,NULL) |
+---------------+--------------------------+-----------------------+-------------------+
|             2 |                    100.5 | c                     |              NULL |
+---------------+--------------------------+-----------------------+-------------------+
1 row in set (0.00 sec)

3.3.12IN、NOT IN运算符

IN运算符用来判断操作数是否为IN列表中的其中一个值,若是,则返回值为1;否则返回值为0。

NOT IN运算符用来判断表达式是否为IN列表中的其中一个值,若不是,则返回值为1;否则返回值为0。

mysql> SELECT 2 IN (1,3,5,'thks'), 'thks' IN (1,3,5,'thks');
+---------------------+--------------------------+
| 2 IN (1,3,5,'thks') | 'thks' IN (1,3,5,'thks') |
+---------------------+--------------------------+
|                   0 |                        1 |
+---------------------+--------------------------+
1 row in set, 2 warnings (0.00 sec)

mysql> SELECT 2 NOT IN (1,3,5,'thks'), 'thks' NOT IN (1,3,5,'thks');
+-------------------------+------------------------------+
| 2 NOT IN (1,3,5,'thks') | 'thks' NOT IN (1,3,5,'thks') |
+-------------------------+------------------------------+
|                       1 |                            0 |
+-------------------------+------------------------------+
1 row in set, 2 warnings (0.00 sec)

在左侧表达式为NULL的情况下,或者表中找不到匹配项并且表中一个表达式为NULL的情况下,IN的返回值均为NULL。

mysql> SELECT NULL IN (1,3,5,'thks'),10 IN (1,3,NULL,'thks');
+------------------------+-------------------------+
| NULL IN (1,3,5,'thks') | 10 IN (1,3,NULL,'thks') |
+------------------------+-------------------------+
|                   NULL |                    NULL |
+------------------------+-------------------------+
1 row in set, 1 warning (0.00 sec)

3.3.13LIKE

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

LIKE运算符在进行匹配时,可以使用下面两种通配符。

(1)"%":匹配任何数目的字符,甚至包括零字符。

(2)"_":只能匹配一个字符。

mysql> SELECT 'stud' LIKE 'stud', 'stud' LIKE 'stu_','stud' LIKE '%d','stud' LIKE 't_ _ _', 's' LIKE NULL;
+--------------------+--------------------+------------------+----------------------+---------------+
| 'stud' LIKE 'stud' | 'stud' LIKE 'stu_' | 'stud' LIKE '%d' | 'stud' LIKE 't_ _ _' | 's' LIKE NULL |
+--------------------+--------------------+------------------+----------------------+---------------+
|                  1 |                  1 |                1 |                    0 |          NULL |
+--------------------+--------------------+------------------+----------------------+---------------+
1 row in set (0.00 sec)

3.3.14REGEXP

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]*“匹配任何数量的数字,而”*"匹配任何数量的任何字符。

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)

提示

正则表达式是一个可以进行复杂查询的强大工具,相对于LIKE字符串匹配,它可以使用更多的通配符类型,查询结果更加灵活。

3.4逻辑运算符

逻辑运算符求值所得的结果均为1(TRUE)或0(FALSE),这类运算符有逻辑非(NOT或者!)、逻辑与(AND或者&&)、逻辑或(OR或者||)、逻辑异或(XOR)。

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

运算符作用
NOT或者!逻辑非
AND或者&&逻辑与
OR或者||逻辑或
XOR逻辑异或

3.4.1NOT或者!

逻辑非运算符NOT或者!表示当操作数为0时,所得值为1;当操作数为非零值时,所得值为0;当操作数为NULL时,所得的返回值为NULL。

mysql>  SELECT NOT 10, NOT (1-1), NOT -5, NOT NULL, NOT 1 + 1;
+--------+-----------+--------+----------+-----------+
| NOT 10 | NOT (1-1) | NOT -5 | NOT NULL | NOT 1 + 1 |
+--------+-----------+--------+----------+-----------+
|      0 |         1 |      0 |     NULL |         0 |
+--------+-----------+--------+----------+-----------+
1 row in set (0.00 sec)

mysql>  SELECT !10, !(1-1), !-5, ! NULL, ! 1 + 1;
+-----+--------+-----+--------+---------+
| !10 | !(1-1) | !-5 | ! NULL | ! 1 + 1 |
+-----+--------+-----+--------+---------+
|   0 |      1 |   0 |   NULL |       1 |
+-----+--------+-----+--------+---------+
1 row in set (0.00 sec)

注意最后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。

提示

在使用运算符运算时,一定要注意不同运算符的优先级不同,如果不能确定计算顺序,最好使用括号,以保证运算结果正确。

3.4.2AND或者&&

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

mysql> SELECT  1 AND -1,1 AND 0,1 AND NULL, 0 AND NULL;
+----------+---------+------------+------------+
| 1 AND -1 | 1 AND 0 | 1 AND NULL | 0 AND NULL |
+----------+---------+------------+------------+
|        1 |       0 |       NULL |          0 |
+----------+---------+------------+------------+
1 row in set (0.00 sec)

mysql> SELECT  1 && -1,1 && 0,1 && NULL, 0 && NULL;
+---------+--------+-----------+-----------+
| 1 && -1 | 1 && 0 | 1 && NULL | 0 && NULL |
+---------+--------+-----------+-----------+
|       1 |      0 |      NULL |         0 |
+---------+--------+-----------+-----------+
1 row in set (0.00 sec)

"1 AND NULL"中虽然有NULL,但是没有操作数0,返回结果为NULL。

提示

"AND"运算符可以有多个操作数,但要注意:多个操作数运算时,AND两边一定要使用空格隔开,不然会影响结果的正确性。

3.4.3OR或者||

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

mysql> SELECT  1 OR -1 OR 0, 1 OR 2,1 OR NULL, 0 OR NULL, NULL OR NULL;
+--------------+--------+-----------+-----------+--------------+
| 1 OR -1 OR 0 | 1 OR 2 | 1 OR NULL | 0 OR NULL | NULL OR NULL |
+--------------+--------+-----------+-----------+--------------+
|            1 |      1 |         1 |      NULL |         NULL |
+--------------+--------+-----------+-----------+--------------+
1 row in set (0.00 sec)

mysql> SELECT  1 || -1 || 0, 1 || 2,1 || NULL, 0 || NULL, NULL || NULL;
+--------------+--------+-----------+-----------+--------------+
| 1 || -1 || 0 | 1 || 2 | 1 || NULL | 0 || NULL | NULL || NULL |
+--------------+--------+-----------+-----------+--------------+
|            1 |      1 |         1 |      NULL |         NULL |
+--------------+--------+-----------+-----------+--------------+
1 row in set (0.00 sec)

3.4.4XOR

逻辑异或运算符XOR。当任意一个操作数为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)

提示

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

3.5位运算符

位操作运算符参与运算的操作数按二进制位进行运算,包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)6种。

位运算符是对二进制数进行计算的运算符。位运算符会先将操作数变成二进制数,然后进行位运算,最后再将计算结果从二进制变回十进制数。MySQL中提供的位运算符有按位或(|)、按位与(&)、按位异或(^)、按位左移(<<)、按位右移(>>)、按位取反(~)

运算符
|位或
&位与
^位异或
<<位左移
>>位右移
~位取反,反转所有比特

3.5.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)

10的二进制数值为1010,15的二进制数值为1111,按位或运算之后,结果为1111,即整数15;9的二进制数值为1001,4的二进制数值为0100,2的二进制数值为0010,按位或运算之后,结果为1111,也是整数15。其结果为一个64位无符号整数。

3.5.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)

10的二进制数值为1010,15的二进制数值为1111,按位与运算之后,结果为1010,即整数10;9的二进制数值为1001,4的二进制数值为0100,2的二进制数值为0010,按位与运算之后,结果为0000,即整数0。其结果为一个64位无符号整数。

3.5.3位异或运算符(^)

位异或运算的实质是将参与运算的两个数据按对应的二进制数逐位进行逻辑异或运算。对应位的二进制数不同时,对应位的结果才为1。若两个对应位数都为0或者都为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)

10的二进制数值为1010,15的二进制数值为1111,按位异或运算之后,结果为0101,即整数5;1的二进制数值为0001,0的二进制数值为0000,按位异或运算之后,结果为0001,即整数1;1和1本身二进制位完全相同,因此结果为0。

3.5.4位左移运算符(<<)

位左移运算符"<<"使指定的二进制值的所有位都左移指定的位数。左移指定位数之后,左边高位的数值将被移出并丢弃,右边低位空出的位置用0补齐。语法格式为:expr << n。这里n指定值expr要移位的位数。

mysql> SELECT 1<<2, 4<<2;
+------+------+
| 1<<2 | 4<<2 |
+------+------+
|    4 |   16 |
+------+------+
1 row in set (0.00 sec)

1的二进制值为0000 0001,左移两位之后变成0000 0100,即十进制整数4;4的二进制值为00000100,左移两位之后变成0001 0000,即十进制的16。

3.5.5位右移运算符(>>)

位右移运算符">>"使指定的二进制值的所有位都右移指定的位数。右移指定位数之后,右边低位的数值将被移出并丢弃,左边高位空出的位置用0补齐。语法格式为:expr >> n。这里n指定值expr要移位的位数。

mysql> SELECT 1>>1, 16>>2;
+------+-------+
| 1>>1 | 16>>2 |
+------+-------+
|    0 |     4 |
+------+-------+
1 row in set (0.00 sec)

1的二进制值为0000 0001,右移1位之后变成0000 0000,即十进制整数0;16的二进制值为0001 0000,右移两位之后变成0000 0100,即十进制的4。

3.5.6位取反运算符(~)

位取反运算的实质是将参与运算的数据按对应的二进制数逐位反转,即1取反后变为0,0取反后变为1。

mysql> SELECT 5 & ~1;
+--------+
| 5 & ~1 |
+--------+
|      4 |
+--------+
1 row in set (0.00 sec)

逻辑运算5&~1中,由于位取反运算符"~"的级别高于位与运算符"&",因此先对1取反操作,取反之后,除了最低位为0外,其他位都为1,然后与十进制数值5进行与运算,结果为0100,即整数4。

提示

MySQL经过位运算之后的数值是一个64位的无符号整数,1的二进制数值表示为最右边位为1,其他位均为0,取反操作之后,除了最低位外,其他位均变为1。

可以使用BIN()函数查看1取反之后的结果,SQL语句如下:

mysql> SELECT BIN(~1);
+------------------------------------------------------------------+
| BIN(~1)                                                          |
+------------------------------------------------------------------+
| 1111111111111111111111111111111111111111111111111111111111111110 |
+------------------------------------------------------------------+
1 row in set (0.00 sec)

3.6运算符的优先级

运算符的优先级决定了不同的运算符在表达式中计算的先后顺序。

优先级运算符
最低=(赋值运算)、:=
||、OR
XOR
&&、AND
NOT
BETWEEN、CASE、WHEN、THEN、ELSE
=(比较运算)、<=>、>=、>、<=、<、<>、!=、IS、LIKE、REGEXP、IN、
|
&
<<、>>
-、+
*、/(DIV)、%(MOD)
^
-(负号)、~(位反转)
最高!

一般情况下,级别高的运算符先进行计算,如果级别相同,MySQL按表达式的顺序从左到右依次计算。当然,在无法确定优先级的情况下,可以使用圆括号"()"来改变优先级,并且这样会使计算过程更加清晰。

MySQL中如何使用特殊字符?

诸如单引号(’)、双引号(")、反斜线(\)等符号,这些符号在MySQL中不能直接输入使用,否则会产生意料之外的结果。在MySQL中,这些特殊字符称为转义字符,在输入时需要以反斜线(\)开头,所以在使用单引号和双引号时应分别输入(\’)或者(\"),输入反斜线时应该输入(\\),其他特殊字符还有回车符(\r)、换行符(\n)、制表符(\tab)、退格符(\b)等。在向数据库中插入这些特殊字符时,一定要进行转义处理。

MySQL中如何执行区分大小写的字符串比较?

在Windows平台下,MySQL是不区分大小的,因此字符串比较函数也不区分大小写。如果想执行区分大小写的比较,可以在字符串前面添加BINARY关键字。

mysql> SELECT 'a' = 'A', BINARY 'a' = 'A';
+-----------+------------------+
| 'a' = 'A' | BINARY 'a' = 'A' |
+-----------+------------------+
|         1 |                0 |
+-----------+------------------+
1 row in set (0.00 sec)

本文参考:

《MySQL 5.7从入门到精通(视频教学版)(第2版) 》

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值