SQLを使用すると、データベースに対して様々な命令を与えることができます。データ(レコード)を抽出したり、データを追加・変更・削除したり、データベースのオブジェクトを作成したり、オブジェクトの定義を変更したり、データベース自体の設定を変更することもできます。
データベースを扱うためにSQLを身につけることは、食事をするために箸の持ち方を身につけるのと同じくらい重要で必要なことになります。
そこで今回は、SQL文の基本であるデータを取得(抽出)する方法について紹介したいと思います。
目次
使用するサンプルテーブル
本記事では、データを取得するためのサンプルテーブルとして、以下のテーブルを使用します。
テーブル定義
テーブル名は「顧客」とします。顧客情報を管理する想定のテーブルになります。
テーブルの列には、主キー(プライマリーキー)となる「ID」、会社名や氏名などを管理するための「名前」、電話番号やメールアドレスなどの連絡先を管理するための「連絡先」の3つの列を作成します。
列名 | データ型 | 主キー |
---|---|---|
ID | int | ○ |
名前 | varchar(50) | |
連絡先 | varchar(100) |
テーブルを作成するCREATE文のSQL
サンプルとして使用する顧客テーブルを作成するSQLは次のようになります。
1 2 3 4 5 6 |
CREATE TABLE 顧客 ( ID int PRIMARY KEY NOT NULL, 名前 varchar(50) NOT NULL, 連絡先 varchar(100) NULL ); |
上記のSQLを実行するとテーブルが作成されます。
テーブルにレコードを挿入するINSERT文のSQL
1 2 3 4 5 6 7 8 |
INSERT INTO 顧客 (ID, 名前, 連絡先) VALUES (100, '顧客名1', '000-111-2222'), (200, '顧客名2', '111-222-3333'), (300, '顧客名3', '222-333-4444'), (400, '顧客名4', '333-444-5555'), (500, '顧客名5', '444-555-6666'); |
上記のSQLを実行するとテーブルにデータ(レコード)が挿入(登録)されます。
顧客テーブルへのデータのインサートは、複数のレコードを1回のSQLで一括挿入する形式で記述しています。
1回のINSERTで複数行のレコードをテーブルに一括で挿入する方法については、以下の記事を参照してください。
データ(レコード)を取得(抽出)するSELECT
テーブルに登録(格納)されているデータを取得するには、SELECTキーワードを使用します。
SELECTキーワードを使ったSELECT句(SELECTステートメント)では、取得する列を指定する方法と、すべての列を取得する方法の2種類があります。
取得する列を指定(選択)する
SELECT句に取得する列(必要な列)を記述することで、特定の列のデータのみ取得することができます。
特定の列のデータを取得するには、SELECTを記述した後に取得対象となる列の名前を続けて指定します。
1 |
SELECT 列名 |
取得対象となる列が複数ある場合は、列名をカンマで区切ります。
1 |
SELECT 列名1, 列名2, 列名3 |
取得する列が複数ある場合は、改行とインデントをつけることで、SQL文が見やすくなります。
1 2 3 4 |
SELECT 列名1, 列名2, 列名3 |
サンプルテーブルの顧客テーブルから、ID、名前、連絡先の3つの列を取得する場合は、以下のようなSELECT句になります。
1 2 3 4 |
SELECT ID, 名前, 連絡先 |
「SELECT」には「選択する」という意味がありますが、文字通り、何を取得するか選択するのがSELECT句になります。
取得する列の指定ができたら、次はどこから取得するかを指定します。
ID、名前、連絡先の列情報は、顧客テーブルから取得しますので、「どこから」にあたるのは、顧客テーブルになります。
「どこから」を指定するには、FROMキーワードを使用します。
FROMキーワードを使ったFROM句では、データの取得先(ここでは顧客テーブル)を
FROM句では、FROMと記述した後にテーブルなどのデータの取得先のオブジェクトの名前を指定します。
1 |
FROM テーブル名 |
「FROM」には「~から」という意味がありますが、これもSELECT同じで文字通り、取得する先を指定するのがFROM句になります。
FROM句もSELECT句と同様に、改行することで見やすくなります。
1 2 |
FROM テーブル名 |
顧客テーブルから取得するのであれば、以下のように記述します。
1 2 |
FROM 顧客 |
SELECT句とFROM句ができたら、この2つをつなげて1つのSQL文にします。
自然な日本語では「~から○○を」となりますが、SQLでは「○○を~から」の順番になります。
例えば英語で「私はテーブルからA列とB列を選択する。」は、「I select columns A and B from the table.」になりますが、これと同様の語順になります。
以下にSELECT句とFROM句をつなげて、1つのSQL文にする構文を示します。
FROM句はSELECT句の後に記述というルールがありますので、次のようになります。
1 2 3 4 5 6 |
SELECT 列名1, 列名2, 列名3 FROM テーブル名 |
上記の構文を顧客テーブルからID、名前、連絡先の3つの列を取得する場合にあてはめると、以下のようなSQLになります。
1 2 3 4 5 6 |
SELECT ID, 名前, 連絡先 FROM 顧客; |
すでに出てきた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」の順に取得するのであれば、以下のようになります。
1 2 3 4 5 6 |
SELECT 連絡先, 名前, ID FROM 顧客; |
上記の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、名前、連絡先)を取得対象としていましたが、例えば「名前」と「連絡先」のみ取得するのであれば、以下のように記述することになります。
1 2 3 4 5 |
SELECT 名前, 連絡先 FROM 顧客; |
上記の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 |
すべての列のデータを取得する
テーブルから特定の列を選択してデータを取得する方法はわかりましたので、次は列を選択せずに、すべての列を対象にする場合の記述について説明します。
列を選択して取得する場合は、以下のように記述しました
1 2 3 4 |
SELECT 列名1, 列名2, 列名3 |
これを、列を指定するのではなく、すべての列を取得するように変更するには、列を指定する記述の部分を「*(アスタリスク)」に変更します。
1 2 |
SELECT * |
アスタリスクの「*」にはワイルドカードとしての意味がありますが、「*」を指定することで、まさにワイルドカードのように「何でもあり」という結果になります。
列名を指定した場合と同様に、FROM句をつなげると以下のようになります。
1 2 3 4 |
SELECT * FROM テーブル名 |
これを顧客テーブルからデータを取得する場合にあてはめると、次のようになります。
1 2 3 4 |
SELECT * 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 |