この章で行う学習内容
データベースとは
データベースとは
「何らかの目的やルールに基づいて管理されたデータの集まり」のことです。
ここでポイントになるのが「管理された」という点です。
たとえば、机の上に本や文房具などが雑然と置いてあり、
どこに何があるかを誰も把握していない状態で、
「sqlの本を取ってください」と言われても直ぐに取ることは出来ません。
一方、何らかのルールに基づいて文房具や本がしっかり保管されていれば、
「sqlの本を取ってください」と言われたときに、
どの棚の何番目においてあるかが直ぐに分かり、要求に応えることができます。
後者のような形で保管された本などのことをデータベースだとすると、
これらを管理している人はデータベース管理システムという仕組みになります。
つまり、データベースとは、データベース管理システムによって整理整頓して
使いやすくした状態のデータの集まりのことです。
ここでポイントになるのが「管理された」という点です。
たとえば、机の上に本や文房具などが雑然と置いてあり、
どこに何があるかを誰も把握していない状態で、
「sqlの本を取ってください」と言われても直ぐに取ることは出来ません。
一方、何らかのルールに基づいて文房具や本がしっかり保管されていれば、
「sqlの本を取ってください」と言われたときに、
どの棚の何番目においてあるかが直ぐに分かり、要求に応えることができます。
後者のような形で保管された本などのことをデータベースだとすると、
これらを管理している人はデータベース管理システムという仕組みになります。
つまり、データベースとは、データベース管理システムによって整理整頓して
使いやすくした状態のデータの集まりのことです。
データベース管理システム(DBMS:DataBase Management System)
データベースは、データベース管理システムというソフトウェアによって管理されます。
実際にデータを取り出したりしまったりするのは、データベース管理システムの仕事です。
使用者の操作は次のような流れで行います。
実際にデータを取り出したりしまったりするのは、データベース管理システムの仕事です。
使用者の操作は次のような流れで行います。
特徴
データを様々な方法で共有できる
膨大なデータを最小限にまとめることができる
ユーザ毎にデータへのアクセス管理ができる
データの更新制御ができる(後述の「トランザクション」を参照)
膨大なデータを最小限にまとめることができる
ユーザ毎にデータへのアクセス管理ができる
データの更新制御ができる(後述の「トランザクション」を参照)
データベースの種類
階層型、ネットワーク型、リレーショナル型など様々なデータベースが存在しています。
その中でも現在最も広く利用されているのが、リレーショナル型データベースです。
階層型・・・データが1対多の親子関係で、結ばれている。
ネットワーク型・・・データが多対多の親子関係で、結ばれている。
リレーショナル型・・・データを列と行からなる表形式で管理する。
その中でも現在最も広く利用されているのが、リレーショナル型データベースです。
階層型・・・データが1対多の親子関係で、結ばれている。
ネットワーク型・・・データが多対多の親子関係で、結ばれている。
リレーショナル型・・・データを列と行からなる表形式で管理する。
リレーショナルデータベース(RDB)
データを行と列で構成された表形式で管理します。RDBではテーブルとテーブルに、関係を持たせたデータベースになります。
リレーショナルデータベース(RDB)
データを行と列で構成された表形式で管理します。RDBではテーブルとテーブルに、関係を持たせたデータベースになります。
リレーショナルデータベースの種類
DB名 | 会社 |
---|---|
Oracle | Oracle社 |
MySQL | Oracle社 |
DB2 | IBM |
Access | MicroSoft |
データベースの構造
データベースにはインスタンスがありその中にスキーマ(ユーザ)を複数持つことができるスキーマの中にはテーブルを複数持つことができる
テーブルは、データを列(カラム)と行(レコード)で構成された2次元の表形式のようなものです。たとえば、住所録テーブルがあったとします。 住所録テーブルは、名前、年齢、郵便番号、住所などの列(カラム)と、登録人数分の行(レコード)で構成されます。
テーブルは、データを列(カラム)と行(レコード)で構成された2次元の表形式のようなものです。たとえば、住所録テーブルがあったとします。 住所録テーブルは、名前、年齢、郵便番号、住所などの列(カラム)と、登録人数分の行(レコード)で構成されます。
SQLとは
SQLとは
コンピュータ言語の一つで、「データベース管理システムと対話する為の言葉」といえます。
データベース管理システムに対して、何らかの要求をする時に、SQLを使って呼びかけるわけでが、 このデータベース管理システムに対して呼びかけることを問い合わせ(クエリ)といいます。
SQLとは
キャストの条件
キャストする場合は、必ず継承関係でなければならない。
全てのクラスはobject型にキャストすることが出来る)
データベースやテーブルの作成
データの取得
データの操作
データの保護
キャストする場合は、必ず継承関係でなければならない。
全てのクラスはobject型にキャストすることが出来る)
データベースやテーブルの作成
データの取得
データの操作
データの保護
SQLの注意点
半角で記述する
コメントと‘ ‘(シングルクォーテーション)文字列内は全角での記述が可能です
全角スペースの使用に注意する
コメントと‘ ’文字列以外に全角スペースを入れるとエラーになります。(要注意)
コメントは /* と */ でくくる。もしくは -- で書き出す。
sqlは大文字で記述する
コメントと‘ ‘(シングルクォーテーション)文字列内は全角での記述が可能です
全角スペースの使用に注意する
コメントと‘ ’文字列以外に全角スペースを入れるとエラーになります。(要注意)
コメントは /* と */ でくくる。もしくは -- で書き出す。
sqlは大文字で記述する
SQL参考サイト
【参考URL】
おらおらSQL: http://www.iceprobe.net/database/oracle/oraorasql/index.php
こちらのサイトを参考にしてみてください。
おらおら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
※ 年月日 時 分 秒 ミリ秒
例)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を指定すると、
データを登録する際に、絶対に何かしらの
値を入れる必要があります。
この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 特定の列だけにデータを登録することができます。
データを登録しない列には、基本的にnullが入ります。
先ほどのテーブルに「ほうじ茶」を登録してみます。
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 」という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を使用してください。
ですが、データは削除されましたが、
テーブル自体が削除されたわけではありません。
テーブルを作成した時のデータの無い状態に戻っただけで、
テーブルを削除する場合は、DROP TABLEを使用してください。
SELECT
SELECTとは
テーブルからデータを取り出す時は、「SELECT」というSQLを発行します。
構文
SELECT カラム名1,カラム名2, ・・・ FROM テーブル名;
たとえば、以下のようなテーブルから指定した列のデータを取り出してみます。
TBL_EHON_2 CODE | TITLE | PRICE |
---|---|---|
001 | java入門 | 2000 |
002 | javaの本 | 1500 |
003 | javaの基礎 | 1800 |
004 | やさしいjava | 2500 |
構文
SELECT TITLE, PRICE FROM TBL_EHON_2;
*複数の列を取り出す時は列名を「,(カンマ)」で区切る
*取り出したい列名
*テーブル名
*取り出したい列名
*テーブル名
ここに列挙した順番で列のデータが表示される。
TITLE | PRICE |
---|---|
java入門 | 2000 |
javaの本 | 1500 |
javaの基礎 | 1800 |
やさしいjava | 2500 |
テーブルの全ての列を取り出すことも出来ます。
構文
SELECT * FROM テーブル名;
全カラム指定の場合は「*」で書く事が出来ますが、使用しないで下さい。
どのようなデータを取り出しているのかが第3者から分かりにくくなってしまいます。
テーブル一覧
スキーマが持っているテーブル名を全て表示する
スキーマに登録されているテーブル名の一覧を表示することが出来ます。
スキーマに登録されているテーブル名の一覧を表示することが出来ます。
例文
SELECT TABLE_NAME FROM USER_TABLES;
ORDER BY
データを並び替える(ORDER BY)
指定した列を基準にデータを並び替えることの出来るSELECTのオプションです。
構文
SELECT カラム名1,カラム名2, ・・・ FROM テーブル名 ORDER BY 並び替えたい列名 キーワード(ASC / DESC);
キーワード
ASC : 昇順(小さいほうから)
DESC : 降順(大きいほうから)
ASC : 昇順(小さいほうから)
DESC : 降順(大きいほうから)
データを並び替える(ORDER BY)昇順に並び替える
以下のようなテーブルが合った場合に昇順に並び替えるには次にようにします。
CODE | TITLE | PRICE |
---|---|---|
001 | java入門 | 2000 |
002 | javaの本 | 1500 |
003 | javaの基礎 | 1800 |
004 | やさしいjava | 2500 |
例文
SELECT
CODE,TITLE,PRICE FROM TBL_EHON_2 ORDER BY PRICE ASC;
「TBL_EHON2テーブル」の全てのデータを、PRICE列を
基準に昇順に並び替えてください」という意味
ASCをDESCに変更すれば、降順に並び替えることが出来る。
基準に昇順に並び替えてください」という意味
ASCをDESCに変更すれば、降順に並び替えることが出来る。
CODE | TITLE | PRICE |
---|---|---|
002 | javaの本 | 1500 |
003 | javaの基礎 | 1800 |
001 | java入門 | 2000 |
004 | やさしいjava | 2500 |
データを並び替える(ORDER BY)複数列の並び替え
ORDER BY句では複数列の並び替えが出来ます。
その場合は、ORDER BY句に複数列を指定します。
また、指定した列にそれぞれ昇順、降順を指定することが出来ます。
複数列指定した場合は、並び替える優先順位の高い方から記述します。
その場合は、ORDER BY句に複数列を指定します。
また、指定した列にそれぞれ昇順、降順を指定することが出来ます。
複数列指定した場合は、並び替える優先順位の高い方から記述します。
構文
SELECT カラム名1,カラム名2, ・・・ FROM テーブル名; ORDER BY 列名 キーワード(ASC / DESC),列名 キーワード(ASC / DESC);
データを並び替える(ORDER BY)
以下のテーブルをPRICE列とCODE列を使用して並び替えるには次にようにします。
TBL_EHON_3CODE | TITLE | PRICE |
---|---|---|
001 | java入門 | 2000 |
002 | javaの本 | 1500 |
003 | javaの基礎 | 1800 |
004 | やさしいjava | 2500 |
このSQLを実行すると、次のようになります。
まず、PRICE列を基準に並び替えます。
まず、PRICE列を基準に並び替えます。
CODE | TITLE | PRICE |
---|---|---|
003 | javaの基礎 | 1500 |
002 | javaの本 | 1500 |
001 | Java入門 | 2000 |
004 | やさしいjava | 2500 |
上記の状態ではPRICE列が同じ値の箇所はきれいに並び替わっていません。
その為、次にORDER BYで指定した2つ目のキーを基準に並び換えます。
その為、次にORDER BYで指定した2つ目のキーを基準に並び換えます。
CODE | TITLE | PRICE |
---|---|---|
002 | javaの本 | 1500 |
003 | javaの基礎 | 1500 |
001 | java入門 | 2000 |
004 | やさしいjava | 2500 |
これで、2つ目のキーを基準に並び替えたことになります。
まず、PRICE列を基準に並び替えて、値が等しい箇所だけCODE列を基準に並び替えます。 補足
並び替えは指定した列のデータ型によって、次のように並び替えます。
①文字データ
・英字 : アルファベット順
・日本語 : 文字コード
②日付
・日付順
③並び替えの列データがNULLの場合
・昇順 : 最後
・降順 : 先頭
まず、PRICE列を基準に並び替えて、値が等しい箇所だけCODE列を基準に並び替えます。 補足
並び替えは指定した列のデータ型によって、次のように並び替えます。
①文字データ
・英字 : アルファベット順
・日本語 : 文字コード
②日付
・日付順
③並び替えの列データがNULLの場合
・昇順 : 最後
・降順 : 先頭
GROUP BY
データをグループ化する(GROUP BY)
SQLにおけるグループ化とは、同列内の値の中で、同じ値を持つデータごとに集合化すること。
グループ化には「GROUP BY」というオプションをつけます。
構文
SELECT カラム名1 FROM テーブル名 GROUP BY グループ化したい列名;
以下のようなテーブルがあるとします。
CODE、PRICEは違うが、TITLEが同じ「java入門」というデータがあるとします。
TBL_EHON_4CODE、PRICEは違うが、TITLEが同じ「java入門」というデータがあるとします。
CODE | TITLE | PRICE |
---|---|---|
001 | java入門 | 2000 |
002 | javaの本 | 1500 |
003 | javaの基礎 | 1800 |
004 | やさしいjava | 2500 |
005 | java入門 | 1900 |
006 | java入門 | 1900 |
例文
SELECT TITLE FROM TBL_EHON_4 GROUP BY TITLE;
TITLE |
---|
java入門 |
javaの本 |
javaの基礎 |
やさしいjava |
グループ化により、3つの「java入門」が
データをグループ化する(GROUP BY)
複数列のグループ化
GROUP BYでは複数の列を指定することが出来ます。
先ほどのNG例を基に説明します。
GROUP BYでは複数の列を指定することが出来ます。
先ほどのNG例を基に説明します。
例文
SELECT TITLE,PRICE FROM TBL_EHON_4 GROUP BY TITLE, PRICE;
GROUP BY句の後ろにTITLEとPRICEを指定することにより、
TITLE毎のPRICEを取得することができます。
TITLE | TITLE |
---|---|
java入門 | 2000 |
javaの本 | 1500 |
javaの基礎 | 1800 |
やさしいjava | 2500 |
java入門 | 1900 |
補足
GROUP BYを使用した場合、SELECT句に指定出来る列名は、グループ関数か、 GROUP BYで指定した列名、あるいはそれらの組み合わせだけです。つまり、GROUP BY句で指定されていない列名をSELECT句で指定するとエラーになります。
GROUP BYを使用した場合、SELECT句に指定出来る列名は、グループ関数か、 GROUP BYで指定した列名、あるいはそれらの組み合わせだけです。つまり、GROUP BY句で指定されていない列名をSELECT句で指定するとエラーになります。
関数
関数
処理の集まりのことを指します。
SQLであらかじめ提供されている機能のことで、JAVAでいうメソッドのようなものです。
関数は基本的に次のように記述します。
SQLであらかじめ提供されている機能のことで、JAVAでいうメソッドのようなものです。
関数は基本的に次のように記述します。
関数名(引数)
引数とは処理に必要な材料のことです。
中には引数を必要としない関数もありますが、基本的には関数とは
「引数を受け取って処理した結果を戻すもの」とイメージしてください。
SQLの関数にはその働きによって、以下の関数があります。
・数値関数(ABS,ROUND,・・・)
・文字列関数(LEN,LTRIM,・・・)
・日付関数(DAY,DATEADD,・・・)
・変換関数(CAST,TO_CHAR,・・・)
・集計関数(MAX,MIN,・・・)
などなど。
関数は非常に多くのものが存在しますので、
ここで紹介する関数以外も必要に応じて調べてみてください。
中には引数を必要としない関数もありますが、基本的には関数とは
「引数を受け取って処理した結果を戻すもの」とイメージしてください。
SQLの関数にはその働きによって、以下の関数があります。
・数値関数(ABS,ROUND,・・・)
・文字列関数(LEN,LTRIM,・・・)
・日付関数(DAY,DATEADD,・・・)
・変換関数(CAST,TO_CHAR,・・・)
・集計関数(MAX,MIN,・・・)
などなど。
関数は非常に多くのものが存在しますので、
ここで紹介する関数以外も必要に応じて調べてみてください。
集計関数
1つのカラムに対して集計結果(1つの結果)を求める関数のこと。
集計関数の種類には以下のものがある。
TBL_ADDRESS
TBL_SCORE
TBL_SCORE
集計関数の種類には以下のものがある。
関数名 | 説明 |
---|---|
COUNT | 指定されたカラムのデータ数を求める |
MAX | 指定されたカラムの最大値を求める |
MIN | 指定されたカラムの最小値を求める |
SUM | 指定されたカラムの総和(合計)を求める |
AVG | 指定されたカラムの平均を求める |
使用方法
基本的にはSELECT句に記述します。
以下のようなテーブルのHOBBY列のデータ数を取得するとします。
基本的にはSELECT句に記述します。
以下のようなテーブルのHOBBY列のデータ数を取得するとします。
NAME | AGE | HOBBY |
---|---|---|
A | 20 | 釣り |
B | 21 | スノーボード |
C | 22 | (null) |
例文
SELECT COUNT( HOBBY ) FROM TBL_HOBBY;
COUNT関数は、データ数を求めるので、NULLは数えません。
ですので、結果は「2」になります。純粋にテーブルの
レコード数を求める場合は、COUNT( * ) とします。
これで、いずれかのカラムにデータがあれば、1件として数えます。
全てのカラムの値がNULLのレコードは存在しないので、
レコード数が求められます。
COUNT(HOBBY) |
---|
2 |
他の集計関数
その他の集計関数も使用方法は同じになります。
その他の集計関数も使用方法は同じになります。
例文
SELECT COUNT( * ),MAX( AGE ),MIN( AGE ),SUM( AGE ),AVG( AGE ) FROM TBL_HOBBY;
COUNT( * ) | MAX( AGE ) | MIN( AGE ) | SUM( AGE ) | AVG( AGE ) |
---|---|---|---|---|
3 | 22 | 20 | 63 | 21 |
集計関数は、複数のレコードから集計した結果を1つだけ出力するので、
結果は必ず1つになります。
GROUP BYとの組み合わせ
GROUP BYを使用する場合、集計関数を一緒に利用する場合が非常に多いです。
GROUP BYと組み合わせると、行をグループ化し、そのグループごとに集計処理を行うことができます。
以下のようなテーブルがあり、GUESTNO毎の経験年数を全て合計した結果を取得します。
TBL_ENGINER結果は必ず1つになります。
GROUP BYとの組み合わせ
GROUP BYを使用する場合、集計関数を一緒に利用する場合が非常に多いです。
GROUP BYと組み合わせると、行をグループ化し、そのグループごとに集計処理を行うことができます。
以下のようなテーブルがあり、GUESTNO毎の経験年数を全て合計した結果を取得します。
GUESTNO | LANGAGE | YEARS | RANK |
---|---|---|---|
1 | JAVA | 3 | A |
1 | VB | 2 | A |
1 | C | 7 | S |
2 | JAVA | 1 | C |
2 | VB | 2 | B |
2 | PERL | 3 | B |
3 | JAVA | 2 | S |
3 | VB | 1 | B |
3 | PERL | 2 | A |
3 | C++ | 3 | S |
例文
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) |
---|---|---|---|---|
3 | 4 | 12 | 7 | 2 |
3 | 2 | 6 | 3 | 1 |
4 | 2 | 8 | 3 | 1 |
列名を変える
AS 演算子を使うと、既存の列に別の名前をつけて表示することができます。
列名を一時的に変更するだけで、元の列名が書き換えられるわけではありません。
列名を一時的に変更するだけで、元の列名が書き換えられるわけではありません。
例文
SELECT GUESTNO,AVG( YEARS ) AS 平均年齢 FROM TBL_ENGINER GROUP BY GUESTNO;
COUNT(YEARS) | 平均経験年数 |
---|---|
1 | 4 |
2 | 2 |
3 | 2 |
そのまま表示してしまうと、何を表示しているのかが作成者以外には
分かりにくくなってしまいますので、別の名前(別名)をつけることにより、
分かりやすくしていきましょう。また、別名のことをエイリアスとも呼びます。
WHERE
特定のデータを取り出す(WHERE)
SELECT文に条件を指定して、その条件に合ったデータのみを取り出す方法です。
条件を使って特定のデータを取り出すには、SELECT文にWHERE句を追加します。
条件を使って特定のデータを取り出すには、SELECT文にWHERE句を追加します。
構文
SELECT カラム名1 FROM テーブル名 WHERE 取り出す条件;
以下のようなテーブルがあるとします。
ZIP列の値が「170-0000」の人の名前を取り出すとします。
ZIP列の値が「170-0000」の人の名前を取り出すとします。
NAME | ZIP | ADDRESS |
---|---|---|
牧野 | 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列の値が大きい順に取り出します。
以下のテーブルから、EIGO列の値が90以上のデータをID列の値が大きい順に取り出します。
ID | NAME | KOKUGO | EIGO |
---|---|---|---|
01 | 牧野 | 70 | 75 |
02 | 松本 | 95 | 90 |
03 | 中川 | 80 | 99 |
04 | 高井 | 75 | 86 |
例文
SELECT NAME,KOKUGO,EIGO FROM TBL_SCORE WHERE EIGO >= 90 ORDER BY ID DESC;
まず、EIGOの値が90以上のデータを抽出し、その
抽出したデータをID列を基準に降順に並び替える
抽出したデータをID列を基準に降順に並び替える
NAME | KOKUGO | EIGO |
---|---|---|
中川 | 80 | 99 |
松本 | 95 | 90 |
特定のデータを更新、削除する(DML)
UPDATE文、DELETE文にもWHERE句を使うことが出来ます。
既存のデータから特定のデータだけを変更したい場合や、特定のデータだけを削除したい場合にはSELECTと同じようにWHERE句を使用します。
既存のデータから特定のデータだけを変更したい場合や、特定のデータだけを削除したい場合にはSELECTと同じようにWHERE句を使用します。
ID | NAME | KOKUGO | EIGO |
---|---|---|---|
01 | 牧野 | 70 | 75 |
02 | 松本 | 95 | 90 |
03 | 中川 | 80 | 99 |
04 | 高井 | 75 | 86 |
例文
UPDATE TBL_SCORE SET KOKUGO = 85 WHERE NAME = ’牧野’;
NAME列の値が「牧野」というデータのKOKUGO列の値を「85」に更新します。
ID | NAME | KOKUGO | EIGO |
---|---|---|---|
01 | 牧野 | 85 | 75 |
02 | 松本 | 95 | 90 |
03 | 中川 | 80 | 99 |
04 | 高井 | 75 | 86 |
同じように特定のデータだけを削除します。
TBL_SCOREID | NAME | KOKUGO | EIGO |
---|---|---|---|
01 | 牧野 | 85 | 75 |
02 | 松本 | 95 | 90 |
03 | 中川 | 80 | 99 |
04 | 高井 | 75 | 86 |
例文
DELETE FROM TBL_SCORE WHERE EIGO >=90;
ID | NAME | KOKUGO | EIGO |
---|---|---|---|
01 | 牧野 | 85 | 75 |
04 | 高井 | 75 | 86 |
EIGO列の値が90以上のデータが削除されました。
演算子
演算子(算術演算子)
SQLで計算に使える演算子には以下のものがあります。
演算子 | 働き | 使い方 | 意味 |
---|---|---|---|
+(プラス) | 足す | a+b | aとbを足す |
―(マイナス) | 引く | a-b | aからbを引く |
*(アスタリスク) | かける | a*b | aとbをかける |
/(スラッシュ) | 割る | a/b | aをbで割る |
%(パーセント) | 余り | a%b | aをbで割った余り |
記述例
PRICE列の値に「0.05」をかける PRICE * 0.05
TOTAL列の値をNUM列の値で割る (列名=その列に入っている値になります。)
TOTAL / NUM
優先順位
算数には「式の中の( )でくくった部分を先に計算する」
というルールがありますが、SQLの算術演算子にも同様の
ルールが適用されます。
TOTAL列の値をNUM列の値で割り、その結果に0.05をかける
(TOTAL / NUM) * 0.05
売上テーブル
売上テーブル(FK として商品テーブルを参照)
TBL_USER
TBL_USER
AGETBL
TBL_UNION_B
PRICE列の値に「0.05」をかける PRICE * 0.05
TOTAL列の値をNUM列の値で割る (列名=その列に入っている値になります。)
TOTAL / NUM
優先順位
算数には「式の中の( )でくくった部分を先に計算する」
というルールがありますが、SQLの算術演算子にも同様の
ルールが適用されます。
TOTAL列の値をNUM列の値で割り、その結果に0.05をかける
(TOTAL / NUM) * 0.05
演算子(比較演算子)
WHERE句では、値や数値を比較して条件式を作り、その結果によって処理を変えることができました。この時に使う演算子を比較演算子といいます。
演算の結果、条件が成り立った場合は「TRUE(真)」、成り立たない場合は「FALSE(偽)」が返ります。
比較演算子には以下のものがあります。
演算の結果、条件が成り立った場合は「TRUE(真)」、成り立たない場合は「FALSE(偽)」が返ります。
比較演算子には以下のものがあります。
演算子 | 使い方 | 意味 |
---|---|---|
= | a = b | aとbは等しい |
< | a < b | aはbより小さい |
<= | a <= b | aはb以下 |
> | a > b | aはbより大きい |
>= | a >= b | aはb以上 |
<> | a <> b | aとbは等しくない |
!= | a != b | aとbは等しくない |
補足
文字列も「=」演算子で等しいかどうか比べることが出来ます。
その場合、数値とは違い「’(シングルクォーテーション)」で値を囲む必要があります。
文字列も「=」演算子で等しいかどうか比べることが出来ます。
その場合、数値とは違い「’(シングルクォーテーション)」で値を囲む必要があります。
☆数値の場合 ⇒ AGE = 20
☆文字列の場合 ⇒ NAME = 'A'
☆文字列の場合 ⇒ NAME = 'A'
演算子(論理演算子)
複数の条件を組み合わせて、より複雑な条件を表すことが出来ます。
この時、条件を組み合わせることが出来る演算子を論理演算子といいます。
論理演算子には以下のものがあります。
この時、条件を組み合わせることが出来る演算子を論理演算子といいます。
論理演算子には以下のものがあります。
演算子 | 働き | 使い方 | 意味 |
---|---|---|---|
AND | かつ | a >= 10 AND a <= 20 | aは10以上かつ20以下 |
OR | または | a = 5 OR a = 10 | aは5か10 |
NOT | ~ではない | NOT a = 200 | aは200以外 |
使用例
比較演算子と論理演算子を使用する。
比較演算子と論理演算子を使用する。
WHERE
a >= 60
AND
a <= 80
AND
b = 200
a >= 60
AND
a <= 80
AND
b = 200
演算子(LIKE演算子)
文字列を完全に一致したデータではなく、特定の文字を含むデータ
を取り出したいときは、LIKE演算子を使います。
を取り出したいときは、LIKE演算子を使います。
例文
SELECT TITLE FORM TBL_EHON_4 WHERE TITLE LIKE ' j % ';
TITLE列のデータが「j」からはじまる全てのデータを取り出す。
条件の付け方
条件の付け方
記号 | 働き | 使い方 | 意味 |
---|---|---|---|
%(パーセント) | 任意の数の文字列 | 例) %山% | 富士山、山田、など「山」含まれる文字列 |
_(アンダースコア) | 1文字 | 例) _おり | しおり、かおり、など「おり」の前に任意の1文字が入る文字列 |
演算子(NULL演算子)
指定した列の値がNULLかどうかを調べたい時は、「IS NULL」演算子を使います。
IS NULL演算子は、次の2通りの使い方があります。
IS NULL演算子は、次の2通りの使い方があります。
構文
WHERE 列名 IS NULL; 指定した列の値がNULLのデータ WHERE 列名 IS NOT NULL; 指定した列の値がNULLではないデータ ※ 「列=NULL」とは書きません
NAME | AGE | HOBBY |
---|---|---|
A | 20 | 釣り |
B | 21 | スノーボード |
C | 22 | (null) |
例文
SELECT HOBBY, NAME FROM TBL_HOBBY WHERE HOBBY IS NULL
HOBBY列のデータがNULLのものだけ取り出す
NAME | HOBBY |
---|---|
C | (null) |
演算子(IN演算子)
IN演算子を使うと、( )内に指定した値と一致したデータだけを取り出すことが出来ます。
例文
SELECT HOBBY, NAME FROM TBL_HOBBY WHERE AGE IN ( 20, 21 );
複数の値を指定するときは、「,」で区切って列挙します
また、INとは逆に「指定した値以外」という条件を付けたいときは、NOT IN を使います。
また、INとは逆に「指定した値以外」という条件を付けたいときは、NOT IN を使います。
例文
SELECT HOBBY, NAME FROM TBL_HOBBY WHERE AGE NOT IN ( 20, 21 );
これは、比較演算子を複数組み合わせた場合と同じです。
リレーショナルデータベース
リレーショナルデータベース(RDB)
データを行と列で構成された表形式で管理します。
RDBでは、テーブルとテーブルに関係を持たせたデータベースになります。
簡単に言うと、テーブルどうしがつながっているイメージです。
では、実際にどのように作成していくのかを見て行きましょう。
商品テーブルRDBでは、テーブルとテーブルに関係を持たせたデータベースになります。
簡単に言うと、テーブルどうしがつながっているイメージです。
では、実際にどのように作成していくのかを見て行きましょう。
S_ID | NAME | PRICE |
---|---|---|
1 | りんご | 100 |
2 | みかん | 150 |
3 | なし | 200 |
DATE | SEQ_NO | S_ID | CNT |
---|---|---|---|
1/1 | 1 | 1 | 10 |
1/1 | 2 | 3 | 5 |
1/2 | 1 | 2 | 7 |
1/2 | 2 | 1 | 10 |
この2つのテーブルは、関係を持つように作りました。
どこで、関係を持っているかというと、商品テーブルのS_IDと売上テーブルのS_IDになります。
売上テーブルのS_IDを見ただけでは、何が売れたのかは分かりません。
しかし、商品テーブルのS_IDからNAMEを見ることで、何が売れたのかが分かります。
つまり、次のように表すことが出来ます。
どこで、関係を持っているかというと、商品テーブルのS_IDと売上テーブルのS_IDになります。
売上テーブルのS_IDを見ただけでは、何が売れたのかは分かりません。
しかし、商品テーブルのS_IDからNAMEを見ることで、何が売れたのかが分かります。
つまり、次のように表すことが出来ます。
DATE | SEQ_NO | S_ID | NAME | CNT |
---|---|---|---|---|
1/1 | 1 | 1 | りんご | 10 |
1/1 | 2 | 3 | なし | 5 |
1/2 | 1 | 2 | みかん | 7 |
1/2 | 2 | 1 | りんご | 10 |
先ほどの例を見てみると、売上テーブルの方に、商品名などを持たせるのがいいか
と思いますが、 テーブルを分けることで、重複しているデータの削除が出来ます。
たとえば、売上テーブルに商品名と単価のカラムを持たせて見ましょう。
売上テーブル
と思いますが、 テーブルを分けることで、重複しているデータの削除が出来ます。
たとえば、売上テーブルに商品名と単価のカラムを持たせて見ましょう。
DATE | SEQ_NO | S_ID | CNT |
---|---|---|---|
1/1 | 1 | 1 | 10 |
1/1 | 2 | 3 | 5 |
1/2 | 1 | 2 | 7 |
1/2 | 2 | 1 | 10 |
すると、商品のデータが重複します。
りんごが100円なのは1レコード目を見れば分かるのに、4レコード目にもデータがあります。
これが、100件、1000件を超える量になると、データ量がとても多くなってしまいます。
この問題をテーブルを分割することで、解決しています。
つまり、売上テーブルのデータが何件になろうと、商品テーブルのデータは変わりません。
さらに、商品の名前や単価が変更になった場合、売上テーブルのデータを変更する必要もありません。
りんごが100円なのは1レコード目を見れば分かるのに、4レコード目にもデータがあります。
これが、100件、1000件を超える量になると、データ量がとても多くなってしまいます。
この問題をテーブルを分割することで、解決しています。
つまり、売上テーブルのデータが何件になろうと、商品テーブルのデータは変わりません。
さらに、商品の名前や単価が変更になった場合、売上テーブルのデータを変更する必要もありません。
リレーショナルデータベース(PK/FK)
主キー:プライマリーキー:PK
主キー(PRIMARY KEY)とは、テーブルの中で1行を特定する為の列です。
たとえば、学生名簿テーブルを作成するとします。
その時、学生番号を主キーにしておけば、同姓同名の人がいても学生番号が違うので、
区別することができます。
~ 主キーを設定していない場合 ~主キー(PRIMARY KEY)とは、テーブルの中で1行を特定する為の列です。
たとえば、学生名簿テーブルを作成するとします。
その時、学生番号を主キーにしておけば、同姓同名の人がいても学生番号が違うので、
区別することができます。
名前 |
---|
あおやまたろう |
あおやまたろう |
同姓同名のため行を特定することが出来ません
~ 主キーを設定した場合 ~学生番号 | 名前 |
---|---|
1 | あおやまたろう |
20 | あおやまたろう |
主キーによって行を特定できます。
主キーとなった列には以下の特徴があります。
①主キーとなった列には、値が重複しません。
②複数のカラムで1つの主キーにすることも出来ます。
外部参照:フォーリンキー:FK
外部キー(FOREIGN KEY)とは別々のテーブルに存在する列同士を同期させる仕組みです。
たとえば、先ほどの商品テーブルと売上テーブルだと、
商品テーブルのS_ID列は商品テーブルの主キーでした。
そして、売上テーブルのS_ID列が外部キーになります。
商品テーブル(PK 側)主キーとなった列には以下の特徴があります。
①主キーとなった列には、値が重複しません。
②複数のカラムで1つの主キーにすることも出来ます。
外部参照:フォーリンキー:FK
外部キー(FOREIGN KEY)とは別々のテーブルに存在する列同士を同期させる仕組みです。
たとえば、先ほどの商品テーブルと売上テーブルだと、
商品テーブルのS_ID列は商品テーブルの主キーでした。
そして、売上テーブルのS_ID列が外部キーになります。
S_ID | NAME | PRICE |
---|---|---|
1 | りんご | 100 |
2 | みかん | 150 |
3 | なし | 200 |
DATE | SEQ_NO | S_ID | CNT |
---|---|---|---|
1/1 | 1 | 1 | 10 |
1/1 | 2 | 3 | 5 |
1/2 | 1 | 2 | 7 |
1/2 | 2 | 1 | 10 |
外部キーには以下の特徴があります。
①FKとなったカラムには指定された他のテーブルのPKの値を入れる必要がある。
①FKとなったカラムには指定された他のテーブルのPKの値を入れる必要がある。
リレーショナルデータベース
補足
データベースには一般的に「マスタテーブル」と「トランザクションテーブル」が存在しています。
マスタテーブル : 更新頻度が低いテーブル又は、存在しないと困るデータ、テーブル
例)商品テーブル、都道府県テーブル
トランザクションテーブル : 更新頻度が高いテーブル又は、取引に関するデータ など
例)売上テーブル、在庫テーブル
テーブル定義
テーブルの状態を表す図をテーブル定義といいます。
カラム名、データ型、NULL制約、初期値などの情報が記述されているものです。
TABLE_PLACE (事業所の管理テーブル)データベースには一般的に「マスタテーブル」と「トランザクションテーブル」が存在しています。
マスタテーブル : 更新頻度が低いテーブル又は、存在しないと困るデータ、テーブル
例)商品テーブル、都道府県テーブル
トランザクションテーブル : 更新頻度が高いテーブル又は、取引に関するデータ など
例)売上テーブル、在庫テーブル
テーブル定義
テーブルの状態を表す図をテーブル定義といいます。
カラム名、データ型、NULL制約、初期値などの情報が記述されているものです。
KEY | カラム名 | データ型 | サイズ | NULL? |
---|---|---|---|---|
PK | PLACE_ID | VARCHAR2 | 4 | NOT NULL |
PLACE_NAME | VARCHAR2 | 14 | ||
PLACE_TEL | VARCHAR2 | 15 |
ER図
ER図(エンティティ リレーション図)
エンティティとは
テーブルのことです。
ER図(エンティティ リレーション図)とは
テーブル同士の関連を表した図になります。
例
先ほどの商品テーブルと売上テーブルのER図は次のようになります。
・1対n
1レコードに対して0以上
関係のあるレコードが存在する。
・1対1
1レコードに対して1つ、
関係のあるレコードが存在する。
まずテーブルの構成を表します。
そして、関連のあるカラム同士を線で繋ぎます。
この時、何対何の関係か表します。
直線、数値を記載することもあれば、線の先を記号にして表す
こともあります。
この数値や記号は作成者によって変わるものですが、
その場合、ER図にその数値や記号の種類が記載されていますので、
どのテーブルがどんな関係化はすぐにわかります。
今回の商品テーブルと売上テーブルは、「1 対 n」の関係であるという
ことを表しています。
テーブルのことです。
ER図(エンティティ リレーション図)とは
テーブル同士の関連を表した図になります。
例
先ほどの商品テーブルと売上テーブルのER図は次のようになります。
・1対n
1レコードに対して0以上
関係のあるレコードが存在する。
・1対1
1レコードに対して1つ、
関係のあるレコードが存在する。
まずテーブルの構成を表します。
そして、関連のあるカラム同士を線で繋ぎます。
この時、何対何の関係か表します。
直線、数値を記載することもあれば、線の先を記号にして表す
こともあります。
この数値や記号は作成者によって変わるものですが、
その場合、ER図にその数値や記号の種類が記載されていますので、
どのテーブルがどんな関係化はすぐにわかります。
今回の商品テーブルと売上テーブルは、「1 対 n」の関係であるという
ことを表しています。
結合
結合
2つ以上のテーブルを連携させて操作することを結合といいます。
離れた場所にあるテーブルのデータを1度に扱えるようにすることで、
指定した列の値が一致するデータのみを取り出す方法のことです。
結合のルール
①2つ以上のテーブルのカラムを取得する場合
②データの整合性を保つ為に結合条件を指定する場合
結合の仕方
結合したテーブルをFROM句に列挙し、WHERE句に結合する対象のカラムを指定します。
離れた場所にあるテーブルのデータを1度に扱えるようにすることで、
指定した列の値が一致するデータのみを取り出す方法のことです。
結合のルール
①2つ以上のテーブルのカラムを取得する場合
②データの整合性を保つ為に結合条件を指定する場合
結合の仕方
結合したテーブルをFROM句に列挙し、WHERE句に結合する対象のカラムを指定します。
構文
SELECT カラム名1,・・・ FROM テーブル名1,テーブル名2,・・・ 結合するテーブルを「,」で区切って列挙する WHERE 結合対象条件; 一致させる列の名前を「=」で結ぶ
結合の仕方
以下に2つのテーブルがあります。
TBL_RANK以下に2つのテーブルがあります。
KEN_ID | KEN_RANK |
---|---|
01 | S |
02 | A |
03 | B |
USER_ID | KEN_ID | USER_NAME |
---|---|---|
001 | 01 | 山田一郎 |
002 | 02 | 山田二郎 |
003 | 03 | 山田三郎 |
004 | 04 | 山田四郎 |
TBL_RANKに権限のランクを、TBL_USERにユーザーの情報が設定されています。
SELECT * FROM TBL_USER;
これで、ユーザーの情報全てを取得することが出来ます。
しかし、TBL_USERだけを見ると、IDと名前だけで、誰がどんな権限を持っているかは分かりません。
その権限を見る為にはTBL_RANKを参照しなければなりません。
そこで、結合がでてきます。
このTBL_RANKのKEN_IDとTBL_USERのKEN_IDは関連を持っているデータです。
ですので、このカラムの値が同じものだけ結合すればいいのです。
結合の仕方
TBL_RANKSELECT * FROM TBL_USER;
これで、ユーザーの情報全てを取得することが出来ます。
しかし、TBL_USERだけを見ると、IDと名前だけで、誰がどんな権限を持っているかは分かりません。
その権限を見る為にはTBL_RANKを参照しなければなりません。
そこで、結合がでてきます。
このTBL_RANKのKEN_IDとTBL_USERのKEN_IDは関連を持っているデータです。
ですので、このカラムの値が同じものだけ結合すればいいのです。
結合の仕方
KEN_ID | KEN_RANK |
---|---|
01 | S |
USER_ID | KEN_ID | USER_NAME |
---|---|---|
001 | 01 | 山田一郎 |
002 | 02 | 山田二郎 |
003 | 03 | 山田三郎 |
004 | 04 | 山田四郎 |
構文
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の情報が結合されます。
条件として、TBL_RANKのKEN_IDとTBL_USERのKEN_IDがイコール(同じ)だった場合、
TBL_RANKとTBL_USERの情報が結合されます。
USER_NAME | KEN_RANK |
---|---|
山田一郎 | S |
山田二郎 | A |
山田三郎 | B |
これで、どのユーザーがどんな権限を持っているのかが分かりました。
山田四郎のKEN_IDはTBL_USERにはデータがありませんので、結果が取り出せません。
結合をしない場合
結合条件のWHERE句にカラムを指定しなかった場合にどうなるのかを見てみます。
先程のSELECT文から結合条件を削除してみます。
山田四郎のKEN_IDはTBL_USERにはデータがありませんので、結果が取り出せません。
結合をしない場合
結合条件のWHERE句にカラムを指定しなかった場合にどうなるのかを見てみます。
先程のSELECT文から結合条件を削除してみます。
構文
SELECT USER_NAME,KEN_RANK FROM TBL_RANK,TBL_USER
結果は以下のようになります。
KEN_ID | KEN_RANK | USER_ID | KEN_ID | USER_NAME |
---|---|---|---|---|
01 | S | 001 | 01 | 山田一郎 |
01 | S | 002 | 02 | 山田二郎 |
01 | S | 003 | 03 | 山田三郎 |
01 | S | 004 | 04 | 山田四郎 |
02 | A | 001 | 01 | 山田一郎 |
02 | A | 002 | 02 | 山田二郎 |
02 | A | 003 | 03 | 山田三郎 |
02 | A | 004 | 04 | 山田四郎 |
03 | B | 001 | 01 | 山田一郎 |
03 | B | 002 | 02 | 山田二郎 |
03 | B | 003 | 03 | 山田三郎 |
03 | B | 004 | 04 | 山田四郎 |
FROM句にテーブル名を2つ記述しただけでは、KEN_IDが一致しなくても関係なく、
それぞれのデータに掛け算をしたような結果が取り出されます。
それぞれのデータに掛け算をしたような結果が取り出されます。
結合での注意点
整合性を保つ
ルール②でもありましたとおり、「データの整合性を保つ為に結合条件を指定」
ということですので、結合する際はまずどのテーブルのPKとFKが関連を持っている
のかをしっかり把握した上で、結合するようにしてください。
特に、FKの指定されているテーブルのデータを使用する場合は、そのテーブルだけでは
整合性を保てない可能性がありますので、しっかり関連をみてください。
2つ以上のテーブルのデータを取得
必ず2つ以上のテーブルを使用しデータを取得する場合は、結合をしてください。
結合はPKとFK以外でも結合することが出来ます。
ルール②でもありましたとおり、「データの整合性を保つ為に結合条件を指定」
ということですので、結合する際はまずどのテーブルのPKとFKが関連を持っている
のかをしっかり把握した上で、結合するようにしてください。
特に、FKの指定されているテーブルのデータを使用する場合は、そのテーブルだけでは
整合性を保てない可能性がありますので、しっかり関連をみてください。
2つ以上のテーブルのデータを取得
必ず2つ以上のテーブルを使用しデータを取得する場合は、結合をしてください。
結合はPKとFK以外でも結合することが出来ます。
外部結合
外部結合
結合の種類
結合には2種類あります。
① 内部結合(等価結合)
等価と言われるように、結合対象の両方のテーブルが持っているデータのみ取得できます。
② 外部結合
軸となるテーブルと一致するデータが結合対象のテーブルにあれば、そのまま取得でき、
一致しない場合は、NULLとなって取得できます。
外部結合の仕方
結合条件を記述するときに、軸となるテーブルとは逆のテーブルに、(+)をつけます。
結合には2種類あります。
① 内部結合(等価結合)
等価と言われるように、結合対象の両方のテーブルが持っているデータのみ取得できます。
② 外部結合
軸となるテーブルと一致するデータが結合対象のテーブルにあれば、そのまま取得でき、
一致しない場合は、NULLとなって取得できます。
外部結合の仕方
結合条件を記述するときに、軸となるテーブルとは逆のテーブルに、(+)をつけます。
構文
SELECT カラム名1,・・・ FROM テーブル名1,テーブル名2,・・・ WHERE テーブル名1.カラム名 = テーブル名2.カラム名(+); 軸となるテーブルとは逆のテーブルの方に(+)をつける
結合の仕方
以下に2つのテーブルがあります。
このテーブルはIDをキーに結合してみます。
TBL_JOIN_A以下に2つのテーブルがあります。
このテーブルはIDをキーに結合してみます。
A_ID | A_NAME |
---|---|
01 | A |
02 | B |
03 | C |
A_IDとB_IDを条件にして結合
TBL_JOIN_BB_ID | B_NAME |
---|---|
01 | あ |
02 | い |
04 | う |
内部結合の場合
A_ID | A_NAME | B_ID | B_NAME |
---|---|---|---|
01 | A | 01 | あ |
02 | B | 02 | い |
外部結合(TBL_JOIN_Aを軸)の場合
A_ID | A_NAME | B_ID | B_NAME |
---|---|---|---|
01 | A | 01 | あ |
02 | B | 02 | い |
03 | C | NULL | NULL |
例文
SELECT * FROM TBL_JOIN_A A, TBL_JOIN_B B WHERE A.A_ID = B.B_ID(+);
外部結合(TBL_JOIN_Bを軸)の場合
A_ID | A_NAME | B_ID | B_NAME |
---|---|---|---|
01 | A | 01 | あ |
02 | B | 02 | い |
NULL | NULL | 04 | う |
例文
SELECT * FROM TBL_JOIN_A A, TBL_JOIN_B B WHERE A.A_ID (+) = B.B_ID;
このように、外部結合の場合は軸になったテーブルのデータは全て取得でき、
結合対象のデータは、存在していればそのデータを取得し、なければNULLになります。;
結合対象のデータは、存在していればそのデータを取得し、なければNULLになります。;
サブクエリ
サブクエリ(副問い合わせ)
SELECT文の中にさらにSELECT文を記述することが出来ます。
このSELECT文の中のSELECTのことをサブクエリといいます。
サブクエリを使うと、通常1つのSELECT文では取り出せないような
複雑な条件を元にデータを取り出すことが出来ます。
注意点
サブクエリを行うと基本的に検索にかかる時間が非常に遅くなる可能性があります。
その為、一度のSELECTでは取得出来ないデータを取得する場合にだけ使用してください。
サブクエリ
サブクエリは全ての句内で使用することが出来ます。(Oracleのみ)
但し、記述する場所によって条件が存在しています。
この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
WHERE句でのサブクエリ
WHERE句の中でサブクエリを使用することが出来ます。
たとえば、以下のテーブルから年齢が一番大きい人の名前を取り出すとします。
このテーブルはIDをキーに結合してみます。 TBL_QUERY
NAME | AGE |
---|---|
Aさん | 20 |
Bさん | 21 |
Cさん | 22 |
以下のSQLを実行すると、実際に欲しい結果ではないものが取れてしまいます。
例文
SELECT NAME, MAX(AGE) FROM TBL_QUERYTBL_QUERY
NAME | AGE |
---|---|
Aさん | 22 |
Bさん | 22 |
Cさん | 22 |
これをサブクエリを使って次のように書き換えます。
そうすると欲しい結果を取り出すことが出来ます。
WHERE句でのサブクエリ
そうすると欲しい結果を取り出すことが出来ます。
WHERE句でのサブクエリ
例文
SELECT
この結果を基に実行される NAME, AGE FROM TBL_QUERY WHERE AGE = (SELECT MAX(AGE) FROM TBL_QUERY) サブクエリは( )でくくります。
サブクエリ(副問い合わせ)
NAME | AGE |
---|---|
Cさん | 22 |
①まずサブクエリを実行 年齢の最大値を算出します。
NAME | AGE |
---|---|
Aさん | 20 |
Bさん | 21 |
Cさん | 22 |
MAX(AGE)は22です。
②次に外側のSELECTを実行します。最大年齢の人を抽出
②次に外側のSELECTを実行します。最大年齢の人を抽出
NAME | AGE |
---|---|
Cさん | 22 |
年齢が22の人を抽出
FROM句でのサブクエリ
FROM句の中でサブクエリを使用することが出来ます。
FROM句の中のサブクエリは仮想で別のテーブルを作成するイメージになります。
先ほどのテーブルから年齢が21以上の人で最少年齢の人の名前を取り出すとします。
FROM句でのサブクエリ
FROM句の中でサブクエリを使用することが出来ます。
FROM句の中のサブクエリは仮想で別のテーブルを作成するイメージになります。
先ほどのテーブルから年齢が21以上の人で最少年齢の人の名前を取り出すとします。
例文
SELECT この結果を基に実行される MIN ( AGETBL.AGE ) FROM ( SELECT NAME, AGE FROM TBL_QUERY WHERE AGE >= 21 ) AGETBL サブクエリで出来る仮想のテーブルに名前をつけます。
NAME | AGE |
---|---|
Bさん | 21 |
FROM句でのサブクエリ
先ほどの処理の流れは次のようなイメージです。
①まずサブクエリを実行します。
年齢が21以上のデータを抽出し、それにAGETBLという名前をつけます。
TBL_QUERY
先ほどの処理の流れは次のようなイメージです。
①まずサブクエリを実行します。
年齢が21以上のデータを抽出し、それにAGETBLという名前をつけます。
TBL_QUERY
NAME | AGE |
---|---|
Aさん | 20 |
Bさん | 21 |
Cさん | 22 |
AGETBL
AGE |
---|
21 |
22 |
②次に外側のSELECTを実行します。
AGETBLからAGE列の最少年齢を取得します。
AGETBLからAGE列の最少年齢を取得します。
AGE |
---|
21 |
メンバーシップ条件でのサブクエリ
例)IN
例)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)
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_AID | NAME |
---|---|
01 | 青山太郎 |
02 | 山田二郎 |
03 | 青山三郎 |
USER_ID | USER_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;
ID | NAME |
---|---|
01 | 青山太郎 |
02 | 山田二郎 |
03 | 青山三郎 |
06 | 山田一郎 |
05 | 山田三郎 |
09 | 山田四郎 |
重複している山田二郎さんは1つのデータとしてまとめられ、
それ以外は全て表示されました。もし、重複しているデータも全て取得
したい場合は、「UNION ALL」を使用します。
それ以外は全て表示されました。もし、重複しているデータも全て取得
したい場合は、「UNION ALL」を使用します。
トランザクション
データを保護する(トランザクション)
データベースには常に様々な人がアクセスし、データを取り出したり、更新したりすることが出来ます。
そこで、たとえば、同じデータに対して最新のデータを見たい人、データを更新したい人が
同時にアクセスすると、いったいどうなってしまうのか?
こんなときに出てくるのがトランザクションです。
トランザクションとは、関連する操作をひとまとめにしたもののことです。
上記の場合、あらかじめ最新のデータを見るための操作を
「最新のデータを見るトランザクション」としてまとめます。
すると、このトランザクションが実行している間は、だれもそのデータを扱うことが
出来ないようにデータに鍵をかけることが出来るのです。
これをデータのロックといいます。トランザクションが終了するとロックは解除され、
次の人がデータを扱えるようになります。
これによって、作業の競合によってデータに不具合が起こることをふせげます。
① Aさんがデータベースのデータを編集しているとします。
② データベースは編集が行われると、トランザクションというものを開始します。
③ トランザクションが開始されると、他のユーザーは編集が出来ません。
編集しようとすると、待ち状態になります。
④ Aさんの編集が終わるまで、トランザクションは終了しません。
Aさんは編集が終了したら、編集終了の旨をデータベースに伝えます。
⑤ 編集が終了すると、データベースはトランザクションを終了します。
すると待ち状態だったBさんの処理が行われます。
⑥ Bさんの編集が始まったので、データベースはトランザクションを開始します。
トランザクションの終了
トランザクションは単に操作をまとめるだけのものではありません。
まとめた操作の終了時にそのトランザクションに含まれる操作を確定するか、
取り消すかを選択することが出来ます。
処理の結果を確定して終了する場合は、「コミット」、取り消す場合は「ロールバック」
を行います。
ロールバックを実行すると、文字通りトランザクションの操作が巻き戻され、
処理を行う前の状態に戻ります。
あらかじめ「エラーが起こった場合はロールバックする」というようにプログラミング
しておけば、事故によるデータの不具合が防げるわけです。
① 処理を確定する = コミット(COMMIT)
② 処理を取り消す = ロールバック(ROLLBACK)
COMMIT
トランザクションの中で行った操作が完了した場合は、コミットを実行します。
コミットを実行すると、トランザクションの処理結果が確定され、データベースに
反映されます。
ROLLBACK
トランザクションの中で行った操作が失敗した場合や、操作をやり直したい場合は、
ロールバックを実行します。ロールバックを実行すると、トランザクションの処理
は無効となり、データは処理を実行する前の状態に戻ります。
※ トランザクション制御を使用出来るのはDMLのみで、DDLは自動でCOMMIT
されます。
トランザクション
たとえば以下の2つのテーブルがあったとします。
受注テーブルそこで、たとえば、同じデータに対して最新のデータを見たい人、データを更新したい人が
同時にアクセスすると、いったいどうなってしまうのか?
こんなときに出てくるのがトランザクションです。
トランザクションとは、関連する操作をひとまとめにしたもののことです。
上記の場合、あらかじめ最新のデータを見るための操作を
「最新のデータを見るトランザクション」としてまとめます。
すると、このトランザクションが実行している間は、だれもそのデータを扱うことが
出来ないようにデータに鍵をかけることが出来るのです。
これをデータのロックといいます。トランザクションが終了するとロックは解除され、
次の人がデータを扱えるようになります。
これによって、作業の競合によってデータに不具合が起こることをふせげます。
① Aさんがデータベースのデータを編集しているとします。
② データベースは編集が行われると、トランザクションというものを開始します。
③ トランザクションが開始されると、他のユーザーは編集が出来ません。
編集しようとすると、待ち状態になります。
④ Aさんの編集が終わるまで、トランザクションは終了しません。
Aさんは編集が終了したら、編集終了の旨をデータベースに伝えます。
⑤ 編集が終了すると、データベースはトランザクションを終了します。
すると待ち状態だったBさんの処理が行われます。
⑥ Bさんの編集が始まったので、データベースはトランザクションを開始します。
トランザクションの終了
トランザクションは単に操作をまとめるだけのものではありません。
まとめた操作の終了時にそのトランザクションに含まれる操作を確定するか、
取り消すかを選択することが出来ます。
処理の結果を確定して終了する場合は、「コミット」、取り消す場合は「ロールバック」
を行います。
ロールバックを実行すると、文字通りトランザクションの操作が巻き戻され、
処理を行う前の状態に戻ります。
あらかじめ「エラーが起こった場合はロールバックする」というようにプログラミング
しておけば、事故によるデータの不具合が防げるわけです。
① 処理を確定する = コミット(COMMIT)
② 処理を取り消す = ロールバック(ROLLBACK)
COMMIT
トランザクションの中で行った操作が完了した場合は、コミットを実行します。
コミットを実行すると、トランザクションの処理結果が確定され、データベースに
反映されます。
ROLLBACK
トランザクションの中で行った操作が失敗した場合や、操作をやり直したい場合は、
ロールバックを実行します。ロールバックを実行すると、トランザクションの処理
は無効となり、データは処理を実行する前の状態に戻ります。
※ トランザクション制御を使用出来るのはDMLのみで、DDLは自動でCOMMIT
されます。
トランザクション
たとえば以下の2つのテーブルがあったとします。
受注番号 | 氏名 | 受注日 |
---|---|---|
0001 | A | 2005/1/1 |
0002 | B | 2005/1/2 |
0003 | C | 2005/1/3 |
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
受注商品情報テーブル受注番号 | 連番 | 商品名 | 個数 |
---|---|---|---|
0001 | 1 | コーラ | 1 |
0001 | 2 | コーヒー | 2 |
0001 | 3 | お茶 | 3 |
0002 | 1 | コーラ | 4 |
0002 | 2 | コーヒー | 5 |
0003 | 1 | コーラ | 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受注のデータとしては
正しくないデータが検索されてしまいます。
これを未然に防ぐには受注が全て正常に登録されてからコミットをする必要があります。
このようなことのないようにトランザクションの制御を行うのです。
この時、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受注のデータとしては
正しくないデータが検索されてしまいます。
これを未然に防ぐには受注が全て正常に登録されてからコミットをする必要があります。
このようなことのないようにトランザクションの制御を行うのです。