我真的需要这个问题的帮助。
给定两个关系的实例,查询的结果是什么?我知道答案,我只需要知道你是怎么得到它的?我真的对这GROUP条线感到困惑。
关系 R (A, B):
1 2
3 4
1 3
关系 S(B,C):
1 3
2 4
询问:
SELECT R.A, avg(R.B) as av
FROM R, S
WHERE R.B < 4
GROUP BY R.A, S.C
HAVING max(S.B) >= 2
答案是:
A Av
1 2.5
看看这个SQLFiddle演示,它通过几个步骤运行您的语句。
首先,这个
SELECT R.A, R.B, S.B AS sb, S.C
FROM R, S
ORDER BY R.A, S.C
这给了你:
A B SB C
1 2 1 3
1 3 1 3
1 2 2 4
1 3 2 4
3 4 1 3
3 4 2 4
WHERE然后在约束下运行它:
SELECT R.A, R.B, S.B AS sb, S.C
FROM R, S
WHERE R.B < 4
ORDER BY R.A, S.C
这使:
A B SB C
1 2 1 3
1 3 1 3
1 2 2 4
1 3 2 4
然后通过GROUP BY. 通常,您只能使用或其他列中提到的列,但只能在诸如or之GROUP BY类的聚合函数中使用(但 MySQL 是宽容的,这就是为什么在此示例中使用 PostgreSQL 服务器以更好地与 SQL92 兼容):avgmax
SELECT R.A, avg(R.B) AS av, S.C, max(S.B) AS maxsb
FROM R, S
WHERE R.B < 4
GROUP BY R.A, S.C
产生:
A AV C MAXSB
1 2.5 3 1
1 2.5 4 2
添加HAVING子句(并且只保留一行之前的结果):
SELECT R.A, avg(R.B) as av, S.C, max(S.B) AS maxsb
FROM R, S
WHERE R.B < 4
GROUP BY R.A, S.C
HAVING max(S.B) >= 2
产生:
A AV C MAXSB
1 2.5 4 2
最后,将未使用的列删除SELECT:
SELECT R.A, avg(R.B) as av
FROM R, S
WHERE R.B < 4
GROUP BY R.A, S.C
HAVING max(S.B) >= 2
并得到:
A AV
1 2.5
JOIN两张表:
SELECT R.A, R.B
FROM RelationR AS r
LEFT JOIN RelationS AS s ON r.b = s.b
它为您提供:
| A | B |
---------
| 1 | 2 |
| 3 | 4 |
| 1 | 3 |
然后,您只需要A像这样分组:
SELECT
R.A,
AVG(R.B) * 1.0 AS av
FROM RelationR AS R
LEFT JOIN RelationS AS S ON R.B = S.B
WHERE R.B < 4
GROUP BY R.A
HAVING MAX(S.B) >= 2;
这会给你:
| A | AV |
-----------
| 1 | 2.5 |
您正在选择 RA,其中 RB < 4。有两个符合条件的记录,它们的值都为 1。
您正在 R 和 S 之间进行笛卡尔连接,但没有从 S 中选择任何内容,因此与 S 相关的任何事情都无关紧要。
回到 R,B 的两个小于 4 的值是 2 和 3。这两个数字的平均值是 2.5。
您按 SC 分组而不选择它的事实应该会导致您的查询崩溃。