数据库查询语句介绍

数据库查询语句介绍

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

相关推荐
野猪亨利6676 小时前
Qt day1
开发语言·数据库·qt
本就一无所有 何惧重新开始6 小时前
Redis技术应用
java·数据库·spring boot·redis·后端·缓存
isaki1376 小时前
qt day1
开发语言·数据库·qt
流星白龙6 小时前
【Qt】4.项目文件解析
开发语言·数据库·qt
小钻风33666 小时前
HTTPS是如何确保安全的
网络·数据库
CryptoPP7 小时前
获取越南股票市场列表(包含VN30成分股)实战指南
大数据·服务器·数据库·区块链
阿巴~阿巴~8 小时前
Redis重大版本演进全解析:从2.6到7.0
服务器·数据库·redis·ubuntu·缓存·centos
qq_404643349 小时前
MySQL中RUNCATE、DELETE、DROP 的基本介绍
数据库·mysql
像风一样!9 小时前
MySQL数据库如何实现主从复制
数据库·mysql
大白的编程日记.10 小时前
【MySQL】数据库表的CURD(二)
android·数据库·mysql