SAK 図書館
SQL 基礎実地編 (その四) 問い合わせ、レコード参照、クエリ
■データベース問い合わせ
・リレーショナルデータベース(RDB) では、select 文を用いて、実に様々な
問い合わせが可能である。
・特定のデータを抜き出す指定は次のようにする。
この例では、キーの先頭が「a」で始まるものだけが問い合わされる。
like は、部分一致を行う。
select
キー,
データ1,
データ2,
データ3
from sak.テストm
where キー like 'a%'
order by キー
;
・問い合わせ件数(照会件数)を引き取るには、次のようにする。
select
キー,
データ1,
データ2,
データ3,
count(*) 件数
from sak.テストm
where キー like 'a%'
order by キー
;
・複数条件で抽出するには、次のようにする。
この例では、キーが「a001」と「b002」のものが問い合わされる。
where 句には、and、or を複合条件指定できる。
() で囲まれた条件ほど優先順位が高い。
select
キー,
データ1,
データ2,
データ3
from sak.テストm
where キー = 'a001' or キー = 'b002'
order by キー
;
select
キー,
データ1,
データ2,
データ3
from sak.テストm
where (キー = 'a001' or キー = 'b002') and データ1 > 0
order by キー
;
・項目指定に「*」を指定すると、全ての項目が含まれる。
select
*
from sak.テストm
where キー like 'a%'
order by キー
;
・特定の項目を見せたくないときは次のようにする。
この例では、データ2 と言う項目がなくなる。
select
キー,
データ1,
データ3
from sak.テストm
order by キー
;
・項目名を異なった項目名に変更する場合は、次のようにする。
この例では、データ1 と言う項目名が「あいうえお」と言う項目名に変更さ
れている。Oracle は、「データ1 as あいうえお」を「データ1 あいうえお」
と「as」がなくても良い。
select
キー,
データ1 as あいうえお,
データ3
from sak.テストm
order by キー
;
・計算項目を作る場合は、次のようにする。
この例では、データ1 + データ2 の合計が「合計」と言う項目名で追加され
る。様々な SQL 関数を用いた計算項目が作成できる。
select
キー,
データ1 + データ2 as 合計,
データ3
from sak.テストm
order by キー
;
・文字列の結合項目を作る場合は、次のようにする。
この例では、データ1 と データ2 の結合文字が「結合文字」と言う項目名
で追加される。SQL 関数を用いたフォーマットなども可能である。
但し、数値項目の文字結合はできない。
select
キー,
データ1 || データ2 as 結合文字,
データ3
from sak.テストm
order by キー
;
・テストm のデータ1 と データ2 は数値なので、実際にこの項目を結合した
い場合は、次のようにする。
to_char() は、数値を文字列に変換する。
逆に to_number() は、文字列を数値に変換する。
select
キー,
to_char(データ1) || to_char(データ2) as 結合文字,
データ3
from sak.テストm
order by キー
;
・複数のテーブルやビューを結合した問い合わせるできる。
結合する条件が必要なので、なんでもかんでも結合できるわけではない。
次のテーブルがあったする。サンプルm のコード1 は、テストm のキーに
対応しているものとする。
create table sak.テストm (
キー char (008) primary key,
データ1 number (009, 0),
データ2 number (009, 0),
データ3 number (009, 0)
) STORAGE(INITIAL 100M NEXT 20M MAXEXTENTS 99);
create table sak.サンプルm (
番号 char (008) primary key,
データ1 number (009, 0),
データ2 number (009, 0),
コード1 char (008),
コード2 char (008)
) STORAGE(INITIAL 100M NEXT 20M MAXEXTENTS 99);
・サンプルm のコード1 にテストm のキーを結合(ジョイン join) する場合、
次のようにする。
サンプルm の項目とコード1 に該当するテストm のデータ1 が「参照項目」
と言う名前で参照結合される。
もし、テストm に存在しないキーの場合は、「参照項目」には NULL がセッ
トされる。但し、「(+)」を省略すると参照できないレコードは含まれなく
なる。結合時に同名の項目名が複数のテーブルやビューに存在する場合、ど
ちらの項目を示しているかテーブル名やビュー名で修飾しなければならない。
修飾すると、項目名も修飾付きになってしまうので、as 句で見やすい名前
にすると良い。
STORAGE は、Oracle 固有のオプションかもしれません。
select
番号,
サンプルm.データ1 as データ1,
サンプルm.データ2 as データ2,
コード1,
テストm.データ1 as 参照項目,
コード2
from sak.サンプルm, sak.テストm
where サンプルm.番号 = テストm.キー (+)
order by 番号
;
・たくさんのテーブルやビューを結合する場合、修飾が見にくく難解になって
くる。その場合、次のようにする。
from 句でテーブルやビューの一時名を指定して、それで修飾する。
上手く使うと、すっきりした SQL 文にできる。
select
番号,
a.データ1 as データ1,
a.データ2 as データ2,
コード1,
b.データ1 as 参照項目,
コード2
from sak.サンプルm a, sak.テストm b
where a.番号 = b.キー (+)
order by 番号
;
・サンプルm のコード1 とコード2 が同じくテストm を参照するような結合問
い合わせはできない。
いろいろ試した見たが、ストアドファンクションで参照すれば良い。
次のようになる。
select
番号,
データ1,
データ2,
コード1,
sak.GetTestm(コード1) as 参照項目1,
コード2,
sak.GetTestm(コード2) as 参照項目2
from sak.サンプルm
order by 番号
;
・ストアドファンクション GetTestm のコードは、次のようになる。
create or replace function sak.GetTestm (cd in varchar2) return varchar2 is
ret varchar2(200);
begin
begin
select データ1 into ret from sak.テストm where キー = scdk;
exception
when OTHERS then
ret := '';
end;
return ret;
end;
/
■SQL 基礎実地編資料
■SQL 基礎編資料
■SQL チューニング編資料
■Oracle PL/SQL 編資料
■PostgreSQL 編、JAVA Servlet、JSP 編資料
■MySQL 編資料