数据库查询语句介绍

数据库查询语句介绍

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

相关推荐
vvvae12344 小时前
分布式数据库
数据库
雪域迷影5 小时前
PostgreSQL Docker Error – 5432: 地址已被占用
数据库·docker·postgresql
bug菌¹5 小时前
滚雪球学Oracle[4.2讲]:PL/SQL基础语法
数据库·oracle
逸巽散人6 小时前
SQL基础教程
数据库·sql·oracle
月空MoonSky6 小时前
Oracle中TRUNC()函数详解
数据库·sql·oracle
momo小菜pa6 小时前
【MySQL 06】表的增删查改
数据库·mysql
向上的车轮7 小时前
Django学习笔记二:数据库操作详解
数据库·django
编程老船长7 小时前
第26章 Java操作Mongodb实现数据持久化
数据库·后端·mongodb
Mephisto.java7 小时前
【力扣 | SQL题 | 每日四题】力扣2082, 2084, 2072, 2112, 180
sql·算法·leetcode
全栈师8 小时前
SQL Server中关于个性化需求批量删除表的做法
数据库·oracle