当前位置: 首页 > news >正文

SQL 基础案例解析

1. 基础查询

1.1 分页查询

SELECT id, name, create_time 
FROM user 
WHERE status = 1 
ORDER BY create_time DESC 
LIMIT 10 OFFSET 20;

描述:查询状态为1的用户,按创建时间降序排列,获取第3页数据(每页10条)

原理

  1. WHERE 子句先过滤出 status=1 的记录

  2. ORDER BY 对结果按 create_time 降序排序

  3. LIMIT 和 OFFSET 配合实现分页:

    • LIMIT 10 表示每页10条

    • OFFSET 20 表示跳过前20条(即第3页)

性能提示

  • 大表分页时,使用 WHERE id > last_id 比 OFFSET 更高效

  • 确保 create_time 字段有索引

2. 多表关联

2.1 内连接

SELECT o.order_no, u.name, o.amount
FROM orders o
JOIN user u ON o.user_id = u.id
WHERE o.status = 2;

描述:查询状态为2的订单及其对应的用户信息

原理

  1. JOIN 执行内连接操作,只返回两表中匹配的行

  2. 连接条件 o.user_id = u.id 建立关联

  3. 执行顺序:

    • 先执行 FROM 和 JOIN 确定数据源

    • 然后 WHERE 过滤

    • 最后 SELECT 选择字段

优化建议

  • 确保 user_id 和 id 字段有索引

  • 大表连接考虑使用覆盖索引

3. 聚合统计

3.1 分组统计

SELECT product_id,product_name,SUM(quantity) AS total_quantity,AVG(price) AS avg_price
FROM order_items
GROUP BY product_id, product_name;

描述:按商品统计销售总量和平均价格

原理

  1. GROUP BY 将数据按 product_id 和 product_name 分组

  2. 对每个分组计算:

    • SUM(quantity) 求总数量

    • AVG(price) 求平均价格

  3. HAVING 可对分组结果再过滤(本例未使用)

执行流程

  1. 读取 order_items 表数据

  2. 按分组字段创建临时分组

  3. 对每个分组计算聚合函数

  4. 返回结果集

4. 数据操作

4.1 条件更新

UPDATE products 
SET stock = stock - 10,update_time = NOW()
WHERE id = 1001 AND stock >= 10;

描述:安全扣减库存(防止超卖)

原理

  1. WHERE 子句确保:

    • 只更新 id=1001 的商品

    • 库存足够时才执行

  2. SET 子句:

    • 原子性减少库存

    • 同时更新修改时间

事务特性

  • 这条SQL本身是原子的

  • 在高并发场景下应配合事务使用

5. 高级查询

5.1 窗口函数

SELECT user_id,order_date,amount,SUM(amount) OVER (PARTITION BY user_id ORDER BY order_date) AS running_total
FROM orders;

描述:计算每个用户的订单金额累计和

原理

  1. PARTITION BY 按用户分组

  2. ORDER BY 在每个分组内按日期排序

  3. SUM() OVER 计算从分组开始到当前行的累计和

执行过程

  1. 先按 user_id 分区

  2. 在每个分区内按 order_date 排序

  3. 对每个分区逐行计算累计和

6. 索引使用建议

6.1 索引失效案例

SELECT * FROM users 
WHERE DATE_FORMAT(create_time,'%Y-%m') = '2023-01';

问题:对 create_time 使用函数导致索引失效

优化方案

SELECT * FROM users 
WHERE create_time BETWEEN '2023-01-01' AND '2023-01-31';

原理

  • 原始查询对列使用函数,数据库无法使用索引

  • 优化后使用范围查询,可以走索引

7. 执行计划分析

7.1 查看执行计划

EXPLAIN 
SELECT o.*, u.name 
FROM orders o JOIN users u ON o.user_id = u.id
WHERE o.amount > 1000;

关键指标

  • type:访问类型(const > eq_ref > ref > range > index > ALL)

  • key:实际使用的索引

  • rows:预估扫描行数

  • Extra:额外信息(Using index, Using temporary 等)

优化方向

  • 确保连接字段有索引

  • 避免出现 Using temporary 和 Using filesort

http://www.lryc.cn/news/595678.html

相关文章:

  • Oracle RAC+ADG switchover 切换演练流程
  • 景区负氧离子监测设备:守护清新,赋能旅游
  • 操作符练习
  • 倍增算法与应用(倍增优化之ST表、LCA、功能图、树上差分、贪心、二分)
  • mybatis多对一一对多的关联及拼接操作以及缓存处理
  • 主流开源LLM架构对比与突破·
  • 【Qt开发】Qt的背景介绍(四)
  • 项目复盘核心要点
  • 网络安全基础作业三
  • 图论的整合
  • JS WebAPIs DOM节点概述
  • v0+claude+cursor构建初始脚手架
  • 北京养老金计算公式网页实现案例:从需求分析到架构设计
  • 在Python中操作Word
  • 滴滴0722 总结与优化方向
  • J2EE模式---前端控制器模式
  • es6中的symbol基础知识
  • Element Plus Table 组件扩展:表尾合计功能详解
  • UE5 UI ScrollBox 滚动框
  • .NET使用EPPlus导出EXCEL的接口中,文件流缺少文件名信息
  • 归并排序(Merge Sort)(递归写法)
  • 【前端】ikun-pptx编辑器前瞻问题一: pptx的xml样式, 使用html能100%还原么
  • vscode目录,右键菜单加入用VSCode打开文件和文件夹(快速解决)(含删除)(脚本)
  • 基于 KeepAlived + HAProxy 搭建 RabbitMQ 高可用负载均衡集群
  • 医院信息系统(HIS)切换实施方案与管理技术分析
  • Linux中信号认识及处理和硬件中断与软中断的讲解
  • 基于 Spring Batch 和 XXL-Job 的批处理任务实现
  • iOS加固工具有哪些?从零源码到深度混淆的全景解读
  • iOS 抓包工具有哪些?场景导向下的工具推荐与实战对比
  • 微软徽标认证是什么?如何快速获取驱动签名?