SQL入門1

エンジニアになったのでSQL基礎から勉強してます:thumbsup_tone1:

## リレーショナル・データベース
####:star:リレーショナル・データベース
・リレーショナル・データベース : 2 次元の表 と、表を関連付けているリレーション の集合
物理的ポインタを使用せずに、データにアクセスすることができる。
演算子のセットが使用される。

・DBMS : データベース管理システム

・データベースの型 : 階層型/ ネットワーク型/ リレーショナル型/ オブジェクト・リレーショナル型

・SQL文 : データベース内の情報の操作


##SQL文の種類
####:star:データ操作文 ( DML/Data Manipulate Language )
データベース に格納されている表 内の行 を検索、新規の行の挿入／既存の行の更新／不要な行の削除
・SELECT
・INSERT
・UPDATE
・DELETE
・MERGE

####:star:データ定義文 ( DDL/Data Definition Language )
表のデータ構造の作成／変更／削除
即時にデータベースに影響を与え、データ・ディクショナリ に情報を記録
・CREATE
・ALTER
・DROP
・RENAME
・TRUNCATE


####:star:データ制御文 ( DCL/Data Control Language )
データベースに対するアクセス権限の付与／取消
・GRANTE
・REVOKE

####:star:トランザクション制御
DML 文で処理された変更
・COMMIT
・ROLLBACK
・SAVEPOINT


##SQL*Plus
SQL*Plus は、SQL 文を認識し、実行するために Oracle Server に送信する


##データの検索
:sunny:SELECT文 : 表内の列を選択して表示

:sunny:DISTINCT : 重複行を排除

##結合演算子
:sunny:|| を使用
列を別の列と結合する

	
:exclamation:日付、および文字のリテラルは、' ' で囲む必要がある

```
eg)
SELECT sno, sname || ' is from ' || area AS "Born From"
FROM student;

 SNO Born From
---------- ------------------------------
         1 Y_YAMADA is from TOKYO
         2 N_TANAKA is from SAITAMA
         3 I_SUZUKI is from KANAGAWA
         4 H_SATO is from TOKYO
         5 N_TAKADA is from TOKYO
         6 N_SANO is from HOKKAIDO
         7 D_MATSUDA is from KANAGAWA
         8 A_SHIMADA is from TOKYO
```
##行の制限
:sunny:WHERE 
・文字列、および日付値は ' ' で囲む
・比較演算子も使える

```
eg)
SELECT sno, sname, area
FROM student
WHERE area = 'TOKYO';

       SNO SNAME                AREA
---------- -------------------- -------------------
         1 Y_YAMADA             TOKYO
         4 H_SATO               TOKYO
         5 N_TAKADA             TOKYO
         8 A_SHIMADA             TOKYO
```

:sunny:BETWEEN
・AND の前に下限、後に上限

:sunny:IN
・値リストのいずれかと一致する行を検索

```
eg)
SELECT sno, sname, area
FROM student
WHERE area IN( 'TOKYO', 'HOKKAIDO' );

       SNO SNAME                AREA
---------- -------------------- --------------------
         1 Y_YAMADA             TOKYO
         4 H_SATO               TOKYO
         5 N_TAKADA             TOKYO
         6 N_SANO               HOKKAIDO
         8 A_SHIMADA            TOKYO
```

###LIKE 条件(ワイルドカード検索）
| 記号    |       意味 |    
|:-----------------|------------------:|
|   %      |              0 文字以上の任意の文字を表す。 | 
| _             |              1 文字の任意の文字を表す。 | 

```
eg)
SELECT sno, sname
FROM student
WHERE sname LIKE 'N%';

       SNO SNAME
---------- --------------------
         2 N_TANAKA
         5 N_TAKADA
         6 N_SANO
```

:sunny:ESCAPE
% や _ をリテラルとして検索対象にする

:sunny:IS NULL

```
SELECT sno, sname, tel
FROM student
WHERE tel IS NULL;

       SNO SNAME                TEL
---------- -------------------- --------------------
         2 N_TANAKA
         3 I_SUZUKI
         6 N_SANO
         7 D_MATSUDA
```

##論理条件
:sunny:AND, OR

```
SELECT sno, sname, area, score
FROM student
WHERE area = 'TOKYO'
OR score >= 50;

       SNO SNAME                AREA                      SCORE
---------- -------------------- -------------------- ----------
         1 Y_YAMADA             TOKYO                        75
         2 N_TANAKA             SAITAMA                      60
         4 H_SATO               TOKYO                        49
         5 N_TAKADA             TOKYO                        95
         6 N_SANO               HOKKAIDO                     78
         7 D_MATSUDA            KANAGAWA                     63
         8 A_SHIMADA            TOKYO                        56
 ```

:sunny:NOT
BETWEEN条件、IN条件、LIKE条件、IS NULL条件などの比較条件 といっしょに使用

```
SELECT sno, sname, area
FROM student
WHERE area NOT IN( 'TOKYO', 'HOKKAIDO' );

       SNO SNAME                AREA
---------- -------------------- --------------------
         2 N_TANAKA             SAITAMA
         3 I_SUZUKI             KANAGAWA
         7 D_MATSUDA            KANAGAWA
```

###行のソート
:sunny:ORDER BY
・デフォルトでは小さい順に、NUllは最後
・降順にしたい時はDESCを最後につける

```
SELECT 列名
FROM 表名
ORDER BY 列名 ;
 ```

　
##集合演算子
:sunny:UNION
2つのSELECT文の結果を連結し、重複を省いた結果を返す

:sunny:UNION　ALL
2つのSELECT文の結果を連結し、重複も含めて結果を返す

:sunny:INTERSECT
2つのSELECT文から共通に選択されたものを取り出し、重複を除き結果を返す

:sunny:MINUS
1つ目のSELECT文から、2つ目のSELECT文の結果と一致したものを除き返します。

```
SELECT sno FROM student
UNION
SELECT cno FROM class;
```

##データの操作
:sunny:INSERT
行の挿入

```
INSERT INTO 表名( 列リスト )
VALUES( 値リスト );
```

:sunny: DEFAULT
あらかじめ列にデフォルト値として定義された値を VALUES 句で指定

```
INSERT INTO student ( sno, sname, area, city, score, class )
VALUES ( 11, 'H_TAKAHASHI', DEFAULT, 'SETAGAYA', 91, 99 );
```

:sunny: UPDATE
行の更新
UPDATE 文で更新する行を特定するには、WHERE 句の条件式を使用

 ````
UPDATE 表名
SET 列名 = 値
WHERE 条件式;
 ```

:sunny: DELETE
行の削除

```
DELETE FROM 表名
WHERE 条件式
```

:sunny: MERGE
条件付きの挿入や更新を同時に行う

```
MERGE INTO 表名
USING 表名
ON ( 結合条件 )
WHEN MATCHED THEN
UPDATE SET 列名 = 値
WHEN NOT MATCHED THEN
INSERT ( 列リスト )
VALUES( 値リスト );
```

##データベーストランザクション
サーバーへの接続、コミット、ロールバックをしてから次にコミット、ロールバックをするまでの一連の処理を表す。
一貫性が保証される

:sunny: COMMIT
変更を確定

:sunny: ROLLBACK
保留中のすべての変更を破棄

:sunny: SAVEPOINT
現行トランザクションのなかにセーブポイントを作成

####読み取り一貫性
最後のコミット時点でのデータを表示する

####ロック
同時に同じとこに書き込みしないようにする為に