SELECT 基础与条件过滤
约 946 字大约 3 分钟
布欧-Lewyon
2026-05-15
首页 › MySQL › DQL 与查询基础(在新窗口打开) › SELECT 基础与条件过滤
查询(SELECT)是日常使用最频繁的 SQL 操作。本节从最基础的查询开始,逐步引入条件过滤、排序、分页和去重。
先用示例数据。你可以在下面的在线运行框中直接执行 SQL,无需安装 MySQL:
CREATE TABLE employee (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
dept VARCHAR(20),
salary DECIMAL(10, 2),
age INT,
join_date DATE
);
INSERT INTO employee (name, dept, salary, age, join_date) VALUES
('张三', '技术部', 15000, 28, '2023-06-01'),
('李四', '市场部', 12000, 35, '2021-03-15'),
('王五', '技术部', 18000, 32, '2022-01-10'),
('赵六', '技术部', 22000, 40, '2020-09-20'),
('孙七', '市场部', 11000, 26, '2024-02-01'),
('周八', '人事部', 9000, 30, '2022-07-11'),
('吴九', '市场部', 13000, 29, '2023-11-05');
基础 SELECT
查询所有列
SELECT * FROM employee;生产环境尽量避免
SELECT *,明确列出需要的列,减少网络传输且利于索引利用。
查询指定列
SELECT name, salary FROM employee;列别名
SELECT name AS '姓名', salary AS '薪资' FROM employee;
-- AS 可省略
SELECT name 姓名, salary 薪资 FROM employee;WHERE 条件过滤
比较运算符
-- 等值查询
SELECT * FROM employee WHERE dept = '技术部';
-- 不等查询
SELECT * FROM employee WHERE salary > 15000;
SELECT * FROM employee WHERE age >= 30;逻辑运算
-- AND:同时满足
SELECT * FROM employee WHERE dept = '技术部' AND salary > 15000;
-- OR:满足任一
SELECT * FROM employee WHERE dept = '技术部' OR dept = '市场部';
-- NOT:取反
SELECT * FROM employee WHERE NOT dept = '人事部';IN 与 NOT IN
SELECT * FROM employee WHERE dept IN ('技术部', '市场部');
SELECT * FROM employee WHERE dept NOT IN ('人事部');BETWEEN ... AND
闭区间,包含两端:
SELECT * FROM employee WHERE salary BETWEEN 10000 AND 20000;
-- 等价于
SELECT * FROM employee WHERE salary >= 10000 AND salary <= 20000;LIKE 与通配符
-- % 匹配任意个任意字符
SELECT * FROM employee WHERE name LIKE '张%'; -- 姓张的
-- _ 匹配单个字符
SELECT * FROM employee WHERE name LIKE '赵_'; -- 赵+单名
%开头的 LIKE 条件(如LIKE '%七')无法使用索引,会导致全表扫描。
IS NULL / IS NOT NULL
SELECT * FROM employee WHERE age IS NULL;
SELECT * FROM employee WHERE age IS NOT NULL;不能写
age = NULL,NULL 的比较要用IS NULL。
REGEXP(正则匹配,MySQL 8.0+)
-- 姓名以 "张" 或 "李" 开头
SELECT * FROM employee WHERE name REGEXP '^[张李]';
-- 姓名包含数字
SELECT * FROM employee WHERE name REGEXP '[0-9]';ORDER BY 排序
-- 单列排序
SELECT name, salary FROM employee ORDER BY salary DESC; -- 降序
SELECT name, salary FROM employee ORDER BY salary ASC; -- 升序(默认)
-- 多列排序
SELECT * FROM employee ORDER BY dept ASC, salary DESC;LIMIT 与 OFFSET 分页
-- 取前 3 条
SELECT * FROM employee LIMIT 3;
-- 跳过前 2 条,取后续 3 条(第 3~5 条)
SELECT * FROM employee LIMIT 3 OFFSET 2;
-- 另一种等价语法 LIMIT offset, count
SELECT * FROM employee LIMIT 2, 3;分页场景:每页 2 条
-- 第 1 页
SELECT * FROM employee ORDER BY id LIMIT 2 OFFSET 0;
-- 第 2 页
SELECT * FROM employee ORDER BY id LIMIT 2 OFFSET 2;
-- 第 3 页
SELECT * FROM employee ORDER BY id LIMIT 2 OFFSET 4;大偏移量分页(
OFFSET 100000)性能会急剧下降。优化方案见后文 SQL 优化章节。
DISTINCT 去重
-- 查看有哪些部门
SELECT DISTINCT dept FROM employee;DISTINCT 作用于所有指定列的组合:
-- 各部门 + 年龄 的无重复组合
SELECT DISTINCT dept, age FROM employee;条件组合实战
-- 技术部薪资高于 15000 的,按薪资降序,取前 2 条
SELECT name, salary
FROM employee
WHERE dept = '技术部' AND salary > 15000
ORDER BY salary DESC
LIMIT 2;小结
SELECT指定列(避免*),WHERE过滤行,ORDER BY排序,LIMIT控制返回条数。- 常用条件:
=、>、<、AND/OR、IN、BETWEEN、LIKE、IS NULL。 - 分页用
LIMIT N OFFSET M;大数据量分页需关注性能。 DISTINCT对组合列去重,注意性能开销。
上一节:数据操作(INSERT / UPDATE / DELETE) 下一节:聚合与分组
