1

我真的需要这个问题的帮助。

给定两个关系的实例,查询的结果是什么?我知道答案,我只需要知道你是怎么得到它的?我真的对这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
4

3 回答 3

0

看看这个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
于 2013-02-24T04:34:15.143 回答
0

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;

SQL 小提琴演示

这会给你:

| A |  AV |
-----------
| 1 | 2.5 |
于 2013-02-24T03:50:09.643 回答
0

您正在选择 RA,其中 RB < 4。有两个符合条件的记录,它们的值都为 1。

您正在 R 和 S 之间进行笛卡尔连接,但没有从 S 中选择任何内容,因此与 S 相关的任何事情都无关紧要。

回到 R,B 的两个小于 4 的值是 2 和 3。这两个数字的平均值是 2.5。

您按 SC 分组而不选择它的事实应该会导致您的查询崩溃。

于 2013-02-24T03:47:54.130 回答