データベース言語「SQL」のうち、データ操作言語(DML)には、以下の4種類の文があります。
INSERT | データテーブルにデータを追加する |
SELECT | データテーブルの格納データを検索する |
UPDATE | データテーブルの格納データを更新する |
DELETE | データテーブルの格納データを削除する |
本記事では、そのなかでもデータ検索に用いる「SELECT」文について基礎から解説します。基本中の基本ともいえるクエリで、利用機会も多いので、ぜひこの機会に覚えましょう!
基礎知識
SELECT文の説明に入る前に事前知識として本記事で用いる用語について紹介します。わかる人は読み飛ばしてください。
- 表:「テーブル」
- 列:「カラム」
- 行:「レコード」
- 値:「データ」
SELECT文とは
SELECT文は、データテーブルに格納してあるデータを取得する際に用いられるクエリ(命令)です。
SELECT文の使い方
ここからはサンプルコードを用いてSELECT文の使い方を解説します。
説明には以下のサンプルテーブルを使用します。
【サンプルテーブル】
「生徒(students)」テーブル
生徒ID(student_id) | 氏名(name) | 性別(gender) |
0001 | 秋山 | M |
0002 | 久保田 | F |
0003 | 佐々木 | F |
0004 | 佐藤 | M |
0005 | 鈴木 | F |
0006 | 田中 | M |
0007 | 土屋 | F |
「テスト(test)」テーブル
ID(id) | 点数(point) |
0001 | 80 |
0002 | 100 |
0003 | 65 |
0004 | 75 |
0005 | 60 |
0006 | 90 |
0007 | 55 |
基本構文
SELECT句は基本的に次のように記述します。
【使用イメージ】
SELECT カラム名1,カラム名2,カラム名3,…… FROM テーブル名;
取得したいデータが格納されている「テーブル名」と取得したい「カラム名」を指定します。
複数のカラムを取得したい場合はカラム名同士を「,(カンマ)」でつなぎます。
全てのカラムを取得する場合は全てのカラム名を記述するのではなく、「*(アスタリスク)」を記述します。
この基本構文を次のようなクエリと併用することでさまざまなデータ抽出ができます。
- JOIN(複数テーブルの結合)
- WHERE(絞り込み条件の指定)
- HAVING(グループ化後の絞り込み条件の指定)
- GROUP BY(グループ化)
- ORDER BY(ソート順の指定)
- LIMIT(抽出するレコード数の指定)
ここからは用途ごとに使い方を紹介します。
【用途1】特定のカラムのデータを抽出する
こちらは基本構文のままです。
【使用イメージ】
SELECT カラム名 FROM テーブル名;
「生徒」テーブルの「氏名」カラムを抽出します。
【実行コード】
SELECT name FROM students;
【実行結果】
name |
秋山 |
久保田 |
佐々木 |
佐藤 |
鈴木 |
田中 |
土屋 |
【用途2】複数のカラムのデータを抽出する
複数のカラムを指定する場合は、カラム名の間を「,(カンマ)」で区切ります。
【使用イメージ】
SELECT カラム名1,カラム名2,カラム名3,…… FROM テーブル名;
「生徒」テーブルの「生徒ID」カラムと「氏名」カラムを抽出します。
【実行コード】
SELECT student_id,name FROM students;
【実行結果】
student_id | name |
0001 | 秋山 |
0002 | 久保田 |
0003 | 佐々木 |
0004 | 佐藤 |
0005 | 鈴木 |
0006 | 田中 |
0007 | 土屋 |
【用途3】全カラムのデータを抽出する
全カラムを指定する場合は、用途2の要領ですべてのカラム名を一つずつ指定する方法もありますが、「*(アスタリスク)」を指定することでも同じ意味になります。
【使用イメージ】
SELECT * FROM テーブル名;
「生徒」テーブルのすべてのカラムを抽出します。
【実行コード】
SELECT * FROM students;
【実行結果】
student_id | name | gender |
0001 | 秋山 | M |
0002 | 久保田 | F |
0003 | 佐々木 | F |
0004 | 佐藤 | M |
0005 | 鈴木 | F |
0006 | 田中 | M |
0007 | 土屋 | F |
SELECT * FROM の形式でテーブル全体を読み込むと、大きなデータベースになればなるほどクエリの処理速度や負荷が大きくなる可能性があります※。どうしても全テーブルを参照したい場合を除き、できるだけ必要最小限のデータだけを読み込むようなクエリの記述を心がけましょう。
※実際のパフォーマンスは使用するRDBMSの処理系の実装によって変動します。
【用途4】条件を満たすデータのみ抽出する
抽出条件を指定し、それを満たすデータのみを抽出します。
【使用イメージ】
SELECT カラム名 FROM テーブル名 WHERE 条件を指定するカラム名 比較演算子 条件値;
「生徒」テーブルの「性別」カラムが「M」であるレコードを抽出します。
【実行コード】
SELECT student_id,name FROM students WHERE gender='M';
条件値が文字の場合は、その文字を「’(シングルクォーテーション)」で囲みます。数字の場合は不要です。
【実行結果】
student_id | name |
0001 | 秋山 |
0004 | 佐藤 |
0006 | 田中 |
◆WHERE句で使用可能な比較演算子
演算子 | 意味 | 例 |
= | 等しい | 従業員番号 = 1000 |
> | 大きい | 従業員番号 > 1000 |
>= | 以上 | 従業員番号 >= 1000 |
< | 小さい | 従業員番号 < 1000 |
<= | 以下 | 従業員番号 <= 1000 |
!= | 等しくない | 従業員番号 != 1000 |
複数の条件を指定するには、「AND」や「OR」などの論理演算子を使用します。
◆WHERE句で使用可能な論理演算子など
演算子 | 意味 | 例 |
AND | 左辺 かつ 右辺 | 従業員番号 = 1000 AND 従業員番号 = 1001 |
OR | 左辺 または 右辺 | 従業員番号 = 1000 OR 従業員番号 = 1001 |
BETWEEN A AND B | A 以上 B 以下 | 従業員番号 BETWEEN 1000 AND 2000 |
IN | いずれかを含む | 従業員番号 IN (1000, 2000) |
LIKE | 文字列の1部を含むパターン ※ % = 0文字以上の任意の文字列 _ = 任意の1文字 | 名前 LIKE ‘A%’ 名前 LIKE ‘A_’ |
IS NULL | NULL値のフィールド | 名前 IS NULL |
IS NOT NULL | 値のあるフィールド | 名前 IS NOT NULL |
各演算子の使い方など、詳しくは以下の記事で紹介しています。
【SQL入門】WHEREで検索条件を指定する方法を解説
【SQL】データの曖昧検索「LIKE句」の使い方!完全一致・部分一致・否定形も解説
【番外編】論理演算子を複数使って、複雑な検索をしたいと思います。
生徒IDが0001~0003であり、かつ氏名に「田」がつく生徒を表示します。
【実行コード】
SELECT * FROM students WHERE student_id BETWEEN 0001 AND 0003 AND name LIKE '%田%';
【実行結果】
student_id | name | gender |
0002 | 久保田 | F |
1個目のANDはBETWEEN句に、2個目のANDは演算子として作用しています。AND演算子ですのでどちらの条件も満たす久保田さんだけが抽出されました。
【用途5】データを昇順または降順で表示する
データを昇順または降順に並べて表示します。ASCは昇順(小さいものから大きいものへ)、DESCは降順(大きいものから小さいものへ)です。
【使用イメージ】
SELECT カラム名 FROM テーブル名 ORDER BY 並び順の基準となるカラム名 ASCまたはDESC;
「テスト」テーブルの「点数」カラムを昇順で表示します。
【実行コード】
SELECT * FROM test ORDER BY point ASC;
【実行結果】
id | point |
0007 | 55 |
0005 | 60 |
0003 | 65 |
0004 | 75 |
0001 | 80 |
0006 | 90 |
0002 | 100 |
【用途6】条件を満たすデータを昇順または降順で表示する
抽出条件を満たすデータを昇順または降順に並べて表示します。ASCは昇順(小さいものから大きいものへ)、DESCは降順(大きいものから小さいものへ)です。
【使用イメージ】
SELECT カラム名 FROM テーブル名 WHERE 条件を指定するカラム名 比較演算子 条件値 ORDER BY 並び順の基準となるカラム名 ASCまたはDESC;
「生徒」テーブルの「性別」カラムが「M」であるレコードを降順で表示します。
【実行コード】
SELECT * FROM students WHERE gender='M' ORDER BY id DESC;
【実行結果】
student_id | name | gender |
0006 | 田中 | M |
0004 | 佐藤 | M |
0001 | 秋山 | M |
【用途7】グループごとのレコード数を取得する
任意のカラムの値に基づいてレコードをグループ化し、グループごとのレコード数を取得します。集計関数(SUMやCOUNTなど)と併用することでグループごとの合計値やレコード数を求めることができます。
【使用イメージ】
SELECT カラム名 FROM テーブル名 GROUP BY グループ化を行うカラム名;
「カラム名」と「グループ化を行うカラム名」を統一する必要があります。
「生徒」テーブルの「性別」カラムで男女別の人数を求めます。
【実行コード】
SELECT gender AS '性別', COUNT(gender) AS '人数' FROM test GROUP BY gender;
「AS」で結果を表示する際のカラム名を変更できます。カラム名の後ろに「AS」をつけ、その後ろに表示させたい名前をつけましょう。
【実行結果】
性別 | 人数 |
M | 3 |
F | 4 |
集計関数の使い方など、詳しくは以下の記事で紹介しています。
SQLのCOUNTで数を数える!基礎から応用まで詳しく解説
【用途8】グループ化後に条件を指定する
「WHERE」句がGROUP BY句の実行前に条件が適応されるのに対し、「HAVING」句はGROUP BY句の実行後に条件が適応されます。
グループ化の前に任意の条件を満たさないレコードを省く場合は「WHERE」句を使い、グループ化後に任意の条件を満たさないグループを省く場合に「HAVING」句を使います。
詳しくは以下の記事で解説しています。
【SQL】GROUP BY句の使い方をサンプルコードで解説
【使用イメージ】
SELECT カラム名 FROM テーブル名 GROUP BY グループ化を行うカラム名 HAVING 条件式;
「生徒」テーブルの男女別になったグループのうち、4人以上のグループのみを表示します。
【実行コード】
SELECT gender AS '性別', COUNT(gender) AS '人数' FROM test GROUP BY gender HAVING 4<='人数';
【実行結果】
性別 | 人数 |
F | 4 |
【用途9】テーブル同士を紐づける
JOIN句でテーブル同士の紐づけを行います。
【使用イメージ】
SELECT カラム名 FROM テーブル名1 JOIN テーブル名2 ON 結合条件;
「生徒」テーブルの「生徒ID」カラムを主キー、「テスト」テーブルの「ID」カラムを外部キーとして2つのテーブルを紐づけます。
【実行コード】
SELECT * FROM students LEFT OUTER JOIN test ON students.student_id=test.id;
「.」でテーブルとカラムを指定できます。
【実行結果】
student_id | name | gender | point |
0001 | 秋山 | M | 80 |
0002 | 久保田 | F | 100 |
0003 | 佐々木 | F | 65 |
0004 | 佐藤 | M | 75 |
0005 | 鈴木 | F | 60 |
0006 | 田中 | M | 90 |
0007 | 土屋 | F | 55 |
このほかにも組み合わせによって用途はさまざまですが、一旦代表的な使い方を一通り紹介しました。
クエリの記述順序と実行順序
【用途6】では「WHERE」句と「ORDER BY」句を併用しました。このように、データを抽出する際、クエリを併用して使うことは一般的です。しかし、記述順とコンピュータが処理を実行する順序は異なるので、実行順序を意識して記述する必要があります。
SQLの記述順序
- SELECT(抽出するカラムの指定)
- FROM(データを取得するテーブルの指定)
- JOIN(複数テーブルの結合)
- WHERE(絞り込み条件の指定)
- GROUP BY(グループ化)
- HAVING(グループ化後の絞り込み条件の指定)
- ORDER BY(ソート順の指定)
- LIMIT(抽出するレコード数の指定)
SQLの実行順序
- FROM(データを取得するテーブルの指定)
- JOIN(複数テーブルの結合)
- WHERE(絞り込み条件の指定)
- GROUP BY(グループ化)
- HAVING(グループ化後の絞り込み条件の指定)
- SELECT(抽出するカラムの指定)
- ORDER BY(ソート順の指定)
- LIMIT(抽出するレコード数の指定)
ほかのDML(データの追加・更新・削除)
SELECTと同様に、データベースを操作する上でよく使う処理がデータの追加や更新、削除です。別記事で詳しく紹介していますが、簡単に紹介します。
データの追加「INSERT文」
データの追加にはINSERT文を用います。
【使用イメージ】
INSERT INTO データを追加するテーブル名 (カラム名1,カラム名2,……) VALUES(カラム1に入れる値,カラム2に入れる値,……);
「生徒」テーブルに一人の生徒を追加します。
【実行コード】
INSERT INTO students (student_id,name,gender) VALUES(0008,'中村','M');
SELECT文で「生徒」テーブルを確認します。
【実行結果】
生徒ID(student_id) | 氏名(name) | 性別(gender) |
0001 | 秋山 | M |
0002 | 久保田 | F |
0003 | 佐々木 | F |
0004 | 佐藤 | M |
0005 | 鈴木 | F |
0006 | 田中 | M |
0007 | 土屋 | F |
0008 | 中村 | M |
「中村」という生徒が追加されました。
▼INSERT文の詳しい使い方はこちら
データの更新「UPDATE文」
データの更新にはUPDATE文を用います。
【使用イメージ】
UPDATE テーブル名
SET カラム名 = 値 WHERE 条件式;
「生徒」テーブルの中村さんの生徒IDを変更します。
【実行コード】
UPDATE students SET student_id WHERE name='中村';
SELECT文で「生徒」テーブルを確認します。
【実行結果】
生徒ID(student_id) | 氏名(name) | 性別(gender) |
0001 | 秋山 | M |
0002 | 久保田 | F |
0003 | 佐々木 | F |
0004 | 佐藤 | M |
0005 | 鈴木 | F |
0006 | 田中 | M |
0007 | 土屋 | F |
0009 | 中村 | M |
中村さんの生徒IDが更新されました。
▼UPDATE文の詳しい使い方はこちら
データの削除「DELETE文」
データの削除にはDELETE文を用います。
【使用イメージ】
DELETE FROM テーブル名 WHERE 条件式;
「生徒」テーブルの中村さんのデータを削除します。
【実行コード】
DELETE FROM students WHERE name='中村';
SELECT文で「生徒」テーブルを確認します。
【実行結果】
生徒ID(student_id) | 氏名(name) | 性別(gender) |
0001 | 秋山 | M |
0002 | 久保田 | F |
0003 | 佐々木 | F |
0004 | 佐藤 | M |
0005 | 鈴木 | F |
0006 | 田中 | M |
0007 | 土屋 | F |
中村さんのデータが削除されました。
▼DELETE文の詳しい使い方はこちら
SQL関連記事
- RDBを操作するデータベース言語「SQL」とは?
- RDB以外のデータベース管理システム「NoSQL」とは?
- RDB管理システム「MySQL」とは?
- RDB管理システム「PostgreSQL」とは?
- RDB管理システム「SQL Server」とは?
- RDB管理システム「SQLite」とは?
- ブラウザ上でMySQLを管理できる「phpMyAdmin」とは?
- データを追加する「INSERT」文
- データを削除する「DELETE」文
- データを更新する「UPDATE」文
- 抽出条件を指定する「WHERE」句
- 抽出条件を指定する「HAVING」句
- 複数の抽出条件をまとめる「IN」句
- 重複レコードを除外する「DISTINCT」
- 抽出範囲を指定する「BETWEEN」演算子
- 抽出条件を満たすレコードの存在の有無を調べる「EXISTS」句
- レコード件数を取得する集計関数「COUNT」関数
- レコードをグループ化する「GROUP BY」句
- 抽出結果を並び替える「ORDER BY」句
- テーブル間のデータを結合する「JOIN」句
- 抽出結果を統合して表示する「UNION」句
- データの曖昧検索「LIKE」句
- 条件分岐処理「CASE」式
SQLの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、SQLに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!
ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。