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;
相关推荐
IT瑞先生17 分钟前
Docker快速部署Mysql的三种方法——实操篇
mysql·adb·docker
数据库小学妹37 分钟前
MySQL在线DDL实战:ALGORITHM三种算法对比+gh-ost变更管理SOP
mysql·dba·数据库运维·在线ddl·mdl锁·sql变更管理
Ethan01072 小时前
隔离级别管读,乐观锁管写——RC/RR 与写冲突的本质
mysql
熊文豪3 小时前
【金仓数据库征文】不装中间件的 MySQL→金仓在线迁移,mysql_fdw 全流程,和一个差点漏掉的 emoji
数据库·mysql·中间件·电科金仓
C++、Java和Python的菜鸟3 小时前
第5章 后端Web基础 (MySQL基础)
前端·mysql·adb
IT瑞先生4 小时前
MariaDB与Mysql差异及版本对照
数据库·mysql·mariadb
秋风渡.4 小时前
MySQL数据库操作
数据库·mysql
乐橙开放平台5 小时前
养殖 SaaS 笔记:乐橙 IoT 物模型管环境,视频 OpenAPI 管回看
数据库·笔记·物联网·mysql·音视频
鸽芷咕7 小时前
MySQL/PostgreSQL 迁移金仓 KES:LEFT JOIN 丢数据排查与避坑指南
数据库·mysql·postgresql
Ai拆代码的曹操19 小时前
索引失效的 10 种场景:MySQL EXPLAIN 逐一验证与根因分析
android·数据库·mysql