1. サンプルSQL
・セレクト文の説明
・DECODE関数の使用例
・インラインビューの使用例
・SELECT、INSERT
・SELCT,UPDATE
・日付の差分
・排他処理
・SELECT文(基本です。) ・IF文の実現する(DECODE関数)
・インラインビュー実現する(FROM句にSELECT)
・SELECT、INSERTの実現(SELECT結果をINSERTする)
・SELECT、UPDATE(SELECT結果をUPDATE)
・日付の差分をとる(interval型)
・排他制御の説明
・Sysdate型を文字列で取得する。
・外部結合(FULL OUTER JOIN)
・外部結合、内部結合(LEFT OUTER JOIN、INNER JOIN)
・テーブルにあればSELECTする(EXISTS)1
・テーブルにあればDELETEする(EXISTS)
・テーブルになければインサートする(EXISTS)
・Blob型をSELECTする(Blob)
・Blob型をUPDATEする(Blob)
・必要ない結合をやめて、EXISTSをしよう。
・日付取得する。
・最小値を取得する。
・テーブルLOCKの方法(行ロック方法)
・重複行を取得
・oracleに接続
・exp,impの例
・spoolでテキストファイルに結果を格納!!
・SI Oject Browser ダウンロード
・isqlplus起動
・主キー名から、テーブルを検索
・主キーを検索
・外部結合の説明
・テーブルバックアップ
・テーブル名変更
・主キー削除
・主キー追加
・カラム削除
util関係
・SQLの実行時間を表示する。(1回のSQLの場合)
・ SQL文を再実行するには
・ バインド変数を使用するには
・ バインド変数を使用するには(SQL PULS)
・ 現在時刻の表示
・ edit
セレクト文の説明
SELECT
a.カラム1,
b.カラム1,
c.カラム1
FROM
テーブルA a
テーブルB b
テーブルC c
WHERE
a.カラム2=b.カラム2
b.カラム2=c.カラム2
------------------------
SELECT
なし
FROM
テーブルA a
テーブルB b
テーブルC c
の時点で、テーブルA 、テーブルB、 テーブルCのカラムすべて取得できている。
(なぜなら、SELECTに記述されていないカラムでも、内部的には取得しているからWHEREで比較できている。例、WHERE句を参照)
DECODE関数の使用例
SELECT
a.カラム1,
b.カラム1,
DECODE(c.カラム1,'5555','五が4っつ','6666',a.カラム10)
FROM
テーブルA a
テーブルB b
テーブルC c
テーブルCのカラム1が'5555'であれば'五が4つ'と表示される。
テーブルCのカラム1が'6666'であればテーブルAのカラム10の内容が表示される。
インラインビューの使用例
SELECT
a.カラム1,
a.カラム2,
TB.カラム1,
TB.カラム2
FROM
テーブルA b
テーブル(SELECT b.カラム1 b.カラム2 FROM テーブルB b WHERE b.カラム1='3333') TB
WHERE
a.カラム1='1111' AND
a.カラム2='2222'
SELECT,INSERTの使用例
INSERT INTO テーブルA a (
a.カラム1
a.カラム2
a.カラム3
a.カラム4
)
SELECT
b.カラム1,
b.カラム2,
b.カラム3,
b.カラム4
FROM
テーブルA b
WHERE
b.カラム1='1111' AND
b.カラム2='2222' AND
b.カラム3='3333' AND
b.カラム4='4444'
SELECT,UPDATEの使用例
UPDATE テーブルA a
a.カラム1='1111'
a.カラム2='2222'
a.カラム3='3333'
a.カラム4=(SELECT b.カラム4 FROM テーブルB WHERE b.カラム4='b4b4')
WHERE
a.カラム1=b.カラム1
これは、エラーがある。なぜなら、外のUPDATE文のWHERE句では、テーブルBは指定できない。
(SELECT、INSERTで重要なのは、外のUPDATEの件数と、中のSELECT文の件数を意識することが必要)
)
日付の差分のサンプル
INSERT INTO テーブル1 a
(
a.カラム1
a.カラム2
a.カラム3 ・・・これはsysdate型です。
)
SELECT
b.カラム1,
b.カラム2,
b.カラム3 + to_dsinterval(DIFF.カラム3)
FROM
テーブル2 b,
(SELECT substr(numtodsinterval(TO_DATE('20050101150000','yyyymmddhh24MISS')
- TEST.カラム3,'day'),8.12)AS カラム3
FROM
(SELECT 5.カラム3 FROM テーブル5 WHERE 条件・・・) TEST
FROM テーブル4
WHERE ROWNUM<=1
)DIFF
WHERE
条件・・・・
まとめ
カラム+to_dsinterval(substr(numtodsinterval(TO_DATE('20050927151500','yyyymmddhh24MISS')-カラム'day'),8,12))
AS NAME
(stsdate) (sysdate)
(日付の差分では、端数が出る時があるので、その可能性がある箇所にROUND関数を使用する。)TRUNCは切り捨てです。
例・・・TRUNC(TO_DATE('2001/12/23','YYYY/MM/DD'),'YEAR')・・・・・・・2001/01/01が返ります(切捨て)
例・・・TRUNC(TO_DATE('20010202153515','YYYY/MM/DD HH24:MI'),'MI')・・・・・2001年02月02日15時35分がかえるはず(切捨て)
例・・・ROUND(TO_DATE('2001/02/03','YYYY/MM/DD'),'YEAR')
・・・2001/01/01が返ります(繰り下げ)
例・・・ROUND(TO_DATE('2001/12/23','YYYY/MM/DD'),'YEAR') ・・・2002/01/01が返ります
(繰上げ)
例・・・ROUND(TO_DATE('20010202153515','YYYY/MM/DD HH24:MI'),'MI')・・・・・2001年02月02日15時35分がかえるはず(繰り下げ)
例・・・ROUND(TO_DATE('20010202153530','YYYY/MM/DD HH24:MI'),'MI')・・・・・2001年02月02日15時36分がかえるはず(繰り上げ)
ボックス情報(entity)クラスです。
単体排他・・・レコード単位でブロック(DELETEとUPDATEで必要)
共通排他(テーブル排他)・・・テーブル単位でチェック(処理中などがFlag=1などを立ててチェック
削除(DELETE)・・・単体排他をかけて削除
更新(UPDATE)・・・単体排他をかけて更新
登録(INSERT)・・・排他の必要なし。だが、相関チェックが必要。
(相関チェックとは、キー検索によりINSERT するレコードが存在するかのチェックを行う)
EXISTS (EXISTSがTRUEなら 外のセレクトを実行します)
SELECT
*
FROM
TABLE a
WHERE
EXISTS(SELECT 1 FROM TABLE b WHERE b.TABLE b='5555' )
EXISTS (EXISTSがTRUEなら 外のインサート文を実行します)
INSERT INTO テーブルA a (
a.カラム1
a.カラム2
a.カラム3
a.カラム4
)
SELECT
b.カラム1,
固定値,
b.カラム3,
b.カラム4
FROM
TABLEA b
WHERE
EXISTS(SELECT 1 FROM TABLE b WHERE b.TABLE b='5555' )
EXISTS (EXISTSがTRUEなら 外のDELETE文を実行します)
DELETE
FROM テーブルA
WHERE
EXISTS(SELECT 1 FROM TABLE b WHERE b.TABLE b='5555' )
LEFT OUTER JOIN() 、INNER JOIN
INSERT INTO ()
SELECT
A.ZZZ
B.YYY
FROM
TBKIKI a
INNER JOIN YOKIKI b ON(a.ZZZ=B.ZZZ)
LEFT OUTER JOIN YOKIKI c ON(B.ZZZ=C.ZZZ)
WHERE
A=ZZZ
B=YYY
C IS NULL
外部結合
SELECT
*
FROM
(SELECT aa.YYY FROM TABLE aa WHERE aa.KARAMU1='5555') AA
FULL OUTER JOIN
(SELECT bb.YYY FROM TABLE bb WHERE bb.KARAMU='5555')
EE
ON(AA.ZZZ = EE.ZZZ)
GROUP BY
*
ORDER BY
*
セレクト文の説明
SELECT
a.カラム1,
b.カラム1,
c.カラム1
FROM
テーブルA a
テーブルB b
テーブルC c
WHERE
a.カラム2=b.カラム2
b.カラム2=c.カラム2
------------------------
SELECT
なし
FROM
テーブルA a
テーブルB b
テーブルC c
の時点で、テーブルA 、テーブルB、 テーブルCのカラムすべて取得できている。
(なぜなら、SELECTに記述されていないカラムでも、内部的には取得しているからWHEREで比較できている。例、WHERE句を参照)
Sysdate型を2006010101019999で取得する
SELECT
NVL( TO_CHAR(a.sysdate, 'yyyymmddhh24MISS ) , '' ) AS karam);
FROM
テーブルA a
DECODE関数の使用例
SELECT
a.カラム1,
b.カラム1,
DECODE(c.カラム1,'5555','五が4っつ','6666',a.カラム10)
FROM
テーブルA a
テーブルB b
テーブルC c
テーブルCのカラム1が'5555'であれば'五が4つ'と表示される。
テーブルCのカラム1が'6666'であればテーブルAのカラム10の内容が表示される。
インラインビューの使用例
SELECT
a.カラム1,
a.カラム2,
TB.カラム1,
TB.カラム2
FROM
テーブルA b
テーブル(SELECT b.カラム1 b.カラム2 FROM テーブルB b WHERE b.カラム1='3333') TB
WHERE
a.カラム1='1111' AND
a.カラム2='2222'
SELECT,INSERTの使用例
INSERT INTO テーブルA a (
a.カラム1
a.カラム2
a.カラム3
a.カラム4
)
SELECT
b.カラム1,
b.カラム2,
b.カラム3,
b.カラム4
FROM
テーブルA b
WHERE
b.カラム1='1111' AND
b.カラム2='2222' AND
b.カラム3='3333' AND
b.カラム4='4444'
SELECT,UPDATEの使用例
UPDATE テーブルA a
a.カラム1='1111'
a.カラム2='2222'
a.カラム3='3333'
a.カラム4=(SELECT b.カラム4 FROM テーブルB WHERE b.カラム4='b4b4')
WHERE
a.カラム1=b.カラム1
これは、エラーがある。なぜなら、外のUPDATE文のWHERE句では、テーブルBは指定できない。
(SELECT、INSERTで重要なのは、外のUPDATEの件数と、中のSELECT文の件数を意識することが必要)
)
日付の差分のサンプル
INSERT INTO テーブル1 a
(
a.カラム1
a.カラム2
a.カラム3 ・・・これはsysdate型です。
)
SELECT
b.カラム1,
b.カラム2,
b.カラム3 + to_dsinterval(DIFF.カラム3)
FROM
テーブル2 b,
(SELECT substr(numtodsinterval(TO_DATE('20050101150000','yyyymmddhh24MISS')
- TEST.カラム3,'day'),8.12)AS カラム3
FROM
(SELECT 5.カラム3 FROM テーブル5 WHERE 条件・・・) TEST
FROM テーブル4
WHERE ROWNUM<=1
)DIFF
WHERE
条件・・・・
まとめ
カラム+to_dsinterval(substr(numtodsinterval(TO_DATE('20050927151500','yyyymmddhh24MISS')-カラム'day'),8,12))
AS NAME
(stsdate) (sysdate)
(日付の差分では、端数が出る時があるので、その可能性がある箇所にROUND関数を使用する。)TRUNCは切り捨てです。
例・・・TRUNC(TO_DATE('2001/12/23','YYYY/MM/DD'),'YEAR')・・・・・・・2001/01/01が返ります(切捨て)
例・・・TRUNC(TO_DATE('20010202153515','YYYY/MM/DD HH24:MI'),'MI')・・・・・2001年02月02日15時35分がかえるはず(切捨て)
例・・・ROUND(TO_DATE('2001/02/03','YYYY/MM/DD'),'YEAR')
・・・2001/01/01が返ります(繰り下げ)
例・・・ROUND(TO_DATE('2001/12/23','YYYY/MM/DD'),'YEAR') ・・・2002/01/01が返ります
(繰上げ)
例・・・ROUND(TO_DATE('20010202153515','YYYY/MM/DD HH24:MI'),'MI')・・・・・2001年02月02日15時35分がかえるはず(繰り下げ)
例・・・ROUND(TO_DATE('20010202153530','YYYY/MM/DD HH24:MI'),'MI')・・・・・2001年02月02日15時36分がかえるはず(繰り上げ)
Blob型をSELECTする
SELECT
a.カラム1,・・・Blob型
FROM
テーブルA a
WHERE
a.id='1111'
Blob型をUPDATEする
SELECTしてロックをかけて、UPDATEをかける。(インサートされている(レコードが存在するので、CSEなどであらかじめ作成しておく。)必要がある。)
排他制御とは?
単体排他・・・レコード単位でブロック(DELETEとUPDATEで必要)
共通排他(テーブル排他)・・・テーブル単位でチェック(処理中などがFlag=1などを立ててチェック
削除(DELETE)・・・単体排他をかけて削除
更新(UPDATE)・・・単体排他をかけて更新
登録(INSERT)・・・排他の必要なし。だが、相関チェックが必要。
(相関チェックとは、キー検索によりINSERT するレコードが存在するかのチェックを行う)
・必要ない結合をやめて、EXISTSをしよう。
ORACLEレスポンス
悪い例
SELECT
FF.カラム1 カラム1
DECODE(FF.カラム2,'0','明日','あさって') カラム2
TO_CHAR(FF.カラム3,'YYYY/MM/DD HH24:MISS')' カラム3
MIN(FF.カラム4) カラム4
MAX(FF.カラム5) カラム5
FROM
(SELET
A.カラム1
RROM
テーブル A
WHERE
A.カラム1='9'
) EE
FULL OUTER JOIN
(SELECT
C.カラム2
D.カラム3
FROM
テーブル B,
テーブル C,
テーブル D
WHERE
B.カラム = C.カラム AND
B.カラム2 = D.カラム AND
C.カラム = D.カラム AND
C.カラム2 = D.カラム
) FF
ON (EE.TEST_ID = FF.TEST_ID)
GROUP BY
FF.カラム1
FF.カラム2
FF.カラム3
FF.カラム4
FF.カラム5
ORDER BY
FF.TEST.ID
よい例(修正後) EXISTSを使用するとかなり動作が速くなる。
SELECT
FF.カラム1 カラム1
DECODE(FF.カラム2,'0','明日','あさって') カラム2
TO_CHAR(FF.カラム3,'YYYY/MM/DD HH24:MISS')' カラム3
MIN(FF.カラム4) カラム4
MAX(FF.カラム5) カラム5
FROM
(SELET
A.カラム1
RROM
テーブル A
WHERE
A.カラム1='9'
) EE
FULL OUTER JOIN
(SELECT
C.カラム2
D.カラム3
FROM
テーブル C,
テーブル D
WHERE
EXISTS(SELECT 1 FROM テーブル B WHERE B.カラム = C.カラム AND B.カラム2 = D.カラム)
C.カラム = D.カラム AND
C.カラム2 = D.カラム
) FF
ON (EE.TEST_ID = FF.TEST_ID)
GROUP BY
FF.カラム1
FF.カラム2
FF.カラム3
FF.カラム4
FF.カラム5
ORDER BY
FF.TEST.ID
日付を取得
SELECT
SYSDATE
FROM
DUAL
最小値を取得(1が返る)
SELECT
LEAST('1','5','10')
FROM
DUAL
SQLの実行時間を表示する。(1回のSQLの場合)
set timing on
複数の場合は、TIMING START
TIMING SHOW
TIMING STOP
SQL文を再実行するには
/を使用する・・・・バッファの内容を表示しない
runを使用する・・・・バッファの内容を表示する
バインド変数を使用するには
SELECT
*
FROM
EMP
WHERE
EMPNO = :baind
バインド変数を使用するには(SQL PULS)
SELECT
*
FROM
EMP
WHERE
EMPNO = '&1'
現在時刻の表示
set time on
edit使用例
ed
edit
バッファを編集できる。そして/で再実行
C:\Oracle\Ora81\BINにある、afiedt.bufを編集している。
また、
SELECT * FROM DUAL
/
としても実行できる。
テーブルをLOCK
LOCK TABLE "テーブル名" IN EXCLUSIVE MODE NOWAIT
行ロック
SELECT '1' FROM "テーブル名" FOR UPDATE NOWAIT
oracleで重複を取得する場合は、having句を使用する。
SELECT
顧客番号, count(*)
FROM
テーブル
GROUP BY
顧客番号
HAVING count(*) > 1
.oracleに接続
TNS名(SQL*Plusで指定する名称) = ← ここに書かれている名前がネットサービス名
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = ホスト名)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = SID識別子) ← ここがサービス名
)
)
TNS名(SQL*Plusで指定する名称) がsqlplusのホスト文字列に当たります。
exp、impの例
expユーティリティとimpユーティリティを使用することで、表を別のORACLEへ持っていくことができます。
expユーティリティでは、表単位、ユーザ単位でデータを移動できます。ユーザ名が異なる場合は、imp時に、fromuserオプションとtouserオプションを使用します。
expするときのユーザがDBA権限を持っているとDBA権限のないユーザではimpできない場合があります。
unix# exp "user/passwd file=exp01.dmp tables=(JOB,
TOKUIDB, TOUR_JOHO)"
unix# imp "user/passwd file=exp01.dmp tables=(JOB, TOKUIDB, TOUR_JOHO)"
例
exp "scott/tiger file=/home/exp01.dmp tables=emp"
imp "scott/tiger file=/home/exp01.dmp tables=emp"
ただし、すでに表が存在している場合には、impエラーとなる。
細く
●表の一覧
SQL# select * from tab;
●表の項目一覧
SQL# desc 表名;(;は省略可)
●インデックスの一覧
SQL# select * from user_ind_columns;
※指定した表のインデックスのみ、表示することもできます。
SQL# select column_name from user_ind_columns where table_name = '表名';
●ユーザ一覧
SQL# select username from user_users;
●データベースの文字コード
SQL# select * from NLS_DATABASE_PARAMETERS where PARAMETER = 'NLS_NCHAR_CHARACTERSET';
spoolでテキストファイルに結果を格納!!
1.sqlplus xxx/xxxで接続
2.spool aaa.txt
3.select table_name from user_tables;
4.spool off
SI Oject Browser ダウンロード
『http://www.sint.co.jp/siob/download.asp』からobt900104.EXEをダウンロード。
isqlplus起動
isqlplusctl start →DOSで
http://localhost:5560/isqlplus/ →IEでポートが違う
主キー名から、テーブルを検索
1.
select table_name AS テーブル名, constraint_name from user_cons_columns where
constraint_name='PK_EMP'
2.
select table_name AS テーブル名, constraint_name from user_constraints where
constraint_name='PK_EMP'
主キーを検索
select * from user_cons_columns
select * from user_constraints
この二つを結合して、主キーを検索する。
@ 2つのテーブルの共通カラム constraint_name(属性名)
Aconstraintのカラム const.constraint_type='P' (PKEY)
Bconstraintのカラム const.table_name = 'EMP' (テーブル名)
SELECT
-- cons.table_name,
-- cons.constraint_name,
cons.column_name
FROM
user_cons_columns cons,
user_constraints const
WHERE
cons.constraint_name=const.constraint_name AND @
const.constraint_type='P' A
AND const.table_name = 'EMP' B
C(表でのチェック制約)
P(主キー)
U(一意のキー)
R(参照整合性)
V(ビューでのチェック・オプション付き)
O(ビューで読取り専用)
テーブルバックアップ
create teble A_bk as select * from A
テーブル名変更
rename A to A_bk
主キー削除
alter table テーブル名 drop constraints 主キー名
主キー追加
ALTER TABLE テーブル名
ADD(
CONSTRAINT 主キー名(属性名)
PRIMARY KEY (1、2、3)
TABLESPACE 表領域名
STORAGE(
INITIAL 40M
MAXEXTENTS 120
PCTINCREASE 0
)
PCTFREE 10
)
表領域については、『http://cyberam.dip.jp/database/oracle/oracle.html』を参照
カラム削除
alter table テーブル名 drop column カラム名
外部結合
----------------------------------------------------
例1 図参照
SELECT
A.コード
C.コード
FROM
(TBL1 ALEFT JOIN TBL2 B ON A.コード=B.コード) △テーブル1と2の外部結合
RIHGT JOIN TBL3 C ON A.コード=C.コード テーブル3と△の結果の外部結合
----------------------------------------------------
例1と同じ 図参照
SELECT
A.コード
C.コード
FROM
TBL1 A,
TBL2 B,
TBL3 C
A.コード=B.コード(+)
C.コード=A.コード(+)
----------------------------------------------------
----------------------------------------------------
2つの結合の場合
SELECT
A.コード
B.コード
FROM
TBL1 ALEFT JOIN TBL2 B ON A.コード=B.コード テーブル1と2の外部結合
----------------------------------------------------
4つの場合
SELECT
A.コード
D.コード
FROM
((TBL1 ALEFT JOIN TBL2 B ON A.コード=B.コード) △テーブル1と2の外部結合
RIHGT JOIN TBL3 C ON A.コード=C.コード) テーブル3と△の結果の外部結合
RIHGT JOIN TBL4 C ON D.コード=C.コード
----------------------------------------------------
Topへ
|