0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

データ分析・活用 SQL入門を読んで

Posted at

TL;DR

これを読んだメモです。自分が知らなかったことととか書いてきます。個人的には、長いSQL文を読む、というところに1章使っているのがいいなと思いました。(その割に薄っぺらい感想ですが、まあSQL文読むってのは実践あるのみだと思うので・・・)

SQLの実行順について

select文の実行順はFROM→JOIN→ON→WHERE→GROUP BY→HAVING→SELECT→OVER(ウィンドウ関数)→ROWS/RANGE(ウィンドウ関数)→PARTITIOON BY(OVER句内)→ORDER BY(OVER句内)→ORDER BY→LIMITとなる。これを意識するだけでも実行性能に効いてくる
例えば、HAVINGとWHEREはどちらも条件でデータを絞る、ものだが、できればWHEREで絞れるものは絞ったほうがいい。なぜなら、先に実行されるWHEREで条件を絞ったほうが、SQL実行順の関係で早くデータを絞ることができるため。

NULLとCOALESCE関数

SQLでは、NULLと文字列を結合するとNULLとなる(NULL伝播という)。そのため、四則演算をしたいが、NULLカラムがある場合は、置き換えが必要。そこでCOALESCE関数を使う。
COALESCE(A, B)で「カラムAがNULLじゃなかったらその値を、NULLだったらBを返す」という感じ。例えば、以下のようなpurchaseテーブルがあるとする

purchase_id price coupon
100001 2000 NULL

price - discountを求めたいとき、そのまま引き算するとNULLとなる。NULLの場合は0として計算したい場合、以下のようにする

SELECT purchase_id, price, coupon, price - COALESCE(coupon, 0) AS discount_price from PURCHASE: 

自己結合

二つの別々のテーブルを外部キーにより結合するだけでなく、同じテーブルを結合することができる。

SELECT * FROM employees FROM employee emp1 INNER JOIN employee emp2 ON emp1.position = emp2.position AND emp1.department <> emp2.department; 

このSQLにより、employeesテーブル内で、役職は一緒だけど、部署が異なる、という人を抽出できる。行同士を細かい条件で絞り込むなどすることが可能

長いSQLの読み方

内側のSQL(サブクエリなど)から読むことと、句の処理順に読むことを意識する。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?