>> i's SQUARE >> Oracleのノウハウ >> SQL入門

SQL入門



ここでは、リレーショナルDBの操作を行うSQLの基礎中の基礎を記述してます。

まずはデータ検索を行う「SELECT文」

例)select 列名 from 表名

ちなみに、大文字・小文字は区別しないのでどっちでも良いです。 全項目を表示する場合は
例)select * from tmp

重複行を削除して表示したい場合は
例)select distinct aa, bb from tmp


以下は列別名と算術式のサンプルです。 列別式は "" で記述する方法と AS を使う種類があります。

例)select aa*6 "test", abc || ' is a ' || def AS name from tmp

あと、項目にNULLがある場合は注意が必要です。 算術式で使用している値にどれか一つでもNULLがあれば結果はNULLになります。


以下は行の制限・選択のサンプルです。「WHERE句」を使います。
例)select * from tmp where date='99-01-01'

次は比較演算子のサンプルです。
例)select * from tmp where (ten >= 10 or ten < 20) and ten != 18

◆比較演算子
= 等しい
> より大きい
>= 以上
< より小さい
<= 以下
!= または <> 等しくない
BETWEEN A AND B A以上B以下
IN (値1,値2,・・・) ()内のいずれかの値
LIKE 文字パターンに該当する値
IS NULL NULLかどうか

例)select * from tmp where name like '%太郎%'

WHERE句には比較演算子だけでなく「論理演算子」も使用できます。 論理演算子は「AND」、「OR」、「NOT」があります。

論理演算子の例)where 列名 NOT IN ()
論理演算子の例)where 列名 IS NOT NULL


ORDER BY句」で表示結果をソートします。 ソートキーを複数列指定する事も可能です。
例)select * from tmp where aa=bb order by aa,dd,cc

order by のソートは「昇順」ですが、DESCをつけるとその項目は「降順」になります。
例)select * from aa order by bb desc


◆SQL関数

SQLには便利な関数がたくさんあります。 ここでは、良く使う関数の一部を紹介します。

TO_CHAR(日付型データ,'表示書式')
日付型データの書式を変える
例)select TO_CHAR(aaa,'YYYY/MM/DD') from aaa

NVL
NULL値を他の値に置換する
例)select NVL(aaa,'NG') from tmp
上の例ではaaaの項目がNULLならNGを出力します。

DECODE
これは「IF THEN ELSE」ロジックに似たことが可能です。
例)select decode(aa,'OK',tmp*0.1, 'NG' tmp*0.5, tmp) from emp


◆グループ関数
avg() 平均値
count() カウント
max() 最大値
min() 最小値
stddev() 標準偏差
sum() 合計値
variance() 分散を計算

以下は行のカウントを行うサンプルです。
例)select count(*) from tmp


GROUP BY句」を使用するとグルーピングが可能です。 省略したときは選択された行がすべて1つのグループとなります。
例)select aa,avg(bb) from tmp group by aa order by avg(bb)

グループ化した結果をさらに制限するときは「HAVING句」を指定します。
例)select job,name,count(*) from tmp where aa=bb group by job,name having count(*) > 1 order by name
上の例は重複行があるデータを表示してます。


尚、SQL関数やグループ関数はネストが可能です。
例)select max(avg(nvl(aa,0))) from emp


次は複数表からデータを取得するサンプルです。
例)select a.aa, b.bb from aaa a, bbb b where a.tmp1=b.tmp1

尚、2つや3つ以上の表からもデータ取得可能です。


◆外部結合

外部結合を利用すると、 行の値のたりないほうに (+) を付加して結合条件を満たさない行を表示する事が出来ます。 ちなみに結合条件で「NULL」がある行は (+) を付けないと表示されません。

例)select a.name, b.no from tmp1 a, tmp2 b where a.no(+) = b.no


◆副問合せ

SELECT の WHERE句などにまた SELECT文を埋め込むことが可能です。
例)
select a.* from aa a, (select bb from tmp where bb=1) b
where a.no=b.bb and b.bb in (select cc from ctable where cc > 0)

例)
select no, avg(sal) from tmp
group by no having avg(sal) > ( select avg(sal) from bb)


◆データ操作言語(DML)

・INSERT
・UPDATE
・DELETE

検索・追加・更新・削除などデータ操作をおこなうSQL文をDMLと言います。 SELECTもDMLです。

例)insert into tmp values(0,sysdate,'OK');

例)
insert into tmp
select * from tmp2 where id > 10

例)
insert into tmp (id, name)
(select aid, aname from amp where job = 'GOOD')

例)update tmp set no=2 where emp =10

例)update tmp set no=2, id=5 where emp =10

例)update tmp set (no, id) = (select no, id from tmp where emp=15) where emp=10

例)delete from tmp where id in (select id from dd where name like 'M%')


◆データ定義言語(DDL)

・CREATE
・ALTER
・DROP
・RENAME
・TRUNCATE
・GRANT
・REVOKE

例)truncate table テーブル名
テーブルの初期化を行いますが、DELETEするよりも処理が早い反面ロールバックが効かないので注意が必要です。 エクステントも初期化されるので表領域の節約にもなり、またテーブルを全件削除するときにお勧めです。

例)alter table テーブル名 add (test VARCHAR2(1) DEFAULT '0') 上記はテーブル項目を追加するサンプルです。


◆トランザクション制御(DCL)

・COMMIT
・ROLLBACK
・SAVEPOINT


SQLの文法が良く思い出せなかった時や 作業効率をアップさせるために手元において置きたい一冊としては以下が超お勧めです!
自分一人で石を持ち上げる気がなかったら、
二人がかりでも石は持ち上がらない。
by ゲーテ