SQL语言基本教程.docx
- 文档编号:7740997
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:14
- 大小:24.35KB
SQL语言基本教程.docx
《SQL语言基本教程.docx》由会员分享,可在线阅读,更多相关《SQL语言基本教程.docx(14页珍藏版)》请在冰豆网上搜索。
SQL语言基本教程
SQL语言基本教程
(一)
SQL语言基本教程
(一)
数据库查询语言(SQL)是使用于关系数据库的标准语言,被很多类型的数据库所支持。
本文将以VB加DAO为例,来介绍
基本的SQL语法以及使用。
本章将介绍的是SQL语言中的基本查询语句,并带有范例。
要更好的阅读本文,读者需要对数据库的基本结构以及术语有一个基本的了解,而且最好能有一定的VB数据库编程经验。
除非特别说明,本文将使用的数据库是VB中附带的BIBLIO.MDB数据库。
一、SELECT...FROM...WHERE语句
语句的语法如下:
SELECT[all|*|distinctcolumn1,column2]
FROMtable1[,table2]
WHERE[condition1|expression1][ANDcondition2|rxpression2]
在上面的语法中,[]外的语句是必须的,而[]内的是可选的,对于以|分割的操作符,则表明语法中必须从|分割的
操作符中选择一个。
下面的语法描述同上。
在SELECT...FROM...WHERE语句中其中SELECT指定需要检索的字段,FROM指定要查询的表,WHERE指定选择纪录的条件,
另外还可以包含ORDERBY语句来制定排序纪录。
语法如下:
ORDERBYcolumn1|Integer[ASC|DESC]
其中column1制定排序的字段,也可以使用Integer指定的字段索引来排序,ASC为升序、DESC为降序。
范例一:
找到Titles表中所有出版日期在1990年以后以及包含文字Beginner的书名
建立一个新工程,加入DAO定义库(点击菜单中的Project|References项,在列表中选择MicrosoftDAO3.51ObjectLibrary
(也可以是更高版本的3.60,如果安装了的话),然后在Form中加入一个ListBox控件。
在Form1的代码窗口中加入以下代码:
PrivateSubForm_Load()
DimrsTempAsRecordset
DimdbTempAsDatabase
DimastrAsString
SetdbTemp=DBEngine(0).OpenDatabase("e:
\programfiles\microsoftvisualstudio\vb98\biblio.mdb",_
dbOpenSnapshot)
astr="SELECT[Title]FROM[Titles]WHERE[YearPublished]>1990"&_
"ANDTitleLIKE'*Beginner*'ORDERBYTitleDESC"
SetrsTemp=dbTemp.OpenRecordset(astr)
IfrsTemp.RecordCount>0Then
rsTemp.MoveFirst
DoUntilrsTemp.EOF
List1.AddItemrsTemp!
[Title]
rsTemp.MoveNext
Loop
EndIf
EndSub
运行程序,List1中就会列出所有出版日期在1990年以后以及包含文字Beginner的书的书名并将书名按照降序进行排列。
在上面的SELECT语句的WHERE中,我们使用了操作符号>来比较大小以及使用LIKE进行匹配。
在WHERE语句中,可以使
用的操作符有以下几类:
1、比较操作符
包含=、<>、>、<、>=、<=等若干类
2、逻辑操作符
包含以下若干类:
LIKE、IN、BETWEEN、UNIQUE、ISNULL、EXISTS、ALL和ANY
LIKE操作符通过使用通配符将一个值同其它值比较,在VB的SQL查询中,可以使用的通配符是*和?
其中*代表任
意的若干个字符,而?
代表一个字符,例如上面语句中的LIKE'*Beginner*代表查找所有包含字符串Beginner的值。
不
过要注意的是使用*和?
作为通配符是VB的专利。
真正的SQL语言的通配符是%和_,其中%代表任意多个字符,_
代表一个字符例如VB中的DataEnvironment使用的就是%和_作为查询通配符。
另外MicrosoftJetEngine对于LIKE
操作符还提供了其它一些的过滤选项,具体的内容可参见MSDN索引中的LikeOperator条目。
IN操作符用于比较某一个值是否等于几个值中的一个值,例如下面的语句:
"SELECT[Title],[YearPublished]FROM[Titles]WHERE[YearPublished]IN(1990,1991,1995)"
将从表Titles中选择所有在1990、1991、1995年出版的书籍纪录。
BETWEEN操作符勇于在两个值之间搜索,例如WHERE[YearPublished]BETWEEN1989AND1991指定出版日期必须
在1989年和1991年之间。
对于逻辑操作符,可以结合NOT操作符实现改变查询条件的方向。
例如WHERE[YearPublished]NOTIN(1990,1991,1995)
3、连接符
WHERE中的连接符包括AND和OR,使用AND时,所有查询都必须是True时,条件才成立,而使用OR时,只要连接的
一个查询为True,条件就成立。
象上面的范例中,只有书名中包含"Beginner"同时又是在1990年以后出版的纪录才会被
查询到。
在使用比较操作符时要注意,在VB操作数据库引擎时对于查找的字符串,要使用单引号或者双引号将字符串括起来,例
如WHERE[Name]='LiGang'。
而对于日期类型的数据,要使用#号将日期括起来,例如WHERE[BirthDay]>#19980-10-01#
而在使用通配符和LIKE操作符时,需要使用引号而不是#号,例如WHERE[BirthDay]LIKE"1990-01-*"。
引号告诉数据库引
擎将日期当字符串处理,而#号告诉数据库引擎将日期当数字处理。
对于WHERE语句所要使用的逻辑操作符,在下面的文章中还
要提到。
范例二:
如何在数据表中加入统计等功能
SQL当中提供了一定数量的统计以及计算功能,其中统计函数主要有如下一些:
COUNT 计算字段中的纪录数
SUM 计算字段中的所有值的和
MAX 获得字段中所有值中的最大值
MIN 获得字段中所有值中的最小值
AVG 计算字段中所有值的平均值
计算符有+、-、*、/4种。
这些计算、统计函数的使用方法如下:
functionnamefieldnameASoutfieldname
其中functionname定义函数名、fieldname定义要操作的字段、outfieldname定义保存输出结果字段名称,下面是范例
程序,首先建立一个数据库,将数据库保存为c:
\db4.mdb。
然后在数据库中加入一个名称为db1的表,表的结构如下:
字段名称 产品编号 成本 出厂价 销售数量
A00020 ¥89.95 ¥95.00 900
A00056 ¥54.00 ¥89.00 2400
A00021 ¥2,300.00 ¥2,896.00 600
A10916 ¥120.00 ¥209.00 1200
A00987 ¥907.00 ¥1,090.00 1000
其中产品编号为文本类型、成本和出厂价字段为货币类型、销售数量为长整形数据。
保存表,在VB工程中加入DAO定义
库,在Form1中加入一个ListBox控件,在Form1代码窗口中加入以下代码:
PrivateSubForm_Load()
DimrsTempAsRecordset
DimdbTempAsDatabase
DimastrAsString
SetdbTemp=DBEngine(0).OpenDatabase("c:
\db4.mdb",dbOpenSnapshot)
astr="SELECTdb1.产品编号,((db1.出厂价-db1.成本)/db1.成本)ASdRate,"&_
"(db1.出厂价*db1.销售数量)ASeTotalFROMdb1ORDERBYdb1.产品编号"
SetrsTemp=dbTemp.OpenRecordset(astr)
IfrsTemp.RecordCount>0Then
rsTemp.MoveFirst
DoUntilrsTemp.EOF
List1.AddItemrsTemp!
[产品编号]&" "&rsTemp!
[dRate]&_
" "&rsTemp!
[eTotal]
rsTemp.MoveNext
Loop
EndIf
EndSub
在上面的程序段中,通过计算字符操作表中以有字段,然后再将结果输出到输出字段中保存。
二、JOIN...ON...语句
JOIN...ON...语句是SQL查询中用于连接多个表的语句,该语句的语法为:
FROMtable1[INNER|OUTER|LEFT|RIGHT]JOINtable2ONtable1.field1compoprtable2.field2
其中tabel1指定要查询的表,tabel2指定连接到tabel1的表,field1,field2指定连接字段名称,
compopr指定关系比较符,它可以是大于、小于、等于、不等于等。
范例三:
列出所有书籍以及它的作者
在BIBLIO中,书籍的名称位于Titles表的Title字段中,而书籍的作者位于Authors表的Autoor字段中,而这两个表之间没
有相关联的字段,我们这时需要联合数据库中的TitleAuthor表,利用该表的Au_ID字段同Authors表中的Au_ID字段的关联以及
ISBN字段同Titles表中的ISBN字段的关联,范例如下:
PrivateSubForm_Load()
DimrsTempAsRecordset
DimdbTempAsDatabase
DimastrAsString
SetdbTemp=DBEngine(0).OpenDatabase("e:
\programfiles\microsoftvisualstudio\vb98\biblio.mdb",dbOpenSnapshot)
astr="SELECTAuthors.Author,Titles.TitleFROM"&_
"([TitleAuthor]INNERJOINTitlesON[TitleAuthor].ISBN=Titles.ISBN)"&_
"INNERJOINAuthorsON[TitleAuthor].Au_ID=Authors.Au_ID"&_
"WHERETitles.TitleLIKE'*Beginner*'"
SetrsTemp=dbTemp.OpenRecordset(astr)
IfrsTemp.RecordCount>0Then
rsTemp.MoveFirst
DoUntilrsTemp.EOF
List1.AddItemrsTemp!
[Title]&" "&rsTemp!
[Author]
rsTemp.MoveNext
Loop
EndIf
EndSub
在上面的范例中,我们使用两个INNERJION联合将Authors表中的Au_ID字段和Titles表中的ISBN字段连接到TitleAuthor
表中,然后在TitleAuthor表中查找Title字段中包含字符串“Beginner”的纪录并将Title字段和Author字段输出。
SQL查询语言基本教程
(2)
三、GROUPBY...语句
GROUPBY...语句实现纪录分组功能,它通常需要和上面我们提到过的统计函数SUM、COUNT等联合使用,它的语法为:
SELECTcolumn1[,column2]
FROMtable1[,table2]
WHEREconditions
GROUPBYcolumn1[,column2]
ORDERBYcolumn1[,column2]
范例四:
计算学生成绩及总成绩
我们依然使用上一章使用的数据库c:
\db4.mdb,在其中加入一个名字为db2的表,表的结构以及数据如下:
字段名 学生 科目 成绩
张严 语文 86.5
李永 语文 93
王为 语文 91
张严 数学 96.5
李永 数学 90
王为 数学 87
张严 英语 80.5
李永 英语 94
王为 英语 98
建立新工程,加入DAO定义库。
在Form1中加入一个ListBox控件,然后在Form_load中加入以下代码:
PrivateSubForm_Load()
DimrsTempAsRecordset
DimdbTempAsDatabase
DimastrAsString
SetdbTemp=DBEngine(0).OpenDatabase("c:
\db4.mdb",dbOpenSnapshot)
astr="SELECTSUM(db2.成绩)ASrTotal,FORMAT((AVG(db2.成绩)),'###.#')ASrAVG,"&_
"(db2.学生)ASStudentFROMdb2GROUPBYdb2.学生"
SetrsTemp=dbTemp.OpenRecordset(astr)
IfrsTemp.RecordCount>0Then
rsTemp.MoveFirst
DoUntilrsTemp.EOF
List1.AddItemrsTemp!
[Student]&Chr(5)&rsTemp!
[rTotal]&_
" "&rsTemp!
[rAVG]
rsTemp.MoveNext
Loop
EndIf
EndSub
在上面的代码中,我们利用GROUPBY将纪录根据学生姓名分组,再建立了两个统计字段rTotal和rAvg并分别利用
统计函数SUM和AVG分别统计各个分组的总成绩以及平均成绩。
要注意的是,在SELECT语句中出现的字段,如果没有包含
在统计函数内的话,都要包含在GROUPBY子句中。
另外在上面的SQL查询中我们还使用了FORMAT子句,这是SQL中的转换和格式化语句中的一个,该语句的语法同VB中
的Format语句是一样的,相似的语句还有FIX语句。
需要注意的一点是,虽然在MicrosoftJETEngine中的SQL语法和
ANSI决大部分是一样的,但是有一些还是保留了“微软特色”,特别是象这一类的转换和格式化语句,例如FORMAT就是
ANSI中没有的。
而象其它数据库,诸如oracle也有各自的SQL语法扩展。
在使用不同数据库进行SQL查询时要注意这一点。
在GROUPBY语句中还可以连接使用HAVING子句。
该语句同GROUPBY的关系就如同WHERE子句同SELECT的关系类似,
WHERE子语句为SELECT所选择的列设置条件,而HAVING子语句是给由GROUPBY创建的组设置条件。
例如如果将上面的范例
中的astr改变为如下的字符串:
astr="SELECTSUM(db2.成绩)ASrTotal,FORMAT((AVG(db2.成绩)),'###.#')"&_
"ASrAVG,(db2.学生)ASStudentFROMdb2GROUPBYdb2.学生"&_
"HAVING(AVG(db2.成绩))>=90"
则在List中就将只会列出平均成绩大于90分的学生的成绩和名字。
范例五:
获得分数高于总平均分数的学生及科目
我们仍然使用上面建立的db2表。
建立新工程,加入DAO定义库。
在Form1中加入一个ListBox控件和一个Label控件
然后在Form_load中加入以下代码:
PrivateSubForm_Load()
DimrsTempAsRecordset
DimdbTempAsDatabase
DimastrAsString
SetdbTemp=DBEngine(0).OpenDatabase("c:
\db4.mdb",dbOpenSnapshot)
astr="SELECTFORMAT(AVG(db2.成绩),'###.#')AStAVGFROMdb2"
SetrsTemp=dbTemp.OpenRecordset(astr)
Label1.Caption="总平均成绩:
"&rsTemp!
[tAVG]
rsTemp.Close
SetrsTemp=Nothing
astr="SELECTdb2.成绩,db2.学生,db2.科目FROMdb2WHEREdb2.成绩>"&_
"(SELECTAVG(db2.成绩)FROMdb2)GROUPBYdb2.学生,db2.成绩,db2.科目"&_
"ORDERBYdb2.学生"
SetrsTemp=dbTemp.OpenRecordset(astr)
IfrsTemp.RecordCount>0Then
rsTemp.MoveFirst
DoUntilrsTemp.EOF
List1.AddItemrsTemp!
[学生]&" "&rsTemp!
[科目]&" "&rsTemp!
[成绩]
rsTemp.MoveNext
Loop
EndIf
EndSub
运行程序,在Lable1中列出总平均分数。
在List1中列出了学生姓名、获得高于平均分数的科目以及科目成绩。
在上面的查询中,我们使用了一个嵌套查询,首先在子查询中获得所有科目总的平均分数,然后在查询中查询成绩字段
值大于平均分数的纪录。
四、TRANSFORM...PIVOT...语句
这是MicrosoftJETEngine3.5以上版本所特有的SQL查询语句,该语句的特点是可以建立一个交叉表格式的查询,
一个交叉表同电子表相类似。
该语句可以将表中的某些数据作为行,某些数据作为列建立交叉表。
该语句的语法如下:
TRANSFORMcondition[selectopreation]PIVOTcolumn
其中condition是在交叉表中要显示的数据,selectopreation是一个SELECT...FROM...查询,该查询形成交叉表的
航信息,PIVOTrecordset中column为表中的一个字段,PIVOT子句使用该字段形成交叉表的列。
范例六:
建立学生成绩表
我们还是使用上面已经建立的db4.mdb中的db2表。
首先建立一个新的工程,然后在Form1中加入一个DataGrid控件,然后
向工程中加入一个DataEnvironment,在Connection1上点击鼠标右键,在菜单中选择properties...,在属性窗口的提供者
页面中选择MicrosoftJET4.0OLEDBProvider,在连接页面的数据库名称输入框中输入c:
\db4.mdb,然后点击测试
连接按钮,如果正常,点击确定退出。
再在Connection1上点击鼠标右键,在菜单中选择Addcommand建立一个名为Command1
的命令,点击Command1右键菜单,选择Properties...项,然后在Command1属性窗口的General页面中选择SQLStatement,
在SQL查询语句输入框中输入下面的查询:
TransformSUM(db2.成绩)ASiResSELECTdb2.学生FROMdb2GROUPBYdb2.学生Pivotdb2.科目
注意文本框回自动换行,不要输入回车。
然后点击确定按钮。
回到Form1,将DataGrid1的DataSource设置为DataEnvironment1,将DataMember设置为Command1,然后运行程序,可以看
到在DataGrid1中以表的形式列出了学生成绩,以学生为行,以成绩为列。
运行后得到的表格效果如下:
学生 数学 英语 语文
李永 90 94 93
王为 87 98 91
张严 96.5 80.5 86.5
再回到DataEnvironment界面,双击Command1就可以看到查询建立的数据列,在上面的查询共建立了4个数据列,其中三个
分别是科目分类,列中的数据为科目成绩,第一列为学生的名字,列中的数据为学生的名字。
上面的查询中还使用了SUM子语句,这时因为对于GROUPBY来说,没有包含在统计函数内的列都要包含在GROUPBY中,如果
将字段db2.成绩包含在GROUPBY子语句中,就会使最终结果出现9行而不是3行。
由
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SQL 语言 基本 教程