【SQL基礎】データの取得・加工

# はじめに
最近SQLの学習を始めたので、その内容を整理していきます。

# 本記事の概要
#### どんな人に読んで欲しいか
- SQLの学習を始めたばかりの人
- データの取得・加工の基本的な操作方法をまだ整理できていない人

#### この記事に書くこと
- SQLを使ってデータベースから特定のデータを取得する基本的なクエリの書き方
- 取得したデータを並び替えるなど、基本的なデータの加工方法

#### 目次
- `SELECT`
- `FROM`
- `WHERE`
- `ORDER BY, LIMIT`

#### 今回用いるテーブルデータ

お惣菜屋さんの売り上げデータと想定します。販売した商品名と販売者名、売り上げ金額から構成されています。

sales_data
|food|name|sales|
|:---:|:---:|:---:|
|ローストビーフ|あさひ|2000|
|ハンバーグ|たかと|1000|
|ローストビーフ|たつや||
|ハンバーグ|ゆうき|1000|
|ローストビーフ|たかと|3000|
|ローストビーフ|たつや|1000|
|ハム|たかと|500|

# 具体的な内容

## SELECT
まず一番初めに`SELECT`を使ってテーブルのどのカラムからデータを取得するかを指定します。例えば、foodのカラムを取り出したいときは、

```sql
SELECT food
```
とします。
しかし、このままではデータを取得することはできません。どのテーブルデータなのかを指定していないからです。そこで次の`FROM`を使います。

## FROM
先ほどカラムを指定するためにSELECTを使用しました。ただ、カラムを指定するには、どのテーブルデータから取り出すのかを明示しなければなりません。その時に用いるのが`FROM`です。今回であれば、sales_dataのテーブルを使っているので次のように指定します。

```sql
SELECT food
FROM sales_data;
```
最後にセミコロン`;`がついていると思います。これはここまでがクエリであるということをデータベースに伝える役割をしています。なので、最後に必ずセミコロンを忘れないようにします。

個人的には`SELECT`と`FROM`順番逆の方がわかりやすいなと思ったのですが、最初に`SELECT`を持ってくるらしいです。

※クエリ：データベースに対して情報を取得したり、データを操作するための要求や命令文のことを指します。

実行結果
|food|
|:---:|
|ローストビーフ|
|ハンバーグ|
|ローストビーフ|
|ハンバーグ|
|ローストビーフ|
|ローストビーフ|
|ハム|

このようにfoodのカラムを取り出すことができました。

### 複数のカラムを取り出したい時
この場合は`SELECT`の時に複数のカラムを指定するだけでOKです。

```sql
SELECT food, name
FROM sales_data;
```
実行結果
|food|name|
|:---:|:---:|
|ローストビーフ|あさひ|
|ハンバーグ|たかと|
|ローストビーフ|たつや|
|ハンバーグ|ゆうき|
|ローストビーフ|たかと|
|ローストビーフ|たつや|
|ハム|たかと|

### 全てのカラムを取り出したい時
この場合は`*`を用いて`SELECT *`とすればOKです。

## WHERE
これまではテーブルのカラムを指定してデータを取り出す基本的な操作のみでした。ここからは、さらに条件を絞ってデータを取り出す方法を紹介します。その基本となるのが`WHERE`です。

### WHEREで用いる主なメソッドの一覧
- 等号：`=`
- 比較演算子：`<=`, `<`, `>`, `>=`
- LIKE演算子：`name LIKE `
- ワイルドカード：`%`
- NOT演算子：`NOT`
- `IS NULL`
- AND,OR演算子：`AND`, `OR`

ここでは特に、LIKE演算子とワイルドカード、IS NULL、AND,OR演算子について整理します。

#### LIKE演算子とワイルドカード
カラム内の特定の文字列と一致するデータだけを取り出したいときに用います。例えば、sales_dataの「たかと」だけのデータを取り出したい時は以下のように実行します。

```sql
SELECT *
FROM sales_data
WHERE name LIKE '%たかと%';
```

実行結果
|food|name|sales|
|:---:|:---:|:---:|
|ハンバーグ|たかと|1000|
|ローストビーフ|たかと|3000|
|ハム|たかと|500|

このようにして「たかと」のみのデータを取得することができました。この時`%たかと%`と指定しましたが、`%`のことをワイルドカードと呼びます。ワイルドカードを使うことで指定した文字列を含むデータを取得することができます。

##### ワイルドカードの使い方
- `'%指定した文字列%'`：指定した文字列が含むデータを全て取得する
- `'指定した文字列%'`：前方一致(%以降はどんな文字列にも一致する)
- `'%指定した文字列'`：後方一致(%以前はどんな文字列にも一致する)

#### IS NULL
何もデータが入っていないデータを取り出すためのものになります（NULLはデータが入っていないという意味）。今回であれば、このように
|food|name|sales|
|:---:|:---:|:---:|
|ローストビーフ|あさひ|2000|
|ハンバーグ|たかと|1000|
|ローストビーフ|たつや||
|ハンバーグ|ゆうき|1000|
|ローストビーフ|たかと|3000|
|ローストビーフ|たつや|1000|
|ハム|たかと|500|

「たつや」の売り上げが記録されていません。このデータを取り出そうと思ったら、

```sql
SELECT *
FROM sales_data
WHERE sales IS NULL;
```
実行結果
|food|name|sales|
|:---:|:---:|:---:|
|ローストビーフ|たつや||

逆に記録されているもののみのデータを取り出すときは`NOT`を使って次のように書きます。

```sql
SELECT *
FROM sales_data
WHERE sales IS NOT NULL;
```
実行結果
|food|name|sales|
|:---:|:---:|:---:|
|ローストビーフ|あさひ|2000|
|ハンバーグ|たかと|1000|
|ハンバーグ|ゆうき|1000|
|ローストビーフ|たかと|3000|
|ローストビーフ|たつや|1000|
|ハム|たかと|500|

#### AND,OR演算子
WHEREに複数の条件を指定したいときに用います。`AND`であれば`WHERE 条件1 AND 条件2`とすることで、条件1と条件2を共に満たすデータを取り出すことができます。

例えば、商品がローストビーフかつ、売り上げが2000円以上のデータを取り出したいときは`AND`を使って次のように条件を指定します。

```sql
SELECT *
FROM sales_data
WHERE food = 'ローストビーフ' AND sales >= 2000;
```

実行結果
|food|name|sales|
|:---:|:---:|:---:|
|ローストビーフ|あさひ|2000|
|ローストビーフ|たかと|3000|

`OR`に関しても`AND`と同様にして条件を指定します。例えば、「あさひ」または「たかと」のデータを取り出したいときは、

```sql
SELECT *
FROM sales_data
WHERE name = 'あさひ' OR name = 'たかと';
```
実行結果
|food|name|sales|
|:---:|:---:|:---:|
|ローストビーフ|あさひ|2000|
|ハンバーグ|たかと|1000|
|ローストビーフ|たかと|3000|
|ハム|たかと|500|

## ORDER BY, LIMIT
この2つはデータの並び替えをしたい時に用います。
### ORDER BY
例えば、売り上げの高い順に並べたいときは、次のように書きます。

```sql
SELECT *
FROM sales_data
ORDER BY sales DESC;
```
実行結果
|food|name|sales|
|:---:|:---:|:---:|
|ローストビーフ|たかと|3000|
|ローストビーフ|あさひ|2000|
|ハンバーグ|たかと|1000|
|ハンバーグ|ゆうき|1000|
|ローストビーフ|たつや|1000|
|ハム|たかと|500|

降順：`DESC`
昇順：`ASC`

また、`ORDER BY`は`WHERE`と併用が可能です。

Pythonの`sorted()`メソッドのような感じ。

### LIMIT
これは最大で何件データを取得するかを指定する際に使います。先頭から数えていくつだけとるといったような感じです。Pythonの`.head()`のようなイメージです。クエリの末尾に記述することで、取得するデータの数を指定できます。

先ほどの`ORDER BY`で並べ替えたデータの先頭3件を取り出すとすると、

```sql
SELECT *
FROM sales_data
ORDER BY sales DESC
LIMIT 3;
```
実行結果
|food|name|sales|
|:---:|:---:|:---:|
|ローストビーフ|たかと|3000|
|ローストビーフ|あさひ|2000|
|ハンバーグ|たかと|1000|

## まとめ
今回はSQLの基本の基本を整理しました。
まず最初に`SELECT`で取り出したいカラムを指定、次に`FROM`を使ってどのテーブルデータなのかを指定します。その後に`WHERE`や`LIMIT`などを用いて条件を追加していくという流れになります。