# 2020/12/10 upper layer progress
# 項目
- パターンマッチング(LIKE演算子)
- グループ化(GROUP BY)
- グループ化したテーブルの選択条件(HAVING)
- 重複行の削除(DISTINCT)
- INSERT文
- UPDATE
# パターンマッチング(LIKE演算子)
- LIKE演算子の使いかた
LIKE演算子はWHERE句で使用します。[カラム名 LIKE 比較文字列] と記述しカラム名と比較文字列のパターンマッチングを行います。
```
Aという文字を含む従業員名を検索
SELECT ENAME
FROM EMP
WHERE ENAME LIKE '%A%'
```
- ワイルドカード
比較文字列に使用可能なワイルドカードは以下の2文字です。
|%(パーセント)|0文字以上の任意の文字列|
|-----------------|-----------|
|_(アンダーバー)|1文字の任意の文字|
- LIKE演算子の否定
LIKE演算子を否定する場合は、[カラム名 LIKE 比較文字列]のようにLIKE演算子の前にNOTを記述します。
```
WHERE ENAME NOT LIKE '%A%'
```
# グループ化(GROUP BY)
- GROUP BYの使い方
GROUP BYを使用すると、指定したカラムごとにグループ化し、集合関数の計算結果を取得することができます。グループ化の方法はグループ化するカラムを[GROUP BY カラム名]のように記述します。
```
JOB(仕事)別のSAL(給料)の平均を求める
SELECT JOB,AVG(SAL)
FROM EMP
GROUP BY JOB
```
- WHERE条件によるレコードの選択
通常のSELECT文と同じように、WHERE条件はを記述することが出来ます。まず、WHERE条件によりレコードが抽出され、GROUP BYで指定したカラムごとにグループ化され、集合関数で計算結果が求めらえます。
```
SELECT JOB,AVG(SAL)
FROM EMP
WHERE DEPTNO <> 10
GROUP BY JOB
```
- 複数のカラムによるグループ化
複数のカラムによるグループ化を行う場合は、GROUP BYの後ろにカラム名をカンマ区切りで記述します。
# グループ化したテーブルの選択条件(HAVING)
- HAVINGの使い方
HAVINGはGROUP BY句に対して抽出条件を設定することができます。WHERE条件がGROUP BYでグループ化される前のレコード抽出段階の条件になるのに対し、HAVINGはグループ化後の条件になります。
```
--SAL(給料)の平均が2500以上のJOB(仕事)を抽出する
SELECT JOB
FROM EMP
GROUP BY JOB
HAVING AVG(SAL) >= 2500
```
- HAVINGの記載方法
GROUP BY句の後ろに[ HAVING 条件式 ] と記述します。HAVING句に使用される条件は、グループごとに値を持たなくてはならないので、グループ化したキーか集合関数の比較条件を記述することが出来ます。
# 重複行の削除(DISTINCT)
- DISTINCTの記述位置
DISTINCTキーワードはSELECT句の後ろに記載します。DISTINCTはSELECT文で抽出されたレコードの重複行を削除する機能を持っています。
```
--抽出したレコードから重複行を削除する
SELECT DISTINCT JOB,SAL
FROM EMP
```
# INSERT文
- 値を指定したレコード追加
```
--INSERT文の構文(1)
INSERT INTO 表名 (列名,列名...)
VALUES (値指定,値指定...)
```
- INSERET分の使い方
INSERT文を使う場合には、INSERT INTO の後に表名を記載し、その後ろの(カッコ)の中には列名をカンマ区切りで指定します。レコード追加したい値はVALUESの後ろの(カッコ)の中に、値をカンマ区切りで記載します。値が文字列の場合はクォーテーションで囲む必要があります。EMP表に例にINSERT文を記載すると以下のようになります。
```
INSERT INTO EMP (EMPNO,NAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO)
VALUES (9999,'SAN','SALESMAN',7698,1981-09-28,1000,500,10)
```
表の全項目に値を追加する場合は、列名は省略することが可能で、以下のように記述します。
```
INSERT INTO EMP
VALUES (9999,'SAN','SALESMAN',7698,2004-06-24,1000,500,10)
```
一部の項目に値を設定する場合は、以下のように表名の後ろの追加したい値を格納する項目名を記載し、VALUESに追加したい値を記載します。
INSERT INTO EMP (EMPNO,ENAME)
VALUES (9999,'SAN')
- 別表から選択したレコードを追加
```
--■INSERT文の構文(2)
INSERT INTO EMP_TEMP
SELECT *
FROM EMP
WHERE JOB = 'SALESMAN'
VALUESキーワードの部分をSELECT文に変更することで別表から選択したレコードを、表に追加することが可能です。
```
# UPDATE文
- UPDATE文の使い方
```
--UPDATE文の構文(1)
UPDATE 表名
SET 列名 = 値,列名 = 値...
WHERE 条件
```
UPDATE文を使用する際には、UPDATEの後ろに更新対象のレコードがある表名を記載し、SETの後に 項目名=更新する値 を記載します。複数の項目を更新する場合はカンマ区切りで項目名=更新する値を並べます。
更新対象のレコードの条件はWHEREに記載します。UPDATE文ではWHERE条件に合致するレコードすべてが更新されます。WHERE条件を記載しない場合は、すべてのレコードが更新されます。
- 計算式を使ったレコードの更新
```
--UPDATE文の構文(2)
UPDATE EMP
SET SAL = SAL * 1.5
WHERE EMPNO = 7369
```
SQL実行時に計算して求めた値を使い、レコードを更新することもできます。上記の例ではEMP表の従業員番号が7369の人のの給料を1.5倍にしています。