《sql语言的应用》由会员分享,可在线阅读,更多相关《sql语言的应用(46页珍藏版)》请在金锄头文库上搜索。
1、Visual FoxPro,1,第六章,SQL语言的应用,Visual FoxPro,2,6.1 SQL语言概述 6.2 数据查询 6.3 数据定义 6.4 数据操纵,Visual FoxPro,3,20世纪80年代初,美国国家标准协会(ANSI)开始着手制定SQL标准。SQL标准的出台使SQL作为标准关系数据库语言的地位得到了加强。目前流行的关系数据库管理系统,如Qracle、Sybase、SQL Server、Visual FoxPro等都采用了SQL语言标准,而且很多数据库都对SQL语句进行了再开发和扩展。,6.1 SQL语言概述,Visual FoxPro,4,SQL语言的特点: (1
2、)SQL是一种一体化的语言。尽管设计SQL的最初目的是查询,数据查询也是其最重要的功能之一,但SQL决不仅仅是一个查询工具,它集数据定义、数据查询、数据操纵和数据控制功能于一体,可以独立完成数据库的全部操作。 (2)SQL语言是一种高度非过程化的语言。它没有必要一步步地告诉计算机“如何”去做,而只需要描述清楚用户要“做什么”,SQL语言就可以将要求交给系统,自动完成全部工作。 (3)SQL语言非常简洁。虽然SQL语言功能很强,但它只有为数不多的9条命令:CREATE、DROP、ALTER、SELECT、INSERT、UPDATE、DELETE、GRANT、REVOKE。另外SQL的语法也非常简
3、单,它很接近英语自然语言,因此容易学习和掌握。,Visual FoxPro,5,(4)SQL语言可以直接以命令方式交互使用,也可以嵌入到程序设计语言中以程序方式使用。现在很多数据库应用开发工具都将SQL语言直接融入到自身的语言之中,使用起来更方便,Visual FoxPro就是如此。这些使用方式为用户提供了灵活的选择余地。此外,尽管SQL的使用方式不同,但SQL语言的语法基本是一致的。 SQL只是一种建议标准,各种数据库产品中所实现的SQL在语法、功能等方面均略有差异,本章讲述Visual FoxPro 中SQL的语法、功能与应用。,Visual FoxPro,6,6.1 SQL数据查询定义,
4、查询在数据库和表中查找与给定条件匹配的数据,并由此生成新的关系或输出。在所有的语言中,基本通用SQL语句,Visual FoxPro,7,查询的基本用法和子句,参照表: 仓库表(仓库号 C,城市 C,面积 N) 职工表(仓库号 C,职工号 C,工资 N) 订购单表(职工号 C,供应商号 C,订货单号,订购日期) 基本语句一: SELECT:查询动词,说明要查找的数据,它可以是字段名,表达式和常量 FROM:确定数据的来源,指明表名或它的别名,可以是多个表,Visual FoxPro,8,查询的基本用法和子句,范例一: SELECT * FROM 职工 SELECT 仓库号,城市 FROM 仓库
5、表 ORDER BY 面积 DESC SELECT DISTINCT 供应商号 FROM 订购单表 SELECT * FROM 仓库表 WHERE 面积=380 SELECT A.仓库号,B.城市,B.职工号,B.工资; FROM 仓库表 A, 职工表 B ; WHERE A.仓库号=B.仓库号,Visual FoxPro,9,基本语句二: WHERE:说明查询记录的条件,两个表之间的联接条件,在数据库中的永久连接默认为当然的条件。 范例二: 求解:查询为S3供应商提供服务的仓库所在的城市 SELECT A.城市 ; FROM 仓库表 A,职工表 B,订购单表 C; WHERE A.仓库号=B
6、.仓库号 .AND. ; B.职工号=C.职工号 .and.C.供应商名=“S3” 问题:完成学生成绩的查询,,查询的基本用法和子句,Visual FoxPro,10,基本语句三: ORDER BY:对查询的结果排序 GROUP BY 组表达式1,:对查询结果进行分和分类汇总 HAVING 条件表达式:限定分组条件 范例三:成绩查询 SELECT * FROM 成绩 ORDER BY 成绩 DESC SELECT 学号,SUM(成绩)AS 合计 FROM 成绩; ORDER BY 合计 DESC; GROUP BY 学号 SELECT A.姓名,A.学号,SUM(B.成绩) AS 合计 FRO
7、M 学生 A,成绩 B; ORDER BY 合计 DESC; GROUP BY A.学号,查询的基本用法和子句,Visual FoxPro,11,查询的基本用法和子句,基本查询语句四: INTO 目标 | TO PRINTER | TO SCREEN | TO FILE_NAME 确定查询的去向:打印机,屏幕,表和目标(默认的是屏幕),目标可以是: ARRAY 数组名 CURSOR 临时表名 DBF(或TABLE) 表名 范例4: SELECT MAX(单价) INTO ARRAY A FROM SB SELECT 姓名,房间号,标准价格*天数 AS 实际房费; FROM 酒店管理 INTO
8、TABLE 结算,Visual FoxPro,12,综合分析: 假设有设备表SB和大修表DX,请分析以下SQL语句的功能: 基本表格:SB.DBF DX.DBF 范例5: SELECT SB.名称,SUM(DX.费用) AS 大修总费用 from SB,DX; WHERE SB.编号=DX.编号 .AND.LEFT(SB.编号,3)”038”; GROUP BY DX.编号; INTO TABLE 大修报表; ORDER BY 2,查询的基本用法和子句,Visual FoxPro,13,简单的计算功能: COUNT SUM AVG MAX MIN 范例6: sele 仓库号,count(dis
9、tinct 职工号) as 职工个数 ; from 职工 where 工资=1220; group by 仓库号,查询的基本用法和子句,Visual FoxPro,14,查询的基本用法和子句,嵌套查询: SELECT * FROM 成绩 WHERE 学号 IN ; (SELECT 学号 FROM 成绩 WHERE 成绩=60) 问题四:列出成绩高于平均的全部学生的清单,Visual FoxPro,15,例 列出全部学生名单。 例 列出所有学生姓名,去掉重名。,SELECT * FROM 学生,SELECT DISTINCT 姓名 AS 学生名单 FROM 学生,Visual FoxPro,16
10、,例 将所有的学生入学成绩四舍五入,只显示学号、姓名和入学成绩。 例 求出所有学生的入学成绩平均分。,SELECT 学号,姓名,ROUND(入学成绩,0) AS 入学成绩 FROM 学生,SELECT AVG(入学成绩) AS 入学成绩平均分 FROM 学生,Visual FoxPro,17,例 求出湖南学生入学成绩平均分。 例 列出非湖南籍的学生名单。,SELECT 籍贯,AVG(入学成绩) AS 入学成绩平均分 FROM 学生 WHERE 籍贯=湖南,SELECT 学号,姓名,籍贯 FROM 学生 WHERE 籍贯湖南 以上命令的功能等同于: SELECT 学号,姓名,籍贯 FROM 学生
11、 WHERE 籍贯!= 湖南 或SELECT 学号,姓名,籍贯 FROM 学生 WHERE NOT(籍贯=湖南),Visual FoxPro,18,例 列出江苏籍和贵州籍的学生名单。,SELECT 学号,姓名,籍贯 FROM 学生 WHERE 籍贯 IN (江苏,贵州) 以上命令的功能等同于: SELECT 学号,姓名,籍贯 FROM 学生 WHERE 籍贯=江苏 OR 籍贯=贵州,Visual FoxPro,19,例 列出入学成绩在560分到650分之间的学生名单。 例 列出所有的姓赵的学生名单。,SELECT 学号,姓名,入学成绩 FROM 学生 WHERE 入学成绩 BETWEEN 56
12、0 AND 650 在以上命令的功能等同于: SELECT 学号,姓名,专业 FROM 学生 WHERE 入学成绩=560 AND 入学成绩=650,SELECT 学号,姓名 FROM 学生 WHERE 姓名 LIKE 赵% 以上命令的功能等同于: SELECT 学号,姓名,专业 FROM 学生 WHERE 姓名=赵,Visual FoxPro,20,例 列出所有成绩为空值的学生学号和课程号。,SELECT 学号,课程号 FROM 选课 WHERE 成绩 IS NULL 在以上命令中,使用了运算符IS NULL,该运算符是 测试字段值是否为空值,在查询时用“字段名 IS NOTNULL” 的形
13、式,而不能写成“字段名=NULL”或“字段名!=NULL”。,Visual FoxPro,21,例 列出选修“数据库原理”的所有学生的学号。,SELECT 学号 FROM 选课 WHERE 课程号=; (SELECT 课程号 FROM 课程 WHERE 课程名=数据库原理) 上述SQL语句执行的是两个过程,首先在课程表中 找出“数据库原理”的课程号(比如“01001”),然后再 在选课表中找出课程号等于“01101”的记录,列出这些 记录的学号。,Visual FoxPro,22,例 列出选修“01101”课的学生,这些学生的成绩比选修“01102”课的最高成绩还要高的学生的学号和成绩。,SE
14、LECT 学号,成绩FROM 选课 WHERE 课程号=01102 AND成绩ALL (SELECT 成绩 FROM 选课 WHERE 课程号=01102) 该查询的含义是:先找出选修“01102”课的所有学生的成绩 (比如说结果为87和72),然后再在选修“01102”课的学生 中选出其成绩中高于选修“01102”课的所有成绩(即高于87 分)的那些学生。,Visual FoxPro,23,例 列出选修“数据库原理”或“软件工程”的所有学生的学号。,SELECT 学号 FROM 选课 WHERE 课程号 IN; (SELECT 课程号 FROM 课程 WHERE 课程名=数据库原理OR 课程
15、名=软件工程) IN是属于的意思。,Visual FoxPro,24,例 输出所有学生的成绩单,要求给出学号、姓名、课程号、课程名和成绩。,SELECT a.学号,a.姓名,b.课程号,c.课程名,b.成绩; FROM 学生 a,选课 b,课程 c; WHERE a.学号=b.学号 AND b.课程号=c.课程号,Visual FoxPro,25,例 列出男生的选课情况,要求列出学号、姓名、课程号、课程名、授课教师和学分数。,SELECT a.学号,a.姓名 AS 学生姓名,b.课程号,c.课程名, e.姓名 AS 教师姓名,c.学分 FROM 学生 a,选课 b, 课程 c,授课 d,教师
16、e; WHERE a.学号=b.学号 AND b.课程号=c.课程号 AND ; c.课程号=d.课程号 AND d.教师号=e.教师号 AND a.性别=“男”,Visual FoxPro,26,例 列出选修“01102”课的学生中,期末成绩大于学号为“200109”的学生该门课成绩的那些的学号及其成绩。 SELECT a.学号,a.成绩 FROM 选课a,选课b; WHERE a.成绩b.成绩 AND a.课程号=b.课程号AND b.课程号=01102AND b.学号=190101,Visual FoxPro,27,联接查询 联接分为内部联接和外部联接。外部联接又分为左外联接、右外联接和全外联接。 1. 内部联接(Inner Join) 实际上,上面例子全部都是内部联接。所谓内部联接是指所有满足联接条件的记录都包含在查询结果中。 例 列出少数民族学生的学号、课程号及成绩。 SELECT a.学号,b.课程号,b.成绩 FROM 学生 a,选课 b; WHERE a.学号=