サブクエリ
何をしたいのか?
サブクエリを使って、複合テーブルの親子テーブルに入っている値を削除したい。
子であるschool_tテーブルには、company_id、room_id、school_idがある。school_tテーブルの、company_idを使ってschool_id取得して、親テーブルschool_name_tテーブルのschool_idをdeleteしたい。
セレクトした結果を、文字列に直す。
文字列を代入して、さらにデリート処理をするようだね。
何ができる?
サブクエリとはSQLの中に書くSQLのこと。SQL文を実行することをクエリ(問合せ)の発行と呼びます。
ずサブクエリから実行され、実行結果を一つのテーブルと見なし、次にメインクエリが実行されます。
いつ使う?
スイッチングコストについて書きます。スイッチングコストについて書きます。スイッチングコストについて書きます。スイッチングコストについて書きます。スイッチングコストについて書きます。スイッイッチングコストについて書きます。
■注意点
MySQLではDELETEやUPDATE文のサブクエリで更新対象のテーブルを指定できない
DELETE |
サブクエリ部分を1階層深くして、更新文のFROM句で指定したテーブルをサブクエリで直接参照しないようにします
■見本2
DELETE |
DELETE WHERE IN
■構文
DELETE FROM [テーブル] WHERE [カラム] IN ([値A],[値B],...); |
■書き方
DELETE FROM test_t WHERE name IN ('Apple','Banana'); |
サブクエリ見本
■
SELECT T.* |
■WHEREで使う
SELECT * DEPARTMENT_ID = (SELECT ID FROM DEPARTMENT WHERE NAME = '開発部') |
■SELECTで使う
SELECT E.ID,E.NAME, |
高負荷になりやすいので注意。。
サブクエリが複雑だと他の場所で使用するよりも高負荷で結果を取得するのに時間のかかるクエリになるので、SELECT句で使う場合は比較的単純なサブクエリであることが望ましいです。
join DELTEの注意点
■JOINとDELETE
DELETE table1,table2,table3 FROM table1 INNER JOIN table2 INNER JOIN table3 WHERE table1.id=table2.id AND table2.id= table3.id |
table1, table2, table3という3つのテーブルに共通するデータを削除する!
FROM句の前に、削除する対象のテーブルを書かなくてはなりません。
言い方を変えると、FROMの前に書いていないテーブル名は、結合条件には使われますが消えません。
これを応用すると、3テーブルに共通するレコードを、table1だけ削除するという器用なことができるのです!
DELETE table1 FROM table1 INNER JOIN table2 INNER JOIN table3 WHERE table1.id=table2.id AND table2.id= table3.id |
論理削除と物理削除
DELETE文のアンチパターンというより、どちらかというと設計よりの話です。昔から「論理削除か物理削除か」という壮絶なバトル論争が続いています。
論理削除とは、テーブルからデータを削除せずに、「削除フラグ」といった項目に削除済みです、というマークをつけます(大半は論理値でtrueなら現存、falseなら削除済みとします)。
物理削除とは、本当にテーブルからデータを削除します。
論理削除なら復活できる、物理削除ならできない
いやいや論理削除は大量の削除済みデータを残すことになりレスポンスが低下、と一長一短。
データベースの設計を任されるようになったら、この問題に取り組んでみてください。
残すメリット
・データの復帰ができる
デメリット
・データが重くなる
・速度が落ちる
あなたにおすすめのコンテンツ
カスタマイズしたコンテンツを出します。
リンク対策はもう古い、これからはコンテンツSEOの時代
外部リンク対策をするのは、すでに昔のはなし。
最新のコンテンツSEO対策とは何か?
売れるページの作り方とは
大企業と中小企業では広告の方法がちがいます。
ホームページもベストな運営の手法があります
外部リンク対策とは何か
今では古くなってしまった手法ですが、外部リンク対策について
知っておくことは大事です。外部リンク対策と危険性について