配色: 字号:
第10讲-vf SQL2
2013-01-28 | 阅:  转:  |  分享 
  
第10讲结构化查询语言SQL(2)10.1连接查询如果查询涉及两个或两个以上的表,则需要将相关的表按某个字段连接起来,这种查询
称为连接查询。连接查询包括等值连接、自然连接、自连接、外连接和复合连接等多种形式的查询。10.1.1等值连接查询连
接查询中用来连接两个表的条件称为连接条件。等值连接的格式为:[<表名1>.]<字段名1>=[<表名2>.]<字段名2>
其中,引用不同表中的字段需在字段名前加表名和“.”。【例10.1】从学生表(xsb)和成绩表(cjb)两个表中,检索所有
成绩(cj)多于85分的学号、姓名、课程号、学期和成绩。解:SELECTxsb.xh,xm,kch,xq,cj
FROMxsb,cjb;WHERE(cj>85)AND(xsb.xh=cjb.xh)注意:本例中,
既有查询条件(cj>85),又有连接条件(xsb.xh=cjb.xh)。【例10.2】从学生表(xsb)和成绩表(cjb)两个表
中,检索所有同学各们课程考试成绩(cj)的最高分、最低分、总分和平均分,并分专业按照平均分从高到低排序。解:SELECTxsb
.xh,zy,max(cj),min(cj),sum(cj),AVG(CJ)FROMXSB,CJB;WHERE
XSB.XH=CJB.XHGROUPBYXSB.XHORDERBYZY,6DESC10.1.2自连接查询
表的自连接是一个表与其自身进行的连接。进行这种连接运算时,需要在FROM短语中为表定义别名,其方法是:<表名>
<别名>可以进行自连接查询的表必须有两个值域完全相同的字段,且它们之间存在逻辑联系。如KCB(课程表)就符合自连接
查询条件。因为它的XXK(先修课)是某门课程的课程号(KCH),就形成了自连接关系,如图10-2所示。【例10.3】在课程
表中列出有先修课的课程及其先修课名单。解:这是一个典型的自连接查询。本身的两个字段相互关联(1:N),因此在查询中把一个表当作两
个表使用,临时给两个别名:F,S。SELECTF.kcm,’的先修课是’,S.kcmFROMkcbF
,kcbS;WHEREF.xxk=S.kch?查询结果如图10-3所示。10.1.3超级连接查询
超级连接查询包括内部连接、左连接、右连接和全连接等几种情况的查询。在ViualFoxPro中,与连接运算有关的命令格式如下:
FROM<表名1>[INNER|LEFT|RIGHT|FULL]JOIN<表名2>ON<连接条件>…可以看出,超
级连接查询是通过FROM短语给出连接类型,用ON短语给出连接条件进行的。1.内部连接(INNERJOIN)在内部连接查
询中,只有满足连接条件的记录才会出现在查询结果中。【例10.4】从XSB和CJB表中查询所有有考试成绩的同学的学号(xh)、
姓名(xm)、专业(zy)、课程号(kch)、学期(xq)和成绩(cj)。解:SELECTXSB.XH,XM,ZY,KCH,
XQ,CJFROMXSBINNERJOINCJB;ONXSB.XH=CJB.XH查询结果如图10-4。其中
INNER可以省略。2.左连接(LEFTJOIN)在左连接查询中,除满足连接条件的记录出现在查询结果中外,LEFT
JOIN左侧表中不满足连接条件的记录也会出现在查询结果中,对应的字段值为.NULL.。【例10.5】从XSB和CJB表中查询
所有的同学的学号(xh)、姓名(xm)、专业(zy)、课程号(kch)、学期(xq)和成绩(cj),包括还没有考试成绩的同学。解
:SELECTXSB.XH,XM,ZY,KCH,XQ,CJFROMXSB;LEFTJOINCJBONX
SB.XH=CJB.XH查询结果如图10-5。在查询窗口可以看到,目前还没有课程考试成绩的同学,对应的KCH、XQ、CJ值都
是NULL。3.右连接(RIGHTJOIN)在右连接查询中,除满足连接条件的记录出现在查询结果中外,RIGHTJ
OIN右侧表中不满足连接条件的记录也会出现在查询结果中,对应的字段值为.NULL.。【例10.6】从CJB和KCB表中查询
所有的同学的学号(xh)、课程号(kch)、课程名(KCM)、学分(XF)、学期(xq)和成绩(cj),包括还没有考试成绩的课程。
解:SELECTXH,KCB.KCH,KCM,XF,XQ,CJFROMCJB;RIGHTJOINKCB
ONKCB.KCH=CJB.KCH查询结果如图10-6。在查询窗口可以看到,目前还没有考试成绩的课程,对应的XH、XQ、
CJ值都是NULL。4.全连接(FULLJOIN)在全连接查询中,除满足连接条件的记录出现在查询结果中外,两个表中不满
足条件的记录也会出现在查询结果中。10.1.4复合条件连接利用WHERE子句可以将多个条件连接起来,这种连接亦称为复合
条件连接。【例10.7】从XSB、CJB和KCB表中查询所有的同学的学号(xh)、姓名(XM)、专业(ZY)、课程名(KCM
)、学分(XF)、学期(xq)和成绩(cj),并按学号排序。解:SELECTXSB.XH,XM,ZY,KCM,XF,XQ,C
JFROMXSB,CJB,JOINKCB;WHERECJB.KCH=KCB.KCH.AND.XSB.XH=CJ
B.XH;ORDERBYXSB.XH查询结果如图10-7。10.2嵌套查询所谓嵌套查询,
是指在WHERE子句条件中涉及字段与另一个SELECT查询结果的比较,也就是说,嵌套查询是指在一个SELECT语句中包含另一个SE
LECT语句的查询。SQL支持嵌套查询,这正是SQL结构化的具体体现。处于内层的查询称为子查询,处于外层的查询
称为父查询。在子查询的SELECT语句不能使用ORDERBY子句,即ORDERBY子句只能对最终查询结果排序。10.2.1
带有谓词IN的子查询由于子查询的结果是记录的集合,故常使用谓词IN来实现。【例10.8】检索出哪些至少有
一门课程不及格学生的学号、姓名和专业。解:学生的信息在XSB.DBF表中,而成绩在CJB.DBF表中,所以先在CJB.DBF表
中检索出有不及格的学号,再据此到学生表检索相关学生的信息。SELECTXh,Xm,ZYFROMxsbWHE
RExhIN;(SELECTxhFROMcjbWHEREcj<60)【例10.9】检索尚无考试成绩的同学
信息。解:SELECTFROMxsbWHERExhNOTIN;(SELECTDISTxh
FROMcjb)?10.2.2带有比较运算符的子查询带有比较运算符的子查询,是指在父查询WHERE子句中,使用比
较运算符进行比较的查询。当用户能确切知道子查询返回的是单值时,可以使用>,<,>=,<=,!=或<>等比较运算符进行查询。【
例10.10】查询汪远东同学的考试成绩信息。解:SELECTFROMCJBWHEREXH=;(SELEC
TXHFROMXSBWHEREXM=’汪远东’)因一位学生只能有一个学号,即内查询结果是单值,因此可以用“=
”代替IN。10.2.3带有ANY、SOME或ALL谓词的子查询使用谓词ANY、SOME、ALL的WHERE子句中
的条件书写格式为:<表达式><关系比较运算符>[ANY|ALL|SOME](子查询)其中,ANY和SOME是作用相同
的谓词。ANY代表某个值,ALL代表所有值。从上述格式可以看出,使用谓词ANY或ALL时必须同时使用比较运算符。例如,>
ANY的语义为:大于子查询结果中的某个值。>ALL的语义为:大于子查询结果中的所有值。【例10.11】查询其他专业中
比“信息管理”专业任一同学年龄都小的学生学号、姓名、专业和出生日期。解:SELECTxh,xm,zy,csrqfromx
sbWHERECSRQ>all;(SELECTCSRQFROMXSBWHEREZY=''信息管理'')
执行结果如图10-10。【例10.12】查询“信息管理”专业年龄最小的学生的专业和出生日期。解:SELECTzy,max(
csrq)fromxsbWHEREZY=''信息管理''执行结果如图10-11。对比两个查询结果,可以证实例题1
0.11的结果是正确的。【例10.13】从学生表和成绩表中,检索出已经考过“1002”和“1003”两门课程的学生的学号和姓
名。解:SELECTxh,xmFROMxsbWHERExhIN;(SELECTxhFR
OMcjbWHEREkch="1002");ANDxhIN(SELExhFROMcjbWHERE
kch="1003")上例说明,一个父查询可以有两个并列的子查询。10.2.4带有EXISTS谓词的子查询
EXISTS也称为存在量词,WHERE子句中使用量词EXISTS表示当子查询的结果非空时,条件为真;反之,则为假。EXISTS
前也可以加NOT,表示检测条件为“不存在”。【例10.14】检索至少有一门考试成绩的同学的信息。解:Select
fromxsbwhereexists;(selectfromcjbwherexh=xsb
.xh)由EXISTS引出的子查询,其目标列表达式通常都用表示,原因是带EXISTS的子查询仅测试子查询的返回
值是否为空,也就是说,给出列名将毫无意义。10.2.5内外层互相关嵌套查询即内层查询的条件需要外层查询提供值,而外
层查询的条件需要内层查询的结果。此时需要给内外层的表指定别名。?【例10.15】在成绩表中查询每个同学取得最好成绩的课程及成绩
。解:selectout.xh,out.kch,out.xq,out.cjfromcjbout;
wherecj=(selectmax(cj)fromcjbinwhereout.xh=in.xh)可以看出,
内层查询的结果(MAX(cj)),是外层查询的条件;而外层查询的结果(OUT.XH),是内层查询的条件。执行结果如图10-12。
10.3集合查询SQL支持集合的并(UNION)运算。需要注意的是,参加并运算操作的两个查询语句,其结果应具有相同的字段
个数且对应字段的数据类型也相同。【例10.16】查询计算机科学专业的男同学和市场营销专业女同学的名单,显示学号、姓名、专业、性
别和出生日期。解:SELECTxh,xm,zy,xb,csrqformxsbwhere;zy=’计算机科学’.
and.xb=’男’;Union;SELECTxh,xm,zy,xb,csrqformxsbwhere
zy=’市场营销’.and.xb=’女’执行结果如图10-13。10.4查询结果的去向10.4.1屏幕显示选择
若不另作说明,SELECT语句查询的结果默认在“查询窗口“中输出。如果用户需要输出满足条件的前几个记录,可以使用以下短语:
TOP<数值表达式>[PERCENT]其中,<数值表达式>表示要显示前几个记录的数目。若使用PERCENT,则<数值
表达式>应取0.01至99.99间的实数,表示要显示所有查询结果中的前百分之几的记录。注意,TOP短语要与ORDERBY短
语同时使用才有效。【例10.17】查询高考分数前10名的信息。解:SELECTTOP10FROMXSBO
RDERBYGKFSDESC10.4.2将查询结果存入数组中若在SELECT语句中使用了INTOARRAY<数
组名>短语,则可以将查询结果存放到指定数组中。一般地,用二维数组来存放查询的结果,每行表示一条记录,每列对应于查询结果的列。【
例10.18】查询班级为‘030561’的学生信息并将结果存入sz1数组中。解:SELECTFROMXSBINTO
ARRAYSZ1;WHERELEFT(xh,6)=’030561’DISPMEMORYLIKES
Z&&查看结果10.4.3将查询结果存入临时文件中若在SELECT语句中使用INTOCURSOR<
临时表>短语,则可以将查询结果存放到临时文件中。该文件是一个只读的.DBF文件,查询结束后,该临时文件是当前文件。当关闭文件
时,系统将自动删除该临时文件。在设计查询表单,用表格作为SELECT语句查询结果的输出窗口时,需要存放到临时表中。【例10.1
9】将查询到的课程信息存放到临时文件temp1中。解:SELECTFROMKCBINTOCURSORt
emp1BROW&&查看结果10.4.4将查询结果存入表中若在SELECT语句中使用INTODBF
ITABLE<表名>短语,则可以将查询的结果存放到表中,该表是自由表。【例10.20】将学生表中女生的记录存人表Wom
en中。解:SELECTFROMXSBINTODBFWomenWHERE性别=’女’BROW
&&查看结果10.4.5将查询结果存入文本文件中可以在SELECT语句中使用TOFILE<文件名>[AD
DITIVE]短语,将查询的结果存放到指定的文本文件中。该文件的默认扩展名为.TXT,ADDITIVE短语的作用是将结果追加到
原文件尾,未选用时则用查询结果覆盖原有文件的内容。【例10.21】将学生表中女生记录存人文件Women.txt中。解:S
ELECTFROMXSBTOFILEWomenWHEREXB=’女’此时,在主屏幕上显示查询结果。清屏后可以
用下面命令查看文本文件。TYPEwomen.txt&&查看结果10.4.6将查询结果输出到打印机中若打算将查询结果输出到打印机中,可以在SELECT语句中使用TOPRINTER[PROMPT]短语,若使用PROMPT选项,则在开始打印前会打开打印机设置对话框。【例10.22】查询专业为“市场营销”的学生信息,并打印输出。解:SELECTFROMXSBWHEREZY=’市场营销’TOPRINTER课后复习、作业及上机安排(1)阅读教材第10讲。(2)完成本讲的习题。(3)预习准备上机实验8:要求把实验内容中的空白部分事先填写相应的操作命令。上一页下一页返回 10.1连接查询 10.3集合查询 10.2嵌套查询 10.4查询结果的去向kcmxfxxkkch图10-2KCB的自连接图10-3上一页下一页
献花(0)
+1
(本文系liyi039首藏)