VF实验7-16参考答案
实验7
检索所有供应商的全部信息。
select*from 供应商号 检索所有员工的工号和姓名信息。
select 职工号,姓名 from 职工 查询目前哪几个仓库目前有员工分配(使用单表查询)。 Select distinct仓库号 from 职工 检索工资最高的前两名员工姓名。
Select top 2姓名 from 职工 order by 工资 desc 检索工资大于1230元的员工姓名。
select 姓名 from 职工 where 工资>1230 检索不在WH1仓库工作的员工姓名和工资。
SELECT 姓名,工资 from 职工 where 仓库号=!\"WH1\" && <>,#也可表不等于 检索生成于2001年7月的所有订单信息。
SELECT*from 订购单 where 订购日期 BETWEEN{^2010-07-01} AND {^2010-07-31} 检索2001年7月发给供应商S4的订单信息。
SELECT * from 订购单 where 供应商号=\"S4\" AND 订购日期 BETWEEN{^2010-07-01} AND {^2010-07-31}
实验8
检索所有“周”姓员工的信息。
Select * from 职工 where 姓名 like \"周%\" 检索所有订购单信息并将其按照订购日期升序排序。
Select * from 订购单 order by 订购日期 && asc 升序 desc 降序 检索所有订购单信息并将其按照订购日期降序排序。 Select * from 订购单 order by 订购日期 desc 检索工资最高的前三名员工姓名。
Select top 3 姓名 from 职工 order by 工资 desc 检索工资水平在所有员工中排名前50%的员工姓名。
Select top 50 percent 姓名 from 职工 order by 工资 desc
检索职工信息并将其按所在仓库号降序排序,同一仓库的员工按工资升序排序。 Select * from 职工 order by 仓库号 desc,工资 asc 检索订购单中供应商号不为空值的订单号。
Select 订购单号 from 订购单 where 供应商号 is not null 检索订购单中供应商号和订购日期均为空值的订单号。
Select 订购单号 from 订购单 where 供应商号 is null and 订购日期 is null 检索在WH1仓库工作的员工总数。
Select count(职工号 )from 职工 where 仓库号= \"WH1\" 检索每月支付给员工的工资总数。
Select sum(工资) from 职工 检索“周”姓员工工资的平均值。
Select avg(工资) from 职工 where 姓名 like \"周%\" 检索所有员工的最高工资。
Select max(工资) from 职工 检索WH2仓库员工的最低工资。
Select min(工资) from 职工 where 仓库号= \"WH2\" 统计各仓库员工的人数,以实现以下结果:
select 仓库号 ,count(*) as 人数 from 职工 group by 仓库号 统计各仓库员工的最高工资。
select 仓库号 ,max(工资) from 职工 group by 仓库号 统计有职工2人或2人以上的仓库的平均工资。
select 仓库号 ,avg(工资) from 职工 group by 仓库号 having count(*)>=2
实验9
统计各员工所在的城市(分别采用INNER JOIN和WHERE两种形式实现内连接)。
select 姓名,城市 FROM 职工 inner JOIN 仓库 ON 职工.仓库号=仓库.仓库号 select 姓名,城市 FROM 职工 , 仓库 where 职工.仓库号=仓库.仓库号 &&如果没有检索答案,请用命令 reindex 重建索引后再检索 统计各订购单所对应的供应商名,若无供应商名则留空。
select 订购单号,供应商名 FROM 订购单 left Join 供应商 on 订购单.供应商号=供应商.供应商号 列出员工的上下级隶属关系(自连接),以实现以下结果:
select S.姓名 上级 , P.姓名 下级 from 职工 S,职工 P WHERE S.职工号=P.上级主管 以连接和嵌套两种查询方式检索在北京工作的员工信息。
select * FROM 职工 Join 仓库 on 职工.仓库号=仓库.仓库号 and 城市=\"北京\" select * FROM 职工 ,仓库 WHERE 职工.仓库号=仓库.仓库号 and 城市=\"北京\" Select * from 职工 WHERE 仓库号 in (select 仓库号 from 仓库 where 城市=\"北京\") 以连接和嵌套两种查询方式检索01年6月后有接到订单的供应商信息。
SELECT * FROM 供应商 Join 订购单 on 订购单.供应商号=供应商.供应商号 and 订购日期>{^2001-6-30}
SELECT * FROM 供应商 ,订购单 where 订购单.供应商号=供应商.供应商号 and 订购日期>{^2001-6-30}
检索工作的仓库面积小于300平米的员工信息(分别利用in、any、exists三种形式查
询)。
select * from 职工 where 仓库号 in (select 仓库号 from 仓库 where 职工.仓库号=仓库.仓库号 and 面积<300)
select * from 职工 where 仓库号 = any (select 仓库号 from 仓库 where 职工.仓库号=仓库.仓库号 and 面积<300) select * from 职工 where exists (select *from 仓库 where 职工.仓库号=仓库.仓库号 and 面积<300) 检索各供应商所接到的最新订单信息(如下图,利用嵌套查询)
select * from 订购单 S where 订购日期 =(select max(订购日期)from 订购单 P where S.供应商号=P.供应商号)
实验10
使用SQL语言复制”仓库”表到名为”tmp”的临时表。
select * from 仓库 into cursor temp
将订购单信息按订购日期排序并输出至“output”表。
select * from 订购单 into cursor output order by 订购日期 && order by 订购日期 into table output
统计各供应商分别接到的订单数量并输出至文件D:\\1.txt中。
select 供应商号, coun(订购单号) from 订购单 grou by 供应商号 To FILE D:\\1.txt 用UNION语句检索哪些城市设有该公司的供应商或仓库。
select 城市 FROM 仓库 UNION SELECT 地址 from 供应商
使用INSERT语句的两种形式,分别在职工表中添加名为”张三”和”李四”的两条记录,其工号为E9和E10,其余信息设为空值。
Insert into 职工 values (\"E9\张三\ Insert into 职工(职工号,姓名,仓库号,工资,上级主管) values (\"E10\李四\
将所有职工的工资增加500元。
Update 职工 set 工资=工资+500
将订单’OR91’的订购日期改为空值。
Update 订购单 set 订购日期=null where 订购单号=”OR91”
将职工刘勇所工作的仓库面积修改为300平方米。
UPDATE 仓库 set 面积=300 where 仓库号=(select 仓库号 from 职工 where 姓名=\"刘勇\" )
删除北京仓库中姓”刘”的员工。
Delete from 职工 where姓名 like \"刘%”\"and 仓库号=(select 仓库号 from 仓库 where 城市=\"北京\")
清空供应商表的所有记录。
Delete from 供应商
删除订购单表和供应商表。
Drop table 订购单
Drop table 供应商
使用Create命令创建订购单表和供应商表结构和相关联系(如下图),无需输入数据。
create table 供应商 ( 供应商号 C(5) PRIMARY key ,供应商名C(20) ,地址 C(20)) create table 订购单 (订购单号 N(8),职工号 N(8),供应商号 N(8) PRIMARY key,订购日期 D ,;
FOREIGN KEY 职工号 tag 职工号 reference 职工,;
FOREIGN KEY 供应商号 tag 供应商号 reference 供应商)
实验11
找出借书超过2本的读者,输出读者姓名及所借图书册数。
select 姓名 ,coun(书号) from 借书卡,借书记录 where 借书卡.卡号=借书记录.借书卡号 grou by 卡号 having coun(书号)>2
查询借阅了书号为9787020081639这本书的读者,输出姓名及班级。
Select 姓名,班级 from 借书卡 where 卡号 in (select 借书卡号 from 借书记录 where 书号 =9787020081639)
查询借阅了书名为《工业革命》这本书的读者,输出姓名及班级。
Select 姓名,班级 from 借书卡 Join 借书记录 on 借书卡.卡号=借书记录.借书卡号
Join 图书 on 借书记录.书号=图书.书号 and 书名=”工业革命”
查询书名包括\"觉醒\"关键词的图书,输出书号、书名、作者。
Select 书号,书名,作者 from 图书 where 书名 like “%觉醒%”
查询现有图书中价格最高的图书,输出书名及作者。
Select top 1 书名,作者 from 图书 order by 单价 desc
查询当前借了《工业革命》但没有借《猜火车》的读者,输出其借书卡号,并按卡号降序排序输出。
Select 借书卡号 from 借书记录 where 书号 in (select 书号 from 图书 where 书名=\"工业革命\" and 书名!=\"猜火车\") order by 借书卡号 desc
将\"法01\"班同学所借图书的还期都延长一周。
Update 借书记录 set 还书日期=还书日期+7 where 借书卡号 in (select 卡号 from 借书卡 where 班级 =”法01”)
从图书表中删除当前无人借阅的图书记录。
Delete from 图书 where 图书.书号 not in (select 书号 from 借书记录 ) ; pack
新增一条借书卡记录,卡号为A090112,姓名为刘烨,班级取空值。
Insert into 借书卡 (卡号,姓名,班级)values (A090112,刘烨,.null.)
若需要追加一个”书库”表(包含书库号、书库名、负责人三个字段,并与图书表存在联系),请写出建表SQL语句。
Create table 书库 (书库号 C(10) PRIMARY KEY
,书库名C(10),负责人 C(8) ); Alter table 图书 add FOREIGN KEY 所在书库 TAG 所在书库 REFERENCES 书库
使用ALTER语句为借书卡表新增一个字段”所属学院”,该字段允许取空值。
Alter table 借书卡 add 所属学院 null
使用ALTER语句为图书的库存册数字段加入域完整性约束,册数必须介于0-100否则报错。
Alter table 图书 alter 库存册数 set check ( 库存册数>=0 and 库存册数<=100 ) error \"库存册数不符!\"
使用ALTER语句删除借书卡的班级字段。
Alter table 借书卡 drop column 班级
使用ALTER语句重命名”借书卡”表的姓名字段为”读者姓名”。
Alter table 借书卡 drop column 班级
使用ALTER语句为当前数据库中的各表创建索引及其各表间的联系。【先运行“清理数据库”】
1: Alter table 借书记录 alter 借书卡号 C(10) references 借书卡
2: Alter table 借书记录 add FOREIGN KEY 借书卡号 TAG 借书卡号 REFERENCES 借书卡
3: Alter table 借书记录 alter 书号 N(15) references 图书 tag 书号
实验13
2、根据要求利用相应的系统函数写出命令,并在VFP中测试运行结果是否正确。
若系统中已有变量r=5,需要输出以r为半径的圆面积,
应使用 ?PI()*R*R 命令。
若系统中已有变量t= 345.678,希望输出其保留两位小数的四舍五入值,
应使用 ?ROUND(t,2) 命令。
若需要让计算机输出2010年2月2日、2007年3月3日和1999年4月4日三个日期
的最大值,应使用 ?MAX({^2010-02-02},{^2007-03-03},{^1999-04-04}) 命令。
系统中已有变量a=” select * from db”,若需要将变量a的字母全部转换为大写并输出,
应使用 ?UPPER(a) 命令。
输入:A=”天行健,君子以自强不息” ,从 A中取出子串”自强不息”并输出,
应使用 ?RIGHT(A,8) 命令或 ?SUBSTR(A,15,8) 命令。
输入:A=”My E-Mail地址”,从 A中取出子串”E-M”并输出,
应使用 ?SUBSTR(A,4,3) 命令。
若需要输出字母”o”在字符串”Visual Foxpro”中第二次出现的字符位置,
应使用 ? AT(\"o\命令。
若需要使用函数将字符串” Visual Basic”中的”Basic”替换为”C++”并将结果输出,
应使用 ?STUFF(\"Visual Foxpro\命令。
若需要使用函数在字符串”Foxpro”前插入”Visual ” 并将结果输出,
应使用 ?STUFF(\"Foxpro\命令。
输出当前的系统时间,可使用 ?TIME() 命令。
输出今天系统日期中的月份数字,可使用 ?MONTH(DATE()) 命令。 输出当前系统日期中的小时数字,可使用 ?HOUR(DATETIME()) 命令。 若需要让计算机输出明年的年份,可使用 ?YEAR(DATE())+1 命令。 若需要将当前时间输出为 小时:分钟 的形式,忽略秒数(如12:30),
可使用 ?left (time(),5) 命令。
有一存储学生成绩的变量s,若希望成绩小于60时输出“不合格”,成绩60-90时输
出“合格”,成绩大于90分时输出“优秀”,可使用?iif(s<60,\"不合格\优秀\合格\")) 命令(利用IIF函数)。
实验14
根据用户输入的圆半径求出圆面积。
提示:1)清屏 2)使用INPUT接收用户输入的圆半径 3)计算圆半径并保存到一个变量 4)输出提示信息和该变量值。 clear
input \"请输入圆的半径 \" to r m=pi()*r^2
?\"圆的面积是: \"+str(m)
根据用户输入的教师出生日期查找并输出相应的教师信息。
提示:1)清屏 2)打开教师表 3)使用INPUT接收用户输入的日期值 4)使用LOCATE定位指针到指定记录 5)使用DISPLAY输出指针记录信息 clear use 教师
input \"请输入出生日期: \" to d
locate for 出生日期=d display
根据用户输入的学生姓名查找并输出相应的学生信息。
提示:1)清屏 2)打开学生表 3)使用ACCEPT接收用户输入文本 4)使用LOCATE定位指针到指定记录 5)使用DISPLAY输出指针记录信息 clear use 学生
accept \"请输入学生姓名: \" to n locate for 姓名=n display
根据用户输入的年份判断该年份是否为闰年。
提示:1)清屏 2)使用INPUT接收用户输入的年份数值 3)使用IF单语句判断该数值是否符合闰年的条件(可被400整除,或是可被4整除但不能被100整除),如果符合输出提示信息。 clear
input \"请输入年份: \" to y
if y%400==0 or (y%4==0 and y%100!=0) ?\"该年是闰年\" else
?\"该年是平年\" endif
根据用户输入的学生分数,判断该学生是不合格(<60分)、合格(60-90分)还是优秀(>90分)。(分别采用IF和CASE两种形式编写) clear
input \"请输入学生分数: \" to g if g<60
?\"该学生成绩不合格\" else
if g>90
?\"该学生成绩优秀\" else
?\"该学生成绩合格\" endif endif 方法二 clear
input \"请输入学生分数: \" to g do case case g<60
?\"该学生成绩不合格\" case g>90
?\"该学生成绩优秀\" otherwise
?\"该学生成绩合格\" endcase
根据用户输入的学生姓名,输出该学生的性别,若学生表中不存在该姓名的学生则显示“查无此人”。
提示:1)清屏 2)打开学生表 3)使用ACCEPT接收用户输入的学生姓名 4)使用LOCATE定位指针到符合条件的记录 5)使用FOUND()函数判断是否有找到记录,若无记录输出“查无此人”,若有记录则判断性别是否等于’男’,并输出判断结果。 clear use 学生
accept \"请输入学生姓名: \" to n locate for 姓名=n if found()
if 性别='男' ?\"该生是男生\" else
?\"该生是女生\" endif else
?\"查无此人\" endif
计算自然数1-100中的偶数总和并输出(分别使用WHILE和FOR两种循环形式)。 提示:参考课本P78例子。 clear sum=0 i=0
do while i<=100 sum=sum+i
i=i+2 enddo
?\"自然数1-100中的偶数总和为:\"+str(sum) 方法二 clear sum=0
for i=0 to 100 step 2 sum=sum+i endfor
?\"自然数1-100中的偶数总和为:\"+str(sum)
从键盘接收用户输入的5个数,输出其中的最大值。 提示:参考课本P81例子。 clear
input \"请输入一个数: \" to a store a to ma,mi
for i=2 to 5