SQL-データベース（Oracle SQLの概要とテーブル操作）



##SQLとは

SQL はリレーショナルデータベースを操作するための言語

### DDL（Data Definition Language）
DDL（データ定義言語）は、データを格納する入れ物であるデータベースやテーブルなどを作成したり削除したりします。DDL に分類される命令は次の通りです。
- CREATE：データベースやテーブルなどを作成する
- DROP：データベースやテーブルなどを削除する
- ALTER：データベースやテーブルなどの構成を変更する

### DML（Data Manipulation Language）
DML（データ操作言語）は、テーブルの行を検索したり変更したりします。DML に分類される命令は次の通りです。
- SELECT：テーブルから行を検索する
- INSERT：テーブルに新規行を登録する
- UPDATE：テーブルの行を更新する
- DELETE：テーブルの行を削除する

### DCL（Data Control Language）
DCL（データ制御言語）は、データベースに対して行った変更を確定したり取り消したりします。その他、RDBMS のユーザがデータベースにあるもの（テーブルなど）を操作する権限の設
定も行います。DCL に分類される命令は次の通りです。
- COMMIT：データベースに対して行った変更を確定する
- ROLLBACK：データベースに対して行った変更を取り消す
- GRANT：ユーザに操作の権限を与える
- REVOKE：ユーザから操作の権限を奪う


### スキーマ

あるユーザーに関する、全てのデータベースオブジェクトを集めたのがスキーマ（schema）です。

### CREATE TABLE文

ユーザーの作成には、CREATE USER文を使います。

1. テーブル名や列名に日本語を使ってもいいけどサポートされる使い方(""で囲む)をしましょう。
2. でも使わないほうが幸せかも。

```sql
CREATE USER ユーザー名 IDENTIFIED BY パスワード
```

### システム権限の付与

ユーザーにシステム権限を与えるときにはGRANT文を使います。以下に構文を示します。

```sql
GRANT システム権限名　TO ユーザー名

GRANT ALL PRIVILEGES TO SSSUSER;
```



### データ型の指定

|主キー制約 (PRIMARY KEY)|一意制約とNOT NULL制約の複合|
|:------------:|:------------:|
|VARCHAR2（n）|最大4000 バイト|可変長文字列型（n に最大サイズを指定）※1 括弧内に「n BYTE」と記述した場合、最大バイト数を指定（「BYTE」を省略した場合も同様）※2 括弧内に「n CHAR」と記述した場合、最大文字数を指定（2 バイト文字も１文字として換算）|
|NUMBER(n,m) 最大38桁 | 数値型（nに最大桁数,mに小数部の桁数を指定）|

- 一意キー制約
    - 一意キー制約および主キー制約に対応付けられた索引をより明示的に制御する場合、データベースでは次のことが可能です。制約を規定するために使用する既存の索引の指定索引の作成と制約の規定に使用するCREATE INDEX文の指定
- <a href="http://www.dbonline.jp/postgresql/type/index1.html" target="_blank">数値データ型 - データ型 - PostgreSQLの使い方</a>
- PCTFREE
    - グラスの水と PCTFREEグラスに水をそそぐとき、後から氷を入れるのをわかっていてグラスの目一杯になるまで水を入れることはしない。水は入れたい氷の量次第で見当をつけ、それに見合う水を注いで入れる。このとき、グラスの容積がデータブロックの大きさ*1、水が挿入データ、氷が更新による増加データである。 氷が入る分の余裕の割合(%)が PCTFREE となる。もし、そのグラスに氷をいっぱい入れてしまうとグラスから水があふれ出して台無し（行移行 が発生する。似た現象として 行連鎖 がある）になってしまう。
- 引用：<a href="http://e-words.jp/w/%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%86%E3%83%B3%E3%83%88.html" target="_blank">エクステントとは｜extent - 意味/定義/解説/説明 ： IT用語辞典</a>
    - エクステントとは、データベース管理システム（DBMS）やOSのファイルシステムなどが扱う記憶装置の管理単位の一種で、論理的に連続したある程度まとまった記憶領域のこと。データブロックなどのより小さな管理単位をまとめたもの。



### 制約の設定
制約とは、データ型の他に、列に入れるデータに制限や条件を追加する機能

|制約名|説明|
|:------------:|:------------:|
|NOT NULL制約 (NOT NULL)|NULL値を禁止する※NULLとは何も値が入っていない状態を指す（空文字列とは違いますので注意が必要）|
|DEFAULT 制約（DEFAULT）|初期値を設定する|

### ORACLE SQL Developer
- 再生ボタンの文の実行は一行のみ。選択範囲Enterも同様。
- スクリプトの実行は、選択された複数行が実行。

※1.5.5の場合



### ResultSet 
ResultSet オブジェクトは、カーソルがデータの現在の行を指し示すよう維持します。初期状態では、カーソルは最初の行の先頭に配置されます。 next メソッドにより、カーソルは次の行に移動します。

### Statement
ステートメントは問い合わせを実行したり、問い合わせの結果の取得に関するベースになるものです。

### prepareStatement
「PreparedStatement」は「Statement」と同じくデータベースに対するSQL文を実行するために使われますが、「PreparedStatement」で使うSQLは事前にコンパイルが行われています。その為高速に実行することが出来るようになっています。 

PreparedStatement オブジェクトを実行する前に、各 ? パラメータの値を設定する必要があります。 これは、setXXX メソッドを呼び出すことによって行います。XXX は、パラメータの適切な型です。 たとえば、パラメータが Java プログラミング言語の long という型の場合、使用するメソッドは setLong です。 setXXX メソッドの最初の引数は、設定するパラメータの「番号付けされた位置」で、1 から始まる番号です

### executeQuery
ステートメントを作成したらSQL文を作成しデータベースに問い合わせを行います。問い合わせを実行するには「Statement」インターフェースで用意されている"executeQuery"メソッド


### ArrayList
まずArrayListクラスを見ていきます。ArrayListクラスは大きさが決まっていない配列と考えて下さい。ArrayListは「java.util.ArrayList」のようにjava.utilクラス内で定義されています。


## データベース（以下はOracleについて）

・「融通性のなさ」のおかげで、データベースは安全かつ堅牢であり、確実なデータ保管場所

全ての表には、必ず所有者（ユーザー）がいます。そして全ての表は、必ずそのユーザーのスキーマに所属しています。
正式な記述では、表の名前にスキーマ名をつけます。
表の完全な名前は、「スキーマの名前」＋「.」＋「表名」となります。

データベースの基本的な管理を行うユーザーを DBA（Data Base Administrator）と呼んでいます。「SYS」と「SYSTEM」。

SYSが一番偉い、データディクショナリの所有者で、データベースの管理上、最も強力な権限を持ち、全ての管理機能を実行出来る。
SYSTEM　通常の管理業務で使うユーザーで、データベースのアップグレードやバックアップ・リカバリなどの一部の機能を除く全ての管理機能が実行出来る。

Oracle では大文字・小文字を区別しません。分けて書くが、区別することもあります。

このシステム権限を与えるというのも一つの操作です。つまり、システム権限を与えるのも「システム権限を与えることが出来る」というシステム権限を持っているユーザーのみとなります。

ユーザーにシステム権限を与えるときには GRANT 文「ALL PRIVILEGES」は、システム権限の名前ではなく、GRANT 文で使用出来るショートカットです。「ALL PRIVILEGES」を指定すれば、「SELECT ANY DICTIONARY」権限以外の、全ての権限を与えることが出来ます。

- 設定されている権限を削除するときは、REVOKE 文
- ユーザーを削除する際は、DROP USER

ユーザーがテーブルなどのデータベースオブジェクトを持っている場合、削除しようとするとエラーになります。 このような場合、CASCADE を最後に記述することで、オブジェクト（スキーマ）を含めてユーザーを削除することが出来ます。

### テーブルの各名称について

<a href="http://itpro.nikkeibp.co.jp/article/COLUMN/20070209/261546/" target="_blank">![zu01.jpg](https://qiita-image-store.s3.amazonaws.com/0/47909/2e0ecec3-cb24-3e43-0279-967b8dfb8424.jpeg)</a>