MySQL的数据类型和运算符

一、数据类型介绍

(1)数据表由多个字段组成,每一个字段都有制定自己的数据类型,指定了数据类型后,也就决定了向字段插入数据的内容;
(2)不同的数据类型也决定了MySQL在存储数据的时候使用的方式,以及在使用数据的时候选择什么运算符进行运算;
(3)数值数据类型:TINYINT 、SMALLINT、MEDIUMINT、INT、BIGINT、FLOAT、DOUBLE、DECIMAL
(4)日期\时间数据类型:YEAR、TIME、DATE、DATETIME、TIMESTAMP
(5)字符串数据类型:CHAR 、VARCHAR、BINARY、 VARBINARY、BLOB、TEXT、ENUM、SET

二、数值类数据类型

(1)数值类数据类型主要用来存储数字,不同的数值类型提供不同的取值范围,可以存储的值范围越大,需要的存储空间也越大;
(2)数值型分为:整数类型、浮点数类型、定点数类型;

1、整数类型(整数类型的属性字段可以添加AUTO_INCREMENT 自增约束条件)
类型名称说明存储需求有符号取值范围无符号取值范围
TINYINT很小的整数1个字节-128 ~ 1270 ~ 255
SMALLINT小的整数2个字节-32768 ~ 327670 ~ 65535
MEDIUMINT中等大小的整数3个字节-8388608 ~ 83886070 ~ 16777215
INT普通大小的整数4个字节-2147483648 ~ 21474836470 ~ 4294967295
BIGINT大整数8个字节-9223372036854775808 ~ 92233720368547758070 ~ 18446744073709551615
2、浮点数类型和定点数类型:

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

类型名称说明存储需求有符号取值范围无符号取值范围
FLOAT单精度浮点数4个字节(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)0,(1.175 494 351 E-38,3.402 823 466 E+38)
DOUBLE双精度浮点数8个字节(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)
DECIMAL定点数M +2个字节不固定 依赖于M和D的值不固定 依赖于M和D的值

三、日期时间类型

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

类型名称日期格式日期范围存储需求
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字节
TIMESTAMPUTCYYYY-MM-DD HH:MM:SS1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:074字节
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-31’
(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支持两种字符串类型:文本字符串和二进制字符串
在这里插入图片描述
VARBINARY的存储需求是L+1,L<M

五、如何选择数据类型

1.整数和浮点数及定点数

(1)如果不需要小数部分,则使用整数来保存数据,如果需要表示小数部分,则使用浮点数类型和定点数。对于浮点数据列,存入的数值会对该列定义的小数位进行四舍五入
(2)浮点数类型中,DOUBLE类型精度比FLOAT类型高,因此,如果要求存储精度较高时,应选择DOUBLE类型,当然DOUBLE它占用的存储空间要大一些。
(3)浮点数相对于定点数DECIMAL的优势是:在长度一定的情况下,浮点数能表示的数据范围更大。但是由于浮点数容易产生误差,因此对精度要求高,建议用定点数
(4)DECIMAL在MySQL当中是以字符串存储的,用于定义货币等对精度要求高的数据。在数据迁移中,FLOAT(M,N)是非标准的SQL定义,所以数据迁移时可能会出现问题,最好不要用。
(5)另外两种浮点数在进行运算的时候也容易出问题,所以如果进行数值比较,最好用定点数

2.日期和时间类型:

(1)如果只需要记录年份,用YEAR类型;如果只需要记录时间,用TIME类型
(2)如果同时记录日期时间,可以使用DATETIME或者是TIMESTAMP这两种类型;TIMESTAMP的取值范围小于DATETIME
(3)默认情况下,当插入一条记录但并没有指定TIMESTAMP这个列值时,MySQL默认会把TIMESTAMP列设为当前时间。
3.字符串:
3.1 CHAR和VARCHAR:
(1)CHAR(M)是固定长度字符,VARCHAR(M)是可变长度的字符;CHAR会自动删除插入数据尾部的空格,VARCHAR不会删除尾部空格
(2)CHAR是固定长度,所以它的处理速度比VARCHAR的速度更快,但是浪费存储空间
(3)具体选择CHAR还是VARCHAR类型,也要参考数据表的存储引擎。对于MyISAM引擎,最好使用固定长度的数据列代替可变长度的数据列。这样可以使整个表静态化,从而使数据检索速度更快,用空间换时间。对于InnoDB引擎,使用可变长度的数据列,因为InnoDB数据表的存储格式不分固定长度和可变长度,因此使用CHAR不一定比使用VARCHAR更快,但由于VARCHAR是按照实际的长度来存储的,比较节省空间,对磁盘I/O和数据存储总量比较好。
3.2 BIT
(1)BIT数据类型用来保存位字段值,即以二进制的形式来保存数据;例如:保存数据13,则实际保存的是13的二进制值,1101;
(2)BIT是位字段类型,BIT(M)中的M表示每个值的位数,范围为1–64,如果M被省略,则默认M为1,如果BIT(M)列分配的值长度小于M位,则在值得左边用\x00来填充
(3)如果需要位数至少为4位的BIT类型,即可定义BIT(4),则转换为二进制后大于1111的数据插入时会有误差,它只能显示位数为4的最大值。比如我们插入的值是16,16的二进制是10000,它的位数是5,但是规定是4,所以只能存入15,就产生了误差。

3.3 BINARY和VARBINARY
(1)BINARY和VARBINARY类型类似于CHAR和VARCHAR,不同的是他们包含二进制字符串
(2)BINARY类型是固定长度的,指定长度后,不足最大长度,将在他们的右边填充\x00,以补齐指定长度
(3)VARBINARY类型的长度是可变的,指定长度之后,其长度可以在0到最大值之间

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

3.5 ENUM和SET

(1)ENUM只能取单值(只能取它给出的值得其中之一),他的数据列表是一个枚举集合。它的列举的值最多可以有65535个
(2)SET可以取多个值。它的列表中最多可列举64个值
(3)ENUM和SET的值是以字符串形式出现的,但在内部MySQL以数值的形式进行存储的
ENUM
(1)在基本的数据类型中,无外乎就是写数字和字符串,但是某些事物是较难用数字和字符来准确的表示的。比如一周有7天,分别是Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,如果我们用数字0,1,2,3,4,5,6来表示这七天,那么多下来的数字该怎么办?而且这样设置很容易让数据出错,超出取值范围。这种情况下,我们就可以用枚举这种数据类型来自定义取值范围。ENUM是一个字符串对象,其值为表创建时,在字段中规定的ENUM列举出来的那些值中的一个。
语法:字段名 ENUM(‘值1’,‘值n’)
我们在取枚举中的值得时候还可以使用它的(索引)下标,下标的值从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 int_tb
    -> (
    -> a TINYINT,
    -> b SMALLINT,
    -> c MEDIUMINT,
    -> d INT,
    -> e BIGINT
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> desc int_tb;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| a     | tinyint(4)   | YES  |     | NULL    |       |
| b     | smallint(6)  | YES  |     | NULL    |       |
| c     | mediumint(9) | YES  |     | NULL    |       |
| d     | int(11)      | YES  |     | NULL    |       |
| e     | bigint(20)   | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

mysql> CREATE TABLE float_tb
    -> (
    -> a FLOAT(3,2),
    -> B DOUBLE(5,3),
    -> C DECIMAL(5,3)
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> desc float_tb;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| a     | float(3,2)   | YES  |     | NULL    |       |
| B     | double(5,3)  | YES  |     | NULL    |       |
| C     | decimal(5,3) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> create table date_tb
    -> (
    -> a YEAR,
    -> b DATE,
    -> c TIME,
    -> d DATETIME,
    -> e TIMESTAMP
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> desc date_tb;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type      | Null | Key | Default           | Extra                       |
+-------+-----------+------+-----+-------------------+-----------------------------+
| a     | year(4)   | YES  |     | NULL              |                             |
| b     | date      | YES  |     | NULL              |                             |
| c     | time      | YES  |     | NULL              |                             |
| d     | datetime  | YES  |     | NULL              |                             |
| e     | timestamp | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+-------------------+-----------------------------+
5 rows in set (0.01 sec)
往表里插入数据的语法:

INSERT INTO 表名 (字段1,字段2,字段N…)VALUES (值1,值2,值N…),(值1,值2,值N…)…

mysql> CREATE DATABASE lpx; //创建数据库
Query OK, 1 row affected (0.00 sec)

mysql> USE lpx;
Database changed
mysql> create table books
    -> (
    -> b_id int(11) PRIMARY KEY NOT NULL UNIQUE,
    -> b_name varchar(50) not null,
    -> authors varchar(100) not null,
    -> price float not null,
    -> pubdate year not null,
    -> note varchar(100),
    -> num int(11) not null
    -> );  //创建指定格式内容的数据表
Query OK, 0 rows affected (0.00 sec)

mysql> desc books;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| b_id    | int(11)      | NO   | PRI | NULL    |       |
| b_name  | varchar(50)  | NO   |     | NULL    |       |
| authors | varchar(100) | NO   |     | NULL    |       |
| price   | float        | NO   |     | NULL    |       |
| pubdate | year(4)      | NO   |     | NULL    |       |
| note    | varchar(100) | YES  |     | NULL    |       |
| num     | int(11)      | NO   |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
7 rows in set (0.00 sec)

mysql> INSERT INTO books (b_id,b_name,authors,price,pubdate,note,num) VALUES(1,'Tale of AAA','Dickes',23,1995,'novel',110);   //指定字段 添加数据
Query OK, 1 row affected (0.00 sec)

mysql> select * from books;
+------+-------------+---------+-------+---------+-------+-----+
| b_id | b_name      | authors | price | pubdate | note  | num |
+------+-------------+---------+-------+---------+-------+-----+
|    1 | Tale of AAA | Dickes  |    23 |    1995 | novel | 110 |
+------+-------------+---------+-------+---------+-------+-----+
1 row in set (0.00 sec)

mysql> INSERT INTO books  VALUES(2,'EmmaT','Jane lura',35,1993,'joke',22);  //不指定字段 添加数据
Query OK, 1 row affected (0.00 sec)

mysql> select * from books;
+------+-------------+-----------+-------+---------+-------+-----+
| b_id | b_name      | authors   | price | pubdate | note  | num |
+------+-------------+-----------+-------+---------+-------+-----+
|    1 | Tale of AAA | Dickes    |    23 |    1995 | novel | 110 |
|    2 | EmmaT       | Jane lura |    35 |    1993 | joke  |  22 |
+------+-------------+-----------+-------+---------+-------+-----+
2 rows in set (0.01 sec)

mysql> INSERT INTO books  VALUES(3,'Story of Jane','Jane Tim',40,2001,'novel',0),(4,'Lovey Day','George Byron',20,2005,'novel',30),(5,'Old Land','Honore Blade',30,2010,'law',0),(6,'The Battle','Upton Sara',30,1999,'medicine',40),(7,'Rose Hood','Richard Haggard',28,2008,'cartoon',28); //同时插入多条数据 ,每个括号间逗号隔开
Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> select * from books;
+------+---------------+-----------------+-------+---------+----------+-----+
| b_id | b_name        | authors         | price | pubdate | note     | num |
+------+---------------+-----------------+-------+---------+----------+-----+
|    1 | Tale of AAA   | Dickes          |    23 |    1995 | novel    | 110 |
|    2 | EmmaT         | Jane lura       |    35 |    1993 | joke     |  22 |
|    3 | Story of Jane | Jane Tim        |    40 |    2001 | novel    |   0 |
|    4 | Lovey Day     | George Byron    |    20 |    2005 | novel    |  30 |
|    5 | Old Land      | Honore Blade    |    30 |    2010 | law      |   0 |
|    6 | The Battle    | Upton Sara      |    30 |    1999 | medicine |  40 |
|    7 | Rose Hood     | Richard Haggard |    28 |    2008 | cartoon  |  28 |
+------+---------------+-----------------+-------+---------+----------+-----+
7 rows in set (0.00 sec)

mysql> UPDATE books SET price=price+5 WHERE note='novel';  //将 note=‘novel’的 price增加5
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3  Changed: 3  Warnings: 0

mysql> select * from books;
+------+---------------+-----------------+-------+---------+----------+-----+
| b_id | b_name        | authors         | price | pubdate | note     | num |
+------+---------------+-----------------+-------+---------+----------+-----+
|    1 | Tale of AAA   | Dickes          |    28 |    1995 | novel    | 110 |
|    2 | EmmaT         | Jane lura       |    35 |    1993 | joke     |  22 |
|    3 | Story of Jane | Jane Tim        |    45 |    2001 | novel    |   0 |
|    4 | Lovey Day     | George Byron    |    25 |    2005 | novel    |  30 |
|    5 | Old Land      | Honore Blade    |    30 |    2010 | law      |   0 |
|    6 | The Battle    | Upton Sara      |    30 |    1999 | medicine |  40 |
|    7 | Rose Hood     | Richard Haggard |    28 |    2008 | cartoon  |  28 |
+------+---------------+-----------------+-------+---------+----------+-----+
7 rows in set (0.00 sec)

mysql> UPDATE books SET price=40,note='drama' WHERE b_name='EmmaT';  将名称为EmmaT的书的价格都改为40,并将说明改为drama
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from books;
+------+---------------+-----------------+-------+---------+----------+-----+
| b_id | b_name        | authors         | price | pubdate | note     | num |
+------+---------------+-----------------+-------+---------+----------+-----+
|    1 | Tale of AAA   | Dickes          |    28 |    1995 | novel    | 110 |
|    2 | EmmaT         | Jane lura       |    40 |    1993 | drama    |  22 |
|    3 | Story of Jane | Jane Tim        |    45 |    2001 | novel    |   0 |
|    4 | Lovey Day     | George Byron    |    25 |    2005 | novel    |  30 |
|    5 | Old Land      | Honore Blade    |    30 |    2010 | law      |   0 |
|    6 | The Battle    | Upton Sara      |    30 |    1999 | medicine |  40 |
|    7 | Rose Hood     | Richard Haggard |    28 |    2008 | cartoon  |  28 |
+------+---------------+-----------------+-------+---------+----------+-----+
7 rows in set (0.00 sec)

mysql> DELETE FROM books WHERE num=0;   //删除num等于0的数据
Query OK, 2 rows affected (0.01 sec)

mysql> select * from books;
+------+-------------+-----------------+-------+---------+----------+-----+
| b_id | b_name      | authors         | price | pubdate | note     | num |
+------+-------------+-----------------+-------+---------+----------+-----+
|    1 | Tale of AAA | Dickes          |    28 |    1995 | novel    | 110 |
|    2 | EmmaT       | Jane lura       |    40 |    1993 | drama    |  22 |
|    4 | Lovey Day   | George Byron    |    25 |    2005 | novel    |  30 |
|    6 | The Battle  | Upton Sara      |    30 |    1999 | medicine |  40 |
|    7 | Rose Hood   | Richard Haggard |    28 |    2008 | cartoon  |  28 |
+------+-------------+-----------------+-------+---------+----------+-----+
5 rows in set (0.00 sec)

运算符介绍:

1、MySQL的算数运算符
2、比较运算符
3、逻辑运算符
4、位运算符
1、算数运算符:

(1)+ :加法运算;
(2)- : 减法运算;
(3)* : 乘法运算;
(4)/ : 除法运算;
(5)DIV : 求商;
(6)MOD :或者 % 取余/取模

2、比较运算符:

= 等于
< = > 安全等于 (和“=”的区别是“< = >”可以判断NULL)

mysql> select null <=>null;
+--------------+
| null <=>null |
+--------------+
|            1 |
+--------------+
1 row in set (0.00 sec)

<> 不等于 也可以用 !=

> 大于
< 小于
>= 大于等于
<= 小于等于

IS NULL 判定一个值是否为NULL 值(这个要判断的值写在前面)
ISNULL(值):同上
IS NOT NULL : 判断一个值是否不为NULL
GREATEST: 当有两个或多个参数时,取其中的最大值,如果参数里有NULL,显示NULL;
LEAST:当有两个或多个参数时,取其中的最小值,如果参数里有NULL,显示NULL;

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

mysql> select greatest(2,15,9,null);
+-----------------------+
| greatest(2,15,9,null) |
+-----------------------+
|                  NULL |
+-----------------------+
1 row in set (0.00 sec)

BETWEEN AND 判断一个值是否在两个值的范围内

mysql> select 5 between 3 and 10;
+--------------------+
| 5 between 3 and 10 |
+--------------------+
|                  1 |
+--------------------+
1 row in set (0.00 sec)

值 BETWEEN min AND max; 判断一个值是否在两个值的范围内 min 最小值 max 最大值;
min <= 值 <= max 结果才会返回1

IN 判断值是否在IN给出的范围内,IN后面给的值里面有NULL的时候,如果我们要判断的这个值在其中,则返回1,如果不在返回NULL;

mysql> select 4 IN (1,2,3,5,6);
+------------------+
| 4 IN (1,2,3,5,6) |
+------------------+
|                0 |
+------------------+
1 row in set (0.00 sec)

mysql> select 4 IN (1,2,3,5,6,null);
+-----------------------+
| 4 IN (1,2,3,5,6,null) |
+-----------------------+
|                  NULL |
+-----------------------+
1 row in set (0.00 sec)

mysql> select 4 IN (1,2,3,5,6,4,null);
+-------------------------+
| 4 IN (1,2,3,5,6,4,null) |
+-------------------------+
|                       1 |
+-------------------------+
1 row in set (0.00 sec)

NOT IN 判断值是否不再后面给出的范围内,如果在 返回0,不在返回1

LIKE 模糊匹配
REGEXP 正则表达式

LIKE:
(1)like运算符用来匹配字符串。如果匹配则返回1 如果不匹配返回0;
(2)LIKE经常使用梁红通配符 ‘%’用于匹配任何数据的字符,包括零字符;‘_’只能匹配单个字符

mysql> SELECT 'student' LIKE 'studen_';
+--------------------------+
| 'student' LIKE 'studen_' |
+--------------------------+
|                        1 |
+--------------------------+
1 row in set (0.00 sec)

mysql> SELECT 'student' LIKE 'stude_';
+-------------------------+
| 'student' LIKE 'stude_' |
+-------------------------+
|                       0 |
+-------------------------+
1 row in set (0.01 sec)

mysql> SELECT 'student' LIKE 'student%';
+---------------------------+
| 'student' LIKE 'student%' |
+---------------------------+
|                         1 |
+---------------------------+
1 row in set (0.00 sec)

mysql> SELECT 'student' LIKE '%';
+--------------------+
| 'student' LIKE '%' |
+--------------------+
|                  1 |
+--------------------+
1 row in set (0.00 sec)

4、位运算符

| 位或
& 位与
^ 位异或
<< 位左移 >> 位又移
~ 位取反

1、位或运算符(|):多个操作数对应的二进位有一个多个1,则该位的运算结果为1,否则为0,;
比如说10的二进制是1010,14的二进制是1110,那他两的位或运算的结果是1110,转换成十进制就是14

mysql> select 10|14;
+-------+
| 10|14 |
+-------+
|    14 |
+-------+
1 row in set (0.00 sec)

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

解析:
二进制  5  9  2  分别为
5  ---   0101
9  ---   1001
2  ---   0010
位或运算 二进制位 1111 转换成十进制 15

2、位与运算符

mysql> select 15 & 4;
+--------+
| 15 & 4 |
+--------+
|      4 |
+--------+
1 row in set (0.00 sec)

mysql> select 15 & 9;
+--------+
| 15 & 9 |
+--------+
|      9 |
+--------+
1 row in set (0.01 sec)


解析:
二进制 
15  --- 1111      4 ---- 0100  9 --- 1001
15 & 4 结果 只有 第二顺位 有1 结果为 0100 转换成10进制 4
15 & 9 结果 第一 第四顺位 有1 结果为1001 转换成10进制 9 

3、位异或;
对应的二进制位不相同时,结果位为1,否则为0

mysql> select 15 ^ 9;
+--------+
| 15 ^ 9 |
+--------+
|      6 |
+--------+
1 row in set (0.00 sec)

解析:
二进制 
15  --- 1111      9 --- 1001
第一 第四顺位相同 第二三顺位不同 所以 结果位
0110 转换成十进制 6

4、位左移:

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

mysql> select 4 << 1;
+--------+
| 4 << 1 |
+--------+
|      8 |
+--------+
1 row in set (0.00 sec)

解析:
二进制
4 ---- 0100   4 << 2 变为 二进制 10000 转换成十进制 16
4 << 1 变为 二进制 1000 转换成十进制 8

5、位右移:

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

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

原理和上方 左移一致 
需要注意的是  右移后 左边被移走的1用0来补充 右边被移除边界的1被舍弃

6、位取反(~):将对应的二进制数逐位取反 (1变0,0变1);

mysql> select ~ 1;
+----------------------+
| ~ 1                  |
+----------------------+
| 18446744073709551614 |
+----------------------+
1 row in set (0.00 sec)

mysql> select ~ 0;
+----------------------+
| ~ 0                  |
+----------------------+
| 18446744073709551615 |
+----------------------+
1 row in set (0.01 sec)

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值