【SQL】基本的な確認系のコマンドについて書きます。(select等)

# はじめに
今までの業務でSQLに触れることが皆無だったので、現在勉強をしております。
その中で学んだSQLの基本的なコマンドについて学んだことを書きます。

:::note warn
全てのコマンドは網羅できておりません。
学習したコマンドのみご紹介しております。
:::

# SQLとは？
![file_sql_format_type_icon_134681.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/5fd8afd0-524e-7c9e-8e31-42b05803ba45.png)


データベースを操作するための言語になります。
データベースとは、データの集合体を格納した箱のようなものになります。

図にすると以下のようなイメージです。

![SQL.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/85f3e1d1-35a8-af9e-b346-a7bc353183b0.png)


詳しくは、以下リンクをご確認下さい。

https://www.bold.ne.jp/engineer-club/what-is-sql

# 今回使用する環境
MacOSにインストールしたMySQLサーバを使用します。
※導入済みということを前提に進めます。導入方法はまた別で記事を出します。

|  環境  |  バージョン  |
| ---- | ---- |
|  MacOS Monterey |  12.3.1  |
|  MySQL  |  8.0.29  |

```bash:MySQLバージョン
ma-sato@satsuton ~ % mysql --version
mysql  Ver 8.0.29 for macos12.2 on x86_64 (Homebrew)
ma-sato@satsuton ~ %
```

以下コマンドにて、MySQLサーバを起動済みの状態になります。

```bash:コマンド
mysql.server start
```

# 使用するテーブルの作成
以下のデータベースを使用します。

- **概要**

|  項目  |  内容  |
| ---- | ---- |
|  データベース |  testdb  |
|  テーブル  |  users  |

- **テーブル(users)**

|  id  |  last_name  | first_name | jobs | gender |
| ---- | ---- | ---- | ---- | ---- |
|  1 |  木村  | 一郎 | インフラエンジニア | 1 |
|  2  |  佐藤  | 二郎 | プログラマー | 1 |
|  3 |  河村  | 三郎 | インフラエンジニア | 1 |
|  4  |  岩田  | 四郎 | プログラマー | 1 |
|  5 |  山本  | 太郎 | 人事 | 1 |
|  6  |  平石  | 知子 | インフラエンジニア | 2 |
|  7 |  後藤  | 玲奈 | 人事 | 2 |
|  8  |  桑田  | 由紀 | 事務 | 2 |
|  9 |  梅澤  | 順子 | コーポレートエンジニア | 2 |
|  10  |  木原  | 拓海  | コーポレートエンジニア | 1 |

:::note info
`gender`の意味については、以下になります。
1 = 男性
2 = 女性
:::

# データベース作成手順
一応、データベースの作成手順についてもまとめてみました。
本記事は、確認系のコマンドの紹介にフォーカスしております。
そのため、完璧な手順ではないですが、気になる方はご覧下さい。

:::note info
コマンドラインで作成する手順になります。
余裕があればスクリプト化してみたいと思います。
:::

<details><summary>テーブル作成方法</summary><div>
※MySQLにログインしていることを前提に進めています。おそらく非効率な手順のためご了承下さい。

```bash:MySQLへのログイン例
ma-sato@satsuton ~ % mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 14
Server version: 8.0.29 Homebrew

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

## 1.データベース作成
- `testdb`データベースを作成します。

```sql:コマンド
create database testdb;
```

```sql:実行例
mysql> create database testdb;
Query OK, 1 row affected (0.01 sec)

mysql>
```

- データベースが作成されていることを確認

```sql:コマンド
show databases;
```

```sql:実行例
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb               |
| mysql              |
| performance_schema |
| sys                |
| testdb             |
+--------------------+
6 rows in set (0.00 sec)

mysql>
```

`like`を使用することにより、絞り込みも可能です。

```sql:コマンド
show databases like 'testdb%';
```

```sql:実行例
mysql> show databases like 'testdb%';
+--------------------+
| Database (testdb%) |
+--------------------+
| testdb             |
+--------------------+
1 row in set (0.00 sec)

mysql>
```

## 2.テーブル(users)作成・確認

:::note warn
今回はテーブル作成のみになります。
後日、別の記事にて構文の解説をやろうと思います。
:::

- テーブル作成

```sql:コマンド
CREATE TABLE `users` (
          `id` int NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT "ID",
          `last_name` VARCHAR(100) NOT NULL COMMENT "苗字",
          `first_name` VARCHAR(100) NOT NULL COMMENT "名前",
          `jobs` VARCHAR(100) NOT NULL COMMENT "仕事",
          `gender` int NOT NULL COMMENT "性別"
) DEFAULT CHARSET=utf8;
```

```sql:実行例
mysql> CREATE TABLE `users` (
    ->           `id` int NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT "ID",
    ->           `last_name` VARCHAR(100) NOT NULL COMMENT "苗字",
    ->           `first_name` VARCHAR(100) NOT NULL COMMENT "名前",
    ->           `jobs` VARCHAR(100) NOT NULL COMMENT "仕事",
    ->           `gender` int NOT NULL COMMENT "性別"
    -> ) DEFAULT CHARSET=utf8;
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql>
```

- テーブルが作成されていることを確認

```sql:コマンド
show tables:
```

```sql:実行例
mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| users            |
+------------------+
1 row in set (0.00 sec)

mysql>
```

- テーブルの構造に誤りがないことを確認

```sql:コマンド
describe users;
```

```sql:実行例
mysql> describe users;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int          | NO   | PRI | NULL    | auto_increment |
| last_name  | varchar(100) | NO   |     | NULL    |                |
| first_name | varchar(100) | NO   |     | NULL    |                |
| jobs       | varchar(100) | NO   |     | NULL    |                |
| gender     | int          | NO   |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
5 rows in set (0.01 sec)

mysql>
```

- テーブルが空であることを確認

```sql:コマンド
select * from users;
```

```sql:実行例
mysql> select * from users;
Empty set (0.00 sec)

mysql>
```

## 3.データ投入

- データ投入

```sql:コマンド
insert into users
  (id,last_name,first_name,jobs,gender)
values
  (1,"木村","一郎","インフラエンジニア",1),
  (2,"佐藤","二郎","プログラマー",1),
  (3,"河村","三郎","インフラエンジニア",1),
  (4,"岩田","四郎","プログラマー",1),
  (5,"山本","太郎","人事",1),
  (6,"平石","知子","インフラエンジニア",2),
  (7,"後藤","玲奈","人事",2),
  (8,"桑田","由紀","事務",2),
  (9,"梅澤","順子","コーポレートエンジニア",2),
  (10,"木原","拓海","コーポレートエンジニア",1);
```

```sql:実行例
mysql> insert into users
    ->   (id,last_name,first_name,jobs,gender)
    -> values
    ->   (1,"木村","一郎","インフラエンジニア",1),
    ->   (2,"佐藤","二郎","プログラマー",1),
    ->   (3,"河村","三郎","インフラエンジニア",1),
    ->   (4,"岩田","四郎","プログラマー",1),
    ->   (5,"山本","太郎","人事",1),
    ->   (6,"平石","知子","インフラエンジニア",2),
    ->   (7,"後藤","玲奈","人事",2),
    ->   (8,"桑田","由紀","事務",2),
    ->   (9,"梅澤","順子","コーポレートエンジニア",2),
    ->   (10,"木原","拓海","コーポレートエンジニア",1);
Query OK, 10 rows affected (0.00 sec)
Records: 10  Duplicates: 0  Warnings: 0

mysql>
```

以下の記事を参考にしました。
[1回のINSERT（インサートSQL）で複数行のレコードを一括挿入（追加）する](https://johobase.com/multiple-insert-sql/)


- データ投入後確認

```sql:コマンド
select * from users;
```

```sql:実行例
mysql> select * from users;
+----+-----------+------------+-----------------------------------+--------+
| id | last_name | first_name | jobs                              | gender |
+----+-----------+------------+-----------------------------------+--------+
|  1 | 木村      | 一郎       | インフラエンジニア                      |      1 |
|  2 | 佐藤      | 二郎       | プログラマー                          |      1 |
|  3 | 河村      | 三郎       | インフラエンジニア                      |      1 |
|  4 | 岩田      | 四郎       | プログラマー                          |      1 |
|  5 | 山本      | 太郎       | 人事                                |      1 |
|  6 | 平石      | 知子       | インフラエンジニア                      |      2 |
|  7 | 後藤      | 玲奈       | 人事                                |      2 |
|  8 | 桑田      | 由紀       | 事務                                |      2 |
|  9 | 梅澤      | 順子       | コーポレートエンジニア                    |      2 |
| 10 | 木原      | 拓海       | コーポレートエンジニア                    |      1 |
+----+-----------+------------+-----------------------------------+--------+
10 rows in set (0.00 sec)

mysql>
```

</div></details>

# SQLの基本的な確認コマンド
SQLの基本的な確認コマンドをざっくばらんにご紹介していきます。

## データベース一覧の確認
以下コマンドにてデータベース一覧を確認することが可能です。

```sql:コマンド
show databases;
```

```sql:実行例
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb               |
| mysql              |
| performance_schema |
| sys                |
| testdb             |
+--------------------+
6 rows in set (0.00 sec)

mysql>
```

## データベースの指定
テーブルを参照する際には、事前にデータベースを指定する必要があります。

```sql:コマンド
use データベース名;
```

```sql:実行例
mysql> use testdb;
Database changed
mysql>
```

## テーブル一覧の確認
上記にてデータベース指定後に以下コマンドにてテーブル一覧を確認することが可能です。

```sql:コマンド
show tables;
```

```sql:実行例
mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| users            |
+------------------+
1 row in set (0.00 sec)

mysql>
```

## テーブルの構文確認
以下コマンドにてテーブルの構文について確認が可能です。

```sql:コマンド
describe テーブル名;
```

```sql:実行例
mysql> describe users;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int          | NO   | PRI | NULL    | auto_increment |
| last_name  | varchar(100) | NO   |     | NULL    |                |
| first_name | varchar(100) | NO   |     | NULL    |                |
| jobs       | varchar(100) | NO   |     | NULL    |                |
| gender     | int          | NO   |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

mysql>
```

それぞれの項目の意味については、以下になります。

|  項目  |  意味  |  備考  |
| ---- | ---- | ---- |
|  Field |  カラム名  | `id`や`last_name`等の項目  |
| Type  |  データ型  | intやvarchar等  |
|  Null |  Null値を格納できるかどうか  | 格納できる場合:Yes<br>格納できない場合:No  |
|  Key  |  インデックス設定がされているか  | 主キー（PRIMARY KEY）の場合は`PRI`<br>UNIQUEインデックスの場合は`UNI`<br>同じ値が現れることが許可されているインデックスの場合は`MUL`  |
|  Default  |  デフォルト値  | 何も設定されていない場合は`NULL`  |
|  Extra  |  追加情報  | `auto_increment`など  |

以下の記事を参考にしました。

https://26gram.com/mysql-describe

## テーブル確認

### テーブル内の全てを確認

```sql:コマンド
select * from テーブル名
```

```sql:実行例
mysql>
mysql> select * from users;
+----+-----------+------------+-----------------------------------+--------+
| id | last_name | first_name | jobs                              | gender |
+----+-----------+------------+-----------------------------------+--------+
|  1 | 木村      | 一郎       | インフラエンジニア                |      1 |
|  2 | 佐藤      | 二郎       | プログラマー                      |      1 |
|  3 | 河村      | 三郎       | インフラエンジニア                |      1 |
|  4 | 岩田      | 四郎       | プログラマー                      |      1 |
|  5 | 山本      | 太郎       | 人事                              |      1 |
|  6 | 平石      | 知子       | インフラエンジニア                |      2 |
|  7 | 後藤      | 玲奈       | 人事                              |      2 |
|  8 | 桑田      | 由紀       | 事務                              |      2 |
|  9 | 梅澤      | 順子       | コーポレートエンジニア            |      2 |
| 10 | 木原      | 拓海       | コーポレートエンジニア            |      1 |
+----+-----------+------------+-----------------------------------+--------+
10 rows in set (0.00 sec)

mysql>
```

### 一部の列のみ表示

```sql:コマンド
select 列1,列2 from テーブル名;
```

以下の例では、`id`と`last_name`の行のみ表示させています・

```sql:実行例
mysql> select id,last_name from users;
+----+-----------+
| id | last_name |
+----+-----------+
|  1 | 木村      |
|  2 | 佐藤      |
|  3 | 河村      |
|  4 | 岩田      |
|  5 | 山本      |
|  6 | 平石      |
|  7 | 後藤      |
|  8 | 桑田      |
|  9 | 梅澤      |
| 10 | 木原      |
+----+-----------+
10 rows in set (0.00 sec)

mysql>
```

### 一部の行のみ表示

```sql:コマンド
select 列指定(or *) from テーブル名 where カラム名 = 値;
```

以下の例では、テーブル(users)の1行目の全ての列を抽出しております。

```sql:実行例
mysql> select * from users where id = '1';
+----+-----------+------------+-----------------------------+--------+
| id | last_name | first_name | jobs                        | gender |
+----+-----------+------------+-----------------------------+--------+
|  1 | 木村      | 一郎       | インフラエンジニア          |      1 |
+----+-----------+------------+-----------------------------+--------+
1 row in set (0.00 sec)

mysql>
```

列を指定する場合は、以下になります・

```sql:実行例
mysql> select id,jobs,gender from users where id = '1';
+----+-----------------------------+--------+
| id | jobs                        | gender |
+----+-----------------------------+--------+
|  1 | インフラエンジニア          |      1 |
+----+-----------------------------+--------+
1 row in set (0.00 sec)

mysql>
```

jobsで指定してみます。(インフラエンジニア)

```sql:実行例
mysql> select * from users where jobs = 'インフラエンジニア';
+----+-----------+------------+-----------------------------+--------+
| id | last_name | first_name | jobs                        | gender |
+----+-----------+------------+-----------------------------+--------+
|  1 | 木村      | 一郎       | インフラエンジニア          |      1 |
|  3 | 河村      | 三郎       | インフラエンジニア          |      1 |
|  6 | 平石      | 知子       | インフラエンジニア          |      2 |
+----+-----------+------------+-----------------------------+--------+
3 rows in set (0.00 sec)

mysql>
```

### 取得件数(表示される行)の制限

```sql:コマンド
select 列指定(or *) from テーブル名 limit 行数;
```

5行で制限する。

```sql:実行例
mysql> select * from users limit 5;
+----+-----------+------------+-----------------------------+--------+
| id | last_name | first_name | jobs                        | gender |
+----+-----------+------------+-----------------------------+--------+
|  1 | 木村      | 一郎       | インフラエンジニア          |      1 |
|  2 | 佐藤      | 二郎       | プログラマー                |      1 |
|  3 | 河村      | 三郎       | インフラエンジニア          |      1 |
|  4 | 岩田      | 四郎       | プログラマー                |      1 |
|  5 | 山本      | 太郎       | 人事                        |      1 |
+----+-----------+------------+-----------------------------+--------+
5 rows in set (0.00 sec)

mysql>
```

3行で制限する。

```sql:実行例
mysql> select * from users limit 3;
+----+-----------+------------+-----------------------------+--------+
| id | last_name | first_name | jobs                        | gender |
+----+-----------+------------+-----------------------------+--------+
|  1 | 木村      | 一郎       | インフラエンジニア          |      1 |
|  2 | 佐藤      | 二郎       | プログラマー                |      1 |
|  3 | 河村      | 三郎       | インフラエンジニア          |      1 |
+----+-----------+------------+-----------------------------+--------+
3 rows in set (0.00 sec)

mysql>
```

### パターンマッチング

```sql:コマンド
select 列指定(or *) from テーブル名 whare 指定する列 like '文字列'; 
```

`first_name`の`郎`より前に文字がある行を抽出します。

```sql:実行例
mysql> select * from users where first_name like  '%郎';
+----+-----------+------------+-----------------------------+--------+
| id | last_name | first_name | jobs                        | gender |
+----+-----------+------------+-----------------------------+--------+
|  1 | 木村      | 一郎       | インフラエンジニア          |      1 |
|  2 | 佐藤      | 二郎       | プログラマー                |      1 |
|  3 | 河村      | 三郎       | インフラエンジニア          |      1 |
|  4 | 岩田      | 四郎       | プログラマー                |      1 |
|  5 | 山本      | 太郎       | 人事                        |      1 |
+----+-----------+------------+-----------------------------+--------+
5 rows in set (0.00 sec)

mysql>
```

`first_name`の`郎`より後に文字がある行を抽出しようとした場合、何も表示されない。

```sql:実行例
mysql> select * from users where first_name like  '郎%';
Empty set (0.00 sec)

mysql>
```

`first_name`を`一郎`で絞る。

```sql:実行例
mysql> select * from users where first_name like  '一郎';
+----+-----------+------------+-----------------------------+--------+
| id | last_name | first_name | jobs                        | gender |
+----+-----------+------------+-----------------------------+--------+
|  1 | 木村      | 一郎       | インフラエンジニア          |      1 |
+----+-----------+------------+-----------------------------+--------+
1 row in set (0.00 sec)

mysql>
```

# さいごに
列の値に対して演算を実施する方法等、他にも確認コマンドがあります。
しかし、こちらについて等はまた別の機会にご紹介します。
今回は、触りだけのアウトプットになります。