【MySQL】004.MySQL数据类型_数据库查询数据类型
文章目录
-
- 1. 数据类型分类
- 2. 数值类型
-
- 2.1 tinyint类型
- 2.2 bit类型
- 2.3 小数类型
-
- 2.3.1 float
- 2.3.2 decimal
- 2.4 字符串类型
-
- 2.4.1 char
- 2.4.2 varchar
- 2.4.3 char和varchar比较
- 2.5 日期和时间类型
- 2.6 enum和set
- 2.7 enum和set类型查找
1. 数据类型分类
2. 数值类型
2.1 tinyint类型
创建一个tinyint
类型的表
- 首先我们创建一个名叫
t1
的表
create table if not exists t1( num tinyint );
- 查看
t1
表结构
desc t1;
- 查看当前数据库的表名称
show tables;
- 显示创建这个表时对应的语法细节
show create table t1 \\G;
- 插入数据
insert into t1 values (-128);insert into t1 values(127);insert into t1 values(0);insert into t1 values(1);insert into t1 values(-1);
- 查表当中的内容
当我们插入128
,-129
的时候就会发现报错插入的数据超出数据范围。因为tinyint
的数据范围是-128 - 127
创建一个无符号的tinyint
类型的表 - 首先我们创建一个名叫
t2
的表
create table if not exists t2( num tinyint unsigned );
- 查看数据库中的表
- 查看
t2
表的结构
desc t2;
- 插入数据
insert into t2 values(0); insert into t2 values(255); insert into t2 values(100);
当我们插入-1
或者256
的时候就会发现,插入的数据范围超过了指定类型,mysql
的做法是直接拦截,不让我们做插入。
结论:如果我们向mysql
特定的类型中插入不合法的数据你,mysql
一般都是直接拦截我们,不让我们做对应的操作。
这里就要和c语言中的区别一下:当我们在c语言中插入 char c = 1234567
,而char
类型的数据范围是-128-127
,此时就会发生截断,而mysql
这里是直接不让我们插入。
反过来,如果我们向mysql
中插入数据成功了,此时插入的数据一定是合法的。
所以mysql
中一般而言:数据类型本身也是一种约束。(约束就能倒逼程序员,让程序员尽可能正确的插入,另外如果你不是一个很好的使用者,mysql也能确保插入数据的合法性)。
MySQL
中建立属性列:一般是列名称在前,类型在后。
2.2 bit类型
基本语法:
bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。
- 创建
t3
表
create table if not exists t3( id int, online bit(1) );
online
表示当前用户是否在线
- 查看表的结构
desc t3;
- 插入数据
insert into t3 (id,online) values (123,0);insert into t3 (id,online) values (124,1);
当我们再次插入5,3,2
时就会发现不让我们进行插入了。
原因是online
只有一个比特位,我们只能插入0
,或者1
。
- 查看表中的内容
select * from t3;
我们的bit
数据为什么会以十六进制的形式显示呢?
原因是在MySQL8.0
版本中,客户端会默认开启--binary-as-hex
这个选项,导致bit
字段显示为十六进制 。
方法1:显式转换字段类型
通过SQL函数将BIT
字段转换为需要的格式:
-- 转换为十进制数字SELECT id, flags + 0 AS dec_value FROM test_bit;-- 转换为二进制字符串(如 \'01000001\')SELECT id, BIN(flags) AS bin_value FROM test_bit;-- 转换为ASCII字符(如 \'A\')SELECT id, CHAR(CAST(flags AS UNSIGNED)) AS char_value FROM test_bit;
方法2:调整客户端参数
在连接MySQL时,禁用十六进制显示二进制数据的选项:
mysql --skip-binary-as-hex -u your_user -p
或在配置文件(如~/.my.cnf
)中永久禁用:
[client]binary-as-hex = OFF
方法3:使用CAST函数直接转换
将BIT
字段强制转换为CHAR
类型:
SELECT id, CAST(flags AS CHAR) AS char_raw FROM test_bit;
但此方法可能仍显示为二进制字符串(如b\'01000001\'
),需进一步处理:
SELECT id, CHAR(CAST(flags AS UNSIGNED)) AS char_value FROM test_bit;
2.3 小数类型
2.3.1 float
语法:
float[(m, d)] [unsigned] : m指定显示长度,d指定小数位数,占用空间4个字节
- 创建一个表
t5
(有符号)-99.99-99.99
create table if not exists t5( id int, salary float(4,2) );
t5
表的类型
desc t5;
- 插入数据
insert into t5 (id,salary) values (1,99.99);insert into t5 (id,salary) values (2,-99.99);insert into t5 (id,salary) values (3,-12.34);
- 插入
insert into t5 (id,salary) values (6,100.00);insert into t5 (id,salary) values (7,100.0);
当我们插入100.00
和100.0
的时候就会发现不让我们插入。
- 插入
insert into t5 (id,salary) values (4,23.456);insert into t5 (id,salary) values (5,23.454);
当我们插入23.456
和23.454
的时候,MySQL
会四舍五入将数据插入表中。但是当我们插入99.995
,99.996
的时候就不让我们插入了,所以说五入也是有条件的。
- 创建一个表
t6
(无符号)
create table if not exists t6( id bigint, salary float(4,2) unsigned );
- 表的类型
desc t6;
- 插入数据
insert into t6 (id,salary) values(1,0);insert into t6 (id,salary) values(1,99.99);
当我们插入99.996
和99.997
的时候我们就会发现都不行
说明(4,2)
的时候的上限还是4
位。
当我们插入负数的时候发现也不行,说明我们如果定义了一个数据类型位unsigned
,它会直接把我们的数据范围砍掉负数部分,剩下的部分就是我们的取值范围。
2.3.2 decimal
语法:
decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
- decimal(5,2) 表示的范围是 -999.99 ~ 999.99
- decimal(5,2) unsigned 表示的范围 0 ~ 999.99
decimal和float很像,但是有区别:
float和decimal表示的精度不一样
- 创建一个表
t7
create table if not exists t7( f1 float(10,8), f2 decimal(4,2) );
- 查看表结构
desc t7;
- 插入数据
insert into t7 (f1,f2) values (10.0,99.99);insert into t7 (f1,f2) values (10.0,-99.99);insert into t7 (f1,f2) values (10.0,0.1);insert into t7 (f1,f2) values (10.0,99.994);insert into t7 (f1,f2) values (10.0,23.935);
- 查看表中的数据
- 修改
t7
alter table t7 modify f2 decimal(10,8);
- 给
f1
和f2
插入同样的数据
insert into t7 (f1,f2) values (23.12345612,23.12345612);
说明:float表示的精度大约是7位
decimal
整数最大位数m
为65。支持小数最大位数d
是30。如果d
被省略,默认为0.如果m被省略,默认是10。
建议:如果希望小数的精度高,推荐使用decimal。
2.4 字符串类型
2.4.1 char
语法:
mysql> create table if not exists t8( -> id int, -> name char(2) -> );Query OK, 0 rows affected (0.02 sec)mysql> desc t8;+-------+---------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+---------+------+-----+---------+-------+| id | int | YES | | NULL | || name | char(2) | YES | | NULL | |+-------+---------+------+-----+---------+-------+2 rows in set (0.00 sec)mysql> insert into t8 (id,name) values (1,\'a\');Query OK, 1 row affected (0.00 sec)mysql> insert into t8 (id,name) values (1,\'b\');Query OK, 1 row affected (0.01 sec)mysql> insert into t8 (id,name) values (1,\'ab\');Query OK, 1 row affected (0.00 sec)mysql> insert into t8 (id,name) values (1,\'abc\');ERROR 1406 (22001): Data too long for column \'name\' at row 1mysql> select * from t8;+------+------+| id | name |+------+------+| 1 | a || 1 | b || 1 | ab |+------+------+3 rows in set (0.00 sec)mysql> insert into t8 (id,name) values (1,\'中\');Query OK, 1 row affected (0.01 sec)mysql> insert into t8 (id,name) values (1,\'中国\');Query OK, 1 row affected (0.00 sec)mysql> insert into t8 (id,name) values (1,\'中国人\');ERROR 1406 (22001): Data too long for column \'name\' at row 1mysql> select * from t8;+------+--------+| id | name |+------+--------+| 1 | a || 1 | b || 1 | ab || 1 | 中 || 1 | 中国 |+------+--------+5 rows in set (0.00 sec)
说明:
char(2) 表示可以存放两个字符,可以是字母或汉字,但是不能超过2个, 最多只能是255
注意:mysql
中的字符和C/C++
中的字符是不一样的,mysql
中的一个字符,一个数字,一个汉字都是一个字符。
2.4.2 varchar
语法:
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节 ,21845个字符
案例:
mysql> create table if not exists t9( -> id int, -> name varchar(6) -> );Query OK, 0 rows affected (0.02 sec)mysql> insert into t9 (id ,name) values (123,\'中\');Query OK, 1 row affected (0.00 sec)mysql> insert into t9 (id ,name) values (123,\'中国\');Query OK, 1 row affected (0.00 sec)mysql> insert into t9 (id ,name) values (123,\'中国人\');Query OK, 1 row affected (0.00 sec)mysql> insert into t9 (id ,name) values (123,\'中国人,\');Query OK, 1 row affected (0.00 sec)mysql> insert into t9 (id ,name) values (123,\'中国人,加\');Query OK, 1 row affected (0.01 sec)mysql> insert into t9 (id ,name) values (123,\'中国人,加油\');Query OK, 1 row affected (0.00 sec)mysql> insert into t9 (id ,name) values (123,\'中国人,加油!\');ERROR 1406 (22001): Data too long for column \'name\' at row 1mysql> later table t9 modify name varchar(65536);ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'later table t9 modify name varchar(65536)\' at line 1
说明:
关于varchar(len),len到底是多大,这个len值,和表的编码密切相关:
- varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是65532。
- 当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占用3个字节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)。
2.4.3 char和varchar比较
如何选择定长或变长字符串?
- 如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
- 如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
- 定长的磁盘空间比较浪费,但是效率高。
- 变长的磁盘空间比较节省,但是效率低。
- 定长的意义是,直接开辟好对应的空间
- 变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。
2.5 日期和时间类型
常用的日期有如下三个:
date
:日期yyyy-mm-dd
,占用三字节datetime
时间日期格式yyyy-mm-dd HH:ii:ss\'
表示范围从 1000 到 9999 ,占用八字节timestamp
:时间戳,从1970年开始的yyyy-mm-dd HH:ii:ss
格式和datetime
完全一致,占用四字节
在MySQL8.0 版本中时间戳不自动显示的解决方法:
方法1:修改表结构,显式设置默认值
在定义时间戳字段时,添加DEFAULT CURRENT_TIMESTAMP
或ON UPDATE
子句:
CREATE TABLE example ( id INT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 插入时自动填充 updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- 更新时自动刷新);
方法2:调整系统变量(不推荐,需谨慎)
将explicit_defaults_for_timestamp
设为OFF
,恢复旧版自动行为。但需注意,这可能影响其他表的预期行为:
SET GLOBAL explicit_defaults_for_timestamp = OFF;
注意:此方法需重启MySQL服务并重建表,仅建议在明确了解影响后使用。
方法3:插入时手动赋值
若需保留字段灵活性,可在插入语句中直接指定时间戳:
INSERT INTO example (id, created_at) VALUES (1, CURRENT_TIMESTAMP);
案例:
mysql> create table if not exists t10( -> t1 date, -> t2 datetime, -> t3 timestamp default current_timestamp -> );Query OK, 0 rows affected (0.04 sec)mysql> desc t10;+-------+-----------+------+-----+-------------------+-------------------+| Field | Type | Null | Key | Default | Extra |+-------+-----------+------+-----+-------------------+-------------------+| t1 | date | YES | | NULL | || t2 | datetime | YES | | NULL | || t3 | timestamp | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED |+-------+-----------+------+-----+-------------------+-------------------+3 rows in set (0.00 sec)mysql> insert into t10 (t1,t2) values (\'2000-10-01\',\'1949-10-01 08:00:00\');Query OK, 1 row affected (0.00 sec)//timestamp的应用场景mysql> create table if not exists t11( -> content text, -> time timestamp default current_timestamp -> );Query OK, 0 rows affected (0.03 sec)mysql> insert into t11 (content) values (\'这个世界还是好人多\');Query OK, 1 row affected (0.00 sec)mysql> select * from t11;+-----------------------------+---------------------+| content | time |+-----------------------------+---------------------+| 这个世界还是好人多 | 2025-04-19 18:04:42 |+-----------------------------+---------------------+1 row in set (0.00 sec)mysql> update t11 set content=\'这个世界还是好人多,我说的\';Query OK, 1 row affected (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from t11;+-----------------------------------------+---------------------+| content | time |+-----------------------------------------+---------------------+| 这个世界还是好人多,我说的 | 2025-04-19 18:04:42 |+-----------------------------------------+---------------------+1 row in set (0.00 sec)
2.6 enum和set
语法:
- enum:枚举,单选类型;
enum(‘选项1’,‘选项2’,‘选项3’,…);
该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,…最多65535个;当我们添加枚举值时,也可以添加对应的数字编号。
- set:集合,多选类型;
set(‘选项值1’,‘选项值2’,‘选项值3’, …);
该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,… 最多64个。
说明:不建议在添加枚举值,集合值的时候采用数字的方式,因为不利于阅读。
案例:
mysql> create table if not exists votes( -> username varchar(30), -> gender enum(\'男\',\'女\'), -> hobby set(\'代码\',\'羽毛球\',\'乒乓球\',\'篮球\',\'足球\') -> );Query OK, 0 rows affected (0.02 sec)mysql> desc votes;+----------+---------------------------------------------------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+----------+---------------------------------------------------------+------+-----+---------+-------+| username | varchar(30) | YES | | NULL | || gender | enum(\'男\',\'女\') | YES | | NULL | || hobby | set(\'代码\',\'羽毛球\',\'乒乓球\',\'篮球\',\'足球\') | YES | | NULL | |+----------+---------------------------------------------------------+------+-----+---------+-------+3 rows in set (0.00 sec)mysql> insert into votes values (\'张飞\',\'男\',\'代码\');Query OK, 1 row affected (0.00 sec)mysql> insert into votes values (\'孙尚香\',\'女\',\'羽毛球\');Query OK, 1 row affected (0.00 sec)//当我们插入枚举的以外的值时我们会发现是不被允许的。mysql> insert into votes values (\'孙权\',\'男\',\'游泳\');ERROR 1265 (01000): Data truncated for column \'hobby\' at row 1mysql> insert into votes values (\'张飞\',\'b\',\'代码\');ERROR 1265 (01000): Data truncated for column \'gender\' at row 1mysql> insert into votes values (\'张飞\',\'a\',\'篮球\');ERROR 1265 (01000): Data truncated for column \'gender\' at row 1//当我们插入1,2时我们会发现是可以的,当我们插入3时是不被允许的mysql> insert into votes values (\'李白\',1,\'代码\');Query OK, 1 row affected (0.00 sec)mysql> insert into votes values (\'西施\',2,\'代码\');Query OK, 1 row affected (0.00 sec)mysql> insert into votes values (\'庄周\',3,\'代码\');ERROR 1265 (01000): Data truncated for column \'gender\' at row 1//所以我们在枚举时,能写对应的‘男’或者‘女’,也可以写对应的下标。注意:这个下标是从1开始的,表示第一个枚举值,第二个枚举值,有几个枚举值就只能到几。mysql> insert into votes values (\'曹操\',1,\'乒乓球\');Query OK, 1 row affected (0.00 sec)//在集合当中不允许插入不存在的爱好mysql> insert into votes values (\'曹操\',1,\'飞盘\');ERROR 1265 (01000): Data truncated for column \'hobby\' at row 1//可以多爱好进行插入mysql> insert into votes values (\'曹操\',1,\'乒乓球,羽毛球,篮球\');Query OK, 1 row affected (0.00 sec)mysql> select * from votes;+-----------+--------+----------------------------+| username | gender | hobby|+-----------+--------+----------------------------+| 张飞 | 男 | 代码 || 孙尚香 | 女 | 羽毛球 || 李白 | 男 | 代码 || 西施 | 女 | 代码 || 曹操 | 男 | 乒乓球 || 曹操 | 男 | 羽毛球,乒乓球,篮球 |+-----------+--------+----------------------------+6 rows in set (0.00 sec)mysql> insert into votes values (\'刘表\',1,0);Query OK, 1 row affected (0.00 sec)mysql> insert into votes values (\'刘表\',1,1);Query OK, 1 row affected (0.00 sec)mysql> select * from votes;+-----------+--------+----------------------------+| username | gender | hobby|+-----------+--------+----------------------------+| 张飞 | 男 | 代码 || 孙尚香 | 女 | 羽毛球 || 李白 | 男 | 代码 || 西施 | 女 | 代码 || 曹操 | 男 | 乒乓球 || 曹操 | 男 | 羽毛球,乒乓球,篮球 || 刘表 | 男 | || 刘表 | 男 | 代码 |+-----------+--------+----------------------------+8 rows in set (0.00 sec)mysql> insert into votes values (\'刘表\',1,2);Query OK, 1 row affected (0.00 sec)mysql> select * from votes;+-----------+--------+----------------------------+| username | gender | hobby|+-----------+--------+----------------------------+| 张飞 | 男 | 代码 || 孙尚香 | 女 | 羽毛球 || 李白 | 男 | 代码 || 西施 | 女 | 代码 || 曹操 | 男 | 乒乓球 || 曹操 | 男 | 羽毛球,乒乓球,篮球 || 刘表 | 男 | || 刘表 | 男 | 代码 || 刘表 | 男 | 羽毛球 |+-----------+--------+----------------------------+9 rows in set (0.00 sec)//正常来说3应该是乒乓球,可是为什么表中什么都没有呢?mysql> insert into votes values (\'刘表\',1,3);Query OK, 1 row affected (0.00 sec)mysql> select * from votes;+-----------+--------+----------------------------+| username | gender | hobby|+-----------+--------+----------------------------+| 张飞 | 男 | 代码 || 孙尚香 | 女 | 羽毛球 || 李白 | 男 | 代码 || 西施 | 女 | 代码 || 曹操 | 男 | 乒乓球 || 曹操 | 男 | 羽毛球,乒乓球,篮球 || 刘表 | 男 | || 刘表 | 男 | 代码 || 刘表 | 男 | 羽毛球 || 刘表 | 男 | 代码,羽毛球 |+-----------+--------+----------------------------+10 rows in set (0.00 sec)//正常情况下插入4的时候应该是篮球,可为什么会是乒乓球?mysql> insert into votes values (\'刘表\',1,4);Query OK, 1 row affected (0.00 sec)mysql> select * from votes;+-----------+--------+----------------------------+| username | gender | hobby|+-----------+--------+----------------------------+| 张飞 | 男 | 代码 || 孙尚香 | 女 | 羽毛球 || 李白 | 男 | 代码 || 西施 | 女 | 代码 || 曹操 | 男 | 乒乓球 || 曹操 | 男 | 羽毛球,乒乓球,篮球 || 刘表 | 男 | || 刘表 | 男 | 代码 || 刘表 | 男 | 羽毛球 || 刘表 | 男 | 代码,羽毛球 || 刘表 | 男 | 乒乓球 |+-----------+--------+----------------------------+11 rows in set (0.00 sec)mysql> insert into votes values (\'夏侯惇\',1,7);Query OK, 1 row affected (0.00 sec)mysql> select * from votes;+-----------+--------+----------------------------+| username | gender | hobby|+-----------+--------+----------------------------+| 张飞 | 男 | 代码 || 孙尚香 | 女 | 羽毛球 || 李白 | 男 | 代码 || 西施 | 女 | 代码 || 曹操 | 男 | 乒乓球 || 曹操 | 男 | 羽毛球,乒乓球,篮球 || 刘表 | 男 | || 刘表 | 男 | 代码 || 刘表 | 男 | 羽毛球 || 刘表 | 男 | 代码,羽毛球 || 刘表 | 男 | 乒乓球 || 夏侯惇 | 男 | 代码,羽毛球,乒乓球 |+-----------+--------+----------------------------+12 rows in set (0.00 sec)
NULL
:表示空什么都没有
\'\'
:表示有东西,只不过这个东西是空串
(‘代码’,‘羽毛球’,‘乒乓球’,‘篮球’,‘足球’)将这5
个爱好想象成5
个比特位,当我们插入1
时00000 -> 00001
,1
这个比特位的位置代表的是‘代码’这个爱好,这个位置为0
还是为1
代表有没有这个爱好,如果为1
代表的就是有‘代码这个爱好’
00010
代表的就是‘羽毛球’这个爱好。
7
的二进制序列为00111
,所以表中低三个爱好就被设置了(夏侯惇)。
所以当我们向一个集合当中去插入爱好时,这个数字就代表的是位图,比特位的从低到高依次是爱好的从左向右。比特位的位置代表的是哪一个爱好,比特位为零为一代表的是是否有这个爱好。
枚举是下标,集合是位图
2.7 enum和set类型查找
- 在enum中选择
mysql> select * from votes where gender=\'男\';+-----------+--------+----------------------------+| username | gender | hobby|+-----------+--------+----------------------------+| 张飞 | 男 | 代码 || 李白 | 男 | 代码 || 曹操 | 男 | 乒乓球 || 曹操 | 男 | 羽毛球,乒乓球,篮球 || 刘表 | 男 | || 刘表 | 男 | 代码 || 刘表 | 男 | 羽毛球 || 刘表 | 男 | 代码,羽毛球 || 刘表 | 男 | 乒乓球 || 夏侯惇 | 男 | 代码,羽毛球,乒乓球 |+-----------+--------+----------------------------+10 rows in set (0.01 sec)mysql> select * from votes where gender=\'女\';+-----------+--------+-----------+| username | gender | hobby |+-----------+--------+-----------+| 孙尚香 | 女 | 羽毛球 || 西施 | 女 | 代码 |+-----------+--------+-----------+2 rows in set (0.00 sec)//也可以根据1,2进行选择mysql> select * from votes where gender=1;+-----------+--------+----------------------------+| username | gender | hobby|+-----------+--------+----------------------------+| 张飞 | 男 | 代码 || 李白 | 男 | 代码 || 曹操 | 男 | 乒乓球 || 曹操 | 男 | 羽毛球,乒乓球,篮球 || 刘表 | 男 | || 刘表 | 男 | 代码 || 刘表 | 男 | 羽毛球 || 刘表 | 男 | 代码,羽毛球 || 刘表 | 男 | 乒乓球 || 夏侯惇 | 男 | 代码,羽毛球,乒乓球 |+-----------+--------+----------------------------+10 rows in set (0.00 sec)mysql> select * from votes where gender=2;+-----------+--------+-----------+| username | gender | hobby |+-----------+--------+-----------+| 孙尚香 | 女 | 羽毛球 || 西施 | 女 | 代码 |+-----------+--------+-----------+2 rows in set (0.00 sec)
- 在set中选择
//爱好只有‘羽毛球’mysql> select * from votes where hobby=\'羽毛球\';+-----------+--------+-----------+| username | gender | hobby |+-----------+--------+-----------+| 孙尚香 | 女 | 羽毛球 || 刘表 | 男 | 羽毛球 |+-----------+--------+-----------+2 rows in set (0.00 sec)//数字选mysql> select * from votes where hobby=2;+-----------+--------+-----------+| username | gender | hobby |+-----------+--------+-----------+| 孙尚香 | 女 | 羽毛球 || 刘表 | 男 | 羽毛球 |+-----------+--------+-----------+2 rows in set (0.00 sec)
上面我们查的是爱好中只有‘羽毛球’,但我们要是想查爱好中包含‘羽毛球’呢?
集合查询使用find_ in_ set函数:
//在‘a,b,c’中查找‘a’,成功返回1,失败返回0mysql> select find_in_set(\'a\',\'a,b,c\');+--------------------------+| find_in_set(\'a\',\'a,b,c\') |+--------------------------+| 1 |+--------------------------+1 row in set (0.00 sec)mysql> select find_in_set(\'d\',\'a,b,c\');+--------------------------+| find_in_set(\'d\',\'a,b,c\') |+--------------------------+| 0 |+--------------------------+1 row in set (0.00 sec)mysql> select find_in_set(\'a,b\',\'a,b,c\');+----------------------------+| find_in_set(\'a,b\',\'a,b,c\') |+----------------------------+| 0 |+----------------------------+1 row in set (0.00 sec)mysql> select find_in_set(\'a,d\',\'a,b,c\');+----------------------------+| find_in_set(\'a,d\',\'a,b,c\') |+----------------------------+| 0 |+----------------------------+1 row in set (0.00 sec)mysql> select find_in_set(\'c\',\'a,b,c\');+--------------------------+| find_in_set(\'c\',\'a,b,c\') |+--------------------------+| 3 |+--------------------------+1 row in set (0.00 sec)mysql> select find_in_set(\'b\',\'a,b,c\');+--------------------------+| find_in_set(\'b\',\'a,b,c\') |+--------------------------+| 2 |+--------------------------+1 row in set (0.01 sec)
- 在集合当中查找某一个元素是否存在。
- 判断元素是否在集合当中,不是判断是否相等。
mysql> select * from votes where find_in_set(\'羽毛球\',hobby);+-----------+--------+----------------------------+| username | gender | hobby|+-----------+--------+----------------------------+| 孙尚香 | 女 | 羽毛球 || 曹操 | 男 | 羽毛球,乒乓球,篮球 || 刘表 | 男 | 羽毛球 || 刘表 | 男 | 代码,羽毛球 || 夏侯惇 | 男 | 代码,羽毛球,乒乓球 |+-----------+--------+----------------------------+5 rows in set (0.00 sec)//我们要是想查看包含‘代码’和‘羽毛球’的呢?//where相当于一种条件判断,可以有一个函数对应的结果,也可以把多种函数连起来mysql> select * from votes where find_in_set(\'羽毛球\',hobby) and find_in_set(\'代码\',hobby);+-----------+--------+----------------------------+| username | gender | hobby|+-----------+--------+----------------------------+| 刘表 | 男 | 代码,羽毛球 || 夏侯惇 | 男 | 代码,羽毛球,乒乓球 |+-----------+--------+----------------------------+2 rows in set (0.00 sec)
👍 如果对你有帮助,欢迎:
- 点赞 ⭐️
- 收藏 📌
- 关注 🔔