6注:本课件授课内容中标注的页码与《教程》一致,习题中标注页码与《真题》一致。
结构化查询语言(第4章结构化查询语言(SQL))
SQL概述P84
同学们:SQL的内容在笔试和上机考试中均占到大约30%的比例,的比例,的比例此外它还是查询和视图的基础,因此是学习的重点也是难点。它还是查询和视图的基础,因此是学习的重点也是难点。在讲解本部分内容时,以《VFP程序设计教程》第5章为主,要求大家课后一定要结合例题解析进行复习。虽然SQL对大家来说有一定的难度,但是熟能生巧,大家把书中所涉及的题目和课件中的例题都理解并且操作了,相信SQL这个难关一定能攻克。SQL是结构化查询语言StructureQueryLanguage的缩写。SQL包含了查询功能、数据定义、数据操纵和数据控制功能,在VFP中没有提供数据控制功能。SQL主要特点:P841.2.3.4.SQL是一种一体化语言。SQL是一种高度非过程化的语言。SQL语言非常简洁。SQL语言可直接以命令方式交互使用,也可嵌入到程序设计语
言中以程序方式使用。
第四节查询功能P92
SELECT命令的特点:P921.可以自动打开数据库、表文件加以查询,而不需要事先用OPENDATABASE或USE命令打开。2.可以直接选取数据表中的数据,而不需要事先用SETRELATION命令建立关联。3.当需要的索引文件不存在时,会自动建立暂存索引文件,以支持快速搜索技术(Rushmore)来查询。4.其查询结果可输出到文件、表、屏幕或报表上,还可以转换成统计图表。
命令格式:命令格式:SELECT——FROM——WHERE
可与LISTFIELDS——FOR——对照学习。关系操作:投影,选择,联接关系操作:投影,选择,联接。
P92
说明:功能强大,语法灵活;要处理的数据表无须事先打开,通过FROM子句指明并打开。1.SELECT短语:说明要查询的数据;对应的关系操作为投影,类似于FIELDS子句。2.FROM短语:说明要查询的数据来自哪个或哪些表,可对单个表或多个表进行查询;3.WHERE短语:说明查询条件;对应的关系操作为选择,类似
于FOR子句。如是多表查询还可能过该子句指明联接条件,进行联接。4.GROUPBY短语:用于对查询结果进行分组,可利用它进行分组汇总;类似于TOTAL命令。5.HAVING短语:跟随GROUPBY使用,它用来限定分组必须满足的条件;6.ORDERBY短语:用于对查询的结果进行排序;类似于SORT命令。
示例数据库:示例数据库:
学生管理,包括三个表:学生,课程,选课(通过该表反映“学生”与“课程”之间“多对多”的联系。问题:请同学们分别指出三个表的主关键字。
一、简单查询P93
简单查询基于单个表。例:1.查询学生信息SELE*FROM学生&;&;“*”号代表所有列。类似于:USE学生LIST
2.查询男生学生的、及生日SELE,,生日FROM学生WHERE性别=”男”类似于USE学生LIST,,生日FOR性别=”男”3.查询学分大于5的课程的信息SELE*FROM课程WHERE学分>5类似于USE学生LISTFOR学分>5习题:P140/29,30P141/33P143/42
二、简单联接查询P95
联接是关系的基本操作之一,联接查询基于多个关系的查询。例:查询男生学生的选课信息,包括,及成绩。分析:本例的查询结果包括两个表“学生”与“选课”的属性,适用于联接查询。SELE,选课.,成绩;FROM学生,选课;WHERE学生.=选课.AND性别=”男”说明:如果命令太长一行写不下可在行末加分号“:”表续行选课.:因为两个表中均有“”字段,所以必须指明所
属表。学生.=选课.:连接条件。还可使用如下SQL语句:SELE,选课.,成绩;FROM学生JOIN选课ON学生.=选课.;WHERE性别=”男”说明:JOIN……ON:建立表与表之间的联接。习题:P141/32P146/48
三、嵌套查询P98
嵌套查询是另一类基于多个关系的查询,此类查询所要求的结果出自一个关系,但相关的条件却涉及多个关系。例:查询女生学生选课信息,包括,课程号,成绩。SELE*;FROM选课;WHEREIN(SELEFROM学生WHERE性别=”女”)说明:IN:相当于集合运算符∈。还可使用如下SQL语句:简单联接查询SELE选课.,课程号,成绩;
FROM选课JOIN学生ON选课.=学生.;WHERE性别=”女”习题:P136/16P139/24P146/49P151/10
四、特殊运算符
1.BETWEEN…AND…意为“…和…之间”
例:查询成绩在80分到90分之间的选课信息。SELE*FROM选课WHERE成绩BETWEEN80AND90等价于:SELE*FROM选课WHERE成绩>=80AND成绩<=90例:查询成绩不在80分到90分之间的选课信息。SELE*FROM选课WHERE成绩NOTBETWEEN80AND902.LIKE是字符串匹配运算符,通配符“%”表示0个或多个字符,“_”表示一个字符。注意:不是“*”和“?”,不正确!例:从学生关系中查询姓“黄”的学生信息。SELE*FROM学生WHERELIKE“黄%”不能写成:SELE*FROM学生WHERE="黄%"例:从学生关系中查询不姓“黄”的学生信息。SELE*FROM学生WHERENOTLIKE“黄%”例:
SELE*FROM学生WHERELIKE"黄_"SELE*FROM学生WHERELIKE"黄__"习题:P134/13P133/9P140/30
五、排序P99
SQLSELECT可将查询结果排序。排序的短语格式如下:ORDERBYOrder_Item[ASC|DESC][,Order_Item[ASC|DESC]…]说明:可按升序或降序排序,允许按一列或多列排序。例:按学分进行升序查询课程信息。SELE*FROM课程ORDERBY学分ASC例:先按学分进行升序排序,学分相同的再按课程名进行降序排序并输出全部课程信息。SELE*FROM课程ORDERBY学分,课程名DESC注:ORDERBY对最终的查询结果进行排序,不能在子查询中使用此短语。
六、简单计算查询P99
SQL不但具有一般的检索能力,而且还有计算方式的检索。用于计算检索的函数有:1.2.COUNT(*):计数SUM():求和自变量通常为数值型
3.4.5.
AVG():算平均值MAX():求最大值MIN():求最小值
上面的函数可用在SELECT短语中对查询结果进行计算。例:查询为“03”的学生选修课程的考试成绩总分和平均分。SELESUM(成绩),AVG(成绩)FROM选课WHERE=”03”SELESUM(成绩)总分,AVG(成绩)平均分FROM选课WHERE=”03”SELE,SUM(成绩)AS总分,AVG(成绩)AS平均分;FROM学生JOIN选课ON学生.=选课.;WHERE学生.=”03”习题:P155/20,21
七、分组与计算查询
利用GROUPBY子句进行分组计算查询使用得更加广泛。GROUPBY短语格式如下:GROUPBYGroupColumn[,GroupColunm…][HAVINGFilterCondition]说明:1.可按一列或多列分组,还可以用HAVING进一步限定分组的条件。2.GROUPBY子句一般跟在WHERE子句之后,没有WHERE子句时,跟在FROM子句之后;HAVING子句必须跟在GROUPBY
之后,不能单独使用。在查询中是先用WHERE子句限定元组,然后进行分组,最后再用HAVING子句限定分组。例:求每个学生选课的考试成绩平均分。SELE,AVG(成绩)FROM选课GROUPBY说明:在此查询中,选按属性进行分组,然后再计算每个的平均成绩。例:在选课表中求每个选课门数为4门的学生的总分和平均分。SELE,SUM(成绩)AS总分,AVG(成绩)AS平均分;FROM选课;GROUPBYHAVINGCOUNT(*)=4SELE,SUM(成绩)AS总分,AVG(成绩)AS平均分;FROM学生JOIN选课ON学生.=选课.;WHERE性别=”女”;GROUPBY选课.HAVINGCOUNT(*)=4例:求平均成绩在80分以上的各课程的课程号与平均成绩。SELE课程号,AVG(成绩)FROM选课;GROUPBY课程号HAVINGAVG(成绩)>80习题:P132/7P133/8,10P134/11,12P136/18P137/19P142/35P139/25,26P144/45P145/47
八、使用空值进行查询
空值的概念:
空值就是缺值或还没有确定值,不能把它理解为任何确定的数据。比如表示价格的一个字段值,空值表示没有定价,而数值0可能表示免费。空值与空(或空白)字符串、数值0等具有不同的含义。例:假设在选课中有些学生某门课程还没有考试,则成绩为空。试找出尚未考试的选课信息。SELE*FROM选课WHERE成绩ISNULL注:不能写成“=NULL”例:试找出成绩不为空的选课信息。SELE*FROM选课WHERE成绩ISNOTNULL
九、别名与自联接查询
在联接操作中,要使用关系名作前缀,为简单起见,SQL允许在FROM短语中为关系名定义别名。格式为:<关系名><别名>例:查询选课信息中的,课程名,成绩。SELE,课程名,成绩;FROM学生S,课程C,选课SC;WHERES.=SC.ANDC.课程号=SC.课程号说明:在上面的例子中,别名并不是必须的,但是在关系的自联接关系的自联接操关系的自联接作中,别名则是必不可少的。SQL不仅可以对多个关系实行联接操作,也可将同一关系与其自身进行联接将同一关系与其自身进行联接,这种联接就称为自联接。在这种将同一关系与其自身进行联接自联接操作关系上,本质上存在着一种特殊的递归联系,也就是关系关系中的一些元组,根据出自同一值域的两个不同的属性,可以与另外一中的一些元组,根据出自同一值域的两个不同的属性,
些元组有一种对应关系(一对多的联系)。注元组即记录。些元组有一种对应关系(一对多的联系)注:元组即记录。。例:试查询选修课的课程名在本例中,先修课号与课程号出自同一值域,会涉及自联接查询。SELEDISTINCTC2.选修课号C1.课程名;FROM课程C1,选课C2;WHEREC1.课程号=C2.选修课号
十、内外层相关嵌套查询
前面讨论的嵌套查询是外层查询依赖于内层查询的结果,而内层查询与外层查询无关。但有时也需要内、外层互相关的查询,这时内层查询的条件需要外层查询提供值,而外层查询的条件需要内层查询的结果。例:查询只有一个学生选修的课程的,课程号及成绩。SELE*;FROM课程SC1;WHERESC1.课程号NOTIN;(SELE课程号FROM选课SC2WHERESC1.<>SC2.)SELE*FROM课程SC1;WHERENOTEXIST(SELE*FROM选课SC2;WHERESC1.<>SC2.ANDSC2.课程号=SC1.课程号)习题:P146/50
十一、十一、用量词和谓词的查询P94
前面已学过[NOT]IN运算符,此处还有两种与子查询相关的运算符。格式1:<表达式><比较运算符>[ANY|ALL|SOME](子查询)格式2:[NOT]EXISTS(子查询)说明:1.ANY、ALL和SOME为量词,ANY和SOME是同义词,在进行比较运算时只要子查询中有一行能使结果为真,则结果为真;ALL则要求子查询中的所有行都使结果为真时,结果才为真。2.EXISTS为谓词,EXISTS和NOTEXISTS是用来检查在子查询中是否有结果返回,也就是存在元组或不存在元组。例:查询选修有课程的学生的,,性别及生日。SELE*FROM学生WHEREEXIST(SELE*FROM选课WHERE学生.=选课.)注:本例中内层查询引用了外层查询的表,只有这样使用谓EXISTS或NOTEXISTS才有意义。例:查询学分最高的课程信息。SELE*FROM课程WHERE学分>=ALL(SELE学分FROM课程)SELE*FROM课程WHERENOT学分
SELE*FROM课程WHERE学分=(SELEMAX(学分)FROM课程)例:查询学分不是最高的课程信息。SELE*FROM课程WHERE学分 十二、十二、超联接查询P96
在两个表的超联接查询中,首先保证一个表中满足条件的元组都在结果中,然后将满足联接条件的元组与另一个表中的元组进行联接,不满足联接条件的则将应来自另一表的属性置为空值。语法:SELE……FROMTalbelINNER|LEFT|RIGHT|FULLJOINTableONJoinConditionWHERE……说明:1.2.INNERJOIN:等价于JOIN,为普通联接。ONJoinCondition:用于指定联接条件。
其余说明请同学们看书。例:比较几种联接方式。SELE,课程号,成绩FROM学生JOIN选课ON学生.=选
课.SELE,课程号,成绩FROM学生LEFTJOIN选课ON学生.=选课.SELE,课程号,成绩FROM学生RIGHTJOIN选课ON学生.=选课.SELE,课程号,成绩FROM学生FULLJOIN选课ON学生.=选课.
十三、十三、集合并运算
P101
可将两个SELECT语句的查询结果通过并运算合并成一个查询结果。为进行并运算,要求两个查询结果具有相同的字段个数,并且对应字段的值要出自同一值域,也就是具有相同的数据类型和取值范围。例:查询为01与02的选课信息。SELE*FROM选课WHERE=”01”;UNION;SELE*FROM选课WHERE=”02”
十四、十四、VFP中有关SQLSELECT的几个特殊选项P101
1.显示部分结果
格式:TOPn[PERCENT]功能:只需要满足条件的前几个记录。说明:
(1)n是1至32767之间的整数,说明显示前几个记录。(2)当使用PERCENT时,说明显示结果中前百分之几的记录。例:显示学分最低的前2项课程记录。SELE*TOP2FROM课程ORDERBY学分DESC&;&;通常与ORDERBY子句连用习题:P145/46P152/122.将结果存放在数组中
格式:INTOARRAYArrayName3.将结果存放在临时文件中
格式:INTOCURSORCursorName说明:临时表中一个只读的DBF文件,当查询结束后该临时文件是当前文件,可像一般的DBF文件一样使用,当关闭文件时该文件将自动删除。4.将结果存放在永久表中,通过该子句可实现表的复制。
格式:INTOTABLE|DBFTableName5.将结果存放到文本文件中
格式:TOFILEFileName[ADDITIVE]6.将结果直接输出到打印机
格式:TOPRINTER[PROMPT]习题:P131/2P132/4,5,6
第三节数据操作功能P90一、插入
命令格式1:INSERTINTO数据表名[(字段名1[,字段名2,...])]VALUES(表达式1[,表达式2...])功能:在指定表尾添加一条新记录,其值为VALUES后面的表达式的值。命令格式2:INSERTINTO数据表名ArrayName|FROMMEMVAR功能:向指定表中添加一条新记录,其值来自于数组或对应的同名内存变量。例:向课程表中插入记录:(”05”,”数理逻辑”,”6”,”03”)INSERTINTO课程VALUES(”05”,”数理逻辑”,6,”03”)说明:1.如未使用字段名指明,则VALUES中的表达式数目必须与表中的字段数相同,而且相应的数据类型必须一致。2.如果表中设定了主索引,则插入记录时只能用该SQLINSERT命令而不能使用APPEND或INSERT命令。3.注意插入数据的数据类型必须与表设计时的类型一致。FROMARRAY
习题:P149/3,4P150/5P156/24
二、更新
命令格式:UPDATETableNameSET字段名1=表达式1[,字段名2=表达式2...]WHERECondition类似于REPLACE命令。通常嵌入在循环结构内,用另一个表的数据来修改本表。例:将课程关系中课程号为“01”的课程的学分加1分。UPDATE课程SET学分=学分+1WHERE课程号=”01”习题:P148/2P150/6
三、删除
命令格式:DELETEFROMTableName[WHERECondition]说明:类似于VFP的DELE...FOR...命令。1.2.若无WHERE子句会删除表中的全部记录。此命令为逻辑删除。用PACK命令进行物理删除。
例:删除课程关系中课程号为“05”的元组。DELEFROM课程WHERE课程号=”05”习题:P156/25
第二节数据定义功能P85一、表的定义
命令格式:CREATETABLE数据表名(字段名1字段类型(字段宽度[,小数位数])[NULL|NOT
NULL][CHECK][ERROR][DEFAULT][PRIMARYKEY|UNIQUE][字段名2......])说明:例:用SQLCREATE命令建立学生2数据表CREATETABLE学生2(C(2)NOTNULLPRIMARYKEY,C(8),;性别C(2)CHECK性别=”男”OR性别=”女”ERROR“性别只能是男或女”DEFAULT“男”,生日D)习题:P157/2
二、表的删除
命令格式:DROPTABLETableName功能:直接从磁盘上删除指定的表。例:删除上例中的表“学生2”DROPTABLE学生2习题:P148/1
三、表结构的修改
命令格式1:ALTERTABLETableNameADD|ALTER[COLUMN]:字段名1...]说明:此格式可添加(ADD)新的字段或修改(ALTER)已有的字段,它
的句法基本与CREATETABLE的句法相对应。例:为课程关系增加长度为6的字符型的选修课号属性。ALTERTABLE课程ADD课程号C(6)例:课程中的课程号属性的长度由6改为8。ALTERTABLE课程ALTER课程号C(8)习题:P153/13P142/37P157/1P159/6,8P160/12
命令格式2:ALTERTABLE表名ALTER[COLUMN]字段名1:[NULL|NOTNULL][SETDEFAULT][SETCHECK...ERROR...][DROP
DEFAULT][DROPCHECK]说明:此格式主要用于定义、修改和删除字段一级的有效性规则和默认值定义。例:为课程关系增加学分大于等于2的有效性规则ALTERTABLE课程ALTER学分SETCHECK学分>=2习题:P151/9P154/17字段名]命令格式3:ALTERTABLE表名[DROP[COLUMN]字段名:字段名[SETCHECK...ERROR...][DROPCHECK][RENAME[COLUMN]字段名TO新字段名...新字段名]...说明:此格式可删除字段,可修改字段名,可定义、修改和删除表一级的有
效性规则等。例:将课程表的选修课号字段名改为选修课。ALTERTABLE课程RENAME选修课号TO选修课例:删除课程表中的选修课字段。ALTERTABLE课程DROP选修课习题:P159/5
四、视图操作
1.定义视图命令格式:CREATEVIEW视图名ASselect查询语句说明:视图是一个虚表,它一旦建立使用方法跟表十分类似,它不会形成单独的文件,它的内容保存在数据库中,所以自由表不能建立视图。这是视图与查询的一个区别。例:CREATEVIEW学生成绩AS;SELE,SUM(成绩)AS总分,AVG(成绩)AS平均分;FROM学生JOIN选课ON学生.=选课.;GROUPBY选课.USE学生成绩BROWSELE*FROM学生成绩习题:P137/20P151/11
2.视图的删除命令格式:DROPVIEW<视图名>习题:P155/19
第五节例题解析(略)例题解析(