SQL语言不需要告诉计算机“如何”做,只需要描述清楚用户要“做什么”,系统就自动完成全部工作。
(3) SQL语言非常简洁。
虽然SQL语言功能强,但仅有为数不多的几条命令,语法也非常简单。 (4) SQL以统一的语法结构对待不同的工作方式。
SQL语言可以直接在VFP命令窗口中以人机交互方式使用,也可以嵌入到程序设计语言中执行
2.SQL语言的执行
SQL语句可以在命令窗口中执行,也可以作为查询或视图(的内容)被使用,还可以在程序文件中被执行。
二、SQL的查询功能(考点)
1.SQL的核心是查询功能,SQL的查询命令也称作SELECT命令,它的常用语法格式如下: SELECT [ALL|DISTINCT] [TOP 表达式] <目标列表达式>; FROM [数据库名!]<表名>
&& 说明要查询的数据
&& 说明数据来源 INNER|LEFT[OUTER]|RIGHT[OUTER]|FULL[OUTER]] && 说明与其他表联接方式
&& 说明查询的条件 && 对查询结果进行分组 && 限定分组满足的条件 && 对查询结果进行排序
JOIN 数据库名!表名 ON <联接条件>] [WHERE <条件表达式> ] [GROUP BY <分组依据>] [HAVING <条件表达式>] [UNION [ALL]??]
[ORDER BY <排序依据>[ASC|DESC]]
&& 对多个查询结果进行合并 [[INTO ARRAY 数组名| INTO CURSOR 表名|INTO DBF 表名|INTO TABLE 表名] [说明:]
(1) ALL:输出所有查询结果;
(2) DISTINCT:重复的结果只显示一次;(考点)
(3) TOP 表达式:输出结果中的前几条记录,或输出结果的百分之多少的记录;
例如:TOP 3(输出前三条)、TOP 30 PERCENT(输出结果数的30%) (4) 目标列表达式:(输出各列间用“,”隔开。)
? 字段:可以是某个表的字段,如果是两个表都的字段,要把该字段所在表也表示出,
例如:xs.xh, xm, xb
? 合计函数表达式:count( )、sum( )、avg( )、max( )、min( )(考点)
? Count( ):学生人数,教师人数,课程门数等这些是将表中的行进行数数,用Count(*) 没有条件限制;
? Sum( ):对某个数值型字段求和,如对cj求和得到总成绩,对xsl求和得到总销售量,对xf求和得到总学分,对jbgz求和得到工资总额;sum(cj)、sum(xsl)、sum(jbgz) ? Avg( ) :对某个数值型字段求平均,如对cj求和得到平均成绩;avg(cj) ? Max( )、Min( ):对某个字段求最大值,最小值(一般指数值型的字段) ? 其它函数表达式:例如:left(xh,2) as 年级,year(date( ))-year(csrq) as 年龄等 ? 字符串常量:在输出结果中该列将以字符串的内容为结果(考点)
? 说明:一般要给这些函数指定列标题,用AS短语实现,例如:sum(cj.cj) as 总分 (5) FROM子句:需要指出的是“FROM”单词不要书写错了,经常有些同学书写成“FORM”,因为它同
26
|[TO FILE 文件名 [ADDITIVE]|TO PRINTER [PROMPT]|TO SCREEN]] && 查询输出去向
南天内部资料,严谨出售
样是关键字,表示表单,在命令窗口中显示蓝色。
(6) 数据库!表名:如果数据源是非当前数据库中的表,则就用这种方式表示。数据源可以是表,也
可以是视图,但不能是查询。(考点) (7) 联接类型:
? INNER [OUTER] JOIN :内联接(以两张表相同字段的交集为输出结果)
? LEFT[OUTER] JOIN:左联接(以两张表相同字段中左边表字段的集合为输出结果) ? RIGHT[OUTER] JOIN:由联接(以两张表相同字段中右边表字段的集合为输出结果) ? FULL[OUTER] JOIN :完全联接 (以两张表相同字段的并集为输出结果)
(8) ON 联接条件:这是经常考到的,当基于多表查询,一定要建立联接条件,书写很简单:首先将
两张表的名字写在“=”的左右两边,同时别忘了表和字段的“.”,然后将两张表的公共字段写在两边的“.”后面,这样就书写好了。例如:js.gh=rk.gh, kc.kcdh=cj.kcdh。要了解“=”等号两边是具有相等值的两个字段,千万不要随便写,例如:xs.xm=cj.cj,这是错的。 (9) 联接条件书写另一种位置:也可以不放在FROM子句里,放在WHERE子句中,直接将联接条件写
在其中,注意:这里没有指出联接类型,指内联接,不能指出其他联接类型,如果需要指定的话,必须要将联接条件放在FROM子句中。
(10) WHERE 条件表达式:是对数据源的筛选记录,如果条件表达式是SELECT-SQL命令,则该查询
就是子查询。(考点)
(11) GROUP BY 分组依据:该子句是用于分组的。
? 为什么要分组呢?分组就将某个字段具有相同值的记录分别放在不同的组中,然后对每组记录进
行“压缩”,也就是统计个数、求和、求平均值、求最大、最小值,结果每组记录就被压缩成了一条记录。需要注意的是分组依据不同,分的组的个数不同,由于每组对应一条记录,最后输出结果的记录数也不同(考点分析输出结果的记录个数)。
? 如果不能深刻理解上面内容,可以用简单的方法:只要记住:“在前面只要用到合计函数中的任何
一种,百分之九十一定要分组。”,
? 有一种情况例外,统计是要对所有记录进行,例如统计全校所有学生的人数,不需要统计每个系
每个专业的人数,则是将所有学生记录分成一组,统计个数,所以不要分组。(课本P139例16)。 ? 那么具体对应分组的简单方法:分组的依据要看用到合计函数的字段的定语,例如要统计学生表
中各系各专业的人数,人数要用到合计函数count( ),那么人数前面的定语有两个“各系”和“各专业”,因此就依次先按系分组,再按专业分组,因此分组依据为:xdh,zydh。多个分组依据用“,”隔开。
? 在书写分组依据时,如果是很长的表达式,可以用数字代替,这里的数字代表着查询结果中输出
的第几列。
(12) HAVING 表达式:满足条件,对查询结果进行筛选,要和WHERE子句区分开来(考点)。一般是
计算的字段,例如总分、工资总额、人数等。
(13) ORDER BY 排序依据:对查询结果进行排序,排序依据也可以用数字代替,多个排序依据用“,”
隔开。ASC:升序,DESC:降序,省略为升序。
(14) UNION:将两个查询合并在一起,即将两个查询结果并在一起(课本P139例16)(考点)。与前
面提到子查询是有区别的。子查询是:外查询是基于某个查询的结果为筛选条件再进行查询,不是两个查询结果的合并。如果使用了UNION子句,要对最终查询结果排序,则需要使用1个ORDER BY 子句。(考点) (15) INTO 子句:
27
查询去向 数组 临时表 表文件 (16) TO 子句:
查询去向 ASCII文件 打印机 VFP主窗口 子句 INTO ARRAY 数组名 INTO CURSOR 表名 INTO DBF|TABLE 表名 子句 TO FILE 文件名 TO PRINTER TO SCREEN 2.例子:以上语句是必须要掌握的SQL SELECT命令,下面分别举例介绍各种用法。以下例子基于如下的数据库表: 学生表XS.DBF结构:
字段名 xh xm xb zydh ximing jg csrq zp 类型 C C C C C C D G 宽度 8 6 2 6 18 10 小数位数 字段含义 学号 姓名 性别 专业代号 系科名称 籍贯 出生日期 照片 成绩表CJ.DBF结构:
字段名 xh kcdh cj 类型 C C N 宽度 8 4 3 小数位数 字段含义 学号 课程代号 成绩 课程表KC.DBF结构:
字段名 kcdh kcm kss bxk xf (1)简单查询
简单查询有2种,一种由SELECT和FROM短语构成“无条件查询”;另一种由SELECT和FROM以及WHERE短语构成“条件查询”。
28
类型 C C N L N 宽度 4 18 2 1 小数位数 字段含义 课程代号 课程名 课时数 必修课 学分
南天内部资料,严谨出售
【例】查询学生表中所有字段
SELECT * FROM XS
注意:* 是通配符,代表全部字段列表。 【例】查询学生表中所有学号和姓名
SELECT xh ,xm FROM XS
注意:字段名之间要用英文逗号分隔。 【例】从学生表中查询所有系科名称,要求不重复显示相同的系科名称
SELECT DISTINCT ximing FROM XS
注意:如果要去掉重复值只需使用DISTINCT短语。 【例】从成绩表中查询所有成绩>85分的学号
SELECT DISTINCT xh FROM cj WHERE CJ.cj>85 注意:简单条件查询要使用WHERE短语。 (2)简单联接查询
联接是关系的基本操作之一,简单联接查询是一种基于多个关系(往往是基于多张表)的查询。 【例】查询至少有一门课程成绩大于85的学生姓名
SELECT xm FROM XS,CJ WHERE CJ.cj>85 and XS.xh=CJ.xh 注意:(1)这里所要查询的数据分别来自“学生表”和“成绩表”;
(2)如果在FROM之后有2个表,那么这2个表之间一定有一种关系,如本例中的
XS表和CJ表都有“学号”字段,否则无法构成检索表达式; (3) 本例中“XS.xh=CJ.xh”是联接条件;
(4)当FROM后面有多个关系含有相同的字段名时,必须用表别名前缀直接指
明字段所属的表,如“XS.xh” 。
(3)几个特殊运算符
在SQL语句的WHERE子句后的联接条件,除了使用VFP的关系表达式和逻辑表达式外,还可以使用几个特殊运算符:[NOT]IN/[NOT]BETWEEN?AND?/[NOT]LIKE 【例】在学生表中查询所有计算机系的学生,不要其他的学生信息。
SELECT * FROM XS WHERE ximing LIKE “计算机系”
注意:可以使用NOT运算符来设计否定条件,如查询所有非计算机系的学生 SELECT * FROM XS WHERE NOT (ximing LIKE “计算机系”) 【例】在学生表中查询所有姓李的学生。
SELECT * FROM XS WHERE xm LIKE “李%” 注意:%匹配多个任意符号,_匹配一个任意符号。 【例】查询所有成绩在80和90之间的学生。
SELECT XS.xm FROM XS,CJ WHERE (CJ.cj BETWEEN 80 AND 90) AND (XS.xh=CJ.xh)
(4)计算查询
【例】计算英语课程的平均成绩、最高成绩、最低成绩。
SELECT kcm,AVG(CJ.cj) as “平均成绩”, MAX(CJ.cj) as “最高成绩”; , MIN(CJ.cj) as “最低成绩” FROM CJ,KC ; WHERE kcm= “英语” and CJ.kcdh = KC.kcdh
注意:这里没有用分组,是因为题目只要统计英语课程的,就一组记录(英语课程),不需要其他课程的,只要将英语课程的记录筛选出来,然后统计即可,不需要分组。如果改成计算各门课程
29
的平均成绩、最高成绩、最低成绩,就需要分组了。 【例】统计学生表中专业数目。
SELECT COUNT( DISTINCT zydh ) FROM XS
注意:COUNT 函数的参数可以是字段名,也可用*号来通配,如COUNT(*)。
加DISTINCT是为了排除相同的项。
(5)分组查询
SQL不仅具有一般的检索功能,还可直接对检索结果进行计算,用于计算的函数有: COUNT()——计数
SUM()——求和
AVG()——求平均值
MAX()——求最大值
MIN()——求最小值
SQL提供的计算函数可以对满足条件的记录进行各种计算,这些函数还可以从一组值中计算出一个汇总信息,通常和GROUP BY分组子句配合使用,完成特定的查询。 【例】统计每门课程的名称、平均成绩。
SELECT KC.kcm,AVG(CJ.cj) as “平均成绩” FROM KC,CJ ; GROUP BY CJ.kcdh WHERE CJ.kcdh = KC.kcdh 【例】查询最少选修3门课程的学生姓名。
SELECT XS.xm FROM XS WHERE xh IN ;
(select xh from CJ group by xh HAVING count(*)>=3)
注意:HAVING子句的作用是指定查询的结果所满足的条件,通常和GROUP BY配合使用;
而WHERE子句的作用是指定参与查询的表中的数据所满足的条件。
【例】按系科统计各专业男、女生人数、系科名称、性别。
SELECT XS.ximing,XS.xb,COUNT(XS.*) as “学生人数” FROM XS ; GROUP BY XS.ximing , XS.zydh , XS.xb
注意:题目要求按系科、专业、性别进行统计,因此应按系科、专业、性别来分组;
分组表达式若有多个,用逗号分隔。
(6)排序
SQL使用ORDER BY进行排序的操作,默认是升序排序。 【例】按学号升序、成绩降序检索学生成绩。
SELECT * FROM CJ ORDER BY xh ASC , cj DESC
(7)查询输出去向
FROM子句中的INTO与TO选项用于指定查询结果的输出去向,默认为浏览窗口。INTO选项有3种输出去向:ARRAY <数组>、CURSOR <临时表>、TABLE|DBF <表名>;TO选项也有3种输出去向:文件、屏幕、打印机。
【例】查询学生名单,并生成永久表STUDENT.DBF。
SELECT * FROM XS INTO DBF STUDENT
【例】查询前10名学生名单,将查询结果保存在文本文件TMP.TXT中。
SELECT TOP 10 * FROM XS TO FILE TMP ADDITIVE 注意:TOP 10表示只取前10条记录。
ADDITIVE选项表示以追加方式在文件尾部添加数据,否则为覆盖方式。 【例】查询前10%的学生名单,将查询结果保存在临时表TEMP中。
SELECT TOP 10 PERCENT * FROM XS INTO CURSOR TEMP 注意:TOP 10 PERCENT表示只取全部记录的前10%条记录。
30