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

经典sql题(九)SQL 查询详细指南总结二

示例

综合上一章内容,编写一个示例 SQL 查询:

SELECT DISTINCT a.user_id, COALESCE(b.amount, 0) AS amount
FROM users a
LEFT JOIN transactions b ON a.user_id = b.user_id
WHERE a.status = 'active'
GROUP BY a.user_id
HAVING COUNT(b.transaction_id) > 0
ORDER BY amount DESC
LIMIT 10;

SQL 查询的执行步骤图表说明:

  1. FROM 和 JOIN

    • 连接 users 表和 transactions 表。
    • 使用 LEFT JOIN 确保 users 表中的所有行都被保留,即使在 transactions 中没有匹配。
  2. WHERE

    • 过滤 users 表中 status'active' 的行。
  3. GROUP BY

    • 将结果按照 user_id 分组。
  4. HAVING

    • 过滤之前分组的结果,保留 transactions 表中 transaction_id 计数大于 0 的组。
  5. SELECT

    • 提取每个分组的 user_idamount(使用 COALESCENULL 值替换为 0)。
  6. ORDER BY

    • amount 降序排列结果。
  7. DISTINCT

    • 确保结果中 user_id 是唯一的。
  8. LIMIT

    • 仅返回前 10 行结果。

步骤图表

┌───────────────────────────────────────────┐
│                FROM & JOIN                │
│  users a LEFT JOIN transactions b         │
└───────────────────────────────────────────┘
                │
                ▼
┌───────────────────────────────────────────┐
│                 WHERE                     │
│           a.status = 'active'             │
└───────────────────────────────────────────┘
                │
                ▼
┌───────────────────────────────────────────┐
│               GROUP BY                    │
│              a.user_id                    │
└───────────────────────────────────────────┘
                │
                ▼
┌───────────────────────────────────────────┐
│                HAVING                     │
│     COUNT(b.transaction_id) > 0           │
└───────────────────────────────────────────┘
                │
                ▼
┌───────────────────────────────────────────┐
│                SELECT                     │
│ DISTINCT a.user_id, COALESCE(b.amount, 0) │
└───────────────────────────────────────────┘
                │
                ▼
┌───────────────────────────────────────────┐
│               ORDER BY                    │
│              amount DESC                  │
└───────────────────────────────────────────┘
                │
                ▼
┌───────────────────────────────────────────┐
│                 LIMIT                     │
│                   10                      │
└───────────────────────────────────────────┘

为了演示这条 SQL 查询的执行,可以先定义数据库表架构并插入一些示例数据。

数据库表架构

表 1:users
user_idnamestatus
1Aliceactive
2Bobinactive
3Charlieactive
4Davidactive
表 2:transactions
transaction_iduser_idamount
11100
21200
33150
44NULL

执行步骤及结果

1. FROM 和 JOIN
SELECT a.user_id, b.amount
FROM users a
LEFT JOIN transactions b ON a.user_id = b.user_id;
user_idamount
1100
1200
2NULL
3150
4NULL
2. WHERE
WHERE a.status = 'active'
user_idamount
1100
1200
3150
4NULL
3. GROUP BY
GROUP BY a.user_id
user_idamount (example aggregation)
1100, 200
3150
4NULL
4. HAVING
HAVING COUNT(b.transaction_id) > 0
user_idamount (example aggregation)
1100, 200
3150
5. SELECT & COALESCE
SELECT DISTINCT a.user_id, COALESCE(b.amount, 0) AS amount
user_idamount
1100
1200
3150
6. ORDER BY
ORDER BY amount DESC
user_idamount
1200
3150
1100
7. DISTINCT

在这个例子中已经处理。

8. LIMIT
LIMIT 10

结果与 ORDER BY 相同,因为只有 3 行。

最终结果

user_idamount
1200
3150
1100

这些步骤展示了 SQL 查询如何逐步处理数据,应用过滤、分组、排序和限制操作,最后返回所需结果。


http://www.kler.cn/a/313957.html

相关文章:

  • 搭建深度学习开发环境
  • JAVA题目笔记(十五)经典算法题
  • 移动端【01】面试系统的MVVM重构实践
  • unity基础,点乘叉乘。
  • 中文书籍对《人月神话》的引用(161-210本):微软的秘密
  • 探索 HTTP 请求方法:GET、POST、PUT、DELETE 等的用法详解
  • MySQL中的LIMIT与ORDER BY关键字详解
  • git 推送文件
  • vue3 ant-design 4.x 表格动态行样式设置
  • Tomcat服务器—Windows下载配置详细教程
  • Sui Builder House锦集,原生USDC和CCTP即将登陆Sui
  • 【HTTP】请求“报头”,Referer 和 Cookie
  • (CS231n课程笔记)深度学习之损失函数详解(SVM loss,Softmax,熵,交叉熵,KL散度)
  • 大批量查询方案简记(Mybatis流式查询)
  • Docker_启动redis,容易一启动就停掉
  • 使用Python实现深度学习模型:智能旅游路线规划
  • Base 社区见面会 | 新加坡站
  • 多层感知机paddle
  • 【nginx】搭配okhttp 配置反向代理
  • nvidia-docker Failed to initialize NVML: Unknown Error
  • 【漏洞复现】泛微OA E-Office jx2_config.ini 敏感信息泄漏漏洞
  • 在线查看 Android 系统源代码 Android Code Search
  • leetcode49字母异位词分组
  • 深度解析 MintRich 独特的价格曲线机制玩法
  • OpenGL 原生库5 变换
  • 从拥堵到畅通:HTTP/2 如何解决 Web 性能瓶颈?