数据库-数据查询-in和Not in
引言
终极生活化指南:IN 和 NOT IN 就是你的点菜权
想象一下,你正站在一个视频平台的“巨型菜单”前,面对着海量的视频内容。而你手握两大点菜神器:IN 和 NOT IN,它们将帮助你精准地筛选出你想要的视频内容。
操作符核心动作拆解
操作符 | 动作本质 | 生活场景 | 数据效果 |
---|---|---|---|
IN | 精准抓取 | 勾选"必吃招牌菜" | 只呈现明确指定的内容 |
NOT IN | 智能过滤 | 划掉"忌口食材" | 排除干扰项的全量展示 |
沉浸式点菜体验
🍲 场景一:精品独享模式 (IN)
[你滑动菜单] → 勾选 ✅: IN ('爆款剧','独家综艺','影院新片') [后厨响应] → 火速上菜: 《庆余年2》(爆款剧) | 《歌手2024》(独家综艺) | 《热辣滚烫》(影院新片)
💡 洞察:
像在爱奇艺"迷雾剧场"精准点播——用 IN 锁定头部内容,为优质资源付费。
解释:
你明确告诉平台你感兴趣的类别,平台根据你的选择,只推荐符合这些类别的剧集。这就像你在一家高档餐厅,只选择他们最拿手的几道招牌菜。
🍜 场景二:自由探索模式 (NOT IN)
[你标注禁忌] → 划掉 ❌: NOT IN ('广告','营销号','低质搬运') [后厨响应] → 惊喜套餐: 大学生露营vlog | 手作匠人纪录片 | 猫咪相声 ← B站抖音原生创作
💡 洞察:
像在抖音开启"青少年模式"——用 NOT IN 清扫垃圾信息,让兴趣自然浮现。
解释:
你告诉平台你不想看到的内容类型,平台根据你的选择,排除掉这些内容,只推荐其他类型的视频。这就像你在餐厅点菜时,告诉服务员你不想吃某些食材,其他的都行。
高级吃法:组合技示范
[米其林式点单]
1. 主菜范围:IN ('科技','数码')
2. 食材要求:NOT IN ('厂商赞助','参数推销')
特制套餐 →
《高中生魔改光刻机》|《退休工程师修文物》
精髓:
双重筛选 = 在B站科技区挖到宝藏UP主。
解释:
你不仅告诉平台你感兴趣的领域,还排除了你不想要的内容类型。这就像你在一家米其林餐厅点餐,既选择了主菜,又对食材提出了具体要求。
为什么产品经理视此为瑞士军刀
使用场景 | IN案例 | NOT IN案例 |
---|---|---|
用户运营 | 用户ID IN (30日付费清单) | 推送对象 NOT IN (已流失用户) |
内容安全 | 视频 IN (优质创作者白名单) | 屏蔽内容 NOT IN (过审词库) |
商业策略 | 资源 IN (S级项目) → 首页强推 | 广告位 NOT IN (会员专区) |
解释:
产品经理利用 IN 和 NOT IN 来精准定位用户群体,管理内容安全,制定商业策略。这就像他们手中的一把瑞士军刀,帮助他们高效地处理各种任务。
灵魂总结
💎 IN 思维 → "我只要鱼子酱和松露" ▸ 精英主义 ▸ 内容严选 ▸ 爱优腾芒模式 💎 NOT IN 思维 → "不要葱姜蒜其他随便" ▸ 开放包容 ▸ 过滤干扰 ▸ B抖快哲学
⚠️ 点菜潜规则:
当你说NOT IN ('香菜')
时——
后厨可能给你芹菜(未排除项)
正如数据库不会返回NULL
值(小心隐藏陷阱!)
点菜哲学
下次写SQL时,记住这把数据筷子:
左手 IN 夹取目标,右手 NOT IN 撇去浮油,方能品出数据真味 🥢
数据查询-in
# 简单查询 在表中某个数据在指定范围内查询 inuse DataQueryStudy;#就拿原神来举例子吧
#角色绰号create table NickName(id int primary key AUTO_INCREMENT ,name varchar(64),nickName varchar(64));#插入数据
insert into NickName values(1001,'温迪','酒蒙子');
insert into NickName (name,nickName) VALUES('温迪','卖唱的');
insert into NickName (name,nickName)values('温迪','该溜子');
insert into NickName (name,nickName)values('钟离','社会废人');
insert into NickName (name,nickName)values('雷电影','技术宅女');
insert into NickName (name,nickName)values('纳西妲','?');
insert into NickName (name,nickName)values('芙宁娜','芙导');#查询所有的数据
select *from NickName ;
#查询根据该溜子的绰号找到符合该溜子的
select *from NickName where nickName in('该溜子');select *from nickName where nickname in('该溜子','社会废人');
#通过绰号找到对应的名字 哪怕有一个字写漏了 这就是规则
select name from nickName where nickname in('该溜子','社会废人','技术宅女');
select * from nickName where nickname in('该溜子','社会废人','技术宅女');#not in 相反过来了的
select name from nickName where nickname not in('该溜子','社会废人','技术宅女');
# not in 查找一个不存在 nickName : 酒蒙子 卖唱的 ?芙导
select* from nickName where nickname not in('该溜子','社会废人','技术宅女');# not in 当然不会忽视null的值insert into NickName (name,nickName)values('法涅斯','天理');
#现在的第三降临者是未知的
insert into NickName (name)values('第三降临者');#我正向查找in 无论怎么样都不可能查找为nickName :null
select * from nickName where nickname in('该溜子','社会废人','技术宅女');
select * from nickName where nickname in('天理');#我反向查找 not in 无论怎么样都不可以查找为nickName :null
select * from nickName where nickname not in('该溜子','社会废人','技术宅女');
select * from nickName where nickname not in('天理');
select * from nickName;
update nickName set nickName=null where nickname in('天理');
#不能使用null 作为查询条件 除非第三降临者是法厄同嘿嘿嘿
select * from nickName where nickname in(null);
select * from nickName where nickname not in(null);
简单查询:在表中根据指定范围查询数据(使用 IN
和 NOT IN
)
我们将使用 原神 中的角色绰号作为例子,创建一个名为 NickName
的表,并演示如何使用 IN
和 NOT IN
操作符进行查询。
1. 创建表 NickName
USE DataQueryStudy;CREATE TABLE NickName (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(64),nickName VARCHAR(64)
);
2. 插入数据
INSERT INTO NickName (name, nickName) VALUES
('温迪', '酒蒙子'),
('温迪', '卖唱的'),
('温迪', '该溜子'),
('钟离', '社会废人'),
('雷电影', '技术宅女'),
('纳西妲', '?'),
('芙宁娜', '芙导'),
('法涅斯', '天理');
3. 插入更多数据
-- 插入第三降临者,昵称为 NULL
INSERT INTO NickName (name) VALUES ('第三降临者');
4. 查询所有数据
SELECT * FROM NickName;
结果:
id | name | nickName |
---|---|---|
1001 | 温迪 | 酒蒙子 |
1002 | 温迪 | 卖唱的 |
1003 | 温迪 | 该溜子 |
1004 | 钟离 | 社会废人 |
1005 | 雷电影 | 技术宅女 |
1006 | 纳西妲 | ? |
1007 | 芙宁娜 | 芙导 |
1008 | 法涅斯 | 天理 |
1009 | 第三降临者 | NULL |
5. 使用 IN
进行查询
5.1 根据绰号查找角色
SELECT * FROM NickName WHERE nickName IN ('该溜子');
结果:
id | name | nickName |
---|---|---|
1003 | 温迪 | 该溜子 |
5.2 根据多个绰号查找角色
SELECT * FROM NickName WHERE nickName IN ('该溜子', '社会废人');
结果:
id | name | nickName |
---|---|---|
1003 | 温迪 | 该溜子 |
1004 | 钟离 | 社会废人 |
5.3 通过绰号查找对应的名字(即使有一个字写漏了)
SELECT name FROM NickName WHERE nickName IN ('该溜子', '社会废人', '技术宅女');
结果:
name |
---|
温迪 |
钟离 |
雷电影 |
5.4 获取完整的角色信息
SELECT * FROM NickName WHERE nickName IN ('该溜子', '社会废人', '技术宅女');
结果:
id | name | nickName |
---|---|---|
1003 | 温迪 | 该溜子 |
1004 | 钟离 | 社会废人 |
1005 | 雷电影 | 技术宅女 |
6. 使用 NOT IN
进行反向查询
6.1 查找不包含特定绰号的角色
SELECT name FROM NickName WHERE nickName NOT IN ('该溜子', '社会废人', '技术宅女');
结果:
name |
---|
温迪 |
纳西妲 |
芙宁娜 |
法涅斯 |
6.2 查找 nickName
不为特定值的角色(包含 NULL
)
SELECT * FROM NickName WHERE nickName NOT IN ('该溜子', '社会废人', '技术宅女');
结果:
id | name | nickName |
---|---|---|
1001 | 温迪 | 酒蒙子 |
1002 | 温迪 | 卖唱的 |
1006 | 纳西妲 | ? |
1007 | 芙宁娜 | 芙导 |
1008 | 法涅斯 | 天理 |
1009 | 第三降临者 | NULL |
注意:由于 nickName
为 NULL
的记录不会被包含在 NOT IN
的结果中,因为 NULL
值在 SQL 中具有特殊的处理方式。
7. 关于 NULL
值的处理
7.1 使用 IN
查询 nickName
为 NULL
的记录
SELECT * FROM NickName WHERE nickName IN (NULL);
结果:
空集
解释:在 SQL 中,IN (NULL)
不会返回任何记录,因为 NULL
表示未知,无法与任何值进行比较。
7.2 使用 NOT IN
查询 nickName
不为 NULL
的记录
SELECT * FROM NickName WHERE nickName NOT IN (NULL);
结果:
空集
解释:同样地,NOT IN (NULL)
也不会返回任何记录,因为 NULL
无法与任何值进行比较。
7.3 更新 nickName
为 NULL
UPDATE NickName SET nickName = NULL WHERE nickName IN ('天理');
结果:
将 nickName
为 '天理'
的记录的 nickName
更新为 NULL
。
7.4 再次查询 nickName
为 NULL
的记录
SELECT * FROM NickName WHERE nickName IS NULL;
结果:
id | name | nickName |
---|---|---|
1009 | 第三降临者 | NULL |
解释:
要查询 nickName
为 NULL
的记录,必须使用 IS NULL
或 IS NOT NULL
,而不是 IN
或 NOT IN
。