例.利用SQL命令建立学生成绩管理数据库,该数据库包含学生信息表、课程信息表和成绩信息表。步骤1:建立学生成绩管理数据库。CREATEDATABASE学生成绩管理步骤2:建立学生信息表。CREATETABLE学生信息;(学号C(8)PRIMARYKEY;,姓名C(8);,性别C(2)CHECK性别=“男”OR性别=“女”;ERROR[只能输入“男”或“女”]DEFAULT“男”;,出生日期D;,入学成绩N(5,1);,四级通过否L;,计算机等级考试C(4)NULL;,备注M)定义表结构步骤3:建立课程信息表。CREATETABLE课程信息(课程号C(2)PRIMARYKEY,课程名C(10))步骤4:建立成绩信息表。CREATETABLE成绩信息;(学号C(8),课程号C(2),成绩N(5,1),;PRIMARYKEY学号+课程号TAG学号课程,;FOREIGNKEY学号TAG学号REFERENCES学生信息)定义表结构例.为课程信息表添加两个字段:学分,N,2;学时,N,2,并要求它们的值不得小于或等于0。ALTERTABLE课程信息ADD学分N(2)CHECK学分0ALTERTABLE课程信息ADD学时N(2)CHECK学时0修改表结构例.在成绩信息表中将课程号字段定义为索引标识为“课程号的普通索引,并引用课程信息表中的主索引“课程号”与课程信息表建立联系。ALTERTABLE成绩信息;ADDFOREIGNKEY课程号TAG课程号REFERENCES课程信息注意:REFERENCES子句由子表向父表建立永久关联。修改表结构例.为学生信息表中的入学成绩字段设置有效性规则。ALTERTABLE学生信息ALTER入学成绩SETCHECK入学成绩0例.删除学生信息表中的入学成绩字段的有效性规则。ALTERTABLE学生信息ALTER入学成绩DROPCHECK修改表结构例.将学生信息表中的“出生日期”字段名改为“出生年月”。ALTERTABLE学生信息RENAMECOLUMN出生日期TO出生年月例.删除学生信息表中的“备注”字段。ALTERTABLE学生信息DROPCOLUMN备注例.将课程信息表中的课程名定义为候选索引,索引表达式是课程名。ALTERTABLE课程信息ADDUNIQUE课程名例.删除课程信息表中的候选索引课程名。ALTERTABLE课程信息DROPUNIQUETAG课程名修改表结构返回删除表例.删除教师信息表。DROPTABLE教师信息返回返回目录插入记录例.向学生信息表中插入记录。INSERTINTO学生信息;VALUES(00000001,张三,男,{^1982-08-09},580,.T.,二级)INSERTINTO学生信息(学号,姓名,入学成绩)VALUES(00000002,李四,560)第一条命令插入完整记录,这时字段名可以缺省;第二条命令中只给出插入记录的部分数据,需要给出相应的字段名加以说明。返回更新记录例.将所有“英语”课的成绩置为0。UPDATE成绩SET成绩=0WHERE;课程号IN(SELECT课程号FROM课程WHERE课程名=英语)返回删除记录例.逻辑删除学生信息表中的所有记录。DELETEFROM学生信息返回返回目录查询功能SQL的核心是查询。SQL的查询命令称为SELECT命令SELECT命令具有多个选项,但是它的基本结构是:SELECT字段名表FROM表名[WHERE筛选条件]其中:SELECT指定输出的字段,FROM指定数据来源,WHERE指定查询条件。查询功能简单查询带特殊运算符的条件查询简单的计算查询分组与计算查询简单的嵌套查询使用谓词的嵌套查询连接查询排序集合的并运算查询结果的重定向输出简单查询具有简单查询条件的查询。【语法格式】SELECT[ALL|DISTINCT]字段名1[AS显示列名][,字段名2[AS显示列名…]]FROM表名[WHERE筛选条件]【说明】SELECT字段名表:指定查询结果输出的字段;ALL|DISTINCT:ALL表示输出查询结果中所有记录,DISTINCT则保证在查询结果中相对于某个字段值的记录是唯一的;AS显示列名:在输出时不希望使用原来的字段名,可以用显示列名重新设置;FROM表名:FROM子句后面可以是单个或多个表名,或者视图名,说明要查询的数据来源。选择工作区与打开指定的表均由VFP系统安排;WHERE筛选条件:说明查询条件,即选择元组的条件例.检索学生关系中所有元组。SELECT*FROM学生信息简单查询例.显示所有学生的学号和姓名。SELECT学号,姓名FROM学生信息简单查询例.显示至少选修了一门课程的学生的学号。SELECT学号FROM成绩信息观察结果不难看出,在查询结果中包含了重复值。根据题意,本题关注的是在成绩信息表中出现了哪些学生的学号,至于出现几次,并不是我们感兴趣的。加上DISTINCT短语去掉重复值:SELECT学号FROM成绩信息DISTINCT简单查询例.输出学生关系中所有学生的姓名和截至统计时的年龄。SELECT姓名,INT((DATE()-出生年月)/365)AS年龄FROM学生信息由于表中没有年龄字段,SELECT子句中第二列的表达式利用出生年月的数据计算出年龄值,AS短语用来设置显示列名。例.显示入学成绩在560分以上的学生姓名以及入学成绩。SELECT姓名,入学成绩FROM学生信息WHERE入学成绩=560简单查询简单查询【语法小结】⑴SELECT查询的结果生成一个只读的临时表,默认输出到屏幕,以浏览方式显示;⑵字段名指定需要输出的列,该项可以是字段名,也可以是函数或表达式。当需要输出所有列时,可以用一个“*”表示,否则用逗号分隔需要输出的字段名。返回带特殊运算符的条件查询SELECT命令可以使用的特殊运算符包括BETWEEN、IN、LIKE和ISNULL。【语法格式】⒈BETWEEN…AND运算符字段名[NOT]BETWEEN初值AND终值BETWEEN运算符用于检测字段的值是否介于指定的范围内。字段名可以是字段名或表达式。BETWEEN表示的取值范围是连续的。VFP的函数BETWEEN(表达式,初值,终值)与之有类似的功能。⒉IN运算符字段名[NOT]IN(表达式1[,表达式2…])IN运算符用于检测字段的值是否属于表达式集合或子查询。字段名可以是字段名或表达式。IN表示的取值范围是逗号分隔的若干个值,它表示的取值范围是离散的。VFP的函数INLIST(表达式,表达式1[,表达式2…])有类似的功能。带特殊运算符的条件查询⒊LIKE运算符字段名LIKE字符表达式LIKE运算符用于检测字段的值是否与样式字符串匹配。字段名是字符型字段或表达式。字符表达式中可以使用通配符,其中通配符%表示零个或多个字符,通配符_(下划线)表示一个字符。其余字符代表自己。⒋ISNULL运算符字段名IS[NOT]NULLISNULL运算符用于检测指定字段的值是否为空(NULL),如果字段值为空,返回真。注意,在检测空值时不能写成字段名=NULL或字段名!=NULL。带特殊运算符的条件查询例.检索入学成绩在510~540分范围内所有学生的信息。SELECT*FROM学生信息WHERE入学成绩BETWEEN510AND540例.检索入学成绩是520和540分的所有学生的信息。SELECT*FROM学生信息WHERE入学成绩IN(520,540)例.检索所有张姓同学的信息。SELECT*FROM学生信息WHERE姓名LIKE“张%”例.检索所有已经通过计算机等级考试的学生的学号、姓名和计算机等级考试信息。SELECT学号,姓名,计算机等级考试FROM学生信息;WHERE计算机等级考试ISNOTNULL带特殊运算符的条件查询【语法小结】⑴BETWEEN初值AND终值,意即在初值与终值界定的某个区间内。注意这是一个闭区间;⑵当IN运算中包含的表达式只有一项时,可以用关系运算符“=”代替;表达式有多项时,可以用逻辑运算符OR连接多个关系运算符“=”。带特殊运算符的条件查询返回简单的计算查询SQLSELECT命令支持各种统计汇总函数。常用的计算函数主要有:COUNT、SUM、AVG、MAX和MIN。例.在学生信息表中统计学生人数。SELECTCOUNT(*)FROM学生信息例.统计已开出的课程门数。SELECTCOUNT(DISTINCT课程号)FROM成绩信息例.求入学成绩总和。SELECTSUM(入学成绩)FROM学生信息例.求“02”号课程的平均成绩。SELECTAVG(成绩)FROM成绩信息WHERE课程号=“02”例.求“02”号课程的最高分。SELECTMAX(成绩)FROM成绩信息WHERE课程号=02分组与计算查询计算查询是对整个关系的查询,一次查询只能得出一个计算结果。利用分组计算查询则可以通过一次查询获得多个计算结果。分组查询是通过GROUPBY子句实现的。【语法格式】GROUPBY分组关键字1[,分组关键字2…][HAVING筛选条件]【说明】分组关键字:分组的依据。可以是字段名,也可以是SQL函数表达式,还可以是字段序号(从1开始);HAVING:对分组进行筛选的条件。HAVING总是跟在GROUPBY后面,不能单独使用。例.统计各门课程的平均成绩、最高分、最低分和选课人数。SELECT课程号,AVG(成绩)AS平均成绩,MAX(成绩)AS最高分,;MIN(成绩)AS最低分,COUNT(学号)AS人数;FROM成绩信息;GROUPBY课程号例.分别统计男、女生入学成绩的最高分。SELECT性别,MAX(入学成绩)FROM学生信息GROUPBY性别例.对选修课程超过三门的学生分别统计选修课程的门数。SELECT学号,COUNT(*)AS选课门数FROM成绩信息;GROUPBY学号HAVINGCOUNT(*)2分组与计算查询【语法小结】⑴GROUPBY允许按一个或多个字段分组;⑵选择GROUPBY选项,则输出的有效数据只含分类关键字和计算函数计算的结果,并且输出行数不一定和表中的记录数一致。一般而言,选用GROUPBY子句以后,输出结果中包含的行数少于源表的行数。如果HAVING子句缺省,输出结果的行数应该与分组的个数相同。分组与计算查询⑶HAVING与WHERE的区别:WHERE是对表中所有记录进行筛选,HAVING是对分组结果进行筛选;⑷在分组查询中如果既选用了WHERE,又选用了HAVING,执行的顺序是先用WHERE限定元组,然后对筛选后的记录按GROUPBY指定的分组关键字分组,最后用HAVING子句限定分组。分组与计算查询返回简单的嵌套查询在有的查询中,需要将另一个SELECT查询的结果作为条件。如果在一个SELECT命令的WHERE子句中出现另一个SELECT命令,则这种查询称为嵌套查询。只嵌入一层子查询的SELECT命令称为单层嵌套查询,嵌入多于一层子查询的SELECT命令称为多层嵌套查询。SQL允许多层嵌套,但VFP只支持单层嵌套查询。嵌套查询由内向外处理,这样外层查询可以利用内层查询的结果。例.检索所有选修英语课程的学生的学号。SELECT学号FROM成绩信息WHERE;课程号=(SELECT课程号FROM课程信息WHERE课程=“英语”)例.检索所有入学成绩高于尚杰的学生的姓名、入学成绩和性别。SELECT姓名,入学成绩,性别FROM学生信息WHERE;入学成绩(SELECT入学成绩FROM学生信息WHERE姓名=尚杰)简单的嵌套查询返回使用谓词的嵌套查询在简单的嵌套查询中,子查询都返回单一的值。如果子查询返回的值有多个,通常在外层查询的WHERE子句中使用谓词ANY(SOME)、ALL、IN或EXISTS加以限制。【语法格式】⒈字段名[NOT]IN(子查询)IN是属于的意思,字段名指定的字段内容属于子查询中任何一