個人的によく使うSQL構文のメモ

# 個人的によく使うSQL構文のメモ

##DML(データ操作言語)
データの取得・登録・更新・削除などのデータ操作に分類する文法のこと。

- **SELECT文** レコードを取得
- **UPDATE文** レコードを更新
- **DELETE文** レコードを削除
- **INSERT文** レコードを挿入

###取得
#### SELECT
テーブル内の一つ又は複数のフィールドの全データを読み込む

```
SELECT "フィールド"
FROM "テーブル";
```

#### DISTINCT
重複するデータを除外する

```
SELECT DISTINCT "フィールド"
FROM "テーブル";
```

#### Where
条件つきでデータを取得

```
SELECT "フィールド"
FROM "テーブル"
WHERE "条件";
```

#### And Or
二つ又は複数の簡単条件を、 AND 又は OR によって組み合わせる

```
SELECT "フィールド"
FROM "テーブル"
WHERE "条件" [AND|OR] "条件";
```

#### In
一つの条件フィールドに対し、複数の対象パラメータをセットして検索する。

```
SELECT "フィールド"
FROM "テーブル"
WHERE "フィールド" IN ('値1', '値2');
```
WHERE 'フィールド' = '値1' OR 'フィールド' = '値2'より短くかける

#### Between
データベースから設定したの值の範囲内で検索する。

```
SELECT "フィールド"
FROM "テーブル"
WHERE "フィールド" BETWEEN '値1' AND '値2';
```

#### Like
ワイルドカードを指定してかなり曖昧に検索する。
「この文字を含んでるレコードがほしい」のようなモチベーションで利用されることが多いです。

```
SELECT "フィールド"
FROM "テーブル"
WHERE "フィールド" LIKE {ワイルドカードを含む文字列};
```
%をつけるとワイルドカードになる。
例えばhogeをふくむ文字を取得したい場合は
"%hoge%"とすることで、fugahoge,hogefuga,hogeのようなhogeを含む値を全て取得できるようになる。
hogeから始まるものがほしい場合は'hoge%'とすると、fugahogeは対象ではなくなる

#### Order By
並べ替えてデータを取得

```
SELECT "フィールド"
FROM "テーブル"
[WHERE "条件"]
ORDER BY "フィールド" [ASC, DESC];
```

#### 関数
##### AVG
平均値を計算

```
SELECT AVG("フィールド")
FROM "テーブル";
```
##### COUNT 
レコード数をカウント

```
SELECT COUNT("フィールド")
FROM "テーブル";
```
##### MAX
最大値を取得

```
SELECT MAX("フィールド")
FROM "テーブル";
```
##### MIN
最小値を取得

```
SELECT MIN("フィールド")
FROM "テーブル";
```
##### SUM 
合計値を計算

```
SELECT SUM("フィールド")
FROM "テーブル";
```

#### Having
関数の値に条件付けを行う

```
SELECT "フィールド1", SUM("フィールド2")
FROM "テーブル"
GROUP BY "フィールド1"
HAVING (関数に対する条件);
```

#### Group By
値ごとに関数の実行結果を表示する場合

```
SELECT "フィールド1", SUM("フィールド2")
FROM "テーブル"
GROUP BY "フィールド1";
```
#### Join
二つのテーブルのデータを結合する。
二つのテーブルで同一の値をとる可能性のあるフィールド同士を比較して
一致した場合にのみレコードを二つのテーブルで連結して取得する。

```
SELECT A1.'フィールド1', SUM(A2."フィールド2")
FROM "テーブル1" A1, "テーブル2" A2
WHERE A1.'比較するフィールド1' = A2.'比較するフィールド1'
GROUP BY A1.フィールド1;
```
#### Outer Join
joinでは二つのテーブルの中に一致する値があってから、当該データが読み込まれる。
outer joinはそれとは異なり、片方のテーブルにあるデータの値が、他方のテーブルに一つも現われない場合にもデータを作成し、結合する。
両方にデータがなくともテーブル内のデータがすべて必要であるときに利用する。

```
SELECT A1.'フィールド1', SUM(A2."フィールド2")
FROM "テーブル1" A1, "テーブル2" A2
WHERE A1.Store_Name = A2.Store_Name (+)
GROUP BY A1.'フィールド1';
```

#### Subquery
一つのSQL文に、もう一つのSQL文を入れる

```
SELECT "フィールド1"
FROM "テーブル1"
WHERE "フィールド2" [比較演算子]
(SELECT "フィールド1"
FROM "テーブル2"
WHERE "条件");
```

###更新
#### Update
データを更新

```
UPDATE "テーブル"
SET "フィールド1" = [新しい值]
WHERE "条件";
```

###削除

#### Delete From
データを削除

```
DELETE FROM "テーブル"
WHERE "条件";
```

###追加
#### Insert Into
テーブルにデータを挿入

```
INSERT INTO "テーブル" ("フィールド1", "フィールド2")
VALUES ("值1", "值2");
```


##DDL(データ定義言語)
SQLのうちデータベースやデータベースのテーブルを作成や定義する文法のこと。

 - **CREATE文** データベースやテーブルを作成
 - **DROP文** データベースやテーブルの削除
 - **ALTER文** データベースやテーブルの変更

### 作成
テーブルを作る

```
CREATE TABLE "テーブル"
(
  "フィールド1" "フィールド1のデータ種類",
  "フィールド2" "フィールド2のデータ種類",
);
```

### 削除
テーブルを削除する

```
DROP TABLE "テーブル";
```

### 変更
テーブルを変更する
#### フィールドの追加

```
ALTER TABLE "テーブル" ADD "フィールド" "フィールドのデータタイプ";
```

#### フィールドの削除

```
ALTER TABLE "テーブル" DROP "フィールド;
```

#### フィールド名の変更

```
ALTER TABLE "テーブル" CHANGE "元フィールド名" "新フィールド名" "新フィールド名のデータタイプ";
```

#### フィールドのデータタイプの変更

```
ALTER TABLE "テーブル" MODIFY "フィールド" "新しいデータタイプ";
```