Appearance
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 的表,包含以下数据:
| id | name | age | grade |
|---|---|---|---|
| 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);结果:
| id | name | age | grade |
|---|---|---|---|
| 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);结果:
| id | name | age | grade |
|---|---|---|---|
| 3 | 王五 | 19 | 高三 |
示例 3:使用 IN 查询指定年级的学生
查询年级为高一或高三的学生:
sql
SELECT * FROM students WHERE grade IN ('高一', '高三');结果:
| id | name | age | grade |
|---|---|---|---|
| 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)
注意事项
性能考虑:对于少量的值,IN 和 OR 的性能差异不大。但对于大量的值,使用 IN 通常比使用多个 OR 条件更高效。
NULL 值:如果 IN 列表中包含 NULL 值,不会影响查询结果,因为 NULL 值无法与任何值进行比较(包括 NULL 本身)。
子查询性能:当使用 IN 子查询时,如果子查询返回大量结果,可能会影响查询性能。在这种情况下,可以考虑使用 JOIN 或 EXISTS 来优化查询。
小结
SQL IN 运算符是一种用于指定多个可能值的简洁方法,它可以使查询语句更简洁、更易读。当需要匹配多个值时,使用 IN 运算符通常比使用多个 OR 条件更好。