[SQL]SQL入門　- 式と関数 -

# はじめに
こちらはスッキリわかるSQL入門をまとめた記事となります。
今回は「式と関数」についてです。
プログラミング初学者向けの内容となっていますので、お気づきの点があれば、コメントの方をよろしくお願いします。

# 式の種類
条件式 - 「出金額 > 0」のように結果が真や偽になる式。
計算式 - 「出金額　+ 100」のように結果が真や偽にならない式。

# 基本的な算術演算子
+演算子や-演算子は、数値の計算以外にも利用できる。
日々の計算や DBMSによっては文字列の連結ができることは覚えておく。

| 演算子 | 使い方 | 説明 |
|:-----------|:------------|:------------|
| +       | 数値 + 数値        | 数値同士で足し算する         |
|         | 日付 + 数値     | 日付を指定日数だけ進める  |
| -    　　　　　　| 数値 - 数値       | 数値同士で引き算をする       |
|   | 日付 - 数値  | 日付を指定日数だけ戻す  |
|   | 日付 - 日付  | 日付の差の日数を得る  |
| * | 数値　* 数値       | 数値同士で掛け算をする         |
| / | 数値 / 数値      | 数値同士で割り算をする※1          |
| ‖ | 文字列 ‖ 文字列   | 文字列を連結する※2       |
※1 整数同士の場合は商が返される
※2　DBMSによっては文字列連結の演算子として「‖」ではなく「+」が利用されることもある。


# CASE 演算子
値を変換する。
式の結果に応じて、複数のパターンをえたい場合に有効。

```sql:CASE演算子①
SELECT 費目, 出金額,
  CASE 費目 WHEN '居住費' THEN '固定費'
            WHEN '水道光熱費' THEN '固定費'
            ELSE '変動費'
         END AS 出費の分類
  FROM 家計簿 WHERE 出金額 > 0
```

結果①
![スクリーンショット 2021-07-17 6.36.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1050283/b1915425-0273-a35e-6917-0b1df9d9ba2f.png)


```sql:CASE演算子②
SELECT 費目, 入金額,
  CASE WHEN 入金額 < 5000 THEN '固定費' -- 最初に一致したWHENが採用される
       WHEN 入金額 < 100000 THEN '固定費'
       WHEN 入金額 < 300000 THEN '給料出た!'
       ELSE '想定外の収入です!' -- WHENが採用されなければELSEが採用される
   END AS 収入の分類
  FROM 家計簿 
 WHERE 入金額 > 0
```

結果②
![スクリーンショット 2021-07-17 6.39.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1050283/82059a9d-0274-b34d-b438-f1c93998abb7.png)

# LENGTH 関数
文字列の長さを取得

```sql:LENGTH関数
SELECT メモ,LENGTH(メモ) AS メモの長さ FROM 家計簿;
```
結果
![スクリーンショット 2021-07-17 6.42.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1050283/3366b845-1099-2c1f-4796-e4c09b559f71.png)


# TRIM/LTRIM/RTRIM 関数
文字列の前後についている、余計な空白を除去する

```sql:TRIM関数
SELECT メモ,TRIM(メモ) AS 空白除去したメモ FROM 家計簿;
```

結果
![スクリーンショット 2021-07-17 6.43.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1050283/5ef9d12c-27fd-9b30-6819-e8ca8796d0af.png)

# REPLACE 関数
文字列の一部を別の文字列に置換する関数

```sql:REPLACE関数
REPLACE(置換対象の文字列,置換前の部分文字列,置換後の部分文字列)
```

以下、メモ列に入っている「購入」という文字列を全て「全て買った」置き換えるUPDATE文

```sql:REPLACE関数
UPDATE 家計簿 SET メモ = REPLACE(メモ, '購入', '買った');
```

結果
![スクリーンショット 2021-07-17 6.51.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1050283/0bcbe179-f78e-dc62-722e-b5b270cf054b.png)

![Something went wrong]()


# SUBSTRING／SUBSTR 関数
文字列の一部分を抽出する

```sql:SUBSTRING関数
SELECT * FROM 家計簿 WHERE SUBSTRING(費目, 1, 3) LIKE '%費%'
```
結果
![スクリーンショット 2021-07-17 6.52.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1050283/6c6ccce6-f7e8-b017-de7c-e1f4ae98c673.png)

# CONCAT 関数
文字列を連結する

```sql:CONCAT関数
SELECT CONCAT(費目,':' || メモ) FROM 家計簿;
```
結果
![スクリーンショット 2021-07-17 6.54.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1050283/77e0dbcc-ec19-d913-2116-ac178fea1bc6.png)

# ROUND 関数
指定した位置で四捨五入した結果を返す関数

```sql:ROUND関数
SELECT 出金額, ROUND(出金額, -2) AS 百円単位の出金額 FROM 家計簿;
```

結果
![スクリーンショット 2021-07-17 6.55.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1050283/ee6810be-4cc3-94f2-d2cf-710f99f162f9.png)

#TRUNC 関数
指定した桁で切り捨てる

#POWER 関数
ある値のべき乗(2乗や3乗など)を計算する


# CURRENT_DATE/CURRENT_TIME 関数
現在の日付/現在の時刻を得る

```sql:CURRENT_DATE関数
INSERT INTO 家計簿 VALUES(CURRENT_DATE, '食費',' ドーナッツを買った', 0, 260);
```

結果
![Something went wrong]()
![スクリーンショット 2021-07-17 6.58.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1050283/659b083a-7da4-a303-6567-058e12e40415.png)

# CAST 関数
データ型を変換する
CAST(変換する値 AS 変換する型) => 変換後の値

# COALESCE 関数
複数の引数を受け取り、受け取った引数を左から順番にチェックし、その中から最初に見つかったNULLでない引数を返す

```sql:COALESCE関数
SELECT COALESCE('A','B','C'); /* 結果は'A'*/
SELECT COALESCE(NULL,'B','C'); /* 結果は'B'*/
SELECT COALESCE(NULL,'B',NULL); /* 結果は'B'*/
SELECT COALESCE(数値型の列,0); /*数値型の列が出力されます。*/
```

```sql:COALESCE関数
SELECT 日付, 費目, COALESCE (メモ, '(メモはNULLです)') AS メモ, 入金額, 出金額 FROM 家計簿;
```
結果
![スクリーンショット 2021-07-17 7.00.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1050283/d8d485ff-f934-546f-aa3f-a9958243977d.png)

# この章のまとめ
**計算式**
・列やリテラルを使用した式で、結果が真または偽にならないものを計算式という。
・計算式を評価すると計算結果に化ける。
・計算式は、SELECT文の選択れるリスト、INSERT文やUPDATE文での列に格納する値、そのほかの修飾句など、さまざまな場所で使用することができる。

**計算式に用いる演算子**
・四則演算を行う演算子を算術演算子という。
・ ‖ や + で文字列の連結ができる。
・CASE演算子は、列の値や条件式を評価して、任意の値に変換することができる。

**関数**
・関数は、引数に大して決められた処理を行い、戻り値に変換する。
・処理の内容や戻り値に応じて、文字列関数、算術関数、日付関数、変換関数などに分類できる。
・関数は、DBMS製品による違いが大きい機能であるため、処理内容の確認が不可欠である。