产品操作MySQL第7篇 – 运算符 - IN
本资料为产品岗位作为日常工作参考,语言口语化
At 2019/4/26 By David.Yang
什么是IN查询
当你有一个多值的列表,想要确认指定的值是否在一个列表中,
在或者想确认一个值在一个子查询的结果集中能否匹配到,
这时候就是IN查询的使用场景了。
语法
SELECT
column1, column2, ...
FROM
table_name
WHERE
(expr | column_1) IN ('value1', 'value2', ...);
ϒ WHERE进行条件过滤时可以与IN配合使用,,可以使用列或表达式
ϒ 列表中的多值使用英文(,)进行分割
ϒ IN运算符可以在INSERT UPDATE DELETE的WHERE中使用
如果column_1的值等于IN的列表当中任何一个值,expr一样,则IN运算符返回TRUE,否则返回FALSE。
IN查询演示
IN的过滤查询
我们有学生表,学生有国籍,
desc students;
我们想通过国籍定位出南宋和西夏用户有哪些,
通过IN过滤来处理可以这么做。
SQL
SELECT
*
FROM
students
WHERE
nationality IN ("南宋", "西夏");
得到结果集如下
类比实现
我们之前学过OR运算符,他也可以达到我们想要的查询效果
SELECT
*
FROM
students
WHERE
nationality = '南宋' OR nationality = '西夏';
得到结果集
NOT IN
当我们想查找不在列表值中的数据行时,可以使用NOT IN来实现,
比如我们想看看南宋和西夏之外的学生有哪些人呢,
我们可以这么做。
SQL
SELECT
*
FROM
students
WHERE
nationality NOT IN ("南宋", "西夏");
结果集
IN与子查询
IN与子查询的案例
周伯通!
老顽童自创左右互搏术,这个老头特别好玩,徒弟学的不好他就不认人家,
他倒想看看他的学生哪些左右互搏术成绩在90分以上的。
我们有两张表,学生表和测验表。
desc students;
desc tests;
两张表的关系:通过学生id关联
周伯通要知道左右互搏术考试90分以上的学生,
可以通过IN和子查询组合进行数据过滤,
这次他不用再不好意问一灯了
SQL
SELECT
*
FROM
students
WHERE
number IN (
SELECT
stuno
FROM
tests
WHERE
score >= 90
AND
courseno = 1
);
上面的语句执行完的到结果集
拆分需求讲解
以上的查询其实可以拆分成2个。
ϒ 子查询
查询测验表中【课程=左右互搏术】,并且【得分>=90分】,并且我们需要的是学生号列表
SQL
SELECT
stuno
FROM
tests
WHERE
score >= 90
AND
courseno = 1;
得到学生号列表
ϒ 主查询中
查询学生表,并且WHERE子句中应用IN,来确认学生号在指定的学生号列表中。
SQL
SELECT
*
FROM
students
WHERE
number IN (
2, 10, 16, 25
);
得到结果集为
验证一下是不是和上文的查询结果一样?
当然是一样的啦。
在本篇中解释了怎么应用IN查询来匹配指定列的数据是否在列表当中,
是学会了码?
Bye Bye~