030103.htm

来自「提供一个VB学习教程,入门级。来源于网上」· HTM 代码 · 共 197 行 · 第 1/2 页

HTM
197
字号
        COUNT():返回指定字段中非NULL值的记录个数,而COUNT(*)返回全部记录个数,不进行空值检查。<br>
        SUM():返回指定数值型字段的总和。<br>
        AVG():返回指定数值型字段的平均值。<br>
        MIN():返回指定数值型字段的最小值。<br>
        MAX():返回指定数值型字段的最大值。<br>
        其参数是一个字段名。格式:<br>
        函数(字段名) AS 输出到结果的字段名&nbsp;<br>
        括号中的字段是你想在表中检查的字段,而输出结果的字段是你想保存输出结果的字段,一般它只含单一记录,它的名字用AS关健字自定,但不能与其他字段名重复。&nbsp;<br>
        如:select SUM(垫付) as lxn from Bb where 垫付>20&nbsp;<br>
        lxn字段的值就是表BB中垫付字段数值大于20元的和,如383(元)。只有这一个记录。再如 select count(*) as x ,AVG(定额) as y from BB ,x字段返回表BB的记录数。y字段返回定额字段的平均值,它构成了结果集中唯一记录的两个字段值。<br> 
        -----------------------------------------------------------<br>
        使用表间连接来返回多个表中的记录:当从多个表中检索记录时,SQL语句的工作方式是:每个表中的一条记录都与其他表的所有记录搭配生成新记录,组成结果集。如:SELECT * FROM [invoice],[UnitRecord],这样的话,返回的结果集相当庞大,是多个表记录数的乘积,比如表A有3条记录,表B有4条记录,表C有2条记录,那么SELECT * FROM A,B,C的结果就有3×4×2=24条记录,且每条记录都包含原三个表的所有字段,因此,我们通常用WHERE来限定一些条件,以只返回多表中合适的记录搭配,有一种比WHERE更好的办法,它可以满足我们更多需要,即采用表链接返回记录集。用JOIN关健字,语法:<br> 
        SELECT 多个字段 FROM 表1 链接方式 JOIN 表2 ON 表1.字段1=表2.字段2&nbsp;<br>
        SELECT a1.name,a2.email FROM a1 INNER JOIN a2 ON a1.ID=a2.ID&nbsp;<br>
        在FROM子句中指明JOIN连接方式并用ON来指定条件。<br>
        链接方式有INNER和LEFT、RIGHT三种,:INNER——内链接。当两个字段的值相等时,就将两个表中的记录组合成一个新记录(其实用where子句也一样,如:<br>
        SELECT [UnitRecord].[Name],[UnitRecord].[Address], [invoice].[Money] FROM&nbsp;<br>
        [UnitRecord] INNER JOIN [invoice] ON [invoice].[Name]=[UnitRecord].[Name]其结果等同<br> 
        SELECT [UnitRecord].[Name],[UnitRecord].[Address], [invoice].[Money] FROM&nbsp;<br>
        [UnitRecord],[invoice] WHERE [invoice].[Name]=[UnitRecord].[Name],不过,如果使用的是LEFT或RIGHT关健字,采用左链接或右链接,结果就不同了,这也正是比WHERE更好的地方)。<br> 
        LEFT:左链接。格式:SELECT 表1.字段,表2.字段…FROM 表1 LEFT JOIN 表2 ON 表1.某字段=表2.某字段。返回左侧表中的所有记录,返回右侧表与条件匹配的记录。它的结果是:INNER JOIN的结果集+左侧表中未满足ON条件而未筛选进入INNER JOIN的其余全部记录。&nbsp;<br>
        RIGHT:右链接,返回右侧表中全部记录,返回左侧表中与条件匹配的记录。其结果是INNER JOIN的结果集+右侧表中的其他全部记录。LEFT JOIN和RIGHT JOIN这两个关健字只要记一个就行了,因为把两个表的左右顺序换一下,就可以用同一个关健字达到两种效果。如:<br> 
        SELECT [UnitRecord].[Name],[UnitRecord].[Address],[invoice].[Money] FROM [UnitRecor<br> 
        d] LEFT JOIN [invoice] ON [invoice].[Name]=[UnitRecord].[Name] 等同于<br> 
        SELECT [UnitRecord].[Name],[UnitRecord].[Address],[invoice].[Money] FROM [invoice] RIGHT JOIN [UnitRecord] ON [invoice].[Name]=[UnitRecord].[Name]<br> 
        技巧:采用左链接或右链接时,其中一个表的所有记录都传到了结果集,它的一些记录值可能在另一个表中并没有关联记录(即匹配ON条件的记录),这时由于多表记录总是自动进行搭配,每条结果记录都包含原多表所有字段,因此出现某些字段值为空NULL的情况,利用此特性倒是很容易找出哪些记录在另一个表中没有匹配的记录,有时具有实际意义,如查找哪些个体户连一张发票都没交,加个WHERE检测结果集对应的原表字段是否为NULL就行了:<br>
        SELECT [UnitRecord].[Name],[UnitRecord].[Address],[invoice].[Money] FROM [invoice] RIGHT JOIN [UnitRecord] ON [invoice].[Name]=[UnitRecord].[Name] WHERE [invoice]<br> 
        .[Money] IS NULL<br> 
        ------------------------------------------------------------------<br>
        使用IN关健字在WHERE子句中实现子查询:在一个SELECT语句里包含另一个SELECT查询语句,称为子查询,这个子查询并不是任意的,有限制,它只能返回一个字段,将这个返回字段与IN关健字前的字段进行逐一比较是否相等,作为满足WHERE条件。如:SELECT SUM([Money]) AS JIFU FROM [invoice] WHERE [Name] IN (SELECT [Name] FROM [UnitRecord] WHERE [UnitRecord].[Address] LIKE "%吉富%"),返回所有吉富个体户的已交管理费总和。先用子查询找出在吉富的个体户姓名,然后从发票表中找出这些人的发票进行累计。可看到,子查询只包含[Name]一个字段,且整个子查询语句包含在括号中。一目了然。<br> 
        可以在IN前面加上关健字NOT,表示与指定字段不相等的情况时,视为满足WHERE条件,恰好反过来。如上面加上NOT后表示所有不在吉富的个体户管理费总和:SELECT SUM([Money]) AS JIFU FROM [invoice] WHERE [Name] NOT IN (SELECT [Name] FROM [UnitRecord] WHERE [UnitRecord].[Address] LIKE "%吉富%")。<br> 
        ------------------------------------------<br>
        在SQL语句中直接使用VB函数:严格地说,只在JET引擎的Access SQL中可以使用VB中的函数,如变为小写Lcase,变为大写Ucase,以及格式化(最常用)Format函数等。使用时也很简单,只要在返回字段时用“函数(字段名) AS 别名”就可以了,如:SELECT [name],Format([Money],”¥0.00”) AS VBFUN FROM [invoice],注意要用AS关健字来重新定义返回字段名,否则ACCESS SQL将用缺省的名称Expr1001,Expr1002来命名用了函数的字段,而不会用原来的字段名。此外,如果函数有参数,不能使用VB内置的常量名形式,而直接使用数字,如:SELECT StrConv([Money],4) FROM [invoice],而不能写SELECT StrConv([Money],vbWide) FROM [invoice],这样不能识别。JET引擎毕竟是独立于VB之外的。<br> 
        ------------------------------------------------<br>
        ★向表中添加记录:INSERT语句,格式:<br>
        INSERT INTO 表名 VALUES(完整的记录值)<br> 
        INSERT INTO BB VALUES("李新宁","复印",30,"六月",180,0,"")<br> 
        也可以从其他表中复制记录。格式:<br>
        INSERT INTO 表名(字段1,字段2,……) SELECT 源字段 FROM 源表。如:<br> 
        INSERT INTO [Test]([Name],[Money]) SELECT [name],[Money] FROM [Invoice] WHERE [money]>40,其实这种情形有点类似嵌套的SELECT。就象前面讲到的用IN创建SELECT子查询一样。都把一条完整的SELECT作为子句。<br> 
        ★删除满足条件记录:DELETE语句,可同时删除多条记录,格式:<br>
        DELETE FROM 表名 WHERE 条件表达式<br> 
        delete from outplay where 垫付&lt;40<br> 
        将表outplay中“垫付”小于40的记录都删除。<br>
        ★修改记录:UPDATE语句,可同时修改多条满足条件记录,格式:<br>
        UPDATE 表名 SET 字段=新值 WHERE 条件<br> 
        UPDATE BB SET 垫付=0 WHERE BB.姓名="李春生"<br> 
        可以同时更改多个字段,字段间用逗号隔开。对于数字型字段还可以使用算术符号,如:UPDATE [invoice] SET [Name]=”李某”,[Money]=[Money]*1.04 WHERE [Name] LIKE “李%” (闲话:一个%可以代替多个字符哦,别忘了,不要用星号*)<br> 
        ------------------------------------------<br>
        ★ 在代码中创建表:SQL的CREATE TABLE语句,格式:<br> 
        CREATE TABLE 表名(字段1名 类型(大小),字段2 类型(大小),……)<br> 
        例如:<br>
        cn.Execute ("CREATE TABLE 通迅录(姓名 TEXT(14),地址 TEXT(40),电话 long)")&nbsp;<br>
        (说明:cn是ADO对象中的connection对象变量)<br>
        注意:表名和字段名中只能包含字母数字和下划线,因此“通讯录”“姓名”等中文可能不能识别,会出错,如遇此情况,请将全部字段名改用英文!!<br>
        其中,类型指明字段的数据类型,如LONG(数字),TEXT(文本)等。大小——是指当数据类型为文本TEXT类型时,每条记录的字符串长度,要将它用括号括起,只当类型为文本时需要指定,其他类型时则不写。是个可选参数。注意:在SQL中,数居类型的写法与VB不完全一样,不同的有逻辑型Boolean写为BIT,日期型Date写为DATETIME,短整型Integer写为SHORT,此外,SQL还另有“备注”型写为LONGTEXT,“长二进制”型(如图片)写为LONGBINARY,“自动编号”型写为COUNTER(即自动增加字段!!ID),其他的与VB写法一致。如LONG,BYTE,CURRENCY等。<br>
        ★ 删除表:很简单:“DROP TABLE 表名” 即可。如:<br> 
        DROP TABLE 通迅录&nbsp;<br>
        就删除了“通迅录”这个表。<br>
        ------------------&nbsp;<br>
        ★ 添加索引:CONSTRAINT子句,它插入在create table创建表语句中,在需要建立索引的字段后面,为create table 表名(字段1 类型(大小) CONSTRAINT 索引名 索引类型,字段2 类型(大小),……)<br> 
        例如:CREATE TABLE 通迅录(姓名 TEXT(14) CONSTRAINT index1 UNIQUE,地址 TEXT (40),电话 long)<br> 
        上例的意思是指定“姓名”字段建立唯一索引。索引名称为index1,“索引类型”有以下三种:UNIQUE——指定该字段是唯一索引;PRIMARY KEY——指定该字段是主码(主关健字);FOREIGN KEY——指定该字段是外码(外来关健字)。<br> 
        也可以用专门的建立索引语句来建立索引:CREATE 索引类型 INDEX 语句,格式:<br> 
        CREATE 类型 INDEX 索引名 ON 表名(字段名)<br> 
        CREATE UNIQUE INDEX index1 ON 通迅录(姓名)<br> 
        ★ 添加/删除字段:ALTER TABLE语句。一次只能添加或删除一个字段,格式:<br> 
        ALTER TABLE 表名 ADD [COLUMN] 字段 类型 ["大小"] [“索引”]<br> 
        ALTER TABLE 表名 DROP [COLUMN] 字段名<br> 
        其中,ADD后是要添加的字段列表,DROP后是要删除的字段。可选参数COLUMN指定字段在表中的排列顺序位置?——好象没什么意义。如从表“通迅录”中删除“电话”字段:<br>
        ALTER TABLE 通迅录 DROP 电话<br> 
        添加字段如:ALTER TABLE [test] ADD [NewField] TEXT(5),比较简单。<br> 
        添加字段和删除字段时要一个一个地添加/删除,不能同时几个字段,如:alter table UnitRecord add Phone long和alter table UnitRecord add Other TEXT(40)不要写成alter table UnitRecord add Phone long,Other TEXT(40),删除时也一样一个一个来。<br> 
        在实际中,我们常会遇到要对表中的字段进行更改,而直接更改是不能的,只能先删除需要更改的字段,再添加更改了的字段。<br>
        ★ 删除索引:在ALTER TABLE中用CONSTRAINT子句,格式:<br> 
        ALTER TABLE 表名 DROP CONSTRAINT 索引名 类型(字段名)<br> 
        例如要删除通迅录表中建立在“姓名”字段上的索引:<br>
        ALTER TABLE 通迅录 DROP CONSTRAINT index1 UNIQUE(姓名)<br> 
        ★ 创建交叉表查询:我们查询得到的结果集中,一般还是以源数据表的某些字段来作为列标头,源数据的记录ID来作为行标头,最多只是顺序变化或筛选取舍而已,交叉表查询与此不同,在它的查询结果中,列标头和行标头信息都是查询语句从数据源记录中得到的任意数据,因而可显示特定目的的复杂查询结果。<br> 
        创建交叉表查询使用关健字TRANSFORM和PIVOT,格式如下:<br>
        TRANSFORM 每个交叉点信息 SELECT 行标头信息 PIVOT 列标头信息<br> 
        其中交叉点就是每个行标头和每个列标头的对应点,即表格内容所在。行标头和列标头各指定一个字段,其中,行标头可用一个完整的SELECT来限定返回值,而PIVOT直接指定一个字段,它将罗列该字段所有不同值产生多列。如:<br>
        TRANSFORM SUM([invoice].[Money]) AS [allmoney] SELECT [invoice].[Name] FROM [unitrecord] INNER JOIN [invoice] ON [invoice].[Name]=[unitrecord].[Name] WHERE [invoice].[money]>30 GROUP BY [invoice].[name] PIVOT [Invoice].[dateend]<br> 
        这是一个交叉表查询。实际上,交叉表查询常用于合计与算术运算,统计数据。</font>
        <p align="center">
        <br>
        &lt; <a href="030102.htm">上一页</a>--<a href="http://www.xxby.com" target="_blank">华生小屋</a>--<a href="030104.htm">下一页</a>     
        &gt;<br>
      </td>
    </tr>
  </table>
  </center>
</div>

</body>

</html>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?