これはなに
- SQLを学ぶ過程で、知識として定着したいことをQiitaにまとめて行こうと思います
- 僕と同じようにSQLをこれから学ぼうとしている人、学び始めた人にとって有益な情報になれば幸いです
SQLを学ぼうと思ったきっかけ
- エンジニアに依頼せずに、自分でデータを抽出し、分析したいと思ったからです
- 仮設を立証、ないしは検証するためにデータを分析したい、実施した施策の効果測定のためにデータを見たいと思うことが多々あります
- その目的を持っている人自身がやり遂げることは仕事の生産性を高めると考えています
- 部分的な依頼は目的を見失いやすく、かといって目的を丁寧に共有してまで実施する仕事かと言えば、そうではないかもしれません
- 責任者である自分がサボらずに生産性を高める努力をすることが、メンバーにも波及すると信じているから
- やはり責任者の振る舞いは少なからず組織に影響すると考えています
- その人間が経験だけで仕事をし、新たな勉強をしないと、組織にもその状況が蔓延してしまうのではないか
- メンバーに成長や努力を求める前に、自分が先頭に立って求める振る舞いを実行する
- やってみせ 言って聞かせて させてみて 誉めてやらねば 人は動かじ
学びのゴール
- サービスの現状を知りたいと思ったときに、データを抽出出来る
- 「今の会員全体の属性データを見たい」が実現できる
- あの施策はうまくいったのか?と思ったときに、データを抽出出来る
- 「あの施策を実施する前と後で、WAUの人数がどう変わったのかが見たい」が実現できる
- これはマジックナンバーになりえるんじゃないか?と思ったときに、データを抽出出来る
- 「この数値が○以上だと、ユーザーはアクティブになるのでは?見てみたい」が実現できる
ということで、少しずつですが学んでいきます
基礎用語の説明
- データベース:表の集まり
- テーブル:表
- カラム:列
- レコード:行
- クエリ:SQLを実行するときにデータベースに送る命令文のこと
データ抽出の基本クエリ
SELECT
カラム名
FROM
テーブル名
;
- データを抽出するときは、SELECT文を用いる
- SQLで文を書くときの基本
- SELECT、FROMは大文字で書くことが多いが、小文字でも可
- 文末には、セミコロンで終わる
- 取得したいテーブル名、カラム名を書く
- 複数のカラムを取得したい場合は複数カラム名を書き、カンマでつなぐ
データの絞り込み
SELECT
カラム名
FROM
テーブル名
WHERE
条件
;
- データを絞り込むときは、WHERE句を用いる
- 条件の書き方はたくさんあるので適宜調べるほうがいい
- カラムを全て取得したい場合は、アスタリスクを用いる
- 基本的にはご法度で、使う際はLIMITと一緒に使う(後述)
- 文字列を使う場合は、シングルクォーテーションを用いる
条件の具体例
- 何かと同じ
name = 'Increments株式会社'
- 大きい、小さい①
contribution >= 10
- 大きい、小さい②
created_at < '2020-09-18'
- リストにあるかどうか
tag_name IN ('PHP', 'Laravel')
- データが空かどうか①
contract_concluded_at IS NULL
- データが空かどうか②
contract_concluded_at IS NOT NULL
- 条件を複数使いたいとき
contribution >= 10 AND created_at < '2020-09-18'
SQLを書くときの心構え
- どういうデータがあるか確認する
- テーブル名とカラム名が書いてあるものの、どういう状態で保存されているかわからないことが多い
- 最初に以下のような感じで、中身を確認してみるといい
-
LIMIT 数字
で、数字の数だけデータを取得することができる
SELECT
*
FROM
テーブル名
LIMIT 10
;
- エラー文をしっかり読む
- 例えば
line 2:5: 'nane' cannot be resolved
と書いてある場合 - エラーが起きているのは2行目
- nameというものが読めないと言っている
- 例えば
おまけ
社内で利用しているTreasureDataはRDBではなく列指向DBなので、使うカラムを絞ることでビッグデータに対しては高速にクエリを走らせることができる。が、逆にいうと*を使うと定数倍で検索処理が重たくなる。
なので基本的にRedashで分析したいときは * を使うのはご法度です。使うカラムだけ指定するのが望ましい。