SQL语言的应用SQL语言简介SQL语言的功能数据定义数据查询数据操纵*数据控制实例分析内容提要SQL语言简介SQL(StructuredQueryLanguage)语言是一种十分重要的标准数据库语言。SQL语言至1986年成为国际标准语言以后,各数据库软件开发商纷纷推出SQL的关系数据库管理系统产品或接口软件,许多应用广泛的关系数据库管理系统也都增加了DBMS功能,支持标准SQL语言,从而使未来的数据库环境连接为一个统一的整体。它不是数据库管理系统,也不是应用软件开发语言,它只能用于对数据库中数据的操作。SQL语言有两种使用方式,即可以作为自含式语言,在数据库管理系统中独立使用,又可以作为嵌入式语言,嵌入许多高级语言(如C、FORTRAN、COBOL)中使用。SQL语言的特点1.SQL语言是一种一体化的语言SQL语言集数据定义、数据操纵、数据查询和数据控制的功能于一体,语言风格统一,可以独立完成数据库的全部操作,。2.SQL语言是一种高度非过程化的语言。它没有必要一步步告诉计算机“如何”去做,而只需要描述清楚用户要“做什么”,SQL语言就可以将要求交给系统,自动完成全部工作。它的大多数语句都是独立执行、与上下文无关。3.语言简洁,易学易用SQL的命令动词SQL功能命令动词数据查询SELECT数据定义CREATE、DROP、ALTER数据操纵INSERT、UPDATE、DELETE数据控制GRANT、REVOKESQL语言的功能1、数据定义命令CREATETABLE-SQL(建立表结构)ALTERTABLE-SQL(修改表结构)DROPTABLE-SQL(删除表)主教材P100例6.1、例6.2、例6.3、例6.4、例6.52、数据操纵(修改)命令INSERT-SQL(插入数据)DELETE-SQL(删除数据)UPDATE-SQL(更新数据)主教材P112例6.21、例6.22、例6.23、例6.243、SQL数据查询SQL的核心为查询。SQL查询命令也称为SELECT命令,其基本形式为SELECT—FROM—WHERE查询块组成,多个查询块可以嵌套执行。(a)学生档案表(dab.dbf)学号姓名性别出生日期专业班级照片简历20050005张广田男1987-10-11计算机1班genmemo20050010蜂雪燕女1987-7-2计算机1班genmemo20050015何芳女1987-5-6计算机1班genmemo20050020冯艳女1987-9-9计算机1班genmemo20050025陈兴华男1987-2-14英语3班genmemo20050030陈宗贵男1987-7-2英语3班genmemo20050035张伟男1987-3-24英语3班genmemo20050040张光辉男1987-3-7英语3班genmemo20043567那措央中女1986-6-30机械制造4班genmemo20043679邬德斋男1986-4-26机械制造4班genmemo20045643崔婷婷女1986-6-8机械制造4班genmemo20047634冯丽娟女1986-6-30机械制造4班genmemo(c)学生选课成绩表(xkcjb.dbf)学号课程号学期成绩重考成绩20050010001138.068.0200500100101100.0020050020001145.070.020043567034254.062.020043567033288.0020050025030188.0020050010023198.5020050010030167.0020050005010158.070.020050025034282.0020045643001150.075.520050035023295.5020045643033276.50(b)课程表(kcb.dbf)课程号课程名学分必修否001高等数学I8.T.010大学英语12.T.023马列、毛泽东思想理论3.T.030大学计算机基础3.T.033操作系统基础2.F.034PC机原理与应用3.F.1)基本的SELECT语句SELECT字段名1[,字段名2…FROM[数据库名称!]表或视图基本查询基于单个表,由SELECT和FROM短语构成无条件查询,或由SELECT、FROM和WHILE短语构成条件查询。【例】查询dab中所有学生。SELECT*FROMdab【例】查询dab中“姓名”、“性别”字段。SELECT姓名,性别FROMdab结果将仅显示如图中的第2列、第3列数据。其中“*”是通配符,表示显示所有字段,该命令等价于:SELECT学号,姓名,性别,出生日期,专业班级FROMdab2)唯一性查询唯一性查询指要显示的结果,若有重复出现时,只显示重复行中的一行。这可通过在基本SELECT语句中加入DISTINCT关键字【例】查询dab中“专业班级”字段,要求数据重复时,仅显示相重复的一条记录。SELECT专业班级FROMdabDISTINCT结果如图所示。3)带条件的查询在SELECT语句中,可以通过WHEREWHEREWHERE条件表达式1[AND条件表达式2…]功能:查询指定表或视图中满足查询条件的记录。其中条件表达式可以是关系表达式,也可以是逻辑表达式,下表列出了组成条件表达式运算符类别运算符实例关系运算符=、、、=、=、成绩=60逻辑运算符NOT、AND、OR成绩=60AND成绩70字符串匹配运算符LIKE姓名LIKE“王%范围运算符BETWEENAND成绩BETWEEN60AND70空值运算符ISNULL成绩ISNULL集合运算符IN、NOTIN专业班级IN(“计算机”,”英语”)LIKE子句中可以用通配符:下划线“_”,表示任何一个字符;百分号符“%”,表示一串字符。【例】查询dab中的男生学号、姓名、性别。SELECT学号,姓名,性别FROMdabWHERE性别=男结果如下图所示。【例】查询dab中计算机1班的男生姓名。SELECT姓名FROMdabWHERE性别=男AND专业班级=计算机1班【例】查询xkcjb中成绩在70~90分范围内的学生。SELECT*FROMxkcjbWHERE成绩BETWEEN70AND90结果是:结果如图所示。等价于:SELECT*FROMxkcjbWHERE成绩=70AND成绩=90【例】查询dab中所有姓“张”的学生。SELECT*FROMdabWHERE姓名LIKE张%结果如下图所示。通配符百分号“%”表示0个或多个字符,“_”下划线表示任意一个字符【例】查询xkcjb中选修课程号为“001”的学生。SELECT*FROMxkcjbWHERE课程号IN(001)或:SELECT*FROMxkcjbWHERE课程号=001【例】查询学分大于5的课程信息。select*from课程where学分54)通过ORDERBY子句可以实现查询结果的排序输出,允许ORDERBY排序选项1[ASC|DESC][,排序选项2[ASC|DESC]…]其中,ASC表示升序排序(缺省方式),DESC表示降序【例】按课程的学分升序查询出全部课程信息。SELECT*FROMkcbORDERBY学分结果按学分从低到高显示。【例】按学号升序,相同学号再按成绩降序查询出全部学生成绩情况。SELECT*FROMxkcjbORDERBY学号,成绩DESC5)带计算函数的查询在SELECT语句中,使用SQL语言提供的一些查询计算函数,可以增强查询功能。基本的查询计算函数的格式及功能如下表所示。函数的格式函数功能COUNT(*)计算记录条数SUM(字段名)求字段名所指定字段值的总和AVG(字段名)求字段名所指定字段的平均值MAX(字段名)求字段名所指定字段的最大值MIN(字段名)求字段名所指定字段的最小值【例】求所有课程的总学分。SELECTSUM(学分)FROMkcb【例】求学生总人数。SELECTCOUNT(*)FROMdabSum_31Cnt12【例】求学生平均年龄。SELECTAVG(YEAR(DATE())-YEAR(出生日期))FROMdab【例】求选修课程的最高成绩和最低成绩。SELECTMAX(成绩),MIN(成绩)FROMxkcjbAvg_exp_122.33Max_成绩Min_100.038.06)用别名输出列标题(字段名)将列名用含义更明确的别名输出,便于理解,可以通过AS格式:AS列别名功能:将查询输出的列名以列别名输出。其中,列别名若为常字串,则无须加定界符【例】求选修课程的最高成绩和最低成绩。SELECTMAX(成绩)AS最高成绩,MIN(成绩)AS最低成绩;FROMxkcjb结果是:最高成绩100.038.0与前题比较7)分组查询通过GROUPBYGROUPBY分组字段名1[,分组字段名2…[HAVING过滤条件其中,分组字段名可以是表的字段名、字段函数名或标识列的数值型表达式;[HAVING过滤条件]子句在select语句中,where子句是对记录的限定,而Having短语是对分组的限定,where、groupby及Having可以同时出现在一个select语句中。三者在select中出现的顺序为:Where—Groupby---Having。记录1记录2记录3记录4记录5记录6记录2记录4记录5记录6记录2记录5记录4记录6记录2记录5where限定Groupby分组Having限定【例】求各门课程的平均成绩。SELECT课程号,AVG(成绩)FROMxkcjbGROUPBY课程号【例】求平均成绩在80分以上的各课程的课程号与平均成绩。select课程号,avg(成绩)fromxkcjb;groupby课程号havingavg(成绩)80结果如图所示。【例】求至少选修了2门课程的学生的信息。SELECTdab.学号,姓名,课程号FROMdab,xkcjbWHEREdab.学号=xkcjb.学号;GROUPBYdab.学号HAVINGCOUNT(*)=2结果如图所示。8)使用空值进行查询【例】假设在xkcjb中2004级的学生还没有考试,则成绩为空。试找出尚未考试的选课信息。updatexkcjbset成绩=nullwhereleft(学号,4)=2004updatexkcjbset重考成绩=nullwhereleft(学号,4)=2004注:首先在表设计器中设置“成绩”和“重考成绩”字段允许为空值nullsele*fromxkcjbwhere成绩isnull注意:查询空值时要使用ISNULL,而用=NULL是无效的,因为空值不是一个确定的值,不能用“=”这样的运算符进行比较。不为空值应用ISNOTNULL,不能用!=NULL。sele*fromxkcjbwhere成绩isnulland重考成绩isnullsele*fromxkcjbwhere成绩isnotnull9)多表联接查询SELECT语句可以实现对VisualFoxPro6.0的4种联接类型的查询:•内部联接(InnerJoin):只有2个表的字段都满足联接条•左联接(LeftOuterJoin):联接条件左边表中的记录都包含在查询结果中,而右边表中的记录只有满足联接条件•右联接(RightOuterJoin)•完全联接(FullJoin):无论2个表中的记录是否满足联通常有3种方法实现多表联接查询,一是在查询命令中显示地指定联接类型;二是在查询命令中使用WHERE子句;三是(1格式:SELECT…FROM表或视图INNER|LEFT|RIGHT|FULLJOIN表或视图ON联接条件WHERE…功能:通过指定的联接类型建立多表间的联接注意:若SELECT后要查询的列名(字段名)在2个表中都有,则必须采用“表名.字段名”,若字段名唯一,则可仅写出字段名。【例】显示dab和xkcjb中成绩不及格的学生姓名、学号、课程号及成绩。SELECTdab.学号,姓名,课程号,成绩FROMx