SQL　SELECT文

以前[SQL コマンド　備忘録](https://qiita.com/hayashi-m/items/7fbfb7741b5c1fd66de4)で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|


```sql:基本例
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
```

```sql:条件指定
SELECT 列名 FROM テーブル名 WHERE 条件式;

--Shohinテーブルから条件「商品分類が文房具のものだけを出力」
SELECT shohin_mei, shohin_bunrui FROM Shohin WHERE shohin_bunrui = '文房具';

--実行結果
shohin_mei|shohin_bunrui
----------+------------
シャーペン   |文房具
ボールペン  |文房具
マーカーペン |文房具
```
```sql:重複を排除
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にくっつけてみます。

```sql:2つのテーブルを内部結合する
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句は全て＜テーブルの別名＞.＜列名＞の書式で書く。

## 参考文献
[SQL ゼロからはじめるデータベース操作　著／ミック](ttps://www.amazon.co.jp/dp/4798144452/ref=cm_sw_r_tw_dp_S6WAXXFP6F32QHVE01AN?_encoding=UTF8&psc=1)