【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)

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

  • 点赞 ⭐️
  • 收藏 📌
  • 关注 🔔
相关推荐
程序员岳焱4 分钟前
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
后端·sql·mysql
Channing Lewis1 小时前
sql server如何创建表导入excel的数据
数据库·oracle·excel
秃头摸鱼侠1 小时前
MySQL安装与配置
数据库·mysql·adb
UGOTNOSHOT1 小时前
每日八股文6.3
数据库·sql
行云流水行云流水1 小时前
数据库、数据仓库、数据中台、数据湖相关概念
数据库·数据仓库
John Song1 小时前
Redis 集群批量删除key报错 CROSSSLOT Keys in request don‘t hash to the same slot
数据库·redis·哈希算法
IvanCodes2 小时前
七、Sqoop Job:简化与自动化数据迁移任务及免密执行
大数据·数据库·hadoop·sqoop
婵鸣空啼2 小时前
GD图像处理与SESSiON
android
tonexuan2 小时前
MySQL 8.0 绿色版安装和配置过程
数据库·mysql
JohnYan2 小时前
工作笔记- 记一次MySQL数据移植表空间错误排除
数据库·后端·mysql