【SQL】3分でSELECT文を完全マスター!データ取得の基礎から応用まで!

みなさんこんにちは!フリーランスプログラマーのsatoです。

私はもともとゲーム会社でオンラインゲームを作っていました。そんなゲーム制作においてもSQLそしてSELECT文は多用されていたんです。やはり膨大なデータを管理する時は、今やどんな業種でもデータベースに保存し管理する時代です。

そんな需要が高い「SQL」の【基本中の基本】、「SELECT文」について今回は見ていきましょう。

  • [基本]SELECT文とは
  • [基本]SELECT文の基本構文
  • [応用]「WHERE」で条件を絞ろう
  • [応用]「ORDER BY」でソートしよう
  • [応用]「GROUP BY」でグループわけ!
  • [応用]「調べるだけじゃ終わらない!追加・更新・削除について

まず基本構文を確認ののち、応用的な設定についてそれぞれ見ていくことにしましょう。そして現存の記事はややこしく堅苦しい説明が多いので、今回はゲーム制作者視点で楽しく説明していきますね。ぜひ楽しく勉強してみてください。

目次

SELECT文とは

SELECT文とは先ほども伝えた通り「データベースから、データを取得する命令」です。このSELECT文をしようすることで、データベースからデータを取得することが出来るわけですね!

ではそんなSELECT文を、どう使えばいいのか実際に見ていきましょう。

今回例として使用するテーブル

実際の使い方に入る前に、例題で使用するテーブルを見ておきましょう。今回はゲームのユーザーデータを管理するテーブルgame_characterテーブルを作ったします。

そしてこれを実際に扱うことにして話を進めましょうか。このテーブルには以下のような情報が入っていることにします。

画像:ゲームキャラクターテーブル(game_character)

「ヤマダ・スズキ・タナカ・タカハシ・ワタナベ」という5人のキャラクターが、テーブル内には存在していますね。このテーブルを使って次から説明を見ていきましょう。

SELECT文の基本構文

では早速本題に入っていきましょう。SELECT文の基本的な構文は以下になります。

SELECT [取得したい要素] FROM [使用テーブル];

欲しい情報と、どこから取ってくるかを指定すれば取ってくることが出来るわけですね!では早先ほどのテーブルで、SELECT文を実行してみましょう。

特定要素だけ表示する

まずこれらの全キャラクターの名前を取得してみましょう。基本的な構文は以下になります。

実行命令:

SELECT name FROM game_character;

結果:

+--------------+
| name         |
+--------------+
| ヤマダ       |
| スズキ       |
| タナカ       |
| タカハシ     |
| ワタナベ     |
+--------------+

「game_characterテーブル」から「name」だけを全て表示していますね!

「,」で複数指定!

「,」で区切ることで、複数の要素を取得可能です。次の例では「名前」と「レベル」のみを取得・表示しています。

実行命令:

SELECT name,level FROM game_character;

結果:

+--------------+-------+
| name         | level |
+--------------+-------+
| ヤマダ       |    30 |
| スズキ       |    42 |
| タナカ       |    25 |
| タカハシ     |    60 |
| ワタナベ     |    20 |
+--------------+-------+

* で全部指定

取得したい要素の項目に*を入れることで、全ての要素を取得することが可能です。

実行命令:

SELECT * FROM game_character

結果:

+------+--------------+--------------+-------+
| id   | name         | job          | level |
+------+--------------+--------------+-------+
|    1 | ヤマダ       | 勇者         |    30 |
|    2 | スズキ       | 戦士         |    42 |
|    3 | タナカ       | 戦士         |    25 |
|    4 | タカハシ     | 魔法使い     |    60 |
|    5 | ワタナベ     | 僧侶         |    20 |
+------+--------------+--------------+-------+

SELECTの基本構文(まとめ)

SELECT [取得したい要素] FROM [使用テーブル];

これだけです。この一文だけでデータを取ってくることが可能です。まずはこれを覚えておきましょう。

「WHERE」で条件を絞ろう

次にWHEREを用いた条件設定を行ってみましょう。これを行うことで、例えば「level30以上のキャラクターだけ取得する」なんてことも行えます。使い方は簡単で、先ほどのSELECT文の後ろWHERE [条件文]を追加するだけです。

SELECT [取得したい要素] FROM [使用テーブル] WHERE [条件文];

例えば先ほどあげた例「level30以上のキャラクターだけ取得したり」を実行してみましょう。

実行命令:

SELECT * FROM game_character WHERE 30 <= level;

結果:

+------+--------------+--------------+-------+
| id   | name         | job          | level |
+------+--------------+--------------+-------+
|    1 | ヤマダ       | 勇者         |    30 |
|    2 | スズキ       | 戦士         |    42 |
|    4 | タカハシ     | 魔法使い     |    60 |
+------+--------------+--------------+-------+

無事該当するレベル30以上のキャラクターのみ取得できていますね!

ORDER BYでソートしよう

ソートも簡単です!ソートにはORDER BYを使用しましょう。

SELECT [取得したい要素] FROM [使用テーブル] ORDER BY [ソートしたい要素] [昇順・降順の指定(省略時昇順)];

[昇順・降順の指定]部分へは、asc(昇順)、desc(降順)のどちらかを指定できます。
※ 省略した場合が昇順となります。

これも実例で見ることにしましょう。レベルの高い順(降順)で全データを表示する例が以下となります。

実行命令:

SELECT * FROM game_character ORDER BY 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;

結果:

+--------------+----------+
| job          | count(*) |
+--------------+----------+
| 僧侶         |        1 |
| 勇者         |        1 |
| 戦士         |        2 |
| 魔法使い     |        1 |
+--------------+----------+

「AS」で出力時に名前をつける!

表示時の各要素に名前をつけることも可能です。名前をつける場合は、要素の後ろに「AS」をつけて、その後ろに名前をつけましょう。

select [要素名] AS [要素につけたい名前] from [使用テーブル];

今回は単純に、名前の要素名を「name」から「名前」と表示されるようにしてみましょう。

実行命令:

select name AS "名前" from game_character;

結果:

+--------------+
| 名前         |
+--------------+
| ヤマダ       |
| スズキ       |
| タナカ       |
| タカハシ     |
| ワタナベ     |
+--------------+

先頭部分の「name」と表示されていた部分が、指定した「名前」という名称になりました!

調べるだけじゃ終わらない!追加・更新・削除について

ここまででSELECTについては詳しくなれたのではないかと思います。

しかし「データを取得すること」だけがSQLの出来ることではありません。データの更新処理もSQLの重要な機能です。データの追加・更新・削除も少しだけ学んでみましょう。

INSERT文で新規追加!

データの追加はINSERT文で行います。

INSERT INTO [データを追加したいテーブル名] (要素名A,要素名B) VALUES(要素Aに入れるデータ,要素Bに入れるデータ);

例えば今回キャラクターを増やすためにINSERTを行うなら、以下のようになるでしょう。

実行命令:

INSERT INTO game_character (id, name, job, level) VALUES(6,"カトウ","格闘家",15);

成功したらキャラクターが追加されているはずです。SELECT文で確認してみましょう。

実行命令:

SELECT * FROM game_character

結果:

+------+--------------+--------------+-------+
| id   | name         | job          | level |
+------+--------------+--------------+-------+
|    1 | ヤマダ       | 勇者         |    30 |
|    2 | スズキ       | 戦士         |    42 |
|    3 | タナカ       | 戦士         |    25 |
|    4 | タカハシ     | 魔法使い     |    60 |
|    5 | ワタナベ     | 僧侶         |    20 |
|    6 | カトウ       | 格闘家       |    15 |
+------+--------------+--------------+-------+

確かに追加されているようですね!データの追加はINSERT文。覚えておきましょう!

UPDATE文で変更!

データの更新はUPDATE文で行います。例えばタナカが、盗賊にジョブチェンジすることになったら、以下のようなコマンドになるでしょう。

UPDATE game_character SET job="盗賊" WHERE name="タナカ";

UPDATE文はいろいろなことができるため、別リンクで詳細を説明します。

[後日追記予定です。]

DELETE文で削除!

データの削除はDELETE文で行います。例えばレベル20以下のキャラクターを削除すると言ったことをする例は以下となります。

DELETE FROM game_character WHERE level <= 20;

こちらも汎用性が高いコマンドですので、別リンクで詳細を説明していきます。

まとめ

いかがでしたでしょうか。SQLで出来ることのイメージが、なんとなく固まったなら幸いです。また、その中でもSELECT文は非常に需要の高い命令です。

おそらく一番多用するのは、条件文をつけた以下の形式でしょう。

SELECT [取得したい要素] FROM [使用テーブル] WHERE [条件文];

これは必ず覚えておきましょう!

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次