分享

Excel VBA ADO SQL入门教程18:DELETE删除语句

 L罗乐 2019-09-18
本系列更多文章后台回复关键字SQL即可。

1.

……诸君好啊,又见面了。聊了十几期,总算把SQL查询语句聊完了,打个哈欠先。
……SELECT查询语句是SQL的核心,聊完了它,剩下的就简单了……掰掰我的手指头……关于SQL,我们大概还有3个部分没讲,分别是DELETE删除、UPDATE更新以及INSERT新增。这3个语句讲完,本系列的SQL也就告一段落了。
我们今天先来讲DELETE语句,顾名思义,也就是如何从数据库中删除数据。
其基础语法如下:
DELETE FROM 表名 WHERE 条件
WHERE条件不是必须的,但当没有WHERE子句等删除条件时,DELETE会删除表中所有的记录;因此当DELETE忘记了WHERE,后果通常如下图所示:
         

2.

举个例子。
有一个文件夹,内有一份Excel工作簿和一份ACCESS文件(点击文末可以下载该示例文件)
         
我们现在需要通过Excel VBA,按指定条件删除ACCESS文件中表名为’成绩表’的数据行。
ACCESS ‘成绩表’的模样如下图所示。
         
现在,假设我们需要删除姓名为’看见星光’的记录行。SQL语句如下:
DELETE FROM 成绩表 WHERE 姓名='看见星光'
第1章的时候我们就说过,EXCEL执行SQL的操纵语句,需要通过VBA ADO的方式;第2章我们也介绍了如何使用VBA引用ADO对象并执行SQL语句。
综上,在VBA中使用DELETE语句完整代码如下:
Sub DoSql1()
    Dim cnn As Object
    Dim strPath As String, strCnn As String, strSQL As String
    Set cnn = CreateObject('adodb.connection')
    strPath = ThisWorkbook.Path & '\数据库.accdb'
    strCnn = 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=' & strPath
    cnn.Open strCnn
    strSQL = 'DELETE FROM 成绩表 WHERE 姓名='看见星光''
    cnn.Execute (strSQL)
    cnn.Close
    Set cnn = Nothing
End Sub


而假设我们需要删除ACCESS文件中,EXCEL当前工作表(表名为’操作表’)A列出现的姓名数据。
         
代码如下:
Sub DoSql2()
    Dim cnn As Object
    Dim strPath As String, strCnn As String, strSQL As String
    Set cnn = CreateObject('adodb.connection')
    strPath = ThisWorkbook.Path & '\数据库.accdb'
    strCnn = 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=' & strPath
    cnn.Open strCnn
    strSQL = 'delete from 成绩表 where 姓名 in (select * from [Excel 12.0;database=' & ThisWorkbook.FullName & '].[操作表$a:a])'
    cnn.Execute (strSQL)
    cnn.Close
    Set cnn = Nothing
End Sub
代码中SQL语句使用了IN运算符和子查询,关于子查询,参考过往帖:Excel VBA ADO SQL入门教程013:子查询
代码中ADO创建的连接是ACCESS文件,在此基础上,SQL语句查询Excel工作簿工作表的数据时,使用了[Excel 12.0;database=' & ThisWorkbook.FullName & '].[操作表$a:a]的语句,该知识点参考:Excel VBA ADO SQL入门教程004:SQL中的Excel表

当然,也可以使用关联语句作为删除条件执行DELETE,代码如下:
Sub DoSql3()
    Dim cnn As Object, strSQL1 As String
    Dim strPath As String, strCnn As String, strSQL As String
    Set cnn = CreateObject('adodb.connection')
    strPath = ThisWorkbook.Path & '\数据库.accdb'
    strCnn = 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=' & strPath
    cnn.Open strCnn
    strSQL1 = '[Excel 12.0;database=' & ThisWorkbook.FullName & '].[操作表$a:a] b'
    strSQL = 'delete distinctrow a.* from 成绩表 a inner join ' & strSQL1 & ' on a.姓名=b.姓名'
    cnn.Execute (strSQL)
    cnn.Close
    Set cnn = Nothing
End Sub


DELETE子句指定了需要删除记录行的表名(delete distinctrow a.*),并使用内连接inner join的查询结果作为删除条件。
需要注意的是,DELETE后有个关键字DISTINCTROW,这通常是ACCESS DELETE使用关联查询方案时必备的;而SQL Server则并不需此用法。ACCESS(JET SQL)与SQL SERVER(T-SQL)有很多不同,这不是我们系列教程的重点,略过,感兴趣的朋友可以自行百度。
3.

为什么例子中使用了ACCESS文件,而不是EXCEL呢?为什么不举个使用DELETE语句删除EXCEL某个表的记录行的例子呢?不是不想,是臣办不到啊。
         
对于EXCEL文件,SQL可以删除单元格内的值,但不能使用DELETE语句删除整条记录,或者说删除单元格自身;否则会收到以下错误提示:
         
那么如何使用SQL删除单元格内的值呢?
我们下期讲UPDATE语句。
就酱紫,挥手再见。

文件下载:https://pan.baidu.com/s/1PxEH7E60wuCvlvPHInS6XQ%20
提取码:3838

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多