Sql详解之Dql
SQL详解之DQL
DQL(Data Query Language,数据查询语言)是SQL中用于查询数据库中数据的语言子集。在实际工作中,无论是数据开发、后台管理,还是数据分析与报表,查询操作都是重中之重。
下面,我们将通过“学校选课系统”的示例数据库,带你系统掌握 DQL 的核心语法、使用场景与最佳实践。
一、基本查询(SELECT 语句)
1. 查询所有学生的完整信息
使用场景:查看整张表的原始数据
SELECT * FROM tb_student;
2. 查询指定列(投影)
使用场景:只展示有用字段
SELECT stu_id, stu_name, stu_addr FROM tb_student;
3. 使用别名提升可读性
最佳实践:对字段起中文名或友好名
SELECT stu_id AS 学号, stu_name AS 姓名 FROM tb_student;
二、数据筛选(WHERE 子句)
1. 单条件筛选:查询所有女学生
SELECT stu_name, stu_birth FROM tb_student WHERE stu_sex = 0;
2. 多条件组合:查询四川成都的女学生
SELECT stu_name FROM tb_student WHERE stu_sex = 0 AND stu_addr = '四川成都';
3. 多条件或匹配
SELECT stu_name FROM tb_student WHERE stu_sex = 0 OR stu_addr = '四川成都';
4. 范围匹配:80后学生
SELECT stu_name FROM tb_student
WHERE stu_birth BETWEEN '1980-01-01' AND '1989-12-31';
三、模糊查询(LIKE 与正则表达式)
1. 通配符 %
:姓“杨”的学生
SELECT stu_name FROM tb_student WHERE stu_name LIKE '杨%';
2. 通配符 _
:姓“杨”且名字两个字
SELECT stu_name FROM tb_student WHERE stu_name LIKE '杨_';
3. 正则匹配:姓“林”或“杨”,名字三个字
SELECT stu_name FROM tb_student
WHERE stu_name REGEXP '^[杨林][\u4e00-\u9fa5]{2}$';
四、空值处理(IS NULL、TRIM)
1. 查询未填籍贯的学生
SELECT stu_name FROM tb_student
WHERE TRIM(stu_addr) = '' OR stu_addr IS NULL;
2. 查询填写籍贯的学生
SELECT stu_name FROM tb_student
WHERE TRIM(stu_addr) <> '' AND stu_addr IS NOT NULL;
五、去重与排序(DISTINCT、ORDER BY)
1. 查询去重的籍贯列表
SELECT DISTINCT stu_addr FROM tb_student
WHERE stu_addr IS NOT NULL AND TRIM(stu_addr) <> '';
2. 男学生按年龄从大到小排序
SELECT stu_name, stu_birth
FROM tb_student
WHERE stu_sex = 1
ORDER BY stu_birth ASC;
六、聚合函数(MAX, MIN, AVG, COUNT, STDDEV)
1. 查询学生平均成绩(包含 null 的处理)
SELECT ROUND(SUM(score) / COUNT(*), 1) FROM tb_record WHERE stu_id = 1001;
2. 查询各性别人数
SELECT CASE stu_sex WHEN 1 THEN '男' ELSE '女' END AS 性别, COUNT(*) AS 人数
FROM tb_student
GROUP BY stu_sex;
七、分组查询与过滤(GROUP BY 与 HAVING)
1. 各学院学生人数
SELECT col_id, COUNT(*) AS 人数 FROM tb_student GROUP BY col_id;
2. 平均成绩大于等于90的学生
SELECT stu_id, ROUND(AVG(score), 1) AS 平均分
FROM tb_record
GROUP BY stu_id
HAVING 平均分 >= 90;
八、子查询与集合运算
1. 查询选课数量超过2门的学生姓名
SELECT stu_name
FROM tb_student
WHERE stu_id IN (
SELECT stu_id
FROM tb_record
GROUP BY stu_id
HAVING COUNT(*) > 2
);
九、连接查询(JOIN)
1. 学生和学院连接查询
SELECT stu_name, stu_birth, col_name
FROM tb_student
INNER JOIN tb_college ON tb_student.col_id = tb_college.col_id;
2. 学生-课程-成绩三表连接
SELECT stu_name, cou_name, score
FROM tb_student
JOIN tb_record ON tb_student.stu_id = tb_record.stu_id
JOIN tb_course ON tb_course.cou_id = tb_record.cou_id
WHERE score IS NOT NULL;
十、分页查询(LIMIT 与 OFFSET)
1. 获取前5条记录
LIMIT 5;
2. 获取第6到10条记录
LIMIT 5 OFFSET 5;
3. 获取第11到15条记录
LIMIT 10, 5;
十一、函数使用与最佳实践
在 SELECT
、WHERE
、ORDER BY
、GROUP BY
中合理使用 内置函数 可以增强查询能力:
- 字符串函数:
CONCAT
,UPPER
,SUBSTRING
,LENGTH
- 数值函数:
ROUND
,ABS
,CEILING
,FLOOR
- 日期函数:
DATEDIFF
,CURDATE
,YEAR
,NOW
- 流程控制函数:
IF
,IFNULL
,NULLIF
示例:查询男学生的年龄并降序排序
SELECT stu_name,
FLOOR(DATEDIFF(CURDATE(), stu_birth) / 365) AS 年龄
FROM tb_student
WHERE stu_sex = 1
ORDER BY 年龄 DESC;
十二、MySQL 运算符总览
类型 | 示例符号 | |
---|---|---|
算术运算符 | + 、- 、* 、/ 、MOD |
|
比较运算符 | = 、<> 、< 、>= 、BETWEEN 、IN 、LIKE |
|
逻辑运算符 | AND 、OR 、NOT 、XOR |
|
位运算符 | & 、` |
、 ^、 \~、 >>、 <<` |
结语:DQL 的核心与价值
通过本节的讲解,你已掌握了 DQL 的基本语法和多种典型场景应用:投影、筛选、排序、分组、聚合、模糊匹配、连接、分页、子查询等。
建议练习方式: 每学一个语法,尝试在你的“选课系统”数据库中进行实际操作——只有反复写、实际查、调试错,才真正会用。
如需下一节讲解 DML 的更新、插入与删除操作,请继续留言。我们下节课见!