
文章目录
-
- [1. 数据类型分类](#1. 数据类型分类)
- [2. 数值类型](#2. 数值类型)
-
- [2.1 tinyint类型](#2.1 tinyint类型)
- [2.2 bit类型](#2.2 bit类型)
- [2.3 小数类型](#2.3 小数类型)
-
- [2.3.1 float](#2.3.1 float)
- [2.3.2 decimal](#2.3.2 decimal)
- [2.4 字符串类型](#2.4 字符串类型)
-
- [2.4.1 char](#2.4.1 char)
- [2.4.2 varchar](#2.4.2 varchar)
- [2.4.3 char和varchar比较](#2.4.3 char和varchar比较)
- [2.5 日期和时间类型](#2.5 日期和时间类型)
- [2.6 enum和set](#2.6 enum和set)
- [2.7 enum和set类型查找](#2.7 enum和set类型查找)
1. 数据类型分类

2. 数值类型

2.1 tinyint类型
创建一个tinyint
类型的表
- 首先我们创建一个名叫
t1
的表
cpp
create table if not exists t1(
num tinyint
);
- 查看
t1
表结构
cpp
desc t1;

- 查看当前数据库的表名称
cpp
show tables;

- 显示创建这个表时对应的语法细节
cpp
show create table t1 \G;

- 插入数据
sql
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
的表
sql
create table if not exists t2(
num tinyint unsigned
);
- 查看数据库中的表
- 查看
t2
表的结构
sql
desc t2;

- 插入数据
sql
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类型
基本语法:
sql
bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。
- 创建
t3
表
sql
create table if not exists t3(
id int,
online bit(1)
);
online
表示当前用户是否在线
- 查看表的结构
sql
desc t3;

- 插入数据
sql
insert into t3 (id,online) values (123,0);
insert into t3 (id,online) values (124,1);
当我们再次插入5,3,2
时就会发现不让我们进行插入了。
原因是online
只有一个比特位,我们只能插入0
,或者1
。
- 查看表中的内容
sql
select * from t3;

我们的bit
数据为什么会以十六进制的形式显示呢?
原因是在MySQL8.0
版本中,客户端会默认开启--binary-as-hex
这个选项,导致bit
字段显示为十六进制 。
方法1:显式转换字段类型
通过SQL函数将BIT
字段转换为需要的格式:
sql
-- 转换为十进制数字
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时,禁用十六进制显示二进制数据的选项:
bash
mysql --skip-binary-as-hex -u your_user -p
或在配置文件(如~/.my.cnf
)中永久禁用:
ini
[client]
binary-as-hex = OFF
方法3:使用CAST函数直接转换
将BIT
字段强制转换为CHAR
类型:
sql
SELECT id, CAST(flags AS CHAR) AS char_raw FROM test_bit;
但此方法可能仍显示为二进制字符串(如b'01000001'
),需进一步处理:
sql
SELECT id, CHAR(CAST(flags AS UNSIGNED)) AS char_value FROM test_bit;
2.3 小数类型
2.3.1 float
语法:
sql
float[(m, d)] [unsigned] : m指定显示长度,d指定小数位数,占用空间4个字节
- 创建一个表
t5
(有符号)-99.99-99.99
sql
create table if not exists t5(
id int,
salary float(4,2)
);
t5
表的类型
sql
desc t5;

- 插入数据
sql
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);

- 插入
sql
insert into t5 (id,salary) values (6,100.00);
insert into t5 (id,salary) values (7,100.0);

当我们插入100.00
和100.0
的时候就会发现不让我们插入。
- 插入
sql
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
(无符号)
sql
create table if not exists t6(
id bigint,
salary float(4,2) unsigned
);
- 表的类型
sql
desc t6;

- 插入数据
sql
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
语法:
sql
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
sql
create table if not exists t7(
f1 float(10,8),
f2 decimal(4,2)
);
- 查看表结构
sql
desc t7;

- 插入数据
sql
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
sql
alter table t7 modify f2 decimal(10,8);

- 给
f1
和f2
插入同样的数据
sql
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
语法:
sql
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 1
mysql> 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 1
mysql> 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
语法:
sql
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节 ,21845个字符
案例:
sql
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 1
mysql> 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
子句:
sql
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
,恢复旧版自动行为。但需注意,这可能影响其他表的预期行为:
sql
SET GLOBAL explicit_defaults_for_timestamp = OFF;
注意:此方法需重启MySQL服务并重建表,仅建议在明确了解影响后使用。
方法3:插入时手动赋值
若需保留字段灵活性,可在插入语句中直接指定时间戳:
sql
INSERT INTO example (id, created_at) VALUES (1, CURRENT_TIMESTAMP);
案例:
sql
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: 0
mysql> 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个。
说明:不建议在添加枚举值,集合值的时候采用数字的方式,因为不利于阅读。
案例:
sql
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 1
mysql> insert into votes values ('张飞','b','代码');
ERROR 1265 (01000): Data truncated for column 'gender' at row 1
mysql> 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中选择
sql
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中选择
sql
//爱好只有'羽毛球'
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函数:
sql
//在'a,b,c'中查找'a',成功返回1,失败返回0
mysql> 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)
- 在集合当中查找某一个元素是否存在。
- 判断元素是否在集合当中,不是判断是否相等。
sql
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)
👍 如果对你有帮助,欢迎:
- 点赞 ⭐️
- 收藏 📌
- 关注 🔔