【WHERE句】#4 Webディレクター見習いが知識ゼロからSQLを学ぶ

こんにちは、はじめまして! 　saku-chanです!
このアカウントは、社会人1年目のWebディレクター見習い(初心者)がSQLを学ぶ成長記録になっています。
ひよっこから成長する過程を残し、ついでに皆さんからアドバイスを頂けたら良いな! 私と同じように知識ゼロからSQLを始める人の一つの指針になればいいな!という思いで作成しました。
ちなみに、ブログを含め記事などを書いた経験がないため読みづらい部分も多々あるかと思いますが、そこも含めて皆さまアドバイス頂けると嬉しいですmm

◆記事の内容は、**SQL初心者の自分が、同じような初心者の方でも理解しやすいように心がけながら、SQLの基本に関して学んだことを懇切丁寧に**記載しています◆

##目次
- [はじめに](https://qiita.com/saku-chan/items/9cfe22decee081848772#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)
- [WHERE句とは](https://qiita.com/saku-chan/items/9cfe22decee081848772#where%E5%8F%A5%E3%81%A8%E3%81%AF)
<br>└[①基本的な絞り込み(等号や不等号などを使用した条件設定)](https://qiita.com/saku-chan/items/9cfe22decee081848772#%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E7%B5%9E%E3%82%8A%E8%BE%BC%E3%81%BF%E7%AD%89%E5%8F%B7%E3%82%84%E4%B8%8D%E7%AD%89%E5%8F%B7%E3%81%AA%E3%81%A9%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E6%9D%A1%E4%BB%B6%E8%A8%AD%E5%AE%9A)
<br>└[②複数条件での絞り込み(INを使用した条件設定)](https://qiita.com/saku-chan/items/9cfe22decee081848772#%E8%A4%87%E6%95%B0%E6%9D%A1%E4%BB%B6%E3%81%A7%E3%81%AE%E7%B5%9E%E3%82%8A%E8%BE%BC%E3%81%BFin%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E6%9D%A1%E4%BB%B6%E8%A8%AD%E5%AE%9A)
<br>└[③任意の文字での絞り込み(LIKEを使用した条件設定)](https://qiita.com/saku-chan/items/9cfe22decee081848772#%E4%BB%BB%E6%84%8F%E3%81%AE%E6%96%87%E5%AD%97%E3%81%A7%E3%81%AE%E7%B5%9E%E3%82%8A%E8%BE%BC%E3%81%BFlike%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E6%9D%A1%E4%BB%B6%E8%A8%AD%E5%AE%9A)
- [まとめ](https://qiita.com/saku-chan/items/9cfe22decee081848772#%E3%81%BE%E3%81%A8%E3%82%81)
- [最後に](https://qiita.com/saku-chan/items/9cfe22decee081848772#%E6%9C%80%E5%BE%8C%E3%81%AB)

##はじめに
今回はSQLのSELECT文で使用される`WHERE句`に関して勉強したことを記載します！
前回同様、初めてSQLを勉強する方(プログラミング経験自体がなくてもOK)が気軽に読んでいただける記事になっています^^
ではスタート!

⇒[前回の記事【集約関数】はこちら](/saku-chan/items/71bfa462d8a1384e2965)
⇒[前々回の記事【SELECT句とFROM句】はこちら](https://qiita.com/saku-chan/items/673d910d708a985f1f5b)

⇒[記事一覧](/saku-chan/items/48d36b6ad60d63206a18)

##WHERE句とは
`SELECT句`は**列方向**に絞り込むために使用しますが、それに対して`WHERE句`は**行方向**の絞り込みを行うために使用します。

とりあえず基本形はこちら!

```sql
 SELECT ＜取り出したいカラム名＞ FROM ＜使用するテーブル名＞ WHERE＜行方向に絞り込むための条件＞ ;
```

このような形で、`WHERE句`は**`FROM句`の後に記述**します。

WHERE句では様々な条件を指定して絞り込みを行うことができるので、１つずつ紹介していきます!

**①基本的な絞り込み(等号や不等号などを使用した条件設定)
②複数条件での絞り込み(INを使用した条件設定)[\[⇒\]](https://qiita.com/saku-chan/items/9cfe22decee081848772#%E8%A4%87%E6%95%B0%E6%9D%A1%E4%BB%B6%E3%81%A7%E3%81%AE%E7%B5%9E%E3%82%8A%E8%BE%BC%E3%81%BFin%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E6%9D%A1%E4%BB%B6%E8%A8%AD%E5%AE%9A)
③任意の文字での絞り込み(LIKEを使用した条件設定)[\[⇒\]](https://qiita.com/saku-chan/items/9cfe22decee081848772#%E4%BB%BB%E6%84%8F%E3%81%AE%E6%96%87%E5%AD%97%E3%81%A7%E3%81%AE%E7%B5%9E%E3%82%8A%E8%BE%BC%E3%81%BFlike%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E6%9D%A1%E4%BB%B6%E8%A8%AD%E5%AE%9A)**

###①基本的な絞り込み(等号や不等号などを使用した条件設定)
今回はこちらのテーブルを使用します。

テーブル名：friends_2

|id|       name |    age    |color|
|:-------------:|:-------------:|:------------:|:------------:|
|01|  けん |   14     |red|
|02| あおい|    21    |NULL|
|03|  みほ |   16   |pink|
|04| さやか |    9  |green|
|05|たくや |   16   |NULL|
|06|  あい |    16  |green|

まずはcolorで絞ってみましょう。
クエリと実行結果は以下の通りです。

```sql
SELECT name,color 
FROM friends_2 
WHERE color = 'green'  ;
```

|       name    |color|
|:-------------:|:------------:|
| さやか  |green|
|  あい |green|

直感でわかりますが、このクエリの意味は
**colorカラムにgreenという値が入っているレコード(行)の、nameカラムとcolorカラムを取得する**
です。

もう１つ例をあげてみます。
クエリと実行結果は以下の通りです。

```sql
SELECT id,name,age
FROM friends_2 
WHERE age >= 14  ;
```
|id|       name |    age    |
|:-------------:|:-------------:|:------------:|
|01|  けん |   14     |
|02| あおい|    21    |
|03|  みほ |   16   |
|05|たくや |   16   |
|06|  あい |    16  |

このクエリは
**ageカラムの値が14以上のレコードの、idカラム、nameカラム、ageカラムを取得する**
という意味なので、ちゃんとfriends_2テーブルから4レコード目(age=9)が除かれていることが確認出来ます。

とっても簡単ですね！

また、否定の場合は`NOT`を使用します。

```sql
SELECT name,age
FROM friends_2 
WHERE NOT age = 16 ;
```

このように記述すると、以下のようにageが16 **以外** のデータを抽出することが出来ます。


|       name |    age    |
|:-------------:|:------------:|
|  けん |   14     |
| あおい|    21    |
| さやか |    9  |

###②複数条件での絞り込み(INを使用した条件設定)
続いてはWHERE句で複数の条件を指定する方法をみていきましょう!

複数の条件を指定するには`IN`を使用します。

```sql
SELECT id,name,color
FROM friends_2 
WHERE color IN('pink', 'green') ;
```

このように`IN`の後に`()`を使用して、指定したい値を記述します。
先ほどのクエリの実行結果はこちらです。

|id|       name  |color|
|:-------------:|:-------------:|:------------:|
|03|  みほ  |pink|
|04| さやか  |green|
|06|  あい   |green|

colorの値がpinkまたはgreenのレコードに絞ることが出来ました。

また、この`IN`を使用した条件指定は、以下のように`OR`を使っても同様の結果を得ることが出来ます。

```sql
SELECT id,name,color
FROM friends_2 
WHERE color = 'pink' OR color = 'green' ;
```

|id|       name  |color|
|:-------------:|:-------------:|:------------:|
|03|  みほ  |pink|
|04| さやか  |green|
|06|  あい   |green|


###③任意の文字での絞り込み(LIKEを使用した条件設定)
最後に便利な`LIKE述語`を紹介します!
`LIKE`を使用することで柔軟な絞り込みを実現出来ます。

以下のデータテーブルを使って説明していきますね!
(とっても余談ですが、題材考えている時に、神社って確かに色々呼ばれ方あるけど違い理解してないな、、ってなりました(._.) )

Table名：Shrine

|  types    |
|:--------:|
|神社|
|東照宮|
| 神宮|
|大社|
|天満宮|
|稲荷|
|明神|

たとえば、"神"がつくものに絞りたいとき。
そんなときに便利なのが`%`を使用したLIKE述語です。

```sql
SELECT types
FROM Shrine
WHERE type LIKE '%神%' ;
```

このようなクエリを実行すると、以下のように"神"がつくものに絞ることが出来ます。

|  type    |
|:--------:|
|神社|
| 神宮|
|明神|

前に"神"がついている「神社」「神宮」だけでなく、後ろに"神"がついている「明神」も取得出来ていることがわかります。
これは、`%`が**0文字以上の任意の文字列**を指定する役割をもつからです。

では「天満宮」と「神宮」を区別したい時はどうすればよいでしょうか。
`%`を使用すると「天満宮」「神宮」どちらも取得してしまうことになります。

そんな時に使用するのが`_`です。
`_`は`%`と異なり、**任意の1文字**を指定することが出来ます。
なので、以下のようなクエリを実行すると、

```sql
SELECT types
FROM Shrine
WHERE type LIKE '_宮' ;
```
このように「神宮」だけを取り出すことが出来ます。

|  types    |
|:--------:|
| 神宮|


"宮"がついていない「稲荷」などはもちろん、"宮"の前に2文字ある「天満宮」や「東照宮」も除外することが出来ました。

以上を踏まえると、

```sql
WHERE type LIKE '_宮%'
```
と記述すれば「神宮」を取得出来ますが、

```sql

WHERE type LIKE '_宮_'
```
と記述すると今回のテーブル(Shrine)には該当データがないということになります。

`%`は**0文字以上の任意の文字列**を指定する
`_`は**任意の1文字**を指定する

からですね!
もちろん「○○宮○」のようなものがテーブル内に存在していれば、先ほどのどちらのクエリでもデータを取得することが出来るということになります。


このように`LIKE`はデータを探索する上で非常に便利です!

##まとめ
- `WHERE句`は**行方向**の絞り込みを行うために使用する
- `WHERE句`では等号や不等号を使用することができ、否定の場合は`NOT`を使用する
- 複数の条件を指定するには`IN`を使用する
- 任意の文字で絞り込む場合は`LIKE`を使用し、0文字以上の場合は`%`、任意の1文字の場合は`_`を使用する

##最後に
今回はWHERE句に関してまとめてみました！
いかかでしたでしょうか？
記事にまとめながら、自分の頭の中を改めて整理することが出来たような気がします。
もし間違いなど見つけた場合は優しく教えて頂けると嬉しいです><
ではまた次回！

追:@rye_442さんが否定の場合に関して教えてくださいました。ありがとうございましたmm

⇒[次の記事【GROUP BY句】](/saku-chan/items/951d36e75bfce3fbcb1f)

⇒[記事一覧](/saku-chan/items/48d36b6ad60d63206a18)