我真的需要这个问题的帮助。
给定两个关系的实例,查询的结果是什么?我知道答案,我只需知道你是怎么得到它的?关于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
答案 0 :(得分:0)
您正在选择R.A,其中R.B&lt; 4.有两个合格记录,它们的值均为1.
你在R和S之间进行笛卡尔连接,但是没有从S中选择任何东西,所以与S有关的任何事情都是无关紧要的。
回到R,B的两个小于4的值是2和3.这两个数的平均值是2.5。
您在没有选择的情况下由S.C进行分组这一事实会导致您的查询崩溃。
答案 1 :(得分: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;
这会给你:
| A | AV |
-----------
| 1 | 2.5 |
答案 2 :(得分: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
运行此操作。通常,您只能使用GROUP BY
或其他列中提到的列,但只能使用avg
或max
等聚合函数(但MySQL是宽容的,这就是为什么在此使用PostgreSQL服务器的原因)与SQL92更好兼容的示例):
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