我正在通过 GALAXQL http://sol.gfxile.net/galaxql.html学习 SQL
我在第 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 子句中使用聚合函数(例如,brightness < MAX(brightness)*0.5,但这似乎会使当前版本的 SQLite 崩溃。
当与联接结合使用时,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
突出显示轨道最多的恒星(行星和卫星组合)。(请注意,验证查询有些繁重,因此请在按下“Ok, I'm done..”后耐心等待)。
这是我的答案
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 个轨道进行硬编码,也不想创建第二个查询来插入数据。