SQL① (SELECT, WHERE, ORDER BY)

SQLの備忘録とマークダウンの書き方練習です:writing_hand:
## 目次
1. 使用するテーブル
1. 列の指定(SELECT)
1. 条件指定(WHERE)
1. 並びかえ(ORDER BY)

## 1.使用するテーブル
今回は以下の「users」テーブルを例にします
| id | name | age | is_active |
|:-:|:-:|:-:|:-:|
| 1  | 佐藤太郎  | 16  | 1 |
| 2  | 山田花子  | 26  | 0 |
| 3  | 鈴木次郎  | 18  | 0 |
| 4  | 田中A美  | 28  | 1 |

何かの会員データベースだと思ってください。それぞれの列の意味は以下の通りとなります
* id：ID
* name：名前
* age：年齢
* is_active：アクティブなユーザ（1ならアクティブ、0なら非アクティブ）



## 2.列の指定(SELECT)
### 基本的な書き方
```sql
SELECT 列名 FROM テーブル名;
```
### 例「usersテーブルから全ての列を抽出したい」
#### 書き方
* テーブル名→users
* 列名→*
※「*(アスタリスク)」は全ての列という意味
```sql
SELECT * FROM users;
```
#### 実行結果（usersテーブルがそのまま抽出されます）
| id | name | age | is_active |
|:-:|:-:|:-:|:-:|
| 1  | 佐藤太郎  | 16  | 1 |
| 2  | 山田花子  | 26  | 0 |
| 3  | 鈴木次郎  | 18  | 0 |
| 4  | 田中A美  | 28  | 1 |

### 例「usersテーブルから名前の列を抽出したい」
#### 書き方
* テーブル名→users
* 列名→name
```sql
SELECT name FROM users;
```
#### 実行結果
| name |
|:-:|
| 佐藤太郎  | 
| 山田花子  | 
| 鈴木次郎  |
| 田中A美  | 

### 例「usersテーブルからidと年齢の列を抽出したい」
#### 書き方
* テーブル名→users
* 列名→id, age
※複数ある場合は「,(カンマ)」で区切ります。
```sql
SELECT id, age FROM users;
```
#### 実行結果
| id | age |
|:-:|:-:|
| 1 | 16  |
| 2 | 26  |
| 3 | 18  |
| 4 | 28  |

## 3.条件指定(WHERE)
条件に一致するデータを抽出したいときは「WHERE」句を使います
### 基本的な書き方
```sql
SELECT 列名 FROM テーブル名 WHERE 条件;
```
条件の部分では比較演算子や論理演算子を使用して記述します
### 比較演算子
| 演算子 |	意味	| 例 |
|:-:|:-:|:-:|
| = |	等しい	| age = 18 （年齢が18のもの） |
| != または <> |	等しくない	| age != 18 または age <> 18 （年齢が18でないもの） |
| > |	より大きい	| age > 18 （年齢が18より大きい） |
| < |	より小さい	| age < 18 （年齢が18より小さい） |
| >= |	以上	| age >= 18 （年齢が18以上） |
| <= |	以下	| age <= 18 （年齢が18以下） |
| BETWEEN A AND B |	A 以上 B 以下	| age BETWEEN 10 AND 20 （年齢が10以上20以下） |
| IN (A, B, C) |	A または B または C に一致	| name IN ('田中A美', '田中B美', '田中C美') （名前が"田中A美"、"田中B美"、"田中C美"のいずれか） |
| LIKE |	パターン一致（部分一致検索）	| name LIKE '田%'（"田"で始まる名前） |
| IS NULL |	NULLかどうか	| age IS NULL（年齢がNULLのもの） |
| IS NOT NULL |	NULLでないか	| age IS NOT NULL（年齢がNULLでないもの） |

### 論理演算子
| 演算子 |	意味	| 例 |
|:-:|:-:|:-:|
| AND |	両方の条件が真のとき	| age >= 10 AND is_active = 1 （年齢が10以上かつアクティブ） |
| OR |	どちらかの条件が真のとき	| age < 20 OR is_active = 1 （年齢が20未満またはアクティブ） |
| NOT |	条件を反転させる	| NOT age < 10（年齢が10未満でない = 年齢が10以上） |

### 例「usersテーブルから年齢が18歳以上の名前を抽出したい」
#### 書き方
* テーブル名→users
* 列名→name
* 条件→age >= 18
```sql
SELECT name FROM users WHERE age >= 18;
```
#### 実行結果
| name |
|:-:|
| 山田花子 |
| 鈴木次郎 |
| 田中A美 |

### 例「usersテーブルから年齢が18歳以上かつのアクティブなユーザーの名前を抽出したい」
#### 書き方
* テーブル名→users
* 列名→name
* 条件→age >= 18 AND is_active = 1
```sql
SELECT name FROM users WHERE age >= 18 AND is_active = 1;
```
#### 実行結果
| name |
|:-:|
| 田中A美 |

### 例「usersテーブルから年齢が25歳以上または10歳未満のアクティブなユーザーの名前を抽出したい」
#### 書き方
* テーブル名→users
* 列名→name
* 条件→(age >= 25 OR age < 10) AND is_active = 1
```sql
SELECT name FROM users WHERE (age >= 25 OR age < 10) AND is_active = 1;
```
#### 実行結果
| name |
|:-:|
| 田中A美 |

## 4.並びかえ(ORDER BY)
抽出した結果を並び替えたい場合は「ORDER BY」句を使います
```sql
--【超シンプルな例】
SELECT 列名 FROM テーブル名 ORDER BY 対象列名 順番;

--【条件があるとき】
SELECT 列名 FROM テーブル名 WHERE 条件 ORDER BY 対象列名 順番;
```
順番は昇順か降順を指定できます
* 昇順(ASC)：上から「0,1,2,3,…」や「A,B,C,…」のように昇るように並び替える:arrow_upper_right:
* 降順(DESC)：上から「10,9,8,…」や「Z,Y,X,…」のように降りるように並び替える(逆):arrow_lower_right:

### 例「usersテーブルから年齢が高い順で、同じ年齢なら名前順に抽出したい」
#### 書き方
* テーブル名→users
* 列名→*
* 対象列名1→age
* 順番1→DESC
* 対象列名2→name
* 順番2→ASC
※複数条件で並び替える場合、「対象列名1 順番1, 対象列名2 順番2, …」のようにカンマ区切りで並べ替えます
```sql
SELECT * FROM users ORDER BY age DESC, name ASC;
```
#### 実行結果（省略）

### 例「usersテーブルからアクティブ会員で年齢が高い順に抽出したい」
#### 書き方
* テーブル名→users
* 列名→*
* 条件→is_active = 1
* 対象列名→age
* 順番→DESC
```sql
SELECT * FROM users WHERE is_active = 1 ORDER BY age DESC;
```
#### 実行結果
| id | name | age | is_active |
|:-:|:-:|:-:|:-:|
| 4  | 田中A美  | 28  | 1 |
| 1  | 佐藤太郎  | 16  | 1 |