SQL文チートシート②

[SQL文チートシート①](https://qiita.com/takayuki-nakamura/items/dbb22b896bc344211089)の続き

### 目次
- AS
- DISTINCT
- WHERE
- LIKE
- BETWEEN
- ORDER BY
- LIMIT
- CASE

#　使用テーブル

moviesテーブルスキーマ

| name | type |
| :---: | :---: |
| id | INTEGER |
| name | TEXT |
| genre | TEXT |
| year | INTEGER |
| rating | INTEGER |

moviesテーブルデータ

| id | name | genre |　year | rating |
| :---: | :---: | :---: | :---: | :---: |
| 1 | Into The Wild | adventure | 2007 | 9 |
| 2 | Point Break | action | 1991 | 5 | 
| 3 | Inception | SF | 2010 | 3 | 
| 4 | Pulp Fiction | comedy | 1994 | 7 | 
| 5 | Se7en | action | 1992 | 10 | 
| 6 | Seven | action | 1999 | 8 | 


## AS
AS文はカラムやテーブル名をエイリアスとして変更することができます。さっそくカラム名を変更してみます。

```movies.sql
SELECT name AS 'Titles'
FROM movies;
```

SQL結果

| Titles |
| :---: |
| Into The Wild |
| Point Break |
| Inception |
| Pulp Fiction |
| Se7en |
| Seven |

シングルクォートではなくても大丈夫ですが、ASを使用する際は慣習的にシングルクォートを使います。また、ASはテーブルのカラムの名前を実際には変更しておらず、結果として仮に別の名前で表示しているだけです。

## DISTINCT
DISTINCT文は指定したカラムでダブっている値をフィルタリングします。

```moives.sql
SELECT DISTINCT genre 
FROM movies;
```

SQL結果

| genre |
| :---: |
| adventure |
| action |
| SF |
| comedy |

ダブっていたcomedyがフィルタリングされました。

## WHERE
WHERE句は指定した範囲の情報を取得することができ、以下の様なさまざまな比較演算子が使われます。

- A = B（A と B が等しい）
- A <> B or A != B（A と B が等しくない。）
- A > B（A より B が小さい）
- A < B（A より B が大きい）
- A >= B（A が B 以上）
- A <= B（A が B 以下）

```moives.sql
SELECT * 
FROM movies 
WHERE rating <= 7;
```

SQL結果

| id | name | genre |　year | rating |
| :---: | :---: | :---: | :---: | :---: |
| 2 | Point Break | action | 1991 | 5 | 
| 3 | Inception | SF | 2010 | 3 | 
| 4 | Pulp Fiction | comedy | 1994 | 7 | 

## Like
LIKEはWHERE句とセットで使用し、カラム内のある特定のパターンにマッチした値を取得します。その際に使用できるワイルドカードが以下の2つです。

- `_`
- `%`


### 「 _ 」の使い方

`_`は一つの文字を表します。

```moives.sql
SELECT * 
FROM movies
WHERE name LIKE 'Se_en';
```

SQL結果

| id | name | genre |　year | rating |
| :---: | :---: | :---: | :---: | :---: |
| 5 | Se7en | action | 1992 | 10 | 
| 6 | Seven | action | 1999 | 8 | 


`_`が一文字分のワイルドカードとして機能し、`Se`から始まり`en`で終わる値にマッチし取得することができます。

### 「 % 」の使い方
`%`は0個かそれ以上の数の文字を表します。

```moives.sql
SELECT * 
FROM movies
WHERE name LIKE 'I%';
```

SQL結果

| id | name | genre |　year | rating |
| :---: | :---: | :---: | :---: | :---: |
| 1 | Into The Wild | adventure | 2007 | 9 |
| 3 | Inception | SF | 2010 | 3 | 

`I%`は映画の名前が`I`から始まる全ての映画にマッチします。


## BETWEEN
BETWEENはWHERE句の中で使われ、「数字」「文字」「日付」の値の範囲を指定しフィルタリングすることができます。

```moives.sql
SELECT *
FROM movies
WHERE year BETWEEN 1990 AND 1999;
```

SQL結果

| id | name | genre |　year | rating |
| :---: | :---: | :---: | :---: | :---: |
| 2 | Point Break | action | 1991 | 5 | 
| 4 | Pulp Fiction | comedy | 1994 | 7 | 
| 5 | Se7en | action | 1992 | 10 | 
| 6 | Seven | action | 1999 | 8 | 

## WHERE句内での条件の組み合わせ
WHERE句内で複数の条件で絞り込む場合以下の２つを使用します。

- `AND`
- `OR`

### AND
ANDはすべての条件がtrueの行を表示します。

```moives.sql
SELECT *
FROM movies
WHERE year BETWEEN 1990 AND 1999
   AND genre = 'action';
```

SQL結果

| id | name | genre |　year | rating |
| :---: | :---: | :---: | :---: | :---: |
| 2 | Point Break | action | 1991 | 5 | 

### OR
ORは条件が一つでもtrueであれば、その行を表示します。

```moives.sql
SELECT *
FROM movies
WHERE year BETWEEN 1990 AND 1999
    OR genre = 'SF';
```

SQL結果

| id | name | genre |　year | rating |
| :---: | :---: | :---: | :---: | :---: |
| 2 | Point Break | action | 1991 | 5 | 
| 3 | Inception | SF | 2010 | 3 | 
| 4 | Pulp Fiction | comedy | 1994 | 7 | 
| 5 | Se7en | action | 1992 | 10 | 
| 6 | Seven | action | 1999 | 8 | 

## ORDER BY
ORDER BYはSQLの結果を数字もしくは文字で任意の順番にソートすることができます。
`ASC` = 昇順
`DESC` = 降順
で指定することが可能です。

```moives.sql
SELECT *
FROM movies
WHERE rating >= 8
ORDER BY year DESC;
```

SQL結果

| id | name | genre |　year | rating |
| :---: | :---: | :---: | :---: | :---: |
| 1 | Into The Wild | adventure | 2007 | 9 |
| 6 | Seven | action | 1999 | 8 | 
| 5 | Se7en | action | 1992 | 10 | 

`rating`が8以上の行を公開年が新しいもの順に並べ替えました。

## LIMIT
LIMITは取得するデータの行数の上限を設定することができます

```moives.sql
SELECT *
FROM movies
LIMIT 3;
```

SQL結果

| id | name | genre |　year | rating |
| :---: | :---: | :---: | :---: | :---: |
| 1 | Into The Wild | adventure | 2007 | 9 |
| 2 | Point Break | action | 1991 | 5 | 
| 3 | Inception | SF | 2010 | 3 | 

補足:
LIMITは必ずクエリ最後に書きます。また、LIMITをサポートしてないSQLデータベースがあります。

## CASE
CASEはWHENで指定した条件を上から順番にチェックしていき、最初にtrueとなる条件の結果を返します。
もしいずれにも合致せず、ELSEが指定されている場合はELSEの結果を返します。
また、どれも合致せず、ELSEが指定されていない場合はNULLを返します。

```moives.sql
SELECT name,
 CASE
  WHEN rating >= 9 THEN 'Awesome'
  WHEN rating >= 5 THEN 'Good'
  ELSE 'Bad'
 END AS 'Review'
FROM movies;
```

SQL結果

| name | Review |
| :---: | :---: |
| Into The Wild | Awesome |
| Point Break | Good |
| Inception | Bad |
| Pulp Fiction | Good |
| Se7en | Awesome |
| Seven | Good |