SQLのSELECT文でデータ(レコード)を取得(抽出)する

SQLを使用すると、データベースに対して様々な命令を与えることができます。データ(レコード)を抽出したり、データを追加・変更・削除したり、データベースのオブジェクトを作成したり、オブジェクトの定義を変更したり、データベース自体の設定を変更することもできます。

データベースを扱うためにSQLを身につけることは、食事をするために箸の持ち方を身につけるのと同じくらい重要で必要なことになります。

そこで今回は、SQL文の基本であるデータを取得(抽出)する方法について紹介したいと思います。

使用するサンプルテーブル

本記事では、データを取得するためのサンプルテーブルとして、以下のテーブルを使用します。

テーブル定義

テーブル名は「顧客」とします。顧客情報を管理する想定のテーブルになります。

テーブルの列には、主キー(プライマリーキー)となる「ID」、会社名や氏名などを管理するための「名前」、電話番号やメールアドレスなどの連絡先を管理するための「連絡先」の3つの列を作成します。

列名 データ型 主キー
ID int
名前 varchar(50)
連絡先 varchar(100)

テーブルを作成するCREATE文のSQL

サンプルとして使用する顧客テーブルを作成するSQLは次のようになります。

上記のSQLを実行するとテーブルが作成されます。

テーブルにレコードを挿入するINSERT文のSQL

上記のSQLを実行するとテーブルにデータ(レコード)が挿入(登録)されます。

顧客テーブルへのデータのインサートは、複数のレコードを1回のSQLで一括挿入する形式で記述しています。
1回のINSERTで複数行のレコードをテーブルに一括で挿入する方法については、以下の記事を参照してください。

1回のINSERT(インサートSQL)で複数行のレコードを一括挿入(追加)する
SQLServerやMySQLなどのデータベースで、テーブルにレコードをINSERT文使用して追加するには、通常は以下のように記述します。 ...

データ(レコード)を取得(抽出)するSELECT

テーブルに登録(格納)されているデータを取得するには、SELECTキーワードを使用します。
SELECTキーワードを使ったSELECT句(SELECTステートメント)では、取得する列を指定する方法と、すべての列を取得する方法の2種類があります。

取得する列を指定(選択)する

SELECT句に取得する列(必要な列)を記述することで、特定の列のデータのみ取得することができます。
特定の列のデータを取得するには、SELECTを記述した後に取得対象となる列の名前を続けて指定します。

取得対象となる列が複数ある場合は、列名をカンマで区切ります。

取得する列が複数ある場合は、改行とインデントをつけることで、SQL文が見やすくなります。

サンプルテーブルの顧客テーブルから、ID、名前、連絡先の3つの列を取得する場合は、以下のようなSELECT句になります。

「SELECT」には「選択する」という意味がありますが、文字通り、何を取得するか選択するのがSELECT句になります。

取得する列の指定ができたら、次はどこから取得するかを指定します。

ID、名前、連絡先の列情報は、顧客テーブルから取得しますので、「どこから」にあたるのは、顧客テーブルになります。
「どこから」を指定するには、FROMキーワードを使用します。
FROMキーワードを使ったFROM句では、データの取得先(ここでは顧客テーブル)を

FROM句では、FROMと記述した後にテーブルなどのデータの取得先のオブジェクトの名前を指定します。

「FROM」には「~から」という意味がありますが、これもSELECT同じで文字通り、取得する先を指定するのがFROM句になります。

FROM句もSELECT句と同様に、改行することで見やすくなります。

顧客テーブルから取得するのであれば、以下のように記述します。

SELECT句とFROM句ができたら、この2つをつなげて1つのSQL文にします。

自然な日本語では「~から○○を」となりますが、SQLでは「○○を~から」の順番になります。
例えば英語で「私はテーブルからA列とB列を選択する。」は、「I select columns A and B from the table.」になりますが、これと同様の語順になります。

以下にSELECT句とFROM句をつなげて、1つのSQL文にする構文を示します。
FROM句はSELECT句の後に記述というルールがありますので、次のようになります。

上記の構文を顧客テーブルからID、名前、連絡先の3つの列を取得する場合にあてはめると、以下のようなSQLになります。

すでに出てきたSELECT句とFROM句をつなげるだけです。

上記のSQLを実行すると、以下のような結果表が取得できます。

No. ID 名前 連絡先
1 100 顧客名1 000-111-2222
2 200 顧客名2 111-222-3333
3 300 顧客名3 222-333-4444
4 400 顧客名4 333-444-5555
5 500 顧客名5 444-555-6666

SELECT句で指定した列は、指定した順に結果が返されます。
ですので、1列目が「名前」、2列目が「連絡先」、3列目が「ID」の順に取得するのであれば、以下のようになります。

上記のSQLを実行すると、以下のような結果表が取得できます。

No. 連絡先 名前 ID
1 000-111-2222 顧客名1 100
2 111-222-3333 顧客名2 200
3 222-333-4444 顧客名3 300
4 333-444-5555 顧客名4 400
5 444-555-6666 顧客名5 500

ここまでの例では、顧客テーブルのすべての列(ID、名前、連絡先)を取得対象としていましたが、例えば「名前」と「連絡先」のみ取得するのであれば、以下のように記述することになります。

上記のSQLを実行すると、以下のような結果表が取得できます。

No. 名前 連絡先
1 顧客名1 000-111-2222
2 顧客名2 111-222-3333
3 顧客名3 222-333-4444
4 顧客名4 333-444-5555
5 顧客名5 444-555-6666

すべての列のデータを取得する

テーブルから特定の列を選択してデータを取得する方法はわかりましたので、次は列を選択せずに、すべての列を対象にする場合の記述について説明します。

列を選択して取得する場合は、以下のように記述しました

これを、列を指定するのではなく、すべての列を取得するように変更するには、列を指定する記述の部分を「*(アスタリスク)」に変更します。

アスタリスクの「*」にはワイルドカードとしての意味がありますが、「*」を指定することで、まさにワイルドカードのように「何でもあり」という結果になります。

列名を指定した場合と同様に、FROM句をつなげると以下のようになります。

これを顧客テーブルからデータを取得する場合にあてはめると、次のようになります。

上記のSQLを実行すると、ID、名前、連絡先をSELECT句で指定したのと同じ結果が得られます。

No. ID 名前 連絡先
1 100 顧客名1 000-111-2222
2 200 顧客名2 111-222-3333
3 300 顧客名3 222-333-4444
4 400 顧客名4 333-444-5555
5 500 顧客名5 444-555-6666