【SQL】データを抽出するSELECT文の使い方を基礎から解説

  • 2024.11.20
       
【SQL】データを抽出するSELECT文の使い方を基礎から解説

データベース言語「SQL」のうち、データ操作言語(DML)には、以下の4種類の文があります。

INSERTデータテーブルにデータを追加する
SELECTデータテーブルの格納データを検索する
UPDATEデータテーブルの格納データを更新する
DELETEデータテーブルの格納データを削除する

本記事では、そのなかでもデータ検索に用いる「SELECT」文について基礎から解説します。基本中の基本ともいえるクエリで、利用機会も多いので、ぜひこの機会に覚えましょう!

基礎知識

SELECT文の説明に入る前に事前知識として本記事で用いる用語について紹介します。わかる人は読み飛ばしてください。

  • 表:「テーブル」
  • 列:「カラム」
  • 行:「レコード」
  • 値:「データ」

SELECT文とは

SELECT文は、データテーブルに格納してあるデータを取得する際に用いられるクエリ(命令)です。

プログラミングの基礎からサイト制作まで
↓実践力が身につくプログラミングスクール↓

ITエンジニアの学校 テックマニアスクール

≫モニター割引キャンペーン実施中!≪

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)
000180
0002100
000365
000475
000560
000690
000755

基本構文

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_idname
0001秋山
0002久保田
0003佐々木
0004佐藤
0005鈴木
0006田中
0007土屋

【用途3】全カラムのデータを抽出する

全カラムを指定する場合は、用途2の要領ですべてのカラム名を一つずつ指定する方法もありますが、「*(アスタリスク)」を指定することでも同じ意味になります。

【使用イメージ】

SELECT * FROM テーブル名;

「生徒」テーブルのすべてのカラムを抽出します。

【実行コード】

SELECT * FROM students;

【実行結果】

student_idnamegender
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_idname
0001秋山
0004佐藤
0006田中

◆WHERE句で使用可能な比較演算子

演算子意味
=等しい従業員番号 = 1000
>大きい従業員番号 > 1000
>=以上従業員番号 >= 1000
<小さい従業員番号 < 1000
<=以下従業員番号 <= 1000
!=等しくない従業員番号 != 1000

複数の条件を指定するには、「AND」や「OR」などの論理演算子を使用します。

◆WHERE句で使用可能な論理演算子など

演算子意味
AND左辺 かつ 右辺従業員番号 = 1000 AND 従業員番号 = 1001
OR左辺 または 右辺従業員番号 = 1000 OR 従業員番号 = 1001
BETWEEN A AND BA 以上 B 以下従業員番号 BETWEEN 1000 AND 2000
INいずれかを含む従業員番号 IN (1000, 2000)
LIKE文字列の1部を含むパターン

% = 0文字以上の任意の文字列
_ = 任意の1文字
名前 LIKE ‘A%’
名前 LIKE ‘A_’
IS NULLNULL値のフィールド名前 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_idnamegender
0002久保田F

1個目のANDはBETWEEN句に、2個目のANDは演算子として作用しています。AND演算子ですのでどちらの条件も満たす久保田さんだけが抽出されました。

【用途5】データを昇順または降順で表示する

データを昇順または降順に並べて表示します。ASCは昇順(小さいものから大きいものへ)、DESCは降順(大きいものから小さいものへ)です。

【使用イメージ】

SELECT カラム名 FROM テーブル名 ORDER BY 並び順の基準となるカラム名 ASCまたはDESC;

「テスト」テーブルの「点数」カラムを昇順で表示します。

【実行コード】

SELECT * FROM test ORDER BY point ASC;

【実行結果】

idpoint
000755
000560
000365
000475
000180
000690
0002100

【用途6】条件を満たすデータを昇順または降順で表示する

抽出条件を満たすデータを昇順または降順に並べて表示します。ASCは昇順(小さいものから大きいものへ)、DESCは降順(大きいものから小さいものへ)です。

【使用イメージ】

SELECT カラム名 FROM テーブル名 WHERE 条件を指定するカラム名 比較演算子 条件値 ORDER BY 並び順の基準となるカラム名 ASCまたはDESC;

「生徒」テーブルの「性別」カラムが「M」であるレコードを降順で表示します。

【実行コード】

SELECT * FROM students WHERE gender='M' ORDER BY id DESC;

【実行結果】

student_idnamegender
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」をつけ、その後ろに表示させたい名前をつけましょう。

【実行結果】

性別人数
M3
F4

集計関数の使い方など、詳しくは以下の記事で紹介しています。

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<='人数';

【実行結果】

性別人数
F4

【用途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_idnamegenderpoint
0001秋山M80
0002久保田F100
0003佐々木F65
0004佐藤M75
0005鈴木F60
0006田中M90
0007土屋F55

このほかにも組み合わせによって用途はさまざまですが、一旦代表的な使い方を一通り紹介しました。

クエリの記述順序と実行順序

【用途6】では「WHERE」句と「ORDER BY」句を併用しました。このように、データを抽出する際、クエリを併用して使うことは一般的です。しかし、記述順とコンピュータが処理を実行する順序は異なるので、実行順序を意識して記述する必要があります。

SQLの記述順序

  1. SELECT(抽出するカラムの指定)
  2. FROM(データを取得するテーブルの指定)
  3. JOIN(複数テーブルの結合)
  4. WHERE(絞り込み条件の指定)
  5. GROUP BY(グループ化)
  6. HAVING(グループ化後の絞り込み条件の指定)
  7. ORDER BY(ソート順の指定)
  8. LIMIT(抽出するレコード数の指定)

SQLの実行順序

  1. FROM(データを取得するテーブルの指定)
  2. JOIN(複数テーブルの結合)
  3. WHERE(絞り込み条件の指定)
  4. GROUP BY(グループ化)
  5. HAVING(グループ化後の絞り込み条件の指定)
  6. SELECT(抽出するカラムの指定)
  7. ORDER BY(ソート順の指定)
  8. 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関連記事

SQLの勉強方法は?

書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。

ただ、SQLに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。

プログラミングスクールならテックマニアがおすすめ!

ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。

<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~

このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。

     

Otherカテゴリの最新記事