【发布时间】:2013-08-29 13:06:02
【问题描述】:
我正在通过GALAXQL学习SQL http://sol.gfxile.net/galaxql.html
我在第 17 课 - GROUP BY/HAVING
这是场景:
让我们看一下我们尚未介绍的几个 SELECT 操作, 即 GROUP BY 和 HAVING。
这些操作的语法如下所示:
SELECT columns FROM table GROUP BY column HAVING expression
SELECT 中的 GROUP BY 命令导致多个输出行 合并为一行。这可能非常有用,例如, 我们希望以表格的形式生成新的统计数据。
例如,要找出每个恒星的最高强度 上课,我们会这样做:
Select Class, Max(Intensity) As Brightness From Stars Group By Class Order By Brightness Desc
HAVING 运算符的工作方式与 WHERE 几乎相同,除了 它是在分组完成后应用的。因此,我们可以 计算每个类的亮度总和,并裁剪出类 总和大于 150。
SELECT class, SUM(intensity) AS brightness FROM stars GROUP BY class HAVING brightness < 150 ORDER BY brightness DESC
我们可以引用 HAVING 子句中未选择的列, 但结果可能难以理解。你应该可以 在 HAVING 子句中使用聚合函数(例如, 亮度
当与联接结合使用时,GROUP BY 变得相当方便。找出答案 每颗恒星的行星数量,我们可以这样做:
SELECT stars.starid AS starid, COUNT(planets.planetid) AS planet_count FROM planets, stars WHERE stars.starid=planets.starid GROUP BY stars.starid
突出显示轨道最多的恒星(行星和卫星组合)。 (请注意,验证查询有些繁重,请耐心等待 按“好的,我完成了..”)。
这是我的答案
SELECT stars.starid AS HighStar,
(COUNT(planets.planetid) + COUNT(moons.moonid)) AS OrbitalsTotal
FROM stars
LEFT OUTER JOIN planets
ON stars.starid = planets.starid
LEFT OUTER JOIN moons
ON planets.planetid = moons.planetid
GROUP BY stars.starid
ORDER BY OrbitalsTotal DESC;
这个查询告诉我,拥有最多轨道的恒星有 170 个轨道
那么:
INSERT INTO hilight SELECT result.HighStar
FROM result
INNER JOIN stars
ON result.HighStar = stars.starid
WHERE result.OrbitalsTotal = 170
我的问题是如何使这个查询更好?我不想对 170 个轨道进行硬编码,也不想创建第二个查询来插入数据。
【问题讨论】:
-
奇怪的是,回答问题的最佳方式不是使用having子句。 SQLite 是否支持派生表,即带有别名的子查询?
-
@DanBracuk 是的,支持
SELECT ... FROM (SELECT ...) AS alias ...。 -
感谢您的回复,该睡觉了,现在正在工作,所以稍后会检查他们
标签: sql sqlite group-by having-clause