精华内容
下载资源
问答
  • 聊了SQL辣么久,总算聊到连接查询了……连接查询……有时称多表查询……有时又称多表连接查询……名字有差异,但意思总是一样——在多表之间创建指定关系的连接,并指定连接条件进行数据查询。在语句形式上,连接...
    点上方关注我们,每日1练,每天进步一点点0760e5edc22e67eb13e9a2ed230a2c0d.gif

    本章概要:

    1),交叉查询

    2),交叉查询的运算过程

    3),笛卡尔积的优劣

     1

    前尘往事如云烟,聊了SQL辣么久,总算聊到连接查询了……

    连接查询……有时称多表查询……有时又称多表连接查询……名字有差异,但意思总是一样——在多表之间创建指定关系的连接,并按指定连接条件进行数据查询。

    在语句形式上,连接查询通常有两种实现方式。一种是FROM子句列出所有需要连接的表,然后通过WHERE子句列出筛选条件;另一种是通过关键字JOIN建立表和表之间的连接,再通过关键字ON指定连接条件。

     2.

    咱们今天先聊简单、粗暴的第一种方法,该方法在语法上可以简单总结如下:

    SELECT 字段名 FROM1,表2 WHERE1.字段名=表2.字段名

    FROM子句列出需要连接查询的多个表,不同表名之间使用英文逗号间隔,然后WHERE子句指定了筛选的条件,最后SELECT子句指定需要提取字段的名称。

    举个小栗子。

    如下图所示,有两张表,左边是花名册,右边是成绩表。

    098d32aba14ac3592bd5384a35d1b44b.png          

    现在我们需要查询班组为‘二组’的人员成绩明细……

    查询结果如下:

    d0585b21d425617d1c4314a18a36cb17.png          

    这问题是不是有点眼熟?我们好像在哪见过你还得吗?是的,我们上期刚分享过子查询的解决方案,不知道相关语句你是否还记得……

    使用连接查询的方式,SQL语句如下:

    SELECT 花名册$.组别,花名册$.姓名,成绩表$.成绩 FROM [花名册$] , [成绩表$]  WHERE 花名册$.组别='二组' AND 花名册$.姓名=成绩表$.姓名

    以上语句中,花名册$和成绩表$两个表名反复出现,使代码书写和阅读都趋于复杂,此时我们可以使用表的别名进行简化。

    和字段别名一样,定义表的别名关键字也是AS,但和字段别名不同的是,在对表定义别名时,关键字AS可以省略。

    比如以下语句,我们将[花名册$]定义别名为a , [成绩表$]定义别名为b:

    SELECT a.组别,a.姓名,b.成绩 FROM [花名册$]a , [成绩表$]b  WHERE a.组别='二组' AND a.姓名=b.姓名

    代码也可以写成:

    SELECT 组别,a.姓名,成绩 FROM [花名册$]a , [成绩表$]b  WHERE 组别='二组' AND a.姓名=b.姓名

    对比上一条的语句,不难发现部分字段名省略了表名,这是因为相关字段名称在连接表中是独一无二的;而‘姓名’是花名册和成绩表都存在的字段名,则必须提供表名,否则系统无法识别字段来源,会发出错误提示:

    0d7c18e8a2c8a912be00ea4a437d50d3.png          

    说完表的别名,我们再说下语句的含义和运算过程。

    通过第11章的内容(Excel VBA+ADO+SQL入门教程011:SELECT语法结构和运算顺序),我们知道,系统首先执行FROM子句。

    本例中,FROM子句存在两个表,花名册和成绩表,系统读取它们的别名,并计算两个表的笛卡尔积,也就是列出这两个表中行的所有可能的组合,形成一个中间表。

    该过程类似于以下语句:

    SELECT * FROM [花名册$]a , [成绩表$]b

    运行该语句获得结果如下:

    741ab9024a8612bcdcca27bfa090f676.png          

    这个结果显然并不是我们最后希望获取的,但通过观察该表,我们也不难发现,只要我们通过WHERE子句指定两个条件即可获得目标数据,也就是组别='二组'以及a.姓名=b.姓名。

    ……下一步,系统按照WHERE指定的筛选条件(WHERE 组别='二组' AND a.姓名=b.姓名),对中间表进行筛选,去除中间表不符合条件的记录。该过程运算结果等同于以下语句:

    SELECT * FROM [花名册$]a , [成绩表$]b  WHERE 组别='二组' AND a.姓名=b.姓名

    运行该语句得出结果如下:

    d824a1ec1f6c45c149bccec12ed3e782.png          

    观察该表,a.姓名和b.姓名字段内容重复,而我们只需要其中一个即可,因此我们在SELECT子句中提供了3个字段名(SELECT 组别,a.姓名,成绩)

    最后,系统按我们提供的字段名,从执行WHERE子句后得出的中间表中提取记录作为结果表……最后结果如下:

    d0585b21d425617d1c4314a18a36cb17.png          

    摊手,整个过程就酱紫~

     3.

    FROM+WHERE的这种连接查询方式,虽简单,但也过于粗暴。

    07c189a734ce6fe2eebbfcdbef06a0b3.png          

    它会产生笛卡尔积,也就是会列出了连接表之间行的所有可能组合。

    比如两个表,各有10行记录,行的所有可能组合也就是10X10=100行……

    如果两个表各有1万行呢?那就是1万X1万=1万万……

    如果两个表各有30万行呢?那就是……抱谦,你电脑可以重启了,谢谢。

    在SQL查询中,我们通常会尽量避免笛卡尔积的产生,除非您就是需要笛卡尔积,比如列出所有产品组合的可能性……

    那么如何在不产生笛卡尔积的前提下对数据进行连接查询?河中生灵为何神秘死亡?下游居民为何染上怪病?河畔植物为何不断变异?是残留农药还是可怕细菌?今日说法下期播出~

    下期见~

    还是皮一下比较开心……

    晚安,我……

     系统学习Excel,推荐加入我的Excel社群

    c0859a45549a888f9ae19297d4999bc5.png

    更多教程&练习

    • 001:零基础学Excel(一)什么是Excel?

    • 002:30个工作日后(含特定节假日)是哪天?

    • 003:连续区间查询的常用方法有哪些?


    ©看见星光dfc7b3aeffc53f1270cb62f07409c82d.png
    展开全文
  • 初学版 EXCEL中添加按钮,按钮事件中调用方法 Sub Btn_Click() Dim strCn As String '字符串变量 strCnAP = "Provider = MSDAORA;Password=TEST;...将查询结果写入到EXCEL 包括字段,时间字.

    初学版

    EXCEL中添加按钮,按钮事件中调用方法

    Sub Btn_Click()
    
    Dim strCn As String      '字符串变量
    
    strCnAP = "Provider = MSDAORA;Password=TEST;User ID=test;Data Source=test;Persist Security Info=True;" '链接字符串'
    
    Call GetData(strCnAP, "TEST")
    
    End Sub

    将查询结果写入到EXCEL   包括字段,时间字符串处理

    Private Sub GetData(strCn As String, shtname As String)
    
    Dim cn As Object    '定义数据链接对象 ,保存连接数据库信息
    
    Dim rs As Object    '定义记录集对象,保存数据表
    
    Set cn = CreateObject("ADODB.Connection")  '创建数据链接对象
    
    Set rs = CreateObject("ADODB.RecordSet")  '创建记录集对象,用于接收数据查询获得的结果集
    
    Dim strSQL As String '字符串变量
    
    
    strSQL = "select a.* from user a where a.status in ('A','L')"    '设置SQL语句
    
    
    cn.Open strCn '打开连接
    
    rs.Open strSQL, cn '读取数据库中的数据
    
    
    Dim i As Integer, j As Integer, h As Integer, g As Integer, sht As Worksheet 'i,j,h为整数变量;sht 为excel工作表对象变量,指向某一工作表
    
    i = 2
    
    If Issheet(shtname) Then
      Set sht = ThisWorkbook.Worksheets(shtname)  '存在则获取对应sheet'
    Else
      Set sht = ThisWorkbook.Worksheets.Add(after:=Worksheets(Worksheets.Count)) '不存在则创建新的sheet'
        sht.name = shtname  '给新建的sheet命名'
    End If
    
    
    
    'sht.Range(sht.Cells(2, 1), sht.Cells(sht.UsedRange.Rows.Count, sht.UsedRange.Columns.Count)).ClearContents  '清除除第一行以外的数据
    
    sht.Cells.ClearContents  '清除sheet里的 所有数据
    
    
    For h = 2 To rs.Fields.Count + 1
    
        sht.Cells(1, h).Value = rs.Fields(h - 2).name '将字段写入sheet的第一行
    
    Next
    
    h = 1
    
    Dim str As String
    
    
    
    '循环读取数据并将数据显示到excel中
    
    Do While Not rs.EOF     '当数据指针未移到记录集末尾时,循环下列操作
    
        sht.Cells(i, 1).Value = h    '把当前记录的字段1的值保存到sheet1工作表的第i行第1列
        
        For g = 2 To rs.Fields.Count + 1
          
         If IsDate(rs(g - 2)) = True Then
            sht.Cells(i, g).Value = Format(rs(g - 2), "yyyy-mm-dd HH:MM") '如果是时间格式 需要Format转换一下  否则会显示数值
         Else
            sht.Cells(i, g).Value = rs(g - 2) '将字段写入sheet的第一行
         End If
    
        Next
    
        rs.MoveNext                      '把指针移向下一条记录
    
        i = i + 1                        'i加1,准备把下一记录相关字段的值保存到工作表的下一行
        h = h + 1
    
    Loop                                 '循环
    
    rs.Close   '关闭记录集,至此,程序将把某数据表的字段1和字段2保存在excel工作表sheet1的第1、2列,行数等于数据表的记录数
    
    cn.Close
    End Sub

    公用小方法

    Function getColumnLetter(ByVal myCol As Integer) As String '获取单元格列标的字母
    Dim columnName As String
     Dim k As Integer
     k = (myCol - 1) \ 26
     Select Case k
     Case 0
     Case Else
     columnName = columnName & Chr(64 + k)
     End Select
     columnName = columnName & Chr(64 + ((myCol - 1) Mod 26) + 1)
     getColumnLetter = columnName
    End Function
    
    Function Issheet(ByVal name As String) As Boolean '判断sheet是否存在'
     Dim i, n As Integer, bool As Boolean
     bool = False
     n = ThisWorkbook.Sheets.Count
     For i = 1 To n
     If ThisWorkbook.Worksheets(i).name = name Then
        bool = True
     End If
     Next i
     
     Issheet = bool
    End Function

     

    展开全文
  • 01036设置【Enter】键后单元格的移动方向 01037设置最近使用的文件清单中的最多文件数 01038设置新工作簿中的工作表个数 01039设置文件的默认位置 01040设置保存自动恢复文件的时间间隔和保存位置 01041停止屏幕...
  • 本书分为12章,涵盖了使用Access 2003来设计数据库系统的相关概念与技巧,通过实例让读者轻松学会表、查询、窗体、数据访问页的制作,更有宏、控件、VBA等高级应用知识等待你去探索。 本书理论与实践相结合,解说...
  • 本书分为12章,涵盖了使用Access 2003来设计数据库系统的相关概念与技巧,通过实例让读者轻松学会表、查询、窗体、数据访问页的制作,更有宏、控件、VBA等高级应用知识等待你去探索。 本书理论与实践相结合,解说...
  • 本书分为12章,涵盖了使用Access 2003来设计数据库系统的相关概念与技巧,通过实例让读者轻松学会表、查询、窗体、数据访问页的制作,更有宏、控件、VBA等高级应用知识等待你去探索。 本书理论与实践相结合,解说...
  • 本书分为12章,涵盖了使用Access 2003来设计数据库系统的相关概念与技巧,通过实例让读者轻松学会表、查询、窗体、数据访问页的制作,更有宏、控件、VBA等高级应用知识等待你去探索。 本书理论与实践相结合,解说...
  • 8.11.3 用查询设计网格以解决模糊字段的引用问题 233 8.12 使用分析器向导 233 8.12.1 表分析器向导 234 8.12.2 性能分析器向导 234 8.12.3 文档管理器 236 8.13 小 结 236 第9章 创建功能强大的窗体 ...
  • 高级(ad-hoc)查询,即时数据分析,计算字段,前10评级,根据季度将数据分组,设置解决方案的格式,常见的故障排除方法,外部和OLAP数据,数据透视图,利用VBA实现自动化,Excel服务器,熟悉功能区。  “使用没有...
  • 高级(ad-hoc)查询,即时数据分析,计算字段,前10评级,根据季度将数据分组,设置解决方案的格式,常见的故障排除方法,外部和OLAP数据,数据透视图,利用VBA实现自动化,Excel服务器,熟悉功能区。  “使用没有...
  • 高级(ad-hoc)查询,即时数据分析,计算字段,前10评级,根据季度将数据分组,设置解决方案的格式,常见的故障排除方法,外部和OLAP数据,数据透视图,利用VBA实现自动化,Excel服务器,熟悉功能区。  “使用没有...
  • 高级(ad-hoc)查询,即时数据分析,计算字段,前10评级,根据季度将数据分组,设置解决方案的格式,常见的故障排除方法,外部和OLAP数据,数据透视图,利用VBA实现自动化,Excel服务器,熟悉功能区。  “使用没有...
  • 8.11.3 用查询设计网格以解决模糊字段的引用问题 233 8.12 使用分析器向导 233 8.12.1 表分析器向导 234 8.12.2 性能分析器向导 234 8.12.3 文档管理器 236 8.13 小 结 236 第9章 创建功能强大的窗体 237 9.1...
  • 多条件查询为按照你设置的条件并你要求的顺序显示相应查询结果,可姓名查询班级查询(分班);某学科(含总分)某分数段查询班内名次(年级名次)段查询(如某班前XX名、年级前XX-XX名)等,各种查询...
  • 多条件查询为按照你设置的条件并你要求的顺序显示相应查询结果,可姓名查询班级查询(分班);某学科(含总分)某分数段查询班内名次(年级名次)段查询(如某班前XX名、年级前XX-XX名)等,各种查询...
  • 1778.1 查询简介 1778.2 “简单查询向导”的使用 1778.3 使用查询设计窗口 1798.3.1 为查询选择字段 1808.3.2 准则选择记录和排序显示 1828.3.3 创建更为复杂的查询 1838.3.4 改变查询列标题的名字 1848.3.5 将...
  • 1778.1 查询简介 1778.2 “简单查询向导”的使用 1778.3 使用查询设计窗口 1798.3.1 为查询选择字段 1808.3.2 准则选择记录和排序显示 1828.3.3 创建更为复杂的查询 1838.3.4 改变查询列标题的名字 1848.3.5 将...
  • 1778.1 查询简介 1778.2 “简单查询向导”的使用 1778.3 使用查询设计窗口 1798.3.1 为查询选择字段 1808.3.2 准则选择记录和排序显示 1828.3.3 创建更为复杂的查询 1838.3.4 改变查询列标题的名字 1848.3.5 将...
  • 1778.1 查询简介 1778.2 “简单查询向导”的使用 1778.3 使用查询设计窗口 1798.3.1 为查询选择字段 1808.3.2 准则选择记录和排序显示 1828.3.3 创建更为复杂的查询 1838.3.4 改变查询列标题的名字 1848.3.5 将...
  • 1778.1 查询简介 1778.2 “简单查询向导”的使用 1778.3 使用查询设计窗口 1798.3.1 为查询选择字段 1808.3.2 准则选择记录和排序显示 1828.3.3 创建更为复杂的查询 1838.3.4 改变查询列标题的名字 1848.3.5 将...
  • 1778.1 查询简介 1778.2 “简单查询向导”的使用 1778.3 使用查询设计窗口 1798.3.1 为查询选择字段 1808.3.2 准则选择记录和排序显示 1828.3.3 创建更为复杂的查询 1838.3.4 改变查询列标题的名字 1848.3.5 将...
  • 1778.1 查询简介 1778.2 “简单查询向导”的使用 1778.3 使用查询设计窗口 1798.3.1 为查询选择字段 1808.3.2 准则选择记录和排序显示 1828.3.3 创建更为复杂的查询 1838.3.4 改变查询列标题的名字 1848.3.5 将...
  • 1778.1 查询简介 1778.2 “简单查询向导”的使用 1778.3 使用查询设计窗口 1798.3.1 为查询选择字段 1808.3.2 准则选择记录和排序显示 1828.3.3 创建更为复杂的查询 1838.3.4 改变查询列标题的名字 1848.3.5 将...
  • 1778.1 查询简介 1778.2 “简单查询向导”的使用 1778.3 使用查询设计窗口 1798.3.1 为查询选择字段 1808.3.2 准则选择记录和排序显示 1828.3.3 创建更为复杂的查询 1838.3.4 改变查询列标题的名字 1848.3.5 将...
  • 1778.1 查询简介 1778.2 “简单查询向导”的使用 1778.3 使用查询设计窗口 1798.3.1 为查询选择字段 1808.3.2 准则选择记录和排序显示 1828.3.3 创建更为复杂的查询 1838.3.4 改变查询列标题的名字 1848.3.5 将...
  • 1778.1 查询简介 1778.2 “简单查询向导”的使用 1778.3 使用查询设计窗口 1798.3.1 为查询选择字段 1808.3.2 准则选择记录和排序显示 1828.3.3 创建更为复杂的查询 1838.3.4 改变查询列标题的名字 1848.3.5 将...
  • 1778.1 查询简介 1778.2 “简单查询向导”的使用 1778.3 使用查询设计窗口 1798.3.1 为查询选择字段 1808.3.2 准则选择记录和排序显示 1828.3.3 创建更为复杂的查询 1838.3.4 改变查询列标题的名字 1848.3.5 将...
  • 1778.1 查询简介 1778.2 “简单查询向导”的使用 1778.3 使用查询设计窗口 1798.3.1 为查询选择字段 1808.3.2 准则选择记录和排序显示 1828.3.3 创建更为复杂的查询 1838.3.4 改变查询列标题的名字 1848.3.5 将...
  • 1778.1 查询简介 1778.2 “简单查询向导”的使用 1778.3 使用查询设计窗口 1798.3.1 为查询选择字段 1808.3.2 准则选择记录和排序显示 1828.3.3 创建更为复杂的查询 1838.3.4 改变查询列标题的名字 1848.3.5 将...
  • 1778.1 查询简介 1778.2 “简单查询向导”的使用 1778.3 使用查询设计窗口 1798.3.1 为查询选择字段 1808.3.2 准则选择记录和排序显示 1828.3.3 创建更为复杂的查询 1838.3.4 改变查询列标题的名字 1848.3.5 将...

空空如也

空空如也

1 2 3 4
收藏数 73
精华内容 29
关键字:

vba按字段查询