中级SQL考前复习资料.docx
- 文档编号:15204581
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:34
- 大小:27.79KB
中级SQL考前复习资料.docx
《中级SQL考前复习资料.docx》由会员分享,可在线阅读,更多相关《中级SQL考前复习资料.docx(34页珍藏版)》请在冰点文库上搜索。
中级SQL考前复习资料
2008年中级SQL考前复习
(高银培训)
准备工作:
做以下题目所需的数据库在“做题目所需数据库文件.rar”内,请先解压到桌面上,再将各题的数据库文件分别复制到C:
\Datas目录下。
一、SQL语句
SQL--StructuredQueryLanguage是一种用来建立、维护及查询关系数据库的命令语言。
考试时要求生成一个查询文件(T.QPR),它的内容是一条SELECT命令:
SELECT<输出字段表>;
FROM<源数据表名1>[INNERJOIN<源数据表名2>ON<联接条件>];
WHERE<记录筛选条件>;
GROUPBY<分组关键字段名1>[,<分组关键字段名2>…];
HAVING<分组筛选条件>;
ORDERBY<第1排序项>[DESC][,<第2排序项>[DESC]]…;
INTOTABLE<查询结果数据表名>
其中必不可少的部分是:
SELECT<输出字段表>FROM<源数据表名>其余部分可根据查询要求而设定,也可以省略。
二、要解决的问题
问1:
题目给出两个表,是否都打开?
问2:
输出“一条记录,一个字段”怎么操作?
问3:
何时要“分组”?
问4:
怎样区分“分组过滤条件”和“记录筛选条件”?
问5:
何时用自连接?
何时用无条件自连接?
问6:
何时用两个联结条件?
三、SQL内部过程与操作
1、SQL内部过程:
查询时,常常包含两个表(也可以一个表),应先设置一个联接条件,将这两个表组合起来,形成一个内部的临时表,用于存放中间结果,这个临时表包含每个源表的所有字段。
联接时,系统自动将这两个表在两个不同的工作区内打开,并将其中一个表设为当前表。
当前表的记录指针首先指向第一条记录,然后检查另一表的每条记录是否符合联接条件,如果符合,则在临时表中生成一条记录,然后,当前表的记录指针指到下一条记录,重复,直至当前表结束。
2、操作:
进入VFP,在命令窗口中输入如下命令:
RUNCOPYC:
\DATAS\*.DBFC:
(先将C:
\DATAS中数据表文件复制到C盘当前目录)
ModiQuerA:
\T.QPR(在A盘根目录下建立SQL查询T.QPR)
四、常见类型与各类型举例
中级考试可能会出现以下类型:
1、不分组
2、分组
3、整个表作为一个组
4、提供两个表,只用一个表
5、两个联接条件
6、自联接(有条件)
7、自联接(无条件)
8、修改SQL
三、各类型举例
1、不分组
(1)、2006/01/No.6
在C:
\DATAS中有数据表文件T1.DBF,记录了一批学生的成绩,每位学生对应一条记录,结构为:
XMC8(姓名)
YWN30(语文)
SXN30(数学)
WYN30(外语)
请先把表文件复制到C盘当前目录,然后建立T.QPR文件,运行此文件能在磁盘上生成数据表文件T4.DBF,每位学生对应一条记录,其中包含总分(数学、语文、外语三门课之和,但如果外语成绩超过90分,则外语成绩乘1.1加入总分)超过260分的学生,结构为1个字段:
姓名(提示:
在记录筛选时,可以采用两种条件“或”的形式,分别针对外语不超过、超过90分的两种情况)。
解:
SELECTT1.xm;
FROMt1;
WHERET1.wy>90;
ANDT1.yw+T1.sx+T1.wy*1.1>260;
OR(T1.wy<=90;
ANDT1.yw+T1.sx+T1.wy>260);
INTOTABLEt4.dbf
(2)、2006/09/No.4
子目录C:
\DATAS中有数据表文件T1.DBF和T2.DBF,分别存放着一批学生第一、第二两个学期的选修课考试成绩,结构为:
XHC6(学号)
KCMCC2(课程名称)
DF1N30(期中成绩)
DF2N30(期末成绩)
每个记录对应一位学生的一门课程,一人可同时选修多门课程,有的课程只需学一个学期,有的课程需学两个学期(以下简称“大课”),大课每人最多选一门。
先把表文件复制到当前目录,然后建立T.QPR,运行此文件能在磁盘上生成数据表T4.DBF,选修大课的每位学生对应一条记录,结构为3个字段,第1个是学号,第2个是大课名称,第3个是该课程的最后成绩(计算方法为:
两个学期的期中成绩各15%,期末成绩各35%,加起来)。
解:
SELECTT1.xh,T1.kcmc,(T1.df1+T2.df1)*0.15+(T1.df2+T2.df2)*0.35;
FROMt1INNERJOINt2;
ONT1.xh=T2.xh;
WHERET1.kcmc=t2.kcmc;
INTOTABLEt4.dbf
(3)、2006/09/No.5
在C:
\DATAS中有数据表文件T1.DBF,存放着各位学生选修的课程(学生姓名互不相同),结构为:
XXKCC8(选修课程)
XSXMC8(学生姓名)
先把表文件复制到C盘当前目录,然后建立T.QPR文件,运行此文件能在磁盘上生成数据表T4.DBF,和LXH选修同一门课程的每位学生(不包括LXH本人)对应一个记录,结构为2个字段:
第1个是选修课程,第2个是学生姓名,按学生姓名从小到大排序(提示:
可采用有连接条件的自联接)。
解:
SELECTT1.xxkc,T1_a.xsxm;
FROMt1INNERJOINt1T1_a;
ONT1.xxkc=T1_a.xxkc;
WHERET1.xsxm="LXH";
ANDT1_a.xsxm<>"LXH";
INTOTABLEt4.dbf
二、分组(以下各题必需分组)
(1)、2006/01/No.2
在C:
\DATAS中有数据表文件T1,结构为:
XHC4(学号)
XMC4(姓名)
NJC1(年级)
BHC1(班号)
CJN62(成绩)
其中存放着所有学生的基本数据,每位学生对应一条记录,学生的学号互不相同,但不同年级可有相同的班号。
先把表文件复制到C盘当前目录,然后建立T.QPR文件,运行此文件能在磁盘上生成数据表T4.DBF,有人成绩合格(成绩不小于60)的每个班级对应一条记录,结构为3个字段,第1个是年级,第2个是班号,第3个是该班级最低的合格成绩,按最低合格成绩从高到低排序。
解:
SELECTT1.nj,T1.bh,MIN(T1.cj);
FROMt1;
WHERET1.cj>=60;
GROUPBYT1.nj,T1.bh;
ORDEBY3DESC
INTOTABLEt4.dbf
(2)、2006/01/No.5
在C:
\DATAS中有数据表文件T1,结构为:
XHC4(学号)
XMC4(姓名)
NJC1(年级)
BHC1(班号)
CJN62(成绩)
其中存放着所有学生的基本数据,每位学生对应一条记录,学生的学号互不相同,但不同年级可有相同的班号。
先把表文件复制到C盘当前目录,然后建立T.QPR文件,运行此文件能在磁盘上生成数据表T4.DBF,有人成绩合格(成绩不小于60)的每个班级对应一条记录,结构为3个字段,第1个是年级,第2个是班号,第3个是该班级所有学生的最低成绩。
解:
SELECTT1.nj,T1.bh,MIN(T1.cj);
FROMt1;
GROUPBYT1.nj,T1.bh;
HAVINGMAX(T1.cj)>=60;
INTOTABLEt4.dbf
(3)、2006/07/No.1
在C:
\DATAS中有数据表文件T1,存放某天各个医院的门诊信息,结构是:
YBKHC12(医保卡号)
BRXMC8(病人姓名)
YYMCC12(医院名称)
MZKSC8(门诊科室)
一位病人可以到多个科就诊,不同病人的姓名会相同,但医保卡号不会相同。
先把表文件复制到C盘当前目录,然后建立T.QPR文件,运行此文件能在磁盘上生成数据表T4.DBF,其中包含2条记录,分别是这天内科(NK)和外科(WK)的就诊人数,结构为2个字段,第1个是门诊科室、第2个是就诊人数。
解:
SELECTT1.mzks,COUNT(T1.ybkh);
FROMt1;
WHERET1.mzks="NK";
OR(T1.mzks="WK");
GROUPBYT1.mzks;
INTOTABLEt4.dbf
(4)、2006/07/No.5
在C:
\DATAS中有数据表文件T1,存放某天各个医院的门诊信息,结构是:
YBKHC12(医保卡号)
BRXMC8(病人姓名)
YYMCC12(医院名称)
MZKSC8(门诊科室)
一位病人可以到多个科就诊,不同病人的姓名会相同,但医保卡号不会相同。
先把表文件复制到C盘当前目录,然后建立T.QPR文件,运行此文件能在磁盘上生成数据表T4.DBF,在2个或更多科室就诊的每位病人对应一条记录,结构为2个字段:
第1个是医保卡号、第2个是病人姓名。
解:
SELECTT1.ybkh,T1.brxm;
FROMt1;
GROUPBYT1.yymc,T1.ybkh;
HAVINGCOUNT(*)>=2;
INTOTABLEt4.dbf
(5)、2006/09/No.1
在C:
\DATAS中有数据表文件T1,其中存放着各位学生的学习情况,每位学生有若干条记录,分别对应不同的课程,结构是:
BJDMC2(班级代码)
BNXHC2(班内序号)
KCMC8(课程名)
CJN30(成绩)
先把表文件复制到C盘当前目录,然后建立T.QPR文件,运行此文件能在磁盘上生成数据表T4.DBF,每门有人及格(成绩不低于60)的课程对应一条记录,结构为2个字段,第1个是课程名,第2个是学习该课程的学生数(包括不及格的学生)。
解:
SELECTT1.kcm,COUNT(*);
FROMt1;
GROUPBYT1.kcm;
HAVINGMAX(T1.cj)>=60;
INTOTABLEt4.dbf
(6)、2006/09/No.6
在C:
\DATAS中有数据表文件T1,其中存放某次考核的数据,每场的每名考生一个记录,结构是:
CCC1(场次)
KHZHC8(考核证号)
CJN30(成绩)
先把表文件复制到C盘当前目录,然后建立T.QPR文件,运行此文件能在磁盘上生成数据表T4.DBF,每位参加一场以上考核(考核证号相同),并且既有及格成绩(不低于60)又有不及格成绩的考生对应一个记录,结构仅1个字段:
考核证号。
牢记:
每场成绩都及格:
Min(CJ)>=60
每场成绩都不及格:
Max(CJ)<60
至少有一场不及格:
Min(CJ)<60
至少有一场及格:
Max(CJ)>=60
既有及格、又有不及格:
Max(CJ)>=60andMin(CJ)<60
解:
SELECTT1.khzh;
FROMt1;
GROUPBYT1.khzh;
HAVINGMAX(T1.cj)>=60;
ANDMIN(T1.cj)<60);
INTOTABLEt4.dbf
补充1:
每位参加一场以上考核(考核证号相同),并且每场成绩都既不低于50又不满60的考生对应一个记录,结构仅1个字段:
考核证号。
解:
SELECTT1.khzh;
FROMt1;
GROUPBYT1.khzh;
HAVINGCOUNT(*)>1;
ANDMAX(T1.cj)<60;
ANDMIN(T1.cj)>=50;
INTOTABLEt4.dbf
补充2:
每位只参加一场考核(考核证号相同)并且及格(不低于60)的考生对应一个记录,结构仅1个字段:
考核证号。
解:
SELECTT1.khzh;
FROMt1;
GROUPBYT1.khzh;
HAVINGCOUNT(*)=1;
ANDT1.cj>=60;
INTOTABLEt4.dbf
补充3:
每场考核对应一个记录,结构为两个字段:
第一个是场次,第二个是该场的合格人数(不必考虑无人合格的特殊情况)。
解:
seleT1.cc,count(*);
fromt1;
wheret1.cj>=60;
groupbyt1.cc;
intotablet4.dbf
补充4:
至少参加2场考核,既有低于60的成绩,又有不低于60的成绩,结构为3个字段:
第一个是考核证号,第二个是参加考核场数,第三个是最高成绩。
解:
selectt1.khzh,count(*),MAX(cj);
fromt1;
groupbyt1.khzh;
havingcount(*)>=2;
andmin(cj)<60;
andmax(cj)>=60;
intotablet4.dbf
补充5:
只输出一条记录,结构为3个字段:
第一个是参加考核的总人次,第二个是平均成绩,第三个是最高成绩。
(此题类型属于整个表作为一个组)
解:
selectcount(*),avg(cj),MAX(cj);
fromt1;
intotablet4.dbf
补充6:
输出3条记录,分别对应最高的3个成绩(假定最高的4个成绩各不相同),结构为2各字段:
第一个是考核证号,第二个是成绩(提示使用自连接,此题类型属于自连接)。
解:
SELECTT1.khzh,T1.cj;
FROMt1INNERJOINt1T1_a;
ONT1.cj<=T1_a.cj;
GROUPBYT1.cj;
HAVINGCOUNT(*)<=3;
INTOTABLEt4.dbf
补充7:
每种出现过的成绩对应一个记录,结构为2个字段:
第1个是成绩,第2个是得到这一成绩的人次,按成绩从高到低排序。
解:
SELECTT1.cj,COUNT(*);
FROMt1;
GROUPBYT1.cj;
ORDERBYT1.cjDESC;
INTOTABLEt4.dbf
补充8:
同一考生可能参加多场考核,在各场考核中使用相同的考核证号。
先把表文件复制到C盘当前目录,然后建立T.qpr文件,运行此文件能在磁盘上生成数据表T4.dbf,其中的记录对应这样的考生:
既有低于60的成绩,又有不低于60的成绩,结构为3个字段:
第1个是考核证号,第2个是参加考核场数,第3个是最高成绩。
2007/09/No.3
解:
SELECTT1.khzh,COUNT(*),MAX(T1.cj),MIN(T1.cj);
FROMt1;
GROUPBYT1.khzh;
HAVINGMIN(T1.cj)<60;
ANDMAX(T1.cj)>=60;
INTOTABLEt4.dbf
(7)、2007/01/No.4
在C:
\DATAS中有数据表文件T1,存放着一批学生语文(YW)和数学(SX)课程的成绩,每位学生有两条记录,结构为:
XHC6(学号)
KCC2(课程)
CJN30(成绩)
或:
SELECTT1.xh;
FROMt1;
WHERET1.cj>=60;
GROUPBYT1.xh;
HAVINGCOUNT(*)=2;
INTOTABLEt4.dbf
先把表文件复制到当前目录,然后建立T.QPR,运行此文件能在磁盘上生成数据表T4.DBF,两门课程均及格(成绩不低于60)的学生对应一条记录,结构为1个字段:
学号。
(提示:
两门课程均及格,就是排除不及格的记录后,同一学号还有2条记录)
解:
SELECTT1.xh;
FROMt1;
GROUPBYT1.xh;
HAVINGMIN(T1.cj)>=60;
INTOTABLEt4.dbf
(8)、2007/07/No.1
在C:
\DATAS中有数据表文件T1和T2,结构是:
T1:
JSXMC6(教师姓名)
BJDMC2(班级代码)
SRKCC8(所任课程)
T2:
XHC4(学号)
XSXMC6(学生姓名)
KCC8(课程)
CJN30(成绩)
T1中存放着教师所任课程、班级的基本情况,每个班级的每门课程对应一条记录;T2中存放着各位学生的学习情况,每位学生有若干条记录。
先把表文件复制到C盘当前目录,然后建立T.QPR文件,运行此文件能在磁盘上生成数据表T4.DBF,课程数多于2门的每个班级对应1个记录,结构为1个字段:
班级代码。
解:
SELECTT1.bjdm;
FROMt2INNERJOINt1;
ONSUBSTR(T2.xh,1,2)=T1.bjdm;
GROUPBYT1.bjdm;
HAVINGCNT(DISTINCTT2.kc)>2;
INTOTABLEt4.dbf
(9)、2007/07/No.6
在C:
\DATAS中有2个数据表文件T1和T2,结构是:
T1:
KHZHC8(考核证号)
CCC1(场次)
T2:
KHZHC8(考核证号)
DFN30(得分)
两表中各记录的KHZH一一对应,每场考试都有考生及格(得分不低于60)。
先把表文件复制到C盘当前目录,再建立T.QPR文件,运行此文件能在磁盘上生成数据表T4.DBF,每场考试对应一个记录,结构为2个字段,第一个是场次,第二个是该场的及格考生人数。
解:
SELECTT1.cc,COUNT(*);
FROMt1INNERJOINt2;
ONT1.khzh=T2.khzh;
WHERET2.df>=60;
GROUPBYT1.cc;
INTOTABLEt4.dbf
(10)、在C:
\DATAS中有数据表文件T1,T2,结构为:
T1:
KCHC2(课程号)
KCMC6(课程名)
XXKCC2(先修课程号)
XFN10(学分)
T2:
XHC2(学号)
KCHC2(课程号)
CJN30(成绩)
T1中的每个记录对应一门课程,XXKC字段是学习这门课程必须的基础课程号(例如,KCH为国为民78的记录,XXKC为32,表示只有32号课程成绩不低于60的学生才能选修78号课程)。
T2中记录着学生已经学习过的课程情况。
先把表文件复制到C盘当前目录,然后建立T.QPR文件,运行此文件能在磁盘上生成数据表T4.DBF,其中是有资格学习2号或3号课程的学生名单,结构为2个字段,第1个是课程号,第2个是学生学号。
解:
SELECTT1.KCH,T2.XH;
FROMT1.INNERJOINT2;
ONT1.XXKC=T2.KCH;
WHERET2.CJ>=60;
ANDT1.KCHIN(“2”,“3”);
INTOTABLET4.DBF
(11)、在C:
\DATAS中有数据表文件T1.DBF,结构是:
ZKZHC4(准考证号)
KSXMC8(考生姓名)
KSKMC8(考试科目)
CJN30(成绩)
不同学生可能同名.每名学生有2个记录,分别保存主科成绩,辅科成绩(KSKM分别是“ZK”,“FK”)。
录取的要求是两科的总成绩不低于120,并且至少有一科成绩不低于70。
先把表文件复制到当前目录,然后建立T.QPR文件,运行此文件能在磁盘上生成数据表T4.DBF,每位达到录取要求的学生对应一条记录,结构为2个字段:
第1个是准考证号,第2个是两科的总成绩。
解:
SELECTT1.ZKZH,SUM(T1.CJ);
FROMT1;
GROUPBYT1.ZKZH;
HAVINGSUM(T1.CJ)>=120;
ANDMAX(T1.CJ)>=70;
INTOTABLET4.DBF
(12)、在C:
\DATAS中有数据表文件T1.DBF,存放着某校所有学生的基本数据,每位学生对应一条记录,学生的姓名互不相同,结构为:
XMC4(姓名)
BHC1(班号)
CJN62(成绩)
成绩不低于本人所在班级平均成绩,是成绩较好;成绩低于本人所在班级平均成绩的百分之八十,是成绩较差。
先把表文件复制到当前目录,然后建立T.QPR,运行此文件能在磁盘上生成数据表T4.DBF,每位成绩较好或成绩较差的学生对应一条记录,结构为4个字段,第1个是姓名,第2个是班号,第3个是成绩,第4个是该学生所在班级的平均成绩(提示:
可考虑采用自联接)。
解:
SELECTT1.*,AVG(T1_a.cj);
FROMt1INNERJOINT1_a;
ONT1.bh=T1_a.bh;
GROUPBYT1.xm;
HAVINGT1.cj>=AVG(T1_A.CJ);
OR(T1.cj<0.8*AVG(T1_A.CJ);
INTOTABLEt4.dbf
(13)、在C:
\DATAS中有数据表文件T1.DBF,T1的结构为:
NJC2(年级)
BHC2(班号)
YFC2(月份)
PBJGC1(评比结果)
T1中存放着各个班级本学期若干次黑板报评比结果,评比结果分成“a”、“b”、“c”、“d”四个等级。
用SQL建立T.QPR文件,运行此文件能在磁盘上生成数据表T4.DBF,每次评比都获得“a”级的班级对应一条记录,结构为2个字段,第一个是年级,第二个是班号。
(提示:
字符也能比较大小)
解:
SELECTT1.nj,T1.bh;
FROMt1;
GROUPBYT1.nj,T1.bh;
HAVINGMAX(T1.pbjg)="a";
ANDMIN(T1.pbjg)="a";
INTOTABLEt4.dbf
三、整个表作为一个组(在SQL中如只需输出一条记录,则可在不分组的情况下用统计函数即把整个表作为一个组)
(1)、2006/07/No.3
在C:
\DATAS中有数据表文件T1,每个记录对应一位考生的一场考核,结构为:
KHZHC8(考核证号)
CCC1(场次)
CJN30(成绩)
先把表文件复制到C盘当前目录,然后建立T.QPR文件,运行此文件能在磁盘上生成数据表T4.DBF,其中只有1个记录,结构为3个字段:
第1个是参加考核的总人次,第2个是平均成绩,第3个是最高成绩。
解:
SELECTCOUNT(*),AVG(T1.cj),MAX(T1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中级 SQL 考前 复习资料