【SQL初級】SELECT文とCREATE文について（基本まとめ）


##はじめに

インターネット検索やSNS、また物流や金融機関といった情報システムの多くのは「**データベース**」を使用しています。

この記事ではデータベースの表を定義したり、データを操作したりするときに最も多く使用されてる「**SQL（Structured Query Language）**」という言語について基本的な用法をまとめていきます。

SQLには、データの抽出や挿入、更新、削除などを行う「**データ操作言語**（**DML**：Data Manipulation Language）」や、データベースや表などを定義する「**データ定義言語**（**DDL**：Data Definition Language）」などがありますが、今回はデータ操作言語とデータ定義言語それぞれの基本にあたる「**SELECT文**」と「**CREATE文**」を取り扱います。


##目次

* [SELECT文（データ操作言語）](#select文データ操作言語)
<br>　[SELECTの基本形](#selectの基本形)
<br>　[関係演算](#関係演算)
<br>　　[射影](#射影)
<br>　　[選択](#選択)
<br>　　[結合](#結合)
* [CREATE文（データ定義言語）](#create文データ定義言語)
<br>　[表の定義](#表の定義)
<br>　[ビューの作成](#ビューの作成)


##SELECT文（データ操作言語）
関係データベースの表からSQLで必要なデータを抽出するには、「**SELECT文**」を使います。
データを抽出することは**問合せ**（**クエリ**）と呼ばれています。
「SELECT文」では、どの列を、どの表から、どういう条件で抽出するかを記述し、これにより、射影・選択・結合の関係演算を行うことができます。

###SELECTの基本形

```
SELECT 列名１, 列名２　　　　・・・・・・・・・・抽出する列(射影すべき列)を指定する
    FROM 表名１, 表名２・・・・・・・・・・対象となる表を指定する
    WHERE 条件式　　　　　　・・・・・・・・・・・・抽出条件(選択すべき行の条件)を指定する
```

###関係演算
関係演算は、**関係データベースの表から目的のデータを取り出す演算のこと**です。
次のデータ操作を行うことができます。

```
射影(Projection) - 表の中から特定の列を抽出する
選択(Selection) 　　- 表の中から条件に合致した行を抽出する
結合(Join)       - 二つ以上の表を結合して、一つの表を生成する
```
（以下、関係演算のイメージ）
![Qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227208/3c4cb5f9-a7a5-db48-d182-ee3894715158.png)

####射影
表の中から特定の列を抽出します。

```
SELECT 品名 FROM 商品表
```

![商品表.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227208/4ce46dca-dd38-230a-bd64-a3129087696c.png)


####選択
表の中から条件に合致した行を抽出します。
「WHERE条件式」には、次の比較演算子や論理演算子を指定します。


```
比較演算子
A = B　　　　　　-　　　　AはBと等しい
A <> B　　　　-　　　　AはBと等しくない
A > B　　　　　　-　　　　AはBより大きい
A < B　　　　　　-　　　　AはBより小さい(AはB未満)
A >= B　　　　-　　　　AはB以上
A <= B　　　　-　　　　AはB以下

論理演算子
A AND B　　　　　　-　　　　AかつB
A OR B　　　　　　　　-　　　　AまたはB
NOT A　　　　　　　　　　-　　　　Aではない
```

<br/>

例１）商品表から番号が１,２,３の商品情報（全ての列）を抽出する

```
SELECT * FROM 商品表
    WHERE 番号='１' OR 番号='２' OR 番号='３'
```

![例１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227208/d8e14daa-6a49-8ca9-3ffc-90770c8bb5f6.png)



例２）商品表から,価格が１万円以上５万円以下の商品情報を抽出する

```
SELECT * FROM 商品表
    WHERE 価格 >= １００００ AND 価格 <= ５００００
```

![例２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227208/12085f2b-2df3-f9ed-11fd-6c6e43f6091e.png)



####結合
二つ以上の表を結合して、一つの表を生成します。`FROM`で抽出対象となる表を複数指定し、「WHERE条件式」で表間をどの列で結合するかを指定します。
ここで、指定した複数の表に同じ列名がある場合は、`表名.列名`で区別します。例えば、`受注表.商品番号`とは、受注表にある商品番号を、`商品表.商品番号`とは、商品表にある商品番号をそれぞれ意味します。

受注表と商品表を結合し、顧客名と商品名、単価を抽出する

```
SELECT 顧客名,　商品名,　単価
    FROM 受注表,　商品表
    WHERE 受注表.商品番号 = 商品表.商品番号
```

または

```
SELECT 顧客名,　商品名,　単価
    FROM 受注表
    JOIN 商品表
    ON 受注表.商品番号 = 商品表.商品番号
```

![結合.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227208/03366a18-71ef-dc5c-3b19-603cea202f2a.png)

##CREATE文（データ定義言語）
###表の定義
表を定義するには、次の「**CREAT TABLE文**」を使います。

```
CREATE TABLE 表名　 (列名　データ名　[オプション],・・・)　　　　-　　表を作成する
FOREIGN KEY (列名) REFERENCE 表 (列名)　　　　　　　　　　　　　　　　　　-　　外部キーを設定し参照制約をつける
PRIMARY KEY　　　　　　　　　　　　　　　　　　-　　主キー(重複を禁止,NULLを許容しない)を設定する。
UNIQUE (列名)　　　　　　　　　　　　　　　　-　　重複を禁止する
CHECK (列名　条件)　　　　　　　　　　-　　値に条件をつける
NOT NULL　　　　　　　　　　　　　　　　　　　　　　　　-　　NULLを許容しない
```

<br>

次に**`社員表`**という名称でテーブルを定義してみます。
主キーは重複が禁止であるため、名前（同姓同名があり得る）よりも
今回でいう`社員コード`のような個別のIDを使用することが多いです。
また、[参照制約](http://itdoc.hitachi.co.jp/manuals/3020/3020645060/W4500107.HTM)を用いて他の表データとの関連付けを行います。
今回は外部の`部署表`というテーブルと`部署コード`を関連させます。

```
CREATE TABLE 社員表 (
    社員コード CHAR(５) PRIMARY KEY,
    名前 VARCHAR(２０),部署コード CHAR(３),給料 NUMERIC,
    FOREIGN KEY(部署コード) REFERENCE 部署表(部署コード) )
```

CHAR（５）は固定長５バイトの文字データ、
VARCHAR（２０）は可変長の１０バイトの文字データ、
NUMERICは数値データを定義しています。

これで以下の表が定義されます。
![社員表.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227208/cc235c23-a1d1-9e2c-b567-bf4c2b4b93a8.png)

###ビューの作成
**ビューは、実際に存在する実表から必要な部分を取り出して、一時的に作成した表のこと**です。利用者に対して、実表を異なる表現で利用者に提示することができます。ビューを定義するには、「**CREATE VIEW文**」を使います。

例えば、先に定義した社員表から、`社員コード`、`名前`、`給料`の列を取り出した社員給料表を定義してみます。

```
CREATE VIEW 社員給料表 （社員コード,名前,給料）
    AS SELECT 社員コード,名前,給料 FROM 社員表
```

以下の表が定義されます。（**利用者には部署コードは見えません**）
![社員給料表.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227208/3d8d0eb8-d288-c14a-56c5-88e7c445c4f8.png)


---
**参考にした書籍**
 [栢木先生の基本情報技術者教室]
(https://www.amazon.co.jp/%E4%BB%A4%E5%92%8C03%E5%B9%B4-%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8-%E3%82%AF%E3%83%AC%E3%83%90%E3%83%BC%E6%96%B9%E5%BC%8F%E3%81%A7%E3%82%88%E3%81%8F%E3%82%8F%E3%81%8B%E3%82%8B-%E6%A0%A2%E6%9C%A8%E5%85%88%E7%94%9F%E3%81%AE%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85%E6%95%99%E5%AE%A4-%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%8A%80%E8%A1%93%E8%80%85%E8%A9%A6%E9%A8%93/dp/4297117169/ref=sr_1_2_sspa?crid=1D51HD6Z2J968&dchild=1&keywords=%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85%E8%A9%A6%E9%A8%93&qid=1630744262&sr=8-2-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUEzVkpIUUc4WEI3WjJIJmVuY3J5cHRlZElkPUEwMjI0NDAxMkcxQVBLOVU3UVdGTiZlbmNyeXB0ZWRBZElkPUEzRzhISDY4TEdUMTFUJndpZGdldE5hbWU9c3BfYXRmJmFjdGlvbj1jbGlja1JlZGlyZWN0JmRvTm90TG9nQ2xpY2s9dHJ1ZQ==)
 [スッキリわかるSQL入門](https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8B-SQL-%E5%85%A5%E9%96%80-%E3%83%89%E3%83%AA%E3%83%AB215%E5%95%8F%E4%BB%98%E3%81%8D-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4844333933/ref=sr_1_1?ie=UTF8&qid=1499257314&sr=8-1&keywords=%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8Bsql%E5%85%A5%E9%96%80+%E3%83%89%E3%83%AA%E3%83%AB215%E5%95%8F%E4%BB%98%E3%81%8D)

**その他SQL初級者に参考になると思われる記事**
[【これだけ覚えてたらOK！】SQL構文まとめ](https://qiita.com/tatsuya4150/items/69c2c9d318e5b93e6ccd)


---
以上、間違いや修正点ありましたらご指摘よろしくお願いします。