数据库查询语句介绍
-
- [问题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;
这个查询分为以下几步:
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 查询的执行顺序和每个步骤的详细解释:
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
表中选择所有数据。sqlFROM transactions
-
WHERE :然后应用
WHERE
子句筛选出满足条件的数据。这里的条件是month = 3
并且day
在 1 到 10 之间。sqlWHERE (month = 3 AND day BETWEEN 1 AND 10)
-
GROUP BY :接下来,将满足
WHERE
条件的数据按userid
分组。sqlGROUP BY userid
-
SELECT :然后对每个分组计算
SUM(amount)
并选择userid
和计算的总金额total_amount
。sqlSELECT userid, SUM(amount) as total_amount
-
HAVING :最后,应用
HAVING
子句筛选出满足总金额total_amount
大于等于 100 万的分组。(HAVING短语作用于组哦~从中选择满足条件的组)sqlHAVING total_amount >= 1000000;
为了更好地理解,以下是执行过程的详细步骤:
-
FROM transactions:
- 从
transactions
表中获取所有数据。
- 从
-
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 |
-
-
GROUP BY userid:
-
将筛选后的数据按
userid
分组:plaintext| userid | amount | |--------|--------| | 101 | 50000 | | 101 | 200000 | | 101 | 300000 | | 102 | 150000 | | 103 | 800000 |
-
-
SELECT userid, SUM(amount) as total_amount:
-
对每个分组计算
SUM(amount)
并选择userid
和total_amount
:plaintext| userid | total_amount | |--------|--------------| | 101 | 550000 | | 102 | 150000 | | 103 | 800000 |
-
-
HAVING total_amount >= 1000000:
-
筛选出总金额
total_amount
大于等于 100 万的分组:plaintext(没有满足条件的分组)
-
在这个例子中,没有任何 userid
满足总金额大于等于 100 万的条件,所以最终结果为空。