数据库查询语句介绍

数据库查询语句介绍

    • [问题1: 筛选特定日期范围且累计金额大于等于100万的数据](#问题1: 筛选特定日期范围且累计金额大于等于100万的数据)
    • [问题2: select * from table where b=xx 和 select id from table where b=xx 的区别](#问题2: select * from table where b=xx 和 select id from table where b=xx 的区别)
    • 问题3,语句的内在执行顺序

问题1: 筛选特定日期范围且累计金额大于等于100万的数据

假设表的名字为 transactions。

id userid amount month day b
1 101 50000 3 1 xx
2 102 150000 3 2 yy
3 103 200000 3 3 xx

我们需要筛选出所有的日期在 3.1 到 3.10 且累计金额大于等于 100 万的数据。可以使用 SQL 查询来实现这一需求。

sql 复制代码
SELECT userid, SUM(amount) as total_amount
FROM transactions
WHERE (month = 3 AND day BETWEEN 1 AND 10)
GROUP BY userid
HAVING total_amount >= 1000000;

这个查询分为以下几步:

  1. WHERE (month = 3 AND day BETWEEN 1 AND 10) 筛选出日期在 3 月 1 日到 3 月 10 日之间的数据。
  2. GROUP BY userid 将筛选出来的数据按 userid 分组。
  3. SUM(amount) as total_amount 计算每个用户在该日期范围内的总金额。
  4. HAVING total_amount >= 1000000 筛选出总金额大于等于 100 万的用户。

问题2: select * from table where b=xx 和 select id from table where b=xx 的区别

这两个查询的区别在于返回的列不同。

  1. SELECT * FROM table WHERE b = xx:

    • 这个查询会返回所有满足条件 b = xx 的行的所有列。
    • * 表示选取所有列。
    • 如果表 table 有很多列,这个查询会返回所有这些列的数据。
  2. SELECT id FROM table WHERE b = xx:

    • 这个查询只会返回满足条件 b = xx 的行的 id 列。
    • 只选取了 id 一列。
    • 这样返回的数据量通常比 SELECT * 少,因为只返回了特定的一列。

举个例子,假设表 table 有以下结构:

id userid amount month day b
1 101 50000 3 1 xx
2 102 150000 3 2 yy
3 103 200000 3 3 xx
  • SELECT * FROM table WHERE b = 'xx' 会返回:
id userid amount month day b
1 101 50000 3 1 xx
3 103 200000 3 3 xx
  • SELECT id FROM table WHERE b = 'xx' 会返回:
id
1
3

总的来说,SELECT * 返回所有列,而 SELECT id 只返回 id 列。这在数据量大时差异更明显。

问题3,语句的内在执行顺序

SQL 查询的执行顺序与其在语句中的书写顺序不同。以下是上述 SQL 查询的执行顺序和每个步骤的详细解释:

sql 复制代码
SELECT userid, SUM(amount) as total_amount
FROM transactions
WHERE (month = 3 AND day BETWEEN 1 AND 10)
GROUP BY userid
HAVING total_amount >= 1000000;
  1. FROM :首先从 transactions 表中选择所有数据。

    sql 复制代码
    FROM transactions
  2. WHERE :然后应用 WHERE 子句筛选出满足条件的数据。这里的条件是 month = 3 并且 day 在 1 到 10 之间。

    sql 复制代码
    WHERE (month = 3 AND day BETWEEN 1 AND 10)
  3. GROUP BY :接下来,将满足 WHERE 条件的数据按 userid 分组。

    sql 复制代码
    GROUP BY userid
  4. SELECT :然后对每个分组计算 SUM(amount) 并选择 userid 和计算的总金额 total_amount。

    sql 复制代码
    SELECT userid, SUM(amount) as total_amount
  5. HAVING :最后,应用 HAVING 子句筛选出满足总金额 total_amount 大于等于 100 万的分组。(HAVING短语作用于组哦~从中选择满足条件的组)

    sql 复制代码
    HAVING total_amount >= 1000000;

为了更好地理解,以下是执行过程的详细步骤:

  1. FROM transactions:

    • 从 transactions 表中获取所有数据。
  2. WHERE (month = 3 AND day BETWEEN 1 AND 10):

    • 筛选出满足条件的行,比如假设 transactions 表有以下数据:

      plaintext 复制代码
      | id | userid | amount | month | day |
      |----|--------|--------|-------|-----|
      | 1  | 101    | 50000  | 3     | 2   |
      | 2  | 102    | 150000 | 3     | 5   |
      | 3  | 101    | 200000 | 3     | 8   |
      | 4  | 103    | 800000 | 3     | 10  |
      | 5  | 104    | 500000 | 2     | 28  |
      | 6  | 101    | 300000 | 3     | 1   |
  3. GROUP BY userid:

    • 将筛选后的数据按 userid 分组:

      plaintext 复制代码
      | userid | amount |
      |--------|--------|
      | 101    | 50000  |
      | 101    | 200000 |
      | 101    | 300000 |
      | 102    | 150000 |
      | 103    | 800000 |
  4. SELECT userid, SUM(amount) as total_amount:

    • 对每个分组计算 SUM(amount) 并选择 userid 和 total_amount:

      plaintext 复制代码
      | userid | total_amount |
      |--------|--------------|
      | 101    | 550000       |
      | 102    | 150000       |
      | 103    | 800000       |
  5. HAVING total_amount >= 1000000:

    • 筛选出总金额 total_amount 大于等于 100 万的分组:

      plaintext 复制代码
      (没有满足条件的分组)

在这个例子中,没有任何 userid 满足总金额大于等于 100 万的条件,所以最终结果为空。

相关推荐
用户6279947182627 小时前
南大通用GBase 8a之基于审计日志的冷温热数据分析
数据库
数据库小学妹7 小时前
数据库运维五级成熟度:监控、备份、高可用怎么串起来
运维·数据库·监控
一个天蝎座的程序猿7 小时前
为了给报表提速,我把金仓KES的列存储折腾了个遍:聊聊KES的技术能力
数据库
飞越未来云城的霓虹飞猪7 小时前
AI 数据库地图:从 PostgreSQL 到向量数据库,一次看懂 AI 时代的数据底座
数据库
不像程序员的程序媛7 小时前
导出mysql数据结构
数据库·mysql
GlobalTradercrb7 小时前
独立站SEO先写博客还是先优化产品页?看站点阶段
数据库·人工智能·google·pdf·go·seo
PingCAP8 小时前
善战者无赫赫之功:消费金融核心系统的数据库选型与升级路径
数据库·分布式·架构
花间相见8 小时前
【计算基础|MySQL09】索引(下):失效与设计
数据库·后端·面试
张宇Joaquin8 小时前
Linux系统下磁盘扇区512n、512e和4kn的区别
linux·运维·数据库
用户6279947182628 小时前
南大通用 GBase 8c 锁等待与死锁排查:从阻塞链到全局事务号
数据库