我正在學習SQL通過GALAXQL 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
的擁有操作的工作幾乎方法一樣WHERE,除了 那它在分組完成後應用。因此,我們可以計算出 每級亮度的總和,並裁掉類 其中總和比,說高,150
SELECT class, SUM(intensity) AS brightness FROM stars GROUP BY class HAVING brightness < 150 ORDER BY brightness DESC
我們可以引用列未選擇在HAVING子句中, 但結果可能難以理解。您應該能夠 使用HAVING子句在聚合函數(例如, 亮度< MAX(亮度)* 0.5,但是這似乎崩潰當前 版本的SQLite。
當結合聯接,GROUP通過變得相當方便的找出 每星行星的數量,我們可以做:
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;
這個查詢結果顯示我最oribtals的明星有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 ...)別名...'支持。 –
感謝您的回覆,不得不睡覺,現在在工作,所以稍後會檢查他們 –