1、第五章 关系数据库SQL语言,返回目录,SQL概述,查询语句SELECTSQL,其他SQL命令,关系数据库SQL语言,例题精解,SQL概述,一、SQL简介1986年10月,美国ANSI颁布了结构化查询语言SQL(Structured Query Language)的标准。由于它具有诸多优点,备受计算机界欢迎。1989年,国际标准化组织ISO将SQL定为关系数据库的标准语言。1990年,我国颁布了信息处理系统数据库语言SQL,从此SQL成为国家标准。结构化查询语言SQL是关系数据库的标准语言。目前包括VFP在内的数据库开发软件都支持SQL语言。,上一页,下一页,返回,二、SQL是一种一体化的语言
2、,它包括数据定义、数据查询、数据操纵和数据控制功能,可以完成数据库的全部操作。三、SQL是一种非过程化的语言,用户在编写程序时,只要指出“干什么”,而不必一步步告诉计算机“怎么干”,SQL将自动完成全部操作。四、SQL语言非常简洁,但功能很强,一共只有为数不多的几条命令:1、查询数据命令SELECT-SQL(它是最重要的一条SQL命令),SQL概述,上一页,下一页,返回,2、创建新表命令CREATE TABLE-SQL 3、修改表结构命令ALTER TABLE-SQL 4、追加记录命令INSERT-SQL 5、逻辑删除记录命令DELETE-SQL 6、更新记录数据命令UPDATE-SQL 7、
3、创建视图命令CREATE VIEW-SQL五、Visual FoxPro系统与SQL语言的关系VFP将SQL语言融入其中。这样,VFP中有两套命令系统:一套是Xbase系列的命令系统,另一套是SQL的命令系统。两者语法有所差异。,SQL概述,上一页,下一页,返回,查询语句SELECTSQL,一、SELECT-SQL语句的基本结构SELECT FROM WHERE 二、SELECT-SQL语句中子句与关键字的含义1、SELECT子句:指定查询输出的结果。(包括行的范围和列的内容及列标题) ALL:表示查询结果中包括所有满足查询条件的记录,也包括重复值。默认值为ALL。 DISTINCT:表示在查
4、询结果中内容完全相同的记录只能出现一次。 TOP nExpr PERCENT:限制查询记录的数目为前n条或占记录总数的百分比为n。,上一页,下一页,返回,Alias.Select_Item:指定作为查询结果的列的内容,可以是字段名或表达式;Alias表示表的别名,用于标识不同表的同名字段。AS Column_name:指定查询结果中列的标题名称。2、FROM子句:指定查询数据所在的表(数据源)。TableName:表示作为数据源的表名。DataName!:如果TableName表不是自由表,且包含它的数据库不是当前数据库,则用DataName!为表文件指定数据库。Local_Alias:指定本
5、地表的别名。,查询语句SELECTSQL,上一页,下一页,返回,3、JOIN子句:指定多表之间的联接方式。INNER|LEFTOUTER|RIGHTOUTER|FULLOUTER JOIN:内部|左(外部)|右(外部)|完全(外部)联接。其中OUTER关键字是任选的,它用来强调创建的是一个外部联接。ON子句:与JOIN子句联用,作为JOIN子句的联接条件(JoinCondition)。4、WHERE子句:指定多表之间的联接条件(JoinCondition)和查询筛选条件(FilterCondition)。,查询语句SELECTSQL,上一页,下一页,返回,5、ORDER BY子句:指定对查询结
6、果排序的依据。Order_Item:指定排序依据的列。ASC指定查询结果以升序排列,DESC指定查询结果以降序排列。6、GROUP BY子句:指定对查询结果的分组依据。GroupColumn:指定分组所依据的字段。HAVING子句:与GROUP BY子句联用,指定对分组结果进行筛选的条件(FilterCondition)。,查询语句SELECTSQL,上一页,下一页,返回,7、TO子句:指定查询结果输出的目标。浏览窗口:默认输出目标(查询结果显示于浏览窗口中只供浏览,不能修改)。打印机:TO PRINTER PROMPT。若选用PROMPT,则在开始打印之前,打开打印机设置对话框。ASCII文
7、件:TO FILE FileName ADDITIVE。将查询的结果写到指定的文本文件。若选用ADDITIVE,则查询结果将追加在原文件的尾部;否则将覆盖原文件。VFP主窗口:TO SCREEN,查询语句SELECTSQL,上一页,下一页,返回,8、INTO子句:指定查询结果的保存方向。独立的表:INTO TABLE TableName。 临时表:INTO CURSOR CursorName。 数组:INTO ARRAY ArrayName。 如果同时使用INTO子句和TO子句,则INTO子句优先。三、单表查询单表查询的数据源来自于一个表,FROM子句中只出现一个表名,查询语句SELECTSQ
8、L,上一页,下一页,返回,1、单表无条件查询命令格式:SELECT FROM 2、单表条件查询命令格式:SELECT FROM WHERE 说明:在构造条件表达式时,除了可以使用比较算符和逻辑算符之外,还可以使用SQL专用算符:BETWEEN AND 和 LIKE 。,查询语句SELECTSQL,上一页,下一页,返回,在单表条件查询的SELECT-SQL语句中,条件子句WHERE 有以下几种形式:1)简单条件查询。 2)复合条件查询。 3)模糊条件查询。三、对查询结果进行排序命令格式:SELECT FROM WHERE ;ORDER BY ASC|DESC,查询语句SELECTSQL,上一页,
9、下一页,返回,说明:1、排序依据备注型数据和通用型数据不能作为排序依据。排序依据可以是字段名;由AS子句命名的列标题,但不能直接使用表达式和函数;列序号即该列在查询结果中的位置1,2,3。2、排序方式ASC表示查询结果按照排序依据项的值升序排列,DESC表示查询结果按照排序依据项的值降序排列。默认排序方式为ASC。,查询语句SELECTSQL,上一页,下一页,返回,3、排序规则数值按大小顺序,字母按ASCII值排序,汉字按内码值排序,日期按前后排序,逻辑型数据“假”在前“真”在后。4、多关键字排序如果有多个排序依据,它们之间用逗号分隔。在排序时,先按第一排序依据排序,第一项值相同的记录,再按第
10、二排序依据排序,依次类推。,查询语句SELECTSQL,上一页,下一页,返回,四、对查询结果进行分组在SELECT-SQL命令中,使用GROUP BY子句,对查询结果按指定依据进行分组(分类统计),还可以对分组查询的结果按条件进行筛选。 命令格式: SELECT FROM WHERE ;GROUP BY HAVING 说明:1、分组依据备注型数据和通用型数据不能作为分组依据。分组依据的可以是字段名或列序号,而不能直接使用表达式和函数。,查询语句SELECTSQL,上一页,下一页,返回,2、分组条件在GROUP子句中使用HAVING子句,对分组查询的结果进行筛选。注意:WHERE子句和HAVIN
11、G子句的区别:WHERE子句指定哪些记录能参加分组,HAVING子句指定分组后哪些记录能作为查询的最终结果输出。五、指定查询结果输出的目标在SELECT-SQL命令中,使用TO子句,可以将查询结果输出到指定目标主窗口、ASCII文件或打印机。,查询语句SELECTSQL,上一页,下一页,返回,六、指定查询结果保存的方向在SELECT-SQL命令中,使用INTO子句,可以指定查询结果保存的方向表文件、临时表或数组。INTO子句的格式:INTO TABLE |CURSOR |ARRAY ,查询语句SELECTSQL,上一页,下一页,返回,七、多表查询两表联接需要条件,即两表间存在关联字段。1、内联
12、(INNER JOIN)查询从相关的两个表中选取满足联接条件的记录,联接成新的记录作为查询输出。2、左联查询(LEFT JOIN)从表1中选取所有记录,按联接条件与表2中相关的记录联接成新的记录作为查询输出,若表2中不存在相关联的记录,则查询输出中相应字段的值为.NULL.。,查询语句SELECTSQL,上一页,下一页,返回,3、右联(RIGHT JOIN)查询从表2中选取所有记录,按联接条件与表1中相关的记录联接成新的记录作为查询输出,若表1中不存在相关联的记录,则查询输出中相应字段的值为.NULL.。4、全联(FULL JOIN)查询从相关的两表中选取所有记录,按联接条件联接成新的记录作为
13、查询输出,若表1或表2中不存在相关联的记录,则查询输出中相应字段的值为.NULL.。,查询语句SELECTSQL,上一页,下一页,返回,5、多表(三个以上)联接查询三个以上多表联接查询的方法是:通过关联字段,将多个表两两联接起来,联接的条件是: ON .=. AND .=. AND 八、嵌套查询1、嵌套查询的含意:嵌套查询是指在SELECT-SQL命令中包含了另一个SELECT-SQL命令。,查询语句SELECTSQL,上一页,下一页,返回,2、实现嵌套查询的命令格式:SELECT FROM WHERE IN;(SELECT FROM WHERE )3、说明:1)命令中“IN”是一个关系运算符
14、,表示表1中关联字段的值必须与从表2查询出的关联字段中的一个的值相匹配。2)命令执行过程:首先执行子查询,然后执行外查询。,查询语句SELECTSQL,上一页,下一页,返回,九、自联查询1、自联查询的含意:在SELECT-SQL命令将一个关系与其自身进行联接。为了区分内外层查询,在FROM子句中为内外层关系指定不同的别名。2、实现自联查询的命令格式:SELECT FROM WHERE =; (SELECT FROM ;WHERE ),查询语句SELECTSQL,上一页,下一页,返回,十、集合的并运算1、命令格式: SELECT FROM WHERE ;UNION;SELECT FROM WHE
15、RE 2、功能:将两个SELECT-SQL语句的查询结果合并成一个查询结果输出。3、说明:在两个SELECT-SQL语句中,查询结果中的字段个数、字段的名、型和宽都要相同,即只有两个结构相同的查询结果才能进行并运算。,查询语句SELECTSQL,上一页,下一页,返回,其他SQL命令,一、定义功能的SQL语句1、定义表结构的完整命令命令格式:CREATE TABLE|DBF NAME FREE ; ( ( ,) ;CHECK ERROR ; &主关键字或候选关键字 , | FROM ARRARY ,上一页,下一页,返回,2、修改表结构命令格式: ALTER TABLE ADD| DROP| AL
16、TER ( ,);SET CHECK ERROR ; DEFAULT ;PRIMARY KEY|UNIQUE3、删除表文件1)命令格式:DROP TABLE 2)说明:若要删除数据库中的表,该数据库应是打开的当前数据库。,其他SQL命令,上一页,下一页,返回,4、定义视图命令格式:CREATE VIEW AS 5、删除视图命令格式:DROP VIEW &删除表的命令是DROP TABLE 二、操作功能的SQL语句1、插入记录(追加记录) 1)命令格式1:,其他SQL命令,上一页,下一页,返回,INSERT INTO ( ,) ;VALUES ( ,) 2)命令格式2:INSERT INTO F
17、ROM ARRAY | FROM 2、更新记录命令格式:UPDATE ;SET =,=, ;WHERE ,其他SQL命令,上一页,下一页,返回,3、逻辑删除记录1)命令格式:DELETE FROM WHERE 2)说明:若缺省WHERE子句,则默认所有记录。,其他SQL命令,上一页,下一页,返回,例题精解,【例51】设“图书管理”数据库有如下三个表:图书(编号 C(6), 分类号 C(8), 书名 C(16), 作者 C(6), 出版单位 C(20), 单价 N(6,2)) 读者(借书证号 C(4), 单位 C(8), 姓名 C(8), 性别 C(2), 职称 C(6), 地址 C(20))
18、借阅(借书证号 C(4),编号 C(6), 借书日期 D(8)) 要检索借阅网络技术基础的借书证号,正确的SQL语句是: SELECT 借书证号 FROM 借阅 WHERE 编号=( )。,下一页,返回,A)(SELECT 借书证号 FROM 图书 WHERE 书名=“网络技术基础“) B)(SELECT 编号 FROM 图书 WHERE 书名=“网络技术基础“) C)(SELECT 借书证号 FROM 借阅 WHERE 书名=“网络技术基础“) D)(SELECT 编号 FROM 借阅 WHERE 书名=“网络技术基础“)解:本题是嵌套查询。内层查询找出书名为“网络技术基础”的图书的编号,并
19、作为外层查询的条件。答:52 B,上一页,下一页,返回,【例52】在“图书管理”数据库中,求出各单位借阅图书的人次。正确的SQL语句是( )。A)SELECT 单位, COUNT(借阅.借书证号) FROM 借阅,读者 WHERE借阅.借书证号=读者.借书证号 GROUP BY 单位 B)SELECT 单位, SUM(借阅.借书证号) FROM 借阅,读者 WHERE 借阅.借书证号=读者.借书证号 GROUP BY 单位 C)SELECT 单位, COUNT(借阅.借书证号) FROM 借阅,读者 WHERE 借阅.借书证号=读者.借书证号 ORDER BY 单位 D)SELECT 单位,
20、COUNT(借阅.借书证号) FROM 借阅,读者 WHERE 借阅.借书证号=读者.借书证号 HAVING 单位解:本题使用联接查询和分组查询。“各单位”即按单位分组,通过“GROUP BY 单位”子句来实现。“人次”通过计数函数COUNT(借阅.借书证号)来实现。若将题目中的借阅图书的“人次”改为“人数”,则要添加DISTINCT短语以去掉重复值。答:53 A,上一页,下一页,返回,【例53】在“图书管理”数据库中,查询借书证号为0001的读者的姓名和所借的图书的书名。正确的SQL语句是( )。SELECT 姓名,书名 FROM 借阅,图书,读者 WHERE 借阅.借书证号=“0001“
21、AND ;A)图书.编号=借阅.编号 AND 借阅.借书证号=读者.借书证号 B)图书.分类号=借阅.分类号 AND 借阅.借书证号=读者.借书证号 C)读者.编号=借阅.编号 AND 借阅.借书证号=读者.借书证号 D)图书.编号=借阅.编号 AND 借阅.书名=读者.书名解:本题是多表联接查询。“借阅”作为纽带表,通过公共属性“编号”和“借书证号”分别与“图书”表及“读者”表联接,从而是实现三个表联接。答:54 A,上一页,下一页,返回,【例54】只有满足联接条件的记录才包含在查询结果中的联接是( )。A)左联 B)右联 C)内联 D)全联解:内联(INNER JOIN或JOIN)是从相关
22、的两个表中选取满足联接条件的记录,联接成新的记录作为查询输出。内联与全联是互补关系。 左联(LEFT JOIN)是从表1中选取所有记录,按联接条件与表2中相关的记录联接成新的记录作为查询输出,若表2中不存在相关联的记录,则查询输出中相应字段的值为.NULL.。 右联(RIGHT JOIN)是从表2中选取所有记录,按联接条件与表1中相关的记录联接成新的记录作为查询输出,若表1中不存在相关联的记录,则查询输出中相应字段的值为.NULL.。 全联(FULL JOIN)是从相关的两表中选取所有记录,按联接条件联接成新的记录作为查询输出,若表1或表2中不存在相关联的记录,则查询输出中相应字段的值为.NULL.。答:58 C,上一页,下一页,返回,【例55】在SQL中,删除视图的命令是( )。A)DROP VIEW B)CREATE VIEW AS C)DROP TABLE D)DROP INDEX 解:视图将是从数据库表中派生出来的虚拟表,不存在修改结构的问题,视图可以删除。删除视图的命令格式是:DROP VIEW 。B)是创建视图的命令。C)是删除表文件的命令。在SQL中,删除索引的命令是:ALTER TABLE DROP PRIMARY KEY|UNIQUE TAG 答:59 A,上一页,返回,