mysql学习笔记(四)——数据类型与运算符(详细)

前言

内容比较多,一下子可能会看不完,建议收藏,怕你们以后找不到我了。
在这里插入图片描述

MySQL数据类型介绍

数据表由多列字段构成,每一个字段指定了不同的数据类型,指定了数据类型之后,也就决定了向字段插入的数据内容;
不同的数据类型也决定了 MySQL 在存储它们的时候使用的方式,以及在使用它们的时候选择什么运算符号进行运算;
数值数据类型:TINYINT 、SMALINT 、MEDIUMINT 、INT 、BIGINT 、FLOAT 、DOUBLE 、DECIMAL
日期/时间类型:YEAR 、TIME 、DATE 、DATETIME 、TIMESTAMP
字符串类型:CHAR 、VARCHAR 、BINARY 、VARBINARY 、BLOB 、TEXT 、ENUM 、SET

数值数据类型

  • 数值类型主要用来存储数字,不同的数值类型提供不同的取值范围,可以存储的值范围越大,所需要的存储空间也越大
  • 数值类型分为:①整数类型 ②浮点数类型 ③定点数类型
整数类型

在这里插入图片描述
INT家族合集,都表示数字,用法都一样,区别就是范围不一样而已(见上图),所以下面就以INT举例;

mysql> create table test2 
    -> (
    -> id int(18) primary key auto_increment,
    -> age int(3),
    -> height int(4)
    -> );
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test2 values(1,18,182),(2,20,184),(3,22,183);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0
mysql> select * from test2;
+------+------+--------+
| id   | age  | height |
+------+------+--------+
|    1 |   18 |    182 |
|    2 |   20 |    184 |
|    3 |   22 |    183 |
+------+------+--------+
3 rows in set (0.00 sec)

浮点数类型和定点数类型
  1. MySQL 中使用浮点数和定点数来表示小数,浮点数有两种类型:单精度浮点数(FLOAT)和双精度浮点数(DOUBLE),定点数只有 DECIMAL;
  2. 浮点数和定点数都可以用(M,N) 来表示,其中 M 是精度,表示总共的位数,N 是标度,表示小数的位数;
  3. DECIMAL 实际是以字符串形式存放的,在对精度要求比较高的时候(如货币、科学数据等)使用DECIMAL 类型会比较好;
  4. 浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围,它的缺点是会引起精度问题

在这里插入图片描述
例子:

mysql> alter table test2 add t1 float(10,5);
Query OK, 0 rows affected (0.08 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table test2 add t2 decimal(15,10);
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> insert into test2 (t1) values(123.1234567);
Query OK, 1 row affected (0.00 sec)
mysql> insert into test2 (t2) values(12346.1234567);
Query OK, 1 row affected (0.01 sec)
mysql> select * from test2;
+----+------------+--------+-----------+------------------+
| id | age        | height | t1        | t2               |
+----+------------+--------+-----------+------------------+
|  1 |         18 |    182 |      NULL |             NULL |
|  2 |         20 |    184 |      NULL |             NULL |
|  3 |         22 |    183 |      NULL |             NULL |
|  4 |       2155 |   NULL |      NULL |             NULL |
|  5 |      21550 |   NULL |      NULL |             NULL |
|  6 | 1234679826 |   NULL |      NULL |             NULL |
|  7 |       NULL |   NULL |` 123.12346 `|             NULL |
|  8 |       NULL |   NULL |      NULL |` 12346.1234567000 `|
+----+------------+--------+-----------+------------------+
8 rows in set (0.00 sec)

从第条插入数据看出,小数点后不到10位会用0补充,
如果超过定义的小数点后面的范围即N的范围 ,则不会显示

mysql> insert into test2 (t1) values(12.12345678);
Query OK, 1 row affected (0.00 sec)

mysql> select * from test2;
+----+------------+--------+-----------+------------------+
| id | age        | height | t1        | t2               |
+----+------------+--------+-----------+------------------+
|  1 |         18 |    182 |      NULL |             NULL |
|  2 |         20 |    184 |      NULL |             NULL |
|  3 |         22 |    183 |      NULL |             NULL |
|  4 |       2155 |   NULL |      NULL |             NULL |
|  5 |      21550 |   NULL |      NULL |             NULL |
|  6 | 1234679826 |   NULL |      NULL |             NULL |
|  7 |       NULL |   NULL | 123.12346 |             NULL |
|  8 |       NULL |   NULL |      NULL | 12346.1234567000 |
|  9 |       NULL |   NULL |` 12.12346 `|             NULL |
+----+------------+--------+-----------+------------------+
9 rows in set (0.00 sec)

MySQL 日期/时间类型

  1. MySQL 有多种表示日期的数据类型,比如,当只记录年信息的时候,可以使用 YEAR 类型,而没有必要使用 DATE 类型
  2. 每一个类型都有合法的取值范围,当指定确实不合法的值时系统将 “零” 值插入到数据库中

在这里插入图片描述

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 ~ 206970 ~ 99 被转换为 1970 ~ 1999

看不懂???
举个例子一下就明白了

mysql> alter table classes add t1 YEAR;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> insert into classes (t1) values ('1999'),('2008'),('89'),('20');
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * from classes;
+------+-----------+--------------+------+
| id   | level     | name         | t1   |
+------+-----------+--------------+------+
|    1 | good      | NULL         | NULL |
|    2 | wxcellent | NULL         | NULL |
|    3 | bad       | NULL         | NULL |
| NULL | NULL      | lisi         | NULL |
| NULL | NULL      | chengjisihan | NULL |
| NULL | NULL      | NULL         | 1999 |
| NULL | NULL      | NULL         | 2008 |
| NULL | NULL      | NULL         | 1989 |
| NULL | NULL      | NULL         | 2020 |
+------+-----------+--------------+------+
9 rows in set (0.00 sec)

注意:这里也是有范围的,20世纪(1900)之前,22世纪中旬(2155)之后都不可用,那咋办?
emm
等到2156年吧,我就去告诉你!!!

mysql> insert into classes (t1) values (2156);
ERROR 1264 (22003): Out of range value for column 't1' at row 1

mysql> insert into classes (t1) values (1900);
ERROR 1264 (22003): Out of range value for column 't1' at row 1

TIME
  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;
mysql> alter table classes add t2 time;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> insert into classes (t2) values ("17:29:54");
Query OK, 1 row affected (0.00 sec)
mysql> select * from classes;
+------+-----------+--------------+------+----------+
| id   | level     | name         | t1   | t2       |
+------+-----------+--------------+------+----------+
|    1 | good      | NULL         | NULL | NULL     |
|    2 | wxcellent | NULL         | NULL | NULL     |
|    3 | bad       | NULL         | NULL | NULL     |
| NULL | NULL      | lisi         | NULL | NULL     |
| NULL | NULL      | chengjisihan | NULL | NULL     |
| NULL | NULL      | NULL         | 1999 | NULL     |
| NULL | NULL      | NULL         | 2008 | NULL     |
| NULL | NULL      | NULL         | 1989 | NULL     |
| NULL | NULL      | NULL         | 2020 | NULL     |
| NULL | NULL      | NULL         | NULL | 17:29:54 |
+------+-----------+--------------+------+----------+
10 rows in set (0.00 sec)

mysql> insert into classes (t2) values("2102450");
Query OK, 1 row affected (0.00 sec)
mysql> insert into classes (t2) values("2 10:24:50");
Query OK, 1 row affected (0.00 sec)

在这里插入图片描述

date
  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;
mysql> insert into test1 (日期) values('20200617');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test1 (日期) values('2020-06-16');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test1 (日期) values('200615');
Query OK, 1 row affected (0.01 sec)

mysql> select * from test1;
+---------+---------------------+------------+
| s       | location            | 日期       |
+---------+---------------------+------------+
| a       | NULL                | NULL       |
| a,b,d   | NULL                | NULL       |
| a,b,c,d | NULL                | NULL       |
| NULL    | This is an example! | NULL       |
| NULL    | haha123.com!        | NULL       |
| NULL    | NULL                | 2020-06-17 |
| NULL    | NULL                | 2020-06-16 |
| NULL    | NULL                | 2020-06-15 |
+---------+---------------------+------------+
7 rows in set (0.00 sec)

DATETIME
  1. DATETIME 类型的格式为YYYY-MM-DD HH:MM:SS ,其中,YYYY 表示年,MM 表示月,DD 表示日,HH 表示小时,MM 表示分钟,SS 表示秒
  2. 格式:‘YYYY-MM-DD HH:MM:SS’ 或 ‘YYYYMMDDHHMMSS’ ,字符串格式,取值范围为 ‘1000-01-0100: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 ,数字格式,取值范围同上
mysql> alter table test1 add datetime datetime;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> insert into test1 (datetime) values ("2020-06-17 21:40:56");
Query OK, 1 row affected (0.00 sec)
mysql> select * from  test1;
+---------+---------------------+------------+---------------------+
| s       | location            | 日期       | datetime            |
+---------+---------------------+------------+---------------------+
| a       | NULL                | NULL       | NULL                |
| a,b,d   | NULL                | NULL       | NULL                |
| a,b,c,d | NULL                | NULL       | NULL                |
| NULL    | This is an example! | NULL       | NULL                |
| NULL    | haha123.com!        | NULL       | NULL                |
| NULL    | NULL                | 2020-06-17 | NULL                |
| NULL    | NULL                | 2020-06-16 | NULL                |
| NULL    | NULL                | 2020-06-15 | NULL                |
| NULL    | NULL                | NULL       | 2020-06-17 21:40:56 |
+---------+---------------------+------------+---------------------+
9 rows in set (0.00 sec)

TIMESTAMP
  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 是世界标准时间,存储时会对当前时区进行转换,检索时再转换回当前时区.
mysql> alter table test1 add timestamp timestamp;
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> insert into test1 (timestamp) values ("2020-06-18 00:00:01");
Query OK, 1 row affected (0.00 sec)

mysql> select * from test1;
+---------+---------------------+------------+---------------------+---------------------+
| s       | location            | 日期       | datetime            | timestamp           |
+---------+---------------------+------------+---------------------+---------------------+
| a       | NULL                | NULL       | NULL                | 2020-06-17 21:53:36 |
| a,b,d   | NULL                | NULL       | NULL                | 2020-06-17 21:53:36 |
| a,b,c,d | NULL                | NULL       | NULL                | 2020-06-17 21:53:36 |
| NULL    | This is an example! | NULL       | NULL                | 2020-06-17 21:53:36 |
| NULL    | haha123.com!        | NULL       | NULL                | 2020-06-17 21:53:36 |
| NULL    | NULL                | 2020-06-17 | NULL                | 2020-06-17 21:53:36 |
| NULL    | NULL                | 2020-06-16 | NULL                | 2020-06-17 21:53:36 |
| NULL    | NULL                | 2020-06-15 | NULL                | 2020-06-17 21:53:36 |
| NULL    | NULL                | NULL       | 2020-06-17 21:40:56 | 2020-06-17 21:53:36 |
| NULL    | NULL                | NULL       | NULL                | 2020-06-18 00:00:01 |
+---------+---------------------+------------+---------------------+---------------------+
10 rows in set (0.01 sec)
# 配置完会发现除了修改的时间戳其他的都已经改成了本地的时间

字符串类型

  1. 字符串类型用来存储字符串数据,还可以存储比如图片和声音的二进制数据
  2. MySQL 支持两种字符串类型:文本字符串二进制字符串

文本字符串如下:
在这里插入图片描述

CHAR 和 VARCHAR
  1. CHAR(M) 为固定长度的字符串,在定义时指定字符串列长,当保存时在右侧填充空格以达到指定的长度,M 表示列长度,取值范围是 0~255 个字符,例如,CHAR(4) 定义了一个固定长度的字符串列,其包含的字符个数最大为 4,当检索到 CHAR 值时,尾部的空格将被删掉;
  2. VARCHAR(M) 为可变长度的字符串,M 表示最大列长度,取值范围是 0~65535;
# CHAR固定字符串
mysql> alter table classes add name char(4);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> insert into classes (name) values("lisi");
Query OK, 1 row affected (0.01 sec)

mysql> insert into classes (name) values("chengjisihan");
ERROR 1406 (22001): Data too long for column 'name' at row 1
mysql> 
# VARCHAR可变字符串
mysql> alter table classes modify name varchar(25);
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> insert into classes (name) values("chengjisihan");
Query OK, 1 row affected (0.01 sec)

mysql> select * from classes
    -> ;
+------+-----------+--------------+
| id   | level     | name         |
+------+-----------+--------------+
|    1 | good      | NULL         |
|    2 | excellent | NULL         |
|    3 | bad       | NULL         |
| NULL | NULL      | lisi         |
| NULL | NULL      | chengjisihan |
+------+-----------+--------------+
5 rows in set (0.01 sec)

TEXT
  1. TINYTEXT 最大长度为 255 个字符
  2. TEXT 最大长度为65536 个字符
  3. MEDIUMTEXT 最大长度为 16777215个字符
  4. LONGTEXT 最大长度为 4294967295 个字符

注:TEXT家族用法都一样,只是长度不同,就不一一举例了,根据自己的需求改变长度即可

mysql> alter table test1 add location text;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc test1;
+----------+----------------------+------+-----+---------+-------+
| Field    | Type                 | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+-------+
| s        | set('a','b','c','d') | YES  |     | NULL    |       |
| location | text                 | YES  |     | NULL    |       |
+----------+----------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> insert into test1(location) values("This is an example");
Query OK, 1 row affected (0.00 sec)

mysql> select * from test1;
+---------+--------------------+
| s       | location           |
+---------+--------------------+
| a       | NULL               |
| a,b,d   | NULL               |
| a,b,c,d | NULL               |
| NULL    | This is an example |
+---------+--------------------+
4 rows in set (0.00 sec)

ENUM

ENUM 是一个字符串对象,其值为表创建时在列规定中枚举(即列举)的一列值,即就像做多选题一样,只能在给出的选项里面选择,语法格式为:字段名 ENUM ('值1', '值2', ..... '值n') 字段名指将要定义的字段,值 n 指枚举列表中的第 n 个值,ENUM类型的字段在取值时,只能在指定的枚举列表中取,而且一次只能取一个,列表值所允许的成员值从 1 开始编号,MySQL 存储的就是这个索引编号。

mysql> create table classes
    -> (
    -> id int,
    -> level enum('excellent','good','bad')
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> 
mysql> insert into classes values(1,'good'),(2,1),(3,3); #后两个根据索引插入的
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from classes;
+------+-----------+
| id   | level     |
+------+-----------+
|    1 | good      |
|    2 | excellent |
|    3 | bad       |
+------+-----------+
3 rows in set (0.00 sec)

mysql> insert into classes values(4,'best');  // 如果插入一个没有定义过的枚举值'best'会报错
ERROR 1265 (01000): Data truncated for column 'level' at row 1
SET
  1. SET 是一个字符串对象,可以有零个或多个值,SET 列最多可以有 64 个成员,其值为表创建时规定的一列值,语法:SET('值1','值2',...... '值n')
  2. 与 ENUM 类型相同,SET 值在内部用整数表示,列表中每一个值都有一个索引编号;
  3. 与 ENUM 类型不同的是,ENUM 类型的字段只能从定义的列值中选择一个值插入,而 SET 类型的列可从定义的列值中选择多个字符的联合
  4. 如果插入 SET 字段中列值有重复,则 MySQL 自动删除重复的值,插入 SET 字段的值的顺序并不重要,MySQL 会在存入数据库时,按照定义的顺序显示
mysql> create table test1 (s set('a','b','c','d'));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into test1 values ('a'),('a,b,a,d'),('d,b,a,c');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select  * from  test1;
+---------+
| s       |
+---------+
| a       |
| a,b,d   |
| a,b,c,d |
+---------+
3 rows in set (0.00 sec)

二进制字符串如下:
二进制字符串会应用到一些安全系数要求比较高的场景
在这里插入图片描述

BIT
  1. BIT 数据类型用来保存位字段值,即以二进制的形式来保存数据,如保存数据 13,则实际保存的是 13 的二进制值,即 1101;
  2. BIT 是位字段类型,BIT(M) 中的 M 表示每个值的位数,范围为 1~64 ,如果 M 被省略,则默认为 1 ,如果为 BIT(M) 列分配的值的长度小于 M 位,则在值得左边用 0 填充;
  3. 如果需要位数至少为 4 位的 BIT 类型,即可定义为 BIT(4) ,则最大 可插入的数据为15(1111);
mysql> create table test2(b BIT(4));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into test2 values (2),(9),(15);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from test2;
+------+
| b    |
+------+
|     |
| 	    |
|     |
+------+
3 rows in set (0.00 sec)

mysql> select BIN(b+0) from test2;
+----------+
| BIN(b+0) |
+----------+
| 10       |
| 1001     |
| 1111     |
+----------+
3 rows in set (0.00 sec)

mysql> insert into test2 values (16);
ERROR 1406 (22001): Data too long for column 'b' at row 1
mysql> 
# M定义为4最大十进制数为15,至于为什莫,参考100以内自然数二进制转换
BINARY 和 VARBINARY
  1. BINARY 和 VARBINARY 类型类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字节字符串;
  2. BINARY 类型的长度是固定的,指定长度之后,不足最大长度的,将在它们右边填充 ‘\0’ 以补齐指定长度;
  3. VARBINARY 类型的长度是可变的,指定长度之后,其长度可以在0 到最大值之间,
mysql> create table test3
    -> (
    -> b binary(3), 	 # 定义固定长度为3的BINARY类型
    -> vb varbinary(30)  # 定义可变长度为30的VARBINARY类型
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> insert into test3 values(5,5);
Query OK, 1 row affected (0.00 sec)

mysql> select * from test3;
+------+------+
| b    | vb   |
+------+------+
| 5    | 5    |
+------+------+
1 row in set (0.00 sec)

mysql> select length(b),length(vb) from test3;
+-----------+------------+
| length(b) | length(vb) |
+-----------+------------+
|         3 |          1 |  # BINARY占用的空间为固定的指定的值
|			|			 |	# VARBINARY占用的空间为可变的插入的值
+-----------+------------+
1 row in set (0.00 sec)

插入多行值以后,发现下面情况,定义的binary占用空间是固定值,varbinary可变,并且定义长度为30,包括的范围是0到最大值;

mysql> select * from test3;
+------+--------+
| b    | vb     |
+------+--------+
| 5    | 5      |
| 2    | 5      |
| 8    | 5      |
| 8    | 8      |
| 25   | 100    |
| 100  | 625    |
| 100  | 1625   |
| 100  | 0      |
| 100  | 165254 |
+------+--------+
9 rows in set (0.00 sec)

mysql> select length(b),length(vb) from test3;
+-----------+------------+
| length(b) | length(vb) |
+-----------+------------+
|         3 |          1 |
|         3 |          1 |
|         3 |          1 |
|         3 |          1 |
|         3 |          3 |
|         3 |          3 |
|         3 |          4 |
|         3 |          1 |
|         3 |          6 |
+-----------+------------+
9 rows in set (0.00 sec)

运算符介绍

根据运算符的作用,我们大致可分为4类

  • 比较运算符
  • 算术运算符
  • 逻辑运算符
  • 位移运算符

比较运算符

在这里插入图片描述

等于运算符 ( = )

等于运算符用来判断数字字符串表达式是否相等,如果相等,则返回值为 1 ,否则返回值为 0 ,如果有一个值是NULL,则比较结果为 NULL

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

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

这个操作符和等于运算符(=)的作用一致,只不过多了一个功能,就是可以判断 NULL 值

mysql> select 1<=>0,'2'<=>2,(1+3)<=>(2+2),1<=>null;
+-------+---------+---------------+----------+
| 1<=>0 | '2'<=>2 | (1+3)<=>(2+2) | 1<=>null |
+-------+---------+---------------+----------+
|     0 |       1 |             1 |        0 |
+-------+---------+---------------+----------+
1 row in set (0.00 sec)

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

不等于运算符用于判断数字字符串表达式是否不相等,如果不相等则返回 1,否则返回0,但是不能判断NULL 值;

mysql> select 'good'<>'god',1<>2,4!=4,null!=null;
+---------------+------+------+------------+
| 'good'<>'god' | 1<>2 | 4!=4 | null!=null |
+---------------+------+------+------------+
|             1 |    1 |    0 |       NULL |
+---------------+------+------+------------+
1 row in set (0.01 sec)

IS NULL 、ISNULL 、IS NOT NULL
  1. IS NULL 和 ISNULL 检验一个值是否为 NULL ,如果为 NULL ,返回值为 1,否则返回值为 0;
  2. IS NOT NULL 检验一个值是否不为 NULL ,如果不为 NULL ,返回值为 1,否则返回值为0;

样板:

mysql> select * from test2;
+----+------------+--------+-----------+------------------+
| id | age        | height | t1        | t2               |
+----+------------+--------+-----------+------------------+
|  1 |         18 |    182 |      NULL |             NULL |
|  2 |         20 |    184 |      NULL |             NULL |
|  3 |         22 |    183 |      NULL |             NULL |
|  4 |       2155 |   NULL |      NULL |             NULL |
|  5 |      21550 |   NULL |      NULL |             NULL |
|  6 | 1234679826 |   NULL |      NULL |             NULL |
|  7 |       NULL |   NULL | 123.12346 |             NULL |
|  8 |       NULL |   NULL |      NULL | 12346.1234567000 |
|  9 |       NULL |   NULL |  12.12346 |             NULL |
+----+------------+--------+-----------+------------------+
9 rows in set (0.00 sec)

mysql> select t1 is null from test2 where id=1;
+------------+
| t1 is null |
+------------+
|          1 |
+------------+
1 row in set (0.00 sec)
mysql> select t1 is not null from test2 where id=1;
+----------------+
| t1 is not null |
+----------------+
|              0 |
+----------------+
1 row in set (0.00 sec)

BETWEEN AND

用于判断一个值是否落在两个值之间,正确返回1,否则返回0;

mysql> select age between 16 and 20 from test2 where id=1;
+-----------------------+
| age between 16 and 20 |
+-----------------------+
|                     1 |
+-----------------------+
1 row in set (0.00 sec)

mysql> 

LEAST 、GREATEST
  1. LEAST :当有两个或多个参数时,返回最小值,如果有一个值是 NULL ,则返回结果为 NULL
  2. GREATEST :当有两个或多个参数时,返回最大值,如果有一个值是 NULL ,则返回结果为 NULL
mysql> select least (2,0);
+-------------+
| least (2,0) |
+-------------+
|           0 |
+-------------+
1 row in set (0.00 sec)

mysql> select greatest (2,0);
+----------------+
| greatest (2,0) |
+----------------+
|              2 |
+----------------+
1 row in set (0.01 sec)

IN 、NOT IN
  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 |
+--------------+------------------+
1 row in set (0.00 sec)

LIKE
  1. LIKE 运算符用来匹配字符串,如果匹配则返回1,如果不匹配则返回 0;
  2. LIKE 使用两种通配符:'%'用于匹配任何数目的字符,包括零字符 ;'_'只能匹配一个字符
mysql> select height like '18%' from test2;
+-------------------+
| height like '18%' |
+-------------------+
|                 1 |
|                 1 |
|                 1 |
|              NULL |
|              NULL |
|              NULL |
|              NULL |
|              NULL |
|              NULL |
+-------------------+
9 rows in set (0.00 sec)

PS:这里要注意和select查询时的模糊查询,在运算符里面给你回传的结果是1或0,只是有没有的问题,模糊查询回传的是查询结果,一般会和where条件语句连接词一起使用,如下

mysql> select * from test2 where height like '18%';
+----+------+--------+------+------+
| id | age  | height | t1   | t2   |
+----+------+--------+------+------+
|  1 |   18 |    182 | NULL | NULL |
|  2 |   20 |    184 | NULL | NULL |
|  3 |   22 |    183 | NULL | NULL |
+----+------+--------+------+------+
3 rows in set (0.00 sec)

REGEXP
  1. REGEXP 运算符用来匹配字符串,如果匹配则返回 1,如果不匹配则返回 0;
  2. REGEXP 使用几种通配符:
    ‘^’ 用于匹配以什么开头的字符串
    ‘$’ 用于匹配以什么结尾的字符串
    ‘.’ 用于匹配任何一个单字符串
    ‘[…]’ 用于匹配在方括号内的任何字符
    ‘*’ 用于匹配零个或多个在它前面的字符
mysql> select age regexp '^2' from test2;
+-----------------+
| age regexp '^2' |
+-----------------+
|               0 |
|               1 |
|               1 |
|               1 |
|               1 |
|               0 |
|            NULL |
|            NULL |
|            NULL |
+-----------------+
9 rows in set (0.00 sec)

PS:通常也被应用到select查询中,也叫正则表达式查询,

mysql> select * from test2 where age regexp '^2';
+----+-------+--------+------+------+
| id | age   | height | t1   | t2   |
+----+-------+--------+------+------+
|  2 |    20 |    184 | NULL | NULL |
|  3 |    22 |    183 | NULL | NULL |
|  4 |  2155 |   NULL | NULL | NULL |
|  5 | 21550 |   NULL | NULL | NULL |
+----+-------+--------+------+------+
4 rows in set (0.00 sec)

算术运算符

  • +:加法运算
  • -:减法运算
  • *:乘法运算
  • / :除法运算,返回商
  • % :求余运算,返回余数
mysql> create table test3 (num int);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into test3 values(64);
Query OK, 1 row affected (0.00 sec)

mysql> select num,num+10,num-3,num*3,num/3,num%3 from test3;
+------+--------+-------+-------+---------+-------+
| num  | num+10 | num-3 | num*3 | num/3   | num%3 |
+------+--------+-------+-------+---------+-------+
|   64 |     74 |    61 |   192 | 21.3333 |     1 |
+------+--------+-------+-------+---------+-------+
1 row in set (0.00 sec)

mysql> 

逻辑运算符

在这里插入图片描述

逻辑非 ( NOT 或 !)
  1. 当操作数为 0 时,所得值为 1
  2. 当操作数为非 0 时,所得值为 0
  3. 当操作数为 NULL 时,所得值为 NULL
mysql> select not 10,not 10-10,!(10-5),! null;
+--------+-----------+---------+--------+
| not 10 | not 10-10 | !(10-5) | ! null |
+--------+-----------+---------+--------+
|      0 |         1 |       0 |   NULL |
+--------+-----------+---------+--------+
1 row in set (0.00 sec)
逻辑与 ( AND 或 && )
  1. 当所有操作数均为非零值、并且不为 NULL 时,所得值为 1
  2. 当一个或多个操作数为 0 时,所得值为 0
  3. 其余情况所得值为 NULL
mysql> select 10 and 5,(10-10) and 5,5 && null;
+----------+---------------+-----------+
| 10 and 5 | (10-10) and 5 | 5 && null |
+----------+---------------+-----------+
|        1 |             0 |      NULL |
+----------+---------------+-----------+
1 row in set (0.00 sec)

逻辑或 ( OR 或 || )
  1. 当两个操作数均为非 NULL 值,且任意一个操作数为非零值时,结果为 1 ,否则为 0
  2. 当有一个操作数为 NULL ,且另一个操作数为非零值时,则结果为 1 ,否则结果为 NULL
  3. 当两个操作数均为 NULL 时,则所得结果为 NULL
mysql> select (5*2)||(0*5),(5*3)||(5-3),null||(5/2),null||null;
+--------------+--------------+-------------+------------+
| (5*2)||(0*5) | (5*3)||(5-3) | null||(5/2) | null||null |
+--------------+--------------+-------------+------------+
|            1 |            1 |           1 |       NULL |
+--------------+--------------+-------------+------------+
1 row in set (0.00 sec)

逻辑异或 ( XOR )
  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,1 xor 0,1 xor null;
+---------+---------+------------+
| 1 xor 1 | 1 xor 0 | 1 xor null |
+---------+---------+------------+
|       0 |       1 |       NULL |
+---------+---------+------------+
1 row in set (0.00 sec)

位运算符

全部针对二进制形式进行的操作
在这里插入图片描述

位或运算符 ( | )

对应的二进制位有一个或两个为 1 ,则该位的运算结果为 1 ,否则为 0

mysql> select 10 | 15 , 9 | 4 | 2 ;
+---------+-----------+
| 10 | 15 | 9 | 4 | 2 | # 10的二进制为1010,15的二进制为1111,按位或运算之后结果为1111,即15
+---------+-----------+ # 9的二进制为1001,4为0100,2的二进制为0010,按位或运算之后1111,也是15
|      15 |        15 |
+---------+-----------+
1 row in set (0.00 sec)
****************************************************************
为什么是15?我们来用二进制算一下,以第一组为例
128 64 32 16 8 4 2 1 #二进制
             1 0 1 0 #二进制10的表示
             1 1 1 1 #二进制15的表示
根据位或规则得 `1 1 1 1`,对应起来十进制数就是15
位与运算符 ( & )

对应的二进制位都为 1 ,则该位的运算结果为 1 ,否则为 0

mysql> select 10 & 15 , 9 & 4 & 2 ;
+---------+-----------+
| 10 & 15 | 9 & 4 & 2 |
+---------+-----------+
|      10 |         0 |
+---------+-----------+
1 row in set (0.00 sec)

位异或运算符 ( ^ )

对应的二进制位不相同时,结果为 1 ,否则为 0

mysql> select 10 ^ 15 , 9 ^ 4 ^ 2 ;
+---------+-----------+
| 10 ^ 15 | 9 ^ 4 ^ 2 |
+---------+-----------+
|       5 |        15 |
+---------+-----------+
1 row in set (0.00 sec)

位左移运算符 ( << )

使指定的二进制位都左移指定的位数,左移指定位之后,左边高位的数值将被移出并丢弃,右边低位空出的位置用 0 补齐

mysql> select 1<<2 , 4<<2 ;
+------+------+
| 1<<2 | 4<<2 | # 1的二进制值为00000001,左移两位之后变成00000100,即十进制数4
+------+------+ # 4的二进制值为00000100,左移两位之后变成00010000,即十进制数16
| 4 | 16 |
+------+------+
位右移运算符 ( >> )

使指定的二进制位都右移指定的位数,右移指定位之后,右边低位的数值将被移出并丢弃,左边高位空出的职位用 0 补齐

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

位取反运算符 ( ~ )

将对应的二进制数逐位反转,即 1 取反后变 0 , 0 取反后变 1

mysql> select 5 & ~1;
+--------+
| 5 & ~1 |
+--------+
|      4 |
+--------+
1 row in set (0.00 sec)
************************************************************
4是怎么得来的?
 5=0101
~1=1110
位与以后得0100,换成十进制就是4

运算符优先级比较

从低到高:
=(赋值运算) || or
XOR
&& AND
NOT
BETWEEN
=(比较运算)<=>>=<><=< >!= ,IS, LIKE, IN ,REGEXP
|&
<< >>
- +
* / %
-(负号) ~(位取反) !
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值