データベース、SQL・MySQLの基礎（カラムの別名取得~シーケンス番号）

##カラムを別名で取得
テーブルを作成したときのカラム名で取得するのではなく、別の名前で取得することも可能。
後述する「表結合」を行う際に必要になる。

```sql
SELECT 
  カラム1 AS 別名1,
  カラム2 AS 別名2,
  カラム3 AS 別名3
FROM
  テーブル名
```

##表を結合する
「表結合」を行うことで、複数の表のデータをまとめて参照することが可能ができる。
RDBを説明した際に、「言語データ」と「用途データ」という２つのデータに分けたが、
ここでいうデータというものは「テーブル」の事を指す。つまり、「言語テーブル」と「用途テーブル」そのものをデータとして扱う。
「表結合」を行うと、データの参照がより効率的になる。

表結合を行うには、複数のテーブルが必要。
まず、新しいテーブルを作成。

```sql
CREATE TABLE examples(
   id int(10) PRIMARY KEY NOT NULL,
   languages_id int(11),
   example VARCHAR(20)
);
```
examplesテーブルにデータを登録

```sql
INSERT INTO examples(
   id,
   languages_id,
   example
)VALUES(
   1,
   1,
   'Minecraft'
),(
   2,
   2,
   'RDB'
),(
   3,
   3,
   '文字'
),(
   4,
   4,
   '色付け'
),(
   5,
   1,
   'Evernote'
),(
   6,
   1,
   'Android'
),(
   7,
   20,
   'AI'
);
```
![スクリーンショット 2022-01-22 15.30.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754263/73f3ed87-594a-8641-9691-b1bf8bd9338d.png)

表結合には、内部結合（INNER JOIN）と外部結合（OUTER JOIN）の２種類がある。

##内部結合（INNER JOIN）

```sql
SELECT 
/*参照するテーブルとそのカラム　※ここで定義したものが参照され、表示される*/
    テーブル名1.カラム名1,
    テーブル名1.カラム名2,
    テーブル名2.カラム名1,
    テーブル名2.カラム名2

/*どのテーブルを結合するか*/
FROM
    テーブル名1
INNER JOIN
    テーブル名2
ON

/*結合する条件*/
    2つのテーブルの結合条件
```

上記をもとに、languagesテーブルとexamplesテーブルを連結してみる。

```sql
SELECT 
    languages.id,
    languages.language,
    examples.example
FROM
    languages
INNER JOIN
    examples
ON
    languages.id = books.languages_id;
```
結果は以下の通り。

![スクリーンショット 2022-01-22 15.14.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754263/535edc10-1f6d-a5cf-6ab3-1af6c33b5eb4.png)

##外部結合（OUTER JOIN）
外部結合は左右それぞれのテーブルの指定したカラムの値が一致するレコードに加えてどちらかのテーブルにしか存在しないデータについても取得する。基本となる構文は次の通り。

##外部結合(LEFT JOIN)の基本構文
```sql
SELECT 
    テーブル名1.カラム名1,
    テーブル名1.カラム名2,
    テーブル名2.カラム名1,
    テーブル名2.カラム名2
FROM

/*↓こちらにしかないデータも取得する*/
    テーブル名1
LEFT JOIN
    テーブル名2
ON
    2つのテーブルの結合条件
```

##外部結合(RIGHT JOIN)の基本構文
```sql
SELECT 
    テーブル名1.カラム名1,
    テーブル名1.カラム名2,
    テーブル名2.カラム名1,
    テーブル名2.カラム名2
FROM
    テーブル名1
RIGHT JOIN

/*↓こちらにしかないデータも取得する*/
    テーブル名2
ON
    2つのテーブルの結合条件
```

基本的に内部結合の場合と同じだが、外部結合では結合の対象となっているカラムの値が一致しているデータに加え、カラムの値がどちらかのテーブルにしかなかった場合でもデータとして取得する。
この時、LEFT JOINでは、FROMの後に書かれたテーブルのデータだけを取得し、
RIGHT JOINでは、JOINの後に書かれたテーブルのデータだけを取得する。

データベースの状況は以下。
![スクリーンショット 2022-01-22 15.39.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754263/72b9b323-276c-87f2-6b96-801145a76b71.png)

##LEFT JOINで結合した場合
```sql
SELECT 
    languages.id,
    languages.language,
    examples.example
FROM
    languages
LEFT JOIN
    examples
ON
    authors.id = books.author_id;
```

結果
![スクリーンショット 2022-01-22 15.45.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754263/931ab2a5-2fdd-b39d-ea9e-8e40a808a65d.png)

examplesにないところはNULLで表示される。

##RIGHT JOINで結合した場合
```sql
SELECT 
    languages.id,
    languages.language,
    examples.example
FROM
    languages
RIGHT JOIN
    examples
ON
    authors.id = books.author_id;
```

結果
![スクリーンショット 2022-01-22 15.48.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754263/9813450d-9d06-b243-03b2-ed490d76eb95.png)

##シーケンス番号の自動生成
指定したカラムに対してMySQLが自動的に一意のシーケンス番号を生成する機能。
利用するにはAUTO_INCREMENTで設定する。構文は以下の通り。

```sql
CREATE TABLE authors (
    Id int(11) PRIMARY KEY AUTO_INCREMENT NOT NULL,
    language VARCHAR(10),
    use VARCHAR(20)
);
```

基本的にAUTO_INCREMENTが設定されたカラムには自動で値が格納されていくように利用するが、
任意の数値、また重複した値を格納する事も可能。

AUTO_INCREMENTをテーブル内で設定する場合は次の点に注意。
>・AUTO_INCREMENTを設定するカラムには同時にインデックスを設定する必要がある
>・AUTO_INCREMENTはテーブル内の1つのカラムにしか設定できない
>・AUTO_INCREMENTを設定したカラムにはDEFAULTは設定できない
>・AUTO_INCREMENTには正の値しか格納できない(負の数も可能だが予期しない結果となる) 　


＜前回の記事＞
・データベース、SQL・MySQLの基礎
https://qiita.com/TaikiTkwkbysh/items/8efc5faf8da2062a8a95

・データベース、SQL・MySQLの基礎（テーブルの作成から削除）
https://qiita.com/TaikiTkwkbysh/items/d1d38dda0f5844f7603b

・データベース、SQL・MySQLの基礎（データの登録〜並び替えて参照）
https://qiita.com/TaikiTkwkbysh/items/04b0db468490f0d79b67

＜次回の記事＞
・データベース、SQL・MySQLの基礎（命名規約）