非エンジニア向けSQLの基礎

## ゴール

- 簡単な集計SQLを書けるようになること
- 会社ごとの〇〇率をグラフ化して、と言われてSQLを書きはじめられるようになること
- SQLの結果をRedashで棒グラフ、積み上げ棒グラフで表現できること

## 想定する受講者

- データベース関係の基本的な用語について、聞いたことはある人
  - テーブル、カラム、レコード、フィールド、SQLなど。
  - 参考) https://academy.gmocloud.com/know/20160425/2259
- Redashなどのダッシュボードツールを見たことはある人

---

## 話すこと/話さないこと

- 話すこと
  - データ構造の読み方(ER図)
  - データの取得方法(いろんなSELECT文)
  - RedashでSQLの結果をグラフにする方法
- 話さないこと
  - DBのインストールとか子難しいやつ
  - ER図
  - 文字にも色々あるよね、とかそこら辺。
  - データを壊してしまうような操作(登録/更新/削除)
  - 権限制御など(DCL)
  - テーブルの作成削除など(DDL)
  - レスポンスの遅いSQLの直し方とか
  - Redashのグラフ

---

## データを取り出してみよう(SELECT文、AS句)

---

```sql
SELECT companies.* FROM companies;
```

* `SELECT {テーブル名}.* FROM {テーブル名};`
    * テーブルのレコードが全部表示されました。

---

### 動かなかった。どうしたら？

* まずはメッセージを読もう。
    * Table 'develop.conmany' doesn't exist
    * conmanyテーブルが無いよ。
        * タイプミスですね。
* 翻訳すれば大抵の原因は書いてあると思う
    * https://translate.google.com/

---

```sql
SELECT
  c.name,
  c.created_at
FROM companies AS c;
```

* `SELECT {テーブル名}.{カラム名} FROM {テーブル名} AS {別名};`
    * `AS`でテーブル名に別名をつけて省略できました。
    * `*`をカラム名にすることで、必要な情報だけ取り出せました。
    * SELECTで表示するカラムはカンマ(,)で複数指定ができます。

---

## データを絞り込んでみよう(WHERE句)

---

### データの種類を覚えよう

* 文字
    * シングルクォート(')で囲う
    * 'abc'、''←空の文字
* 数値
    * 123、3.1415
* 日時
    * '2017-12-08 11:11:45'
    * '2017-12-08'
* 本当はもっと色々ある。のちのち覚えましょう。
    * https://dev.mysql.com/doc/refman/5.6/ja/data-types.html

---

### `SELECT * FROM users AS u WHERE u.email = 'example@example.com';`

* `WHERE {テーブル名}.{カラム名} = '{検索したい文字}'`
    * `=` で同じ値のレコードを検索できました。
    * 数字の比較では`<`や`>=`も使うことがあります。

---

```sql
SELECT *
FROM users AS u
WHERE u.company_id = 2
  AND u.email IS NULL;
```

* ２つの条件を`AND`で繋ぎました。
    * `OR`もあります
* `WHERE {テーブル名.カラム名} IS NULL`でカラのフィールドを検索できました。
    * カラじゃ無い場合は`IS NOT NULL`だよ

---

```sql
SELECT u.name,
       u.created_at
FROM users AS u
WHERE u.company_id IN (1, 2)
  AND u.created_at > '2017-12-08 11:11:45'
```

* WHERE {テーブル名}.{カラム名} IN ({値1}, {値2})
* ()の中に含まれる値を検索する。

---

```sql
SELECT *
FROM users AS u
WHERE u.name LIKE '田中%'
```

* あいまいな文字の検索
    * `%`はどんな文字でもいいよ、という意味
    * 上記の例だと名前が'田中'から始まるユーザーが検索できる
* LIKE '%中%'とすると、名前に'中'が含まれるユーザーが検索できる


---

###  データの登録、更新、削除などSQLの基礎全般を知りたい！(初心者向け)
10. [スッキリわかる SQL 入門 ドリル215問付き! ](https://www.amazon.co.jp/dp/toc/4844333933/ref=dp_toc?_encoding=UTF8&n=465392)
    * 新卒エンジニアの鉄板テキスト。一通り何でも書けるようになるはず。
11. [ORACLE MASTER Bronze\[12c SQL基礎\](試験番号:1Z0-061)完全詳解+精選問題集](https://www.amazon.co.jp/%E3%80%90%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E5%AF%BE%E7%AD%96%E6%9B%B8%E3%80%91ORACLE-MASTER-Bronze-SQL%E5%9F%BA%E7%A4%8E-%E8%A9%A6%E9%A8%93%E7%95%AA%E5%8F%B7/dp/4797375418/ref=sr_1_1?s=books&ie=UTF8&qid=1512718710&sr=1-1&keywords=oracle+sql%E5%9F%BA%E7%A4%8E)
    * SIerとかの新卒必携の資格。たかが資格だが知識のヌケモレを無くすためには良い足がかりかと。

---

### 複雑な条件分岐、結合などを使いつつ、効率のよいSQLが書けるようになりたい！(中級者向け)

12. [達人に学ぶ SQL徹底指南書](https://www.amazon.co.jp/%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6-SQL%E5%BE%B9%E5%BA%95%E6%8C%87%E5%8D%97%E6%9B%B8-CodeZine-BOOKS-%E3%83%9F%E3%83%83%E3%82%AF/dp/4798115169/ref=pd_sim_14_3?_encoding=UTF8&psc=1&refRID=68KN1BW47BZV4V1TN7S7)
    * HAVING句、EXISTS術語、使いこなせてますか？中級へのステップに最適なテキスト。
13. [SQLパズル 第2版](https://www.amazon.co.jp/SQL%E3%83%91%E3%82%BA%E3%83%AB-%E7%AC%AC2%E7%89%88-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%8C%E5%A4%89%E3%82%8F%E3%82%8B%E6%9B%B8%E3%81%8D%E6%96%B9-%E8%80%83%E3%81%88%E6%96%B9-%E3%82%B8%E3%83%A7%E3%83%BC%E3%83%BB%E3%82%BB%E3%83%AB%E3%82%B3/dp/4798114138/ref=pd_sim_14_4?_encoding=UTF8&psc=1&refRID=K8334GK17NW03R7GKE3Q)
    * SQLを書いて書いて書き倒して学びたい！そんな方に。
14. [SQLアンチパターン](https://www.amazon.co.jp/SQL%E3%82%A2%E3%83%B3%E3%83%81%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-Bill-Karwin/dp/4873115892/ref=pd_sim_14_3?_encoding=UTF8&psc=1&refRID=QNJ24H3GC2JFH9CDWH89)
    * 他人の書いた長いSQLを読むのってツラいですよね。「アイツの書いたSQLは汚い」そう言われたくないあなたに。

---

### 俺はSQLの全てをしりたい！(上級者向け)
15. [プログラマのためのSQL 第4版](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AESQL-%E7%AC%AC4%E7%89%88-%E3%82%B8%E3%83%A7%E3%83%BC%E3%83%BB%E3%82%BB%E3%83%AB%E3%82%B3/dp/4798128023/ref=pd_sim_14_1?_encoding=UTF8&psc=1&refRID=QNJ24H3GC2JFH9CDWH89)

---

### 便利なサイト
- [MySQL 関数リファレンス](http://db.yulib.com/)