SQL 数据库查询入门:SELECT 与条件过滤

FreeGuideOnline 最新 2026-06-13

SQL 数据库查询入门:SELECT 与条件过滤

无论你是想成为数据分析师、后端开发者,还是只是希望通过数据更好地理解业务,SQL 都是你必须掌握的硬技能。本篇教程将带你从零开始,掌握最核心的数据查询语句 SELECT,以及如何通过 WHERE 条件精准筛选出你需要的数据。我们将使用标准 SQL 语法进行讲解,示例基于一个简单的员工信息表(employees)。

1. 准备工作:理解示例数据表

在开始编写查询之前,我们先认识一下后面会用到的 employees 表。假设这张表中存有以下列(字段):

  • id:员工编号,整数
  • name:姓名,文本
  • department:部门,文本
  • salary:月薪,整数
  • hire_date:入职日期,日期类型
  • manager_id:上级编号,整数(可能为空)

全文的查询结果都将基于这个虚构的数据集,你可以在自己的数据库环境中创建这张表并插入几条测试数据,一边阅读一边动手练习。

2. SELECT 基础:从表中提取数据

SELECT 的作用就是告诉数据库 “我想看哪些列的数据”。一个最简单的查询甚至不需要 WHERE 条件。

2.1 查询所有列

如果想查看表中的全部信息,可以使用星号 * 代替列名,但要谨慎在生产环境中使用,因为当表结构发生变化或数据量巨大时,它会返回所有列,可能影响性能且不够清晰。

SELECT * FROM employees;

这条语句会返回 employees 表中每一行的所有字段。

2.2 查询特定列

更高效、可读性更好的做法是明确写出需要的列,列名之间用逗号分隔。

SELECT name, department, salary
FROM employees;

数据库会只返回这三列的数据。

2.3 使用别名(AS)

你可以为列设置一个临时别名,让输出结果更加易读,尤其在计算字段或列名过长时非常有用。关键字 AS 可以省略。

SELECT name AS 姓名, department 部门, salary * 12 AS 年薪
FROM employees;

在上面的例子中,salary * 12 是一个计算表达式,为它取别名为“年薪”能让结果一目了然。

2.4 消除重复值:DISTINCT

如果你只想看某个列中有哪些不重复的值,可以在列名前加上 DISTINCT

SELECT DISTINCT department
FROM employees;

这会列出所有部门,每个部门只出现一次,无论该部门有多少名员工。

3. 条件过滤:WHERE 子句

WHERE 是让查询变“聪明”的关键,它允许你只选择满足指定条件的行。WHERE 必须放在 FROM 之后。

3.1 比较运算符

常用的比较运算符有 =<>(或 !=)、><>=<=

-- 查询薪资大于 15000 的员工
SELECT name, salary
FROM employees
WHERE salary > 15000;
-- 查询部门不是 'Sales' 的员工
SELECT name, department
FROM employees
WHERE department <> 'Sales';

注意:SQL 中字符串和日期必须用单引号括起来,而数字不需要。

3.2 逻辑运算符:AND, OR, NOT

当需要组合多个条件时,使用 AND(同时满足)、OR(满足其一)和 NOT(取反)。

-- 查询在 Tech 部门且薪资超过 20000 的员工
SELECT name, salary
FROM employees
WHERE department = 'Tech' AND salary > 20000;
-- 查询在 Sales 部门或薪资低于 8000 的员工
SELECT name, department, salary
FROM employees
WHERE department = 'Sales' OR salary < 8000;

ANDOR 混合使用时,务必用圆括号明确优先级,否则可能得到不符合预期的结果:

-- 错误:先执行 AND 再执行 OR
-- 下面会返回所有在 HR 部门的人,以及 Tech 部门中薪资>20000的人
SELECT name, department, salary
FROM employees
WHERE department = 'HR' OR department = 'Tech' AND salary > 20000;

-- 正确:如果想查 HR 和 Tech 中薪资都 >20000 的人
SELECT name, department, salary
FROM employees
WHERE (department = 'HR' OR department = 'Tech') AND salary > 20000;

NOT 可以对单个条件取反,常与 INLIKEBETWEEN 等结合使用。

-- 查询不在 Tech 部门的员工
SELECT name FROM employees
WHERE NOT department = 'Tech';

3.3 范围与成员检查:BETWEEN, IN

  • BETWEEN ... AND ... 用于筛选落在某个闭区间内的值,对数值和日期都有效。
-- 查询薪资在 10000 到 20000 之间的员工(包含边界)
SELECT name, salary
FROM employees
WHERE salary BETWEEN 10000 AND 20000;

-- 查询 2022 年入职的员工
SELECT name, hire_date
FROM employees
WHERE hire_date BETWEEN '2022-01-01' AND '2022-12-31';
  • IN 用于匹配括号内列出的任意一个值,等同于多个 OR 条件的简写。
-- 查询部门为 Tech, Sales 或 HR 的员工
SELECT name, department
FROM employees
WHERE department IN ('Tech', 'Sales', 'HR');

NOT IN 则是取反,查找不在列表中的行。

3.4 模糊匹配:LIKE

当你不确定精确值时,LIKE 搭配通配符可以实现模式匹配。常用的通配符有:

  • % 表示零个或多个字符
  • _ 表示一个任意字符
-- 查找姓名以 '张' 开头的员工
SELECT name FROM employees
WHERE name LIKE '张%';

-- 查找第二个字是 '小' 的员工(例如“王小二”)
SELECT name FROM employees
WHERE name LIKE '_小%';

如果数据中本身包含 %_,需要使用 ESCAPE 关键字定义转义字符,但这类场景较少见。

3.5 处理空值:IS NULL

数据库中的 NULL 代表未知或缺失,它既不是零也不是空字符串。不能用 = 来判断 NULL,必须使用 IS NULLIS NOT NULL

-- 查找没有上级的员工(manager_id 为空)
SELECT name FROM employees
WHERE manager_id IS NULL;

-- 查找有上级的员工
SELECT name FROM employees
WHERE manager_id IS NOT NULL;

一个常见的坑:salary = NULL 永远返回 false,因为 NULL 与任何值的比较结果都是 unknown

4. 让结果更有序:ORDER BY

ORDER BY 用于对查询结果排序,默认是升序(ASC),降序使用 DESC。可以按多个列排序。

-- 按薪资从高到低排序
SELECT name, salary FROM employees
ORDER BY salary DESC;

-- 先按部门升序,同一部门内按薪资降序
SELECT name, department, salary FROM employees
ORDER BY department ASC, salary DESC;

注意:在标准 SQL 中,ORDER BY 可以使用列别名,但 WHERE 中不能使用列别名。

5. 限制返回行数:LIMIT / TOP / FETCH

不同数据库对限制结果行数的语法略有不一,但功能一致。MySQL、PostgreSQL 和 SQLite 使用 LIMIT,SQL Server 使用 TOP,Oracle 使用 FETCH FIRST。这里演示最常见的 LIMIT

-- 返回薪资最高的前 3 名员工
SELECT name, salary FROM employees
ORDER BY salary DESC
LIMIT 3;

还可以配合 OFFSET 实现分页:

-- 跳过前 2 行后取 3 行(即第 3、4、5 条)
SELECT name, salary FROM employees
ORDER BY salary DESC
LIMIT 3 OFFSET 2;

6. 完整查询的书写顺序

一个包含上述各子句的 SELECT 语句必须按照以下固定顺序书写:

SELECT [DISTINCT] 列名
FROM 表名
WHERE 条件
ORDER BY 排序列
LIMIT 数量;

数据库实际执行时的逻辑顺序与书写顺序不同(一般先 FROMWHERESELECTORDER BYLIMIT),但书写时必须遵守这个语法顺序。

7. 综合实战示例

假设你想查询 Tech 部门或 HR 部门中,2021 年之后入职且薪资大于 12000 的员工,并按入职日期升序显示前 5 人的姓名、部门和入职日期。

SELECT name, department, hire_date
FROM employees
WHERE department IN ('Tech', 'HR')
  AND hire_date > '2021-01-01'
  AND salary > 12000
ORDER BY hire_date ASC
LIMIT 5;

这个查询综合运用了 SELECT 指定列、WHERE 多条件过滤、IN 成员检查、比较运算符、ORDER BY 排序和 LIMIT 限制数量,是日常工作中非常典型的组合。

8. 常见错误与最佳实践

  • 忘记加引号:字符串和日期必须用单引号包住,数字不需要。
  • 混淆 ===:SQL 中没有 ==,判断相等只用单个 =
  • = 比较 NULL:永远不可能成立,必须使用 IS NULL
  • AND/OR 不写括号:对于涉及多个条件的复杂逻辑,始终用括号明确意图,避免因优先级引发的隐蔽 bug。
  • 生产环境滥用 SELECT *:明确列出所需列可以提高查询可读性、减少网络传输,避免因表结构变更导致程序异常。
  • 忽视索引:在 WHERE 子句中对经常查询的字段建立索引可以显著提高性能。避免在索引列上使用函数或计算,否则索引会失效。

掌握 SELECTWHERE 后,你已经能够完成 80% 的日常数据提取任务。下一步你可以学习数据的联结(JOIN)、聚合(GROUP BY)和子查询,逐步构建更复杂的查询能力。