MySQL(25)如何使用IN筛选特定数据?

8 阅读3分钟

使用 IN 运算符可以筛选出在指定集合内的数据。这在需要从某列中选择多个特定值时非常有用。IN 运算符可以简化多个 OR 条件的查询,提高代码的可读性。

基本语法

SELECT column1, column2, ...
FROM table_name
WHERE column IN (value1, value2, ...);

示例数据库和表结构

假设我们有一个公司数据库,其中有两个表:employeesdepartments

-- 创建数据库
CREATE DATABASE company;

-- 选择数据库
USE company;

-- 创建表 departments
CREATE TABLE departments (
    dept_id INT AUTO_INCREMENT PRIMARY KEY,
    dept_name VARCHAR(100) NOT NULL
);

-- 创建表 employees
CREATE TABLE employees (
    emp_id INT AUTO_INCREMENT PRIMARY KEY,
    emp_name VARCHAR(100) NOT NULL,
    emp_position VARCHAR(100),
    emp_salary DECIMAL(10, 2),
    hire_date DATE,
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

-- 插入示例数据到 departments 表
INSERT INTO departments (dept_name)
VALUES 
('HR'),
('Engineering'),
('Marketing');

-- 插入示例数据到 employees 表
INSERT INTO employees (emp_name, emp_position, emp_salary, hire_date, dept_id)
VALUES 
('John Doe', 'Manager', 75000.00, '2023-10-01', 1),
('Jane Smith', 'Developer', 60000.00, '2023-09-01', 2),
('Alice Johnson', 'Analyst', 50000.00, '2023-08-01', 1),
('Bob Brown', 'Developer', 70000.00, '2023-07-01', 2),
('Charlie Brown', 'Tester', 55000.00, '2023-11-01', 3);

使用 IN 的示例

1. 筛选部门 ID 为 1 或 2 的员工

SELECT * FROM employees
WHERE dept_id IN (1, 2);

结果:

emp_id | emp_name      | emp_position | emp_salary | hire_date  | dept_id
-------|---------------|--------------|------------|------------|--------
1      | John Doe      | Manager      | 75000.00   | 2023-10-01 | 1
2      | Jane Smith    | Developer    | 60000.00   | 2023-09-01 | 2
3      | Alice Johnson | Analyst      | 50000.00   | 2023-08-01 | 1
4      | Bob Brown     | Developer    | 70000.00   | 2023-07-01 | 2

2. 筛选职位为 'Developer' 或 'Tester' 的员工

SELECT * FROM employees
WHERE emp_position IN ('Developer', 'Tester');

结果:

emp_id | emp_name      | emp_position | emp_salary | hire_date  | dept_id
-------|---------------|--------------|------------|------------|--------
2      | Jane Smith    | Developer    | 60000.00   | 2023-09-01 | 2
4      | Bob Brown     | Developer    | 70000.00   | 2023-07-01 | 2
5      | Charlie Brown | Tester       | 55000.00   | 2023-11-01 | 3

3. 筛选名字为 'John Doe' 或 'Alice Johnson' 的员工

SELECT * FROM employees
WHERE emp_name IN ('John Doe', 'Alice Johnson');

结果:

emp_id | emp_name      | emp_position | emp_salary | hire_date  | dept_id
-------|---------------|--------------|------------|------------|--------
1      | John Doe      | Manager      | 75000.00   | 2023-10-01 | 1
3      | Alice Johnson | Analyst      | 50000.00   | 2023-08-01 | 1

使用 NOT IN 运算符

有时我们需要排除特定值,可以使用 NOT IN

4. 排除部门 ID 为 1 和 2 的员工

SELECT * FROM employees
WHERE dept_id NOT IN (1, 2);

结果:

emp_id | emp_name      | emp_position | emp_salary | hire_date  | dept_id
-------|---------------|--------------|------------|------------|--------
5      | Charlie Brown | Tester       | 55000.00   | 2023-11-01 | 3

使用 IN 和子查询

IN 运算符也可以与子查询结合使用,以动态生成筛选条件。

5. 筛选部门名称为 'Engineering' 的员工

SELECT * FROM employees
WHERE dept_id IN (SELECT dept_id FROM departments WHERE dept_name = 'Engineering');

结果:

emp_id | emp_name   | emp_position | emp_salary | hire_date  | dept_id
-------|------------|--------------|------------|------------|--------
2      | Jane Smith | Developer    | 60000.00   | 2023-09-01 | 2
4      | Bob Brown  | Developer    | 70000.00   | 2023-07-01 | 2

使用 IN 和其他条件结合

6. 筛选部门 ID 为 1 或 2 且薪水大于 60000 的员工

SELECT * FROM employees
WHERE dept_id IN (1, 2) AND emp_salary > 60000;

结果:

emp_id | emp_name   | emp_position | emp_salary | hire_date  | dept_id
-------|------------|--------------|------------|------------|--------
1      | John Doe   | Manager      | 75000.00   | 2023-10-01 | 1
4      | Bob Brown  | Developer    | 70000.00   | 2023-07-01 | 2

小结

通过使用 IN 运算符,您可以方便地筛选出特定集合内的数据。这个运算符不仅可以简化多个 OR 条件的查询,还可以与子查询结合使用,以实现动态条件筛选。上述示例展示了 INNOT IN 运算符的各种用法,以及如何将它们与其他条件结合使用,来实现复杂的数据筛选和分析。这些操作在数据查询和处理过程中非常有用。