数据库查询语句介绍

数据库查询语句介绍

    • [问题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) 并选择 useridtotal_amount

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

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

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

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

相关推荐
码农阿豪1 小时前
国产化替代新篇章:金仓数据库如何实现MongoDB平滑迁移
数据库·mongodb
彦偈1 小时前
Centos7 oracle 11G 搭建ADG
数据库·oracle
言德斐8 小时前
SQL性能优化的思路及策略
数据库·sql·性能优化
码界奇点8 小时前
Django视图从基础到高级的全面解析
数据库·django·sqlite·web·python3.11
Allan_20258 小时前
数据库学习
数据库·学习
fen_fen9 小时前
人大金仓数据库kingbase8创建表示例
数据库·oracle
一勺菠萝丶9 小时前
「您的连接不是私密连接」详解:为什么 HTTPS 证书会报错,以及如何正确配置子域名证书
数据库·网络协议·https
²º²²এ松9 小时前
蓝牙低功耗(BLE)通信的中心设备/外围设备(连接角色)、主机/从机(时序角色)、客户端/服务器(数据交互角色)的理解
运维·服务器·数据库
百锦再9 小时前
Vue Scoped样式混淆问题详解与解决方案
java·前端·javascript·数据库·vue.js·学习·.net
数据库知识分享者小北10 小时前
云栖重磅|瑶池数据库:从云原生数据底座向“AI就绪”的多模态数据底座演进
数据库·人工智能·云原生