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
で削除された。
今回は以上。