SQL入門
データの削除(DELETE)

SQLの初心者向け入門解説、VBAからデータベースを扱うためのSQLを解説
公開日:2019-12-07 最終更新日:2019-12-17

データの削除(DELETE)


エクセルVBAでデータベースを扱うためのSQL入門です。
前回までにやってきたことを大きく分けると、
・テーブル作成
・データ挿入
・データ取得
・データ更新
データベースにテーブルを作成し、データを入れて、データを取り出し、データを更新しました。
いろいろとデータベースを扱う事ができるようになりましたが、
やはり、削除できないと困ってしまいます。


データの削除は、DELETEです。
今回は、DELETEについて解説します。

使用するテーブル定義は以下になります。

全テーブル定義とテーブル自動作成VBA
・テーブル:m_customer ・テーブル:m_item ・テーブル:t_sales ・テーブル自動作成

DELETEの構文

データベースの行データを削除するには、DELETEを使用します。

DELETE FROM テーブル名
[ WHERE 論理式]

WHERE句を省略すると、テーブルの全行のデータが削除されます。

DELETEの使用例

m_customerのcodeが'00'で始まる行の削除

DELETE FROM m_customer
 WHERE code LIKE '00%'
以前のテストデータ作成で、
codeには、'001'から'100'を入れました。
したがって、LIKE '00%'は、'001'から'009'になります。

このSQLを実行することで、'001'から'009'が削除されます。

LIKE演算子
LIKE メタ文字によるパターンマッチングを行います
% 任意の文字列
_ アンダースコアです。
任意の1文字

SELECTで取得→シートで削除行を指定→DELETEで削除

以下VBAは、こちらのクラスを使用したVBAサンプルになります。
VBAクラスの全コード:データの取得
SQL入門の「データの取得:条件指定(SELECT,WHERE)」時点のVBAクラスの全コードです。ADOを使ったDB接続のVBAクラスの全コード クラスモジュール:clsSQLite

Sub SelectALL()
  Dim clsDB As New clsSQLite
  clsDB.DataBase = "C:\SQLite3\sample.db"
 
  Dim ws As Worksheet
  Set ws = ActiveSheet
 
  Dim sSql As String
  sSql = ""
  sSql = sSql & "SELECT '' AS 区分,*"
  sSql = sSql & " FROM m_customer"
  sSql = sSql & " ORDER BY code"
  
  If Not clsDB.SheetFromRecordset(sSql, ws.Range("A1"), Clear, True) Then
    MsgBox clsDB.ErrMsg
    Exit Sub
  End If
 
  Set clsDB = Nothing
End Sub

m_customerの全データをシートに出力しています。
先頭列として、空白文字を「区分」として出力しています。
このように、空文字、NULL、固定文字を新規カラムとして自由に追加することができます。

VBA マクロ SQL DELETE

削除したいデータ行のA列「区分」に"D"の文字を入れます。

※間違いを減らすために
間違って指定してしまうことを減らすためには、条件付き書式を設定すると良いでしょう。
A列「区分」に文字を入れた時、当該行に色を付ける等で目立たせます。
こういう工夫をすることで、うっかりミスを少しでも減らすことは大切です。


B列のcodeは変更してはダメです。
codeは主キー(PRIMARY KEY)なので、今回の場合は変更は不可です。
キーが変わってしまったら削除できませんので。
ここではあくまで、DELETEのサンプル&テストのため、簡易的な作りにしています。

VBA マクロ SQL DELETE

以下のVBAについて
B列が主キーとして固定のロジックにしています。
・A列の「区分」が、"D"または"d"のとき削除します。
・日付、数値、文字列は自動判別しています。
・文字列の ' は、 '' でエスケープ処理しています。
Sub SelectDelete()
  Dim clsDB As New clsSQLite
  clsDB.DataBase = "C:\SQLite3\sample.db"
 
  Dim sSql As String
  Dim i As Long, j As Long
  Dim maxRow As Long
  Dim ws As Worksheet
  Set ws = ActiveSheet
  With ws
    maxRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    For i = 2 To maxRow
      If UCase(.Cells(i, 1) = "D") Then
        sSql = ""
        sSql = sSql & "DELETE FROM m_customer" & vbCrLf
        sSql = sSql & " WHERE "
        sSql = sSql & .Cells(1, "B")
        sSql = sSql & " = "
        sSql = sSql & getValue4Sql(.Cells(i, "B"))
        If Not clsDB.ExecuteNonQuery(sSql) Then
          MsgBox clsDB.ErrMsg
          Exit Sub
        End If
      End If
    Next
  End With

  Set clsDB = Nothing
End Sub

'SQL用にセルのValueを編集
Function getValue4Sql(ByVal aRange As Range) As String
  Select Case TypeName(aRange)
    Case "Date"
      getValue4Sql = dateFormat(aRange.Value)
    Case "Double"
      getValue4Sql = aRange.Value
    Case Else
      getValue4Sql = addQuote(aRange.Value)
  End Select
End Function

'SQLiteは日付型がないので文字列として格納
Function dateFormat(ByVal var As Variant) As String
  dateFormat = addQuote(Format(var, "yyyy-mm-dd"))
End Function

'シングルクオーテーションをエスケープ処理
Function addQuote(ByVal str As String, _
         Optional ByVal aQuote As String = "'") As String
  If str = "" Then
    addQuote = "NULL"
  Else
    addQuote = aQuote & Replace(str, "'", "''") & aQuote
  End If
End Function

このVBAの、SelectDelete を実行すると、
以下のようなSQLが(A列で削除指定した)行数分発行されます。

DELETE FROM m_customer
 WHERE code = '011'

VBA実行が終了したら、再度最初のデータ取得、
SelectALL これを実行してデータが削除されたことを確認します。

VBA マクロ SQL DELETE

データの削除(DELETE)の最後に

今回はDELETEの学習・練習として、極めて簡単な例、および単純なVBAにしています。
実務的には、データの削除は様々な注意点が出てくるものです。
特にマスタは使わなくなったからと言って削除してしまうと、過去のトランザクションデータの情報が取得できなくなってしまいます。
マスタの場合は、テーブルから削除するのではなく、削除フラグや削除日で対応することが多くなります。
SQL入門でも、先々にはそのようなVBAも紹介できればと思っていますが、今はまだSQLの基本解説を優先しています。

次回は、他のテーブルを基にデータを挿入したり更新/削除するSQLについて解説します。



同じテーマ「SQL入門」の記事

テーブルを結合して取得(INNER JOIN,OUTER JOIN)
複数のSELECT結果を統合(UNION,UNION ALL)
データの更新(UPDATE)
データの削除(DELETE)
他のテーブルのデータで追加/更新/削除
インデックスを作成して高速化(CREATE INDEX)
トランザクション処理
VBAクラスの全コード:トランザクション処理
サブクエリ(副問合せ)
サブクエリのネストとSQLコメント&整形
WITH句(共通テーブル式)


新着記事NEW ・・・新着記事一覧を見る

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ