Skip to content

第7章:DQL 数据查询语言(最常用,必精通)

DQL(Data Query Language)是数据查询语言,用于从数据库中检索数据。SELECT 语句是 DQL 的核心,也是最常用的 SQL 语句。本章将详细讲解各种查询技巧,助你成为查询高手。


7.1 基础查询(SELECT,核心)

7.1.1 查询所有字段

使用 * 通配符查询表中的所有字段:

sql
SELECT * FROM 表名;

示例:

sql
-- 查询学生表中的所有数据
SELECT * FROM students;

提示

虽然 SELECT * 很方便,但在实际开发中建议明确指定需要的字段,这样可以提高查询效率,也便于代码维护。

7.1.2 查询指定字段

只查询需要的字段,提高查询效率:

sql
SELECT 字段1, 字段2, ... FROM 表名;

示例:

sql
-- 只查询学生的姓名和年龄
SELECT name, age FROM students;

-- 查询多个字段
SELECT id, name, gender, score FROM students;

7.1.3 起别名(AS)

使用 AS 关键字为字段或表起别名,简化显示或避免冲突:

sql
SELECT 字段1 AS 别名1, 字段2 AS 别名2 FROM 表名;

示例:

sql
-- 字段别名
SELECT 
    name AS 姓名,
    age AS 年龄,
    score AS 成绩
FROM students;

-- AS 可以省略
SELECT name 姓名, age 年龄 FROM students;

-- 表别名(多表查询时常用)
SELECT s.name, s.age FROM students AS s;

查询结果:

姓名年龄成绩
张三1885
李四1992

7.2 条件查询(WHERE,核心)

使用 WHERE 子句筛选满足条件的数据。

7.2.1 比较运算符

运算符含义示例
=等于age = 18
!=<>不等于gender != '男'
>大于score > 80
<小于age < 20
>=大于等于score >= 60
<=小于等于age <= 25
BETWEEN...AND...在范围内age BETWEEN 18 AND 22

示例:

sql
-- 查询年龄等于18岁的学生
SELECT * FROM students WHERE age = 18;

-- 查询成绩大于80分的学生
SELECT * FROM students WHERE score > 80;

-- 查询年龄在18到22岁之间(包含边界)的学生
SELECT * FROM students WHERE age BETWEEN 18 AND 22;
-- 等同于:WHERE age >= 18 AND age <= 22

7.2.2 逻辑运算符

运算符含义说明
AND并且两个条件都满足
OR或者满足任一条件即可
NOT不满足条件

示例:

sql
-- AND:查询成绩大于80且年龄小于20的学生
SELECT * FROM students 
WHERE score > 80 AND age < 20;

-- OR:查询成绩大于90或小于60的学生
SELECT * FROM students 
WHERE score > 90 OR score < 60;

-- NOT:查询不是男生的学生(即女生)
SELECT * FROM students WHERE NOT gender = '男';
-- 等同于:WHERE gender != '男'

-- 组合使用(注意优先级,AND 高于 OR)
SELECT * FROM students 
WHERE (score > 90 OR score < 60) AND age = 18;

7.2.3 模糊查询(LIKE)

使用 LIKE 进行模糊匹配,配合通配符使用:

通配符含义示例
%匹配任意多个字符'张%' 匹配以"张"开头的
_匹配单个字符'张_' 匹配"张"+一个字符

示例:

sql
-- 查询姓"张"的学生(以张开头)
SELECT * FROM students WHERE name LIKE '张%';
-- 结果:张三、张三丰、张小凡...

-- 查询姓名中包含"明"的学生
SELECT * FROM students WHERE name LIKE '%明%';
-- 结果:李明、王明华、张明...

-- 查询姓"李"且名字只有两个字的
SELECT * FROM students WHERE name LIKE '李_';
-- 结果:李明、李华、李强...

-- 查询姓"王"且名字只有三个字的
SELECT * FROM students WHERE name LIKE '王__';

-- 查询第二个字是"伟"的学生
SELECT * FROM students WHERE name LIKE '_伟%';

注意

  • % 可以匹配零个、一个或多个字符
  • _ 必须匹配且只匹配一个字符
  • 如果查询内容中包含 %_,需要使用转义:LIKE '%\%%' ESCAPE '\'

7.2.4 空值查询(IS NULL)

判断字段是否为空:

sql
-- 查询邮箱为空的学生
SELECT * FROM students WHERE email IS NULL;

-- 查询邮箱不为空的学生
SELECT * FROM students WHERE email IS NOT NULL;

重要

判断空值必须使用 IS NULLIS NOT NULL,不能使用 = NULL!= NULL

7.2.5 IN 运算符

用于指定多个可能的值:

sql
-- 查询班级为1班、2班或3班的学生
SELECT * FROM students WHERE class_id IN (1, 2, 3);
-- 等同于:WHERE class_id = 1 OR class_id = 2 OR class_id = 3

-- 查询姓名是张三、李四、王五的学生
SELECT * FROM students WHERE name IN ('张三', '李四', '王五');

7.3 排序查询(ORDER BY)

使用 ORDER BY 对查询结果进行排序。

7.3.1 升序排序(ASC)

默认排序方式,从小到大:

sql
SELECT * FROM students ORDER BY score ASC;
-- 或省略 ASC
SELECT * FROM students ORDER BY score;

7.3.2 降序排序(DESC)

从大到小排序:

sql
-- 按成绩从高到低排序
SELECT * FROM students ORDER BY score DESC;

-- 按年龄从大到小排序
SELECT * FROM students ORDER BY age DESC;

7.3.3 多字段排序

先按第一个字段排序,相同则按第二个字段排序:

sql
-- 先按班级升序,同班级按成绩降序
SELECT * FROM students 
ORDER BY class_id ASC, score DESC;

-- 先按成绩降序,同成绩按年龄升序
SELECT * FROM students 
ORDER BY score DESC, age ASC;

排序逻辑:

姓名班级成绩
张三1班95
李四1班88
王五2班92
赵六2班85

先按班级升序,再按成绩降序的结果:1班张三(95)、1班李四(88)、2班王五(92)、2班赵六(85)


7.4 限制查询(LIMIT,分页基础)

LIMIT 用于限制返回的记录数量,是实现分页查询的基础。

7.4.1 基本语法

sql
-- 语法:LIMIT 起始索引, 查询条数
-- 起始索引从0开始

-- 查询前5条记录
SELECT * FROM students LIMIT 0, 5;
-- 或简写为
SELECT * FROM students LIMIT 5;

-- 查询第6到第10条记录(索引5开始,取5条)
SELECT * FROM students LIMIT 5, 5;

7.4.2 分页公式

sql
-- 每页显示 pageSize 条,查询第 pageNum 页
-- 起始索引 = (pageNum - 1) * pageSize

-- 每页10条,第1页
SELECT * FROM students LIMIT 0, 10;

-- 每页10条,第2页
SELECT * FROM students LIMIT 10, 10;

-- 每页10条,第3页
SELECT * FROM students LIMIT 20, 10;

7.4.3 结合排序使用

通常先排序再分页:

sql
-- 按成绩降序排列,取前10名
SELECT * FROM students 
ORDER BY score DESC 
LIMIT 0, 10;

-- 按成绩降序排列,取第11-20名
SELECT * FROM students 
ORDER BY score DESC 
LIMIT 10, 10;

注意

LIMIT 子句必须放在查询语句的最后!


7.5 去重查询(DISTINCT)

使用 DISTINCT 去除查询结果中的重复数据。

7.5.1 单列去重

sql
-- 查询所有班级(去除重复的)
SELECT DISTINCT class_id FROM students;

-- 查询所有性别
SELECT DISTINCT gender FROM students;

7.5.2 多列去重

多列组合去重,只有当所有列的值都相同时才认为是重复:

sql
-- 查询班级和性别的所有组合
SELECT DISTINCT class_id, gender FROM students;

示例数据:

class_idgender
1
1
2
2

7.6 综合实操案例

案例1:多条件组合查询

sql
-- 查询1班成绩在80到90分之间的女生
SELECT * FROM students 
WHERE class_id = 1 
  AND score BETWEEN 80 AND 90 
  AND gender = '女';

-- 查询姓"张"或"李",且成绩大于85分的学生
SELECT * FROM students 
WHERE (name LIKE '张%' OR name LIKE '李%') 
  AND score > 85;

案例2:排序+分页查询

sql
-- 查询成绩前10名的学生
SELECT name, score FROM students 
ORDER BY score DESC 
LIMIT 0, 10;

-- 查询成绩第11-20名的学生
SELECT name, score FROM students 
ORDER BY score DESC 
LIMIT 10, 10;

案例3:复杂条件查询

sql
-- 查询2班或3班,成绩大于80分,且姓名包含"明"的学生
-- 按成绩降序排列,取前5名
SELECT * FROM students 
WHERE class_id IN (2, 3) 
  AND score > 80 
  AND name LIKE '%明%'
ORDER BY score DESC 
LIMIT 0, 5;

7.7 新手易错点

❌ 错误1:WHERE 条件语法错误

sql
-- 错误:字符串未加引号
SELECT * FROM students WHERE name = 张三;

-- 正确
SELECT * FROM students WHERE name = '张三';

❌ 错误2:LIKE 模糊查询使用不当

sql
-- 错误:使用 = 进行模糊匹配
SELECT * FROM students WHERE name = '%张%';

-- 正确
SELECT * FROM students WHERE name LIKE '%张%';

❌ 错误3:LIMIT 索引错误

sql
-- 错误理解:以为 LIMIT 1, 5 是查询第1页5条
-- 实际上是从索引1开始(第2条),取5条

-- 查询第1页,每页5条(正确写法)
SELECT * FROM students LIMIT 0, 5;

-- 查询第2页,每页5条
SELECT * FROM students LIMIT 5, 5;

❌ 错误4:NULL 判断错误

sql
-- 错误:不能用 = 判断 NULL
SELECT * FROM students WHERE email = NULL;

-- 正确
SELECT * FROM students WHERE email IS NULL;

❌ 错误5:ORDER BY 位置错误

sql
-- 错误:ORDER BY 在 WHERE 之前
SELECT * FROM students ORDER BY score WHERE age > 18;

-- 正确顺序
SELECT * FROM students WHERE age > 18 ORDER BY score;

7.8 本章小结

知识点核心语法用途
基础查询SELECT 字段 FROM 表查询数据
条件查询WHERE 条件筛选数据
比较运算= > < >= <= !=数值比较
逻辑运算AND OR NOT多条件组合
模糊查询LIKE '%张%'模糊匹配
排序ORDER BY 字段 DESC结果排序
分页LIMIT 起始, 数量限制返回条数
去重DISTINCT去除重复

SQL 语句执行顺序:

sql
SELECT 字段      -- 4. 选择字段
FROM 表名        -- 1. 确定数据来源
WHERE 条件       -- 2. 筛选记录
ORDER BY 字段    -- 3. 排序
LIMIT 数量;      -- 5. 限制返回数量

7.9 课后练习

  1. 查询所有男生的姓名和成绩
  2. 查询成绩在60到80分之间的学生
  3. 查询姓"王"的学生,按成绩降序排列
  4. 查询第3页数据,每页显示5条
  5. 查询所有不重复的班级编号

参考答案:

sql
-- 练习1
SELECT name, score FROM students WHERE gender = '男';

-- 练习2
SELECT * FROM students WHERE score BETWEEN 60 AND 80;

-- 练习3
SELECT * FROM students WHERE name LIKE '王%' ORDER BY score DESC;

-- 练习4(第3页,每页5条,起始索引 = (3-1)*5 = 10)
SELECT * FROM students LIMIT 10, 5;

-- 练习5
SELECT DISTINCT class_id FROM students;

© 2026 编程马·菜鸟教程 版权所有