【MySQL】004.MySQL数据类型

文章目录

    • [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.00100.0的时候就会发现不让我们插入。

  • 插入
sql 复制代码
insert into t5 (id,salary) values (4,23.456);
insert into t5 (id,salary) values (5,23.454);

当我们插入23.45623.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.99699.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);
  • f1f2插入同样的数据
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_TIMESTAMPON 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个比特位,当我们插入100000 -> 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)
  1. 在集合当中查找某一个元素是否存在。
  2. 判断元素是否在集合当中,不是判断是否相等。
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)

👍 如果对你有帮助,欢迎:

  • 点赞 ⭐️
  • 收藏 📌
  • 关注 🔔
相关推荐
Ya-Jun26 分钟前
常用第三方库精讲:cached_network_image图片加载优化
android·flutter
_一条咸鱼_27 分钟前
Android嵌套滑动详解
android·面试·android jetpack
曹弘毅1 小时前
doris/clickhouse常用sql
数据库·sql·clickhouse·doris
菜萝卜子1 小时前
【Redis】redis主从哨兵
数据库·redis·缓存
蒂法就是我1 小时前
MySQL 的锁,表级锁是哪一层的锁?行锁是哪一层的锁?
数据库·mysql
怒放吧德德2 小时前
MySQL篇:MySQL如何实时同步到ES
mysql·elasticsearch·面试
IvanCodes2 小时前
MySQL 锁机制
数据库·sql·mysql·oracle
青春不流名2 小时前
docker-compose之graylog
数据库·mongodb
橘猫云计算机设计2 小时前
springboot-基于Web企业短信息发送系统(源码+lw+部署文档+讲解),源码可白嫖!
java·前端·数据库·spring boot·后端·小程序·毕业设计
林枫依依2 小时前
Unity 将Excel表格中的数据导入到Mysql数据表中
数据库·mysql·excel