Pythonの基礎が終わり、次に学んだのはデータベース。次から次へと新しい知識が出てきて、もう混乱してきました(笑)
ただ、Pythonと比べて実際にテーブル(表)があるので、1つずつ見ていくと幾分かイメージしやすかったです。
あと、フロントエンド言語とサーバーサイド言語だけだと思っていたので、

と混乱しましたが、サーバーとの関係性を知ると混乱しなくなりました。
学んできた言語が増えてきて混乱してきたら、「これはどこの役割を担っているのか?」を明確にすると、少しはモヤモヤが解消するのかも。
今回も例に漏れず、メモを頼りに書き起こししたので説明が足りない部分などあると思いますが、あしからず。
データベースって何?
データベースとは簡単に言えば、「ものすごく便利なExcel」
より詳しく言うと、検索や蓄積が容易にできるよう整理された情報の集まり。
どれくらい便利かというと、世の中に出ているWebサービスはほぼ100%データベースを使用しているほど。
身近なところで言うとTwitterとか、ユーザー情報などを管理したりする時によく使われています。
データベースで何ができるの?
何種類もテーブル(表)を作って、情報を分かりやすく管理できるのがデータベース。
- データを表で管理。
- 検索ができる、条件を付けたり、リンクさせたり。
- 表を作ったり、データを追加したり、更新したり、削除したり。
1つのテーブルにたくさんの情報を入れ込むとゴチャゴチャしてしまいます。
そこで、それぞれの情報ごとにテーブルにして分かりやすくし、さらに各テーブルに関係をもたせることで、繋がっていながら個別で管理します。
ex)「ユーザー情報」「投稿」など。
データベースの中には何種類ものテーブルが入っていて、柔軟にデータを管理します。
データベースを使うには?SQLとは?
データベースを使うには、
- データベースの作成
- テーブル(表)の作成
- データの追加、検索、編集、削除など。
が必要です。そして、これを行うのがSQL!!
SQLは「Structured Query Language」の略で「構造と対話する言語」という意味だそう。
SQLを実際に使ってみる。
使うソフトは、「DB Browser for SQLite」
基本的な文法をいくつか。
CREATE TABLE テーブル名(カラム名1, カラム名2, …);
usersというテーブルを作るとしたら、
CREATE TABLE users(id INT, name TEXT);
カラム(列)の名前と、そこにどんなタイプの値が入るのかを決めてあげます。
上の例の場合、INTには数値、TEXTには文字が入ります。
INSERT INTO テーブル名 VALUES(値1, 値2, …);
IMPORT INTO users(1, 'Yamada');
データを追加するには、カラムの数と同じ数の値を指定します。
値は並べた順にカラムに追加されていくので、値を入れたいカラムと同じ順番で並べないといけません。
これは、ほんの一部で他にもデータの取得や削除、更新など。
詳しくはprogateで学ぶか、こちらのサイトを参照。
プライマリーキー(主キー)って何?
いくつものテーブル(表)を結びつけるデータベースにおいて、他のものと被らず「これ!」とすぐに特定できるキーを作ってあげる必要があります。
それがPRIMARY KEY(プライマリーキー)です。
プライマリーキーを設定すると、中の値の重複が許されないので、「必ず特定できるキー」になります。
- オートインクリメント
- オートインクリメントとプライマリーキーを指定する際、整数を指定するINTEGERは省略形のINTではなく、しっかりとINTEGERと書いてあげる。
- オートインクリメントとプライマリーキーで指定した値は、今まで入力した最大値に+1した数
- 排他制御という考え方がある。
SQLの構文の実行順序
出典:SQLの実行順番|七転八起SEの備忘録
混乱したのが、これ。
上から順番に実行されていく他の言語と違って、並び順と実行順が違うのがSQL。
だけど、言葉の意味をひとつひとつ紐解いていくと、少しずつ見えてきました。
基本の流れはこれで、ここにテーブル同士を結合したり、グループ化したり、より細かく指定したり、していきます。
別々の表を繋いで使う為のテーブル結合。
2つのテーブルをくっつけて、情報を取り出す際に「テーブル結合」の処理を実行しないといけません。
テーブル結合には大きく、
- INNER JOIN (JOIN)
- OUTER JOIN
の2つ、
そして、OUTER JOINには、
- LEFT OUTER JOIN
- RIGHT OUTER JOIN
- FULL OUTER JOIN
の3つがあります。
構文など詳しくはこちら。
INNER JOINとOUTER JOINの違い
両者の違いは、
- 条件に一致しているところだけ取得するか
- 一致しない部分も取得するか
です。
INNER JOINは、2つのテーブルを結合したうえで一致しているものしか取得しません。
一方、OUTER JOINは2つのテーブルを結合し、一致したものも一致してないものも両方取得します。
その際にどちらのテーブルを優先するかによって、LEFTとRIGHTを指定します。
ちなみに、よく使われるのはLEFT OUTER JOIN。
結合したテーブルのすべての値を取得するのが、FULL OUTER JOIN。
サブクエリとは?
WHEREなどで条件を指定してあげる際に、より細かく条件を指定したい時に使うのがサブクエリです。
入れ子構造で少し混乱しましたが、要するにはなり外側のクエリに渡す条件を別の文で細かく書いているだけで、やっていることは基本的に今まで変わりませんでした。注意するのは、
- ちゃんと()で囲んであげる
- 外側のWHEREの部分に渡してあげる条件は1 行のみであること(もちろん例外アリ)
一対一、一対多、多対多
ここまで1つの値に対して1つの値しか結びつけませんでした。
しかし、1つの値に対して複数、もしくは複数と複数が結びつくこともあります。
人で言うと、一夫一妻制だけではなく一夫多妻制、多夫多妻制に。あら、大変。混乱してきたけど、とりあえずそういうものがあると認識。
ブログの投稿やカテゴリとかがそう。
多対多による「中間テーブル」「関連テーブル」
互いが複数と結びついている時も、表の構造的に入れられる値は1つだけです。
じゃあ、両者の間に専用のテーブルをつくって、その関係を表現しちゃおうってのが中間テーブル、だと思う。
一対多とか、多対多とか、リレーションあたりから、フワッとした理解なので参考サイトを見てください。