INSERT文
データを1件新規追加する構文
列を指定する場合の構文
INSERT INTO テーブル名(
列名1,
列名2,
……
)VALUES(
値1,
値2,
……
)
・指定していない列にはNULLが挿入される
・ただしデフォルト値が定義されている場合はその値が挿入される
・実務では列名を指定する書き方が多い
列を省略する(全ての列に値を設定する)場合の構文
INSERT INTO テーブル名 VALUES(
値1,
値2,
……
)
・列名を省略した場合は全ての列に値を指定する
(指定しないとエラー)
注意点
・NOT NULL制約に気を付ける
・列と値の順序、個数、型および桁数に気を付ける
型がマッチしない値は挿入できない
(DBMSによってはエラーにならず、意図しないデータが登録される)
・PKの重複はNG
INSERT SELECT文
データ(行)を複数件新規追加する構文
SELECT文の結果表のデータ(行)を挿入する
列名を指定する場合の構文
INSERT INTO テーブル1(
テーブル1の列名1,
テーブル1の列名2,
……
)SELECT
テーブル2の列名1,
テーブル2の列名2,
……
FROM テーブル2
・WHERE句、GROUP BY句、HAVING句や結合も使える
・ORDER BY句はシーケンスという機能を使う場合以外は意味なし
列名を省略する(全ての列に値を設定する)場合の構文
INSERT INTO テーブル1 SELECT
テーブル2の列名1,
テーブル2の列名2,
……
FROM テーブル2
UPDATE文
既存データ(行)を更新する構文
UPDATE テーブル名
SET
列名1=値1,
列名2=値2,
……
WHERE
対象レコードの絞り込み条件
注意点
・WHERE句なしだと全件更新されてしまう
→UPDATEでの失敗は大事件
⇒事前にSELECT文を実行し対象を確認する
(DB開発ツールの場合のみ)
・PKは基本的に更新しない
DELETE文
既存データを削除する構文
DELETE FROM テーブル名
WHERE
対象レコードの絞り込み条件
注意点
・WHERE句なしだと全件削除されてしまう
→UPDATEと同様に大事件になる
⇒対策:事前にSELECT文を実行し対象を確認する
(DB開発ツールの場合のみ)
DCL
トランザクションとは:関連する複数の処理を1つでまとめたもの
・DML(SELECT,INSERT,UPDATE,DELETE)の各処理がトランザクションを構成する1つの処理となる
・トランザクションの一連の処理は
全ての処理が正しく実行される/全く実行されない
のいずれかになる
COMMIT; //処理の確定
ROLLBACK; //処理の取り消し(データを前回のコミット直後まで巻き戻す)
・SQLは本来COMMIT文を実行しないと反映されない
A5-MK2などのツールはオートコミットの設定になるため自動的に裏でコミットされる
(ツールによってオートコミットか否かは変わる)
注意点
SQL側
①OK
②OK
③エラー:例外発生
④OK
Java側
List li = (INSERT文を実行する処理)
for(拡張for文){
(INSERT実行);
[1]コミット処理
}
[2]コミット処理
[1]で実行した場合:2件登録
[2]で実行した場合:0件登録
UNION/UNION ALL
複数のSELECT文の結果表を統合する
キーワード | 意味 |
---|---|
UNION | 重複行を除外する(自動的にソートされる) |
UNION ALL | 全て表示する(重複行も含める) |
SELECT
テーブル1の列名1,
テーブル1の列名2,
……
FROM テーブル1
UNION [ALL]
SELECT
テーブル2の列名1,
テーブル2の列名2,
……
FROM テーブル2
EXISTS
データ(行)が存在するか(1行でもあるか)確認する
SELECT
列名1,
列名2,
……
FROM
テーブル名
WHERE
[NOT] EXISTS (副問い合わせ)
副問い合わせの結果が1行でもあればTRUEと評価される
特徴
・IN条件の代わりに使用するとパフォーマンスが改善される可能性がある
・構文が特殊(ネットで調べながら書ければよい)
・昔はOracle SQLのみ、今はMySQLでも使用可能
・慣習として副問い合わせ部分のSELECT句には定数('X')を使用することが多い
例)(SELECT 'X' FROM ~)