Sql详解之Dql
基础教学 1 min read

Sql详解之Dql

Blog Author

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;

十一、函数使用与最佳实践

SELECTWHEREORDER BYGROUP 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
比较运算符 =<><>=BETWEENINLIKE
逻辑运算符 ANDORNOTXOR
位运算符 &、` ^\~>><<`

结语:DQL 的核心与价值

通过本节的讲解,你已掌握了 DQL 的基本语法和多种典型场景应用:投影、筛选、排序、分组、聚合、模糊匹配、连接、分页、子查询等。

建议练习方式: 每学一个语法,尝试在你的“选课系统”数据库中进行实际操作——只有反复写、实际查、调试错,才真正会用。

如需下一节讲解 DML 的更新、插入与删除操作,请继续留言。我们下节课见!