PHPの学習中、SQLコマンドを頻繁に扱うようになったが、アウトプットしないと定着しない気がしたので書きます。
内容は某有名プログラミングスクールが提供しているページを参考にしました。
今回使用するテーブル構成

今回はゲームのユーザーデータを管理するテーブルgame_characterテーブルを作ったと仮定します。
カラムの数は「id」「name」「job」「level」の4つになります。
現在DBは合計5人のデータを管理しています。
SELECTの基本構文
SELECTとはデータベースから、データを取得する命令。
このSELECTを使用することで、データベースからデータを取得することが出来る。
SELECT [取得したい要素] FROM [使用テーブル];
[取得したい要素]はカラム名を指定し、[使用テーブル]はテーブル名を指定する。
SELECT構文① 特定の要素を取得する
まず全キャラクターの名前を取得してみる。
SELECT name FROM game_character;
基本構文の公式に当てはめてみると、nameは[取得したい要素]でgame_characterは[使用テーブル]に該当する。
実行結果
+--------------+
| name |
+--------------+
| ヤマダ |
| スズキ |
| タナカ |
| タカハシ |
| ワタナベ |
+--------------+
このように、game_characterテーブルからnameだけを全て表示してくれている。
SELECT構文② 「,」 で複数指定して要素を取得する
①ではnameカラムから全データを取得しました。
次にnameだけでなく、複数のカラムからデータを取得してみる。
SELECT name,level FROM game_character;
nameだけでなく「,」で区切り、levelも取得する。
実行結果
+--------------+-------+
| name | level |
+--------------+-------+
| ヤマダ | 30 |
| スズキ | 42 |
| タナカ | 25 |
| タカハシ | 60 |
| ワタナベ | 20 |
+--------------+-------+
SELECT構文③ 「*」 で全ての要素を取得する
取得したい要素の項目に*を入れることで、全ての要素を取得することが可能。
SELECT * FROM game_character
先ほどまではSELECTの後にカラム名を指定していましたが、[*]を付加する事で全てのデータを取得する。
実行結果
+------+--------------+--------------+-------+
| id | name | job | level |
+------+--------------+--------------+-------+
| 1 | ヤマダ | 勇者 | 30 |
| 2 | スズキ | 戦士 | 42 |
| 3 | タナカ | 戦士 | 25 |
| 4 | タカハシ | 魔法使い | 60 |
| 5 | ワタナベ | 僧侶 | 20 |
+------+--------------+--------------+-------+
これでgeme_characterテーブルから「id」「name」「job」「level」の全てのデータを取得が可能に。
WHEREの基本構文
次にWHEREを用いた条件設定を行ってみる。
例えばWHEREを使用する事で「level30以上のキャラクターだけ取得する」ことが可能になる。
SELECT [取得したい要素] FROM [使用テーブル] WHERE [条件文];
先ほどのSELECT構文の後ろに、「 WHERE [条件式] 」 が加わっただけです。
SELECT * FROM game_character WHERE 30 <= level;
例に挙げた、「level30以上のキャラクターだけ取得する」命令をしてみる。
実行結果
+------+--------------+--------------+-------+
| id | name | job | level |
+------+--------------+--------------+-------+
| 1 | ヤマダ | 勇者 | 30 |
| 2 | スズキ | 戦士 | 42 |
| 4 | タカハシ | 魔法使い | 60 |
+------+--------------+--------------+-------+
おさらいになりますが、[取得したい要素]に[*]で全てを指定。
[使用テーブル]に[game_character]を選択する。
WHEREの後に、[条件式]として[30 <= level]を指定する事で、level30以上のキャラクターを取得する結果に。
ORDER BYでデータを並び替える
データの並び替え(以下ソートと略)にはORDER BYを使用する。
SELECT [取得したい要素] FROM [使用テーブル] ORDER BY [ソートしたい要素] [昇順・降順の指定(省略時昇順)];
[昇順・降順の指定]部分は、asc(昇順)、desc(降順)のどちらかを指定する。
※ 省略した場合が昇順となります。
SELECT * FROM game_character ORDER BY level desc;
[ソートしたい要素]にlevelカラムを指定し、[昇順・降順の指定]にdescを指定する事で降順にソートする。
実行結果
+------+--------------+--------------+-------+
| id | name | job | level |
+------+--------------+--------------+-------+
| 4 | タカハシ | 魔法使い | 60 |
| 2 | スズキ | 戦士 | 42 |
| 1 | ヤマダ | 勇者 | 30 |
| 3 | タナカ | 戦士 | 25 |
| 5 | ワタナベ | 僧侶 | 20 |
+------+--------------+--------------+-------+
これでレベルの高い順(降順)で全データを表示する事が可能に。
GROUP BYでデータをグループ化する
グループ分けをしたい場合に使用するのがGROUP BY。
SELECT [取得したい要素] FROM [使用テーブル] GROUP BY [グループ化したい要素];
SELECT job, count( * ) FROM game_character GROUP BY job;
countは数を求める関数で、GROUP BYを使用する際は必要。
これでgame_characterテーブルのjobカラムから、数を求めグループ化する。
実行結果
+--------------+----------+
| job | count(*) |
+--------------+----------+
| 僧侶 | 1 |
| 勇者 | 1 |
| 戦士 | 2 |
| 魔法使い | 1 |
+--------------+----------+
jobカラムには「戦士」が2名いたので、1つのグループにまとめて人数をカウントしてくれている。
ASで出力時に名前をつける
表示時の各要素に名前をつけることも可能。
select [要素名] AS [要素につけたい名前] from [使用テーブル];
select name AS "名前" from game_character;
この場合だと、game_characterテーブルのnameカラムを名前として扱う事ができる。
実行結果
+--------------+
| 名前 |
+--------------+
| ヤマダ |
| スズキ |
| タナカ |
| タカハシ |
| ワタナベ |
+--------------+
通常であればカラム名はnameとして表示されるはずだが、名前として表示されている。
追加・更新・削除について
これまではDBのデータを検索して表示しているだけでした。
では、追加、更新、削除はどうするのか?
INSERTで新規追加
データの追加はINSERT文で行う。
INSERT INTO [データを追加したいテーブル名] (要素名A,要素名B) VALUES(要素Aに入れるデータ,要素Bに入れるデータ);
INSERT INTO game_character (id, name, job, level) VALUES(6,"カトウ","格闘家",15);
少し複雑になってきたので整理してみる。
構文はINSERT INTOから始まり、データを追加したいテーブル名(game_character)を指定する。
次に要素名(カラム)を複数指定し、VALUEで実際に入力するデータを指定。
実行結果
+------+--------------+--------------+-------+
| id | name | job | level |
+------+--------------+--------------+-------+
| 1 | ヤマダ | 勇者 | 30 |
| 2 | スズキ | 戦士 | 42 |
| 3 | タナカ | 戦士 | 25 |
| 4 | タカハシ | 魔法使い | 60 |
| 5 | ワタナベ | 僧侶 | 20 |
| 6 | カトウ | 格闘家 | 15 |
+------+--------------+--------------+-------+
「id」=6、「name」=カトウ、「job」=格闘家、「level」=15がデータとして入力されています。
UPDATEで更新
データの更新はUPDATE文で行う。
UPDATE [テーブル名] SET [更新処理] WHERE [条件式];
UPDATE game_character SET job="盗賊" WHERE name="タナカ";
UPDATEの際にはSETを使用する必要がある。
[更新処理]にはどの要素を何に更新するかを指定する。
最後に、WHEREでnameを指定する事で誰のデータを更新するかわかりやすくする。
実行結果
+------+--------------+--------------+-------+
| id | name | job | level |
+------+--------------+--------------+-------+
| 1 | ヤマダ | 勇者 | 30 |
| 2 | スズキ | 戦士 | 42 |
| 3 | タナカ | 盗賊 | 25 |
| 4 | タカハシ | 魔法使い | 60 |
| 5 | ワタナベ | 僧侶 | 20 |
| 6 | カトウ | 格闘家 | 15 |
+------+--------------+--------------+-------+
3行目のタナカのjobデータが「盗賊」に更新されている。
DELETEで更新
データの削除はDELETE文で行う
DELETE FROM [テーブル名] WHERE [条件];
DELETE FROM game_character WHERE level <= 20;
いつも通りテーブル名にgame_characterを指定し、WHEREの後に[条件]を指定する。
ここでは[条件]にlevel <= 20を指定する事で、levelが20以下という条件を付加する。
実行結果
+------+--------------+--------------+-------+
| id | name | job | level |
+------+--------------+--------------+-------+
| 1 | ヤマダ | 勇者 | 30 |
| 2 | スズキ | 戦士 | 42 |
| 3 | タナカ | 盗賊 | 25 |
| 4 | タカハシ | 魔法使い | 60 |
+------+--------------+--------------+-------+
一つ前のセッションで紹介したUPDATEの実行結果の際のテーブル構成を見比べる。
id=5、id=6のデータはlevelが20以下だった為、DELETEで削除された。
今回は以上。