数据库查询语句介绍

数据库查询语句介绍

    • [问题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 万的条件,所以最终结果为空。

相关推荐
惊骇世俗王某人5 分钟前
1.MySQL之如何定位慢查询
数据库·mysql
程序员张316 分钟前
SQL分析与打印-p6spy组件
spring boot·sql·mybatis·mybatisplus·p6spy
秦歌6661 小时前
向量数据库-Milvus快速入门
数据库·milvus
Edingbrugh.南空2 小时前
Flink SQLServer CDC 环境配置与验证
数据库·sqlserver·flink
码不停蹄的玄黓2 小时前
MySQL分布式ID冲突详解:场景、原因与解决方案
数据库·分布式·mysql·id冲突
爱上语文3 小时前
Redis基础(6):SpringDataRedis
数据库·redis·后端
Java初学者小白3 小时前
秋招Day14 - Redis - 应用
java·数据库·redis·缓存
丶意冷4 小时前
mybatisPlus分页方言设置错误问题 mybatisPlus对于Oceanbase的Oracle租户分页识别错误
java·数据库·oracle·oceanbase
时序数据说6 小时前
为什么时序数据库IoTDB选择Java作为开发语言
java·大数据·开发语言·数据库·物联网·时序数据库·iotdb
戒不掉的伤怀6 小时前
【Navicat 连接MySQL时出现错误1251:客户端不支持服务器请求的身份验证协议;请考虑升级MySQL客户端】
服务器·数据库·mysql