データ分析を効果的に行うためのSQL構文の基礎[SQL]

# **はじめに**
データ分析するにあたってSQLを使いこなせるようになる必要が出てきました。
ですので、ここに自分の為の備忘録として、SQL文を用途に応じて列挙しておきます。


# **SQLとは**
**Structured Query Language**の略で、リレーショナルデータベース（RDB）の操作を行うための言語です。
SQLはデータベースやテーブルに対して様々な命令を行いますが、その命令は大まかに2つに分けることができます。
それは、データを定義する**DDL（Data Definition Language）**と、データを操作する**DML（Data Manipulation Language）**です。

- DDLの出来ること

|命令               |機能                  | 
|:-----------------|:--------------------:|
| CREATE     　　　　    |データベースやテーブルの作成|
| ALTER            |データベースやテーブルの更新|
| DROP             |データベースやテーブルの削除|


- DMLの出来ること

|命令              |機能      | 
|:----------------|:--------:|
|INSERT     　　　　    |データの登録|
|UPDATE           |データの更新|
|DELETE           |データの削除|
|SELECT           |データの検索|


# **コマンド群**
SQLは大文字で記述されることが多いですが、個人的には、小文字で記述することが大半なので、LOWERCASEで書いていきます。

まずは、`mysqlにユーザ名rootで接続します。`

```
$ mysql -u root
```

####**データベース一覧を表示**

```
mysql> show databases;
```

####**データベース（仮：sql_practice）を作成**

```
mysql> create database sql_practice
```

####**利用データベースを選択**

```
mysql> use sql_practice;
```

####**テーブルの一覧を表示**

```
mysql> show tables;
```

####**カラムの型と名前を指定しテーブル作成**

```
mysql> create table users (id int, family_name varchar(255), first_name varchar(255));
```

####**テーブル構造を確認**

```
mysql> show columns from users;
```

####**テーブル構造の変更（カラム追加）**

```
mysql> alter table users add (email varchar(255), profile_photo varchar(255));
```

####**テーブル構造の変更（カラム名変更）**

```
mysql> alter table users change profile_photo image varchar(255);
```

####**テーブル構造の変更（カラム削除）**

```
mysql> alter table users drop image;
```

####**取得するカラムを指定**

```
mysql> select family_name from users;
```

####**全てのカラムを取得**

```
mysql> select * from users;
```

####**取得するレコードの制限**

```
mysql> select * from users where family_name = "古川";
```

####**論理演算子で制限（AND）**

```
mysql> select * from users where age <= 25 and prefecture = "大阪";
```

####**論理演算子で制限（OR）**

```
mysql> select * from users where age >= 25 or prefecture = "大阪";
```

####**論理演算子で制限（NOT）**

```
mysql> select * from users where not prefecture = "大阪";
```

####**単一カラムの範囲検索**

```
mysql> select * from users where age between 20 and 25;
```

####**単一カラムのリスト検索**

```
mysql> select * from users where prefecture in ("大阪", "京都");
```

####**データの結合**

```
mysql> select concat(family_name, first_name) from users;
```

####**検索結果のカラム名の変更**

```
mysql> select concat(family_name, first_name) as "名前" from users;
```
asは省略できます。

```
mysql> select concat(family_name, first_name) "名前" from users;
```

####**重複する行の除外**

```
mysql> select distinct user_id from tweets where data = "2018-07-07";
```

####**レコードのグループ化**

```
mysql> select user_id from tweets where data = "2018-07-07" group by user_id;
```

`distinct`と一見同じように見えるが、こちらは、**グループ単位で集計した結果を取得することが出来る**。

####**レコードの数を数える**

```
mysql> select user_id, count(*) from tweets where date = "2018-07-07" group by user_id;
```
これは、**2018-07-07に誰が、何回ずつツイートしたか**、を表しています。

####**カラム名の変更**

```
mysql> select user_id, count(*) as "ツイート数" from tweets where date = "2018-07-07" group by user_id;
```

####**テーブルの結合**

```
mysql> select user_id, count(*) "ツイート数", u.* from tweets t join users u on t.user_id = u.id where date = "2018-07-07" group by user_id;
```

**`JOIN`を使用すると、複数のテーブルの、指定したカラムの値が一致するデータを結合することが出来る**。

####**検索結果を用いた検索（サブクエリ）**

```
mysql> select * from users where id not in (select distinct user_id from tweets where date = "2018-07-07");
```

これは、2018-07-07にツイートしていない人を取得しています。

# **まとめ**
備忘録としてまとめたため、読み手に配慮された説明がなされていなかったかもしれませんが、ご容赦ください。

役に立った方は、いいね、お願いします(^^)