初心者向けSQLメモ SELECT

# はじめに

SQL未経験の私が、勉強したことを整理、備忘のための記事を作成しました。
1つの記事だと長くなりすぎるので、何回かに分けて投稿する予定です。

なお、この記事内のサンプルはすべて、以下のテーブルに対して実施したものです。
|hoge_id|hoge_name|hoge_age|is_male|update_date|
|---|---|---|---|---|
|aaaaaaaa|あいうえお|18|TRUE|2022-07-16|
|bbbbbbbb|かきくけこ|40|TRUE||
|cccccccc|さしすせそ|25|FALSE|2022-07-27|
|dddddddd|たちつてと||FALSE|2022-08-01|
|eeeeeeee|なにぬねの|50|TRUE|2022-08-01|
|ffffffff|はひふへほ|60||2022-08-05|

## SELECT

### 指定したテーブルから指定したカラムを出力

```console:構文
SELECT <カラム名>
FROM <テーブル名>;
```
##### サンプル(カラム指定)
```SQL
SELECT hoge_id, hoge_name, hoge_age
FROM Hoge;
```
|hoge_id|hoge_name|hoge_age|
|---|---|---|
|aaaaaaaa|あいうえお|18|
|bbbbbbbb|かきくけこ|40|
|cccccccc|さしすせそ|25|
|dddddddd|たちつてと||
|eeeeeeee|なにぬねの|50|
|ffffffff|はひふへほ|60|

##### サンプル(全カラム)
```SQL
SELECT *
FROM Hoge;
```
|hoge_id|hoge_name|hoge_age|is_male|update_date|
|---|---|---|---|---|
|aaaaaaaa|あいうえお|18|TRUE|2022-07-16|
|bbbbbbbb|かきくけこ|40|TRUE||
|cccccccc|さしすせそ|25|FALSE|2022-07-27|
|dddddddd|たちつてと||FALSE|2022-08-01|
|eeeeeeee|なにぬねの|50|TRUE|2022-08-01|
|ffffffff|はひふへほ|60||2022-08-05|

### カラムに別名(ASキーワード)

- カラムに別名をつけて出力

```console:構文
SELECT <カラム名> AS <別名>
FROM <テーブル名>;
```

##### サンプル
```SQL
SELECT hoge_id      AS ID,
       hoge_name    AS "名前",   -- 日本語はダブルクォーテーションで囲む
       hoge_age     AS "年齢"
FROM Hoge;
```
|ID|名前|年齢|
|---|---|---|
|aaaaaaaa|あいうえお|18|
|bbbbbbbb|かきくけこ|40|
|cccccccc|さしすせそ|25|
|dddddddd|たちつてと||
|eeeeeeee|なにぬねの|50|
|ffffffff|はひふへほ|60|

### 重複除外(DISTINCTキーワード)

- NULLも1種類のデータとして扱われる
- NULLが複数行あれば1つに纏められる。
- 複数のカラムを指定することも可能。組み合わせ結果が同じものが1つに纏められる。

```console:構文
SELECT DISTINCT <重複除外したいカラム名>
FROM <テーブル名>;
```

##### サンプル
```SQL
SELECT DISTINCT is_male
FROM Hoge;
```
|is_male|
|---|
||
|TRUE|
|FALSE|

### 条件指定(WHERE句)

```console:構文
SELECT <列名>
FROM <テーブル名>
WHERE <条件式>;
```

##### サンプル
```SQL
SELECT hoge_id, hoge_name
FROM Hoge
WHERE hoge_age > 20;
```
|hoge_id|hoge_name|
|---|---|
|bbbbbbbb|かきくけこ|
|cccccccc|さしすせそ|
|eeeeeeee|なにぬねの|
|ffffffff|はひふへほ|

### 算術演算子(`+`,`-`,`*`,`/`)

- NULLを含む演算結果はすべてNULL
5 + NULL = NULL
5 * NULL = NULL
5 / NULL = NULL
NULL / 5 = NULL
NULL / 0 = NULL **※NULLは0除算してもNULL**

##### サンプル
```SQL
SELECT hoge_id, hoge_name,
       hoge_age + 5 AS "5年後の年齢"
FROM Hoge;
```
|hoge_id|hoge_name|5年後の年齢|
|---|---|---|
|aaaaaaaa|あいうえお|23|
|bbbbbbbb|かきくけこ|45|
|cccccccc|さしすせそ|30|
|dddddddd|たちつてと||
|eeeeeeee|なにぬねの|55|
|ffffffff|はひふへほ|65|

### 比較演算子(`=`,`<>`,`>`,`>=`,`<`,`<=`)

- NULLに比較演算子は使えない。
`hoge_age <> 0` としてもNULLは出力されない
`hoge_age = NULL` としてもNULLは出力されない


##### サンプル
```SQL
SELECT hoge_id, hoge_name
FROM Hoge
WHERE update_date > '2022-07-20';
```
|hoge_id|hoge_name
|---|---|
|cccccccc|さしすせそ|
|dddddddd|たちつてと|
|eeeeeeee|なにぬねの|
|ffffffff|はひふへほ|

##### サンプル
- `hoge_age = NULL` としてもNULLは出力されない

```SQL
SELECT hoge_id, hoge_name
FROM Hoge
WHERE is_male = NULL;
```
|hoge_id|hoge_name
|---|---|

##### サンプル
- NULLは、`IS NULL`または`IS NOT NULL`を使う

```SQL
SELECT hoge_id, hoge_name
FROM Hoge
WHERE is_male IS NULL;
```
|hoge_id|hoge_name
|---|---|
|ffffffff|はひふへほ|

### 論理演算子(`NOT`, `AND`, `OR`)

##### サンプル
```SQL
SELECT hoge_id, hoge_name
FROM Hoge
WHERE NOT update_date > '2022-07-20';
```
|hoge_id|hoge_name
|---|---|
|aaaaaaaa|あいうえお|

##### サンプル
```SQL
SELECT hoge_id, hoge_name
FROM Hoge
WHERE is_male = TRUE AND hoge_age > 20;
```
|hoge_id|hoge_name
|---|---|
|bbbbbbbb|かきくけこ|
|eeeeeeee|なにぬねの|

##### サンプル
```SQL
SELECT hoge_id, hoge_name
FROM Hoge
WHERE is_male = TRUE 
AND (hoge_age < 20 OR update_date >= '2022-08-01');
```
|hoge_id|hoge_name
|---|---|
|aaaaaaaa|あいうえお|
|eeeeeeee|なにぬねの|