MySQLの入門まとめ

SQLについて学んだのでまとめてみた

参考文献

ぐんぐん実力がつく! 逆算式SQL教科書

ぐんぐん実力がつく! 逆算式SQL教科書

SQLとは

  • Structured Query Languageの略称
  • 日本語で言うと、構造化問い合わせ言語
  • つまり、データベースへ問い合わせるための言語である
  • ※公式にはSQLは何の略称でもないらしい(参照:http://ja.wikipedia.org/wiki/SQL#cite_note-0)

SQLを書くに当たって

3つの掟
  • ゴールを明確にする
    • 他のプログラミングも同様であるが、書いているうちに結局自分はなにがしたかったのか分からなくなってしまうことがある
    • SQLを書き始める前に、まずゴールを紙に書いてみる(個人的にはEvernoteを利用)
  • どのように実現するか、そのために何が必要かを考える
    • SQLは結局は集合演算なので、全体のパイからどうやって目的のレコードを取得するかをイメージでもいいので書いてみる
    • そのイメージを日本語化してみる
    • その際に、必要な情報も加えて記載しておく
  • やってみる
    • 個人的見解ですが、ひたすらに書いているとなんとなく分かってくる
SQLは英作文みたいなもの
  • SQLも単なる言語に過ぎない
  • つまり、日本語で表現出来れば、あとは、英作文の要領でSQLの文法に従って書くだけ

プロセスとしては

  1. まずは日本語で考える
  2. それを記号(演算子など)で置き換え、SQLに翻訳する
  3. そして段階的にSQL文を組み立ててみる
  4. 実行しながら最終的な結果に到達する
所感
  • 日本語で書けないことは、SQLでも書けない
  • ということは、まず、日本語で文章化してみることが、早くアウトプットに繋がる道である

SQLの基本的な構文

SQLのもっとも基本的な構文

SELECT A FROM B WHERE C
  • 上の意味はBテーブルからCという条件でAを取得する
  • サンプルテーブル
mysql> use test
Database changed

mysql> SHOW tables;
+----------------------------+
| Tables_in_saiyo_dev_branch |
+----------------------------+
| users                      |
| diaries                    |
+----------------------------+
2 rows in set (0.00 sec)

mysql> DESCRIBE users;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     |      | PRI | NULL    | auto_increment |
| name  | varchar(40) | YES  |     |         |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> DESCRIBE diaries;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id      | int(11)     |      | PRI | NULL    | auto_increment |
| user_id | int(11)     |      |     |         |                |
| title   | varchar(40) | YES  |     |         |                |
| body    | text        | YES  |     |         |                |
+---------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)


例えば、

mysql> SELECT users.* FROM users WHERE users.id < 3;
+----+------+
| id | name |
+----+------+
| 1  | 太郎 |
| 2  | 花子 |
+----+------+
2 row in set (0.00 sec)
  • usersテーブルから、usersテーブルのidカラムが3未満であるという条件でusersテーブルの全カラムを取得する
SELECT句(select clause)
  • 取得したいカラムを指定する句
    • エイリアス(別名)を付けることが出来る
      • 例えば、SELECT users.name AS user_name
    • *(ワイルドカード)で全カラムを取得することが出来る
      • この際、テーブル名を指定しなければ、全てのテーブルの全カラムを取得することになる
    • カラム名が一意であるときは、テーブル名を省略できる
FROM句(from clause)
  • 検索をかける対象の指定する句(厳密には違うが)
    • エイリアスを付けるとこが出来る
      • 例えば、FROM users members
    • サブクエリ(副問い合わせ)でテンポラリテーブルを作成することが出来る
      • テンポラリテーブル内はインデックスが使用できない
WHERE句(where clause)
  • 検索条件を指定する句
    • 「=,<,>,<>,IN」などの演算子を使用する

結合

  • テーブルとテーブルをある条件でくっつける
  • FROM句とWHERE句で指定する
  • 複数のテーブルにまたがって検索をかけたい時などに結合を利用する
  • 結合することをJOINという
  • 構文
mysql> SELECT A FROM B JOIN D ON E WHERE C;

テーブルDをEという条件で結合する

INNER JOIN
  • もっとも基本的なJOIN
mysql> SELECT * FROM diaries JOIN users ON diaries.user_id = users.id;
+----+------+----+---------+-----------+--------+
| id | name | id | user_id | title     | body   |
+----+------+----+---------+-----------+--------+
| 1  | 太郎 | 1  | 1       | テスト    | MysSQL |
| 1  | 太郎 | 2  | 1       | テスト2   | SQLite |
+----+------+----+---------+-----------+--------+
2 row in set (0.00 sec)
  • 結合方法
    • ON以下の条件で結合を行う
    • 上記の例でdiariesを持っていないuserがいたときには、JOINの対象から外れ
      • つまり花子が消えている
  • 「JOIN」と省略できる
LEFT OUTER JOIN
  • 構文
mysql> SELECT * FROM diaries JOIN users ON diaries.user_id = users.id;
+----+------+------+---------+-----------+--------+
| id | name | id   | user_id | title     | body   |
+----+------+------+---------+-----------+--------+
| 1  | 太郎 | 1    | 1       | テスト    | MysSQL |
| 1  | 太郎 | 2    | 1       | テスト2   | SQLite |
| 2  | 花子 | NULL | NULL    | NULL      | NULL   |
+----+------+------+---------+-----------+--------+
3 row in set (0.00 sec)
  • 結合方法
    • ON以下の条件で結合を行う
    • 上記の例でdiariesを持っていないuserがいたときには、diariesのカラムがNULLになる
      • 花子のレコードそうである
  • 「LEFT JOIN」と省略できる
その他
  • 以下のJOINもあるけど、使ったことがないので割愛
    • RIGHT OUTER JOIN
      • 結合の仕方がLEFT OUTER JOINと逆
    • CROSS JOIN
      • 全組み合わせでJOINする(MySQLではINNER JOINと同じ)非連結結合
      • ほぼ確実に使わない


最後までお読みいただきありがとうございました。