H伍游戏开垦:消灭星星

2018/01/25 · HTML5 ·
游戏

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

「消灭星星」是1款很优异的「消除类游戏」,它的游戏的方法异常的粗略:消除相连通的同色砖块。

图片 1

H5游戏开拓:一笔画

2017/11/07 · HTML5 ·
游戏

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

图片 2

SQL 练习题答案

一. 游戏规则

「消灭星星」存在四个本子,可是它们的条条框框除了「关卡分值」有些出入外,别的的平整都以平等的。我介绍的版本的游戏规则整理如下:

一. 色砖分布

  • 10 x 10 的表格
  • 5种颜色 —— 红、绿、蓝,黄,紫
  • 每类色砖个数在钦定区间内任意
  • 伍类色砖在 10 x 10 表格中自由遍布

2. 拔除规则

多个或八个以上同色砖块相连通便是可被扫除的砖头。

三. 分值规则

  • 清除总分值 = n * n * 5
  • 奖赏总分值 = 两千 – n * n * 20

「n」表示砖块数量。下面是「总」分值的条条框框,还有「单」个砖块的分值规则:

  • 免除砖块得分值 = 拾 * i + 5
  • 剩余砖块扣分值 = 40 * i + 20

「i」表示砖块的索引值(从 0
起首)。简单地说,单个砖块「得分值」和「扣分值」是一个等差数列。

肆. 关卡分值

关卡分值 = 1000 + (level – 1) * 三千;「level」即眼下关卡数。

五. 合格条件

  • 可清除色块不存在
  • 总共分值 >= 当前关卡分值

上边八个标准还要建立游戏才方可过得去。

H五游戏开辟:一笔画

by leeenx on 2017-11-02

一笔画是图论[科普](https://zh.wikipedia.org/wiki/%E5%9B%BE%E8%AE%BA)中3个闻明的标题,它源点于柯哈尔滨堡七桥难点[科普](https://zh.wikipedia.org/wiki/%E6%9F%AF%E5%B0%BC%E6%96%AF%E5%A0%A1%E4%B8%83%E6%A1%A5%E9%97%AE%E9%A2%98)。化学家欧拉在他173陆年刊出的杂谈《柯哈利法克斯堡的7桥》中不但化解了7桥难点,也提议了一笔画定理,顺带消除了一笔画难题。用图论的术语来讲,对于多个加以的连通图[科普](https://zh.wikipedia.org/wiki/%E8%BF%9E%E9%80%9A%E5%9B%BE)留存一条恰好含有所无线段并且没有再度的门径,那条渠道正是「一笔画」。

搜索连通图那条路径的进程就是「一笔画」的娱乐经过,如下:

图片 3

 

2. MVC 设计形式

小编本次又是运用了 MVC
方式来写「消灭星星」。星星「砖块」的数据结构与种种状态由 Model
落成,游戏的中坚在 Model 中产生;View 映射 Model
的变动并做出相应的一颦一笑,它的职分重大是展现动画;用户与游乐的交互由
Control 实现。

从逻辑规划上看,Model 很重而View 与 Control
很轻,然则,从代码量上看,View 很重而 Model 与 Control 相对很轻。

玩耍的落到实处

「一笔画」的贯彻不复杂,笔者把贯彻进度分成两步:

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

「底图绘制」把连通图以「点线」的花样显得在画布上,是1三十日游最轻松达成的一些;「交互绘制」是用户绘制解题路线的长河,这些历程会首假诺管理点与点动态成线的逻辑。

一、补充作业一、

 

设有三个关系:

               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

十 x 十 的报表用长度为 十0 的数组可周全映射游戏的少数「砖块」。

[ 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
]

RAV4 – 浅绿,G – 品绿,B – 水泥灰,Y – 金棕,P – 湖蓝。Model
的大旨任务是以下多个:

  • 变迁砖墙
  • 免去砖块 (生成砖块分值)
  • 坚实砖墙
  • 破除残砖 (生成嘉勉分值)

底图绘制

「一笔画」是多关卡的玩乐形式,作者决定把关卡(连通图)的定制以四个安顿接口的样式对外暴光。对外暴光关卡接口需求有一套描述连通图形状的正统,而在小编面前有多个选项:

  • 点记法
  • 线记法

举个连通图 —— 伍角星为例来讲一下这三个挑选。

图片 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}
]
}
]

「点记法」记录关卡通过海关的三个答案,即端点要按自然的1壹存放到数组
coords中,它是有序性的记录。「线记法」通过两点描述连通图的线条,它是严节的笔录。「点记法」最大的优势是显示更简洁,但它必须记录二个及格答案,作者只是关卡的搬运工不是关卡创设者,所以作者最后选项了「线记法」。:)

 

3.一 生成砖墙

砖墙分两步生成:

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

理论上,可以将 拾0 个格子能够均分到 伍类颜色,可是作者玩过的「消灭星星」都不使用均分政策。通过分析两款「消灭星星」,其实能够发掘四个原理
—— 「色砖之间的多寡差在二个永久的间距内」。

假使把古板意义上的均分称作「完全均分」,那么「消灭星星」的分红是1种在均分线上下波动的「不完全均分」。

图片 5

小编把地方的「不完全均分」称作「波动均分」,算法的具体贯彻能够远瞻「不定均分算法」。

「打垮色砖」其实就是将数组乱序的历程,作者推荐应用「
费雪耶兹乱序算法」。

以下是伪代码的兑现:

JavaScript

// 波动均分色砖 waveaverage(五, 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);

交互绘制

在画布上绘制路线,从视觉上正是「选取或连续连通图端点」的长河,那一个进程须求减轻3个难题:

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

征集连通图端点的坐标,再监听手指滑过的坐标能够清楚「手指下是或不是有点」。以下伪代码是采访端点坐标:

JavaScript

// 端点坐标音讯 let coords = []; lines.forEach(({x一, y一, x2, y二})
=> { // (x壹, y一) 在 coords 数组不存在 if(!isExist(x1, y1))
coords.push([x1, y1]); // (x二, y二) 在 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; // 端点半径
—— 取连通图端点半径的贰倍,提高活动端体验 let r = radius * 2;
for(let [x, y] of coords){ if(Math.sqrt(Math.pow(x – x0, 二) +
Math.pow(y – y0), 二) <= 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;
}
}
})

在未绘制任何线段或端点在此以前,手指滑过的肆意端点都会被用作「一笔画」的初阶点;在绘制了线段(或有选中式点心)后,手指滑过的端点能还是不可能与选中式点心串连成线段须要基于现成基准实行决断。

图片 6

上海体育场合,点A与点B可接二连三成线段,而点A与点C不能够一连。作者把「能够与内定端点连接成线段的端点称作使得连接点」。连通图端点的管事连接点从连通图的线条中提取:

JavaScript

coords.forEach(coord => { // 有效连接点(坐标)挂载在端点坐标下
coord.validCoords = []; lines.forEach(({x壹, y1, x贰, y二}) => { //
坐标是时下线段的源点 if(coord.x === x壹 && coord.y === y一) {
coord.validCoords.push([x2, y2]); } // 坐标是当前线段的顶峰 else
if(coord.x === x2 && coord.y === y二) { 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…有效连接点只可以剖断三个点是不是为底图的线条,这只是二个静态的参照,在事实上的「交互绘制」中,会超过以下情形:

图片 7
如上海体育场合,AB已串连成线段,当前选中式点心B的实惠连接点是 A 与 C。AB
已经延续成线,若是 BA 也串连成线段,那么线段就再也了,所以那时候 BA
无法成线,唯有 AC 才干成线。

对选中式点心来说,它的有效性连接点有三种:

  • 与选中式点心「成线的管用连接点」
  • 与选中式点心「未成线的管事连接点」

在那之中「未成线的有效连接点」才能出席「交互绘制」,并且它是动态的。

图片 8

回头本节内容伊始提的八个难点「手指下是还是不是有端点」 与
「选中式点心到待选中式点心时期是不是成线」,其实可统1为二个题目:手指下是或不是存在「未成线的实用连接点」。只须把监听手指滑动遍历的数组由连通图全部的端点坐标
coords 替换为当前选中式点心的「未成线的有效性连接点」就可以。

迄今结束「单笔画」的要害意义已经落成。能够超过体验一下:

图片 9

 1、查询7号课程未有考试战绩的上学的小孩子学号。

叁.二 消除砖块

「解决砖块」的平整很简短 —— 相近相连通一样色即能够撤销

图片 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 +
伍); // 标志当前分值 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;
}
}
}
}

铲除的算法使用「递归」逻辑上会清晰一些,但是「递归」在浏览器上轻易「栈溢出」,所以小编未有动用「递归」完结。

电动识图

我在录加入关贸总协定组织卡配置时,开掘一个柒条边以上的过渡图很轻便录错或录重线段。作者在揣摩是或不是开辟2个自动识别图形的插件,毕竟「一笔画」的图纸是有规则的几何图形。

图片 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

叁.三 坚实砖墙

砖墙在排除了部分砖石后,会现出空洞,此时亟需对墙体实行加强:

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

一种高效的贯彻方案是,每一遍「消除砖块」后一贯遍历砖墙数组(10×拾数组)再把空洞抓实,伪代码表示如下:

JavaScript

for(let row = 0; row < 10; ++row) { for(let col = 0; col < 十;
++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个虚无对一张大数组实行全量遍历并不是一种高效的算法。在笔者看来影响「墙体做实」成效的成分有:

  1. 原则性空洞
  2. 砖块移动(抓牢)

环视墙体数组的要害目标是「定位空洞」,不过否不扫描墙体数组直接「定位空洞」?

墙体的「空洞」是出于「解决砖块」产生的,换种说法 ——
被排除的砖头留下来的坑位正是墙体的抽象。在「消除砖块」的还要标志空洞的职位,那样就毫无全量扫描墙体数组,伪代码如下:

JavaScript

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

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

在上边包车型地铁压实动图,其实可以见到它的抓实进度如下:

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

墙体在「抓实」进程中,它的疆界是实时在转变,假设「狠抓」不按实际边界进行围观,会发生多余的空白扫描:

图片 12

何以记录墙体的界限?
把墙体拆分成3个个独立的列,那么列最顶部的空白格片段就是墙体的「空白」,而任何非顶部的空白格片段即墙体的「空洞」。

图片 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>

砖块在拔除后,映射到单个列上的空洞会有三种布满形态 —— 一而再与非延续。

图片 14

「再而三空洞」与「非连续空洞」的压实过程如下:

图片 15

实质上「空驶列车」放大于墙体上,也会有「空洞」类似的遍及形态 ——
一连与非一连。
图片 16

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

端点识别

批评上,通过采访的「色值表」能够平素把端点的坐标志别出来。作者设计的「端点识别算法」分以下2步:

  1. 按像素扫描底图直到碰着「端点颜色」的像素,进入第一步
  2. 从底图上清除端点并记录它的坐标,重回继续第1步

伪代码如下:

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; //
线段是数量第1多的颜料,端点是第2多的颜色 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]
}
}

取到端点的主色后,再跑三遍「端点识别算法」后居识别出 201个端点!那是干什么呢?

图片 17

上海体育场所是推广5倍后的底图局地,清水蓝端点的周边和当中充斥着大量噪点(杂色块)。事实上在「端点识别」进程中,由于噪点的留存,把原本的端点被分解成1玖个或数十三个小端点了,以下是跑过「端点识别算法」后的底图:

图片 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 +一 for(let j = 0; j < len; ++j) { let vertexB =
vertexes[j]; if(vertextB === undefined) continue; //
点A与点B有增大,点B合并到点A并剔除点B if(is克罗丝(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;
}
}
}

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

 

三.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。局地提取「样式点」如下:

图片 19

上海体育场地,会识别出叁条线条:AB, BC 和 AC。而事实上,AC不可能成线,它只是因为
AB 和 BC 视觉上共壹线的结果。当然把 N 值向上进步能够缓慢解决那一个难题,可是 N
作为常量的话,那一个常量的取量必要靠经验来决断,果然吐弃。

为了幸免 AB 与 BC 同处一直线时 AC 被辨认成线段,其实很简单 ——
八个「样本点」的间距小于或等于端点直径
假设 N = S / (2 * R),S 代表两点的距离,福特Explorer表示端点半径。局地提取「样式点」如下:

图片 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 * 二); let stepX = (x一 – x2) / N,
stepY = (y一 – y二) / n; while(–N) { // 样本点不是线段色
if(!isBelongLine(x1 + N * stepX, y1 + N * stepY)) break; } //
样本点都过关 —- 表示两点成线,保存 if(0 === N) lines.push({x一, y1, x二,
y二}) } }

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})
}
}

 二、查询七号课程成绩在捌拾柒分以上或伍拾7分以下的学员学号。

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^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关卡是怎么样统一盘算的?

那几个话题在最终提出了三个主题素材 ——
「不可能排除和最大得分不满足过关条件的矩阵」

图片 21

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

最大得分不知足过关条件的矩阵
求「矩阵」的最大得分是三个「公文包难点」,求解的算法简单:对现阶段矩阵用「递归」的方式把具备的消灭分支都进行1遍,并取最高分值。但是javascript 的「递归」极易「栈溢出」导致算法不能够施行。

事实上在新浪的话题中提到一个缓和方案:

英特网查到有先后提议做个工具随意生成关卡,自动测算,把符合得分条件的卡子筛选出来

本条消除方案代价是昂贵的!小编提供有源码并从未缓慢解决那一个主题素材,而是用一个相比取巧的艺术:进入游戏前检查是事为「不恐怕清除矩阵」,要是是重新生成关卡矩阵

注意:小编使用的取巧方案并从未减轻难点。

结语

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

图片 9

打闹的源码托管在:
里头玩耍落成的重头戏代码在:
机关识图的代码在:

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

感激您的开卷,本文由 坑坑洼洼实验室
版权全部。借使转发,请阐明出处:凹凸实验室()

1 赞 1 收藏
评论

图片 23

 三、查询课程名以“数据”四个字先导的具有科目标课程号和学科名。

7. 结语

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

图片 24

游戏的源码托管在:

谢谢耐心阅读完本文章的读者。本文仅表示小编的个人观点,如有不妥之处请不吝赐教。
假定对「H5游戏开采」感兴趣,招待关切大家的专栏。

Select cno,cname from c where cname like
‘数据%’

参考资料

  • Knapsack problem
  • NP-completeness
  • popstar关卡是什么样规划的?
  • 费雪耶兹乱序算法
  • 不定均分算法

    1 赞 收藏
    评论

图片 23

 

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

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

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

    Selectcno,count(*) from sc group by
cno

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

    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′ )

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

    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′ )

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

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

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

    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′

 

 二、找寻选修课程号为C四的上学的小孩子学号与姓名。

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

    注意本题也能够用嵌套做

思索本题改为“寻觅选修课程号为C肆的学生学号、姓名与成就”后还是能用嵌套做呢?

 

 三、寻找选修课程名称为 Maths
的学员学号与姓名。

    Selects.sno,sname from s,sc,c

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

只顾本题也得以用嵌套做

 

 四、寻找选修课程号为C贰或C4的上学的小孩子学号。

    Select distinctsno from sc where cno
in (‘C2′,’C4’)

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

 

 5、搜索选修课程号为C贰和C四的学员学号。

    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、寻找不学C二学科的上学的小孩子姓名和年龄。

    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′ )

 

 七、搜索选修了数据库学科的兼具学员姓名。(同三)

    Select snamefrom s,sc,c

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

 

 八、找寻数据库课程不比格的女人姓名。

    连接: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=’数据库’ )

               )

 

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

    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

思维本题也足以用嵌套做吧?

 

1一、寻找最少有二20个学生选修的科目名。

    Select cnamefrom c where cno in

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

小心本题也得以用一而再做

 

1二、找寻选修了不少于三门科目标上学的儿童姓名。

    Select snamefrom s where sno in

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

注意本题也得以用延续做

 

1三、寻找各门课程的实际业绩均不低于捌拾玖分的学生姓名。

   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 )

若是有1门十分的大于八十八分就会输出该学员学号

 

1四、搜索数据库课程战表一点都不小于该门课程平均分的学习者姓名。

    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=’数据库’

         )

一伍、寻觅种种系科男女学生的平均年龄和食指。

    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

         )

一7、(补充)查询每门学科的及格率。

    本题能够分三步做:

   

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

     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

   
第三步:每门课的合格人数/每门课选修人数

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

     where v_all.cno = v_pass.cno

 

1八、查询平均分比不上格的学员的学号,姓名,平均分。

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

    wherestudent.sno=sc.sno

    group bysc.sno,sname

    havingavg(grade)<60

心想本题也能够用嵌套做吗?

 

1九、查询平均分比不上格的学习者人数。

    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

这是各种学生有几门比不上格的多寡

 

三、

 一、查询薪资在1000到三千元以内的男人业务员的人名和办公编号。

    SelectYname,Ono from YWY

    where Salarybetween 1000 and 3000 and
Ysex=’男’

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

    SelectOno,count(*) from YWY group by
Ono

 三、查询各样客户在二零零二年5月购买出卖的总金额,输出客户号和对应的总金额。

    SelectKno,sum(Fmoney) from FP

    where Fdatebetween ‘2002.5.1’ and
‘2002.5.31’

    group by Kno

 四、查询二零零零年一月进货次数超过柒遍的兼具客户号,且按客户号升序排序。 

    Select Kno fromFP

    where Fdatebetween ‘2002.5.1’ and
‘2002.5.31’

    group by Kno

    havingcount(*)>5

    order by KnoASC

 五、查询各办公室男人和女人业务员的平均报酬。

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

 陆、查询二〇〇二年一月早就在王海亮业务员手中买入过商品的客户号、

            客户姓名和联系电话。

    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=’王海亮’ )

         )

    注意本题也能够用一而再做

 七、查询全体薪水比1538号业务员高的业务员的编号、姓名和薪资。

    SelectYno,Yname,Salary from YWY where
Salary >

         ( SelectSalary from YWY where
Yno=’1538′ )

 8、查询全体与153捌号业务员在同一个办公室的其余业务员的号码和姓名。

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

         ( SelectOno from YWY where
Yno=’1538′ )

 九、查询贩卖总金额最高的业务员的编号。

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

         ( Selectsum(Fmoney) from FP group
by Yno )

拾、查询全体业务员的数码、姓名、报酬以及薪俸比他高的别样业务员的平均报酬。

    应用自连接

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

    from   YWY Y1, YWY Y2

    where  Y1.Salary < Y2.Salary

    group by  Y1.Yno  

 

四、

 一、寻觅各类班级的班级代码、学生人数、平均成绩。

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

 贰、搜索各个学员的班级代码、学生姓名、考试科目数、总成绩。

    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、输出一张表格,有实际业绩低于57分的诸位学生对应一条记下,包涵字段:

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

    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、输出一张表格,有成就低于伍十八分的诸位学生对应一条记下,包涵字段:

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

    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

 六、输出一张表格,所有成绩都十分的大于陆十二分的各位学生对应一条记下,包罗字段:

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

    SelectBJDM,XSXM,avg(CJ) from SC

    group by BJDM,BNXH,XSXM

    havingmin(CJ)>=60

 7、输出一张表格,各类人学员对应一条记下,包罗字段:

         
班级代码、学生姓名、去掉3个最低分后的平分成绩。

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

    group byBJDM,BNXH,XSXM

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

         
科目、去掉贰个低于分后的平分战表。

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

    group by KM

 

 

 

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

 

 1、查询年龄在1玖至二十四虚岁之间的女子的学号,姓名,年龄,按年龄从大到小排列。

    Selectsno,sname,sage from
student

    where sagebetween 19 and 21 and
ssex=’女’

    order by sagedesc

 二、查询姓名中有“明”字的学习者人数。

    Select count(*)from student

    where snamelike “%明%”

 三、查询拾0一课程未有战绩的学习者的学号。

    Select sno fromsc where cno=’1001′ and
grade is null

 四、查询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、查询平均分超越九十多分的男学生学号及平均分。

    连接:

    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

    本题也能够用嵌套做

 八、查询 JSJ 系的学生选修的课程号。

    Select distinctcno from
student,sc

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

    本题也足以用嵌套做

 九、查询选修100二科目标学员的上学的小孩子姓名(用连续和嵌套二种艺术)

    连接: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

    考虑本题也足以用嵌套做呢?

1一、查询选修“数据库原理”课且战绩 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=’数据库原理’ )

               )

 

1肆、查询未有选修拾0二科目的上学的小孩子的上学的儿童姓名。

    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)

   
思虑本题也得以用一般的连年做呢?

一五、查询平均分最高的学生学号及平均分。

    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

                       )

          )

   

 

(三)检索至少选修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’
但上壹种写法越来越好有的。

(四)检索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 设有多个着力表奥迪Q7(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.四叁.4 设有多少个着力表Rubicon(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

叁.5 试叙述SQL语言的涉及代数特点和元组演算特点。
(P61-62)

3.六 试用SQL查询语句表述下列对教学数据库中多个主导表S、SC、C的询问:

(壹)总计有学员选修的学科门数。
    SELECT COUNT(DISTINCT C#) FROM SC

(二)求选修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′

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

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

(伍)检索学号比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

(六)检索姓名以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=’女’)
除法运算

三.七 试用SQL更新语句表明对教学数据库中四个着力表S、SC、C的依次更新操作:
(一)往基本表S中插入一个上学的小孩子元组(‘S九’,‘WU’,1八)。
    INSERT INTO S(S#,SNAME,AGE) VALUES(’59’,’WU’,18)
(2)在着力表S中搜寻每壹门科目成绩都跨越等于78分的上学的小孩子学号、姓名和性别,并把检索到的值送往另三个已存在的基本表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#)

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

(四)把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’)

(陆)把低于总平均战绩的女子学校友成绩提升伍%。
    UPDATE SC
    SET GRADE=GRADE*1.05
    WHERE GRADE<(SELECT AVG(GRADE) FROM SC) AND S# IN (SELECT S#
FROM SWHERE SEX=’F’)

(柒)在中央表SC中修改C四科目标成绩,若成绩小于等于7贰分时升高5%,若战表超乎七拾壹分时进步肆%(用四个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

三.8 在第三章例一.四中提到“客栈管理”关系模型有四个关系方式:
  零件 PART(P#,PNAME,COLOR,WEIGHT)
  项目 PROJECT(J#,JNAME,DATE)
  供应商 SUPPLIER(S#,SNAME,SADDR)
  供应 P_P(J#,P#,TOTOAL)
  采购 P_S(P#,S#,QUANTITY)

(壹)试用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四个基本表的当然联接定义为二个视图VIEW一,PART、P_S、SUPPLIE宝马7系四个基本表的自然联接定义为2个视图VIEW贰。
    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#

(三)试在上述八个视图的基础上进展数量查询:

    一)检索北京的供应商所供应的零件的号子和名字。
    SELECT P#,PNAME FROM VIEW2 WHERE SADDR=’SHANGHAI’

    二)检索项目J4所用零件的供应商编号和名字。
    SELECT S#,SNAME FROM VIEW2 WHERE P# IN(SELECT P# FROM VIEW1
WHERE J#=’J4′)

三.九 对此教学数据库中挑大梁表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
    不允许

三.十 预管理方式对于嵌入式SQL的兑现成如何首要意义?
   
预管理格局是先用预管理程序对源程序实行围观,识别出SQL语句,并处理成宿主语言的函数调用方式;
然后再用宿主语言的编写翻译程序把源程序编写翻译成目标程序。那样,不用扩展宿主语言的编写翻译程序,
就能管理SQL语句。

三.1壹 在宿主语言的程序中利用SQL语句有哪些规定?
在宿主语言的主次中央银行使SLQ语句有以下规定:
(一)在程序中要区分SQL语句与宿主语言说话
(二)允许嵌入的SQL语句引用宿主语言的次序变量(称为共享变量),但有两条规定:
   一)引用时,那几个变量前务必加“:”作为前缀标志,以示与数据库中变量有分别。
   二)这么些变量由宿主语言的程序定义,并用SQL的DECLARE语句表达。
(三)SQL的聚合管理格局与宿主语言单记录管理格局之间要和睦。
须求选择游标机制,把集结操作转变到单记录管理格局。

三.1二SQL的集合管理格局与宿主语言单记录管理格局之间怎么和谐?
    由于SQL语句管理的是记录集合,而宿主语言语句三次只可以管理一个记录,
由此须要用游标(cousor)机制,把集结操作转换来单记录管理格局。

贰.一叁 嵌入式SQL语句曾几何时不必涉及到游标?何时必须涉及到游标?
    (一)INSERT、DELETE、UPDATE语句,查询结果料定是单元组时的SELECT语句,
都可一贯嵌入在主程序中选拔,不必涉及到游标。
    (二)当SELECT语句询问结果是三个元组时,此时宿主语言程序不只怕利用,
一定要用游标机制把多个元组一回三个地传递给宿主语言管理。

 

 

 

(电商)数据库原理及运用_上行下效考核武器试验题及参考答案

 

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

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

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

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

       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

    五.下列(   
)图标是Access中表对象的标记。

       A.         B.         C.        D.

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

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

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

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

   
捌.在3个宏中要开垦一个报表,应该运用的操作是(    )。

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

   
九.得以经过Internet举办数据公布的对象是(    )。

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

   拾.模块窗口由(   
)个部分组成。

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

 

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

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

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

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

   
肆.在二个关乎中不允许现身重复的____元组____,也分裂意出现具备同样名字的___属性_____。

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

   
陆.在存取数据库的数目标进度中,使用了七个数据缓冲区,分别为___系统_____缓冲区和____用户
____缓冲区。

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

   
八.设一个提到A具备a一天性子和a3个元组,关系B具备b2个属性和b二个元组,则涉嫌A´B具有___a1+b1____个性情和____
a2´b2 ____个元组。

   
玖.设1个上学的小孩子关系为S(学生号,姓名),课程关系为C(课程号,课程名),选课关系为X(学生号,课程号,战绩),求出全数选课的学习者信息的演算表明式为_____Õ学生号(X)______与____S
____的本来连接。

   10.在一个涉及奥迪Q7中,若存在X→Y和X→Z,则存在_____
X→(Y,Z)_______,称此为函数正视的合并性规则。

 

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

   
一.若一个提到的其他非主属性都不有的借助依赖于其余候选码,则称该关系达成____第二____范式。

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

   三.
在SQL中,各样视图中的列能够来自区别的___表___,它是在原有表的功底上____建立____的逻辑意义上的新涉及。

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

   
5.对此较复杂的连串,概念设计阶段的基本点任务是:首先根据系统的逐条部分应用画出各自对应的____局部ER图______,然后再展开归结和完整统一策动,画出_____整体ER图_____。

   
6.机器达成阶段的对象是在电脑系列中赢得1个满意______布置要求、成效完善、操作方便___的数据库应用系统。

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

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

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

 

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

   一.
设四个涉嫌为陆风X八(A,B,C,D,E),它的相当小函数信赖集为FD={A→B,A→C,(C,D)→E},则该关系的候选码为_____(A,D)___,候选码函数决定E是___伪传递___性。

   
二.设二个提到为Enclave(A,B,C,D,E),它的微乎其微函数正视集为FD={A→B,A→C,(A,D)→E},该关系只知足___第一_____范式,若要标准化为高级中学一年级流的范式,则将赢得____2____个关系。

   
三.在其实的数据库管理类别中,对数据库的操作办法有_____一声令下交互、程序试行、窗口分界面______等三种。

    四.在SQL中,主码约束的基本点字为____
primary key________,外码约束的主要字为______foreignkey
______。

   
五.基本表属于全局形式中的表,它是____实表____,而视图则属于有些情势中的表,它是____虚表
____。

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

   
七.数据字典是对系统职业流程中____数据____和____处理____的描述。

   
8.关周详据库系统中的全局情势由若干个基本表所结合,表与表之间的关系是经过定义的____主码____和____外码____实现的。

   
玖.在客栈管理中,涉及到的基本表有两个,它们各自为客房表、留宿表、_____行人登记表、消费卡表____。

   ⑩.在装置或吊销数据库密码的长河中,密码对于字母     大小写     是乖巧的。

 

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

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

   
二.Access“表”结构设计窗口中上半局地的“表设计器”是由     字段名称、数据类型   和验证等叁列组成。

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

    4.在Access中模块分为   类模块      
和       标准模块     两类别型。

 

   
陆、依据主教材第5章所给的商品库和教学库,也许依据下列所给的每条SQL查询语句写出相应的服从,大概根据下列所给的每一个功用写出相应的SQL查询语句。(每小题陆分,共十八分)

   
在名叫货色库的数据库中包罗有商品表一和商品表二,它们的概念分别为:

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

       商品表二(商品代号 char(八),产地 char(陆),品牌char(陆),)

   
在名叫教学库的数据库中蕴藏有学员、课程和选课多少个表,它们的定义分别为:

       学生(学生号 char(7),姓名 char(六),性别
char(二),出破壳日期 datetime,

            专业 char(10),年级 int)

       课程(课程号 char(四),课程名 char(拾),课程学分
int

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

    1.select distinct 产地

        from 商品表2

       功效:从事商业品库中询问出全部商品的两样产地。

 

    2.select *

        from 学生

        where 学生号 in (select
学生号

          from 选课

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

        )

   
效能:从事教育工作学库中询问出只选修了1门学科的全体学生。

 

    3.select *

         from 学生

         where 学生号 in (select
学生号

           from 选课

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

         ) or not exists (select *

              from 选课

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

         )

    成效:
从教学库中询问出最多选修了二门科目(含未选任何学科)的整整上学的儿童。

 

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

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

        from 商品表1

        group by 分类名

 

   
五.从事教育工作学库中查询出至少选修了人名字为@m一学生所选课程中一门课的漫天学员。

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.  
问题: 

柒.  
一、查询“00一”课程比“00二”课程成绩高的有所学生的学号; 

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#; 

1一. 
贰、查询平均成绩超越56分的同学的学号和平均战表; 

12. 
    select S#,avg(score) 

13. 
    from sc 

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

1五. 
三、查询全体同学的学号、姓名、选课数、总战绩; 

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 

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

20. 
  select count(distinct(Tname)) 

21. 
  from Teacher 

22. 
  where Tname like ‘李%’; 

二三. 
五、查询没学过“叶平”老师课的校友的学号、姓名; 

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=’叶平’); 

二柒. 
6、查询学过“001”并且也学过数码“00二”课程的同学的学号、姓名; 

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′); 

2九. 
七、查询学过“叶平”老师所教的全部课的同桌的学号、姓名; 

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. 
⑧、查询课程编号“00二”的成绩比课程编号“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. 
玖、查询全数科目战表小于陆拾叁分的同室的学号、姓名; 

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. 
十、查询没有学全全体课的同班的学号、姓名; 

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. 
1一、查询至少有壹门课与学号为“100一”的同学所学一样的同学的学号和人名; 

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

四陆. 
1二、查询至少学过学号为“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. 
壹三、把“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=’叶平’); 

5四. 
1四、查询和“100贰”号的同室学习的学科完全一样的别的同学学号和人名; 

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. 
一五、删除学习“叶平”老师课的SC表记录; 

58. 
    Delect SC 

59. 
    from course ,Teacher  

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

61. 
1陆、向SC表中插入一些笔录,那么些记录供给符合以下规范:未有上过编号“00三”课程的同窗学号、2、 

6二. 
    号课的平分战表; 

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′); 

陆伍. 
壹柒、按平均成绩从高到低展现全部学员的“数据库”、“集团管理”、“瑞典语”三门的课程战表,按如下格局呈现: 学生ID,,数据库,集团管理,葡萄牙共和国(República Portuguesa)语,有效课程数,有效平均分 

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#=’00一’) 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)  

7四. 
1⑧、查询各科战表最高和压低的分:以如下情势显得:课程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. 
                    ); 

8八. 
1玖、按各科平均战绩从低到高和及格率的百分比从高到低顺序 

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 

玖五. 
20、查询如下课程平均成绩和及格率的比重(用”一行”彰显): 企管(001),马克思(00二),OO&UML (00叁),数据库(00四) 

96. 
    SELECT SUM(CASE WHEN C# =’001′ THEN score ELSE 0 END)/SUM(CASE C# WHEN ’00一’ 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# = ’00一’ THEN 一 ELSE 0 END) AS 公司管理及格百分数 

98. 
        ,SUM(CASE WHEN C# = ‘002’ THEN score ELSE 0 END)/SUM(CASE C# WHEN ’00二’ THEN 一 ELSE 0 END) AS 马克思平均分 

99. 
        ,100 * SUM(CASE WHEN C# = ‘002’ AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = ’00二’ THEN 壹 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# = ’00三’ THEN 1 ELSE 0 END) AS UML及格百分数 

102.                ,SUM(CASE WHEN C# = ‘004’ THEN score ELSE 0 END)/SUM(CASE C# WHEN ’00四’ THEN 一 ELSE 0 END) AS 数据库平均分 

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

104.          FROM SC 

拾5.        二一、查询分歧老师所教不相同学科平均分从高到低显示 

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 

11一.        22、查询如下课程成绩第 3 名到第 陆 名的学员成绩单:企业管理(00一),马克思(00二),UML (00叁),数据库(00四) 

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

113.            SELECT  DISTINCT top 3 

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

1一五.                Student.Sname AS 学生姓名 , 

116.              T一.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.         

14七.        二三、计算列印各科成绩,各分数段人数:课程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.        二4、查询学毕生均成绩及其排名 

158.              SELECT 一+(SELECT COUNT( distinct 平均战绩) 

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

160.                              FROM SC 

161.                          GROUP BY S# 

162.                          ) AS T1 

16三.                    WHERE 平均成绩 > T二.平均成绩) as 名次, 

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

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

166.                    FROM SC 

167.                GROUP BY S# 

168.                ) AS T2 

16玖.            OPAJERODE奇骏 BY 平均战绩 desc; 

170.          

17一.        二5、查询各科战表前三名的笔录:(不思虑战表并列情形) 

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.        二陆、查询每门学科被选修的学习者数 

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

1八2.        2七、查询出只选修了一门科目的一切学员的学号和姓名 

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; 

1八陆.        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=’女’; 

18玖.        2九、查询姓“张”的学生名单 

190.            SELECT Sname FROM Student WHERE Sname like ‘张%’; 

191.        30、询问同名同性学生名单,并总括同有名的人数 

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

1玖三.        3一、一9八伍年降生的学生名单(注: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′; 

1九柒.        3贰、查询每门学科的平均成绩,结果按平均成绩升序排列,平均战表同样时,按学科号降序排列 

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

19九.        33、查询平均成绩超越八伍的保有学员的学号、姓名和平均战绩 

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.        3四、查询课程名字为“数据库”,且分数低于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.        3伍、查询全体学生的选课景况; 

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

209.            FROM SC,Student,Course 

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

21壹.        3陆、查询别的1门学科战绩在六十九分以上的全名、课程名称和分数; 

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#; 

二一5.        三柒、查询不比格的科目,并按学科号从大到小排列 

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

贰1七.        3八、查询课程编号为003且课程成绩在7十四分以上的上学的小孩子的学号和姓名; 

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

21玖.        3玖、求选了课程的上学的小孩子人数 

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# ); 

2二5.        肆一、查询各类学科及相应的选修人数 

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

2二七.        4二、查询区别科目成绩同样的上学的小孩子的学号、课程号、学生战绩 

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

22九.     4三、查询每门功课战表最佳的前两名 

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#; 

23捌.        44、计算每门课程的上学的小孩子选修人数(超过12个人的教程才计算)。供给输出课程号和选修人数,查询结果按人头降序排列,查询结果按人口降序排列,若人数同样,按学科号升序排列  

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

240.            from  sc  

241.            group  by  C# 

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

二四叁.        45、检索至少选修两门学科的上学的儿童学号 

244.            select  S#  

245.            from  sc  

246.            group  by  s# 

247.            having  count(*)  >  =  2 

24八.        四陆、查询任何学生都选修的科目标课程号和科目名 

249.            select  C#,Cname  

250.            from  Course  

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

25贰.        肆柒、查询没学过“叶平”老师授课的任1门科目标学童姓名 

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=’叶平’); 

25四.        4八、查询两门以上比不上格课程的校友的学号及其平均战绩 

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#; 

25陆.        49、检索“00肆”课程分数小于60,按分数降序排列的同窗学号 

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

25八.        50、删除“00二”同学的“00一”课程的战表 

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.
元组、属性

   ⑤.
数据库管理员、数据库设计师、应用技师、终端用户(次序无先后)

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

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

    10. X→(Y,Z)

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

 

   1. 第二                           
2.6、4

   三. 表、建立                        四.
分组总结、排序

   五. 局地EBMWX三图、全体ECR-V图            6.
安排供给、效用完善、操作便利

   七.
标题栏、菜单栏、工作区(次序无先后)

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

   九. 页眉、主体(次序无先后)

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

 

   1. (A,D)、伪传递                     

  1. 第一、2

   三.
命令交互、程序施行、窗口分界面(次序无先后)

   4. primary key、foreign key

   5. 实表、虚表                        

  1. 连接、选择

   7. 数据、管理(次序无先后)          

  1. 主码、外码(次序无先后)

   玖. 旅客登记表、消费卡表(次序无先后)

  1. 大小写

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

 

   1. 标题栏、菜单栏、专门的工作区  
(次序无先后)

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

   叁. 页眉、主体、页脚        
(次序无先后)

  1. 类模块、标准模块        
    (次序无先后)

 

   
陆、依照主教材第伍章所给的商品库和教学库,或然依据下列所给的每条SQL查询语句写出相应的效益,只怕依照下列所给的各个作用写出相应的SQL查询语句。(每小题陆分,共十八分)

   一.
从事商业品库中查询出富有商品的不等产地。

   贰.
从教学库中询问出只选修了一门课程的1切上学的小孩子。

   3.
从事教育工作学库中询问出最多选修了二门学科(含未选任何学科)的整套学员。

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

        from 商品表1

        group by 分类名

   5. select distinct 学生.*

        from 学生,选课

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

          from 学生,选课

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

        )

 

三.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)。
(七)列:在SQL中,把守旧的关联模型中的属性称为列(coloumn)。
(8)实表:基本表被称为“实表”,它是实际存放在数据库中的表。
(9)虚表:视图被称之为“虚表”,创立三个视图时,只把视图的概念存储在数额词典中,而不存款和储蓄视图所对应的数量。
(10)相关子查询:在嵌套查询中出现的符合以下特点的子查询:子查询中询问条件依赖于外层查询中的有些值,
所以子查询的管理不只二遍,要反复求值,以供外层查询利用。
(11)联网查询:查询时先对表展开笛Carl积操作,然后再做等值联接、选取、投影等操作。
联接查询的成效比嵌套查询低。
(12)交互式SQL:在终端交互方式下行使的SQL语言称为交互式SQL。
(13)嵌入式SQL:嵌入在高级语言的次第中应用的SQL语言称为嵌入式SQL。
(14)共享变量:SQL和宿主语言的接口。共享变量有宿主语言程序定义,再用SQL的DECLARE语句表达,
SQL语句就可援引那些变量传递数据库音信。
(15)游标:游标是与某一查询结果相联系的号子名,用于把集结操作转变到单记录管理形式。
(16)卷游标:为了打败游标在推进时不能够回去的勤奋,SQL2提供了卷游标技能。
卷游标在力促时不只好沿查询结果兰秋组顺序从头到尾1行行推进,也能1行行再次来到。

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

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

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

(叁)检索至少选修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’))

(伍)检索至少选修两门学科的学生学号。
    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#))

要从语义上分解:(一)选拔课程的教程号与课程名,不设有不选那门课的同桌。
   个中,“不选那门课的同学”能够表示为:

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 设有多个着力表CRUISER(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

三.四三.四 设有多少个基本表瑞鹰(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

三.5 试叙述SQL语言的涉及代数特点和元组演算特点。
(P61-62)

三.陆 试用SQL查询语句表述下列对教学数据库中几当中央表S、SC、C的查询:

(一)总计有学生选修的教程门数。
    SELECT COUNT(DISTINCT C#) FROM SC

(二)求选修C四课程的上学的小孩子的平均年龄。
    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′

(三)求LIU老师所授课程的每门学科的学员平均成绩。
   SELECT CNAME,AVG(GRADE)
   FROM SC ,C
   WHERE SC.C#=C.C# ANDTEACHER=’LIU’
   GROUP BY C#   

(4)计算每门课程的学员选修人数(抢先十二个人的课程才计算)。须求输出课程号和选修人数,查询结果按人口降序排列,若人数一样,按学科号升序排列。
    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

(六)检索姓名以WANG打头的兼具学生的姓名和年龄。
    SELECT SNAME,AGE
    FROM S
    WHERE SNAME LIKE ‘WANG%’

(七)在SC中搜寻战绩为空值的学习者学号和课程号。
    SELECT S#,C#
    FROM SC
    WHERE GRADE IS NULL

(八)求年龄超越女子高校友平均年龄的男学生姓名和年龄。
    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=’女’)

三.七 试用SQL更新语句表明对教学数据库中几个核心表S、SC、C的顺序更新操作:
(一)往基本表S中插入2个学生元组(‘S九’,‘WU’,18)。
    INSERT INTO S(S#,SNAME,AGE) VALUES(’59’,’WU’,18)
(二)在大旨表S中搜寻每1门课程成绩都超越等于77分的学生学号、姓名和性别,并把检索到的值送往另1个已存在的基本表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#)

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

(四)把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)把低于总平均成绩的女子高校友成绩提升伍%。
    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课程的成就,若成绩小于等于七十二分时进步伍%,若战绩当先七十多分时升高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

三.八 在第一章例一.肆中涉嫌“仓库管理”关系模型有七个涉及方式:
  零件 PART(P#,PNAME,COLOR,WEIGHT)
  项目 PROJECT(J#,JNAME,DATE)
  供应商 SUPPLIER(S#,SNAME,SADDR)
  供应 P_P(J#,P#,TOTOAL)
  采购 P_S(P#,S#,QUANTITY)

(壹)试用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多个基本表的自然联接定义为2个视图VIEW1,PART、P_S、SUPPLIE本田UR-V八个基本表的当然联接定义为二个视图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#

(三)试在上述多个视图的底子上进展多少查询:

    一)检索北京的供应商所供应的零部件的号码和名字。
    SELECT P#,PNAME FROM VIEW2 WHERE SADDR=’SHANGHAI’

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

三.九 对此教学数据库中着力表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.十 预管理格局对于嵌入式SQL的贯彻有何样首要意义?
   
预管理格局是先用预管理程序对源程序开始展览扫描,识别出SQL语句,并拍卖成宿主语言的函数调用格局;
然后再用宿主语言的编译程序把源程序编写翻译成目的程序。那样,不用扩展宿主语言的编写翻译程序,
就能管理SQL语句。

3.1壹 在宿主语言的主次中选用SQL语句有啥规定?
在宿主语言的程序中动用SLQ语句有以下规定:
(1)在先后中要不一样SQL语句与宿主语言说话
(2)允许嵌入的SQL语句引用宿主语言的先后变量(称为共享变量),但有两条规定:
   一)引用时,那么些变量前必须加“:”作为前缀标记,以示与数据库中变量有分别。
   二)这几个变量由宿主语言的程序定义,并用SQL的DECLARE语句表达。
(三)SQL的集聚管理格局与宿主语言单记录管理格局之间要和煦。
须要使用游标机制,把会集操作调换到单记录管理格局。

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

二.一三 嵌入式SQL语句几时不必涉及到游标?哪一天必须涉及到游标?
    (壹)INSERT、DELETE、UPDATE语句,查询结果必然是单元组时的SELECT语句,
都可间接嵌入在主程序中应用,不必涉及到游标。
    (二)当SELECT语句询问结果是四个元组时,此时宿主语言程序不能够接纳,
一定要用游标机制把八个元组2遍3个地传递给宿主语言管理。

 

相关文章