同系列的第五篇,上一篇在:http://blog.csdn.net/jiluoxingren/article/details/9633139

数据的查找与筛选

第4篇发布到现在已经过了4天,很抱歉,学生党,还是悲催的高三,没办法,8月1就开学了。以后更新文章的速度可能会更慢,而且出完这套数据库教程之后,未来一年都可能不会有新的教程了。就我而言是想写下去,多写点的,一是记录下自己会的,另一方面把自己会的知识传播出去,不过高三这段时间可能力不从心了。

继续吧,看标题“包含表中局部数据的数据集,数据的查找”,看上去是两项内容,实际上是一项。查找,筛选,实际上都是为了获取我们需要的数据,而不是将所有数据都提取出来。在这一章,我们将再次体会到SQL:Select语句的强大。

取得表中前n个或前n%的记录

之前,我说过SQL:Select语句的一个简化的语法,这已经是第三章的内容了,还记得吗?复习一下:

SELECT fieldnamelist  FROM  tablename

要获得表中前n个或前n%个记录,尽管我们可以打开整张表的数据,然后在用循环显示数据的时候最大值为n,n为我们想要的条数这种方式来实现,但是SQL:Select语句提供一个直接的方法来让我们获得表中前n个或前n%个记录。这时候我们要扩充SQL:Select语句的语法了。我们来看新的语法:

SELECT TOP n [PRECENT] fieldnamelist  FROM  tablename

我们发现新的语法在fieldnamelist前面加入了TOP n [PRECENT]这一部分,TOP和PRECENT都是SQL的关键字,所以我也按照我之前所说的习惯:SQL语句的关键字用大写。需要先说[PRECENT],[]这样的语法表示的是可选,也就是说TOP这样一个关键字加进去之后,n是必须的了,但是PRECENT依然是可选的,如果写上他,那n就代表前n%,是一个百分数,可取的范围是0<n<100;而如果没有PRECENT,那么n就代表前n条,可取的范围是0<n<4294967295,也就是说如果表中有10000000000(不用数了,比4294967295多一位数字)条记录(假设吧,Access一张表最多能有多少条记录真没查过,说不定最多只能有4294967295条,知道确切数字的告诉我一下,不过先假设他能储存不止4294967295条吧),那么你最多也只能选出前面4294967295条。

让我们来实践一下吧,假设我们要取出前30%的记录,那么我们可以这样写(还是在Student表,取出全部字段)

SELECT  TOP 30PRECENT  * FROM Student

前面说到的[PRECENT]的[]代表的是可省略,其实[]仅仅是语法表达的需要,实际上写SQL语句是不需要写上去的。就像我上面的SQL语句一样。

说完语法,照例是要上VB代码的。不上代码的话大家可能会产生疑惑,SQL的语法换了,那么这个SQL语句又应该写在哪里??别急,下面会回答你这个问题。

数据的条件查找

要实现数据的查找,就必须要使用更复杂语法的SQL:Select语句。我们来看下面的语法:

SELECT fieldnamelist  FROM  tablename WHERE 条件

会发现,这个语法比最初的语法多了一个“WHERE 条件”,但又没有了第一节的TOP n [PRECENT]这一部分,实际上除了最初给出来的语法内容是必须的,其他都是可以根据需要增添上去的。就是这个条件实现了数据的查找,也就是实现了把我们需要的数据从表里面取出来,而不是像之前那样取出一张表的全部数据。语法中“条件”两个字实际上很虚无,到底这个条件怎么写呢?最简单的是“ 字段名='内容'”,留意里面的一对单引号,当内容是中文的时候就需要用单引号引起来,如果不是的话与一般来说可以不用单引号。一定要注意这是单引号!

我们来写一个语句实践一下吧。假设我们要找出Student表中的StudentName为“黄飞鸿”的记录,我们可以这样写:

SELECT  *  FROM Student  WHERE  StudentName='黄飞鸿'

前面 SELECT * FROMStudent 的部分之前已经说过,光是这样没有Where关键字就是选出全部的记录。WHEREStudentName='黄飞鸿',就表示选出StudentName字段中内容为“黄飞鸿”的记录。

还是上面的实践中的例子,需要留意的是,认真看一下实践中我所写的SQL语句,Select后面跟着的字段名列表是用*的,也就是全部字段都选出来。然后再看我SQL语句后面的解释:“我们选出的是……的记录”,注意是记录,一个记录有多个字段的数据组成。所以,上面我写的语句的作用不仅仅是把StudentName字段中的“黄飞鸿”这个文本内容选了出来,同时还有StudentID字段中他所对应的的数据662356也被选了出来。这体现了数据库的对应关系。

现在来回答上一节的最后,提出的语法改变了,那么新的SQL语句又要写在什么地方的问题。其实还是老地方,其实每调用一次SQL:Select语句,无论是之前的简单语法,还是现在有Where的语法,甚至以后更复杂的语法,SQL:Select语句的作用都是返回一个数据集(如果符合Where条件的记录找不到,那这个数据集就是空的)。所以,所有的SQL:Select语句都可以作为参数传递给Recordset对象的Open方法。

照样,现在我们把实践中写的那个SQL语句作为参数传递给Recordset对象的Open方法,并显示在表格里。这个还是写在Load事件里吧。这次我把Load事件里的代码全都列出来,包括之前的连接数据库的,还有打开整张表的代码,这样做是为了给大家一个提醒,具体提醒是什么?认真看看注释吧,代码后面还会说的。

VB代码开始:

Private SubForm_Load()

'创建新的Connection对象

Set Cnn = NewADODB.Connection

'注意要记住该数据库目录为你数据库文件当前的位置

Cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;DataSource=E:\Sample.mdb;Persist Security Info=False"

'创建新的Recordset对象

Set rec = NewADODB.Recordset

'打开student表的全部字段的全部内容

rec.Open"SELECT * FROM Student", Cnn, adOpenStatic, adLockOptimistic

'---------------------------------------------------------------------

'“----”注释里的是第五章新加的代码

'---------------------------------------------------------------------

'注意了!!如果使用之前的Recordset对象变量rec

'而且之前的rec已经被Open过了,那么必须调用Close

'将其关闭之后才能再调用Open方法

rec.Close

'打开student表中StudentName为“黄飞鸿”的记录

rec.Open"SELECT * FROM Student Where StudentName='黄飞鸿'", Cnn, adOpenStatic, adLockOptimistic

'---------------------------------------------------------------------

'这一章新加的代码就到这里,下面的还是之前的代码

'---------------------------------------------------------------------

'数据的提取

Do Until rec.EOF =True

List1.AddItemrec.Fields("StudentID").Value

'Fields对象,括号里的是索引(Index),索引填写的内容为字段的名称

'Item属性是Fields对象的默认属性,他的一个参数就是Index

'Fields("Student")表示一个Field对象

'Fields("Student")等价于

'rec.Fields.Item ("Student")或

'rec.Fields! ("Student")

'!表示默认属性

List2.AddItemrec.Fields("StudentName").Value

'移动下一条记录为当前记录

rec.MoveNext

Loop

End Sub

VB代码结束:

这里我们可以看到3行的红色注释(虽然VB的IDE里的注释是用绿色显示的,不过这里为了强调就用红色),非常显眼。这就是我要提醒大家的地方。实际的数据库应用里,往往需要将Recordset对象回收再用。例如这里我需要显示出全部的人名,待会我可能又根据用户的需要去找某个人的记录,或者待会可能还要排一下序。我们不可能创建那么多的Recordset对象,如果要的话就意味着我们需要声明很多个Recordset对象变量,这很可能会很混乱。所以Close之后重新用Open执行其他的操作,这样的手段是经常用到的。

我们可以看到,之前的打开整张表的代码我没有去掉,然后就是在一堆注释之后直接Close,再用Open来写今天的代码了。而后面的输出到List控件的代码也被保留了下来,接在了今天新的代码之后。所以现在的输出List1里就只有662356,List2就只有”黄飞鸿“了。

当前的代码运行结果如下图:

最后,给大家留个作业吧。第一节“取得表中前n个或前n%的记录”的SQL语句我一直没写用在VB上的代码,既然都知道了还是作为参数传递给Recordset对象的Open方法,那么自己去试一下吧。以为WHERE关键字的作用就怎么点??还没完呢!下一章,我们将来讲述:多重条件搜索,模糊搜索和给定范围内的搜索。本套教程未完,待续。

VB6基本数据库应用(五):数据的查找与筛选的更多相关文章

  1. VB6.0数据库开发五个实例——罗列的总结

    实例一: 系统登录对话框 设计分析:数据库管理系统登录对话框两种基本方法:数据库中建立数据表用于保存系统用户登录信息:支持安全验证的数据库管理系统,可将系统用户定义为数据库用户. 技术要领:1.Ent ...

  2. 孤荷凌寒自学python第四十九天继续研究跨不同类型数据库的通用数据表操作函数

    孤荷凌寒自学python第四十九天继续研究跨不同类型数据库的通用数据表操作函数 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天继续建构自感觉用起来顺手些的自定义模块和类的代码. 不同类型 ...

  3. 【Android Developers Training】 26. 在SQL数据库中保存数据

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  4. 孤荷凌寒自学python第四十七天通用跨数据库同一数据库中复制数据表函数

    孤荷凌寒自学python第四十七天通用跨数据库同一数据库中复制数据表函数 (完整学习过程屏幕记录视频地址在文末) 今天继续建构自感觉用起来顺手些的自定义模块和类的代码. 今天打算完成的是通用的(至少目 ...

  5. Django数据操作F和Q、model多对多操作、Django中间件、信号、读数据库里的数据实现分页

    models.tb.objects.all().using('default'),根据using来指定在哪个库里查询,default是settings中配置的数据库的连接名称. 外话:django中引 ...

  6. MVC设计模式((javaWEB)在数据库连接池下,实现对数据库中的数据增删改查操作)

    设计功能的实现: ----没有业务层,直接由Servlet调用DAO,所以也没有事务操作,所以从DAO中直接获取connection对象 ----采用MVC设计模式 ----采用到的技术 .MVC设计 ...

  7. Oracle数据库间的数据复制 - SQLPlus中的COPY命令

    Copy命令可以实现不同Oracle数据库间的数据的复制,也是可以实现同一数据库的数据复制,其性能表现和导入/导出相同. 根据9i文档,说Copy命令未来会不支持,但实际上Oracle 11g仍然支持 ...

  8. [置顶] VB6基本数据库应用(三):连接数据库与SQL语句的Select语句初步

    同系列的第三篇,上一篇在:http://blog.csdn.net/jiluoxingren/article/details/9455721 连接数据库与SQL语句的Select语句初步 ”前文再续, ...

  9. 多租户实现之基于Mybatis,Mycat的共享数据库,共享数据架构

    前言 SaaS模式是什么? 传统的软件模式是在开发出软件产品后,需要去客户现场进行实施,通常部署在局域网,这样开发.部署及维护的成本都是比较高的. 现在随着云服务技术的蓬勃发展,就出现了SaaS模式. ...

随机推荐

  1. 基于Android 下载文件时,更新UI简单帮助类

    因为在项目开发时.有这种简单需求,问谷歌,网络上也有好多Utils工具类,可是比較冗余.自己就简单的写了一个简单帮助类. /** * 下载文件,更新UI简单帮助类 * * @author jarlen ...

  2. 測试之路3——对照XML文件2

    距离上一篇对照xml文件隔了非常久,并不代表一直做了那么久. 事实上上一次对照xml文件一直出错,事实上我忽略了一个非常easy的问题:我从根文件夹下得到的全部孩子,是这个根下的,而xml文件的组织形 ...

  3. windows phone (26) ApplicationBar应用程序栏

    原文:windows phone (26) ApplicationBar应用程序栏 在应用程序中,如果需要几个按钮或者菜单来执行一些普通的命令,就应该考虑使用ApplicationBar,因为silv ...

  4. eclipse 代码清理 代码格式化 代码凝视

    Code Style包含两个方面:代码清理,代码规范化.代码清理能够參考: http://www.ibm.com/developerworks/cn/opensource/os-eclipse-cle ...

  5. Ubuntu常用软件推荐,图文详细说明及下载

    抛开Windows,其实在任何一款Linux发行版本中,我们都有超级大量的软件来安装,使用.这次的教程,我就以Ubuntu为例,来给大家推荐一些我认为不错的软件 声明: 1.本文提到的全部软件,都在文 ...

  6. 同一个存储过程中,不能多次select into 到同一张表的问题

    表记录的插入方式有两种.其一,先create table 再 insert into from ....其二, 直接 select into. 第一种方式,由于要记录日志,因此IO消耗更多,durat ...

  7. VMware vSphere 服务器虚拟化之十七 桌面虚拟化之安装View链接服务器

    VMware vSphere 服务器虚拟化之十七 桌面虚拟化之安装View链接服务器 View链接服务器(View Connection Server)是Vmware Horizon View桌面虚拟 ...

  8. firefox os 2.0版模拟器QQ初体验

    供firefox os 爱侣.firefox os 手机迟迟没有感到些许遗憾在中国上市会,但是,我们必须相信firefox os 登陆中国是迟早的事,腾讯QQ已经登陆firefox os 应用市场,今 ...

  9. centos7 设备 mariadb-10

    下载地址: http://mirrors.ustc.edu.cn/mariadb/mariadb-10.0.19/source/mariadb-10.0.19.tar.gz 由于用cmake所以线安装 ...

  10. Oracle GoldenGate (以下简称ogg)在异种移植os同一种db之间的数据同步。

    Oracle GoldenGate (以下简称ogg)在异种移植os同一种db之间的数据同步. ogg要实现的功能: 同步可以细化到单个表,满足特定的where条件rows同步,称号column同步. ...