文章目录
-
- 一、基础用法
- [二、IN 子查询](#二、IN 子查询)
-
- [IN 单列查询](#IN 单列查询)
- [IN 多列查询](#IN 多列查询)
一、基础用法
mysql中IN常用于WHERE表达式中,其作用是查询某个范围内的数据。
(注意:null参与任何运算的布尔值都是假)
sql
select * from where field in (value1,value2,value3,...)
当 IN 前面加上 NOT 运算符时,表示与 IN 相反的意思,即不在这些列表项内选择
sql
select * from where field not in (value1,value2,value3,...)
二、IN 子查询
IN 单列查询
更多情况下,IN 列表项的值是不明确的,而可能是通过一个子查询得到的:
sql
SELECT * FROM article WHERE uid IN(
SELECT uid FROM user WHERE status=0
)
在这个 SQL 例子里,我们实现了查出所有状态为 0 的用户(可能是被禁止)的所有文章。首先通过一个查询得到所有所有 status=0 的用户:
IN 多列查询
既然能单个字段in单列结果,那么多个字段就能in多列结果了。
sql
SELECT
*
FROM
student s
WHERE
( s.class, s.score ) -- student表中数据符合每个班最高分的数据筛选出来
IN (
SELECT class, max( score ) -- 每个班级的最高分
FROM student
GROUP BY class
)
查询生效时间从过去到到当日最晚的数据
sql
SELECT
*
FROM
template_business
WHERE
(
-- 生效时间是在当天
effective_date = CURDATE()
OR
(
-- 生效时间是在过去
effective_date < CURDATE()
AND (tmpl_biz_type, tmpl_no, effective_date)
IN (
SELECT
tmpl_biz_type, tmpl_no, MAX(effective_date)
FROM
template_business
WHERE
-- 生效时间是在过去
effective_date < CURDATE()
GROUP BY
tmpl_biz_type, tmpl_no
)
)
) ORDER BY tmpl_biz_type, tmpl_no, effective_date DESC