Appearance
第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;查询结果:
| 姓名 | 年龄 | 成绩 |
|---|---|---|
| 张三 | 18 | 85 |
| 李四 | 19 | 92 |
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 <= 227.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 NULL 或 IS 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_id | gender |
|---|---|
| 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 课后练习
- 查询所有男生的姓名和成绩
- 查询成绩在60到80分之间的学生
- 查询姓"王"的学生,按成绩降序排列
- 查询第3页数据,每页显示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;