MySQL:ENUM、SET与查询技巧

一、ENUM类型(单选)

1.ENUM存储原理

sql 复制代码
-- 创建示例表
CREATE TABLE user (
    id INT PRIMARY KEY,
    gender ENUM('男','女','未知')  -- 实际存储的是数字下标
);

  底层存储映射
'男'   → 1 
'女'   → 2
'未知' → 3 

2.ENUM的查询方式

sql 复制代码
SELECT * FROM user WHERE gender = '男';

SELECT * FROM user WHERE gender = 1;

二、SET类型(多选)

1.SET存储原理(位掩码机制)

sql 复制代码
CREATE TABLE player (
    id INT PRIMARY KEY,
    hobby SET('读书','游戏','音乐','运动','旅游','美食','电影','购物')
);

  位掩码对应关系(2的幂次方)
读书 = 1   (2⁰) → 二进制 00000001
游戏 = 2   (2¹) → 二进制 00000010
音乐 = 4   (2²) → 二进制 00000100
运动 = 8   (2³) → 二进制 00001000
旅游 = 16  (2⁴) → 二进制 00010000
美食 = 32  (2⁵) → 二进制 00100000
电影 = 64  (2⁶) → 二进制 01000000
购物 = 128 (2⁷) → 二进制 10000000

组合存储原理

用户选择了"读书"和"音乐"

实际存储:1 | 4 = 5 → 二进制 00000101

显示为:'读书,音乐'

用户全选

实际存储:1|2|4|8|16|32|64|128 = 255 → 二进制 11111111

显示为:'读书,游戏,音乐,运动,旅游,美食,电影,购物'

2.SET的三种查询方式

(1)位运算查询(最高效)

sql 复制代码
1. 查询包含"音乐"(4)的用户
SELECT * FROM player WHERE hobby & 4;

2. 查询同时包含"音乐"(4)和"运动"(8)的用户
SELECT * FROM player WHERE hobby & 12 = 12;  -- 4+8=12

3. 查询只包含"音乐"和"运动"的用户(精确匹配)
SELECT * FROM player WHERE hobby = 12;

4. 查询不包含"游戏"(2)的用户
SELECT * FROM player WHERE NOT (hobby & 2);

(2)find_in_set(sub,str_list)查询

sub是字符串,在只知晓字符串的时候可以用这个查询。

sql 复制代码
查询包含"音乐"的用户
SELECT * FROM player WHERE FIND_IN_SET('音乐', hobby);

查询包含"音乐"或"运动"的用户
SELECT * FROM player 
WHERE FIND_IN_SET('音乐', hobby) 
   OR FIND_IN_SET('运动', hobby);

注意sub只能是字符串,不能用数字带替。

(3)LIKE模糊查询

sql 复制代码
查询包含"音乐"的用户
SELECT * FROM player WHERE hobby LIKE '%音乐%';

查询以"音乐"开头的
SELECT * FROM player WHERE hobby LIKE '音乐%';

查询以"音乐"结尾的
SELECT * FROM player WHERE hobby LIKE '%音乐';

3.SET的增删改操作

(1)增加

sql 复制代码
给id=1的用户添加"运动"(8)
UPDATE player 
SET hobby = hobby | 8 
WHERE id = 1;

(2)删除

sql 复制代码
从id=1的用户移除"运动"(8)
UPDATE player 
SET hobby = hobby & ~8 
WHERE id = 1;

(3)切换选项(有则删,无则加)

类似于开关

sql 复制代码
 切换"运动"选项
UPDATE player 
SET hobby = hobby ^ 8 
WHERE id = 1;
相关推荐
Database_Cool_9 小时前
AnalyticDB MySQL vs StarRocks/ByteHouse:云数仓选型指南——全托管 vs 自建方案
数据库·数据仓库·mysql·阿里云
AI人工智能+电脑小能手10 小时前
【大白话说Java面试题 第99题】【Mysql篇】第29题:如何选择合适的分布式主键方案?
java·数据库·分布式·mysql·面试
拾贰_C12 小时前
【mysql | windows | installation】 MySQL5.安装
数据库·windows·mysql
yuezhilangniao13 小时前
MySQL 8.0.32 二进制安装脚本 和初始化 操作系统版本rocky86
数据库·mysql·adb
学代码的真由酱14 小时前
MySQL数据库进阶-数据库设计实践-Java
数据库·mysql·数据库设计
遇事不決洛必達14 小时前
【数据库系列】本地映射云服务器Mysql的方法
服务器·数据库·mysql·定时任务
yuezhilangniao15 小时前
xtr备份prepare到底变化了啥
mysql
yyk的萌15 小时前
创建属于自己的mysql的mcp
mysql·adb·ai·mcp
流烟默15 小时前
腾讯云Centos7.6使用yum安装MySQL8
mysql·centos·腾讯云
仙俊红15 小时前
如何优化 MySQL 深分页 SQL
android·sql·mysql