一、数据类型介绍
(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 ~ 127 | 0 ~ 255 |
SMALLINT | 小的整数 | 2个字节 | -32768 ~ 32767 | 0 ~ 65535 |
MEDIUMINT | 中等大小的整数 | 3个字节 | -8388608 ~ 8388607 | 0 ~ 16777215 |
INT | 普通大小的整数 | 4个字节 | -2147483648 ~ 2147483647 | 0 ~ 4294967295 |
BIGINT | 大整数 | 8个字节 | -9223372036854775808 ~ 9223372036854775807 | 0 ~ 18446744073709551615 |
2、浮点数类型和定点数类型:
(1)MySQL中使用浮点数和定点数来表示小数,浮点数有两种类型:单精度浮点数(FLOAT),双精度浮点数(DOUBLE)定点数只有DECIMAL;
(2)浮点数和定点数都可以用(M,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)每一个类型都有合法的取值范围,当数据是不合法的值时,系统将“零”值插入到数据库中
类型名称 | 日期格式 | 日期范围 | 存储需求 |
---|---|---|---|
YEAR | YYYY | 1901 ~ 2155 | 1字节 |
TIME | HH:MM:SS | -838:59:59 ~ 838:59:59 | 3字节 |
DATE | YYYY -MM -DD | 1000-01-01 ~ 9999-12-31 | 3字节 |
DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 8字节 |
TIMESTAMPUTC | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 | 4字节 |
1、YEAR:
(1)格式:以4位字符串格式表示的YEAR 范围为‘1901’ ~ ‘2155’
(2)格式:以4位数字格式表示的YEAR,范围为1901 ~ 2155
(3)格式:以2位数字格式表示的YEAR 范围为‘00’ ~ ‘99’ 其中,‘00’~‘69’被转换为2000 ~ 2069,‘70’ ~‘99’ 被转换为 1970 ~ 1999
(4)格式:以2位数字格式表示的YEAR ,范围为1 ~ 99 其中,1 ~69 被转换为2001 ~ 2069 ,70 ~99被转换为 1970 ~ 1999
2、TIME :
(1)TIME 类型的格式为HH:MM:SS ,HH表示小时 MM 表示分钟 SS 表示秒
(2)格式:以‘HHMMSS’格式表示的TIME 例如‘101112’ 被理解为10:11:12 但如果插入不合法的时间,如‘109712’,则呗存储为 00:00:00
(3)格式:以‘D HH:MM:SS’字符串格式表示的TIME 其中D 表示日 可以去0-34之间的值,在插入数据库的时候D 会被转换成小时 如‘2 10:10’ 在数据库中表示为58:10:00 即2x24+10 =58
3、DATE:
(1)DATE 类型的格式为 YYYY-MM-DD,其中 ,YYYY表示年 MM 表示月 DD 表示日
(2)格式:‘YYYY-MM-DD’或‘YYYYMMDD’, 取值范围为‘1000-01-01’ ~ ‘9999-12-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)