サイトロゴ
この章で行う学習内容
 

データベースとは
データベースとは
 「何らかの目的やルールに基づいて管理されたデータの集まり」のことです。
ここでポイントになるのが「管理された」という点です。

たとえば、机の上に本や文房具などが雑然と置いてあり、
どこに何があるかを誰も把握していない状態で、
「sqlの本を取ってください」と言われても直ぐに取ることは出来ません。
一方、何らかのルールに基づいて文房具や本がしっかり保管されていれば、
「sqlの本を取ってください」と言われたときに、
どの棚の何番目においてあるかが直ぐに分かり、要求に応えることができます。

後者のような形で保管された本などのことをデータベースだとすると、
これらを管理している人はデータベース管理システムという仕組みになります。

つまり、データベースとは、データベース管理システムによって整理整頓して
使いやすくした状態のデータの集まりのことです。
データベース管理システム (DBMS:DataBase Management System)
データベースは、データベース管理システムというソフトウェアによって管理されます。
実際にデータを取り出したりしまったりするのは、データベース管理システムの仕事です。
使用者の操作は次のような流れで行います。
特徴
データを様々な方法で共有できる

膨大なデータを最小限にまとめることができる

ユーザ毎にデータへのアクセス管理ができる

データの更新制御ができる(後述の「トランザクション」を参照)
データベースの種類
階層型、ネットワーク型、リレーショナル型など様々なデータベースが存在しています。
その中でも現在最も広く利用されているのが、リレーショナル型データベースです。

階層型・・・データが1対多の親子関係で、結ばれている。
ネットワーク型・・・データが多対多の親子関係で、結ばれている。
リレーショナル型・・・データを列と行からなる表形式で管理する。
リレーショナルデータベース(RDB)
データを行と列で構成された表形式で管理します。RDBではテーブルとテーブルに、関係を持たせたデータベースになります。
リレーショナルデータベース(RDB)
データを行と列で構成された表形式で管理します。RDBではテーブルとテーブルに、関係を持たせたデータベースになります。
リレーショナルデータベースの種類

DB名 会社
Oracle Oracle社
MySQL Oracle社
DB2 IBM
Access MicroSoft
データベースの構造
データベースにはインスタンスがありその中にスキーマ(ユーザ)を複数持つことができるスキーマの中にはテーブルを複数持つことができる
テーブルは、データを列(カラム)と行(レコード)で構成された2次元の表形式のようなものです。たとえば、住所録テーブルがあったとします。 住所録テーブルは、名前、年齢、郵便番号、住所などの列(カラム)と、登録人数分の行(レコード)で構成されます。
 

SQLとは
SQLとは
コンピュータ言語の一つで、「データベース管理システムと対話する為の言葉」といえます。 データベース管理システムに対して、何らかの要求をする時に、SQLを使って呼びかけるわけでが、 このデータベース管理システムに対して呼びかけることを問い合わせ(クエリ)といいます。
SQLとは
キャストの条件
キャストする場合は、必ず継承関係でなければならない。
全てのクラスはobject型にキャストすることが出来る)

データベースやテーブルの作成

データの取得

データの操作

データの保護
SQLの注意点
半角で記述する
コメントと‘ ‘(シングルクォーテーション)文字列内は全角での記述が可能です
全角スペースの使用に注意する
コメントと‘ ’文字列以外に全角スペースを入れるとエラーになります。(要注意)
コメントは /* と */ でくくる。もしくは -- で書き出す。
sqlは大文字で記述する  
SQL参考サイト
【参考URL】
おらおらSQL: http://www.iceprobe.net/database/oracle/oraorasql/index.php
こちらのサイトを参考にしてみてください。
 
 

DDL
DDL(Data Difinition Language)とは
データを定義する為のSQL(作成)
テーブル作成(CREATE TABLE)
テーブルを作成する時は、CREATE TABLEというSQLを発行します。 CREATE TABLEを発行する際は、各列に対してデータ型を指定する必要があります。
構文
							 CREATE TABLE テーブル名
							(
								カラム名1 データ型(バイト数)
								, ・・・
							);
							
CODE、NAME、PRICEという列を持つTBL_TEAというテーブルを作成する時は、 以下のように定義します。
例文

							CREATE TABLE TBL_TEA (
								CODE NUMBER(3)
								,NAME VARCHAR2(50)
								, PRICE NUMBER(10)
							)
						
      TBL_TEA
CODE NAME PRICE
ここではデータの入っていない 枠組みだけが出来るイメージです。
データ型(テーブル作成)
データ型には様々なものが用意されています。
ここではその中でも良く利用される代表的なデータ型について説明します。
NUMBER 数値
VARCHAR2 文字列(可変長)
CHAR 文字列(固定長)
DATE 日付
number(全桁、小数桁) 0~999.99
例)price number ( 5, 2)
※ 整数桁のみ(5,0) ⇒ ( 5) と省略できる
整数桁・・・3
小数桁・・・2

varchar2(バイト数) 半角のみ・・・20文字 / 全角のみ10文字
 ※ 半角は1文字1バイト / 全角文字は1文字2バイト

char (バイト数)
 例)code char(3)
  値が’1’の場合   : пп1
  値が’01’の場合   : п01
  値が’001’の場合  : 001

※「п」の箇所には自動的にスペースが入り
必ず決められたバイト数にする特徴がある
値の前にスペースを入れたくない場合は、
varchar2を使用する

date
例) nowday date
※ 年月日 時 分 秒 ミリ秒
テーブル削除(DROP TABLE)
テーブルを削除する時は、DROP TABLEというsqlを発行します。

構文
							DROP TABLE テーブル名;
先ほど作成したTBL_TEAテーブルを削除するときは以下のようになります。
例文
							DROP TABLE TBL_TEA;
							
その他のDDL
テーブル再定義
インデックスの作成
インデックスの再定義
インデックスの削除
など
DESCコマンド
テーブルの構造(カラムの情報など)を取得するコマンド
構文
							DESC テーブル名;
先ほど作成したTBL_TEAテーブルの情報を見たいときは以下のようになります。
例文
							DESC TBL_TEA;
							
             表示例
名前 NULL?
CODE NUMBER(3)
NAME VARCHAR2(50)
PRICE NUMBER(10)
DESCコマンド

名前 NULL?
CODE NOT NULL NUMBER(3)
NAME VARCHAR2(50)
PRICE NUMBER(10)
NOT NULLはnullを許可しない場合です。設定を行うのはテーブル作成の「create table」で行います。
例文
							CREATE TABLE TBL_TEA (
								CODE NUMBER(3) NOT NULL
								, TITLE VARCHAR2(50)
								, PRICE NUMBER(10)
							);
							
nullを入れることが出来ないことを表しています。
このnot nullを指定すると、
データを登録する際に、絶対に何かしらの
値を入れる必要があります。
 

DML
DML(Data Manipulation Language)とは
データを操作する為のSQL(登録、更新、削除)
データの登録(INSERT INTO)
テーブルに新しくデータを登録する時は「 INSERT INTO 」というSQLを発行します。
データを登録する列のデータ型と実際のデータが合わないとエラーになるので、気をつけましょう。
構文
							INSERT INTO テーブル名 ( カラム名1,カラム名2, ・・・ ) VALUES ( 値1,値2,・・・ );
							
データの登録(INSERT INTO)
 特定の列のみにデータを登録
特定の列だけにデータを登録することができます。
データを登録しない列には、基本的にnullが入ります。

先ほどのテーブルに「ほうじ茶」を登録してみます。

             TBL_TEA
CODE NAME PRICE
001 緑茶 700
列名を省略したINSERT文は以下のようになります。
例文
							INSERT INTO TBL_TEA (CODE, NAME) VALUES ( 003, 'ほうじ茶' );
						
             TBL_TEA
CODE NAME PRICE
001 緑茶 700
002 紅茶 850
003 ほうじ茶 NULL
値を設定しないとNULL値が入ります。
データの更新(UPDATE)
データの更新
既に登録してあるデータを変更する時は「 update 」というsqlを発行します。

構文
							update テーブル名 set カラム名1=値1,カラム名2=値2 , ・・・;
							
たとえば、以下のようなテーブルを更新するとします。
例文
							UPDATE TBL_LUNCH SET MENU = 'カレーライス', PRICE = 500;
							
更新内容
更新する列名と新しい値を「=」で結びつける
「,(カンマ)」で区切る
データの削除(DELETE)
既に登録してあるデータを削除する時は「 DELETE 」というSQLを発行します。
例文
							DELETE FROM テーブル名;
							
たとえば、以下のような登録で使用したテーブルのデータを削除するとします。
             TBL_TEA
CODE NAME PRICE
001 緑茶 700
002 紅茶 850
003 ほうじ茶 NULL
例文
							DELETE FROM TBL_TEA; 
             TBL_TEA
CODE NAME PRICE
データが削除されました。
ですが、データは削除されましたが、
テーブル自体が削除されたわけではありません。
テーブルを作成した時のデータの無い状態に戻っただけで、
テーブルを削除する場合は、DROP TABLEを使用してください。
 

SELECT
SELECTとは
テーブルからデータを取り出す時は、「SELECT」というSQLを発行します。
構文
								SELECT
									カラム名1,カラム名2, ・・・
								FROM
									テーブル名;
							
たとえば、以下のようなテーブルから指定した列のデータを取り出してみます。
             TBL_EHON_2
CODETITLEPRICE
001java入門2000
002javaの本1500
003javaの基礎1800
004やさしいjava2500
構文
								SELECT	TITLE, PRICE  FROM	TBL_EHON_2;
*複数の列を取り出す時は列名を「,(カンマ)」で区切る
*取り出したい列名
*テーブル名
ここに列挙した順番で列のデータが表示される。
TITLEPRICE
java入門2000
javaの本1500
javaの基礎1800
やさしいjava2500
テーブルの全ての列を取り出すことも出来ます。
構文
								SELECT
									*
								FROM
									テーブル名;
							
全カラム指定の場合は「*」で書く事が出来ますが、使用しないで下さい。 どのようなデータを取り出しているのかが第3者から分かりにくくなってしまいます。
テーブル一覧
スキーマが持っているテーブル名を全て表示する
スキーマに登録されているテーブル名の一覧を表示することが出来ます。
例文
								SELECT
									TABLE_NAME
								FROM
									USER_TABLES;
							
ORDER BY
データを並び替える(ORDER BY)
指定した列を基準にデータを並び替えることの出来るSELECTのオプションです。

構文
								SELECT	
									カラム名1,カラム名2, ・・・
								FROM
									テーブル名
								ORDER BY
									並び替えたい列名 キーワード(ASC / DESC);
							
キーワード
ASC  : 昇順(小さいほうから)
DESC : 降順(大きいほうから)


データを並び替える(ORDER BY)昇順に並び替える
以下のようなテーブルが合った場合に昇順に並び替えるには次にようにします。
CODETITLEPRICE
001java入門2000
002javaの本1500
003javaの基礎1800
004やさしいjava2500
例文
								SELECT 
CODE,TITLE,PRICE FROM TBL_EHON_2 ORDER BY PRICE ASC;
「TBL_EHON2テーブル」の全てのデータを、PRICE列を
基準に昇順に並び替えてください」という意味

ASCをDESCに変更すれば、降順に並び替えることが出来る。
CODETITLEPRICE
002javaの本1500
003javaの基礎1800
001java入門2000
004やさしいjava2500
データを並び替える(ORDER BY)複数列の並び替え
ORDER BY句では複数列の並び替えが出来ます。
その場合は、ORDER BY句に複数列を指定します。

また、指定した列にそれぞれ昇順、降順を指定することが出来ます。
複数列指定した場合は、並び替える優先順位の高い方から記述します。
構文
								SELECT	
									カラム名1,カラム名2, ・・・
								FROM
									テーブル名;
								ORDER  BY 
								列名 キーワード(ASC / DESC),列名  キーワード(ASC / DESC);
							
データを並び替える(ORDER BY)
以下のテーブルをPRICE列とCODE列を使用して並び替えるには次にようにします。
             TBL_EHON_3
CODETITLEPRICE
001java入門2000
002javaの本1500
003javaの基礎1800
004やさしいjava2500
このSQLを実行すると、次のようになります。
まず、PRICE列を基準に並び替えます。
CODETITLEPRICE
003javaの基礎1500
002javaの本1500
001Java入門2000
004やさしいjava2500
上記の状態ではPRICE列が同じ値の箇所はきれいに並び替わっていません。
その為、次にORDER BYで指定した2つ目のキーを基準に並び換えます。
CODETITLEPRICE
002javaの本1500
003javaの基礎1500
001java入門2000
004やさしいjava2500
これで、2つ目のキーを基準に並び替えたことになります。
まず、PRICE列を基準に並び替えて、値が等しい箇所だけCODE列を基準に並び替えます。  補足
並び替えは指定した列のデータ型によって、次のように並び替えます。

①文字データ
 ・英字   : アルファベット順
 ・日本語 : 文字コード

②日付
 ・日付順

③並び替えの列データがNULLの場合
 ・昇順  : 最後
 ・降順  : 先頭
GROUP BY
データをグループ化する(GROUP BY)
SQLにおけるグループ化とは、同列内の値の中で、同じ値を持つデータごとに集合化すること。 グループ化には「GROUP BY」というオプションをつけます。
構文
								SELECT
									カラム名1
								FROM
									テーブル名
								GROUP  BY
									グループ化したい列名;
							
以下のようなテーブルがあるとします。
CODE、PRICEは違うが、TITLEが同じ「java入門」というデータがあるとします。
             TBL_EHON_4
CODETITLEPRICE
001java入門2000
002javaの本1500
003javaの基礎1800
004やさしいjava2500
005java入門1900
006java入門1900

例文
								SELECT
									TITLE
								FROM
									TBL_EHON_4
								GROUP  BY  TITLE;
							

TITLE
java入門
javaの本
javaの基礎
やさしいjava
グループ化により、3つの「java入門」が

データをグループ化する(GROUP BY)
 複数列のグループ化
GROUP BYでは複数の列を指定することが出来ます。
先ほどのNG例を基に説明します。
例文
								SELECT	
									TITLE,PRICE
								FROM
									TBL_EHON_4
								GROUP  BY  TITLE, PRICE;
							
GROUP BY句の後ろにTITLEとPRICEを指定することにより、 TITLE毎のPRICEを取得することができます。

TITLETITLE
java入門2000
javaの本1500
javaの基礎1800
やさしいjava2500
java入門1900
補足
GROUP BYを使用した場合、SELECT句に指定出来る列名は、グループ関数か、 GROUP BYで指定した列名、あるいはそれらの組み合わせだけです。つまり、GROUP BY句で指定されていない列名をSELECT句で指定するとエラーになります。
 

関数
関数
処理の集まりのことを指します。
SQLであらかじめ提供されている機能のことで、JAVAでいうメソッドのようなものです。

関数は基本的に次のように記述します。
関数名(引数) 引数とは処理に必要な材料のことです。
中には引数を必要としない関数もありますが、基本的には関数とは
「引数を受け取って処理した結果を戻すもの」とイメージしてください。
SQLの関数にはその働きによって、以下の関数があります。

・数値関数(ABS,ROUND,・・・)
・文字列関数(LEN,LTRIM,・・・)
・日付関数(DAY,DATEADD,・・・)
・変換関数(CAST,TO_CHAR,・・・)
・集計関数(MAX,MIN,・・・)
などなど。

関数は非常に多くのものが存在しますので、
ここで紹介する関数以外も必要に応じて調べてみてください。
集計関数
1つのカラムに対して集計結果(1つの結果)を求める関数のこと。
集計関数の種類には以下のものがある。
関数名説明
COUNT指定されたカラムのデータ数を求める
MAX指定されたカラムの最大値を求める
MIN指定されたカラムの最小値を求める
SUM指定されたカラムの総和(合計)を求める
AVG指定されたカラムの平均を求める
 使用方法
基本的にはSELECT句に記述します。

以下のようなテーブルのHOBBY列のデータ数を取得するとします。
NAMEAGEHOBBY
A20釣り
B21スノーボード
C22(null)
例文
								SELECT	
									COUNT( HOBBY )
								FROM
									TBL_HOBBY;
							
COUNT関数は、データ数を求めるので、NULLは数えません。 ですので、結果は「2」になります。純粋にテーブルの レコード数を求める場合は、COUNT( * ) とします。 これで、いずれかのカラムにデータがあれば、1件として数えます。 全てのカラムの値がNULLのレコードは存在しないので、 レコード数が求められます。
COUNT(HOBBY)
 他の集計関数
その他の集計関数も使用方法は同じになります。
例文
								SELECT
									COUNT( * ),MAX( AGE ),MIN( AGE ),SUM( AGE ),AVG( AGE )
								FROM
									TBL_HOBBY;
							
COUNT( * )MAX( AGE )MIN( AGE )SUM( AGE )AVG( AGE )
322206321
集計関数は、複数のレコードから集計した結果を1つだけ出力するので、
結果は必ず1つになります。
 GROUP BYとの組み合わせ
GROUP BYを使用する場合、集計関数を一緒に利用する場合が非常に多いです。
GROUP BYと組み合わせると、行をグループ化し、そのグループごとに集計処理を行うことができます。
以下のようなテーブルがあり、GUESTNO毎の経験年数を全て合計した結果を取得します。
             TBL_ENGINER
GUESTNOLANGAGEYEARSRANK
1JAVA3A
1VB2A
1C7S
2JAVA1C
2VB2B
2PERL3B
3JAVA2S
3VB1B
3PERL2A
3C++3S
例文
								SELECT	
									COUNT( YEARS ), AVG(YEARS ) , SUM(YEARS ), MAX(YEARS ),MIN(YEARS )
								FROM
									TBL_ENGINER
								GROUP BY
									GUESTNO;
							

COUNT(YEARS)AVG(YEARS)SUM(YEARS)MAX(YEARS)MIN(YEARS)
341272
32631
42831
列名を変える
AS 演算子を使うと、既存の列に別の名前をつけて表示することができます。
列名を一時的に変更するだけで、元の列名が書き換えられるわけではありません。
例文
								SELECT
									GUESTNO,AVG( YEARS )  AS  平均年齢
								FROM
									TBL_ENGINER
								GROUP BY  
									GUESTNO;
							

COUNT(YEARS)平均経験年数
14
22
32
そのまま表示してしまうと、何を表示しているのかが作成者以外には 分かりにくくなってしまいますので、別の名前(別名)をつけることにより、 分かりやすくしていきましょう。また、別名のことをエイリアスとも呼びます。
WHERE
特定のデータを取り出す(WHERE)
SELECT文に条件を指定して、その条件に合ったデータのみを取り出す方法です。
条件を使って特定のデータを取り出すには、SELECT文にWHERE句を追加します。
構文
								SELECT
									カラム名1
								FROM
									テーブル名
								WHERE
									取り出す条件;
							
以下のようなテーブルがあるとします。
ZIP列の値が「170-0000」の人の名前を取り出すとします。
               TBL_ADDRESS
NAMEZIPADDRESS
牧野170-0000東京都世田谷区
松本690-0000埼玉県さいたま市
中川170-0000東京都世田谷区
牧野943-0000神奈川県横浜市
例文
								SELECT	
									NAME  AS  名前
								FROM
TBL_ADDRESS WHERE ZIP = ‘170-0000’;
名前
牧野
中川
特定のデータを取り出す(WHERE)
WHERE句とORDER BY句と組み合わせて使うことが出来ます。
以下のテーブルから、EIGO列の値が90以上のデータをID列の値が大きい順に取り出します。
               TBL_SCORE
IDNAMEKOKUGOEIGO
01牧野7075
02松本9590
03中川8099
04高井7586
例文
								SELECT
									NAME,KOKUGO,EIGO
								FROM
									TBL_SCORE
								WHERE
									EIGO >= 90
								ORDER BY
									ID	DESC;
							
まず、EIGOの値が90以上のデータを抽出し、その
抽出したデータをID列を基準に降順に並び替える
NAMEKOKUGOEIGO
中川8099
松本9590
特定のデータを更新、削除する(DML)
UPDATE文、DELETE文にもWHERE句を使うことが出来ます。
既存のデータから特定のデータだけを変更したい場合や、特定のデータだけを削除したい場合にはSELECTと同じようにWHERE句を使用します。
                 TBL_SCORE
IDNAMEKOKUGOEIGO
01牧野7075
02松本9590
03中川8099
04高井7586
例文
								UPDATE
									TBL_SCORE
								SET
									KOKUGO = 85
								WHERE
									NAME = ’牧野’;
							

NAME列の値が「牧野」というデータのKOKUGO列の値を「85」に更新します。
IDNAMEKOKUGOEIGO
01牧野8575
02松本9590
03中川8099
04高井7586
 同じように特定のデータだけを削除します。
                 TBL_SCORE
IDNAMEKOKUGOEIGO
01牧野8575
02松本9590
03中川8099
04高井7586
例文
								DELETE	FROM  
									TBL_SCORE
								WHERE
									EIGO >=90;
							

IDNAMEKOKUGOEIGO
01牧野8575
04高井7586
EIGO列の値が90以上のデータが削除されました。

 

演算子
演算子(算術演算子)
SQLで計算に使える演算子には以下のものがあります。
演算子働き使い方意味
+(プラス)足すa+baとbを足す
―(マイナス)引くa-baからbを引く
*(アスタリスク)かけるa*baとbをかける
/(スラッシュ)割るa/baをbで割る
%(パーセント)余りa%baをbで割った余り
 記述例
PRICE列の値に「0.05」をかける PRICE * 0.05
TOTAL列の値をNUM列の値で割る (列名=その列に入っている値になります。)
 TOTAL / NUM
 優先順位
算数には「式の中の( )でくくった部分を先に計算する」
というルールがありますが、SQLの算術演算子にも同様の
ルールが適用されます。

TOTAL列の値をNUM列の値で割り、その結果に0.05をかける
(TOTAL / NUM) * 0.05
演算子(比較演算子)
WHERE句では、値や数値を比較して条件式を作り、その結果によって処理を変えることができました。この時に使う演算子を比較演算子といいます。
演算の結果、条件が成り立った場合は「TRUE(真)」、成り立たない場合は「FALSE(偽)」が返ります。
比較演算子には以下のものがあります。
演算子使い方意味
a = baとbは等しい
a < baはbより小さい
<=a <= baはb以下
a > baはbより大きい
>=a >= baはb以上
<>a <> baとbは等しくない
!=a != baとbは等しくない
補足
文字列も「=」演算子で等しいかどうか比べることが出来ます。
その場合、数値とは違い「’(シングルクォーテーション)」で値を囲む必要があります。
☆数値の場合 ⇒ AGE = 20
☆文字列の場合 ⇒  NAME = 'A'

演算子(論理演算子)
複数の条件を組み合わせて、より複雑な条件を表すことが出来ます。
この時、条件を組み合わせることが出来る演算子を論理演算子といいます。
論理演算子には以下のものがあります。
演算子働き使い方意味
ANDかつa >= 10 AND a <= 20 aは10以上かつ20以下
ORまたはa = 5 OR a = 10 aは5か10
NOT~ではないNOT a = 200aは200以外
 使用例
比較演算子と論理演算子を使用する。
WHERE
 a >= 60
AND
 a <= 80
AND
 b = 200

演算子(LIKE演算子)
文字列を完全に一致したデータではなく、特定の文字を含むデータ
を取り出したいときは、LIKE演算子を使います。

例文
								SELECT
									TITLE
								FORM
									TBL_EHON_4
								WHERE
									TITLE  LIKE  ' j % ';
								

TITLE列のデータが「j」からはじまる全てのデータを取り出す。
 条件の付け方
記号働き使い方意味
%(パーセント)任意の数の文字列例) %山%富士山、山田、など「山」含まれる文字列
_(アンダースコア)1文字例) _おりしおり、かおり、など「おり」の前に任意の1文字が入る文字列
演算子(NULL演算子)
指定した列の値がNULLかどうかを調べたい時は、「IS NULL」演算子を使います。
IS NULL演算子は、次の2通りの使い方があります。
構文
									WHERE
										列名 IS  NULL;
									指定した列の値がNULLのデータ
									WHERE
										列名 IS  NOT  NULL;
									指定した列の値がNULLではないデータ
									※ 「列=NULL」とは書きません	
								
NAMEAGEHOBBY
A20釣り
B21スノーボード
C22(null)
例文
								SELECT
									HOBBY,	NAME
								FROM
									TBL_HOBBY
								WHERE
									HOBBY  IS NULL
							
HOBBY列のデータがNULLのものだけ取り出す
NAMEHOBBY
C(null)
演算子(IN演算子)
IN演算子を使うと、( )内に指定した値と一致したデータだけを取り出すことが出来ます。

例文
								SELECT
									HOBBY,	NAME
								FROM
									TBL_HOBBY
								WHERE
									AGE  IN ( 20, 21 );
							
複数の値を指定するときは、「,」で区切って列挙します
また、INとは逆に「指定した値以外」という条件を付けたいときは、NOT IN を使います。
例文
								SELECT
									HOBBY,	NAME
								FROM
									TBL_HOBBY
								WHERE
									AGE  NOT  IN ( 20, 21 );
							
これは、比較演算子を複数組み合わせた場合と同じです。
 

リレーショナルデータベース
リレーショナルデータベース(RDB)
データを行と列で構成された表形式で管理します。
RDBでは、テーブルとテーブルに関係を持たせたデータベースになります。
簡単に言うと、テーブルどうしがつながっているイメージです。
では、実際にどのように作成していくのかを見て行きましょう。
              商品テーブル
S_IDNAMEPRICE
1りんご100
2みかん150
3なし200
              売上テーブル
DATESEQ_NOS_IDCNT
1/11110
1/1235
1/2127
1/22110
この2つのテーブルは、関係を持つように作りました。
どこで、関係を持っているかというと、商品テーブルのS_IDと売上テーブルのS_IDになります。

売上テーブルのS_IDを見ただけでは、何が売れたのかは分かりません。
しかし、商品テーブルのS_IDからNAMEを見ることで、何が売れたのかが分かります。
つまり、次のように表すことが出来ます。
DATESEQ_NOS_IDNAMECNT
1/111りんご10
1/123なし5
1/212みかん7
1/221りんご10
先ほどの例を見てみると、売上テーブルの方に、商品名などを持たせるのがいいか
と思いますが、 テーブルを分けることで、重複しているデータの削除が出来ます。

たとえば、売上テーブルに商品名と単価のカラムを持たせて見ましょう。
              売上テーブル
DATESEQ_NOS_IDCNT
1/11110
1/1235
1/2127
1/22110
すると、商品のデータが重複します。
りんごが100円なのは1レコード目を見れば分かるのに、4レコード目にもデータがあります。
これが、100件、1000件を超える量になると、データ量がとても多くなってしまいます。
この問題をテーブルを分割することで、解決しています。
つまり、売上テーブルのデータが何件になろうと、商品テーブルのデータは変わりません。
さらに、商品の名前や単価が変更になった場合、売上テーブルのデータを変更する必要もありません。
リレーショナルデータベース(PK/FK)
主キー:プライマリーキー:PK
主キー(PRIMARY KEY)とは、テーブルの中で1行を特定する為の列です。
たとえば、学生名簿テーブルを作成するとします。
その時、学生番号を主キーにしておけば、同姓同名の人がいても学生番号が違うので、
区別することができます。
   ~ 主キーを設定していない場合 ~
名前
あおやまたろう
あおやまたろう
同姓同名のため行を特定することが出来ません
   ~ 主キーを設定した場合 ~
学生番号名前
1あおやまたろう
20あおやまたろう
主キーによって行を特定できます。
主キーとなった列には以下の特徴があります。

①主キーとなった列には、値が重複しません。
②複数のカラムで1つの主キーにすることも出来ます。

外部参照:フォーリンキー:FK
外部キー(FOREIGN KEY)とは別々のテーブルに存在する列同士を同期させる仕組みです。
たとえば、先ほどの商品テーブルと売上テーブルだと、
商品テーブルのS_ID列は商品テーブルの主キーでした。
そして、売上テーブルのS_ID列が外部キーになります。
       商品テーブル(PK 側)
S_IDNAMEPRICE
1りんご100
2みかん150
3なし200
       売上テーブル(FK として商品テーブルを参照)
DATESEQ_NOS_IDCNT
1/11110
1/1235
1/2127
1/22110
外部キーには以下の特徴があります。
①FKとなったカラムには指定された他のテーブルのPKの値を入れる必要がある。
リレーショナルデータベース
 補足
データベースには一般的に「マスタテーブル」と「トランザクションテーブル」が存在しています。

マスタテーブル : 更新頻度が低いテーブル又は、存在しないと困るデータ、テーブル
例)商品テーブル、都道府県テーブル
トランザクションテーブル : 更新頻度が高いテーブル又は、取引に関するデータ など
例)売上テーブル、在庫テーブル
 テーブル定義
テーブルの状態を表す図をテーブル定義といいます。
カラム名、データ型、NULL制約、初期値などの情報が記述されているものです。
       TABLE_PLACE (事業所の管理テーブル)
KEYカラム名データ型サイズNULL?
PKPLACE_IDVARCHAR24NOT NULL
PLACE_NAMEVARCHAR214
PLACE_TELVARCHAR215
 

ER図
ER図(エンティティ リレーション図)
エンティティとは
テーブルのことです。
 ER図(エンティティ リレーション図)とは
テーブル同士の関連を表した図になります。
 例
先ほどの商品テーブルと売上テーブルのER図は次のようになります。
1対n
 1レコードに対して0以上
 関係のあるレコードが存在する。
1対1
 1レコードに対して1つ、
 関係のあるレコードが存在する。
まずテーブルの構成を表します。
そして、関連のあるカラム同士を線で繋ぎます。
この時、何対何の関係か表します。

直線、数値を記載することもあれば、線の先を記号にして表す
こともあります。
この数値や記号は作成者によって変わるものですが、
その場合、ER図にその数値や記号の種類が記載されていますので、
どのテーブルがどんな関係化はすぐにわかります。

今回の商品テーブルと売上テーブルは、「1 対 n」の関係であるという
ことを表しています。
結合
結合
2つ以上のテーブルを連携させて操作することを結合といいます。
離れた場所にあるテーブルのデータを1度に扱えるようにすることで、
指定した列の値が一致するデータのみを取り出す方法のことです。
 結合のルール
①2つ以上のテーブルのカラムを取得する場合
②データの整合性を保つ為に結合条件を指定する場合
 結合の仕方
結合したテーブルをFROM句に列挙し、WHERE句に結合する対象のカラムを指定します。
構文
								SELECT 
									カラム名1,・・・
								FROM
									テーブル名1,テーブル名2,・・・
									結合するテーブルを「,」で区切って列挙する
								WHERE
									結合対象条件;
									一致させる列の名前を「=」で結ぶ
							
 結合の仕方
以下に2つのテーブルがあります。
      TBL_RANK
KEN_IDKEN_RANK
01
02
03
       TBL_USER
USER_IDKEN_IDUSER_NAME
00101山田一郎
00202山田二郎
00303山田三郎
00404山田四郎
TBL_RANKに権限のランクを、TBL_USERにユーザーの情報が設定されています。

SELECT * FROM TBL_USER;

これで、ユーザーの情報全てを取得することが出来ます。
しかし、TBL_USERだけを見ると、IDと名前だけで、誰がどんな権限を持っているかは分かりません。
その権限を見る為にはTBL_RANKを参照しなければなりません。
そこで、結合がでてきます。

このTBL_RANKのKEN_IDとTBL_USERのKEN_IDは関連を持っているデータです。
ですので、このカラムの値が同じものだけ結合すればいいのです。
 結合の仕方
      TBL_RANK
KEN_IDKEN_RANK
01
       TBL_USER
USER_IDKEN_IDUSER_NAME
00101山田一郎
00202山田二郎
00303山田三郎
00404山田四郎
構文
								SELECT	
									USER_NAME,KEN_RANK
								FROM
									TBL_RANK,TBL_USER
									結合するテーブルの名前を「,」で区切って列挙する
								WHERE
									TBL_RANK .KEN_ID = TBL_USER.KEN_ID;
									一致の基準となる列名を「=」で結ぶ
									列の結合の際には、「テーブル名.カラム名」とします。
									そうすることによって、どのテーブルのどのカラムを
									結合させているのかが、分かりやすくなります。
								
 結合の仕方
条件として、TBL_RANKのKEN_IDとTBL_USERのKEN_IDがイコール(同じ)だった場合、
TBL_RANKとTBL_USERの情報が結合されます。
USER_NAMEKEN_RANK
山田一郎
山田二郎
山田三郎
これで、どのユーザーがどんな権限を持っているのかが分かりました。
山田四郎のKEN_IDはTBL_USERにはデータがありませんので、結果が取り出せません。
 結合をしない場合
結合条件のWHERE句にカラムを指定しなかった場合にどうなるのかを見てみます。
先程のSELECT文から結合条件を削除してみます。
構文
								SELECT
									USER_NAME,KEN_RANK
								FROM
									TBL_RANK,TBL_USER
							
結果は以下のようになります。
KEN_IDKEN_RANKUSER_IDKEN_IDUSER_NAME
01S00101山田一郎
01S00202山田二郎
01S00303山田三郎
01S00404山田四郎
02A00101山田一郎
02A00202山田二郎
02A00303山田三郎
02A00404山田四郎
03B00101山田一郎
03B00202山田二郎
03B00303山田三郎
03B00404山田四郎
FROM句にテーブル名を2つ記述しただけでは、KEN_IDが一致しなくても関係なく、
それぞれのデータに掛け算をしたような結果が取り出されます。
結合での注意点
 整合性を保つ
ルール②でもありましたとおり、「データの整合性を保つ為に結合条件を指定」
ということですので、結合する際はまずどのテーブルのPKとFKが関連を持っている
のかをしっかり把握した上で、結合するようにしてください。
特に、FKの指定されているテーブルのデータを使用する場合は、そのテーブルだけでは
整合性を保てない可能性がありますので、しっかり関連をみてください。
 2つ以上のテーブルのデータを取得
必ず2つ以上のテーブルを使用しデータを取得する場合は、結合をしてください。
 結合はPKとFK以外でも結合することが出来ます。
外部結合
外部結合
 結合の種類
結合には2種類あります。
① 内部結合(等価結合)
  等価と言われるように、結合対象の両方のテーブルが持っているデータのみ取得できます。

② 外部結合
  軸となるテーブルと一致するデータが結合対象のテーブルにあれば、そのまま取得でき、
  一致しない場合は、NULLとなって取得できます。
 外部結合の仕方
結合条件を記述するときに、軸となるテーブルとは逆のテーブルに、(+)をつけます。
構文
								SELECT
									カラム名1,・・・
								FROM
									テーブル名1,テーブル名2,・・・
								WHERE
									テーブル名1.カラム名 = テーブル名2.カラム名(+);
									軸となるテーブルとは逆のテーブルの方に(+)をつける
							
 結合の仕方
以下に2つのテーブルがあります。
このテーブルはIDをキーに結合してみます。
      TBL_JOIN_A
A_IDA_NAME
01
02
03
A_IDとB_IDを条件にして結合

      TBL_JOIN_B
B_IDB_NAME
01
02
04
 内部結合の場合
A_IDA_NAMEB_IDB_NAME
0101
0202
 外部結合(TBL_JOIN_Aを軸)の場合
A_IDA_NAMEB_IDB_NAME
0101
0202
03NULLNULL
例文
								SELECT
									*
								FROM
									TBL_JOIN_A	A, TBL_JOIN_B	B
								WHERE
									A.A_ID = B.B_ID(+);
							
 外部結合(TBL_JOIN_Bを軸)の場合
A_IDA_NAMEB_IDB_NAME
0101
0202
NULLNULL04
例文
								SELECT	 * FROM
									TBL_JOIN_A	A, TBL_JOIN_B	B
								WHERE
									A.A_ID (+) = B.B_ID;
							
このように、外部結合の場合は軸になったテーブルのデータは全て取得でき、
結合対象のデータは、存在していればそのデータを取得し、なければNULLになります。;
サブクエリ
サブクエリ(副問い合わせ)
SELECT文の中にさらにSELECT文を記述することが出来ます。
このSELECT文の中のSELECTのことをサブクエリといいます。

サブクエリを使うと、通常1つのSELECT文では取り出せないような
複雑な条件を元にデータを取り出すことが出来ます。
 注意点
サブクエリを行うと基本的に検索にかかる時間が非常に遅くなる可能性があります。
その為、一度のSELECTでは取得出来ないデータを取得する場合にだけ使用してください。
 サブクエリ
サブクエリは全ての句内で使用することが出来ます。(Oracleのみ)
但し、記述する場所によって条件が存在しています。
構文
								SELECT	
									サブクエリの結果が1行1列になること
								FROM
									サブクエリの結果がn行n列になること
								WHERE
									比較演算子を使用した場合
									 ・サブクエリの結果がn行n列になること
									メンバーシップ条件を使用した場合
									・サブクエリの結果がn行1列になること
								
※ サメンバーシップ条件:INやNOT INなどの複数条件を入れることが出来るもの。

 WHERE句でのサブクエリ
WHERE句の中でサブクエリを使用することが出来ます。

たとえば、以下のテーブルから年齢が一番大きい人の名前を取り出すとします。
このテーブルはIDをキーに結合してみます。     TBL_QUERY
NAMEAGE
Aさん20
Bさん21
Cさん22
以下のSQLを実行すると、実際に欲しい結果ではないものが取れてしまいます。
例文
								SELECT
									NAME,  MAX(AGE)
								FROM
									TBL_QUERY
							
    TBL_QUERY
NAMEAGE
Aさん22
Bさん22
Cさん22
これをサブクエリを使って次のように書き換えます。
そうすると欲しい結果を取り出すことが出来ます。

 WHERE句でのサブクエリ
例文
								SELECT	
この結果を基に実行される NAME, AGE FROM TBL_QUERY WHERE AGE = (SELECT MAX(AGE) FROM TBL_QUERY) サブクエリは( )でくくります。
サブクエリ(副問い合わせ)
NAMEAGE
Cさん22
①まずサブクエリを実行 年齢の最大値を算出します。
NAMEAGE
Aさん20
Bさん21
Cさん22
MAX(AGE)は22です。
②次に外側のSELECTを実行します。最大年齢の人を抽出
NAMEAGE
Cさん22
年齢が22の人を抽出
 FROM句でのサブクエリ
FROM句の中でサブクエリを使用することが出来ます。
FROM句の中のサブクエリは仮想で別のテーブルを作成するイメージになります。

先ほどのテーブルから年齢が21以上の人で最少年齢の人の名前を取り出すとします。
例文
								SELECT	
									この結果を基に実行される
									MIN ( AGETBL.AGE )
								FROM
									( SELECT  NAME,  AGE  FROM	TBL_QUERY  WHERE AGE >= 21 )  AGETBL
									サブクエリで出来る仮想のテーブルに名前をつけます。
							

NAMEAGE
Bさん21
 FROM句でのサブクエリ
先ほどの処理の流れは次のようなイメージです。

①まずサブクエリを実行します。
 年齢が21以上のデータを抽出し、それにAGETBLという名前をつけます。

    TBL_QUERY
NAMEAGE
Aさん20
Bさん21
Cさん22

    AGETBL
AGE
21
22
②次に外側のSELECTを実行します。
AGETBLからAGE列の最少年齢を取得します。
AGE
21
 メンバーシップ条件でのサブクエリ
例)IN
例文
								SELECT
									NAME,  AGE
								FROM
									TBL_QUERY
								WHERE
									AGE IN( (  SELECT  AGE	FROM  TBL_QUERY   ) )
									INは以下の記述と同じ意味になります。
								AGE IN ( 20, 21, 22 )
							   ↓
								WHERE 
								 AGE = 20 
								OR
								 AGE = 21
								OR
								 AGE = 22
							
 

集合
集合
 集合
2つのSELECT文の結果どうしを加算、積算、減算を行うものです。

集合には以下の3種類があります。
 ①加算(和集合) : UNION と UNION ALL
 ②積算(積集合) : INTERSECT
 ③減算(差集合) : MINUS

  ここでは①の加算(UNION)について説明します。その他は各自しらべて使用してみてください。
 集合の条件
集合を用いる場合は、以下の条件があります。
 ①カラム数が同じ
 ②カラム名が同じ
 ③データ型が同じ
 和集合( A+B の結果を求める)

※ 重なりあった部分は除かれる

 積集合( AとB の重なっている部分だけを求める)

 差集合( A-B の結果を求める)

 和集合(UNION)

構文
								SELECT
									カラム名
								FROM
テーブル名A 結果A UNION 上の結果と、下の結果の和集合を求める SELECT  カラム名 FROM テーブル名B;
以下の2つのテーブルの和集合を取得します。
    TBL_UNION_A
IDNAME
01青山太郎
02山田二郎
03青山三郎
    TBL_UNION_B
USER_IDUSER_NAME
06山田一郎
02山田二郎
05山田三郎
09山田四郎
 和集合(UNION)
構文
								SELECT	USER_ID, USER_NAME	FROM  TBL_UNION_B 
									UNION
								SELECT	ID,  NAME  FROM  TBL_UNION_A;  
									このようにカラム名が違う場合は、カラム名を合わせてやります。
							
構文
								SELECT	USER_ID, USER_NAME	FROM  TBL_UNION_B 
									UNION
								SELECT	ID AS USER_ID,	NAME  AS USER_NAME	FROM  TBL_UNION_A;
							
IDNAME
01青山太郎
02山田二郎
03青山三郎
06山田一郎
05山田三郎
09山田四郎
重複している山田二郎さんは1つのデータとしてまとめられ、
それ以外は全て表示されました。もし、重複しているデータも全て取得
したい場合は、「UNION ALL」を使用します。

 

トランザクション
データを保護する(トランザクション)
データベースには常に様々な人がアクセスし、データを取り出したり、更新したりすることが出来ます。
そこで、たとえば、同じデータに対して最新のデータを見たい人、データを更新したい人が
同時にアクセスすると、いったいどうなってしまうのか?
こんなときに出てくるのがトランザクションです。

トランザクションとは、関連する操作をひとまとめにしたもののことです。
上記の場合、あらかじめ最新のデータを見るための操作を
「最新のデータを見るトランザクション」としてまとめます。

すると、このトランザクションが実行している間は、だれもそのデータを扱うことが
出来ないようにデータに鍵をかけることが出来るのです。
これをデータのロックといいます。トランザクションが終了するとロックは解除され、
次の人がデータを扱えるようになります。
これによって、作業の競合によってデータに不具合が起こることをふせげます。

① Aさんがデータベースのデータを編集しているとします。
② データベースは編集が行われると、トランザクションというものを開始します。
③ トランザクションが開始されると、他のユーザーは編集が出来ません。
編集しようとすると、待ち状態になります。
④ Aさんの編集が終わるまで、トランザクションは終了しません。
Aさんは編集が終了したら、編集終了の旨をデータベースに伝えます。
⑤ 編集が終了すると、データベースはトランザクションを終了します。
すると待ち状態だったBさんの処理が行われます。
⑥ Bさんの編集が始まったので、データベースはトランザクションを開始します。
 トランザクションの終了
トランザクションは単に操作をまとめるだけのものではありません。
まとめた操作の終了時にそのトランザクションに含まれる操作を確定するか、
取り消すかを選択することが出来ます。
処理の結果を確定して終了する場合は、「コミット」、取り消す場合は「ロールバック」
を行います。

ロールバックを実行すると、文字通りトランザクションの操作が巻き戻され、
処理を行う前の状態に戻ります。
あらかじめ「エラーが起こった場合はロールバックする」というようにプログラミング
しておけば、事故によるデータの不具合が防げるわけです。
① 処理を確定する = コミット(COMMIT)
② 処理を取り消す = ロールバック(ROLLBACK)
 COMMIT
トランザクションの中で行った操作が完了した場合は、コミットを実行します。
コミットを実行すると、トランザクションの処理結果が確定され、データベースに
反映されます。
 ROLLBACK
トランザクションの中で行った操作が失敗した場合や、操作をやり直したい場合は、
ロールバックを実行します。ロールバックを実行すると、トランザクションの処理
は無効となり、データは処理を実行する前の状態に戻ります。
※ トランザクション制御を使用出来るのはDMLのみで、DDLは自動でCOMMIT
されます。
 トランザクション
たとえば以下の2つのテーブルがあったとします。
           受注テーブル
受注番号氏名受注日
0001A2005/1/1
0002B2005/1/2
0003C2005/1/3

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
           受注商品情報テーブル
受注番号連番商品名個数
00011コーラ1
00012コーヒー2
00013お茶3
00021コーラ4
00022コーヒー5
00031コーラ6

受注テーブルと受注情報テーブルは受注番号で関連を持っています。
この時、Aさんは受注番号が0001で3つの商品を同じ日に購入しています。
このデータを登録する際には受注テーブルに対して1つの登録SQL、
受注商品情報テーブルに対して3つの登録SQLを実行して、
受注番号0001の受注の登録が完了します。

実際のSQLは以下のようになります。
①INSERT INTO 受注テーブル ( 受注番号,氏名,受注日 ) VALUES ( '0001','A','2005/01/01' );

②INSERT INTO 受注商品情報テーブル ( 受注番号,連番,商品名,個数 ) VALUES ( '0001','1','コーラ','1' );

③INSERT INTO 受注商品情報テーブル ( 受注番号,連番,商品名,個数 ) VALUES ( '0001','2','コーヒー','2' );

④INSERT INTO 受注商品情報テーブル ( 受注番号,連番,商品名,個数 ) VALUES ( '0001','3','お茶','3' );

⑤COMMIT;
COMMITとは「処理結果を確定すること」といいましたが、
ここでは4つのSQLを実行した後にその結果を確定しています。 もし何らかのエラーが4つのSQLの途中で起こった場合は、その時にROLLBACK処理を行います。
(実際にはROLLBACK処理はプログラムの中で制御します。)

トランザクションはCOMMITを行ってから次のCOMMITをするまでを一つとして考えます。
(一番最初はCOMMITから始まらないのではじめからCOMMITまでをひとつと考える)
上記のSQLで言うと①から⑤のCOMMITまでを一つのトランザクションといいます。

ROLLBACKとは1つ前のCOMMITが実行された後まで戻ることになります。

以下のようなSQLにしてしまった場合どうなるでしょう。
①INSERT INTO 受注テーブル ( 受注番号,氏名,受注日 ) VALUES ( '0001','A','2005/01/01' );
 COMMIT;
②INSERT INTO 受注商品情報テーブル ( 受注番号,連番,商品名,個数 ) VALUES ( '0001','1','コーラ','1' );
 COMMIT;

③INSERT INTO 受注商品情報テーブル ( 受注番号,連番,商品名,個数 ) VALUES ( '0001','2','コーヒー','2' );
 COMMIT;

④INSERT INTO 受注商品情報テーブル ( 受注番号,連番,商品名,個数 ) VALUES ( '0001','3','お茶','3' );
 COMMIT;

⑤COMMIT;
先ほどと同じ③のSQLでエラーが発生したとします。
ここでROLLBACKをしても③のSQL以降が無効になるだけになり、
その結果、登録されたデータは受注番号0001に対して1つの商品しかありません。
本当は3つの受注があったにも関わらず、DBに登録されているのは1つのみしか無い為、 受注情報とDBデータで誤りが出てしまいました。
この時にもしもこの受注に対して検索をしてしまったら、1受注のデータとしては
正しくないデータが検索されてしまいます。
これを未然に防ぐには受注が全て正常に登録されてからコミットをする必要があります。

このようなことのないようにトランザクションの制御を行うのです。