以前SQL コマンド 備忘録でSQLについて軽く投稿しました。
今回はSELECT文について少し掘り下げます。
用意したデータ1(Shohin Table)
商品ID(shohin_id) | 商品名(shohin_mei) | 商品分類(shohin_bunrui) | 販売単価(hanbai_tanka) | 仕入れ単価(shiire_tanka) | 登録日(torokubi) |
---|---|---|---|---|---|
0001 | トレーナー | 衣類 | 2000 | 1000 | 2021-01-20 |
0002 | シャーペン | 文房具 | 200 | 100 | 2021-03-20 |
0003 | Yシャツ | 衣類 | 1500 | 800 | 2021-03-23 |
0004 | 眼鏡 | 装飾品 | 5000 | 2500 | 2021-05-04 |
0005 | ボールペン | 文房具 | 500 | 250 | 2021-05-06 |
0006 | マグカップ | 食器 | 1500 | 700 | 2021-04-05 |
0007 | お皿 | 食器 | 400 | 250 | 2021-07-31 |
0008 | マーカーペン | 文房具 | 150 | 100 | 2021-05-28 |
0009 | ネックレス | 装飾品 | 8000 | 6000 | 2021-06-20 |
用意したデータ2(TenpoShohin Table)
店舗ID(tenpo_id) | 店舗名(tenpo_mei) | 商品ID(shohin_id) | 数量(suryo) |
---|---|---|---|
000A | 東京 | 0001 | 20 |
000A | 東京 | 0002 | 15 |
000B | 名古屋 | 0003 | 60 |
000B | 名古屋 | 0006 | 50 |
000B | 名古屋 | 0009 | 90 |
000C | 大阪 | 0002 | 100 |
000C | 大阪 | 0005 | 40 |
000C | 大阪 | 0007 | 30 |
000D | 福岡 | 0004 | 80 |
000D | 福岡 | 0008 | 120 |
SELECT 列名[表示用列名] FROM テーブル名; --テーブルから列を抜き出す。表示用の列名は省略可能
SELECT * FROM テーブル名; --テーブルから全て選んで表示する
--Shohinテーブルから商品ID、商品名、仕入れ単価を出力
SELECT shohin_id, shohin_mei, shiire_tanka FROM Shohin;
--実行結果
shohin_id|shohin_mei|shiire_tanka
---------+----------+------------
0001 |トレーナー | 1000
0002 |シャーペン | 100
0003 |Yシャツ | 800
0004 |眼鏡 | 2500
0005 |ボールペン | 250
0006 |マグカップ | 700
0007 |お皿 | 250
0008 |マーカーペン | 100
0009 |ネックレス | 6000
SELECT 列名 FROM テーブル名 WHERE 条件式;
--Shohinテーブルから条件「商品分類が文房具のものだけを出力」
SELECT shohin_mei, shohin_bunrui FROM Shohin WHERE shohin_bunrui = '文房具';
--実行結果
shohin_mei|shohin_bunrui
----------+------------
シャーペン |文房具
ボールペン |文房具
マーカーペン |文房具
SELECT DISTINCT 列名 FROM テーブル名;
--Shohinテーブルからshohin_bunrui列の重複を排除して出力
shohin_bunrui
-------------
衣類
文房具
装飾品
食器
ここまでは基本的なSELECT文の使い方ですが、2つの(複数の)テーブルからデータを取得したい場合もあります。
結合
結合とは別のテーブルから列を持ってきて「列を増やす」操作です。
この操作が役立つのは欲しいデータ(列)が1つのテーブルだけからでは選択できない場合。
データ1「Shohin」とデータ2「TenpoShohin」を結合してみたいと思います。
内部結合(INNER JOIN)
TenpoShohinからは東京店(000A)が商品ID「0001」「0002」を取り扱っていることがわかるが、これらの商品名や販売単価はTenpoShohinテーブルからはわからない。これらはShohinテーブルにしか存在していない列です。
ここでShohinテーブルから商品名(shohin_mei)、販売単価(hanbai_tanka)の列をTenpoShohinにくっつけてみます。
SELECT TS.tenpo.id, TS.tenpo_mei, TS.shohin_mei, S.shohin_mei, S.hanbai_tanka
FROM TenpoShohin AS TS INNER JOIN Shohin AS S
ON TS.shohin_id = S.shohin_id;
--実行結果
tenpo_id|tenpo_mei|shohin_id|shohin_mei|hanbai_tanka
000A |東京 |0001 |トレーナー | 2000
000A |東京 |0002 |シャーペン | 200
000B |名古屋 |0003 |Yシャツ | 1500
000B |名古屋 |0006 |マグカップ | 1500
000B |名古屋 |0009 |ネックレス | 8000
000C |大阪 |0002 |シャーペン | 200
000C |大阪 |0005 |ボールペン | 500
000C |大阪 |0007 |お皿 | 400
000D |福岡 |0004 |眼鏡 | 2500
000D |福岡 |0008 |マーカーペン | 150
FROM句
FROM TenpoShohin AS TS INNER JOIN Shohin AS S
結合を行うときはFROM句に複数のテーブルを記述する。
TS,Sはテーブルの別名です。オリジナルのテーブル名のままでも使えるが、テーブル名が長くなるとSQL文が読みにくくなるため、別名をつけることが一般的です。
ON句
ON TS.shohin_id = S.shohin_id
2つのテーブルを結びつける列(結合キー)を指定する。
今回の例でいうと商品ID(shohin_id)。
内部結合を行う場合は記述が必須(ないとエラーになる)。
SELECT句
SELECT TS.tenpo.id, TS.tenpo_mei, TS.shohin_mei, S.shohin_mei, S.hanbai_tanka
結合をつかった場合のSELECT句は全て<テーブルの別名>.<列名>の書式で書く。