MySQL 查询数据(长文解析)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

前言

在数字化时代,数据库作为数据存储的核心工具,其查询能力直接决定了应用的效率与用户体验。MySQL 作为全球广泛使用的开源关系型数据库,其查询语句的编写与优化是开发者必须掌握的核心技能。无论是快速检索用户信息、统计业务数据,还是构建复杂的报表系统,理解并掌握 MySQL 查询数据 的方法,都能显著提升开发效率和系统性能。本文将从基础到进阶,通过案例和代码示例,系统性地讲解如何高效地从 MySQL 数据库中提取所需数据。


MySQL 查询数据基础

SELECT 语句:数据检索的起点

SELECT 是 MySQL 中最基础且最常用的查询语句,它的作用如同在图书馆中寻找特定书籍:通过明确的条件筛选出符合条件的数据。

基本语法与示例

SELECT 语句的语法结构如下:

SELECT [字段名]  
FROM [表名]  
[WHERE 条件]  
[ORDER BY 排序字段]  
[LIMIT 数量];  

示例 1:查询所有字段

SELECT * FROM users;  

这条语句会返回 users 表中的所有记录,其中 * 表示选择所有列。

示例 2:选择特定字段

SELECT id, name, email FROM users;  

这里仅返回 idnameemail 三列,其他列会被忽略。

形象比喻:图书馆借书

可以将 SELECT 比作在图书馆借书的过程:

  • SELECT 相当于提出借阅请求;
  • FROM 指定书架(即表名);
  • WHERE 是筛选书籍的具体条件(如书名、作者);
  • ORDER BY 决定书籍排列的顺序;
  • LIMIT 则是设定一次最多能借多少本书。

WHERE 子句:精准筛选数据

WHERE 子句是查询语句的核心,它通过条件表达式缩小数据范围,确保仅返回符合条件的记录。

常用条件运算符

运算符说明示例
=等于WHERE age = 25
>大于WHERE salary > 10000
<小于WHERE created_at < NOW()
AND同时满足多个条件WHERE age >= 18 AND age <= 60
OR满足任意一个条件WHERE city = '北京' OR city = '上海'
IN列出所有可能的值WHERE department IN ('IT', 'HR')

示例 3:筛选年龄在 18 到 60 岁之间的用户

SELECT * FROM users  
WHERE age >= 18 AND age <= 60;  

模糊查询:LIKE 与通配符

当需要匹配模糊条件时,可以使用 LIKE 运算符结合通配符 %(匹配任意字符)和 _(匹配单个字符)。

示例 4:查询邮箱以 @example.com 结尾的用户

SELECT * FROM users  
WHERE email LIKE '%@example.com';  

ORDER BY 与 LIMIT:控制数据展示方式

ORDER BY:按条件排序

通过 ORDER BY 可以按指定字段对查询结果进行升序(ASC)或降序(DESC)排序。

示例 5:按注册时间降序排列用户

SELECT * FROM users  
ORDER BY created_at DESC;  

LIMIT:限制返回数量

LIMIT 用于控制返回记录的条数,防止一次性返回过多数据。

示例 6:仅返回前 10 条用户记录

SELECT * FROM users  
LIMIT 10;  

进阶查询技巧

JOIN 操作:关联多个表

在实际应用中,数据通常分散在多个表中,此时需要通过 JOIN 将它们关联起来。

常见 JOIN 类型

类型说明示例
INNER JOIN返回两个表中满足条件的匹配记录```sql

SELECT * FROM orders
INNER JOIN users ON orders.user_id = users.id;

| `LEFT JOIN`   | 返回左表所有记录,右表无匹配时显示为 NULL                            | ```sql  
SELECT users.name, orders.total  
FROM users  
LEFT JOIN orders ON users.id = orders.user_id;  
``` |  
| `RIGHT JOIN`  | 返回右表所有记录,左表无匹配时显示为 NULL                           | 类似 `LEFT JOIN`,但方向相反                                           |  
| `CROSS JOIN`  | 返回两个表的笛卡尔积(所有可能的组合)                              | 适用于需要生成所有组合的场景                                           |  

**示例 7:通过 LEFT JOIN 统计用户订单总额**  
```sql  
SELECT users.name, SUM(orders.total) AS total_spent  
FROM users  
LEFT JOIN orders ON users.id = orders.user_id  
GROUP BY users.name;  

聚合函数与 GROUP BY:数据统计与分组

当需要对数据进行统计(如求和、计数、平均值等)时,聚合函数与 GROUP BY 是关键工具。

常用聚合函数

函数说明示例
COUNT()统计记录数量COUNT(*)COUNT(column)
SUM()求指定列的总和SUM(price)
AVG()计算平均值AVG(age)
MAX()返回最大值MAX(score)
MIN()返回最小值MIN(created_at)

示例 8:按城市分组统计用户数量

SELECT city, COUNT(*) AS user_count  
FROM users  
GROUP BY city;  

高级查询与优化

子查询:嵌套查询的灵活性

子查询允许在另一个查询中嵌套一个查询,常用于复杂条件的动态生成。

示例 9:查询订单金额高于平均值的用户

SELECT * FROM orders  
WHERE total > (SELECT AVG(total) FROM orders);  

事务与锁:确保数据一致性

在涉及多个操作(如转账)时,需使用 事务 确保操作的原子性。

示例 10:转账事务示例

START TRANSACTION;  
UPDATE accounts SET balance = balance - 100 WHERE id = 1;  
UPDATE accounts SET balance = balance + 100 WHERE id = 2;  
COMMIT;  

实战案例:电商订单系统查询

假设有一个电商数据库,包含 users(用户表)、orders(订单表)和 products(商品表),现需实现以下功能:

需求:查询某用户最近 30 天内购买的商品名称及总金额。

解决方案

SELECT p.name AS product_name, SUM(o.quantity * o.price) AS total  
FROM users u  
JOIN orders o ON u.id = o.user_id  
JOIN products p ON o.product_id = p.id  
WHERE u.id = 123  
AND o.created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY)  
GROUP BY p.name;  

结论

通过本文的讲解,读者应已掌握从基础到高级的 MySQL 查询数据 方法,包括 SELECT 语句、条件筛选、多表关联、聚合统计等核心技巧。在实际开发中,合理使用索引、避免全表扫描、优化复杂查询,是提升查询性能的关键。随着对 MySQL 查询能力的深入理解,开发者将能更高效地设计数据库架构、编写健壮的查询语句,并最终构建出高性能的业务系统。

关键词自然布局参考

  • MySQL 查询数据
  • SELECT 语句
  • WHERE 条件筛选
  • JOIN 表关联
  • 聚合函数统计
  • 子查询优化

最新发布