Skip to content

SQL IN

SQL IN 运算符用于在 WHERE 子句中指定多个可能的值,当列的值匹配其中任何一个值时,就返回该记录。

IN 语法

sql
SELECT column1, column2, ...
FROM table_name
WHERE column_name IN (value1, value2, ..., valueN);

NOT IN 语法

使用 NOT IN 可以查询列的值不在指定集合中的记录:

sql
SELECT column1, column2, ...
FROM table_name
WHERE column_name NOT IN (value1, value2, ..., valueN);

示例

假设我们有一个名为 students 的表,包含以下数据:

idnameagegrade
1张三18高三
2李四17高二
3王五19高三
4赵六16高一
5钱七18高三

示例 1:使用 IN 查询指定年龄的学生

查询年龄为 16、17 或 18 的学生:

sql
SELECT * FROM students WHERE age IN (16, 17, 18);

结果:

idnameagegrade
1张三18高三
2李四17高二
4赵六16高一
5钱七18高三

示例 2:使用 NOT IN 查询不在指定年龄的学生

查询年龄不是 16、17 或 18 的学生:

sql
SELECT * FROM students WHERE age NOT IN (16, 17, 18);

结果:

idnameagegrade
3王五19高三

示例 3:使用 IN 查询指定年级的学生

查询年级为高一或高三的学生:

sql
SELECT * FROM students WHERE grade IN ('高一', '高三');

结果:

idnameagegrade
1张三18高三
3王五19高三
4赵六16高一
5钱七18高三

示例 4:IN 子查询

IN 运算符也可以与子查询一起使用,子查询返回的结果集将作为 IN 的值列表:

sql
-- 假设我们有一个名为 honors 的表,包含所有获得荣誉的学生的 id
SELECT * FROM students WHERE id IN (SELECT student_id FROM honors);

IN 与 OR 的比较

当需要匹配多个值时,使用 IN 运算符通常比使用多个 OR 条件更简洁、更易读:

  • 使用 OR:WHERE age = 16 OR age = 17 OR age = 18
  • 使用 IN:WHERE age IN (16, 17, 18)

注意事项

  1. 性能考虑:对于少量的值,IN 和 OR 的性能差异不大。但对于大量的值,使用 IN 通常比使用多个 OR 条件更高效。

  2. NULL 值:如果 IN 列表中包含 NULL 值,不会影响查询结果,因为 NULL 值无法与任何值进行比较(包括 NULL 本身)。

  3. 子查询性能:当使用 IN 子查询时,如果子查询返回大量结果,可能会影响查询性能。在这种情况下,可以考虑使用 JOIN 或 EXISTS 来优化查询。

小结

SQL IN 运算符是一种用于指定多个可能值的简洁方法,它可以使查询语句更简洁、更易读。当需要匹配多个值时,使用 IN 运算符通常比使用多个 OR 条件更好。