2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【基礎編】SQLコマンド自己学習

Last updated at Posted at 2020-11-20

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

##今回使用するテーブル構成
image.png
今回はゲームのユーザーデータを管理するテーブル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を使用する必要がある。
[更新処理]にはどの要素を何に更新するかを指定する。
最後に、WHEREnameを指定する事で誰のデータを更新するかわかりやすくする。

実行結果
+------+--------------+--------------+-------+
| 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=5id=6のデータはlevelが20以下だった為、DELETEで削除された。

今回は以上。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?