現場での実践SQL(1)

 SQLの基礎的な説明は省略して、現場で使う実践的なSQLのテクニックをまとめたいと思います。
 特に100万件以上の大規模データベースにおいてSQLを操作する場合を想定しています。
 SQLはどのRDBMSでも使用できる共通言語ですが、Oracle、SQLServer、MySQLそれぞれ関数やプロシージャの書き方に違いがあります。
 特にここで紹介する内容は、中級レベルの内容であるため、その違いが強くなる部分です。
 ここでは、MySQLを例にご紹介しますが、お使いのDBによって書き方は若干変わることをご留意ください。


 まず、(1)では概要として、抽出の重要性をまとめます。

1.2テーブルを連結して1テーブルの該当レコードを削除

 ~ 例1 ~ 

-- 例1:
delete B
from A
inner join B
on A.KEY=B.KEY

 ~ 結果 ~ 

 影響を受けた行数: 2

   成功



 ~ 例2 ~ 

-- 例2:
delete B
from A
left join B
on A.KEY=B.KEY
where B.KEY is not NULL

 ~ 結果 ~ 

 影響を受けた行数: 2

   成功



 ~ 例3 ~ 

-- 例3:
delete B
from A,B
WHERE A.KEY=B.KEY

 ~ 結果 ~ 

 影響を受けた行数: 2

   成功



 INNER JOIN、LEFT JOIN等どのような連結でも関係なく、正しくレコードを抽出さえすれば、後はDELETEの対象テーブル(この場合B)を指定するだけです。外部左結合ではだめなのでは等、深く考えてしまいがちですが、結果は同じです。

 私は、長年SQLに携わってきたのですが、これこそSQLを使う際一番認識しておくべきことではないかと思っています。


1.2テーブルを連結して2テーブルの該当レコードを削除

 ~ 例  ~ 

-- 例:
delete A,B
from A
inner join B
on A.KEY=B.KEY

 ~ 結果 ~ 

 影響を受けた行数: 4

   成功



 これも「2テーブルを連結して1テーブルの該当レコードを削除」と同じで、正しくレコードを抽出さえすれば、後はDELETEの対象2テーブル(この場合AとB)を指定するだけです。


3.アップデートも同じことです

 ~ 例:SQL Server ~ 

-- 例:
update B
set B.DATA='400'
from A,B
where A.KEY = B.KEY;

 ~ 結果 ~ 

 影響を受けた行数: 2

   成功



 ~ 例:MYSQL ~ 

-- 例:
update A, B 
set B.DATA='400'
where A.KEY = B.KEY;

 ~ 結果 ~ 

 影響を受けた行数: 2

   成功



 DELETEの場合と同じく正しくレコードを抽出さえすれば、後はUPDATE文を用いて対象のテーブル(この場合AとB)と項目を指定してアップデートするだけです。
 ただし、複数テーブルからのアップデートについてはRDBMSにより、書き方が、かなり変わりますので注意して下さい。※Oracleはサブクエリでしか対応できません。


4.インサートも同じことです

 ~ 例  ~ 

-- 例:
insert into C
select A.KEY,A.NAME,B.DATA
from A,B
where A.KEY = B.KEY;

 ~ 結果 ~ 

 影響を受けた行数: 2

   成功



 INSERTも正しくレコードを抽出さえすれば、後は該当のテーブル(この場合C)にインサートするだけです。


5.結局「SELECT文」がSQLの根本です

 上図の通り、SELECTは意味合いが2つあるのですが、結局何等かのデータを処理する場合、抽出から始まり、抽出後に表示、削除、挿入、更新のいずれかのアクションを行うという流れです。
 挿入、削除、更新は非常に簡単な文法であり、結局、表示と抽出の「SELECT文」がSQLの根本といえます。
 そして、その「SELECT文」の表示と抽出は下図の通りFROMを境に分かれます。


 現場での実践SQL(2)以降はこの「抽出」と「表示」を分けてまとめていきます。



おすすめの関連記事

DBの基礎理論(1)【データモデル、関数従属性、キー属性、正規形】
データモデル、正規形等データベースの基礎理論についてまとめました。
現場での実践SQL(2)
現場での実践的なSQL知識をまとめています。(2)では単テーブルからの基本的な抽出についてまとめています。