每当我们需要使用现有表格创建新的表格,然后需要再次查询时,就表明我们需要使用某种子查询
在编写子查询时,查询很容易就看起来很复杂。为了便于阅读,其实日后经常只是你自己要阅读:
要记住的重要事项是,在使用子查询时,要让读者能够轻松地判断查询的哪个部分将一起执行。大部分人的做法是按照某种方式缩进子查询。如果在子查询后面有 GROUP BY、ORDER BY、WHERE、HAVING 或任何其他语句,则按照外部查询的同一级别缩进。
#good
SELECT *
FROM (SELECT DATE_TRUNC('day',occurred_at) AS day,
channel, COUNT(*) as events
FROM web_events
GROUP BY 1,2
ORDER BY 3 DESC) sub
GROUP BY channel
ORDER BY 2 DESC;
#bad
SELECT * FROM (SELECT DATE_TRUNC('day',occurred_at) AS day, channel, COUNT(*) as events FROM web_events GROUP BY 1,2 ORDER BY 3 DESC) sub;
or
SELECT *
FROM (
SELECT DATE_TRUNC('day',occurred_at) AS day,
channel, COUNT(*) as events
FROM web_events
GROUP BY 1,2
ORDER BY 3 DESC) sub;