SQL　LIKE句について整理してみた

現在SQLについて学習をしています。
タイトルにある通り、LIKE演算子とワイルドカードについて頭の中でぐちゃぐちゃになってしまったので1度整理したいと思います。

## LIKE句とは
・曖昧な文字列を検索するときに使用し、パターンにあっているものを抽出することができるSQLの命令の１つ。

以下ような構文で使用します。

```sql:LIKE句

SELECT 列名 FROM テーブル名 WHERE 列名 LIKE '検索内容';
```
上記構文内の``検索内容``のところにワイルドカードを使用することで、曖昧検索を行うことができます。
## ワイルドカードとは
> 任意の文字列を指定する際に使用する特殊文字のこと

参照先：https://wa3.i-3-i.info/word11613.html

特定の文字と決まっているわけではないけれど任意の1文字や任意の文字列を当てはめることができるのがワイルドカードです。


|ワイルドカード文字|	意味|
|-------------|---- |
|%|	0文字以上の任意の文字列|
|_|	任意の1文字|
それでは早速、LIKE句と組み合わせて使っていこうと思います。
今回は以下のようなProductテーブルを使用します。

|id  |name  |price|
|---|---|---|
|1  |コルクボード  |300 |
|2  |ホワイトボードabc |3,000 |
|3  |シャープペンシルABC　 |500|
|4  |コルク40%|200|
|5  |ウルトラシャープ0.3|800|

## 前方一致

前方一致は検索条件の最後に「%」を記載します。
・先頭に「コルク」がつく商品を検索

```sql
SELECT * FROM products WHERE name LIKE 'コルク%';
```

```
+----+--------------------+-------+
| id | name               | price |
+----+--------------------+-------+
|  1 | コルクボード         　|   300 |
|  4 | コルク40%            |   200 |
+----+--------------------+-------+
```

## 後方一致

後方一致は検索条件の最初に「%」を記載します。
・最後が「abc」がの商品を検索

```sql
SELECT * FROM products WHERE name LIKE '%abc'
```

```
+----+-----------------------------+-------+
| id | name                        | price |
+----+-----------------------------+-------+
|  2 | ホワイトボードabc　　　　　　　　 　|  3000 |
|  3 | シャープペンシルABC             |   500 |
+----+-----------------------------+-------+
```

この場合、abcは大文字小文字区別なく検索対象となります。
もし、区別したい場合は``BINARY``をつけてあげます。
・abcの後方一致を検索

```sql
SELECT * FROM products WHERE name NOT LIKE BINARY '%abc';
```

```
+----+--------------------------+-------+
| id | name                     | price |
+----+--------------------------+-------+
|  2 | ホワイトボードabc            |  3000 |
+----+--------------------------+-------+
```

・ABCの後方一致を検索

```sql
SELECT * FROM products WHERE name NOT LIKE BINARY '%ABC';
```

```
+----+-----------------------------+-------+
| id | name                        | price |
+----+-----------------------------+-------+
|  3 | シャープペンシルABC        　　  |   500 |
+----+-----------------------------+-------+
```


##部分検索

部分検索は検索したい文字列を%で挟みます。
・「シャープ」という文字列を含む商品を検索

```sql
SELECT * FROM products WHERE name LIKE '%シャープ%';
```

```
+----+-----------------------------+-------+
| id | name                        | price |
+----+-----------------------------+-------+
|  3 | シャープペンシルABC       　　   |   500 |
|  5 | ウルトラシャープ0.3       　　  　|   800 |
+----+-----------------------------+-------+

```

ここで私は``%シャープ%``で検索を行うということはシャープペンシルABCは弾かれてしまうのでは？(先頭に文字列が入っていないため)」と疑問を抱きました。
ですが、[ワイルドカードとは](#ワイルドカードとは)で記述した通り``%``は「**0文字以上の**任意の文字列」を表しているため検索対象が先頭にあろうと一番後ろにあろうとマッチしてくれます。

##否定

``NOT LIKE``とすることで否定で検索できます。
・「シャープ」という文字列を含まない商品を検索

```sql
SELECT * FROM products WHERE name NOT LIKE '%シャープ%';
```

```
+----+--------------------------+-------+
| id | name                     | price |
+----+--------------------------+-------+
|  1 | コルクボード               　|   300 |
|  2 | ホワイトボードabc         　  |  3000 |
|  4 | コルク40%                  |   200 |
+----+--------------------------+-------+

```

##任意の１文字を指定して検索
今までは%を使ってきました、次はアンダースコア( _ )を使っていきます。
・「〇〇〇ボード」という文字列の商品を検索(ボードの前に３文字入る)

```sql
SELECT * FROM products WHERE name LIKE '___ボード';
```

```
+----+--------------------+-------+
| id | name               | price |
+----+--------------------+-------+
|  1 | コルクボード        　 |   300 |
+----+--------------------+-------+

```

``_``が任意の１文字を表しているため、``___ボード``とすることでホワイトボードabcは抽出されずにコルクボード のみが抽出されます。


##％を文字列として検索を行う
今までワイルドカードを用いた曖昧検索を行ってきましたが、%を文字列として検索を行う場合は以下のようにします。

```sql
SELECT * FROM products WHERE name LIKE '%\%%';
```

```
+----+--------------+-------+
| id | name         | price |
+----+--------------+-------+
|  4 | コルク40%      |   200 |
+----+--------------+-------+

```

アンダースコアも同じ方法で文字列として検索を行うことができます。

以上、現状学習した内容をまとめてみました！