数据库查询语句介绍
- 问题1: 筛选特定日期范围且累计金额大于等于100万的数据
- 问题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 查询来实现这一需求。
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;
这个查询分为以下几步:
WHERE (month = 3 AND day BETWEEN 1 AND 10)
筛选出日期在 3 月 1 日到 3 月 10 日之间的数据。GROUP BY userid
将筛选出来的数据按userid
分组。SUM(amount) as total_amount
计算每个用户在该日期范围内的总金额。HAVING total_amount >= 1000000
筛选出总金额大于等于 100 万的用户。
问题2: select * from table where b=xx 和 select id from table where b=xx 的区别
这两个查询的区别在于返回的列不同。
-
SELECT * FROM table WHERE b = xx
:- 这个查询会返回所有满足条件
b = xx
的行的所有列。 *
表示选取所有列。- 如果表
table
有很多列,这个查询会返回所有这些列的数据。
- 这个查询会返回所有满足条件
-
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 查询的执行顺序和每个步骤的详细解释:
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;
-
FROM:首先从
transactions
表中选择所有数据。FROM transactions
-
WHERE:然后应用
WHERE
子句筛选出满足条件的数据。这里的条件是month = 3
并且day
在 1 到 10 之间。WHERE (month = 3 AND day BETWEEN 1 AND 10)
-
GROUP BY:接下来,将满足
WHERE
条件的数据按userid
分组。GROUP BY userid
-
SELECT:然后对每个分组计算
SUM(amount)
并选择userid
和计算的总金额total_amount
。SELECT userid, SUM(amount) as total_amount
-
HAVING:最后,应用
HAVING
子句筛选出满足总金额total_amount
大于等于 100 万的分组。(HAVING短语作用于组哦~从中选择满足条件的组)HAVING total_amount >= 1000000;
为了更好地理解,以下是执行过程的详细步骤:
-
FROM transactions:
- 从
transactions
表中获取所有数据。
- 从
-
WHERE (month = 3 AND day BETWEEN 1 AND 10):
- 筛选出满足条件的行,比如假设
transactions
表有以下数据:| 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 |
- 筛选出满足条件的行,比如假设
-
GROUP BY userid:
- 将筛选后的数据按
userid
分组:| userid | amount | |--------|--------| | 101 | 50000 | | 101 | 200000 | | 101 | 300000 | | 102 | 150000 | | 103 | 800000 |
- 将筛选后的数据按
-
SELECT userid, SUM(amount) as total_amount:
- 对每个分组计算
SUM(amount)
并选择userid
和total_amount
:| userid | total_amount | |--------|--------------| | 101 | 550000 | | 102 | 150000 | | 103 | 800000 |
- 对每个分组计算
-
HAVING total_amount >= 1000000:
- 筛选出总金额
total_amount
大于等于 100 万的分组:(没有满足条件的分组)
- 筛选出总金额
在这个例子中,没有任何 userid
满足总金额大于等于 100 万的条件,所以最终结果为空。