こんにちは、プロデューサーの山田です。
私は主に企画・運用&進行管理などをおこなっています。
本記事はプロデューサー/ディレクター(以下P/D)がSQLを叩けると捗るので、基礎の基礎だけでも書けるようになろう。という話をします。
※注意
この記事ではSQLという言語についての細かい話はしません。
ひとまず「データベース(DB)上のデータを操作する言語」と認識しておきましょう。
詳細は「SQL とは」といった感じでググるとたくさん情報がでてきますから、そちらを参照していただければと思います。
|P/DがSQLを書けると何が変わるか?
この読まれている時点で、何らかの形でSQLの必要性を感じられているかと思います。
P/DがSQLを書ける場合の利点は、ざっくり以下のようになります。
■ 全体の作業スピードが上がる
エンジニアの作業を煩わせず、P/DとしてもSQL作成までの待ち時間が無くなる為、とても効率的です。
自分の欲しい数値が自分で取ってこられるので、齟齬が発生しがちな両者の対話も基本的に不要です。
■ エンジニアとコミュニケーション取りやすい
SQLを叩くには、そのサービスがどのような値を格納していて、データがどのテーブルにあるのか。といったことを把握する必要があります。
その為、エンジニアとの対話の際にDBの内容を把握している前提で話せる為、コミュニケーションが正確になりやすいです。
■ サービスの仕組みが理解しやすい
DBはデータを格納したり取り出したりする機能があります。これはWebサービスの根幹を担う機能です。
その為、どこに何がどのように使われているのかが理解しておくとサービス自体の全体像が見えやすくなります。
私個人としても、DBの構成が理解できたことでサービスに対する取り組みへ一歩踏み込めた実感がありますのでとてもオススメです。
|最低限のSQLでも数値が取れる
とはいっても、いきなり本職レベルのSQLを書くのは不可能です。
まずは最低限のSQLの書き方を覚えてみましょう。
今回の内容だけでも
- 「○日から×日までに課金した顧客を日付の新しい順で一覧表示する」
- 「Aのキャンペーンに参加したユーザーの平均金額」
といったものが出力できるようになります。
それでは始めていきましょう。
1. データベース(DB)の用語について
まずはSQLを扱う前に、データベースを扱う上で登場する用語を覚えておきましょう。
phpMyAdmin(下記の図)などをみていただくとわかるのですが、よくエクセルを例に表現されます。
※下記は公式デモの画像です。
■ データベース(以下DB)
エクセルでいう「Book」です。これがないとデータを扱うもクソもありませんね。
サービスごとに違うDBを定義して使っている場合があります。
例文:「あのサービスで使ってるDBってここだっけ?」
■ テーブル
エクセルでいう「Sheet」です。ここにデータが蓄積されていきます。
ここも、格納するデータを分けている場合が多いです。
例文:「顧客の注文情報はこのテーブルに入ってるよ!」
■ カラム
エクセルでいう列です。カラムには例えば「文字列」とか「数値」など、扱うデータの属性を定められます。
逆にいうと、そのカラムにはその定められたデータしか格納することができません。
カラムには名前がつけられます。
例文:「顧客IDのデータが格納されているのはこのUsers_idってカラムであってる?」
■ レコード
エクセルでいうセルに格納されたデータそのものを指します。
文字列であったり数値であったり、内容は様々です。
例文:「おいおい、このテーブル300万レコードもあるんだけど…。」
2. これだけ覚える非エンジニア向けSQL
用語も抑えたところで、SQLの基本的な書き方です。取り急ぎは下記を覚えればOKです。
■ 基本構文(SELECT文)
SELECT カラム名 FROM テーブル名 WHERE カラム名 条件式 BETWEEN "A" AND "B" GROUP BY カラム名 ORDER BY カラム名 ASC もしくは DESC
結構簡単ですよね。なんとなく意味も予測しやすいのではないでしょうか?
それではこの構文がどういった意味を持つのか解説していきます。
■ SELECT
・ 解説
和訳すると「選択する」でしょうか?集計する対象のカラムを選択します。
例:user_idというカラムを選択
SELECT user_id
ちなみに
SELECT *
とすると全てのカラムを選択していることになります。
複数選択したい場合は
SELECT user_id, name, created
のようにカンマを入力します。
・ COUNT
「user_idの総件数を知りたい!」という時があります。
その場合は
SELECT COUNT(user_id)
といった感じに、
COUNT(対象カラム)
とすると、実行時に格納されている件数を計算して出力してくれます。
重複を弾いた数値を出したい場合は
COUNT(DISTINCT name)
と書きますので覚えておきましょう。
また、COUNT以外にも用意されている関数がたくさんありますので、ぜひ調べてみてください。
■ FROM
解説
和訳すると「〜から」ですね。DBの名前を指定します。
例:customer_tableというDBを指定する
FROM customer_table
■ WHERE
解説
和訳すると「どこで?」とか「どこから?」といった感じの疑問詞です。
レコードを抽出する条件を指定します。
例:nameというカラムのyamadaという文字列を抽出する
WHERE name = "yamada"
※お約束として、条件式に記載する文字列は必ず ” ” で囲んでください。
「WHERE + カラム名 + 条件式」といった形で表現するのですが、この条件式を表現するために色々な演算子(計算に使う記号や単語)が用意されています。
・ 条件式に使える演算子(抜粋)
WHEREの条件式に使える演算子の一例を抜粋しました。
他にも色々ありますが、一旦これだけ覚えていればなんとかなるのではないでしょうか?
・ 比較(< , > , = , >= , <=)
言わずもがな、比較に使用する記号です。
あくまで条件式に使用するものなので
WHERE 1000 = payment
のような順番を入れ替えた書き方はできません。
また、以上は
<=
、以下は
>=
と表現します。
例:購入金額が1000より大きい場合
WHERE payment > 1000
・ LIKE
和訳すると「〇〇のような」となります。
一部分だけ一致するような、文字列のあいまい検索に使用します。あいまいで構わない部分には % をつけてください。
例:後方一致でtouという文字列にマッチした名前を検索したい場合。
WHERE name LIKE "%tou"
この場合はkatou,satouの2つが表示されます。
・ AND
WHEREの後に続けて条件を追加する際に使用します。
WHERE "A" AND "B"
といった形で表現します。
・ OR
WHEREの後に続けて条件を追加する際に使用します。
ANDとは違い、複数の条件のうち、「いずれか」に一致しているものを抽出する場合に使用します。
WHERE "A" OR "B"
といった形で表現します。
・ BETWEEN
「〇〇の間」という意味の単語です。
WHERE カラム名 BETWEEN "A" AND "B"
という形で表現し、範囲で抽出する際に使用します。
単純に数値で範囲を指定してもいいのですが、日付で指定する場合も多いです。
また、日付の表現はいろいろありますが、ここでは
"yyyy-mm-dd hh:mm:ss"
という形で表現しています。
例:2018年5月1日から2018年8月1日までのレコードを抽出する場合
WHERE created BETWEEN "2018-05-01 00:00:00" AND "2018-08-01 23:59:59"
■ GROUP BY
解説
「グループにする」という意味です。
抽出したレコードをカラムでまとめるときに使います。
この際に指定できるカラムはSELECTで選択したもののみとなります。
例:同じnameが複数存在するレコードをnameでまとめて表示する。
GROUP BY name
■ ORDER BY
解説
「〜のように整列する」という意味です。
取得したレコードを昇順もしくは降順に並び替えて表示する
ASC
もしくは
DESC
を文末で指定します。また、何も指定しない場合は昇順となります。
※ASC: ascending(登っていく・上昇的な)
※DESC: descending(降っていく・下降的な)
例:取得したレコードを日付で昇順(降順)に並び替える
ORDER BY created (DESC)
3. できれば覚える非エンジニア向けSQL
ここからはできれば覚えるSQLについて解説します。
重要ですが、少し複雑なので興味があれば調べて使ってみてください。
■ HAVING
・ 解説
「〜を有する」という意味になります。
WHEREとほぼ同じ使い方となるのですが、WHEREとは実行順番が違います。
SQLの実行順番は下記のようになっています。
FROM → WHERE → GROUPBY → HAVING → SELECT → ORDERBY
この通り、HAVINGの場合はGROUP BYの後に使用できるのが特徴となります。
■ IS NULL
・ 解説
「〜がNULLである」という意味になります。
WHERE句の条件式に使用し、レコードが「NULL」である物を検索します。
・ NULLについて
DBに格納される値に「NULL」というものがあります。
普段聞きなれない値ですが、これは「何もない・空白」の状態を表します。
0 すらもありません。完全に空白の状態をNULLと表現します。
■ UNION
・ 解説
「結合する」という意味です。
2つのSELECTを結合して表示する際に使います。
「異なるカラムがあるテーブルA,Bを、両テーブルで共通するカラムであるnameで結合して表示する。」
といった場合にUNIONを使用します。
その際、記述の仕方にルールがありますので調べてみてください。
4. 実行してみよう
それでは今までの内容を使用し、
「2018年5月から2018年11月までに、課金した回数を顧客名別に日付の新しい順で表示する」
を出力するSELECT文を描いてみます。
なお、DBの中には以下のようなテーブル・レコードに対してSQLを実行します。
■ テーブル名:customers
| user_id | name(顧客名) | payment(課金額) | created(レコードが作成された日時)) | | --- | --- | --- | --- | | 1 | satou | 2000 | 2018/2/5 10:34 | | 2 | yamada | NULL | 2018/4/24 5:23 | | 3 | takahashi | 1000 | 2018/5/12 23:53 | | 4 | suzuki | 100 | 2018/5/14 23:53 | | 5 | fujiyama | 3000 | 2018/10/5 3:12 | | 6 | satou | 1000 | 2018/11/7 13:23 | | 7 | suzuki | 2000 | 2018/11/14 15:56 | | 8 | katou | 100 | 2018/11/28 12:32 | | 9 | kutou | 2000 | 2018/12/01 02:32 | | 10 | yamashita | NULL | 2018/12/10 05:12 |
■ 実行するSQL
SELECT name, COUNT(payment), created FROM customers WHERE created BETWEEN "2018-05-01 00:00:00" AND"2018-11-30 23:59:59" GROUP BY name ORDER BY created DESC
■ 実行結果
| name | COUNT(payment) | created | | --- | --- | --- | | katou | 1 | 2018/11/28 12:32 | | satou | 1 | 2018/11/7 13:23 | | fujiyama | 1 | 2018/10/5 3:12 | | suzuki | 2 | 2018/5/14 23:53 | | takahashi | 1 | 2018/5/12 23:53 |
このような出力が得られるはずです。
この出力結果から、suzukiさんの課金回数が多いことがわかりました。
suzukiさんと同じような属性のユーザーは課金しやすい傾向にあるかもしれませんし、suzukiさんについてもっと調べてみる価値がありそうです。
といった形で、複雑なSQLでなくともある程度の仮説に裏付けを作ることができます。
5. 忘れてほしい非エンジニア向けSQL
無事SQLの実行結果を出力できたところで、ここからは使用して欲しくない、更新に関するSQLをご紹介します。
これらを使用すると最悪の場合サービスの停止やシステムの不具合などを招きかねない為、使用しない。もしくはエンジニアとよく相談して使用するように運用してください。
- CREATE
- INSERT
- DELETE
- UPDATE
|これだけ気をつけよう
ここまでひととおりSQLの初歩の初歩について説明してきましたが、やはり初めて実際に使用するには不安が残ると思います。
その際には下記の項目に注意してみてください。
■ 実行していい領域を確認する
もしかしたら実行しようとしているDBまたはテーブルは、エンジニア的にあまりイジられたくないところかもしれません。
念のため、触っても問題ないか聞いておきましょう。
■ まずはエンジニアに相談
特に初回に実行するSQLについては一度相談をしてみたほうが良いでしょう。
また、SQLに興味がある旨を伝えれば、検証環境などの権限を付与してもらえるかもしれません。
積極的にコミュニケーションをとってみましょう。
■ 実行するときはエンジニアに声かけ
実作業中に動かされるとマズイ状況があるかもしれません。
「今からこのDBのこのテーブルでこのSQLを実行する」と一度声かけしておくと安心です。
■ 連続してSQLを実行しない
SQLを実行後、結果がすぐに返ってこないことがあります。
その場合、複数回実行してしまうと処理が溜まっていき、DBの負荷が高くなってしまいます。
最悪サービスに悪影響を及ぼす場合がありますので焦らずに実行しましょう。
■ DBの更新はしない
P/DがDBの更新をすることはまずありえません。
更新することにより何が起こり、それに対してどう対処するのかを熟知していない限りは更新系のSQLは実行しないようにしましょう。
■ 個人情報の取り扱い
DBから集計データを集める場合、個人情報にアクセスする機会が必ず増えるはずです。
個人情報は社のプライバシーポリシーにしたがって扱われる必要がありますので、扱いに注意しましょう。
|最後に
- 使用しているDB、テーブル構成などはしっかりと確認しましょう。
- 初めはエンジニアと共に作業するようにしてください。
それでは良いSQLライフを!