[MySQL]データ検索をする

# はじめに

今回はデータの検索について忘れないように

メモしていきます。

SELECT構文を使用して検索していきます。


# こちらを使用

- WHERE

- LIKE

- AND演算子

- OR演算子

- NOT演算子

- BETWEEN演算子

- IN演算子

- GROUP BY

- BINARY

- DESC

- LIMIT

- OFFSET

- NULL, NOT NULL



# 使ってみる！

今回はこのようなテーブルを用意しましたのでデータを抽出していきます。

```sql
mysql> select * from sample;
+----+---------+-----------------+-------+
| id | name    | message         | point |
+----+---------+-----------------+-------+
|  1 | taro    | こんにちは      |     3 |
|  2 | michiko | こんばんは      |    55 |
|  3 | sumi    | おはよう        |     3 |
|  4 | jiro    | こんにちは      |     7 |
|  5 | saburo  | おはよう        |    10 |
+----+---------+-----------------+-------+
5 rows in set (0.01 sec)
```

<br>

まずテーブルの中の全てのデータを抽出したい場合は
「＊」を使用します。全てのカラムを選択してくれます。

```sql

SELECT * FROM posts;  --* 全てのカラム

```


特定のものを取り出したい場合は

```sql

mysql> SELECT id, message FROM sample;
+----+-----------------+
| id | message         |
+----+-----------------+
|  1 | こんにちは      |
|  2 | こんばんは      |
|  3 | おはよう        |
|  4 | こんにちは      |
|  5 | おはよう        |
+----+-----------------+
5 rows in set (0.00 sec)

```

## 「WHERE」 を使う

WHEREの後に条件をつけると検索したいものを指定することができます。
今回は「point」が10ポイント以上のものを検索します。

```sql

mysql> SELECT * FROM sample WHERE point >= 10;
+----+---------+-----------------+-------+
| id | name    | message         | point |
+----+---------+-----------------+-------+
|  2 | michiko | こんばんは      |    55 |
|  5 | saburo  | おはよう        |    10 |
+----+---------+-----------------+-------+
2 rows in set (0.00 sec)

```

文字も同じように検索することができます。
「こんにちは」を検索します。

```sql
mysql> SELECT * FROM sample WHERE message = 'こんにちは';
+----+------+-----------------+-------+
| id | name | message         | point |
+----+------+-----------------+-------+
|  1 | taro | こんにちは      |     3 |
|  4 | jiro | こんにちは      |     7 |
+----+------+-----------------+-------+
2 rows in set (0.00 sec)
```

### 「AND」 を使う

「WHERE」の後ろの条件が二つとも合ったものを検索します。

```SQL
mysql> SELECT * FROM sample WHERE point >= 8 AND point <= 20;
+----+--------+--------------+-------+
| id | name   | message      | point |
+----+--------+--------------+-------+
|  5 | saburo | おはよう     |    10 |
+----+--------+--------------+-------+
1 row in set (0.00 sec)
```

#### 「BETWEEN」 を使用すると上記のものと同じものが検索されます。
　　　（書き方は違いますが出てくるものは同じ）

```sql
mysql> SELECT * FROM sample WHERE point BETWEEN 8 AND 20;
+----+--------+--------------+-------+
| id | name   | message      | point |
+----+--------+--------------+-------+
|  5 | saburo | おはよう     |    10 |
+----+--------+--------------+-------+
1 row in set (0.00 sec)

```

#### 「NOT」 を使用すると逆の条件のものが抽出されます。

```sql

mysql> SELECT * FROM sample WHERE point NOT BETWEEN 10 AND 20;
+----+---------+-----------------+-------+
| id | name    | message         | point |
+----+---------+-----------------+-------+
|  1 | taro    | こんにちは      |     3 |
|  2 | michiko | こんばんは      |    55 |
|  3 | sumi    | おはよう        |     3 |
|  4 | jiro    | こんにちは      |     7 |
+----+---------+-----------------+-------+
4 rows in set (0.00 sec)

```

### 「OR」 を使う

「7」 もしくは 「10」 の pointのものを検索します。

```sql

mysql> SELECT * FROM sample WHERE point = 7 OR point = 10;
+----+--------+-----------------+-------+
| id | name   | message         | point |
+----+--------+-----------------+-------+
|  4 | jiro   | こんにちは      |     7 |
|  5 | saburo | おはよう        |    10 |
+----+--------+-----------------+-------+
2 rows in set (0.00 sec)

```

#### 「IN」 を使用すると上記と同じ条件のものが検索されます。

```sql

mysql> SELECT * FROM sample WHERE point IN (7, 10);
+----+--------+-----------------+-------+
| id | name   | message         | point |
+----+--------+-----------------+-------+
|  4 | jiro   | こんにちは      |     7 |
|  5 | saburo | おはよう        |    10 |
+----+--------+-----------------+-------+
2 rows in set (0.00 sec)

```

#### こちらも 「NOT」 を使用すると逆の条件のものが抽出されます。

```sql

mysql> SELECT * FROM sample WHERE point NOT IN (7, 10);
+----+---------+-----------------+-------+
| id | name    | message         | point |
+----+---------+-----------------+-------+
|  1 | taro    | こんにちは      |     3 |
|  2 | michiko | こんばんは      |    55 |
|  3 | sumi    | おはよう        |     3 |
+----+---------+-----------------+-------+
3 rows in set (0.00 sec)

```

## 「LIKE」 を使う

「LIKE」 を使うと特殊な記号も使用することができます。

「 `%` 」パーセント記号 →　任意の文字列（空白文字列を含む）（1文字以上）

「 `_` 」アンダースコア記号 →　任意の1文字


はじめの文字が「お」のものを検索してみます。

```sql
mysql> SELECT * FROM sample WHERE message LIKE 'お%';
+----+--------+--------------+-------+
| id | name   | message      | point |
+----+--------+--------------+-------+
|  3 | sumi   | おはよう     |     3 |
|  5 | saburo | おはよう     |    10 |
+----+--------+--------------+-------+
2 rows in set (0.00 sec)

```

#### 英語の場合は「BINARY」を使用すると大文字と小文字を区別してくれます。

```sql

mysql> SELECT * FROM sample WHERE name LIKE BINARY 's%';
+----+--------+--------------+-------+
| id | name   | message      | point |
+----+--------+--------------+-------+
|  3 | sumi   | おはよう     |     3 |
|  5 | saburo | おはよう     |    10 |
+----+--------+--------------+-------+
2 rows in set (0.00 sec)

--大文字だと・・・

mysql> SELECT * FROM sample WHERE name LIKE BINARY 'S%';
Empty set (0.00 sec)

--空ですね。

```
「％」を使用して間に希望の文字が入っているものを検索する
**部分一致**や
**後方一致**などで検索することができます。

```sql
--部分一致

mysql> SELECT * FROM sample WHERE message LIKE '%ば%';
+----+---------+-----------------+-------+
| id | name    | message         | point |
+----+---------+-----------------+-------+
|  2 | michiko | こんばんは      |    55 |
+----+---------+-----------------+-------+
1 row in set (0.00 sec)


--後方一致

mysql> SELECT * FROM sample WHERE message LIKE  '%う';
+----+--------+--------------+-------+
| id | name   | message      | point |
+----+--------+--------------+-------+
|  3 | sumi   | おはよう     |     3 |
|  5 | saburo | おはよう     |    10 |
+----+--------+--------------+-------+
2 rows in set (0.00 sec)

```

「_」を使用して文字数を限定して検索します。
3番目に「に」のついたものを検索します。

```sql
mysql> SELECT * FROM sample WHERE message LIKE '__に%';
+----+------+-----------------+-------+       -- ↑アンダースコア二つ
| id | name | message         | point |
+----+------+-----------------+-------+
|  1 | taro | こんにちは      |     3 |
|  4 | jiro | こんにちは      |     7 |
+----+------+-----------------+-------+
2 rows in set (0.00 sec)
```

## 「ORDER BY」 を使う

検索結果の順番を並び替えたい場合に使用します。

「ORDER BY」の後に指定したいものを記述するとまずは小さい順に並び変わります。

```sql

mysql> SELECT * FROM sample ORDER BY point;
+----+---------+-----------------+-------+
| id | name    | message         | point |
+----+---------+-----------------+-------+
|  1 | taro    | こんにちは      |     3 |
|  3 | sumi    | おはよう        |     3 |
|  4 | jiro    | こんにちは      |     7 |
|  5 | saburo  | おはよう        |    10 |
|  2 | michiko | こんばんは      |    55 |
+----+---------+-----------------+-------+
5 rows in set (0.00 sec)


```

#### さらに一番後ろに「DESC」と記述すると大きい順に並べてくれます。

```sql

mysql> SELECT * FROM sample ORDER BY point DESC;
+----+---------+-----------------+-------+
| id | name    | message         | point |
+----+---------+-----------------+-------+
|  2 | michiko | こんばんは      |    55 |
|  5 | saburo  | おはよう        |    10 |
|  4 | jiro    | こんにちは      |     7 |
|  1 | taro    | こんにちは      |     3 |
|  3 | sumi    | おはよう        |     3 |
+----+---------+-----------------+-------+
5 rows in set (0.00 sec)

```

#### さらにーーー、後ろにもう一つカラムを指定すると、
今回の場合は「point」が大きい順に並んでおり、次に指定した「message」のpointが「３」の部分が あいうえお順で並べられているのがわかります。

```sql

mysql> SELECT * FROM sample ORDER BY point DESC, message;
+----+---------+-----------------+-------+
| id | name    | message         | point |
+----+---------+-----------------+-------+
|  2 | michiko | こんばんは      |    55 |
|  5 | saburo  | おはよう        |    10 |
|  4 | jiro    | こんにちは      |     7 |
|  3 | sumi    | おはよう        |     3 |
|  1 | taro    | こんにちは      |     3 |
+----+---------+-----------------+-------+
5 rows in set (0.00 sec)


```

#### 「LIMIT」 を使用すると検索する数が指定できます。

```sql
--条件を指定せず

mysql> SELECT * FROM sample LIMIT 3;
+----+---------+-----------------+-------+
| id | name    | message         | point |
+----+---------+-----------------+-------+
|  1 | taro    | こんにちは      |     3 |
|  2 | michiko | こんばんは      |    55 |
|  3 | sumi    | おはよう        |     3 |
+----+---------+-----------------+-------+
3 rows in set (0.00 sec)


--条件を増やしてさらに数を指定

mysql> SELECT * FROM sample ORDER BY point DESC, message LIMIT 3;
+----+---------+-----------------+-------+
| id | name    | message         | point |
+----+---------+-----------------+-------+
|  2 | michiko | こんばんは      |    55 |
|  5 | saburo  | おはよう        |    10 |
|  4 | jiro    | こんにちは      |     7 |
+----+---------+-----------------+-------+
3 rows in set (0.00 sec)

```

#### 「OFFSET」 を使用して検索したい場所指定します。

```sql

--「message」三つを2番目から抽出したい
                --(0からで数えます。)

mysql> SELECT * FROM sample ORDER BY point DESC, message LIMIT 3 OFFSET 2;
+----+------+-----------------+-------+
| id | name | message         | point |
+----+------+-----------------+-------+
|  4 | jiro | こんにちは      |     7 |    --[2]番目
|  3 | sumi | おはよう        |     3 |    --[3]番目N
|  1 | taro | こんにちは      |     3 |    --[4]番目
+----+------+-----------------+-------+
3 rows in set (0.00 sec)

```

**次のようにすると上記と同じ意味になります。**

```sql
--先頭から数えて2番目のものを三つ取り出す

mysql> SELECT * FROM sample ORDER BY point DESC, message LIMIT 2, 3;
+----+------+-----------------+-------+
| id | name | message         | point |
+----+------+-----------------+-------+
|  4 | jiro | こんにちは      |     7 |
|  3 | sumi | おはよう        |     3 |
|  1 | taro | こんにちは      |     3 |
+----+------+-----------------+-------+
3 rows in set (0.00 sec)

```

### ちなみに「NULL」を検索したい場合

```sql

SELECT * FROM sample WHERE point != 7 OR point IS NULL;

      -- とか

SELECT * FROM sample WHERE point IS NOT NULL; --NULL以外のものを抽出

```

#### & 「COUNT」 を使って数を数える

```sql
mysql> SELECT COUNT( * ) FROM sample;
+------------+
| COUNT( * ) |
+------------+
|          5 |
+------------+
1 row in set (0.00 sec)

```

# まとめ

基本的なものを学習しました。

早く慣れて確認しなくても検索できるようにしたいです:paw_prints:　


# 参考

[SELECT構文：WHEREで検索条件を設定する](https://rfs.jp/sb/sql/s03/03_2-2.html)


[SQLで数を数えよう!COUNT関数の基本から応用まで!](https://www.sejuku.net/blog/72910)