Transcript 4.3 SELECT

4.3 SELECT-SQL语句
4.3.1 概述
SQL(Structured Query Language,结
构化查询语句)是美国国家标准局ANSI确认的
关系数据库语言标准。Visual FoxPro支持
SQL,它使用Rushmore技术来优化性能,通常
一个SQL命令可以代替多个Visual Foxpro命令
来完成一项操作。在VFP中,尽可能采用SQL命
令来代替一般的VFP命令。
VFP中支持的SQL命令







CREATE TABLE-SQL
CREATE CURSOR-SQL,创建一个临时表
ALTER TABLE-SQL
INSERT-SQL
UPDATE-SQL
DELETE-SQL
SELECT-SQL

复习
1.使用CREATE TABLE-SQL命令创建表结构
例如:创建学生表
CREATE TABLE JS(GH C(5),XM C(8),XB C(2),;
XDH C(2),GL N(2,0),CSRQ D,JBGZ N(7,2),JL M)
2.使用ALTER TABLE-SQL命令修改表的结构
(添加字段)
ALTER TABLE JS ADD COLUMN Fax c(20) NULL
2.使用ALTER TABLE-SQL命令修改表的结构
(字段重命名)
例:ALTER TABLE js RENAME COLUNM jl TO jsjl
2.使用ALTER TABLE-SQL命令修改表的结构
(删除字段)
ALTER TABLE js DROP COLUMN jbgz
3.使用INSERT-SQL命令追加记录
INSERT INTO xscj(xh, cj) VALUES (“050412”,85.5)
4.UPDATE-SQL语句
UPDATE cj SET cj*1.05 WHERE cj>80
5.DELETE-SQL语句
DELETE FROM xscj WHERE cj<60
VFP中:
CLOSE TABLES ALL
USE xscj
DELETE FOR cj<60
4.3.2 SELECT-SQL 命令
1.命令格式
SELECT 表名1.字段名1[AS 标题名1],表名1.字段名2[AS 标题名2],…
FROM 数据库名!表名1[,数据库名!表名2][,数据库名!表名3]
[inner|LEFT [OUTER]|RIGHT[OUTER]|FULL[OUTER] JOIN
DatabaseName] Talbe Name [ON JoinCondition]
[TO FILE 文本文件名|INTO TABLE|INTO CURSOR 表文件名]
[WHERE 选定条件]
[GROUP BY 分组字段名] (字段名或数值表达式(备注、通用字段除外))
[HAVING 分组中的满足条件]
[ORDER BY 排序字段名1[ASC|DESC][,排序字段名2[ASC|DESC]…]]
4.3.3 SELECT-SQL应用举例
(以下表均在数据库example中),
1.基于单个表的查询示例
例1 基于教师表(表js.dbf),查询所有教师的
工号和姓名。
Select 表js.gh,表js.xm from
example!表js
1.基于单个表的查询示例
例2 基于学生表xs,查询学号以“03”开头的
学生情况,并保存到临时表TEMP中。
Select * from example!表xs where
like("03*",xh) into cursor temp
1.基于单个表的查询示例
例3 查询成绩表cj中课程代号为“03”的学
生的学号和成绩,且要求查询结果按成绩降
序排列。
select 表cj.xh,表cj.cj from example!表cj;
where kcdh='03' order by 2 desc
1.基于单个表的查询示例
例4 显示成绩表中各门成绩的课程代号
和最高分(GROUP BY子句),且按最高
分,从低到高排序(ORDER BY)。
select 表cj.kcdh,max(表cj.cj) as 最高分;
from example!表cj group by 1 order by 2 desc
1.基于单个表的查询示例
例5 显示成绩表中各门成绩的课程代号
和最高分,且把最高分大于85的,从低到
高排序(HAVING子句),结果显示前10
条记录(TOP nExpr[PERCENT])。
select top 10 表cj.kcdh,max(表cj.cj) as ;
最高分 from example!表cj group by ;
kcdh having 最高分>85 order by 最高分
1.基于单个表的查询示例
例6 查询各门考试成绩均在60分以上学生成
绩情况,要求输出学号和总成绩,且只输出总
成绩前30%的同学。
select top 30.00 percent 表cj.xh as 学号,;
sum(表cj.cj) as 总成绩 from example!表cj;
group by xh HAVING 表cj.cj>=60 order by xh
elect top 30.00 percent 表cj.xh as 学号,;
sum(表cj.cj) as 总成绩 from example!表cj where 表cj.cj>=60;
group by xh order by xh into cursor temp1
2.基于两个表的查询示例
例7 基于成绩表cj和学生表xs,查询有
不及格课程成绩的学生的学号和姓名,且
有多门课程不及格的学生只显示一次。
select distinct 表xs.xm,表cj.xh from;
example!表xs inner join example!表cj on;
表xs.xh=表cj.xh where 表cj.cj<60
2.子查询
例8 基于教师表js和任课表rk,查询已
担任课程的教师的姓名和系代号。
select 表js.xm,表js.xdh from example!;
表js where 表js.gh in (select 表rk.gh;
from example!表rk)
2.基于多个表的查询
例9 完善下列SELECT-SQL命令,其功能是基于XS
表和CJ表查询有两门或两门以上课程不及格的学生情况。
要求输出为XH、XM、选课门数和不及格门数,查询结
果按不及格门数排序,且将查询结果输出到打印机打印。
select 表xs.xh,表xs.xm,count(*) as 选课门数,;
sum(iif(表cj.cj<60,1,0)) as 不及格门数;
from example!表xs inner join 表cj on;
表xs.xh=表cj.xh group by 1 order by 4;
to printer(改错)
3.组合查询示例
例10 显示成绩表中及格学生人数和不及
格学生人数,输出字段为分数类型和人数。
select "及格 "AS 分数类型,count(*) as 人
数 from sjk!cj where cj.cj>=60;
union;
select "不及格" AS 分数类型,count(*) as
人数 from sjk!cj where cj.cj<60