みなさんこんばんは。今日は6日目、7日間のDune講座も次でラストになりました。今回は<上級>編を、最後は<LAST>とかにしようかなと思っております。
<初級>のPVが6日目にして1,000を超えそうで、すべての講座を合わせると2,000PVも見えてきています。みなさんここまで見ていただいて本当にありがとうございます。
前回までの講座をまだみていない方はこちらから↓
今回の<上級>編では、SQLの実行順序、区切りの入れ方、可読性を上げるWITH、テーブルの結合について解説します。明日の最終章では自分たちでダッシュボードを完成させるところまで一緒にやってみましょう。
Special thanks to @Guss3.eth
※コードブロックを使用して説明しているため、なるべくパソコンからのアクセスをお勧めします。またこの講座を受けるためにはパソコンが必要です。
SQLの記述順序と実行順序
ここで少し座学的になりますが、今日はSQLの記述順序と実行順序の話に触れておきます。上級レベルになると実行順序を気にした設計も必要なのでぜひ頭に入れてもらえると嬉しいです。ちなみに<中級++>の「HAVING」がまさにそれです。
まず記述順序について見ていきましょう。記述順序に関しては結果に影響を与えないものもありますが、この順序で書いた方がいちばん速く処理されます。
SELECT → どの項目から取得するか
FROM → どのテーブルから取得するか
JOIN → テーブルの結合などの処理
WHERE → 絞り込み条件指定をする
GROUP BY → グループ化をする
HAVING → グループ化後の絞り込み条件指定をする
ORDER BY → 条件に応じて並び替えをする
LIMIT → 取得する行数を指定するか
一方で実際の処理ので記述された通りに、左上のコードから順番に行われているわけではありません。
FROM → どのテーブルから取得するか
JOIN → テーブルの結合などの処理
WHERE → 絞り込み条件指定をする
GROUP BY → グループ化をする
HAVING → グループ化後の絞り込み条件指定をする
SELECT → どの項目から取得するか
ORDER BY → 条件に応じて並び替えをする
LIMIT → 取得する行数を指定するか
このような順番で処理が行われているので、WHEREとHAVINGに違いが現れるのですね。丸暗記する必要性はもちろんないですが、頭に入れておきましょう。
並び替えて区切る〈PARTITION BY〉
SQLの中でも最近実装されたWindow関数の一つ、分析関数の「PARTITION BY」はGROUP BYと似ていてグループ化する役割を持っていますが、グループ化したものを区切って行の並び替えを行うイメージです。
なのでPARTITIONの文字の名の通り、指定された条件で行を並び替え、仕切りを作っているイメージです。なので同一の値でまとめるGROUP BYとも、RANKやROW_NUMBERとも一味違います。
PARTITION BY <何を(カラム)>
しかし並び替えてグルーピングしたところでデータがソートされているわけでないので、一般的に「ORDER BY」と併用されるケースが多いです。
PARTITION BY <何を(カラム)> ORDER BY <何で(カラム名)> <何順に(ASC、DESC)>
またアドレス毎にグルーピングされてもその中での優劣がわからないので、RANKやROW_NUMBERと一緒に使って順位づけを行うケースも多々あります。
RANK() OVER(PARTITION BY <何を> ORDER BY <何で> <何順に>)
ROW_NUMBER() OVER(PARTITION BY <何を> ORDER BY <何で> <何順に>)
トランザクションを人ごとにまとめてランキング化するのではなく、人単位で区切ってたあとにトランザクションごとにランキングっぽくしたい場合に使えます。あまり使わないので、具体的な使用例は明日のdashboard作成で出てきたら説明します。
サブクエリの可読性を向上〈WITH〉
FROMの中にSELECTとFROMをもう一回書いて新しくテーブルを作成する「サブクエリ」という記述方法がありますが、こういう場合は可読性を高めるために代替としてWITH句を使用することをオススメします。
加工済みのカラムに一時的な別の名前をつけて別で管理することで、可読性とコードのメンテナンス性を向上させることができます。
WITH <新しくつけるこのテーブル名> AS (
SELECT
<何を(カラム名)> AS <何に>,
<何を(カラム名)> AS <何に>
<何を(カラム名)> AS <何に>
FROM <参照するデータ元のテーブル名>
< WHERE や GROUP BY などの条件 >
)
こちらはかなり複雑なので、PARTITION BYと同じく明日のdashboard作成時に具体的な使用例を説明しようと思います。
テーブルの結合〈JOIN〉
複数のテーブル(データセットやWITH句で作成したテーブル)を単一のテーブルに結合することが可能です。「JOIN」を使って内部結合と外部結合を行えます。
JOINの中にもいくつかの種類があります。
INNER JOIN(内部結合): それどれのテーブルの一致する項目のデータを取得
OUTER JOIN(外部結合): 一方と共通する項目のデータを取得
LEFT OUTER JOIN: 左側にしかない情報も併せて取得
RIGHT OUTER JOIN: 右側にしかない情報も併せて取得
FULL OUTER JOIN: 両側どちらかしかない情報もすべて取得
CROSS JOIN(交差結合): 2つのテーブルの組み合わせをすべて取得
これらの構文を順番に説明していきたいのですが、まずテーブルの右側と左側とはなんなんでしょうか。
FROM <左側のテーブル>
JOIN <右側のテーブル>
ON <結合時の条件>
それではそれぞれの構文を見ていきましょう。
INNER JOIN
JOINとINNER JOINは同じなので、INNERは省略しても大丈夫です。
SELECT <左側のテーブル> <右側のテーブル>
FROM <左側のテーブル>
(INNER) JOIN <右側のテーブル> /* INNERは省略可能 */
ON <結合時の条件>
LEFT JOIN
SELECT <左側のテーブル> <右側のテーブル>
FROM <左側のテーブル>
LEFT JOIN <右側のテーブル>
ON <結合時の条件>
RIGHT JOIN
SELECT <左側のテーブル> <右側のテーブル>
FROM <左側のテーブル>
RIGHT JOIN <右側のテーブル>
ON <結合時の条件>
CROSS JOIN
SELECT <左側のテーブル> <右側のテーブル>
FROM <左側のテーブル>
CROSS JOIN <右側のテーブル>
ON <結合時の条件>
他にもUNIONやNATURALというJOINの仲間がありますが、こちらも明日まとめて解説していきます!お疲れ様です、これにて学習部分の講座は一通り終了です。明日からは実戦部分に入っていこうと思います。
さいごに
みなさんここまで一通りのDune講座を受けていただきまして本当にありがとうございました!明日のラストはやっとメインのdashboard作成、明日だけで10個以上のqueryを作成することになりますので復習をぜひお願いします!
dashboardにするのはいま流行りの「friend.tech」の分析をやります。protocol feeやaddress数などを最近対応した「BASE」から取得し一つにまとめていきます。
ではまた明日最後の講座でお会いしましょう!今日もニュースレターを見ていただきありがとうございました。