SQLの基礎を勉強しました。

# はじめに

先日SQLの基礎の勉強会に参加したので復習のためにアウトプットしたいと思います。
よろしく御願い致します。

<font color="blue">この記事で使用しているDBアプリはDBeaverのバージョン7.1.4を使っています。

# SQLについて

**SQLとは（Structured Query Language）の略です。**
データベースのデータを操作したりデータ定義を行う為の言語。
プログラム言語ではなくて**データベース言語**になる。

大きく３つに分けられる。

**DML（Data Manipulation Language）**
<font color="blue">データ操作言語</font>
例：SELECT,UPDATE,INSERT,DELETE等

**DDL（Data Definition Language）**
<font color="blue">データ定義言語</font>
例：CREATE,ALTER,DROP等

**DCL（Data Control Language）**
<font color="blue">データ制御言語</font>
例：GRANT（権限付与）,REVOKE（権限取り消し）等

上記のような感じですね。
今回は一番基礎のデータ操作言語のSELECT分について記述していきます。

# SELECT文
まず使い方を簡単に説明します。

```sql

SELECT カラム名
FROM テーブル名
```
上記のように使います。

```sql

SELECT　*　（←全てのカラムの意味 ＝ 指定したテーブルの全データ）
FROM　テーブル名
```


上記の例は指定したテーブル内の全データが対象ということになります。

では実際に練習問題を解いて行きたいと思います。

# 問題１

テーブル名：sales
カラム名：item_nm,  sales_date,  sales_amt

上記の内容を「sales_date」の昇順で抽出する。

<font color="blue">今回新たに使用するコマンド

```sql

order by　（昇順[asc]、降順[desc]の指定ができる）
```

<font color="red">昇順は省略可能

## 回答

```sql

SELECT　s.item_nm, s.sales_date, s.sales_amt
FROM　sales s
ORDER BY s.sales_date
```

## 実行結果
<a href="https://gyazo.com/8b02e42216931091676c6d6ba8a76f7b"><img src="https://i.gyazo.com/8b02e42216931091676c6d6ba8a76f7b.png" alt="Image from Gyazo" width="397"/></a>


実行結果は上記のようになります。
少し説明が必要な箇所がありますので説明します。

まずSQL文はターミナルなどで記述する時は基本的に最後に**セミコロン（；）**を入れます。
入れ忘れるとターミナルはまだ終わってないと認識して続きのコマンドを求めます。
なので基本的には入れるものなのですがデータベース用のアプリケーション（Sequel Pro）などでSQL文を実行する際は**セミコロンは省略**出来ます。

そしてもう一つは「sales s」,「s.item_nm」など「s」があるのが気になるかと思います。
この「s」はテーブル名への<font color="red">別名（エイリアス）付け</font>と呼ばれる方法です。
「FROM」のあとのテーブル名のあとにスペースをあけることで「sales」というテーブル名を「s」という名前に一時的に変更しています。

別名はどんな風につければいいかの参考に良さそうな記事がありましたのでリンクを貼っておきます。
参考：[SQLのエイリアスの付け方って迷う。](https://qiita.com/tarosuke777000/items/2f6ee7c21f3eb404c87d)

問題１は以上になります。

# 問題２ー１

テーブル名：sales
カラム名：item_nm, sales_date, unit_price, qty, sales_amt


上記の内容を「item_nm」が「クルトガ」かつ「sales_amt」が10000円未満のデータを抽出する。（クルトガはただの商品名です。）

<font color="blue">今回新たに使用するコマンド

```sql

where  （検索する条件を指定出来る）
```

## 回答

```sql

SELECT
s.item_nm, s.sales_date, s.unit_price, s.qty, s.sales_amt
FROM sales s
where s.item_nm = 'クルトガ'
and s.sales_amt < 10000
```

## 実行結果
<a href="https://gyazo.com/f2724baa13dcdbc07268e3c646c59471"><img src="https://i.gyazo.com/f2724baa13dcdbc07268e3c646c59471.png" alt="Image from Gyazo" width="660"/></a>


実行結果は上記のようになります。
今回は**「and」を使うことによって「かつ」（条件Aも条件Bも満たす）**の条件を指定しています。

# 問題２ー２

テーブル名： sales
カラム名： 全項目

上記の内容を「unit_price」が1500円以上15000円以下のデータを抽出する。

## 回答

```sql

SELECT　*
FROM　sales s
where s.unit_price >= 1500
and s.unit_price <= 15000
```

## 実行結果
<a href="https://gyazo.com/591dded069fbe0515a9c3881907bb475"><img src="https://i.gyazo.com/591dded069fbe0515a9c3881907bb475.png" alt="Image from Gyazo" width="795"/></a>

実行結果は上記のようになります。

問題２は以上になります。

# 問題３−１

テーブル名： sales
カラム名： cust_nm, item_nm, sales_date, unit_price, qty, sales_amt

上記の内容を「cust_nm」がA店またはB店またはC店のデータを抽出する。

<font color="blue">今回新たに使用するコマンド

```sql

in('値1','値2','値3'〜)
（複数の条件を指定出来る。「or」と同じように使えるが「or」よりもっとシンプルにコードを書ける。）
```

## 回答

```sql

SELECT　s.cust_nm, s.item_nm, s.sales_date, s.unit_price, s.qty, s.sales_amt
FROM　sales s
where s.cust_nm in('A文具店','B商店','C雑貨店')
```

## 実行結果

<a href="https://gyazo.com/99fb87e4845c59c23b8ba3802b00af29"><img src="https://i.gyazo.com/99fb87e4845c59c23b8ba3802b00af29.png" alt="Image from Gyazo" width="747"/></a>
実行結果は上記のようになります。


# 問題３ー２

テーブル名： sales
カラム名： 全項目

上記の内容を「sales_date」が「2020-06-02」以上「2020-06-05」以下のデータを抽出する。

<font color="blue">今回新たに使用するコマンド

```sql
BETWEEN 値1 and 値2
(値1以上値2以下のデータを抽出する)
```

## 回答

```sql

SELECT　*
FROM　sales s
where s.sales_date BETWEEN '2020-06-02' and '2020-06-05'
```

## 実行結果

<a href="https://gyazo.com/3bec33d9f53814eff2c1acdfddaed7f4"><img src="https://i.gyazo.com/3bec33d9f53814eff2c1acdfddaed7f4.png" alt="Image from Gyazo" width="1084"/></a>
実行結果は上記のようになります。



問題３は以上になります。

# 問題４

テーブル名： sales
カラム名： cust_nm, 合計金額（合計金額という別名のカラムを作る）

上記の内容を「cust_nm」別の「sales_amt」の合計が10000円以上30000円以下のデータを抽出する。

<font color="blue">今回新たに使用するコマンド

```sql
集合関数（SUM、MAX、MIN、AVG、COUNT）
```

```sql
GROUP BY カラム名　（上記の集合関数を使い合計値や平均値などを求める時に使用する）
```

```sql
HAVING　（GROUP BYでグループ化した時にWHEREと同じ用途で使用する）
```

# 集合関数とは
ここで集合関数について少し説明します。

**集合関数の種類と機能**
SQLには以下の関数が提供されています。SUMとAVGは数値以外を引数にできません。


|SUM	|引数の総和を求める。NULLの場合は集計対象外|
| ----- |---------------- |------------------|
|MAX	|引数の最大値を求める。|
|MIN	|引数の最小値を求める。|
|AVG	|引数の平均値を求める。NULLの場合は集計対象外。|
|COUNT	|引数の値の総数を求める。NULLの場合は集計対象外。COUNT(*)と記載可。|

**上記の集合関数について引用させて頂いたサイト**
参考：[ＳＱＬ攻略](http://sql.main.jp/sql06.html)


## 回答

```sql

SELECT　s.cust_nm, sum(s.sales_amt) 合計金額
FROM　sales s
GROUP BY s.cust_nm
HAVING sum(s.sales_amt) BETWEEN 10000 and 30000
```

## 実行結果
<a href="https://gyazo.com/d1bcfb20b755b8718740bc798fd826ea"><img src="https://i.gyazo.com/d1bcfb20b755b8718740bc798fd826ea.png" alt="Image from Gyazo" width="288"/></a>

実行結果は上記のようになります。

問題４は以上になります。


# おわりに
いかがでしたでしょうか。
今回の記事は先日オンラインでの初心者向けの勉強会に参加させて頂いた際の内容を、復習のためにアウトプットした内容となっております。そのため一部分かりにくい箇所があると思いますがご了承ください。
今回の勉強会でSQLについては実際にコードを書いて実行結果を見て覚えるのが自分にとっては一番良いということが分かりました。SQLは実務でも非常に重要なスキルとのことなので今後も継続して学習に励みたいと思います。

**今回の勉強会で教えて頂きました講師の方**
Twitter：[NAO｜基礎を極めたエンジニア／SQL勉強会講師](https://twitter.com/SmartistNAO)

# 今回の記事で参考にさせて頂いたサイト
- [SQLのエイリアスの付け方って迷う。](https://qiita.com/tarosuke777000/items/2f6ee7c21f3eb404c87d)
- [ＳＱＬ攻略](http://sql.main.jp/sql06.html)