SQL入门教程第08课:关键字和动态条件查询

职场   2024-11-26 07:55   福建  

啪!扔手机……书接上回……



 两个通配符



上节我们分享了WHERE语句的单条件和多条件的查询套路,今天再来分享下模糊条件查询


如你所知,在Excel中有两个很重要的通配符:星号(*)和问号(?);在字符串中,一个星号可以代表0到多个字符,而问号(一个)则只能代表一个字符。


在SQL in Excel中也有两个与之类似的通配符;一个是%,类似星号,可代替任意数量的字符。一个是_,类似问号,一个_只能代替一个字符。


在SQL查询语句中使用通配符,需要借助LIKE运算符。


举个俺胡建的荔枝。



倘若我们需要查询姓名中包含“光”字的学生名单,SQL代码如下:


SELECT 姓名FROM [学生表$]WHERE 姓名 LIKE '%光%'


查询结果如下:


倘若我们需要查询姓名长度为2个字符的学生名单,SQL代码如下:


SELECT 姓名FROM [学生表$]WHERE 姓名 LIKE '__'


查询结果如下:


倘若我们需要查询姓名以“美女”开头,同时年龄小于18岁的学生名单,SQL代码如下:


SELECT 姓名,年龄FROM [学生表$]WHERE 姓名 LIKE '美女%' AND 年龄<18

查询结果如下:


……


在Excel中,单元格存在星号(*),而又需要批量查找或替换星号时,通常使用“~”进行强制转义。



那么在SQL中,又使用什么符号可以取消%和_的通配符能力,使它转义为普通字符呢?


不知你是否还记得当字段名出现特殊字符(例如空格)时,我们是怎么处理的?


——使用中括号[]将字段名包括起来~打个响指,这里同样如此。


还是举个栗子。




如上图所示,是一份名为学生表的Excel工作表,倘若我们需要查询“备注”字段包含特殊字符(_)的学生名单,代码如下:


SELECT 姓名,备注 FROM [学生表$] WHERE 备注 LIKE '%[_]%'



小贴士:


在SQL IN Excel中,不支持使用通配符*和?,只能使用通配符%和_,但在ACCESS数据库中,不支持使用通配符%和_,只支持*和?。



 一个动态筛选数据的案例



举一个对新手而言可能稍微复杂的VBA+ADO+SQL的实例(示例文件文末可下载)。


该实例在工作中是较为常见也较为实用的。


在一个工作簿里,有两个工作表,一个是学生表,一个是查询表。



上图是学生表,记录了学生信息的明细。


下图是查询表。第一行是标题栏,有四个字段名,分别是班级、姓名、性别、爱好。



要求:

在查询表字段名对应的第二行的单元格输入关键值后,点击【查询】按钮,从“学生表”获取符合查询条件的学生信息。


效果动画示意:




VBA代码如下:


Sub Sql_QueryDataWithKeyword()    Dim adoConn As Object, rst As Object    Dim strPath As String, strConn As String, strSQL As String    Dim i As Long, j As Long    Set adoConn = CreateObject("adodb.connection")    strPath = ThisWorkbook.FullName    If Application.Version < 12 Then        strConn = "Provider=Microsoft.jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & strPath    Else        strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & strPath    End If    adoConn.Open strConn '以上后期绑定ADO并建立当前文件链接    For j = 1 To 4        If Len(Cells(2, j).Value) Then '当查询关键值不为空时,使用and运算符和like链接在一起            strSQL = strSQL & " AND " & Cells(1, j).Value & " LIKE '%" & Cells(2, j).Value & "%'"        End If    Next    If Len(strSQL) = 0 Then        MsgBox "尚未输入任一查询关键值。"        Exit Sub '当没有输入任何查询关键值时退出程序    End If    strSQL = "SELECT * FROM [学生表$] WHERE " & Mid(strSQL, 5)    Set rst = adoConn.Execute(strSQL) '执行strSQL语句    ActiveSheet.UsedRange.Offset(3).ClearContents    For i = 0 To rst.Fields.Count - 1 '遍历记录集中的字段名        Cells(4, i + 1) = rst.Fields(i).Name    Next    Range("a5").CopyFromRecordset rst '将记录复制到单元格区域    adoConn.Close '关闭链接    Set adoConn = Nothing '释放内存    Set rst = NothingEnd Sub


小贴士:

VBA+ADO方法执行SQL语句的最大优势之一,是各种变量和循环语句的组合使用。它们使SQL语句的搭建更加灵活,可以比较有层次的表述复杂的SQL语句。


在上述示例中,通过遍历单元格对象A1:D2,搭配SQL查询语句中的AND和LIKE运算符,用较少的VBA代码完成了多条件的模糊匹配查询,这远比VBA自身的INSTR函数更简洁也更高效


示例文件下载,百度网盘▼

https://pan.baidu.com/s/1I8WZGk4k61XkB2J_Wpz9Vg

提取码: nvem




需要系统学习Excel却找不到优质教程?学习Excel的过程中遇到疑难问题,却找不到人及时作出解答?


加入我的付费社群,学习+训练+答疑,与6000+在线会员一起,同微软最有价值专家MVP同行,全面精进Excel之道


🚂>>~

加入我的付费会员,全面学习Excel

透视表 函数 图表 VBA PQ想学啥学啥

👀


本文由公众号“Excel星球”首发。
点击阅读原文系统学习Excel!

Excel星球
微软全球最有价值专家(Excel MVP),上千篇原创图文和视频教程随学随用,随用随查,建议常用Excel的职场人关注。
 最新文章