【0から始めるDB入門 Part2】SQL初級編　WHERE文

# はじめに
今回もSQLabさんの問題を解いていきながら、ステップバイステップでSQLについて学んでいこうと思います。
前回のSELECT文に続いて、今回はWHERE文についてまとめていきたいと思います！

https://sqlab.net/works/basic/

# 初級編
## SELECT文

https://qiita.com/bearl27/items/68383f84a18035892317

## WHERE文

今回はSQLの基礎中の基礎である**WHERE文**について学びます！  
SELECTで出力するものの条件を指定します。

---

### 問題1（検索）

**発行年が2020年の書籍一覧を取得してください。**

<details><summary>解答・解説</summary>

```sql
SELECT * FROM books
WHERE release_year = 2020;
```

**解説**

`books`テーブルから`release_year`が2020の書籍を全て取得します。`WHERE`句を使用して特定の条件（この場合は発行年が2020年）に一致するレコードをフィルタリングしています。

</details>

:::note info
**ポイント**

- 同じかどうかは`=`、違うかどうかは`!=`を使います。
- `WHERE`句は、テーブルから特定の条件に一致するデータを抽出するために使用します。
:::

---

### 問題2（文字の検索）

**書籍名が「宇宙の歴史」のデータを取得してください。**

<details><summary>解答・解説</summary>

```sql
SELECT * FROM books
WHERE name = '宇宙の歴史';
```

**解説**

`books`テーブルから`name`が「宇宙の歴史」である書籍を取得します。文字列を比較する際には、シングルクォーテーション `' '` で囲む必要があります。

</details>

:::note info
**ポイント**

- 文字列を検索する際には、値をシングルクォーテーション `' '` で囲みます。
:::

---

### 問題3（キーワード）

**「マンガ」というキーワードを含む書籍一覧を取得してください。**

<details><summary>解答・解説</summary>

```sql
SELECT * FROM books
WHERE name LIKE '%マンガ%';
```

**解説**

このクエリは、`name`列に「マンガ」という文字列が含まれる書籍を取得します。`LIKE`演算子とワイルドカード文字 `%` を使用して部分一致検索を行います。

</details>

:::note info
**ポイント**

- `LIKE`演算子は部分一致検索を行う際に使用します。
- `%` は任意の文字列（0文字以上）を表すワイルドカードです。
- `_`は任意の1文字を表すワイルドカードです。
- `'%キーワード%'` の形式で、文字列のどの位置にキーワードがあっても一致します。
:::

---

### 問題4（数量指定）

**男性の著者を先頭から3名取得してください。**

<details><summary>解答・解説</summary>

```sql
SELECT * FROM authors
WHERE gender = '男性'
LIMIT 3;
```

**解説**

`gender`が「男性」である著者を3名取得します。`LIMIT`句を使用して取得するレコード数を制限しています。

※データの順序を指定したい場合は、`ORDER BY`句を使用する必要があります。

</details>

:::note info
**ポイント**

- `LIMIT`句は、結果セットの行数を制限します。
- データベースによっては `FETCH FIRST 3 ROWS ONLY` を使用することもあります。
- 特定の順序でデータを取得したい場合は、`ORDER BY`句と組み合わせて使用します。
:::

---

### 問題5（NULL or NOT NULL）

**発行年が明記されている書籍一覧を取得してください。**

<details><summary>解答・解説</summary>

```sql
SELECT *
FROM books
WHERE release_year IS NOT NULL;
```

**解説**

`release_year`がNULLでない（つまり、値が明記されている）書籍を取得します。`IS NOT NULL`を使用してNULLでない値を検索します。

</details>

:::note info
**ポイント**

- `NULL`は「値が存在しない」ことを表します。
- `=`や`!=`でNULLを比較することはできません。代わりに、`IS NULL`や`IS NOT NULL`を使用します。
:::

---

### 問題6（範囲）

**総ページ数が300~400ページの書籍一覧を取得してください。**

<details><summary>解答・解説</summary>

```sql
SELECT *
FROM books
WHERE total_page BETWEEN 300 AND 400;
```

**解説**

`total_page`が300以上400以下の書籍を取得します。`BETWEEN`演算子は指定した範囲内の値を検索します。

</details>

:::note info
**ポイント**

- `BETWEEN A AND B` は、値が`A`以上`B`以下の範囲を含みます。
- 範囲指定には、`>=`や`<=`を使用しても同じ結果が得られます。
  ```sql
  WHERE total_page >= 300 AND total_page <= 400;
  ```
:::

---

### 問題7（複数条件1）

**発行年が2004, 2008, 2018年の書籍一覧を取得してください。**

<details><summary>解答・解説</summary>

```sql
SELECT *
FROM books
WHERE release_year IN (2004, 2008, 2018);
```

または

```sql
SELECT *
FROM books
WHERE release_year = 2004 OR release_year = 2008 OR release_year = 2018;
```

**解説**

このクエリは、`release_year`が2004、2008、または2018である書籍を取得します。`IN`演算子を使用すると、複数の値を簡潔に指定できます。

</details>

:::note info
**ポイント**

- `IN`演算子はリスト内のいずれかの値に一致するレコードを検索します。
- 複数の`OR`条件を使用すると同じ結果が得られますが、`IN`を使用する方が読みやすくなります。
:::

---

### 問題8（パターンマッチング）

**ISBNが「978」で始まる書籍一覧を取得してください。**

<details><summary>解答・解説</summary>

```sql
SELECT *
FROM books
WHERE isbn LIKE '978%';
```

**解説**

このクエリは、`isbn`が「978」で始まる書籍を取得します。`LIKE`演算子とワイルドカード`%`を組み合わせて、特定のパターンに一致する文字列を検索しています。

</details>

:::note info
**ポイント**

- 文字列の先頭を指定する場合は、`'パターン%'`とします。
- `%`は任意の文字列（0文字以上）を表します。
- `LIKE`はパターンマッチングに使用されます。
:::

---

### 問題9（四則演算）

**書籍の税込価格一覧を取得してください。消費税率は10%です。  
出力項目はbook_id(書籍ID)とtax_included_price(税込価格)**

<details><summary>解答・解説</summary>

```sql
SELECT book_id, price * 1.10 AS tax_included_price
FROM book_sales;
```

**解説**

このクエリは、`price`に1.10を掛けて税込価格を計算し、`book_id`とともに取得しています。計算結果に`AS`を使用して列名（エイリアス）を付けています。

</details>

:::note info
**ポイント**

- 四則演算（`+`, `-`, `*`, `/`）はSELECT句内で使用できます。
- `AS`を使用して計算列にエイリアス（別名）を付けると、結果セットが見やすくなります。
:::

---

### 問題10（比較）

**総ページ数が100ページ未満の書籍一覧を取得してください。**

<details><summary>解答・解説</summary>

```sql
SELECT *
FROM books
WHERE total_page < 100;
```

**解説**

このクエリは、`total_page`が100より小さい書籍を取得します。`<`演算子を使用して指定した値より小さいレコードを検索します。

</details>

:::note info
**ポイント**

- 比較演算子：
  - `<` 未満
  - `>` 超過
  - `<=` 以下
  - `>=` 以上
  - `=` 等しい
  - `<>` 等しくない
- 数値の比較にこれらの演算子を使用します。
:::

---

### 問題11（否定）

**定休日が月曜日ではない店舗一覧を取得してください。**

<details><summary>解答・解説</summary>

```sql
SELECT *
FROM stores
WHERE NOT holiday = '月曜日';
```

または

```sql
SELECT *
FROM stores
WHERE holiday <> '月曜日';
```

**解説**

このクエリは、`holiday`が「月曜日」ではない店舗を取得します。`NOT`演算子や`<>`演算子を使用して条件を否定しています。

</details>

:::note info
**ポイント**

- `NOT`演算子は条件を否定します。
- `<>`は「等しくない」を意味します。
- 文字列の比較でも`<>`を使用できます。
:::

---

### 問題12（論理演算）

**発行年が2000年以上で総ページ数が200ページ以下の書籍一覧を取得してください。**

<details><summary>解答・解説</summary>

```sql
SELECT *
FROM books
WHERE release_year >= 2000
  AND total_page <= 200;
```

**解説**

このクエリは、`release_year`が2000以上かつ`total_page`が200以下の書籍を取得します。`AND`演算子を使用して複数の条件を組み合わせています。

</details>

:::note info
**ポイント**

- `AND`演算子は、すべての条件が`TRUE`の場合にレコードを取得します。
- 複数の条件を組み合わせることで、より細かいデータ抽出が可能です。
:::

---

# さいごに

今回の問題を通して、WHERE句の基本的な使い方を学びました。WHERE句はデータベースから必要な情報を抽出する際に非常に重要な役割を果たします。条件指定や絞り込みを行うことで、膨大なデータから必要なデータだけを効率的に取得することができます。

# まとめ

- **WHERE句**：特定の条件に一致するレコードを選択するために使用します。
- **比較演算子**：`=`, `<>`, `<`, `>`, `<=`, `>=` などを使用して数値や文字列の比較を行います。
- **論理演算子**：`AND`, `OR`, `NOT` を使用して複数の条件を組み合わせます。
- **NULLの扱い**：`IS NULL`、`IS NOT NULL` を使用してNULL値を検索します。
- **部分一致検索**：`LIKE` キーワードとワイルドカード `%`、`_` を使用して文字列のパターンマッチングを行います。
- **範囲指定**：`BETWEEN A AND B` で範囲内の値を検索します。
- **リスト内の値の検索**：`IN` を使用して複数の値の中から一致するものを検索します。
- **結果の制限**：`LIMIT` 句を使用して取得するレコード数を制限します。

# 次回予告

次回は、SQL中級編のデータの集約について学びたいと思います！お楽しみに