SQL 総まとめ

##４大命令（**D**ata **M**anipulation **L**anguage）
### 選択（`SELECT`)
``` SQL
SELECT 'column名'
  FROM 'table名'
```
### 更新(`UPDATE`)
``` SQL
UPDATE 'table名'
   SET 'column名' = '新しい値'
```
### 削除(`DELETE`)
``` SQL
DELETE
  FROM 'table名'
 WHERE '削除したい条件'
```
### 追加(`INSERT`)
``` SQL
INSERT INTO 'table名'
            ('column名1, column名2')
     VALUES ('追加する値1, 追加する値2')
--２行目を省略する場合はVALUES以降をカラムの順番通りに記述する。
```
## 各命令での固有部分
### SELECT
* 必須
    * FROM句
* 必要に応じて
    * WHERE句
    * `as`による別名の定義

### UPDATE
* 必須
    * SET句
* 必要に応じて
    * WHERE句

### DELETE
* 必須
    * FROM句
* 必要に応じて
    * WHERE句

### INSERT
* 必須
    * FROM句
* 必要に応じて
    * WHERE句

## 対象行の絞り込み（WHERE句）
``` SQL
--固有部分の後に
WHERE 'column名' = '絞り込みたい値'
```
### WHEREで使える条件式
1. 比較演算子(全6種)
1. NULLの判定`'column名' IS NULL` `'column名' IS NOT NULL`
1. LIKE演算子（パターンマッチング）
    1. %:0文字以上の任意の文字列
    1. _:任意の文字列
1. BETWEEN演算子
1. IN/NOT演算子
1. ANY/ALL演算子
<br>※条件式＝TRUE or FALSE になる式のこと
<br>※LIKE演算子で％を絞り込みたいときはESCAPE句を使用する
<br>※複数の上演式を組み合わせる際は**論理演算子**（`AND` `OR`を使用する）
<br>※論理演算子の優先度**1.（）→2.NOT→3.AND→4.OR**

## 検索結果の加工
### 重複業の除去
``` SQL
-- DISTINCTキーワード
SELECT DISTINCT 'column名'
  FROM 'table名'
```
### 検索結果の並び替え
``` SQL
-- ORDER BY句
SELECT 'column名'
FROM 'table名'
ORDER BY 'column名1' '並び順1', 'column名2' '並び順2'
```
並び順は昇順`ASC`,降順`DESC`にて定義可能
### 先頭から数件だけ取得する
``` SQL
-- OFFSET-FETCH句
SELECT 'column名'
FROM 'table名'
OFFSET '先頭から除去する行数' ROWS
FETCH NEXT '取得する行数' ROWS ONLY
```
### 集合演算子を使う
1. 和集合（`UNION`）
1. 差集合（`EXCEPT(MINUS)`）
1. 積集合（`INTERSECT`）

``` SQL
-- UNION演算子
SELECT 'column名' FROM 'table名'
 UNION (ALL)
SELECT 'column名' FROM 'table名'
 ORDER BY …
```

## 4大命令のGROUP分け
### 検索系と更新系で分ける
* 検索系：SELECT
* 更新系：UPDATA, DELETE, INSERT<br>
**▼実行結果の違い** <br>
* 検索系：表が出力
* 更新系：「成功」か「失敗」

### 既存系と新規系で分ける
* 既存系：SELECT, UPDATA, DELETE
* 新規系：INSERT<br>
**▼違い** <br>
* 既存系：`WHERE`利用可能
* 新規系：`WHERE`利用不可
  

## 全DBMS共通ルール
1. 改行を入れることが可能
1. 半角の空白を入れることが可能
1. 文末はセミコロン（`;`）で締めくくる
1. コメントアウト
    1. ハイフン２つ（`--`）でコメントアウト
    1. `/*`から`*/`　までコメントアウト
1. 予約語（`SELECT`や`WHERE`） は大文字でも小文字でもOK→プロジェクトの規則に合わせる（ほぼ全てのプロジェクトが大文字）

この記事はSQL基礎の続きになります。

## 式と演算子
### SELECTの出力形式
SLECT文は`column名`以外にも`計算式` `固定値`も出力可能

``` SQL
SELECT 'column名', '計算式', '固定値'
  FROM 'table名'
```
### CASE演算子
**CASE演算子1**

``` SQL
/* columnの値に応じて変換する(出力が非固定値のときに使用頻度高め) */
SELECT 'column名1', 'column名2',
 CASE '評価するcolumnや式' WHEN 'column名1値1' THEN '出力1'
                          WHEN 'column名1値2' THEN '出力2'
                          ELSE '出力3'
 END AS 'column名3'
FROM 'table名'
```
**CASE演算子2**

``` SQL
/* columnの値に応じて変換する(出力が固定値のときに使用頻度高め) */
SELECT 'column名1', 'column名2',
 CASE WHEN '条件1' THEN '出力1'
      WHEN '条件2' THEN '出力2'
      ELSE '出力3'
 END AS 'column名3'
FROM 'table名'
```
## 関数
関数には「名前、引数、戻り値」が必須
### 文字列の長さを取得
``` SQL
LENGTH('文字列') -- →　文字列の長さ
LEN('文字列')　-- →　文字列の長さ
-- DBMSによってはbyte数を返す
```
### 空白を除去
``` SQL
TRIM('文字列') -- → 左右から空白を除去した文字列
LTRIM('文字列') -- → 左から空白を除去した文字列
RTRIM('文字列') -- → 右から空白を除去した文字列
```
### 文字列を置換
``` SQL
REPLACE('置換対象の文字列', '置換前の部分文字列', '置換後の部分文字列') -- →　置換されたあとの文字列
```
### 文字列を連結
``` SQL
CONTACT('文字列', '文字列[,文字列…]') -- → 連結後の文字列
```
### 四捨五入,切り捨て,べき乗
``` SQL
-- 四捨五入
ROUND('数値を表す列', '有効とする桁数')-- → 四捨五入した値

-- 切り捨て
TRUNC('数値を表す列', '有効とする桁数')-- → 切り捨てた値

-- べき乗
TRUNC('数値を表す列', 'なん乗するかを指定する数値')-- → べき乗した値
```

### 現在の日時を得る関数
``` SQL
CURRENT_DATE -- → 現在の日時
CURRENT_TIME -- → 現在の時刻
```
### データ型を変換
``` SQL
CAST('変換する値' AS '変換する型') -- →　変換後の値
```

## 集計関数
### 合計、最大、最小、平均を求める
``` SQL
-- 合計値
SUM(`column名`) -- →　合計値

-- 最大値
MAX(`column名`) -- →　最大値

-- 最小値
MIN(`column名`) -- →　最小値

-- 平均値
AVG(`column名`) -- →　平均値
```

### 行数を数える
``` SQL
COUNT(*) -- →　検索結果の行数（NULLも含める）
COUNT(`column名`) -- →　検索結果の指定列に関する行数（NULLは無視してカウント）
```
### 集計関数のルール
1. 記述できる箇所：選択列リスト、ORDER BY句、HAVING句
1. 結果が長方形にならない場合は使用不可（一部DBMSはNULLで補うことも可能だが非推奨）

##　グループ化
### グループ化基本構文
``` SQL
-- WHEREとHAVINGの使い分けに注目
SELECT `集計関数`, '集計関数'
  FROM 'table名'
  WHERE '絞り込み条件'
  GROUP BY `グループ化するrow名`
  ORDER BY 2 DESC
HAVING '集計関数' '条件式'
```

## 副問い合わせ
複数SLECT文を一つにまとめて実行可能
### 単一行副問合せ
### 複数行副問合せ

## 複数テーブルの結合
``` SQL
SELECT 'column名' FROM '左表table名'
  JOIN '右表table名'
    ON '結合条件'
-- 複数JOINする場合
  JOIN '右表table名'
    ON '結合条件'
```
## トランザクション（TCL:Trasaction Controll Language）
予期せぬエラーに備えて処理を人まとまりにする。

## テーブルの作成(DDL: Data Definition Language)
### ５つの制約
1. NOT NULL制約
1. UNIQUE制約
1. CHECK制約
1. PRIMARY KEY制約
1. 外部キー制約

``` SQL
CREATE TABLE 'table名' (
 'column名'  'データ型'  DEFAULT '初期値',
 'column名'  'データ型'  NOT NULL,
 'column名'  'データ型'  UNIQUE,
 'column名'  'データ型'  DEFAULT '初期値'  CHECK('条件'),
 'column名'  'データ型'  PRIMARY KEY,
 'column名'  'データ型'  REFERENCES '参照先table名'('参照先column名')
)

--追加
ALTER TABLE 'table名' ADD 'column名' 'データ型'('値') 

--削除
DROP TABLE 'table名'
```

## その他予備知識
### インデックスの作成
### ビューの削除
### 連番の作成
1. 採番テーブルの作成
1. 連番を自動的に触れる特殊な列を定義（DBMSごと宣言が異なる）
1. 裁判した値を記憶するシーケンス文の利用

## バクアップ方式
1. オフラインバックアップ
1. オンラインバックアップ

## 2つのファイルをバックアップ
1. データベース内容：　低頻度（日次、週次、月次）
1. ログファル内容：　高頻度（数分～数時間ごと）