>

SQL练习题完整,H5游戏开辟

- 编辑:www.bifa688.com -

SQL练习题完整,H5游戏开辟

H5游戏开荒:消灭星星

2018/01/25 · HTML5 · 游戏

原版的书文出处: 坑坑洼洼实验室   

「消灭星星」是一款很优良的「解决类游戏」,它的耍法非常的粗略:化解相连通的同色砖块。

必发88官网 1

H5游戏开垦:一笔画

2017/11/07 · HTML5 · 游戏

初稿出处: 坑坑洼洼实验室   

必发88官网 2

SQL 练习题答案

1. 游戏准绳

「消灭星星」存在多少个版本,不过它们的准则除了「关卡分值」有个别出入外,其余的平整都以一律的。作者介绍的本子的游戏法规整理如下:

1. 色砖遍及

  • 10 x 10 的表格
  • 5种颜色 —— 红、绿、蓝,黄,紫
  • 每类色砖个数在钦命区间内私自
  • 5类色砖在 10 x 10 表格中随便布满

2. 免去法则

三个或五个以上同色砖块相连通就是可被解除的砖头。

3. 分值准绳

  • 免去总分值 = n * n * 5
  • 奖赏总分值 = 两千 – n * n * 20

「n」表示砖块数量。上边是「总」分值的法规,还应该有「单」个砖块的分值准绳:

  • 排除砖块得分值 = 10 * i 5
  • 剩余砖块扣分值 = 40 * i 20

「i」表示砖块的索引值(从 0 最先)。轻易地说,单个砖块「得分值」和「扣分值」是二个等差数列。

4. 关卡分值

关卡分值 = 一千 (level – 1) * 两千;「level」即近期关卡数。

5. 过关条件

  • 可免除色块海市蜃楼
  • 总共分值 >= 当前关卡分值

上边五个规格还要创制游戏才得以过得去。

H5游戏开辟:一笔画

by leeenx on 2017-11-02

一笔画是图论[科普](https://zh.wikipedia.org/wiki/图论)中二个显赫的主题素材,它起点于柯波德戈里察堡七桥主题素材[科普](https://zh.wikipedia.org/wiki/柯尼斯堡七桥问题)。化学家欧拉在她1736年发表的舆论《柯伊丽莎白港郭的七桥》中不仅缓和了七桥主题材料,也建议了一笔画定理,顺带解决了一笔画难点。用图论的术语来说,对于八个加以的连通图[科普](https://zh.wikipedia.org/wiki/连通图)留存一条恰好含有全体线段而且未有再度的路径,那条路线正是「一笔画」。

搜寻连通图那条路线的进程便是「一笔画」的游戏进程,如下:

必发88官网 3

 

2. MVC 设计形式

笔者此番又是运用了 MVC 方式来写「消灭星星」。星星「砖块」的数据结构与各样情状由 Model 达成,游戏的大意在 Model 中成就;View 映射 Model 的扭转并做出相应的一坐一起,它的职责重大是浮现动画;客户与游戏的交互由 Control 实现。

从逻辑规划上看,Model 相当重而View 与 Control 比较轻,可是,从代码量上看,View 非常重而 Model 与 Control 相对相当轻。

玩耍的落到实处

「一笔画」的贯彻不复杂,小编把达成进程分成两步:

  1. 底图绘制
  2. 互动绘制

「底图绘制」把连通图以「点线」的款式体现在画布上,是玩玩最轻巧完毕的部分;「交互绘制」是客商绘制解题路线的进度,那个历程会入眼是处理点与点动态成线的逻辑。

一、补充作业一、

 

设有三个关系:

               S(SNO, SNAME, AGE, SEX,Sdept)

               SC(SNO, CNO, GRADE)

               C(CNO, CNAME, TEACHER)

试用关系代数表达式表示下列查询:

 

1、查询学号为S3学生所学课程的课程名与任课教师名。

  

2、查询至少选修LIU老师所教课程中一门课的女生姓名。

3、查询WANG同学不学的课程的课程号。

4、查询至少选修两门课程的学生学号。

5、查询选修课程中包含LIU老师所教全部课程的学生学号。

补充作业二、

 

三个关系同上,试用SQL语言表示下列查询:

 

1、  查询门门课程都及格的学生的学号

方法1:

提示:根据学号分组,就得到每个学生所有的课程成绩,在某个学生这一组成绩里,如果他所有的课程成绩都大于60分则输出该组学生的学号

Select sno frome sc group by sno having(min(grade)>=60)

 

2、查询既有课程大于90分又有课程不及格的学生的学号

自身连接:

Select sno from sc where grade >90 and sno in (select sno from sc where grade<60)

 

3、查询平均分不及格的课程号和平均成绩

Select cno , avg(GRADE) from sc group by cno having avg(grade)<60

查询平均分及格的课程号和课程名

Select C.cno , Cname from SC,C where C.cno=SC.cno group by C.cno having avg(grade)>=60

 

4、找出至少选修了2号学生选修过的全部课程的学生号

提示:不存在这样的课程y,学生2选修了y,而学生x没有选。

SELECT DISTINCT Sno

   FROM SC as SCX

   WHERE NOT EXISTS

      (SELECT *

       FROM SC as SCY

       WHERE SCY.Sno =‘2’AND NOT EXISTS

                               (SELECT *

                                  FROM SC SCZ

                          WHERE SCZ.Sno=SCX.Sno AND SCZ.Cno=SCY.Cno))



5、求各门课程去掉一个最高分和最低分后的平均分

第一步,求所有成绩的平均分(去掉一个最高分和最低分)

select   avg(GRADE)   from   SC       where   GRADE   not   in (select   top   1   GRADE   from   SC order   by   GRADE)     and     GRADE   not   in (select   top   1   GRADE   from   SC order   by   GRADE   desc)  

第二步,将所有成绩按各门课程的课程号CNO分组

SELECT CNO avg(GRADE)   from   SC       where   GRADE   not   in (select   top  1  GRADE   from   SC order   by   GRADE)     and     GRADE   not   in (select   top  1  GRADE   from   SC order   by   GRADE   desc) group by CNO

3. Model

10 x 10 的表格用长度为 100 的数组可周密映射游戏的星星点点「砖块」。

[ R, R, G, G, B, B, Y, Y, P, P, R, R, G, G, B, B, Y, Y, P, P, R, R, G, G, B, B, Y, Y, P, P, R, R, G, G, B, B, Y, Y, P, P, R, R, G, G, B, B, Y, Y, P, P, R, R, G, G, B, B, Y, Y, P, P, R, R, G, G, B, B, Y, Y, P, P, R, R, G, G, B, B, Y, Y, P, P, R, R, G, G, B, B, Y, Y, P, P, R, R, G, G, B, B, Y, Y, P, P ]

1
2
3
4
5
6
7
8
9
10
11
12
[
R, R, G, G, B, B, Y, Y, P, P,
R, R, G, G, B, B, Y, Y, P, P,
R, R, G, G, B, B, Y, Y, P, P,
R, R, G, G, B, B, Y, Y, P, P,
R, R, G, G, B, B, Y, Y, P, P,
R, R, G, G, B, B, Y, Y, P, P,
R, R, G, G, B, B, Y, Y, P, P,
R, R, G, G, B, B, Y, Y, P, P,
R, R, G, G, B, B, Y, Y, P, P,
R, R, G, G, B, B, Y, Y, P, P
]

宝马X3 – 玛瑙红,G – 海蓝,B – 青绿,Y – 青色,P – 孔雀蓝。Model 的主干职务是以下五个:

  • 变化砖墙
  • 排除砖块 (生成砖块分值)
  • 抓牢砖墙
  • 破除残砖 (生成奖赏分值)

底图绘制

「一笔画」是多关卡的游戏情势,我决定把关卡(连通图)的定制以二个配备接口的样式对外揭发。对外暴光关卡接口要求有一套描述连通图形状的正儿八经,而在笔者前面有多少个采取:

  • 点记法
  • 线记法

举个连通图 —— 五角星为例来讲一下那多个选项。

必发88官网 4

点记法如下:

JavaScript

levels: [ // 当前关卡 { name: "五角星", coords: [ {x: Ax, y: Ay}, {x: Bx, y: By}, {x: Cx, y: Cy}, {x: Dx, y: Dy}, {x: Ex, y: Ey}, {x: Ax, y: Ay} ] } ... ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
levels: [
// 当前关卡
{
name: "五角星",
coords: [
{x: Ax, y: Ay},
{x: Bx, y: By},
{x: Cx, y: Cy},
{x: Dx, y: Dy},
{x: Ex, y: Ey},
{x: Ax, y: Ay}
]
}
...
]

线记法如下:

JavaScript

levels: [ // 当前关卡 { name: "五角星", lines: [ {x1: Ax, y1: Ay, x2: Bx, y2: By}, {x1: Bx, y1: By, x2: Cx, y2: Cy}, {x1: Cx, y1: Cy, x2: Dx, y2: Dy}, {x1: Dx, y1: Dy, x2: Ex, y2: Ey}, {x1: Ex, y1: Ey, x2: Ax, y2: Ay} ] } ]

1
2
3
4
5
6
7
8
9
10
11
12
13
levels: [
// 当前关卡
{
name: "五角星",
lines: [
{x1: Ax, y1: Ay, x2: Bx, y2: By},
{x1: Bx, y1: By, x2: Cx, y2: Cy},
{x1: Cx, y1: Cy, x2: Dx, y2: Dy},
{x1: Dx, y1: Dy, x2: Ex, y2: Ey},
{x1: Ex, y1: Ey, x2: Ax, y2: Ay}
]
}
]

「点记法」记录关卡通过海关的三个答案,即端点要按自然的相继贮存到数组 coords中,它是有序性的记录。「线记法」通过两点描述连通图的线条,它是冬辰的笔录。「点记法」最大的优势是表现更轻便,但它必得记录一个通过海关答案,作者只是关卡的搬运工不是关卡成立者,所以作者最后挑选了「线记法」。:)

 

3.1 生成砖墙

砖墙分两步生成:

  • 色砖数量分配
  • 制服色砖

理论上,能够将 100 个格子能够均分到 5 类颜色,然而小编玩过的「消灭星星」都不使用均分政策。通过解析六款「消灭星星」,其实能够发现一个原理 —— 「色砖之间的多寡差在一个定点的距离内」。

若是把守旧意义上的均分称作「完全均分」,那么「消灭星星」的分红是一种在均分线上下波动的「不完全均分」。

必发88官网 5

作者把地点的「不完全均分」称作「波动均分」,算法的切切实实贯彻可以参见「流离转徙均分算法」。

「打垮色砖」其实便是将数组乱序的进度,作者推荐使用「 费雪耶兹乱序算法」。

以下是伪代码的完结:

JavaScript

// 波动均分色砖 waveaverage(5, 4, 4).forEach( // tiles 即色墙数组 (count, clr) => tiles.concat(generateTiles(count, clr)); ); // 打败色砖 shuffle(tiles);

1
2
3
4
5
6
7
// 波动均分色砖
waveaverage(5, 4, 4).forEach(
// tiles 即色墙数组
(count, clr) => tiles.concat(generateTiles(count, clr));
);
// 打散色砖
shuffle(tiles);

互动绘制

在画布上绘制路线,从视觉上正是「选取或三番五次连通图端点」的经过,那些进度须要减轻2个难点:

  • 手指下是或不是有端点
  • 当选点到待选中式糕点时期是不是成线

搜集连通图端点的坐标,再监听手指滑过的坐标能够知晓「手指下是不是有一点点」。以下伪代码是搜集端点坐标:

JavaScript

// 端点坐标新闻 let coords = []; lines.forEach(({x1, y1, x2, y2}) => { // (x1, y1) 在 coords 数组官样文章 if(!isExist(x1, y1)) coords.push([x1, y1]); // (x2, y2) 在 coords 数组不设有 if(!isExist(x2, y2)) coords.push([x2, y2]); });

1
2
3
4
5
6
7
8
// 端点坐标信息
let coords = [];
lines.forEach(({x1, y1, x2, y2}) => {
// (x1, y1) 在 coords 数组不存在
if(!isExist(x1, y1)) coords.push([x1, y1]);
// (x2, y2) 在 coords 数组不存在
if(!isExist(x2, y2)) coords.push([x2, y2]);
});

以下伪代码是监听手指滑动:

JavaScript

easel.addEventListener("touchmove", e => { let x0 = e.targetTouches[0].pageX, y0 = e.targetTouches[0].pageY; // 端点半径 ------ 取连通图端点半径的2倍,进步活动端体验 let r = radius * 2; for(let [x, y] of coords){ if(Math.sqrt(Math.pow(x - x0, 2) Math.pow(y - y0), 2) <= r){ // 手指下有端点,推断能无法连线 if(canConnect(x, y)) { // todo } break; } } })

1
2
3
4
5
6
7
8
9
10
11
12
13
14
easel.addEventListener("touchmove", e => {
let x0 = e.targetTouches[0].pageX, y0 = e.targetTouches[0].pageY;
// 端点半径 ------ 取连通图端点半径的2倍,提升移动端体验
let r = radius * 2;
for(let [x, y] of coords){
if(Math.sqrt(Math.pow(x - x0, 2) Math.pow(y - y0), 2) <= r){
// 手指下有端点,判断能否连线
if(canConnect(x, y)) {
// todo
}
break;
}
}
})

在未绘制任何线段或端点在此之前,手指滑过的放肆端点都会被视作「一笔画」的初步点;在绘制了线段(或有选中式点心)后,手指滑过的端点能不可能与选中式茶食串连成线段须求依附现成基准实行判别。

必发88官网 6

上海教室,点A与点B可总是成线段,而点A与点C不可能三回九转。笔者把「能够与钦点端点连接成线段的端点称作有效连接点」。连通图端点的管用连接点从连通图的线条中提取:

JavaScript

coords.forEach(coord => { // 有效连接点(坐标)挂载在端点坐标下 coord.validCoords = []; lines.forEach(({x1, y1, x2, y2}) => { // 坐标是当前线段的起源 if(coord.x === x1 && coord.y === y1) { coord.validCoords.push([x2, y2]); } // 坐标是现阶段线段的极限 else if(coord.x === x2 && coord.y === y2) { coord.validCoords.push([x1, y1]); } }) })

1
2
3
4
5
6
7
8
9
10
11
12
13
14
coords.forEach(coord => {
// 有效连接点(坐标)挂载在端点坐标下
coord.validCoords = [];
lines.forEach(({x1, y1, x2, y2}) => {
// 坐标是当前线段的起点
if(coord.x === x1 && coord.y === y1) {
coord.validCoords.push([x2, y2]);
}
// 坐标是当前线段的终点
else if(coord.x === x2 && coord.y === y2) {
coord.validCoords.push([x1, y1]);
}
})
})

But…有效连接点只好决断四个点是或不是为底图的线条,那只是八个静态的参考,在实际上的「交互绘制」中,会碰到以下景况:

必发88官网 7
如上海教室,AB已串连成线段,当前选中式茶食B的管事连接点是 A 与 C。AB 已经一而再成线,假若 BA 也串连成线段,那么线段就再一次了,所以此时 BA 不可能成线,唯有 AC 技艺成线。

对选中式茶食来说,它的可行连接点有二种:

  • 与选中式茶食「成线的有用连接点」
  • 与选中式茶食「未成线的得力连接点」

内部「未成线的平价连接点」技术插足「交互绘制」,并且它是动态的。

必发88官网 8

回头本节内容初步提的多个难题「手指下是或不是有端点」 与 「选中式茶食到待选中式茶食之间是或不是成线」,其实可统一为一个主题素材:手指下是或不是留存「未成线的管事连接点」。只须把监听手指滑动遍历的数组由连通图全数的端点坐标 coords 替换为当前选中式点心的「未成线的卓有效能连接点」就可以。

时至前些天「一笔画」的重大功用已经完成。能够超过体验一下:

必发88官网 9

 1、查询7号课程未有考试战表的上学的儿童学号。

3.2 消除砖块

「化解砖块」的平整很简短 —— 周边相连通同样色即能够裁撤

必发88官网 10
前五个结合符合「相邻相连通同样色即能够祛除」,所以它们能够被扫除;第五个组成就算「相邻同样色」但是不「相连接」所以它不可能被铲除。

「化解砖块」的同不常间有一个根本的天职:生成砖块对应的分值。在「游戏法规」中,作者曾经提供了相应的数学公式:「消除砖块得分值 = 10 * i 5」。

「化解砖块」算法完毕如下:

JavaScript

function clean(tile) { let count = 1; let sameTiles = searchSameTiles(tile); if(sameTiles.length > 0) { deleteTile(tile); while(true) { let nextSameTiles = []; sameTiles.forEach(tile => { nextSameTiles.push(...searchSameTiles(tile)); makeScore( count * 10 5); // 标识当前分值 deleteTile(tile); // 删除砖块 }); // 清除完毕,跳出循环 if(nextSameTiles.length === 0) break; else { sameTiles = nextSameTiles; } } } }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function clean(tile) {
let count = 1;
let sameTiles = searchSameTiles(tile);
if(sameTiles.length > 0) {
deleteTile(tile);
while(true) {
let nextSameTiles = [];
sameTiles.forEach(tile => {
nextSameTiles.push(...searchSameTiles(tile));
makeScore( count * 10 5); // 标记当前分值
deleteTile(tile); // 删除砖块
});
// 清除完成,跳出循环
if(nextSameTiles.length === 0) break;
else {
sameTiles = nextSameTiles;
}
}
}
}

免除的算法使用「递归」逻辑上会清晰一些,可是「递归」在浏览器上轻便「栈溢出」,所以小编未有选择「递归」落成。

机关识图

小编在录加入关贸总协定组织卡配置时,开掘贰个7条边以上的对接图很轻巧录错或录重线段。笔者在企图是不是开采四个自动识别图形的插件,终究「一笔画」的图形是有法则的几何图形。

必发88官网 11

上边的卡子「底图」,一眼就能够识出多个颜色:

  • 白底
  • 端点颜色
  • 线条颜色

还要那二种颜色在「底图」的面积大小顺序是:白底 > 线段颜色 > 端点颜色。底图的「搜罗色值表算法」非常粗略,如下伪代码:

JavaScript

let imageData = ctx.getImageData(); let data = imageData.data; // 色值表 let clrs = new Map(); for(let i = 0, len = data.length; i < len; i = 4) { let [r, g, b, a] = [data[i], data[i 1], data[i 2], data[i 3]]; let key = `rgba(${r}, ${g}, ${b}, ${a})`; let value = clrs.get(key) || {r, g, b, a, count: 0}; clrs.has(key) ? value.count : clrs.set(rgba, {r, g, b, a, count}); }

1
2
3
4
5
6
7
8
9
10
let imageData = ctx.getImageData();
let data = imageData.data;
// 色值表
let clrs = new Map();
for(let i = 0, len = data.length; i < len; i = 4) {
let [r, g, b, a] = [data[i], data[i 1], data[i 2], data[i 3]];
let key = `rgba(${r}, ${g}, ${b}, ${a})`;
let value = clrs.get(key) || {r, g, b, a, count: 0};
clrs.has(key) ? value.count : clrs.set(rgba, {r, g, b, a, count});
}

对此连通图来讲,只要把端点识别出来,连通图的大约也就出来了。

    Select sno fromsc where cno='7' and grade is null

3.3 抓实砖墙

砖墙在去掉了一些砖头后,会现出空洞,此时内需对墙体实行做实:

向下夯实 向左夯实 向左下夯实(先下后左)

一种高效的落到实处方案是,每一回「化解砖块」后直接遍历砖墙数组(10×10数组)再把空洞坚实,伪代码表示如下:

JavaScript

for(let row = 0; row < 10; row) { for(let col = 0; col < 10; col) { if(isEmpty(row, col)) { // 水平方向(向左)抓牢if(isEmptyCol(col)) { tampRow(col); } // 垂直方向(向下)抓牢 else { tampCol(col); } break; } } }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for(let row = 0; row < 10; row) {
for(let col = 0; col < 10; col) {
if(isEmpty(row, col)) {
// 水平方向(向左)夯实
if(isEmptyCol(col)) {
tampRow(col);
}
// 垂直方向(向下)夯实
else {
tampCol(col);
}
break;
}
}
}

But… 为了加强多少个虚无对一张大数组实行全量遍历并非一种高效的算法。在作者看来影响「墙体抓实」作用的成分有:

  1. 平素空洞
  2. 砖块移动(坚实)

举目四望墙体数组的关键目标是「定位空洞」,然而否不扫描墙体数组直接「定位空洞」?

墙体的「空洞」是由于「消除砖块」变成的,换种说法 —— 被拔除的砖块留下来的坑位就是墙体的抽象。在「消除砖块」的还要标志空洞的岗位,那样就毫无全量扫描墙体数组,伪代码如下:

JavaScript

function deleteTile(tile) { // 标志空洞 markHollow(tile.index); // 删除砖块逻辑 ... }

1
2
3
4
5
6
function deleteTile(tile) {
// 标记空洞
markHollow(tile.index);
// 删除砖块逻辑
...
}

在上面的压实动图,其实能够看来它的狠抓进度如下:

  1. 泛泛上方的砖头向下移动
  2. 空驶列车侧面的砖头向左移动

墙体在「压实」进度中,它的边界是实时在转移,如若「狠抓」不按实际边界进行扫描,会产生多余的空白扫描:

必发88官网 12

怎么样记录墙体的疆界?
把墙体拆分成叁个个单身的列,那么列最最上端的空白格片段就是墙体的「空白」,而别的非最上端的空白格片段即墙体的「空洞」。

必发88官网 13

小编利用一组「列集合」来陈诉墙体的边际并记录墙体的空洞,它的模子如下:

JavaScript

/* @ count - 列砖块数 @ start - 最上端行索引 @ end - 尾部行索引 @ pitCount - 坑数 @ topPit - 最最上部的坑 @ bottomPit - 最尾部的坑 */ let wall = [ {count, start, end, pitCount, topPit, bottomPit}, {count, start, end, pitCount, topPit, bottomPit}, ... ];

1
2
3
4
5
6
7
8
9
10
11
12
13
/*
@ count - 列砖块数
@ start - 顶部行索引
@ end - 底部行索引
@ pitCount - 坑数
@ topPit - 最顶部的坑
@ bottomPit - 最底部的坑
*/
let wall = [
{count, start, end, pitCount, topPit, bottomPit},
{count, start, end, pitCount, topPit, bottomPit},
...
];

以此模型能够描述墙体的多个细节:

  • 空列
  • 列的连天空洞
  • 列的非延续空洞
JavaScript

// 空列 if(count === 0) { ... } // 连续空洞 else if(bottomPit -
topPit   1 === pitCount) { ... } // 非连续空洞 else { ... }

<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<tbody>
<tr class="odd">
<td><div class="crayon-nums-content" style="font-size: 13px !important; line-height: 15px !important;">
<div class="crayon-num" data-line="crayon-5b8f3d2c2df29914802382-1">
1
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5b8f3d2c2df29914802382-2">
2
</div>
<div class="crayon-num" data-line="crayon-5b8f3d2c2df29914802382-3">
3
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5b8f3d2c2df29914802382-4">
4
</div>
<div class="crayon-num" data-line="crayon-5b8f3d2c2df29914802382-5">
5
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5b8f3d2c2df29914802382-6">
6
</div>
<div class="crayon-num" data-line="crayon-5b8f3d2c2df29914802382-7">
7
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5b8f3d2c2df29914802382-8">
8
</div>
<div class="crayon-num" data-line="crayon-5b8f3d2c2df29914802382-9">
9
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5b8f3d2c2df29914802382-10">
10
</div>
<div class="crayon-num" data-line="crayon-5b8f3d2c2df29914802382-11">
11
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5b8f3d2c2df29914802382-12">
12
</div>
</div></td>
<td><div class="crayon-pre" style="font-size: 13px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;">
<div id="crayon-5b8f3d2c2df29914802382-1" class="crayon-line">
// 空列
</div>
<div id="crayon-5b8f3d2c2df29914802382-2" class="crayon-line crayon-striped-line">
if(count === 0) { 
</div>
<div id="crayon-5b8f3d2c2df29914802382-3" class="crayon-line">
 ...
</div>
<div id="crayon-5b8f3d2c2df29914802382-4" class="crayon-line crayon-striped-line">
}
</div>
<div id="crayon-5b8f3d2c2df29914802382-5" class="crayon-line">
// 连续空洞
</div>
<div id="crayon-5b8f3d2c2df29914802382-6" class="crayon-line crayon-striped-line">
else if(bottomPit - topPit   1 === pitCount) { 
</div>
<div id="crayon-5b8f3d2c2df29914802382-7" class="crayon-line">
 ...
</div>
<div id="crayon-5b8f3d2c2df29914802382-8" class="crayon-line crayon-striped-line">
}
</div>
<div id="crayon-5b8f3d2c2df29914802382-9" class="crayon-line">
// 非连续空洞
</div>
<div id="crayon-5b8f3d2c2df29914802382-10" class="crayon-line crayon-striped-line">
else {
</div>
<div id="crayon-5b8f3d2c2df29914802382-11" class="crayon-line">
 ...
</div>
<div id="crayon-5b8f3d2c2df29914802382-12" class="crayon-line crayon-striped-line">
}
</div>
</div></td>
</tr>
</tbody>
</table>

砖块在消除后,映射到单个列上的空洞会有二种分布形态 —— 接二连三与非三番五次。

必发88官网 14

「一连空洞」与「非延续空洞」的抓牢进度如下:

必发88官网 15

实际上「空驶列车」放大于墙体上,也许有「空洞」类似的遍及形态 —— 接二连三与非延续。
必发88官网 16

它的狠抓进程与虚无类似,这里就不赘述了。

端点识别

辩解上,通过搜聚的「色值表」可以直接把端点的坐标志别出来。作者设计的「端点识别算法」分以下2步:

  1. 按像素扫描底图直到遇到「端点颜色」的像素,踏入第二步
  2. 从底图上解除端点并记下它的坐标,重临继续第一步

伪代码如下:

JavaScript

for(let i = 0, len = data.length; i < len; i = 4) { let [r, g, b, a] = [data[i], data[i 1], data[i 2], data[i 3]]; // 当前像素颜色属于端点 if(isBelongVertex(r, g, b, a)) { // 在 data 中清空端点 vertex = clearVertex(i); // 记录端点信息vertexes.push(vertext); } }

1
2
3
4
5
6
7
8
9
10
for(let i = 0, len = data.length; i < len; i = 4) {
let [r, g, b, a] = [data[i], data[i 1], data[i 2], data[i 3]];
// 当前像素颜色属于端点
if(isBelongVertex(r, g, b, a)) {
// 在 data 中清空端点
vertex = clearVertex(i);
// 记录端点信息
vertexes.push(vertext);
}
}

But… 上边的算法只可以跑无损图。作者在运用了一张手提式有线电话机截屏做测验的时候发掘,收罗到的「色值表」长度为 陆仟 !那直接产生端点和线条的色值无法直接拿走。

因而深入分析,能够窥见「色值表」里相当多色值都以类似的,也便是在原本的「采撷色值表算法」的底蕴上增添一个近似颜色过滤即能够找寻端点和线条的主色。伪代码完毕如下:

JavaScript

let lineColor = vertexColor = {count: 0}; for(let clr of clrs) { // 与底色左近,跳过 if(isBelongBackground(clr)) continue; // 线段是数量第二多的颜料,端点是第三多的颜料 if(clr.count > lineColor.count) { [vertexColor, lineColor] = [lineColor, clr] } }

1
2
3
4
5
6
7
8
9
let lineColor = vertexColor = {count: 0};
for(let clr of clrs) {
// 与底色相近,跳过
if(isBelongBackground(clr)) continue;
// 线段是数量第二多的颜色,端点是第三多的颜色
if(clr.count > lineColor.count) {
[vertexColor, lineColor] = [lineColor, clr]
}
}

取到端点的主色后,再跑一回「端点识别算法」后居识别出 203 个端点!那是怎么吧?

必发88官网 17

上海体育地方是扩充5倍后的底图局地,淡蓝端点的方圆和当中充斥着多量噪点(杂色块)。事实上在「端点识别」进度中,由于噪点的存在,把原来的端点被分解成十多个或数十二个小端点了,以下是跑过「端点识别算法」后的底图:

必发88官网 18

通过上海体育场合,可以直观地搜查捕获三个定论:识别出来的小端点只在对象(大)端点上汇聚分布,並且大端点范围内的小端点叠合交错。

设若把叠合交错的小端点归并成一个多边点,那么那一个大端点将不胜好像指标端点。小端点的统一伪代码如下:

JavaScript

for(let i = 0, len = vertexes.length; i < len - 1; i) { let vertexA = vertexes[i]; if(vertextA === undefined) continue; // 注意这里 j = 0 实际不是 j = i 1 for(let j = 0; j < len; j) { let vertexB = vertexes[j]; if(vertextB === undefined) continue; // 点A与点B有增大,点B合併到点A并剔除点B if(isCross(vertexA, vertexB)) { vertexA = merge(vertexA, vertexB); delete vertexA; } } }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
for(let i = 0, len = vertexes.length; i < len - 1; i) {
let vertexA = vertexes[i];
if(vertextA === undefined) continue;
// 注意这里 j = 0 而不是 j = i 1
for(let j = 0; j < len; j) {
let vertexB = vertexes[j];
if(vertextB === undefined) continue;
// 点A与点B有叠加,点B合并到点A并删除点B
if(isCross(vertexA, vertexB)) {
vertexA = merge(vertexA, vertexB);
delete vertexA;
}
}
}

加了小端点归并算法后,「端点识别」的正确度就上去了。经笔者本地质度量试已经足以 百分之百 识别有损的连结图了。

 

3.4 解决残砖

上一小节提到了「描述墙体的分界并记录墙体的架空」的「列会集」,小编是直接行使这么些「列集结」来消除残砖的,伪代码如下:

JavaScript

function clearAll() { let count = 0; for(let col = 0, len = this.wall.length; col < len; col) { let colInfo = this.wall[col]; for(let row = colInfo.start; row <= colInfo.end; row) { let tile = this.grid[row * this.col col]; tile.score = -20 - 40 * count ; // 标识奖赏分数 tile.removed = true; } } }

1
2
3
4
5
6
7
8
9
10
11
function clearAll() {
let count = 0;
for(let col = 0, len = this.wall.length;  col < len; col) {
let colInfo = this.wall[col];
for(let row = colInfo.start; row <= colInfo.end; row) {
let tile = this.grid[row * this.col col];
tile.score = -20 - 40 * count ; // 标记奖励分数
tile.removed = true;
}
}
}

线条识别

小编分三个步骤达成「线段识别」:

  1. 加以的五个端点连接成线,并征集连线上N个「样本点」;
  2. 遍历样本点像素,假若像素色值不等于线段色值则意味着这多少个端点之间空中楼阁线段

如何搜聚「样式点」是个难题,太密集会潜移默化属性;太疏松精准度不可能保险。

在小编前面有七个挑选:N 是常量;N 是变量。
假设 N === 5。局地提取「样式点」如下:

必发88官网 19

上航海用教室,会识别出三条线条:AB, BC 和 AC。而其实,AC不可能成线,它只是因为 AB 和 BC 视觉上共一线的结果。当然把 N 值向上升高能够减轻这一个主题素材,可是 N 作为常量的话,那么些常量的取量需求靠经验来判别,果然放任。

为了防止 AB 与 BC 同处一向线时 AC 被辨认成线段,其实很简短 —— 多个「样本点」的间隔小于或等于端点直径
假设 N = S / (2 * R),S 表示两点的相距,LX570代表端点半径。局地提取「样式点」如下:

必发88官网 20

如上图,成功地绕过了 AC。「线段识别算法」的伪代码达成如下:

JavaScript

for(let i = 0, len = vertexes.length; i < len - 1; i) { let {x: x1, y: y1} = vertexes[i]; for(let j = i 1; j < len; j) { let {x: x2, y: y2} = vertexes[j]; let S = Math.sqrt(Math.pow(x1 - x2, 2) Math.pow(y1 - y2, 2)); let N = S / (R * 2); let stepX = (x1 - x2) / N, stepY = (y1 - y2) / n; while(--N) { // 样本点不是线段色 if(!isBelongLine(x1 N * stepX, y1 N * stepY)) break; } // 样本点都合格 ---- 表示两点成线,保存 if(0 === N) lines.push({x1, y1, x2, y2}) } }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for(let i = 0, len = vertexes.length; i < len - 1; i) {
let {x: x1, y: y1} = vertexes[i];
for(let j = i 1; j < len; j) {
let {x: x2, y: y2} = vertexes[j];
let S = Math.sqrt(Math.pow(x1 - x2, 2) Math.pow(y1 - y2, 2));
let N = S / (R * 2);
let stepX = (x1 - x2) / N, stepY = (y1 - y2) / n;
while(--N) {
// 样本点不是线段色
if(!isBelongLine(x1 N * stepX, y1 N * stepY)) break;
}
// 样本点都合格 ---- 表示两点成线,保存
if(0 === N) lines.push({x1, y1, x2, y2})
}
}

 2、查询7号课程成绩在90分以上或60分以下的学习者学号。

4. View

View 首要的成效有七个:

  • UI 管理
  • 映射 Model 的变化(动画)

UI 管理非同平时是指「界面绘制」与「财富加载管理」,这两项成效相比较普及本文就一向略过了。View 的基点是「映射 Model 的变动」并成功对应的卡通。动画是目迷五色的,而映射的法则是大概的,如下伪代码:

JavaScript

update({originIndex, index, clr, removed, score}) { // 还尚未 originIndex 或从不色值,直接不处理 if(originIndex === undefined || clr === undefined) return ; let tile = this.tiles[originIndex]; // tile 存在,推断颜色是或不是一样 if(tile.clr !== clr) { this.updateTileClr(tile, clr); } // 当前目录变化 ----- 表示地点也可以有转换 if(tile.index !== index) { this.updateTileIndex(tile, index); } // 设置分数 if(tile.score !== score) { tile.score = score; } if(tile.removed !== removed) { // 移除或丰硕当前节点 true === removed ? this.bomb(tile) : this.area.addChild(tile.sprite); tile.removed = removed; } }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
update({originIndex, index, clr, removed, score}) {
// 还没有 originIndex 或没有色值,直接不处理
if(originIndex === undefined || clr === undefined) return ;
let tile = this.tiles[originIndex];
// tile 存在,判断颜色是否一样
if(tile.clr !== clr) {
this.updateTileClr(tile, clr);
}
// 当前索引变化 ----- 表示位置也有变化
if(tile.index !== index) {
this.updateTileIndex(tile, index);
}
// 设置分数
if(tile.score !== score) {
tile.score = score;
}
if(tile.removed !== removed) {
// 移除或添加当前节点
true === removed ? this.bomb(tile) : this.area.addChild(tile.sprite);
tile.removed = removed;
}
}

Model 的砖头每一次数据的改动都会通报到 View 的砖块,View 会依据对应的变通做相应的动作(动画)。

品质优化

鉴于「自动识图」须求对图像的的像素点举行围观,那么质量确实是个必要关爱的难点。小编设计的「自动识图算法」,在辨别图像的进度中需求对图像的像素做五遍扫描:「收集色值表」 与 「收罗端点」。在围观次数上实际很难下跌了,可是对于一张 750 * 1334 的底图来讲,「自动识图算法」需求遍历三回长度为 750 * 1334 * 4 = 4,002,000 的数组,压力依旧会有的。小编是从压缩被围观数组的尺码来提高质量的。

被扫描数组的尺寸怎么减少?
小编直接通过减少画布的尺码来达到收缩被扫描数组尺寸的。伪代码如下:

JavaScript

// 要压缩的倍数 let resolution = 4; let [width, height] = [img.width / resolution >> 0, img.height / resolution >> 0]; ctx.drawImage(img, 0, 0, width, height); let imageData = ctx.getImageData(), data = imageData;

1
2
3
4
5
// 要压缩的倍数
let resolution = 4;
let [width, height] = [img.width / resolution >> 0, img.height / resolution >> 0];
ctx.drawImage(img, 0, 0, width, height);
let imageData = ctx.getImageData(), data = imageData;

把源图片降低4倍后,得到的图样像素数组独有原本的 4^2 = 16倍。那在性质上是异常的大的升迁。

Select sno from sc where cno='7' and grade not between 60and 90

5. Control

Control 要管理的事务相当多,如下:

  • 绑定 Model & View
  • 变迁通过海关分值
  • 看清通过海关条件
  • 对外交事务件
  • 客户交互

初阶化时,Control 把 Model 的砖头单向绑定到 View 的砖块了。如下:

Object.defineProperties(model.tile, { originIndex: { get() {...}, set(){ ... view.update({originIndex}) } }, index: { get() {...}, set() { ... view.update({index}) } }, clr: { get() {...}, set() { ... view.update({clr}) } }, removed: { get() {...}, set() { ... view.update({removed}) } }, score: { get() {...}, set() { ... view.update({score}) } } })

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Object.defineProperties(model.tile, {
    originIndex: {
        get() {...},
        set(){
            ...
            view.update({originIndex})
        }
    },  
    index: {
        get() {...},
        set() {
            ...
            view.update({index})
        }
    },
    clr: {
        get() {...},
        set() {
            ...
            view.update({clr})
        }
    },
    removed: {
        get() {...},
        set() {
            ...
            view.update({removed})
        }
    },  
    score: {
        get() {...},
        set() {
            ...
            view.update({score})
        }
    }
})
 

「通过海关分值」与「判定通过海关条件」那对逻辑在本文的「游戏法则」中有连带介绍,这里不再赘言。

对外交事务件规划如下:

name detail
pass 通关
pause 暂停
resume 恢复
gameover 游戏结束

客商交互 APIs 规划如下:

name type deltail
init method 初始化游戏
next method 进入下一关
enter method 进入指定关卡
pause method 暂停
resume method 恢复
destroy method 销毁游戏

使用「自动识图」的提议

即使小编在本土测量试验的时候可以把具备的「底图」识别出来,不过并无法担保其余开荒者上传的图纸是还是不是被很好的鉴定区别出来。小编建议,能够把「自动识图」做为一个单独的工具使用。

笔者写了多少个「自动识图」的独自工具页面:
可以在那一个页不熟悉成对应的卡子配置。

 

6. 问题

在博客园有二个关于「消灭星星」的话题:popstar关卡是哪些统一希图的?

本条话题在终极建议了叁个标题 —— 「不大概消除和最大得分不满意过关条件的矩阵」

必发88官网 21

「不能清除的矩阵」其实正是最大得分为0的矩阵,本质上是「最大得分不满意过关条件的矩阵」。

最大得分不满意过关条件的矩阵
求「矩阵」的最大得分是四个「托特包难点」,求解的算法简单:对近年来矩阵用「递归」的方式把装有的消灭分支都推行叁遍,并取最高分值。但是javascript 的「递归」极易「栈溢出」导致算法不大概施行。

实在在腾讯网的话题中涉嫌三个技术方案:

互联网查到井然有序提出做个工具随便生成关卡,自动计算,把符合得分条件的关卡筛选出来

以此技术方案代价是昂贵的!小编提供有源码并未解决这些标题,而是用四个相比较取巧的秘技:进去游玩前检查是事为「不可能排除矩阵」,纵然是重新生成关卡矩阵

小心:笔者利用的取巧方案并未解决难题。

结语

上面是本文介绍的「一笔画」的线上 DEMO 的二维码:

必发88官网 22

游玩的源码托管在:
里头玩耍落成的主心骨代码在:
自行识图的代码在:

多谢耐心阅读完本小说的读者。本文仅表示笔者的个人观点,如有不妥之处请不吝赐教。

谢谢您的读书,本文由 坑坑洼洼实验室 版权全部。假设转发,请表明出处:凹凸实验室()

1 赞 1 收藏 评论

必发88官网 23

 3、查询课程名以“数据”三个字开首的保有科指标课程号和课程名。

7. 结语

下边是本文介绍的「消灭星星」的线上 DEMO 的二维码:

必发88官网 24

娱乐的源码托管在:

多谢耐心阅读完本文章的读者。本文仅代表笔者的个人观点,如有不妥之处请不吝赐教。
借使对「H5游戏开辟」感兴趣,款待关切大家的专栏。

Select cno,cname from c where cname like '数据%'

参考资料

  • Knapsack problem
  • NP-completeness
  • popstar关卡是怎样统一妄图的?
  • 费雪耶兹乱序算法
  • 不定均分算法

    1 赞 收藏 评论

必发88官网 25

 

 4、查询种种学生具有课程的平均战表,输出学生学号和平均战绩。

    Select sno,avg(grade)from sc group by sno

 5、查询每门科目标选修人数,输出课程号和选修人数。

    Selectcno,count(*) from sc group by cno

 6、查询选修7号课程的学生的学号、姓名、性别。

    Selects.sno,sname,ssex from s,sc where s.sno=sc.sno and cno='7'

    或: Select sno,sname,ssex from s where sno in

              ( Select sno from sc where cno='7' )

 7、查询选修7号课程的学习者的平均年龄。

    Selectavg(sage) from s,sc where s.sno=sc.sno and cno='7'

    或: Select avg(sage) from s where sno in

              (Select sno from sc where cno='7' )

 8、查询有30名以上学生选修的课程号。

    Select cno fromsc group by cno having count(*)>30

 9、查询于今从不考试不比格的学员学号。

    Select distinctsno from sc where sno not in

         ( Select sno from sc where grade<60 )

    或: Select sno from sc group by sno havingmin(grade)>=60

10、查询全体考试成绩的平均分一样的学生学号分组

二、

 1、找寻选修课程号为C2的学习者学号与成就。

Select sno,grade from sc where cno='C2'

 

 2、寻找选修课程号为C4的上学的小孩子学号与姓名。

    Selects.sno,sname from s,sc where s.sno=sc.sno and cno='C4'

    注意本题也足以用嵌套做

沉凝本题改为“寻找选修课程号为C4的学生学号、姓名与成就”后仍是能够用嵌套做呢?

 

 3、找寻选修课程名称叫 Maths 的学生学号与姓名。

    Selects.sno,sname from s,sc,c

    where  s.sno=sc.sno and c.cno=sc.cno andcname='Maths'

小心本题也能够用嵌套做

 

 4、寻找选修课程号为C2或C4的学童学号。

    Select distinctsno from sc where cno in ('C2','C4')

或: Select distinct sno from sc where cno='C2' or cno='C4'

 

 5、搜索选修课程号为C2和C4的学员学号。

    Select sno fromsc where cno='C2' and sno in

         ( Select sno from sc where cno='C4' )

    注意本题也可以用三番五次做

思考:Select distinct sno from sc where cno='C2' andcno='C4'正确吗?

 

 6、寻找不学C2课程的学习者姓名和年龄。

    Selectsname,sage from s where sno not in

         ( Selectsno from sc where cno='C2' )

    或: Select sname,sage from s where not exists

              (Select * from sc where sno=s.sno and cno='C2' )

 

 7、寻找选修了数据库课程的持有学员姓名。(同3)

    Select snamefrom s,sc,c

where  s.sno=sc.snoand c.cno=sc.cno and cname='数据库'

 

 8、寻觅数据库课程不如格的女孩子姓名。

    连接:Select sname from s,sc,c

         where  s.sno=sc.sno andc.cno=sc.cno and cname='数据库'

                and grade<60 and ssex='女'

    嵌套:Select sname from s where ssex='女' and  sno in

               (Select sno from sc where grade<60 and cno in

                     ( Select cno from c where cname='数据库' )

               )

 

 9、寻觅各门课程的平均战绩,输出课程名和平均战表。

    Selectcname,avg(grade) from sc,c

    wherec.cno=sc.cno  group by c.cno,cname

理念本题也得以用嵌套做吗?

 

10、寻找各类学生的平均战绩,输出学生姓名和平均成绩。

    Selectsname,avg(grade) from s,sc

    wheres.sno=sc.sno group by s.sno,sname

心想本题也足以用嵌套做啊?

 

11、寻找最少有二十七个学生选修的课程名。

    Select cnamefrom c where cno in

         ( Selectcno from sc group by cno having count(*)>=30 )

注意本题也得以用一而再做

 

12、寻找选修了非常多于3门科指标学习者姓名。

    Select snamefrom s where sno in

         ( Selectsno from sc group by sno having count(*)>=3 )

专心本题也得以用一连做

 

13、寻觅各门课程的大成均极大于90分的学员姓名。

   Select snamefrom s,sc where s.sno=sc.sno

         group bys.sno,sname having min(grade)>=90

方法二:

Select sname from s where sno not in

         ( Selectsno from sc where grade<90 )

一旦有一门十分的大于90分就能够输出该学员学号

 

14、找寻数据库课程战绩不低于该门课程平均分的学员姓名。

    Select snamefrom s,sc,c

    where  s.sno=sc.sno and sc.cno=c.cno and cname='数据库' and grade>

         ( Selectavg(grade) from sc,c

           where sc.cno=c.cnoand cname='数据库'

         )

15、寻觅种种系科男女学生的平均年龄和人数。

    Selectsdept,ssex,avg(sage),count(*) from s group by sdept,ssex

16、找寻计算机系(JSJ)课程平均分最高的学生学号和姓名。

    Selects.sno,sname from s,sc where s.sno=sc.sno and sdept='JSJ'

    group bys.sno,sname

    havingavg(grade) >=ALL

         ( Selectavg(grade) from s,sc

           wheres.sno=sc.sno and sdept='JSJ'

           group bys.sno

         )

17、(补充)查询每门科指标及格率。

    本题能够分三步做:

   

    第1步:得到每门课的选修人数

     createview  v_all(cno,cnt)

         as selectcno, count(*) from sc group by cno

    第2步:获得每门课及格人数

     createview  v_pass(cno,cnt_pass)

         as selectcno, count(*) from sc where grade>=60 group by cno

    第3步:每门课的通过海关人数/每门课选修人数

     selectv_all.cno, cnt_pass*100/cnt  from  v_all, v_pass

     where v_all.cno = v_pass.cno

 

18、查询平均分不比格的学生的学号,姓名,平均分。

    Selectsc.sno,sname,avg(grade) from student,sc

    wherestudent.sno=sc.sno

    group bysc.sno,sname

    havingavg(grade)<60

想想本题也足以用嵌套做吗?

 

19、查询平均分不如格的上学的小孩子人数。

    Select count(*)from student

    where sno in

         ( selectsno from sc group by sno having avg(grade)<60 )

    下边是三个超人的一无可取

Select count(*) from sc group by sno havingavg(grade)<60

那是各个学员有几门不如格的数码

 

三、

 1、查询报酬在一千到两千元以内的男子业务员的人名和办公编号。

    SelectYname,Ono from YWY

    where Salarybetween 1000 and 3000 and Ysex='男'

 2、查询种种办公室的业务员人数,输出办公室编号和呼应的总人口。

    SelectOno,count(*) from YWY group by Ono

 3、查询各种客商在二〇〇二年二月进货的总金额,输出客户号和相应的总金额。

    SelectKno,sum(Fmoney) from FP

    where Fdatebetween '2002.5.1' and '2002.5.31'

    group by Kno

 4、查询二零零四年八月购入次数抢先5次的具有客商号,且按客商号升序排序。 

    Select Kno fromFP

    where Fdatebetween '2002.5.1' and '2002.5.31'

    group by Kno

    havingcount(*)>5

    order by KnoASC

 5、查询各办公室男子和女人业务员的平均工资。

    SelectOno,Ysex,avg(Salary) from YWY group by Ono,Ysex

 6、查询二零零一年三月早已在王海亮业务员手中买入过商品的客户号、

            顾客姓名和联系电话。

    SelectKno,Kname,Phone from KH where Kno in

         ( SelectKno from FP

           whereFdate between '2002.5.1' and '2002.5.31' and Yno in

                      ( Select Yno from YWY where Yname='王海亮' )

         )

    注意本题也能够用三番五次做

 7、查询全数薪资比1538号业务员高的业务员的号码、姓名和薪给。

    SelectYno,Yname,Salary from YWY where Salary >

         ( SelectSalary from YWY where Yno='1538' )

 8、查询全体与1538号业务员在同叁个办公的其他业务员的号码和人名。

    SelectYno,Yname from YWY where Yno!='1538' and Ono in

         ( SelectOno from YWY where Yno='1538' )

 9、查询出售总金额最高的业务员的号码。

    Select Yno fromFP group by Yno having sum(Fmoney) >=ALL

         ( Selectsum(Fmoney) from FP group by Yno )

10、查询全体业务员的编号、姓名、薪俸以及薪俸比她高的别的业务员的平均工资。

    利用自连接

    SelectY1.Yno,Y1.Yname,Y1.Salary,avg(Y2.Salary)

    from   YWY Y1, YWY Y2

    where  Y1.Salary < Y2.Salary

    group by  Y1.Yno  

 

四、

 1、寻找各个班级的班级代码、学生人数、平均成绩。

    SelectBJDM,count(*),avg(CJ) from SC group by BJDM

 2、找寻各个学员的班级代码、学生姓名、考试科目数、总战表。

    SelectBJDM,XSXM,count(*),sum(CJ) from SC

    group byBJDM,BNXH,XSXM

 3、输出一张表格,每位学生对应一条记下,富含字段:

          班级代码、学生姓名、语文成绩、数学战绩、外语成绩。

    SelectSC1.BJDM,SC1.XSXM,SC1.CJ,SC2.CJ,SC3.CJ

    from  SC SC1, SC SC2, SC SC3

    whereSC1.BJDM=SC2.BJDM and SC1.BNXH=SC2.BNXH and

         SC2.BJDM=SC3.BJDM and SC2.BNXH=SC3.BNXH and

          SC1.KM='语文' and SC2.KM='数学' and SC3.KM='外语'

 4、输出一张表格,有战表低于60分的每位学生对应一条记下,包涵字段:

          班级代码、学生姓名、最低成绩。

    SelectBJDM,XSXM,min(CJ) from SC

    where  CJ<60 group by BJDM,BNXH,XSXM

    或:  SelectBJDM,XSXM,min(CJ) from SC

          group byBJDM,BNXH,XSXM

          havingmin(CJ)<60

 5、输出一张表格,有实际业绩低于60分的每位学生对应一条记下,富含字段:

          班级代码、学生姓名、最高成绩、平均战绩。

    SelectBJDM,XSXM,max(CJ) from SC

    group byBJDM,BNXH,XSXM

    havingmin(CJ)<60

    请想想下列做法是还是不是精确:

          SelectBJDM,XSXM,max(CJ),avg(CJ) from SC

         where  CJ<60 group byBJDM,BNXH,XSXM

 6、输出一张表格,全部成绩都非常大于60分的每人学生对应一条记下,包罗字段:

          班级代码、学生姓名、平均成绩。

    SelectBJDM,XSXM,avg(CJ) from SC

    group by BJDM,BNXH,XSXM

    havingmin(CJ)>=60

 7、输出一张表格,每一个人学员对应一条记下,包蕴字段:

          班级代码、学生姓名、去掉二个最低分后的平分战表。

    SelectBJDM,XSXM,(sum(CJ)-min(CJ))/(count(*)-1) from SC

    group byBJDM,BNXH,XSXM

 8、输出一张表格,每门科目对应一条记下,包罗字段:

          科目、去掉一个低于分后的平分成绩。

    Select KM,(sum(CJ)-min(CJ))/(count(*)-1)from SC

    group by KM

 

 

 

        实验指引中“八 SQL查询语句” 的答案

 

 1、查询年龄在19至贰12岁时期的女子的学号,姓名,年龄,按年龄从大到小排列。

    Selectsno,sname,sage from student

    where sagebetween 19 and 21 and ssex='女'

    order by sagedesc

 2、查询姓名中有“明”字的上学的儿童人数。

    Select count(*)from student

    where snamelike "%明%"

 3、查询1001科目未有实际业绩的学员的学号。

    Select sno fromsc where cno='1001' and grade is null

 4、查询JSJ、SX、WL系的学生学号,姓名,结果按系及学号排列。

    Selectsno,sname,sdept from student

    where sdept in( 'JSJ', 'SX', 'WL' )

    order bysdept,sno

 5、计算每一门课的总分、平均分,最高分、最低分。

    Selectcno,sum(grade),avg(grade),max(grade),min(grade)

    from sc

    group by cno

 6、查询平均分抢先90分的男学生学号及平均分。

    连接:

    selectsc.sno,avg(grade) from student,sc

    wherestudent.sno=sc.sno and ssex=’男’

    group by sc.sno

    havingavg(grade)>90

    嵌套:

    selectsno,avg(grade) from sc

    where sno in (select sno from student where ssex='男')

    group by sno

    havingavg(grade)>90

 7、查询选修课程超越2门的上学的小孩子姓名。

    select snamefrom student,sc

    where student.sno=sc.sno

    group bysc.sno,sname

    havingcount(*)>2

    本题也足以用嵌套做

 8、查询 JSJ 系的上学的儿童选修的课程号。

    Select distinctcno from student,sc

    where  student.sno=sc.sno and sdept='JSJ'

    本题也得以用嵌套做

 9、查询选修1002学科的学生的学生姓名(用一连和嵌套2种办法)

    连接:Select sname from student,sc

          wherestudent.sno=sc.sno and cno='1002'

    嵌套:Select sname from student where sno in

              (select sno from sc where cno='1002' )

10、查询学生姓名以及她选修课程的学科号及成绩。

    Selectsname,cno,grade from student,sc

    wherestudent.sno=sc.sno

    思索本题也足以用嵌套做啊?

11、查询选修“数据库原理”课且成绩 80 以上的学习者姓名(用接二连三和嵌套2种情势)

    连接:Select sname from student,sc,course

          wherestudent.sno=sc.sno and sc.cno=course.cno and

               cname='数据库原理' and grade>80

    嵌套:Select sname from student where sno in 

               (select sno from sc where grade>80 and cno in 

                    ( select cno from course where cname='数据库原理' )

               )

 

14、查询没有选修1002学科的学生的学员姓名。

    Select snamefrom student

    where sno notin ( select sno from sc where cno='1002')

    或: select sname from student

         where notexists

              (select * from sc where cno='1002' and sno=student.sno)

    思索本题也能够用一般的连年做吗?

15、查询平均分最高的学习者学号及平均分。

    Selectsno,avg(grade)

    from sc

    group by sno

    havingavg(grade) >=ALL ( Select avg(grade)

                              from sc

                              group by sno

                            )

16、查询每门科目战表都不仅该门课程平均分的学习者学号。

    能够先总结每门课程平均分

    create viewc_avg(cno,avg_grade)

         as selectcno,avg(grade) from sc group by cno

    再查询

    Select distinctsno from sc

    where sno notin ( Select sno from sc,c_avg

                      where sc.cno=c_avg.cno and grade<avg_grade

                    )

   ===========================================

    SELECT DISTINCT Sno

    FROM SC SC1

    WHERE SC1.SnoNOT IN

          ( SELECT SC2.Sno

            FROM SC SC2

            WHERE SC2.Grade <=

                 ( SELECT AVG(SC3.Grade)

                   FROM SC SC3

                   WHERE SC3.Cno=SC2.Cno

                 )

          )

    或:

    SELECT DISTINCTSno

    FROM SC SC1

    WHERE NOTEXISTS

          (SELECT *

            FROM SC SC2

            WHERE SC2.Sno=SC1.Sno AND SC2.Grade <=

                       (SELECT AVG(SC3.Grade)

                         FROM SC SC3

                         WHERE SC3.Cno=SC2.Cno

                       )

          )

   

 

(3)检索至少选修LIU老师所授课程中一门课程的女上学的儿童姓名。
    SELECT SNAME
    FROM S
    WHERE SEX=‘F’ AND S# IN
     (SELECT S#
     FROM SC
     WHERE C# IN
      (SELECT C#
      FROM C
      WHERE TEACHER=‘LIU’)

NOTICE:有多样写法,比如联接查询写法:
    SELECT SNAME
    FROM S,SC,C
    WHERE SEX=‘F’ AND SC.S#=S.S#
    AND SC.C#=C.C#
    AND TEACHER='LIU'
但上一种写法更加好一些。

(4)检索WANG同学不学的课程的课程号。
    SELECT C#
    FROM C
    WHERE C# NOT IN
     (SELECT C#
     FROM SC
     WHERE S# IN
      (SELECT S#
      FROM S
      WHERE SNAME='WANG'))

(5)检索至少选修两门课程的学员学号。
    SELECT DISTINCT X.SNO
    FROM SC X,SC Y
    WHERE X.SNO=Y.SNO AND X.CNO<>Y.CNO
Notice:对表SC进行自连接,X,Y是SC的八个外号。

(6)寻觅全体上学的小孩子都选修的教程的教程号与学科名。
    SELECT C#,CNAME
    FROM C
    WHERE NOT EXISTS
     (SELECT *
     FROM S
     WHERE S# NOT IN
      (SELECT *
      FROM SC
      WHERE  SC.C#=C.C#))

要从语义上分解:(1)选用课程的教程号与学科名,空中楼阁不选那门课的同学。
   当中,“不选那门课的校友”可以代表为:

SELECT *

 FROM  S

 WHERE  S# NOT IN

  (SELECT  *

      FROM SC  

      WHERE  SC.C#=C.C#)

 

或者

SELECT *

 FROM  S

 WHERE   NOT EXISTS

  (SELECT  *

      FROM SC  

      WHERE S.S#=C.S# AND 

SC.C#=C.C# )

 

      

(7)搜求选修课程包蕴LIU先生所教学的学习者学号。    
     SELECT DISTINCT S#
     FROM SC
     WHERE C# IN
      (SELECT C#
      FROM C
      WHERE TEACHER='LIU'))   

3.3 设有五个基本表凯雷德(A,B,C)和S(D,E,F),试用SQL查询语句表述下列关系代数表明式:
  (1)πA(R)(2)σB='17'(R)(3)R×S(4))πA,FC=D(R×S))
(1)SELECT A FROM R
(2)SELECT * FROM R WHERE B='17'
(3)SELECT A,B,C,D,E,F FROM R,S
(4)SELECT A,F FROM R,S WHERE R.C=S.D

3.43.4 设有七个大旨表凯雷德(A,B,C)和S(A,B,C)试用SQL查询语句表述下列关系代数表明式:
  (1)R∪S  (2)R∩S  (3)R-S  (4)πA,B(R)πB,C(S)

    (1)SELECT A,B,C
      FROM R
      UNION
      SELECT A,B,C
      FROM S

    (2)SELECT A,B,C
      FROM R
      INTERSECT
      SELECT A,B,C
      FROM S

    (3)SELECT A,B,C
      FROM R
      WHERE NOT EXISTS
       (SELECT A,B,C
       FROM S
       WHERE R.A=S.A AND R.B=S.B AND R.C=S.C)

    (4)SELECT R.A,R.B,S.C
      FROM R,S
      WHERE R.B=S.B

3.5 试汇报SQL语言的关联代数特点和元组演算特点。
(P61-62)

3.6 试用SQL查询语句表述下列对教学数据库中八个为主表S、SC、C的询问:

(1)计算有上学的小孩子选修的学科门数。
    SELECT COUNT(DISTINCT C#) FROM SC

(2)求选修C4课程的学习者的平均年龄。
    SELECT AVG(AGE)
    FROM S
    WHERE S# IN
     (SELECT S#
     FROM SC
     WHERE C#='C4')
或者,
    SELECT AVG(AGE)
    FROM S,SC
    WHERE S.S#=SC.S# AND C#='004'

(3)求LIU老师所授课程的每门课程的上学的小孩子平均成绩。
   SELECT CNAME,AVG(GRADE)
   FROM SC ,C
   WHERE SC.C#=C.C# ANDTEACHER='LIU'
   GROUP BY C#   

(4)总括每门课程的上学的小孩子选修人数(超越10人的教程才计算)。供给输出课程号和选修人数,查询结果按人头降序排列,若人数一样,按学科号升序排列。
    SELECT DISTINCT C#,COUNT(S#)
    FROM SC
    GROUP BY C#
    HAVING COUNT(S#)>10
    ORDER BY 2 DESC, C# ASC

(5)检索学号比WANG同学大,而年纪比他小的上学的小孩子姓名。
    SELECT X.SNAME
    FROM S AS X, S AS Y
    WHERE Y.SNAME='WANG' AND X.S#>Y.S# AND X.AGE<Y.AGE

(6)检索姓名以WANG打头的富有学员的全名和年龄。
    SELECT SNAME,AGE
    FROM S
    WHERE SNAME LIKE 'WANG%'

(7)在SC中找找成绩为空值的学生学号和课程号。
    SELECT S#,C#
    FROM SC
    WHERE GRADE IS NULL

(8)求年龄大于女子学校友平均年龄的男学生姓名和年龄。
    SELECT SNAME,AGE
    FROM S AS X
    WHERE X.SEX='男' AND X.AGE>(SELECT AVG(AGE)FROM S AS Y WHERE Y.SEX='女')

(9)求年龄超越全部女子高校友年龄的男学生姓名和年龄。
    SELECT SNAME,AGE
    FROM S AS X
    WHERE X.SEX='男' AND X.AGE>ALL (SELECT AGE FROM S AS Y WHERE Y.SEX='女')
除法运算

3.7 试用SQL更新语句表达对教学数据库中多个主题表S、SC、C的一一更新操作:
(1)往基本表S中插入多个学员元组(‘S9’,‘WU’,18)。
    INSERT INTO S(S#,SNAME,AGE) VALUES('59','WU',18)
(2)在着力表S中寻觅每一门学科战表都不仅等于80分的学习者学号、姓名和性别,并把检索到的值送往另四个已存在的基本表STUDENT(S#,SANME,SEX)。
    INSERT INTO STUDENT(S#,SNAME,SEX)
     SELECT S#,SNAME,SEX
     FROM S WHERE  NOT EXISTS
      (SELECT * FROM SC WHERE
       GRADE<80 AND S.S#=SC.S#)

(3)在主导表SC中去除尚无战绩的选课元组。
    DELETE FROM SC
     WHERE GRADE IS NULL

(4)把WANG同学的学习选课和成就全部剔除。
    DELETE FROM SC
     WHERE S# IN
      (SELECT S#
      FROM S
      WHERE SNAME='WANG')

(5)把选修MATHS课不如格的实际业绩全改为空值。
    UPDATE SC
    SET GRADE=NULL
    WHERE GRADE<60 AND C# IN
      (SELECT C#
      FROM C
      WHERE CNAME='MATHS')

(6)把低于总平均战绩的女子学校友战表进步5%。
    UPDATE SC
    SET GRADE=GRADE*1.05
    WHERE GRADE<(SELECT AVG(GRADE) FROM SC) AND S# IN (SELECT S# FROM SWHERE SEX='F')

(7)在主导表SC中修改C4学科的实际绩效,若战绩小于等于75分时升高5%,若战绩当先75分时升高4%(用七个UPDATE语句完毕)。
    UPDATE SC
     SET GRADE=GRADE*1.05
     WHERE C#='C4' AND GRADE<=75
    UPDATE SC
     SET GRADE=GRADE*1.04
     WHERE C#='C4' AND GRADE>75

3.8 在第1章例1.4中关系“仓库管理”关系模型有三个关系情势:
  零件 PART(P#,PNAME,COLOR,WEIGHT)
  项目 PROJECT(J#,JNAME,DATE)
  供应商 SUPPLIER(S#,SNAME,SADDR)
  供应 P_P(J#,P#,TOTOAL)
  采购 P_S(P#,S#,QUANTITY)

(1)试用SQLDDL语句定义上述多少个基本表,并表达主键和外键。
    CREATE TABLE PART
    (P# CHAR(4) NOT NULL,PNAME CHAR(12) NOT NULL,
    COLOR CHAR(10),WEIGHT REAL,
    PRIMARY KEY(P#))
    
    CREATE TABLE PROJECT
    (J# CHAR(4) NOT NULL,JNAME CHAR(12) NOT NULL,
    DATE DATE,
    PRIMARY KEY(J#))
    
    CREATE TABLE SUPLIER
    (S# CHAR(4) NOT NULL,SNAME CHAR(12),SADDR VARCHAR(20),
    PRIMARY KEY(S#))
    
    CREATE TABLE P_P
    (J# CHAR(4),P# CHAR(4),TOTAL INTEGER,
    PRIMARY KEY(J#,P#),
    FOREIGN KEY(J#) REFERENCE PROJECT(J#),
    FOREIGN KEY(P#) REFERENCE PART(P#))
    
    CREATE TABLE P_S
    (P# CHAR(4),S# CHAR(4),QUANTITY INTEGER,
    PRIMARY KEY(P#,S#),
    FOREIGN KEY(P#) REFERENCE PART(P#),
    FOREIGN KEY(S#) REFERENCE SUPLIER(S#))     

(2)试将PROGECT、P_P、PART两个基本表的当然联接定义为贰个视图VIEW1,PART、P_S、SUPPLIELacrosse两个基本表的自然联接定义为二个视图VIEW2。
    CREATE VIEW VIEW1(J#,JNAME,DATE,P#,PNAME,COLOR,WEIGHT,TOTAL)
          AS SELECT PROJECT.J#,JNAME,DATE,PART.P#,PNAME,COLOR,WEIGHT,TOTAL
          FROM PROJECT,PART,P_P
          WHERE PART.P#=P_P.P# AND P_P.J#=PROJECT.J# 
     
    CREATE VIEW VIEW2(P#,PNAME,COLOR,WEIGHT,S#,SNAME,SADDR,QUANTITY)
          AS SELECT PART.P#,PNAME,COLOR,WEIGHT,SUPPLIER.S#,SNAME,SADDR,QUANTITY
          FROM PART,P_S,SUPPLIER
          WHERE PART.P#=P_S.P# AND P_S.S#=SUPPLIER.S#

(3)试在上述七个视图的根底上进展数量查询:

    1)检索香岛的代理商所供应的零部件的编号和名字。
    SELECT P#,PNAME FROM VIEW2 WHERE SADDR='SHANGHAI'

    2)检索项目J4所用零件的经销商编号和名字。
    SELECT S#,SNAME FROM VIEW2 WHERE P# IN(SELECT P# FROM VIEW1 WHERE J#='J4')

3.9 对此教学数据库中基本表SC,已创造下列视图:
CREATEVIEWS_GRADE(S#,C_NUM,AVG_GRADE)
ASSELECTS#,COUNT(C#),AVG(GRADE)
FROMSC
GROUPBYS#
试剖断下列查询和翻新是或不是允许施行。若允许,写出调换来骨干表SC上的应和操作。
  (1) SELECT*
FROMS_GRADE
      允许
   SELECT S#,COUNT(C#),AVG(GRADE)FROM SC GROUP BY S#

  (2) SELECTS#,C_NUM
FROMS_GRADE
WHEREAVG_GRADE>80
    允许
   SELECT S#,COUNT(C#) FROM SC WHEREAVG(GRADE)>80

  (3) SELECTS#,AVG_GRADE
FROMS_GRADE
WHEREC_NUM>(SELECTC_NUM
FROMS_GRADE
WHERES#=‘S4’)
    允许
   SELECT S#,AVG(GRADE)
   FROM SC AS X
   WHERE COUNT(X.C#)>(SELECTCOUNT(Y.C#) FROM SC AS Y WHERE Y.S#='S4')
   GROUP BY S#

  (4) UPDATES_GRADE
SETC_NUM=C_NUM+1
WHERES#=‘S4’
    不允许

  (5) DELETEFROMS_GRADE
WHEREC_NUM>4
    不允许

3.10 预管理格局对于嵌入式SQL的落实有怎样主要意义?
    预管理格局是先用预管理程序对源程序进行围观,识别出SQL语句,并管理成宿主语言的函数调用格局; 然后再用宿主语言的编写翻译程序把源程序编译成目的程序。这样,不用扩展宿主语言的编写翻译程序, 就会管理SQL语句。

3.11 在宿主语言的程序中使用SQL语句有何样规定?
在宿主语言的主次中接纳SLQ语句有以下规定:
(1)在程序中要有别于SQL语句与宿主语言说话
(2)允许嵌入的SQL语句援用宿主语言的次第变量(称为分享变量),但有两条规定:
   1)引用时,那些变量前必得加“:”作为前缀标志,以示与数据库中变量有分别。
   2)那个变量由宿主语言的程序定义,并用SQL的DECLARE语句表达。
(3)SQL的成团管理格局与宿主语言单记录处理模式之间要和谐。 要求运用游标机制,把集结操作转变到单记录管理方式。

3.12SQL的集聚管理情势与宿主语言单记录管理格局之间什么协调?
    由于SQL语句管理的是记录集合,而宿主语言语句二次只可以管理三个记录, 因而要求用游标(cousor)机制,把会集操作转换到单记录管理格局。

2.13 嵌入式SQL语句几时不必涉及到游标?曾几何时必需涉及到游标?
    (1)INSERT、DELETE、UPDATE语句,查询结果必然是单元组时的SELECT语句, 都可一向嵌入在主程序中动用,不必涉及到游标。
    (2)当SELECT语句询问结果是多少个元组时,此时宿主语言程序不能够使用, 必需求用游标机制把多少个元组一遍三个地传递给宿主语言管理。

 

 

 

(电商)数据库原理及使用_模仿考核武器试验题及仿照效法答案

 

    一、单选 (每空1分,共10分)

    1.在Access数据库中,数据保存在(    )对象中。

       A.窗体        B.查询          C.报表          D.表

    2.假若某一字段数据型为文本型,字段大小为8,该字段中最多可输入(    )个汉字。

       A.8          B.4              C.16           D.32

    3.文本型字段最多能够贮存(    )个字符。

       A.250        B.252         C.254           D.255

    4.Access客商操作分界面由(    )部分组成。

       A.4           B.5          C.3           D.6

    5.下列(    )Logo是Access中表对象的标记。

       A.         B.         C.        D.

    6.在设计Access数据表时,“索引”属性有(    )取值。

       A.1              B.2              C.3                D.4

    7.Access中包蕴有(    )种数据类型。

       A.9              B.10             C.7                D.8

    8.在一个宏中要开拓三个报表,应该利用的操作是(    )。

       A.OpenForm       B.OpenReport      C.OpenTable       D.OpenQuery

    9.能够经过Internet实行多少发表的指标是(    )。

       A.窗体         B.报表           C.查询          D.数据访谈页

   10.模块窗口由(    )个部分构成。

       A.2            B.3             C.4              D.5

 

    二、填空 (每空1分,共20分)

    1.在人工管理和文书处理阶段,程序设计__依赖于 ___数据表示。

    2.在文件系统中,存取数据的着力单位为___记录____,在数据库系统中,存取数据的中央单位为___数据项_____。

    3.若实体A和B是多对多的沟通,实体B和C是1对1的沟通,则实体A和C是___多_____对___多_____的联系。

    4.在八个关联合中学不相同意现身重复的____元组____,也不容许出现具有同等名字的___属性_____。

    5.数据库系统中的四类客户分别为____数据库管理员、数据库设计师、应用程序员、终端客户_____。

    6.在存取数据库的数据的长河中,使用了多少个数据缓冲区,分别为___系统_____缓冲区和____用户 ____缓冲区。

    7.学生关系中的班级号属性与班级关系中的班级号主码属性相对应,则____班级号____为学生关系中的___外码___。

    8.设一个关乎A具有a1个属性和a2个元组,关系B具备b1个性格和b2个元组,则涉嫌A´B具备___a1 b1____个属性和____ a2´b2 ____个元组。

    9.设一个上学的小孩子关系为S(学生号,姓名),课程关系为C(课程号,课程名),选课关系为X(学生号,课程号,战表),求出全体选课的学生消息的运算表明式为_____Õ学生号(X)______与____S ____的本来连接。

   10.在三个事关QX56中,若存在X→Y和X→Z,则存在_____ X→(Y,Z)_______,称此为函数重视的合併性法规。

 

    三、填空 (每空1分,共20分)

    1.若多个提到的任何非主属性都不有的依附依赖于别的候选码,则称该关系达成____第二____范式。

    2.在SQL中,列级完整性约束分为__6__种情景,表级完整性约束分为__4__种情况。

   3. 在SQL中,每种视图中的列能够来自不一致的___表___,它是在原有表的功底上____建立____的逻辑意义上的新涉嫌。

   4. 在SQL的查询语句中,group by选项达成____分组总结______功用,order by选项达成对结果表的____排序_____功能。

    5.对此较复杂的系统,概念设计阶段的机要任务是:首先根据系统的次第部分应用画出各自对应的____局部ER图______,然后再实行综合和一体化规划,画出_____整体ER图_____。

    6.机器达成阶段的靶子是在Computer体系中赢得二个满意______设计须要、作用完善、操作方便___的数据库应用系列。

    7.Access的客商操作界面由    标题栏、菜单栏、工作区  、工具栏、状态栏等多个部分构成。

    8.Access“表”结构划虚拟计窗口中上半片段的“表设计器”是由      字段名称、数据类型、表明        等三列组成。

    9.Access中的窗体由      页眉、主体      和页脚等五个部分组成。

 

    四、填空 (每空1分,共20分)

   1. 设多少个提到为库罗德(A,B,C,D,E),它的微小函数注重集为FD={A→B,A→C,(C,D)→E},则该关系的候选码为_____(A,D)___,候选码函数决定E是___伪传递___性。

    2.设二个事关为翼虎(A,B,C,D,E),它的小小函数重视集为FD={A→B,A→C,(A,D)→E},该关系只知足___第一_____范式,若要标准化为高一流的范式,则将赢得____2____个关系。

    3.在其实的数据库管理种类中,对数据库的操作方法有_____命令交互、程序实行、窗口界面______等三种。

    4.在SQL中,主码约束的根本字为____ primary key________,外码约束的首要性字为______foreignkey ______。

    5.基本表属于全局方式中的表,它是____实表____,而视图则属于有个别情势中的表,它是____虚表 ____。

   6. 在SQL新版的查询语句中,select选项完成投影运算,from选项达成____连接____运算,where选项实现____选择___运算。

    7.数据字典是对系统工作流程中____数据____和____处理____的描述。

    8.关全面据库系统中的全局形式由若干个基本表所组成,表与表之间的联络是透过定义的____主码____和____外码____实现的。

    9.在饭店管理中,涉及到的基本表有几个,它们各自为客房表、住宿表、_____客人登记表、开销卡表____。

   10.在安装或注销数据库密码的经过中,密码对于字母     大小写     是敏感的。

 

    五、填空 (每空1分,共10分)

    1.Access的客户操作分界面由   标题栏、菜单栏、职业区   、工具栏、状态栏等七个部分构成。

    2.Access“表”结构划虚拟计窗口中上半有的的“表设计器”是由     字段名称、数据类型   和认证等三列组成。

    3.Access中的窗体由     页眉、主体、页脚      等八个部分构成。

    4.在Access中模块分为   类模块       和       规范模块     两种类型。

 

    六、依据主教材第四章所给的商品库和教学库,或许根据下列所给的每条SQL查询语句写出相应的魔法,只怕遵照下列所给的各个意义写出相应的SQL查询语句。(每小题4分,共20分)

    在名为物品库的数据库中富含有商品表1和商品表2,它们的概念分别为:

       商品表1(商品代号 char(8),分类名 char(8),单价 float,数量 int)

       商品表2(商品代号 char(8),产地 char(6),品牌char(6),)

    在称呼为教学库的数据库中带有有学员、课程和选课八个表,它们的定义分别为:

       学生(学生号 char(7),姓名 char(6),性别 char(2),出出生之日期 datetime,

            专业 char(10),年级 int)

       课程(课程号 char(4),课程名 char(10),课程学分 int

       选课(学生号 char(7),课程号 char(4),成绩 int)

    1.select distinct 产地

        from 商品表2

       效率:从事商业品库中查询出富有商品的区别产地。

 

    2.select *

        from 学生

        where 学生号 in (select 学生号

          from 选课

          group by 学生号 having count(*)=1

        )

    效能:从事教育工作学库中询问出只选修了一门课程的凡事学童。

 

    3.select *

         from 学生

         where 学生号 in (select 学生号

           from 选课

           group by 学生号 having count(*)<=2   

         ) or not exists (select *

              from 选课

              where 学生.学生号=选课.学生号

         )

    成效: 从教学库中查询出最多选修了2门学科(含未选任何学科)的方方面面学员。

 

    4.从事商业品库中查询出每类(即分类名同样)商品的最高单价。

 select 分类名,max(单价) as 最高单价

        from 商品表1

        group by 分类名

 

    5.从事教育工作学库中询问出足足选修了人名称为@m1学生所选课程中一门课的总体学员。

select distinct 学生.*

        from 学生,选课

        where 学生.学生号=选课.学生号 and 课程号=any(select 课程号

          from 学生,选课

          where 学生.学生号=选课.学生号 and 姓名=@m1

        )

 

 

 

 

 

1.   Student(S#,Sname,Sage,Ssex) 学生表 

2.   Course(C#,Cname,T#) 课程表 

3.   SC(S#,C#,score) 成绩表 

4.   Teacher(T#,Tname) 教师表 

5.    

6.   问题: 

7.   1、查询“001”课程比“002”课程成绩高的兼具学员的学号; 

8.     select a.S# from (select s#,score from SC where C#='001') a,(select s#,score 

9.     from SC where C#='002') b 

10.    where a.score>b.score and a.s#=b.s#; 

11.  2、查询平均战绩超乎60分的同校的学号和平均成绩; 

12.      select S#,avg(score) 

13.      from sc 

14.      group by S# having avg(score) >60; 

15.  3、查询全数同学的学号、姓名、选课数、总战表; 

16.    select Student.S#,Student.Sname,count(SC.C#),sum(score) 

17.    from Student left Outer join SC on Student.S#=SC.S# 

18.    group by Student.S#,Sname 

19.  4、查询姓“李”的老师的个数; 

20.    select count(distinct(Tname)) 

21.    from Teacher 

22.    where Tname like '李%'; 

23.  5、查询没学过“叶平”老师课的同窗的学号、姓名; 

24.      select Student.S#,Student.Sname 

25.      from Student  

26.      where S# not in (select distinct( SC.S#) from SC,Course,Teacher where  SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='叶平'); 

27.  6、查询学过“001”并且也学过数码“002”课程的同校的学号、姓名; 

28.    select Student.S#,Student.Sname from Student,SC where Student.S#=SC.S# and SC.C#='001'and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#='002'); 

29.  7、查询学过“叶平”老师所教的全部课的同班的学号、姓名; 

30.    select S#,Sname 

31.    from Student 

32.    where S# in (select S# from SC ,Course ,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='叶平' group by S# having count(SC.C#)=(select count(C#) from Course,Teacher  where Teacher.T#=Course.T# and Tname='叶平')); 

33.  8、查询课程编号“002”的大成比课程编号“001”课程低的全体同学的学号、姓名; 

34.    Select S#,Sname from (select Student.S#,Student.Sname,score ,(select score from SC SC_2 where SC_2.S#=Student.S# and SC_2.C#='002') score2 

35.    from Student,SC where Student.S#=SC.S# and C#='001') S_2 where score2 <score; 

36.  9、查询全体课程成绩小于60分的同桌的学号、姓名; 

37.    select S#,Sname 

38.    from Student 

39.    where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60); 

40.  10、查询未有学全全数课的同学的学号、姓名; 

41.      select Student.S#,Student.Sname 

42.      from Student,SC 

43.      where Student.S#=SC.S# group by  Student.S#,Student.Sname having count(C#) <(select count(C#) from Course); 

44.  11、查询至少有一门课与学号为“1001”的同桌所学一样的同校的学号和姓名; 

45.      select S#,Sname from Student,SC where Student.S#=SC.S# and C# in select C# from SC where S#='1001'; 

46.  12、查询至少学过学号为“001”同学全体一门课的其余同学学号和姓名; 

47.      select distinct SC.S#,Sname 

48.      from Student,SC 

49.      where Student.S#=SC.S# and C# in (select C# from SC where S#='001'); 

50.  13、把“SC”表中“叶平”老师教的课的战表都改成为此课程的平均战表; 

51.      update SC set score=(select avg(SC_2.score) 

52.      from SC SC_2 

53.      where SC_2.C#=SC.C# ) from Course,Teacher where Course.C#=SC.C# and Course.T#=Teacher.T# and Teacher.Tname='叶平'); 

54.  14、查询和“1002”号的同桌学习的教程完全同样的其余同学学号和人名; 

55.      select S# from SC where C# in (select C# from SC where S#='1002') 

56.      group by S# having count(*)=(select count(*) from SC where S#='1002'); 

57.  15、删除学习“叶平”老师课的SC表记录; 

58.      Delect SC 

59.      from course ,Teacher  

60.      where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='叶平'; 

61.  16、向SC表中插入一些笔录,这个记录须要符合以下原则:未有上过编号“003”课程的同室学号、2、 

62.      号课的平均战表; 

63.      Insert SC select S#,'002',(Select avg(score) 

64.      from SC where C#='002') from Student where S# not in (Select S# from SC where C#='002'); 

65.  17、按平均成绩从高到低彰显全部学生的“数据库”、“公司管理”、“德文”三门的科目战绩,按如下方式显得: 学生ID,,数据库,集团管理,土耳其(Turkey)语,有效课程数,有效平均分 

66.      SELECT S# as 学生ID 

67.          ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='004') AS 数据库 

68.          ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#必发88官网,='001') AS 公司管理 

69.          ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='006') AS 英语 

70.          ,COUNT(*) AS 有效课程数, AVG(t.score) AS 平均战绩 

71.      FROM SC AS t 

72.      GROUP BY S# 

73.      ORDER BY avg(t.score)  

74.  18、查询各科战表最高和最低的分:以如下方式显得:课程ID,最高分,最低分 

75.      SELECT L.C# As 课程ID,L.score AS 最高分,R.score AS 最低分 

76.      FROM SC L ,SC AS R 

77.      WHERE L.C# = R.C# and 

78.          L.score = (SELECT MAX(IL.score) 

79.                        FROM SC AS IL,Student AS IM 

80.                        WHERE L.C# = IL.C# and IM.S#=IL.S# 

81.                        GROUP BY IL.C#) 

82.          AND 

83.          R.Score = (SELECT MIN(IR.score) 

84.                        FROM SC AS IR 

85.                        WHERE R.C# = IR.C# 

86.                    GROUP BY IR.C# 

87.                      ); 

88.  19、按各科平均成绩从低到高和及格率的百分比从高到低顺序 

89.      SELECT t.C# AS 课程号,max(course.Cname)AS 课程名,isnull(AVG(score),0) AS 平均战表 

90.          ,100 * SUM(CASE WHEN  isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) AS 及格百分数 

91.      FROM SC T,Course 

92.      where t.C#=course.C# 

93.      GROUP BY t.C# 

94.      ORDER BY 100 * SUM(CASE WHEN  isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) DESC 

95.  20、查询如下课程平均成绩和及格率的比例(用"1行"展现): 公司管理(001),马克思(002),OO&UML (003),数据库(004) 

96.      SELECT SUM(CASE WHEN C# ='001' THEN score ELSE 0 END)/SUM(CASE C# WHEN '001' THEN 1 ELSE 0 END) AS 公司管理平均分 

97.          ,100 * SUM(CASE WHEN C# = '001' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '001' THEN 1 ELSE 0 END) AS 公司管理及格百分数 

98.          ,SUM(CASE WHEN C# = '002' THEN score ELSE 0 END)/SUM(CASE C# WHEN '002' THEN 1 ELSE 0 END) AS 马克思平均分 

99.          ,100 * SUM(CASE WHEN C# = '002' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '002' THEN 1 ELSE 0 END) AS 马克思及格百分数 

100.                ,SUM(CASE WHEN C# = '003' THEN score ELSE 0 END)/SUM(CASE C# WHEN '003' THEN 1 ELSE 0 END) AS UML平均分 

101.                ,100 * SUM(CASE WHEN C# = '003' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '003' THEN 1 ELSE 0 END) AS UML及格百分数 

102.                ,SUM(CASE WHEN C# = '004' THEN score ELSE 0 END)/SUM(CASE C# WHEN '004' THEN 1 ELSE 0 END) AS 数据库平均分 

103.                ,100 * SUM(CASE WHEN C# = '004' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '004' THEN 1 ELSE 0 END) AS 数据库及格百分数 

104.          FROM SC 

105.        21、查询分化老师所教不相同学科平均分从高到低展现 

106.          SELECT max(Z.T#) AS 教授ID,MAX(Z.Tname) AS 助教姓名,C.C# AS 课程ID,MAX(C.Cname) AS 课程名称,AVG(Score) AS 平均战表 

107.            FROM SC AS T,Course AS C ,Teacher AS Z 

108.            where T.C#=C.C# and C.T#=Z.T# 

109.          GROUP BY C.C# 

110.          ORDER BY AVG(Score) DESC 

111.        22、查询如下课程成绩第 3 名到第 6 名的上学的小孩子战绩单:公司管理(001),Marx(002),UML (003),数据库(004) 

112.            [学生ID],[学生姓名],公司处理,马克思,UML,数据库,平均成绩 

113.            SELECT  DISTINCT top 3 

114.              SC.S# As 学生学号, 

115.                Student.Sname AS 学生姓名 , 

116.              T1.score AS 公司管理, 

117.              T2.score AS 马克思, 

118.              T3.score AS UML, 

119.              T4.score AS 数据库, 

120.              ISNULL(T1.score,0)   ISNULL(T2.score,0)   ISNULL(T3.score,0)   ISNULL(T4.score,0) as 总分 

121.              FROM Student,SC  LEFT JOIN SC AS T1 

122.                              ON SC.S# = T1.S# AND T1.C# = '001' 

123.                    LEFT JOIN SC AS T2 

124.                              ON SC.S# = T2.S# AND T2.C# = '002' 

125.                    LEFT JOIN SC AS T3 

126.                              ON SC.S# = T3.S# AND T3.C# = '003' 

127.                    LEFT JOIN SC AS T4 

128.                              ON SC.S# = T4.S# AND T4.C# = '004' 

129.              WHERE student.S#=SC.S# and 

130.              ISNULL(T1.score,0)   ISNULL(T2.score,0)   ISNULL(T3.score,0)   ISNULL(T4.score,0) 

131.              NOT IN 

132.              (SELECT 

133.                    DISTINCT 

134.                    TOP 15 WITH TIES 

135.                    ISNULL(T1.score,0)   ISNULL(T2.score,0)   ISNULL(T3.score,0)   ISNULL(T4.score,0) 

136.              FROM sc 

137.                    LEFT JOIN sc AS T1 

138.                              ON sc.S# = T1.S# AND T1.C# = 'k1' 

139.                    LEFT JOIN sc AS T2 

140.                              ON sc.S# = T2.S# AND T2.C# = 'k2' 

141.                    LEFT JOIN sc AS T3 

142.                              ON sc.S# = T3.S# AND T3.C# = 'k3' 

143.                    LEFT JOIN sc AS T4 

144.                              ON sc.S# = T4.S# AND T4.C# = 'k4' 

145.              ORDER BY ISNULL(T1.score,0)   ISNULL(T2.score,0)   ISNULL(T3.score,0)   ISNULL(T4.score,0) DESC); 

146.         

147.        23、计算列印各科战绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60] 

148.            SELECT SC.C# as 课程ID, Cname as 课程名称 

149.                ,SUM(CASE WHEN score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS [100 - 85] 

150.                ,SUM(CASE WHEN score BETWEEN 70 AND 85 THEN 1 ELSE 0 END) AS [85 - 70] 

151.                ,SUM(CASE WHEN score BETWEEN 60 AND 70 THEN 1 ELSE 0 END) AS [70 - 60] 

152.                ,SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS [60 -] 

153.            FROM SC,Course 

154.            where SC.C#=Course.C# 

155.            GROUP BY SC.C#,Cname; 

156.         

157.        24、查询学一生均战表及其排行 

158.              SELECT 1 (SELECT COUNT( distinct 平均成绩) 

159.                      FROM (SELECT S#,AVG(score) AS 平均成绩 

160.                              FROM SC 

161.                          GROUP BY S# 

162.                          ) AS T1 

163.                    WHERE 平均成绩 > T2.平均战表) as 名次, 

164.              S# as 学生学号,平均战表 

165.            FROM (SELECT S#,AVG(score) 平均战绩 

166.                    FROM SC 

167.                GROUP BY S# 

168.                ) AS T2 

169.            O奥德赛DEENCORE BY 平均战表 desc; 

170.          

171.        25、查询各科成绩前三名的记录:(不思量成绩并列情状) 

172.              SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数 

173.              FROM SC t1 

174.              WHERE score IN (SELECT TOP 3 score 

175.                      FROM SC 

176.                      WHERE t1.C#= C# 

177.                    ORDER BY score DESC 

178.                      ) 

179.              ORDER BY t1.C#; 

180.        26、查询每门学科被选修的学员数 

181.          select c#,count(S#) from sc group by C#; 

182.        27、查询出只选修了一门科指标全体学员的学号和姓名 

183.          select SC.S#,Student.Sname,count(C#) AS 选课数 

184.          from SC ,Student 

185.          where SC.S#=Student.S# group by SC.S# ,Student.Sname having count(C#)=1; 

186.        28、查询男子、女孩子人数 

187.            Select count(Ssex) as 汉子人数 from Student group by Ssex having Ssex='男'; 

188.            Select count(Ssex) as 女孩子人数 from Student group by Ssex having Ssex='女'; 

189.        29、查询姓“张”的学生名单 

190.            SELECT Sname FROM Student WHERE Sname like '张%'; 

191.        30、询问同名同性学生名单,并总计同名家数 

192.          select Sname,count(*) from Student group by Sname having  count(*)>1;; 

193.        31、一九八四年诞生的学生名单(注:Student表中Sage列的品种是datetime) 

194.            select Sname,  CONVERT(char (11),DATEPART(year,Sage)) as age 

195.            from student 

196.            where  CONVERT(char(11),DATEPART(year,Sage))='1981'; 

197.        32、查询每门科指标平均战表,结果按平均成绩升序排列,平均成绩同样时,按学科号降序排列 

198.            Select C#,Avg(score) from SC group by C# order by Avg(score),C# DESC ; 

199.        33、查询平均战绩抢先85的持有学员的学号、姓名和平均成绩 

200.            select Sname,SC.S# ,avg(score) 

201.            from Student,SC 

202.            where Student.S#=SC.S# group by SC.S#,Sname having    avg(score)>85; 

203.        34、查询课程名称叫“数据库”,且分数低于60的学生姓名和分数 

204.            Select Sname,isnull(score,0) 

205.            from Student,SC,Course 

206.            where SC.S#=Student.S# and SC.C#=Course.C# and  Course.Cname='数据库'and score <60; 

207.        35、查询全体学员的选课意况; 

208.            SELECT SC.S#,SC.C#,Sname,Cname 

209.            FROM SC,Student,Course 

210.            where SC.S#=Student.S# and SC.C#=Course.C# ; 

211.        36、查询任何一门科目战表在70分以上的姓名、课程名称和分数; 

212.            SELECT  distinct student.S#,student.Sname,SC.C#,SC.score 

213.            FROM student,Sc 

214.            WHERE SC.score>=70 AND SC.S#=student.S#; 

215.        37、查询不比格的教程,并按学科号从大到小排列 

216.            select c# from sc where scor e <60 order by C# ; 

217.        38、查询课程编号为003且课程战绩在80分以上的学生的学号和人名; 

218.            select SC.S#,Student.Sname from SC,Student where SC.S#=Student.S# and Score>80 and C#='003'; 

219.        39、求选了学科的学生人数 

220.            select count(*) from sc; 

221.        40、查询选修“叶平”老师所授课程的学生中,成绩最高的学员姓名及其成绩 

222.            select Student.Sname,score 

223.            from Student,SC,Course C,Teacher 

224.            where Student.S#=SC.S# and SC.C#=C.C# and C.T#=Teacher.T# and Teacher.Tname='叶平' and SC.score=(select max(score)from SC where C#=C.C# ); 

225.        41、查询各样学科及相应的选修人数 

226.            select count(*) from sc group by C#; 

227.        42、查询不一致学科成绩一样的学生的学号、课程号、学生战表 

228.          select distinct  A.S#,B.score from SC A  ,SC B where A.Score=B.Score and A.C# <>B.C# ; 

229.     43、查询每门功课成绩最棒的前两名 

230.            SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数 

231.              FROM SC t1 

232.              WHERE score IN (SELECT TOP 2 score 

233.                      FROM SC 

234.                      WHERE t1.C#= C# 

235.                    ORDER BY score DESC 

236.                      ) 

237.              ORDER BY t1.C#; 

238.        44、计算每门课程的学员选修人数(超越10人的科目才计算)。要求输出课程号和选修人数,查询结果按人口降序排列,查询结果按人口降序排列,若人数一样,按学科号升序排列  

239.            select  C# as 课程号,count(*) as 人数 

240.            from  sc  

241.            group  by  C# 

242.            order  by  count(*) desc,c#  

243.        45、检索至少选修两门学科的学生学号 

244.            select  S#  

245.            from  sc  

246.            group  by  s# 

247.            having  count(*)  >  =  2 

248.        46、查询任何学生都选修的教程的课程号和科目名 

249.            select  C#,Cname  

250.            from  Course  

251.            where  C#  in  (select  c#  from  sc group  by  c#)  

252.        47、查询没学过“叶平”老师授课的任一门科目标学生姓名 

253.            select Sname from Student where S# not in (select S# from Course,Teacher,SC where Course.T#=Teacher.T# and SC.C#=course.C# and Tname='叶平'); 

254.        48、查询两门以上不比格课程的同桌的学号及其平均成绩 

255.            select S#,avg(isnull(score,0)) from SC where S# in (select S# from SC where score <60 group by S# having count(*)>2)group by S#; 

256.        49、检索“004”课程分数小于60,按分数降序排列的同班学号 

257.            select S# from SC where C#='004'and score <60 order by score desc; 

258.        50、删除“002”同学的“001”课程的实际业绩 

259.        delete from Sc where S#='001'and C#='001'; 

260.         

 

 

 

 

 

 

 

 

 

 

宪章考核武器试验题仿照效法答案

 

    一、单选 (每空1分,共10分)

   1. D  2. B  3. D 4. B  5. C  6. C 7. B

  1. B 9. D  10. B

二、填空 (每空1分,共20分)

 

   1. 依赖于                 2. 记录、数据项

   3. 多、多                 4. 元组、属性

   5. 数据库管理员、数据库设计师、应用工程师、终端顾客(次序无前后相继)

   6. 系统、用户             7. 班级号、外码

   8. a1 b1、a2´b2           9. Õ学生号(X)、S  (次序无先后)

    10. X→(Y,Z)

三、填空 (每空1分,共20分)

 

   1. 第二                            2.6、4

   3. 表、创设                        4. 分组总结、排序

   5. 局地ELX570图、全体E凯雷德图            6. 设计要求、功能完善、操作便利

   7. 标题栏、菜单栏、职业区(次序无前后相继)

   8. 字段名称、数据类型、表明(次序无先后)

   9. 页眉、主体(次序无前后相继)

四、填空 (每空1分,共20分)

 

   1. (A,D)、伪传递                     

  1. 第一、2

   3. 限令交互、程序实行、窗口分界面(次序无前后相继)

   4. primary key、foreign key

   5. 实表、虚表                        

  1. 连接、选择

   7. 数据、管理(次序无前后相继)          

  1. 主码、外码(次序无前后相继)

   9. 游客登记表、花费卡表(次序无前后相继)

  1. 大小写

五、填空 (每空1分,共10分)

 

   1. 标题栏、菜单栏、专门的学业区   (次序无前后相继)

   2. 字段名称、数据类型       (次序无先后)

   3. 页眉、主体、页脚         (次序无前后相继)

  1. 类模块、标准模块         (次序无前后相继)

 

    六、依据主教材第四章所给的商品库和教学库,可能遵照下列所给的每条SQL查询语句写出相应的效用,或然依据下列所给的每一个效应写出相应的SQL查询语句。(每小题4分,共20分)

   1. 从事商业品库中询问出装有商品的差别产地。

   2. 从事教育工作学库中查询出只选修了一门科目标方方面面学员。

   3. 从事教育工作学库中查询出最多选修了2门课程(含未选任何学科)的整个学生。

   4. select 分类名,max(单价) as 最高单价

        from 商品表1

        group by 分类名

   5. select distinct 学生.*

        from 学生,选课

        where 学生.学生号=选课.学生号 and 课程号=any(select 课程号

          from 学生,选课

          where 学生.学生号=选课.学生号 and 姓名=@m1

        )

 

3.1 名词解释

(1)SQL模式:SQL形式是表和授权的静态定义。二个SQL方式定义为基本表的见面。 贰个由格局名和方式具备者的客户名或账号来鲜明,并满含情势中每一个因素(基本表、视图、索引等)的定义。
(2)SQL数据库:SQL(Structured Query Language),即‘结构式查询语言’,选取英文单词表示和结构式的语法规则。 二个SQL数据库是表的集聚,它用四个或七个SQL方式定义。
(3)基本表:在SQL中,把守旧的涉及模型中的关系格局称为基本表(Base Table)。 基本表是实际存款和储蓄在数据库中的表,对应三个提到。
(4)积攒文件:在SQL中,把古板的涉嫌模型中的存款和储蓄形式称为存款和储蓄文件(Stored File)。 每一种存款和储蓄文件与表面存款和储蓄器上二个概况文件对应。
(5)视图:在SQL中,把守旧的关系模型中的子方式称为视图(View),视图是从若干宗旨表和(或)其余视图构造出来的表。
(6):在SQL中,把古板的涉嫌模型中的元组称为行(row)。
(7)列:在SQL中,把守旧的涉嫌模型中的属性称为列(coloumn)。
(8)实表:基本表被称呼“实表”,它是实际上存放在数据库中的表。
(9)虚表:视图被叫做“虚表”,成立叁个视图时,只把视图的概念存款和储蓄在数据词典中,而不存款和储蓄视图所对应的数量。
(10)相关子查询:在嵌套查询中出现的契合以下特点的子查询:子查询中询问条件注重于外层查询中的有些值, 所以子查询的管理不只一次,要反复求值,以供外层查询利用。
(11)连接查询:查询时先对表张开笛卡尔积操作,然后再做等值联接、采纳、投影等操作。 联接查询的作用比嵌套查询低。
(12)交互式SQL:在巅峰交互方式下使用的SQL语言称为交互式SQL。
(13)嵌入式SQL:嵌入在高等语言的程序中运用的SQL语言称为嵌入式SQL。
(14)共享变量:SQL和宿主语言的接口。分享变量有宿主语言程序定义,再用SQL的DECLARE语句表明, SQL语句就可引用这一个变量传递数据库消息。
(15)游标:游标是与某一询问结果相沟通的符号名,用于把集合操作转变到单记录管理格局。
(16)卷游标:为了制服游标在推动时无法回来的劳苦,SQL2提供了卷游标技艺。 卷游标在推动时不仅可以沿查询结果桐月组顺序原原本本一行行推动,也能一行行再次回到。

3.2 对于教学数据库的三个基本表
  学生S(S#,SNAME,AGE,SEX)
  学习 SC(S#,C#,GRADE)
  课程C(C#,CNAME,TEACHER)
 试用SQL的查询语句表述下列查询:

(1)检索LIU先生所授课程的课程号和科目名。
    SELECT C#,CNAME
    FROM C
    WHERE TEACHER=‘LIU’

(2)检索年龄当先二十一虚岁的男学生的学号和姓名。
    SELECT S#,SNAME
    FROM S
    WHERE (AGE>23) AND (SEX=‘M’)

(3)检索至少选修LIU老师所授课程中一门课程的女学员姓名。
    SELECT SNAME
    FROM S
    WHERE SEX=‘F’ AND S# IN
     (SELECT S#
     FROM SC
     WHERE C# IN
      (SELECT C#
      FROM C
      WHERE TEACHER=‘LIU’)

NOTICE:有二种写法,举例联接查询写法:
    SELECT SNAME
    FROM S,SC,C
    WHERE SEX=‘F’ AND SC.S#=S.S#
    AND SC.C#=C.C#
    AND TEACHER='LIU'
但上一种写法越来越好有的。

(4)检索WANG同学不学的科目标课程号。
    SELECT C#
    FROM C
    WHERE C# NOT IN
     (SELECT C#
     FROM SC
     WHERE S# IN
      (SELECT S#
      FROM S
      WHERE SNAME='WANG'))

(5)检索至少选修两门课程的学生学号。
    SELECT DISTINCT X.SNO
    FROM SC X,SC Y
    WHERE X.SNO=Y.SNO AND X.CNO<>Y.CNO
Notice:对表SC举办自连接,X,Y是SC的八个别称。

(6)检索全体上学的儿童都选修的教程的教程号与课程名。
    SELECT C#,CNAME
    FROM C
    WHERE NOT EXISTS
     (SELECT *
     FROM S
     WHERE S# NOT IN
      (SELECT *
      FROM SC
      WHERE  SC.C#=C.C#))

要从语义上分解:(1)采纳课程的教程号与课程名,不设有不选那门课的同学。
   当中,“不选那门课的校友”能够表示为:

SELECT *

 FROM  S

 WHERE  S# NOT IN

  (SELECT  *

      FROM SC  

      WHERE  SC.C#=C.C#)

 

或者

SELECT *

 FROM  S

 WHERE   NOT EXISTS

  (SELECT  *

      FROM SC  

      WHERE S.S#=C.S# AND 

SC.C#=C.C# )

 

      

(7)检索选修课程包涵LIU先生所教学的学习者学号。    
     SELECT DISTINCT S#
     FROM SC
     WHERE C# IN
      (SELECT C#
      FROM C
      WHERE TEACHER='LIU'))   

3.3 设有七个主导表逍客(A,B,C)和S(D,E,F),试用SQL查询语句表述下列关系代数表明式:
  (1)πA(R)(2)σB='17'(R)(3)R×S(4))πA,FC=D(R×S))
(1)SELECT A FROM R
(2)SELECT * FROM R WHERE B='17'
(3)SELECT A,B,C,D,E,F FROM R,S
(4)SELECT A,F FROM R,S WHERE R.C=S.D

3.43.4 设有两其中央表福睿斯(A,B,C)和S(A,B,C)试用SQL查询语句表述下列关系代数表明式:
  (1)R∪S  (2)R∩S  (3)R-S  (4)πA,B(R)πB,C(S)

    (1)SELECT A,B,C
      FROM R
      UNION
      SELECT A,B,C
      FROM S

    (2)SELECT A,B,C
      FROM R
      INTERSECT
      SELECT A,B,C
      FROM S

    (3)SELECT A,B,C
      FROM R
      WHERE NOT EXISTS
       (SELECT A,B,C
       FROM S
       WHERE R.A=S.A AND R.B=S.B AND R.C=S.C)

    (4)SELECT R.A,R.B,S.C
      FROM R,S
      WHERE R.B=S.B

3.5 试陈诉SQL语言的关联代数特点和元组演算特点。
(P61-62)

3.6 试用SQL查询语句表述下列对教学数据库中多少个基本表S、SC、C的询问:

(1)总结有学生选修的学科门数。
    SELECT COUNT(DISTINCT C#) FROM SC

(2)求选修C4学科的学习者的平均年龄。
    SELECT AVG(AGE)
    FROM S
    WHERE S# IN
     (SELECT S#
     FROM SC
     WHERE C#='C4')
或者,
    SELECT AVG(AGE)
    FROM S,SC
    WHERE S.S#=SC.S# AND C#='004'

(3)求LIU老师所授课程的每门学科的上学的小孩子平均成绩。
   SELECT CNAME,AVG(GRADE)
   FROM SC ,C
   WHERE SC.C#=C.C# ANDTEACHER='LIU'
   GROUP BY C#   

(4)总计每门课程的学习者选修人数(超越10人的教程才总计)。须求输出课程号和选修人数,查询结果按人口降序排列,若人数同样,按学科号升序排列。
    SELECT DISTINCT C#,COUNT(S#)
    FROM SC
    GROUP BY C#
    HAVING COUNT(S#)>10
    ORDER BY 2 DESC, C# ASC

(5)检索学号比WANG同学大,而年纪比她小的上学的小孩子姓名。
    SELECT X.SNAME
    FROM S AS X, S AS Y
    WHERE Y.SNAME='WANG' AND X.S#>Y.S# AND X.AGE<Y.AGE

(6)检索姓名以WANG打头的有着学员的真名和年龄。
    SELECT SNAME,AGE
    FROM S
    WHERE SNAME LIKE 'WANG%'

(7)在SC中查找成绩为空值的学员学号和课程号。
    SELECT S#,C#
    FROM SC
    WHERE GRADE IS NULL

(8)求年龄当先女子学校友平均年龄的男学生姓名和年龄。
    SELECT SNAME,AGE
    FROM S AS X
    WHERE X.SEX='男' AND X.AGE>(SELECT AVG(AGE)FROM S AS Y WHERE Y.SEX='女')

(9)求年龄大于全体女校友年龄的男学生姓名和年龄。
    SELECT SNAME,AGE
    FROM S AS X
    WHERE X.SEX='男' AND X.AGE>ALL (SELECT AGE FROM S AS Y WHERE Y.SEX='女')

3.7 试用SQL更新语句表明对教学数据库中七个主题表S、SC、C的次第更新操作:
(1)往基本表S中插入八个上学的小孩子元组(‘S9’,‘WU’,18)。
    INSERT INTO S(S#,SNAME,AGE) VALUES('59','WU',18)
(2)在宗旨表S中找找每一门科目成绩都不仅仅等于80分的学习者学号、姓名和性别,并把检索到的值送往另二个已存在的基本表STUDENT(S#,SANME,SEX)。
    INSERT INTO STUDENT(S#,SNAME,SEX)
     SELECT S#,SNAME,SEX
     FROM S WHERE  NOT EXISTS
      (SELECT * FROM SC WHERE
       GRADE<80 AND S.S#=SC.S#)

(3)在着力表SC中删除尚无战表的选课元组。
    DELETE FROM SC
     WHERE GRADE IS NULL

(4)把WANG同学的就学选课和成绩全体去除。
    DELETE FROM SC
     WHERE S# IN
      (SELECT S#
      FROM S
      WHERE SNAME='WANG')

(5)把选修MATHS课不如格的实际业绩全改为空值。
    UPDATE SC
    SET GRADE=NULL
    WHERE GRADE<60 AND C# IN
      (SELECT C#
      FROM C
      WHERE CNAME='MATHS')

(6)把低于总平均战表的女校友成绩提高5%。
    UPDATE SC
    SET GRADE=GRADE*1.05
    WHERE GRADE<(SELECT AVG(GRADE) FROM SC) AND S# IN (SELECT S# FROM SWHERE SEX='F')

(7)在着力表SC中期维修改C4科目标成就,若成绩小于等于75分时提升5%,若战绩当先75分时提升4%(用多少个UPDATE语句达成)。
    UPDATE SC
     SET GRADE=GRADE*1.05
     WHERE C#='C4' AND GRADE<=75
    UPDATE SC
     SET GRADE=GRADE*1.04
     WHERE C#='C4' AND GRADE>75

3.8 在第1章例1.4中关系“商旅产和土地资金财产管理理”关系模型有七个事关方式:
  零件 PART(P#,PNAME,COLOR,WEIGHT)
  项目 PROJECT(J#,JNAME,DATE)
  供应商 SUPPLIER(S#,SNAME,SADDR)
  供应 P_P(J#,P#,TOTOAL)
  采购 P_S(P#,S#,QUANTITY)

(1)试用SQLDDL语句定义上述八个基本表,并证实主键和外键。
    CREATE TABLE PART
    (P# CHAR(4) NOT NULL,PNAME CHAR(12) NOT NULL,
    COLOR CHAR(10),WEIGHT REAL,
    PRIMARY KEY(P#))
    
    CREATE TABLE PROJECT
    (J# CHAR(4) NOT NULL,JNAME CHAR(12) NOT NULL,
    DATE DATE,
    PRIMARY KEY(J#))
    
    CREATE TABLE SUPLIER
    (S# CHAR(4) NOT NULL,SNAME CHAR(12),SADDR VARCHAR(20),
    PRIMARY KEY(S#))
    
    CREATE TABLE P_P
    (J# CHAR(4),P# CHAR(4),TOTAL INTEGER,
    PRIMARY KEY(J#,P#),
    FOREIGN KEY(J#) REFERENCE PROJECT(J#),
    FOREIGN KEY(P#) REFERENCE PART(P#))
    
    CREATE TABLE P_S
    (P# CHAR(4),S# CHAR(4),QUANTITY INTEGER,
    PRIMARY KEY(P#,S#),
    FOREIGN KEY(P#) REFERENCE PART(P#),
    FOREIGN KEY(S#) REFERENCE SUPLIER(S#))     

(2)试将PROGECT、P_P、PART八个基本表的自然联接定义为一个视图VIEW1,PART、P_S、SUPPLIE奥德赛四个基本表的本来联接定义为贰个视图VIEW2。
    CREATE VIEW VIEW1(J#,JNAME,DATE,P#,PNAME,COLOR,WEIGHT,TOTAL)
          AS SELECT PROJECT.J#,JNAME,DATE,PART.P#,PNAME,COLOR,WEIGHT,TOTAL
          FROM PROJECT,PART,P_P
          WHERE PART.P#=P_P.P# AND P_P.J#=PROJECT.J# 
     
    CREATE VIEW VIEW2(P#,PNAME,COLOR,WEIGHT,S#,SNAME,SADDR,QUANTITY)
          AS SELECT PART.P#,PNAME,COLOR,WEIGHT,SUPPLIER.S#,SNAME,SADDR,QUANTITY
          FROM PART,P_S,SUPPLIER
          WHERE PART.P#=P_S.P# AND P_S.S#=SUPPLIER.S#

(3)试在上述三个视图的底子上实行多少查询:

    1)检索法国巴黎的中间商所供应的零部件的号码和名字。
    SELECT P#,PNAME FROM VIEW2 WHERE SADDR='SHANGHAI'

    2)检索项目J4所用零件的代理商编号和名字。
    SELECT S#,SNAME FROM VIEW2 WHERE P# IN(SELECT P# FROM VIEW1 WHERE J#='J4')

3.9 对此教学数据库中着力表SC,已确立下列视图:
CREATEVIEWS_GRADE(S#,C_NUM,AVG_GRADE)
ASSELECTS#,COUNT(C#),AVG(GRADE)
FROMSC
GROUPBYS#
试判定下列查询和立异是不是允许推行。若允许,写出转造成基本表SC上的相应操作。
  (1) SELECT*
FROMS_GRADE
      允许
   SELECT S#,COUNT(C#),AVG(GRADE)FROM SC GROUP BY S#

  (2) SELECTS#,C_NUM
FROMS_GRADE
WHEREAVG_GRADE>80
    允许
   SELECT S#,COUNT(C#) FROM SC WHEREAVG(GRADE)>80

  (3) SELECTS#,AVG_GRADE
FROMS_GRADE
WHEREC_NUM>(SELECTC_NUM
FROMS_GRADE
WHERES#=‘S4’)
    允许
   SELECT S#,AVG(GRADE)
   FROM SC AS X
   WHERE COUNT(X.C#)>(SELECTCOUNT(Y.C#) FROM SC AS Y WHERE Y.S#='S4')
   GROUP BY S#

  (4) UPDATES_GRADE
SETC_NUM=C_NUM+1
WHERES#=‘S4’
    不允许

  (5) DELETEFROMS_GRADE
WHEREC_NUM>4
    不允许

3.10 预管理格局对于嵌入式SQL的贯彻有何样主要意义?
    预处理方式是先用预管理程序对源程序举行围观,识别出SQL语句,并拍卖成宿主语言的函数调用方式; 然后再用宿主语言的编写翻译程序把源程序编写翻译成指标程序。那样,不用扩大宿主语言的编写翻译程序, 就能够处理SQL语句。

3.11 在宿主语言的主次中选取SQL语句有啥规定?
在宿主语言的顺序中采纳SLQ语句有以下规定:
(1)在程序中要有别于SQL语句与宿主语言说话
(2)允许嵌入的SQL语句援用宿主语言的主次变量(称为共享变量),但有两条规定:
   1)援用时,那些变量前必需加“:”作为前缀标志,以示与数据库中变量有分别。
   2)那一个变量由宿主语言的程序定义,并用SQL的DECLARE语句表明。
(3)SQL的联谊处理格局与宿主语言单记录处理方式之间要和睦。 需求利用游标机制,把集合操作转变到单记录管理情势。

3.12SQL的聚合管理格局与宿主语言单记录管理情势之间如何和睦?
    由于SQL语句管理的是记录集结,而宿主语言语句一遍只好管理贰个记下, 由此必要用游标(cousor)机制,把群集操作转变到单记录管理格局。

2.13 嵌入式SQL语句曾几何时不必涉及到游标?曾几何时必需涉及到游标?
    (1)INSERT、DELETE、UPDATE语句,查询结果自然是单元组时的SELECT语句, 都可径直嵌入在主程序中利用,不必涉及到游标。
    (2)当SELECT语句询问结果是多个元组时,此时宿主语言程序不能够使用, 必定要用游标机制把几个元组一遍三个地传递给宿主语言管理。

 

本文由必发88官网发布,转载请注明来源:SQL练习题完整,H5游戏开辟