イチから学ぶデータベース・SQL(2)

イチから学ぶデータベース・SQL(1)ではデータベースについて、から始まりデータベースの作成や、データベースにデータを追加したりデータを検索したりと、基本的なデータベースとSQL文について学びました。

それらを糧に今回はより深くSQLについて学習し、それを分かりやすいように説明していきます。

1. 前回の振り返りと今回学習する内容

前回ではphpMyAdminというツールを使用し、データベースの作成、ユーザーテーブルと職業テーブルを作成し、作成したテーブルにそれぞれユーザーと職業を追加しました。

そして新たにやまぎしというユーザーを追加しました。

完成したデータベースがこちらです。


ユーザー一覧(usersテーブル)


職業一覧(jobsテーブル)


ユーザー一覧は、4人分新たにユーザーを追加し、合計9人分のデータになりました。

今回は、前回作成したデータベースを基に、データの更新や削除、結合など前回よりも複雑なSQL文を扱えるように学習していきたいと思います。

2. データベースに登録してあるデータを更新してみる

データを更新する前に、復習を兼ねてまずは、usersテーブルにユーザーのデータを更に追加してみます。

データを追加するには、以下のSQL文を実行します。


INSERT INTO users(id,name,level,job_id) VALUES(7,"こばやし",10,3);


これでこばやしという名前の7人目のユーザーが追加されました。

一度に複数人追加することも可能で、VALUESの後に追加したい人数分記入するとその分追加することも可能です。

今回は11人目までユーザーを追加していきたいと思います。


INSERT INTO users(id,name,level,job_id)VALUES(8,"なかばやし",12,3),(9,"おおばやし",50,2),(10,"おおくぼ",1,0),(11,"あさがお",5,4);


これらのSQL文を実行し、このようにデータベースにユーザーが追加されました。


データの追加ができたので、続いてはユーザーの情報を更新していきます。


ここでは、jobsテーブルにあるウォーリアのステータス情報を更新します。

データを更新するためには、以下のSQL文を実行します。


UPDATE jobs SET intelligence = 3 WHERE id = 2;


UPDATEで何のデータを更新するかを指定し、値を入力します。

今回の場合だとjobsテーブルのintelligenceを3に更新するということになります。

WHEREでテーブルを指定し、更新するカラム名を指定します。

今回の場合だとidが2、つまりウォーリアのカラムを指定しました。


このSQL文を実行し、画像のようになりました。


ウォーリアのカラムのintelligenceが、1から3に更新されました。

また、変更後の値を直接入力して更新するのではなく、+1、-1させるなどといったことも可能です。

では、この方法でjobsテーブルのウォーリアのdexterityを更新してみます。


UPDATE jobs SET dexterity = dexterity - 2 WHERE id = 2;


このSQL文を実行すると、


このようにウォーリアのdexterityが-2されました。

3. 登録されているデータを削除してみる

続いては、データベースに登録されているデータを削除します。

今回は、こちらの画像のusersテーブルのデータを削除していきます。


データベースに登録されているデータの削除を行うためには、以下のSQL文を実行します。


DELETE FROM users WHERE id = 12;


DELETEに続いてテーブルを指定し、削除するカラムを指定します。

今回は、usersテーブルのidが12のユーザー、なすが削除されることになります。

また、今回はテーブルの中のデータが対象となりましたが、


DELETE FROM (テーブル名);


とすることで、テーブル自体を削除することも可能です。

次は、別の絞り込みをして、複数人のデータを削除してみます。

使うSQL文は次のようになります。


DELETE FROM users WHERE level >= 50;


このSQL文を実行すると、


レベルが50以上のユーザーが全て削除されました。

このように、DELETE文でもSELECT文などと同じようにWHEREで様々な演算子で対象を絞り込むことが可能です。

4. 2つのテーブルを結合してみる

では、次に作成したusersテーブルとjobsテーブルを結合します。

ユーザー一覧であるusersテーブルのjob_idのカラムと職業一覧であるjobsテーブルのidのカラムを関連付けて結合していきます。


その前に、関連付けと結合ついて具体的に説明していきます。

usersテーブルにいる名前がひろしとおおばやしのユーザーは、job_idが2となっています。

主キーによってusersテーブルのjob_idとjobsテーブルのidは関連付けられているため、ひろしとおおばやしの職業はウォーリアだということがわかります。

他のユーザーにも同じことが言えて、たかなしのjob_idは5であるため、たかなしの職業はウィザードだということがわかります。


このように、主キーによってテーブル同士が関連付けられているため、一目でこのユーザーはこの職業だとわかることができます。

そして、結合には内部結合と外部結合があります。

内部結合(INNER JOIN)は結合する両方のテーブルに共通するデータを表示します。


外部結合には左結合(LEFT JOIN)、右結合(RIGHT JOIN)、完全外部結合(FULL JOIN)の3種類があります。

左結合は左側のテーブル+一致するデータのカラムを表示、 右結合は右側のテーブル+一致するデータのカラムを表示します。

完全外部結合は両方のテーブルのどちらも優先して表示し、指定した条件で一致するデータは一致させて表示させつつ、一致しないデータも表示します。


では、usersテーブルとjobsテーブル、二つのテーブルを結合して一つの表として表示してみます。

まずは内部結合での結合をします。

内部結合するには、以下のSQL文を実行します。


SELECT * FROM users INNER JOIN jobs ON jobs.id = users.job_id;


INNER JOINというSQLを使用すると、テーブルを結合することができます。

これは、テーブルとテーブルのお互いの条件に一致するデータを抽出し、結合できるSQL構文となっています。


このSQL文の場合だと、

usersテーブルにjobsテーブルをjobs.id(jobsテーブルのid)とusersテーブルのjob_idを関連付けて結合する。

という意味のSQL文になります。

このSQLを実行すると、以下の画像のようになります。


このように、usersテーブルとjobsテーブルの共通のデータのみが結合され、表示されます。

また、ユーザー数は9人でしたが表示されたユーザー数は8人で、おおくぼのデータがありません。

これは、おおくぼの行のjob_idが0(空っぽ)であるためです。

job_idが空だとjobsテーブル側で対応できるデータが無いため、結合した時にそのデータが表示されなくなります。


このことから、INNER JOINでは、両方のテーブルに一致するデータだけが結合されるという