从零起步学习MySQL || 第四章:DQL语句定义及常见用法示例
🧩 一、DQL 概念
DQL(Data Query Language) 主要用于从数据库中查询数据。
在 MySQL 中,核心语句就是:
SELECT
简单理解:
DML(INSERT、UPDATE、DELETE)是“改数据”,
DQL(SELECT)是“查数据”。
🏗 二、SELECT 语句的基本结构
SELECT [字段列表]
FROM [表名]
WHERE [筛选条件]
GROUP BY [分组字段]
HAVING [分组后的筛选条件]
ORDER BY [排序字段]
LIMIT [分页限制]
这七个部分是 SELECT 的执行顺序逻辑框架。
你可以这样记:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
📘 三、基础查询(Basic SELECT)
1️⃣ 查询所有字段
SELECT * FROM student;
不建议在生产环境中使用
*
,因为会影响性能、可维护性。
推荐写明字段名:
SELECT id, name, age FROM student;
2️⃣ 给字段起别名
SELECT name AS 姓名, age AS 年龄 FROM student;
别名方便前端显示或多表查询时避免重名。
3️⃣ 去重查询
SELECT DISTINCT department FROM student;
DISTINCT
用于去除重复值。
🧮 四、条件查询(WHERE)
1️⃣ 常见比较运算符
运算符 | 含义 |
---|---|
= | 等于 |
<> 或 != | 不等于 |
>、<、>=、<= | 大于 / 小于等 |
BETWEEN ... AND ... | 在某范围内 |
IN (...) | 在集合中 |
LIKE | 模糊匹配 |
IS NULL / IS NOT NULL | 是否为空 |
示例:
SELECT * FROM student WHERE age BETWEEN 18 AND 22;
SELECT * FROM student WHERE department IN ('CS', 'Math');
SELECT * FROM student WHERE name LIKE '张%';
2️⃣ 逻辑运算符
运算符 | 含义 |
---|---|
AND | 并且 |
OR | 或者 |
NOT | 取反 |
SELECT * FROM student
WHERE age >= 18 AND department = 'CS';
🧰 五、排序(ORDER BY)
SELECT * FROM student ORDER BY age DESC;
ASC
:升序(默认)DESC
:降序
可以按多个字段排序:
SELECT * FROM student ORDER BY department ASC, age DESC;
📊 六、聚合函数(Aggregate Functions)
函数 | 功能 |
---|---|
COUNT() | 计数 |
SUM() | 求和 |
AVG() | 平均值 |
MAX() | 最大值 |
MIN() | 最小值 |
示例:
SELECT COUNT(*) AS 人数, AVG(age) AS 平均年龄 FROM student;
🧱 七、分组查询(GROUP BY / HAVING)
1️⃣ 基本用法
SELECT department, COUNT(*) AS 人数
FROM student
GROUP BY department;
2️⃣ HAVING 与 WHERE 区别
WHERE:在分组前筛选记录
HAVING:在分组后筛选结果
示例:
SELECT department, COUNT(*) AS 人数
FROM student
GROUP BY department
HAVING COUNT(*) > 10;
🪜 八、分页(LIMIT)
MySQL 分页语法:
LIMIT [偏移量], [行数]
示例:
SELECT * FROM student LIMIT 0, 10; -- 查询前10条
SELECT * FROM student LIMIT 10, 10; -- 查询第11到20条
Java 后端分页(如 Spring Boot + MyBatis)中会常见这种拼接:
SELECT * FROM student LIMIT #{offset}, #{pageSize};
🧩 九、连接查询(JOIN)
1️⃣ 内连接(INNER JOIN)
SELECT s.name, c.course_name
FROM student s
INNER JOIN course c ON s.id = c.student_id;
返回两个表中“匹配的行”。
2️⃣ 左连接(LEFT JOIN)
SELECT s.name, c.course_name
FROM student s
LEFT JOIN course c ON s.id = c.student_id;
返回左表所有行,即使右表没有匹配的行。
3️⃣ 右连接(RIGHT JOIN)
SELECT s.name, c.course_name
FROM student s
RIGHT JOIN course c ON s.id = c.student_id;
返回右表所有行,即使左表没有匹配的行。
🧠 十、子查询(Subquery)
子查询是指一个 SELECT
语句嵌套在另一个查询中。
示例:
SELECT name
FROM student
WHERE department_id = (SELECT id FROM department WHERE name = 'CS'
);
还可以作为虚拟表:
SELECT AVG(age) FROM (SELECT * FROM student WHERE gender='M') AS male_students;
⚙️ 十一、DQL 与 Java 后端结合
在 Java 后端(如 Spring Boot、MyBatis、JDBC)中:
DQL 通常用于 查询接口,如
/user/list
。通过 ORM 框架执行 SQL 并封装结果为 Java 对象。
示例(MyBatis Mapper):
@Select("SELECT * FROM user WHERE age > #{age}")
List<User> findUsersByAge(@Param("age") int age);
对应 SQL:
SELECT * FROM user WHERE age > 20;
🎯 十二、实战建议
多写 WHERE + GROUP BY + HAVING + ORDER BY 组合查询。
避免在大表中随意使用
SELECT *
。了解执行顺序:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
熟悉分页、连接和子查询的使用场景。