H伍游戏开辟:消灭星星

2018/01/25 · HTML5 ·
游戏

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

「消灭星星」是一款很卓绝的「化解类游戏」,它的玩法一点也不细略:化解相连通的同色砖块。

必发娱乐官方网站 1

H伍游戏开拓:一笔画

2017/11/07 · HTML5 ·
游戏

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

必发娱乐官方网站 2

SQL 练习题答案

一. 游戏规则

「消灭星星」存在四个版本,然则它们的规则除了「关卡分值」有个别出入外,其余的平整都以如出壹辙的。作者介绍的本子的游戏规则整理如下:

一. 色砖遍及

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

2. 消除规则

四个或七个以上同色砖块相连通正是可被铲除的砖头。

三. 分值规则

  • 解除总分值 = n * n * 5
  • 奖赏总分值 = 3000 – n * n * 20

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

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

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

4. 关卡分值

关卡分值 = 一千 + (level – 一) * 两千;「level」即日前关卡数。

伍. 通过海关条件

  • 可免去色块不设有
  • 总共分值 >= 当前关卡分值

地点四个规范还要建立游戏才足以过得去。

H伍游戏开荒:一笔画

by leeenx on 2017-11-02

单笔画是图论[科普](https://zh.wikipedia.org/wiki/%E5%9B%BE%E8%AE%BA)中3个有名的标题,它起点于柯Cordova堡7桥难点[科普](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桥难点,也建议了一笔画定理,顺带消除了一笔画难点。用图论的术语来说,对于一个加以的连通图[科普](https://zh.wikipedia.org/wiki/%E8%BF%9E%E9%80%9A%E5%9B%BE)存在一条恰好含有所有线段并且未有重新的门径,那条路径就是「一笔画」。

寻找连通图那条路线的经过正是「一笔画」的玩乐经过,如下:

必发娱乐官方网站 3

 

二. 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 十 的表格用长度为 拾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
]

锐界 – 黑古铜色,G – 玛瑙红,B – 茶绿,Y – 黄褐,P – 深黄。Model
的骨干职务是以下四个:

  • 更动砖墙
  • 免去砖块 (生成砖块分值)
  • 压实砖墙
  • 扫除残砖 (生成奖赏分值)

底图绘制

「一笔画」是多关卡的游玩情势,小编决定把关卡(连通图)的定制以贰个布署接口的样式对外揭示。对外暴光关卡接口需求有一套描述连通图形状的专门的学业,而在笔者前面有七个采用:

  • 点记法
  • 线记法

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

必发娱乐官方网站 4

点记法如下:

JavaScript

levels: [ // 当前关卡 { name: “5角星”, 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: “5角星”, 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中,它是有序性的笔录。「线记法」通过两点描述连通图的线条,它是九冬的笔录。「点记法」最大的优势是表现更简洁,但它必须记录1个通过海关答案,小编只是关卡的苦力不是关卡成立者,所以作者最后摘取了「线记法」。:)

 

3.壹 生成砖墙

砖墙分两步生成:

  • 色砖数量分配
  • 击败色砖

辩解上,可以将 十0 个格子能够均分到 五类颜色,可是作者玩过的「消灭星星」都不应用均分政策。通过分析两款「消灭星星」,其实能够窥见叁个规律
—— 「色砖之间的数码差在2个稳固的区间内」。

只要把古板意义上的均分称作「完全均分」,那么「消灭星星」的分配是壹种在均分线上下波动的「不完全均分」。

必发娱乐官方网站 5

小编把下边包车型地铁「不完全均分」称作「波动均分」,算法的有血有肉得以完结能够敬重「兵慌马乱均分算法」。

「打垮色砖」其实正是将数组乱序的经过,小编推荐应用「
费雪耶兹乱序算法」。

以下是伪代码的贯彻:

JavaScript

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

互动绘制

在画布上制图路径,从视觉上实属「选用或延续连通图端点」的历程,那个历程供给化解1个难点:

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

收罗连通图端点的坐标,再监听手指滑过的坐标能够精通「手指下是不是有点」。以下伪代码是采撷端点坐标:

JavaScript

// 端点坐标消息 let coords = []; lines.forEach(({x一, y1, x2, y2})
=> { // (x壹, 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; // 端点半径
—— 取连通图端点半径的贰倍,进步活动端体验 let r = radius * 2;
for(let [x, y] of coords){ if(Math.sqrt(Math.pow(x – x0, 二) +
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;
}
}
})

在未绘制任何线段或端点此前,手指滑过的大四端点都会被看成「一笔画」的初始点;在绘制了线段(或有选中式点心)后,手指滑过的端点能还是不可能与选中式点心串连成线段供给依照现存规则实行决断。

必发娱乐官方网站 6

上海教室,点A与点B可总是成线段,而点A与点C不能够接二连三。小编把「能够与钦命端点连接成线段的端点称作一蹴而就连接点」。连通图端点的实用连接点从连通图的线条中领到:

JavaScript

coords.forEach(coord => { // 有效连接点(坐标)挂载在端点坐标下
coord.validCoords = []; lines.forEach(({x1, 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

回头本节内容开首提的四个难题「手指下是不是有端点」 与
「选中点到待选中式点心之间是或不是成线」,其实可统壹为一个难题:手指下是否留存「未成线的实惠连接点」。只须把监听手指滑动遍历的数组由连通图全体的端点坐标
coords 替换为当下选中式点心的「未成线的有效性连接点」就能够。

迄今「一笔画」的基本点功效已经得以落成。能够超过体验一下:

必发娱乐官方网站 9

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

三.二 化解砖块

「化解砖块」的平整很简短 —— 左近相连通同样色即能够撤废

必发娱乐官方网站 10
前五个结合符合「相邻相连通一样色就可以以祛除」,所以它们能够被扫除;第12个结合即便「相邻同样色」不过不「相联接」所以它不可能被铲除。

「消除砖块」的同时有贰个注重的职责:生成砖块对应的分值。在「游戏规则」中,作者曾经提供了相应的数学公式:「解决砖块得分值
= 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 * 拾 +
伍); // 标志当前分值 deleteTile(tile); // 删除砖块 }); //
清除达成,跳出循环 if(next萨姆eTiles.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;
}
}
}
}

扫除的算法使用「递归」逻辑上会清晰一些,不过「递归」在浏览器上轻松「栈溢出」,所以笔者未有应用「递归」完成。

电动识图

笔者在录加入关贸总协定组织卡配置时,开采二个七条边以上的衔接图很轻便录错或录重线段。作者在观念是不是开荒1个自动识别图形的插件,毕竟「一笔画」的图纸是有平整的几何图形。

必发娱乐官方网站 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.三 加强砖墙

砖墙在排除了有的砖块后,会产出空洞,此时亟待对墙体进行压实:

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

壹种高效的贯彻方案是,每一趟「消除砖块」后一贯遍历砖墙数组(十×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. 空驶列车左边的砖块向左移动

墙体在「狠抓」进程中,它的边界是实时在云谲风诡,若是「加强」不按实际边界进行围观,会产生多余的空域扫描:

必发娱乐官方网站 12

什么样记录墙体的界限?
把墙体拆分成1个个单身的列,那么列最顶部的空白格片段正是墙体的「空白」,而其余非顶部的空白格片段即墙体的「空洞」。

必发娱乐官方网站 13

小编使用1组「列集结」来讲述墙体的边界并记下墙体的抽象,它的模型如下:

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},
];

其1模型可以描述墙体的多个细节:

  • 空列
  • 列的连接空洞
  • 列的非接二连三空洞
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

它的做实进度与思梅止渴类似,那里就不赘述了。

端点识别

答辩上,通过搜罗的「色值表」能够一贯把端点的坐标志别出来。我设计的「端点识别算法」分以下二步:

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

取到端点的主色后,再跑壹回「端点识别算法」后居识别出 20一个端点!那是为啥吗?

必发娱乐官方网站 17

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

必发娱乐官方网站 18

由此上海体育场面,能够直观地搜查缴获二个结论:识别出来的小端点只在目的(大)端点上汇集布满,并且大端点范围内的小端点叠加交错。

假诺把叠加交错的小端点归并成2个四头点,那么这几个大端点将格外看似目标端点。小端点的相会伪代码如下:

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(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;
}
}
}

加了小端点归并算法后,「端点识别」的正确度就上来了。经小编本地质度量试已经可以百分百 识别有损的过渡图了。

 

三.四 化解残砖

上一小节提到了「描述墙体的分界并记录墙体的架空」的「列集结」,作者是一贯动用这些「列集结」来祛除残砖的,伪代码如下:

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 代表两点的相距,BMWX叁表示端点半径。局地提取「样式点」如下:

必发娱乐官方网站 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一 – x二) / N,
stepY = (y一 – y2) / 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
存在,判定颜色是不是1致 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 销毁游戏

应用「自动识图」的建议

就算作者在地点测试的时候能够把持有的「底图」识别出来,不过并不能够担保别的开辟者上传的图形是还是不是被很好的辨识出来。小编提议,能够把「自动识图」做为1个单独的工具使用。

笔者写了1个「自动识图」的独自工具页面:
能够在那几个页不熟悉成对应的关卡配置。

 

6. 问题

在天涯论坛有3个有关「消灭星星」的话题:popstar关卡是怎么样统一筹划的?

那几个话题在结尾提出了1个题材 ——
「无法消除和最大得分不满足过关条件的矩阵」

必发娱乐官方网站 21

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

最大得分不满意过关条件的矩阵
求「矩阵」的最大得分是叁个「手提袋难题」,求解的算法简单:对当前矩阵用「递归」的方式把全数的消灭分支都实施二遍,并取最高分值。可是javascript 的「递归」极易「栈溢出」导致算法不可能实践。

实在在网易的话题中涉嫌一个化解方案:

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

以此消除方案代价是昂贵的!笔者提供有源码并从未化解这么些主题素材,而是用八个相比取巧的格局:进入游戏前检查是事为「不可能清除矩阵」,就算是再一次生成关卡矩阵

小心:作者利用的取巧方案并从未化解难题。

结语

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

必发娱乐官方网站 9

娱乐的源码托管在:
里面游戏落成的主体代码在:
自动识图的代码在:

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

多谢您的读书,本文由 坑坑洼洼实验室
版权全部。若是转发,请评释出处:凹凸实验室()

1 赞 1 收藏
评论

必发娱乐官方网站 23

 3、查询课程名以“数据”八个字开始的有着课程的课程号和学科名。

7. 结语

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

必发娱乐官方网站 24

玩耍的源码托管在:

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

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

参考资料

  • Knapsack problem
  • NP-completeness
  • popstar关卡是哪些安插的?
  • 费雪耶兹乱序算法
  • 不定均分算法

    1 赞 收藏
    评论

必发娱乐官方网站 23

 

 四、查询每一个学员具有课程的平均成绩,输出学生学号和平均成绩。

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

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

    Selectcno,count(*) from sc group by
cno

 6、查询选修柒号课程的学习者的学号、姓名、性别。

    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号课程的上学的小孩子的平均年龄。

    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、查询全数考试成绩的平分分同样的上学的小孩子学号分组

二、

 一、找寻选修课程号为C贰的学员学号与成就。

Select sno,grade from sc where
cno=’C2′

 

 二、搜索选修课程号为C四的学生学号与姓名。

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

    注意本题也足以用嵌套做

思想本题改为“寻找选修课程号为C四的学习者学号、姓名与成就”后还可以用嵌套做吗?

 

 3、寻找选修课程名称为 Maths
的学习者学号与姓名。

    Selects.sno,sname from s,sc,c

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

留意本题也能够用嵌套做

 

 4、找寻选修课程号为C二或C四的学生学号。

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

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

 

 伍、搜索选修课程号为C2和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’正确吗?

 

 陆、寻找不学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′ )

 

 七、找寻选修了数据库学科的保有学员姓名。(同三)

    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

考虑本题也能够用嵌套做吧?

 

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

    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 )

瞩目本题也得以用接二连三做

 

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 )

假如有一门不低于捌拾陆分就会输出该学生学号

 

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

1陆、寻觅Computer系(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

         )

一七、(补充)查询每门课程的及格率。

    本题能够分三步做:

   

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

     createview  v_all(cno,cnt)

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

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

     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

 

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 )

    上面是2个非凡的荒唐

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

那是各类学生有几门不如格的数据

 

三、

 一、查询报酬在一千到三千元之间的男性业务员的真名和办公编号。

    SelectYname,Ono from YWY

    where Salarybetween 1000 and 3000 and
Ysex=’男’

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

    SelectOno,count(*) from YWY group by
Ono

 三、查询种种客户在二〇〇四年12月购买出卖的总金额,输出客户号和相应的总金额。

    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

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

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

 6、查询贰零零肆年10月曾经在王海亮业务员手中购得过商品的客户号、

            客户姓名和联系电话。

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

 八、查询全部与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 )

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=’外语’

 四、输出一张表格,有成绩低于五十四分的各位学生对应一条记下,包含字段:

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

    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

 6、输出一张表格,全部战表都不低于伍十九分的每人学生对应一条记下,包蕴字段:

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

    SelectBJDM,XSXM,avg(CJ) from SC

    group by BJDM,BNXH,XSXM

    havingmin(CJ)>=60

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

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

   
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

 

 

 

        实验辅导中“8 SQL查询语句”
的答案

 

 一、查询年龄在19至二一岁时期的女人的学号,姓名,年龄,按年龄从大到小排列。

    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

 伍、总计每1门课的总分、平均分,最高分、最低分。

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

    from sc

    group by cno

 六、查询平均分胜出87分的男学生学号及平均分。

    连接:

    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

 七、查询选修课程超越二门的学童姓名。

    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、查询选修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)

   
思虑本题也能够用一般的连年做啊?

一5、查询平均分最高的上学的小孩子学号及平均分。

    Selectsno,avg(grade)

    from sc

    group by sno

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

                              from
sc

                              group by
sno

                            )

1陆、查询每门学科战表都超越该门课程平均分的学童学号。

    能够先计算每门课程平均分

    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老师所授课程中1门科目标女学员姓名。
    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’
但上1种写法越来越好有的。

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

叁.三 设有四个大旨表BMWX伍(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 设有几个宗旨表CRUISER(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

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

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

(1)总计有上学的小孩子选修的课程门数。
    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#   

(肆)总括每门课程的学生选修人数(超越十二人的科目才总括)。要求输出课程号和选修人数,查询结果按人头降序排列,若人数一样,按学科号升序排列。
    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=’女’)
除法运算

3.七 试用SQL更新语句表达对教学数据库中四个为主表S、SC、C的顺序更新操作:
(1)往基本表S中插入一个学生元组(‘S九’,‘WU’,1八)。
    INSERT INTO S(S#,SNAME,AGE) VALUES(’59’,’WU’,18)
(贰)在主题表S中搜索每一门学科战表都高于等于七15分的学生学号、姓名和性别,并把检索到的值送往另二个已存在的基本表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’)

(7)在基本表SC中期维修改C4课程的成就,若战绩小于等于陆拾7分时升高伍%,若成绩抢先7一分时进步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三个基本表的本来联接定义为二个视图VIEW一,PART、P_S、SUPPLIE瑞鹰五个基本表的当然联接定义为三个视图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’

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

三.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
    不允许

三.拾 预管理格局对于嵌入式SQL的兑现成怎么着主要意义?
   
预管理情势是先用预管理程序对源程序举办围观,识别出SQL语句,并管理成宿主语言的函数调用格局;
然后再用宿主语言的编写翻译程序把源程序编写翻译成目标程序。那样,不用扩充宿主语言的编写翻译程序,
就能管理SQL语句。

三.1一 在宿主语言的主次中动用SQL语句有哪些规定?
在宿主语言的顺序中应用SLQ语句有以下规定:
(壹)在程序中要区分SQL语句与宿主语言说话
(2)允许嵌入的SQL语句引用宿主语言的先后变量(称为共享变量),但有两条规定:
   1)引用时,那么些变量前必须加“:”作为前缀标记,以示与数据库中变量有分别。
   2)那几个变量由宿主语言的程序定义,并用SQL的DECLARE语句表达。
(三)SQL的汇集管理方式与宿主语言单记录管理情势之间要和煦。
须求选取游标机制,把集合操作转变来单记录管理格局。

三.12SQL的聚众管理形式与宿主语言单记录管理情势之间什么和谐?
    由于SQL语句管理的是记录集结,而宿主语言语句1回只可以管理三个记录,
因而要求用游标(cousor)机制,把集结操作转变来单记录处理方式。

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

 

 

 

(电商)数据库原理及运用_仿照考核武器试验题及参考答案

 

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

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

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

   
贰.比如某一字段数据型为文本型,字段大小为捌,该字段中最多可输入(   
)个汉字。

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

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

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

    肆.Access用户操作分界面由(   
)部分构成。

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

    5.下列(   
)Logo是Access中表对象的注明。

       A.         B.         C.        D.

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

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

    七.Access中包括有(   
)种数据类型。

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

   
八.在三个宏中要开垦1个表格,应该利用的操作是(    )。

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

   
九.方可通过Internet进行数据发布的靶子是(    )。

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

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

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

 

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

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

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

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

   
四.在三个涉嫌中不相同意出现重复的____元组____,也差异意出现具备同等名字的___属性_____。

   
伍.数据库系统中的4类用户分别为____数据库助理馆员、数据库设计师、应用程序猿、终端用户_____。

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

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

   
8.设四个事关A具备a三个天性和a三个元组,关系B具有b三个性子和b二个元组,则关乎A´B具备___a1+b1____个属性和____
a2´b2 ____个元组。

   
九.设三个学生关系为S(学生号,姓名),课程关系为C(课程号,课程名),选课关系为X(学生号,课程号,成绩),求出全体选课的上学的小孩子音信的运算表达式为_____Õ学生号(X)______与____S
____的当然连接。

   拾.在一个关联大切诺基中,若存在X→Y和X→Z,则存在_____
X→(Y,Z)_______,称此为函数正视的合并性规则。

 

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

   
一.若八个涉及的任何非主属性都不有的借助信赖于别的候选码,则称该关系落成____第二____范式。

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

   三.
在SQL中,每一种视图中的列能够来自分歧的___表___,它是在原有表的基本功上____建立____的逻辑意义上的新关系。

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

   
伍.对此较复杂的体系,概念设计阶段的首要职分是:首先依据系统的顺序部分应用画出各自对应的____局部ER图______,然后再开始展览综合和总体统一希图,画出_____整体ER图_____。

   
6.机器达成阶段的目的是在计算机体系中获取五个满意______陈设须要、功用完善、操作便利___的数据库应用系统。

    7.Access的用户操作分界面由    题目栏、菜单栏、专门的学业区  、工具栏、状态栏等多个部分构成。

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

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

 

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

   1.
设一个提到为揽胜极光(A,B,C,D,E),它的小小函数依赖集为FD={A→B,A→C,(C,D)→E},则该关系的候选码为_____(A,D)___,候选码函数决定E是___伪传递___性。

   
二.设二个事关为宝马7系(A,B,C,D,E),它的小不点儿函数依赖集为FD={A→B,A→C,(A,D)→E},该关系只满足___第一_____范式,若要规范化为高超级的范式,则将得到____2____个关系。

   
三.在实质上的数据库管理系列中,对数据库的操作办法有_____命令交互、程序实践、窗口界面______等三种。

    肆.在SQL中,主码约束的要紧字为____
primary key________,外码约束的显要字为______foreignkey
______。

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

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

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

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

   
九.在公寓处理中,涉及到的基本表有三个,它们分别为客房表、过夜表、_____游客登记表、消费卡表____。

   十.在安装或收回数据库密码的长河中,密码对于字母     大小写     是敏感的。

 

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

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

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

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

    4.在Access中模块分为   类模块      
和       标准模块     三种等级次序。

 

   
6、根据主教材第四章所给的商品库和教学库,可能依据下列所给的每条SQL查询语句写出相应的效率,恐怕遵照下列所给的各样效应写出相应的SQL查询语句。(每小题四分,共2十一分)

   
在名字为物品库的数据库中蕴含有商品表一和商品表二,它们的定义分别为:

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

       商品表二(商品代号 char(捌),产地 char(六),品牌char(六),)

   
在称呼为教学库的数据库中涵盖有学生、课程和选课多少个表,它们的概念分别为:

       学生(学生号 char(七),姓名 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
学生.学生号=选课.学生号

         )

    功能:
从事教育工作学库中询问出最多选修了贰门课程(含未选任何学科)的整整学生。

 

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

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

        from 商品表1

        group by 分类名

 

   
伍.从事教育工作学库中查询出最少选修了人名字为@m一学员所选课程中1门课的漫天上学的小孩子。

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.  
一、查询“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一. 
2、查询平均战绩超过五1七分的同班的学号和平均战表; 

12. 
    select S#,avg(score) 

13. 
    from sc 

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

一伍. 
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 

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

二7. 
六、查询学过“00一”并且也学过数码“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. 
8、查询课程编号“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. 
玖、查询全数科目成绩小于56分的同窗的学号、姓名; 

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

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

4陆. 
1二、查询至少学过学号为“00一”同学全部1门课的其他同学学号和人名; 

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四、查询和“十0二”号的同学学习的教程完全一样的其余同学学号和姓名; 

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

6一. 
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,,数据库,公司管理,葡萄牙语,有效课程数,有效平均分 

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

88. 
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 

95. 
20、查询如下课程平均战表和及格率的百分比(用”一行”显示): 企管(00壹),马克思(00二),OO&UML (003),数据库(00四) 

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

102.                ,SUM(CASE WHEN C# = ‘004’ THEN score ELSE 0 END)/SUM(CASE C# WHEN ‘004’ 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 

10五.        2一、查询差别老师所教不相同学科平均分从高到低突显 

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一.        2二、查询如下课程战绩第 三 名到第 陆 名的学生成绩单:集团管理(001),马克思(00二),UML (00三),数据库(00四) 

112.            [学生ID],[学员姓名],公司管理,Marx,UML,数据库,平均成绩 

113.            SELECT  DISTINCT top 3 

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

1壹伍.                Student.Sname AS 学生姓名 , 

11陆.              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.         

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、查询学平生均成绩及其排名 

15捌.              SELECT 一+(SELECT COUNT( distinct 平均战表) 

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

160.                              FROM SC 

161.                          GROUP BY S# 

162.                          ) AS T1 

1陆3.                    WHERE 平均成绩 > T二.平分战绩) as 名次, 

164.              S# as 学生学号,平均成绩 

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

166.                    FROM SC 

167.                GROUP BY S# 

168.                ) AS T2 

16九.            O卡宴DELacrosse BY 平均成绩 desc; 

170.          

17一.        二五、查询各科战表前三名的记录:(不怀想战表并列情状) 

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

182.        二七、查询出只选修了壹门学科的全部学生的学号和姓名 

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八陆.        2八、查询男人、女孩子人数 

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一、198贰年诞生的学生名单(注: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.        3二、查询每门课程的平分成绩,结果按平均战表升序排列,平均成绩一样时,按学科号降序排列 

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

19玖.        3三、查询平均战表超乎八⑤的全体学生的学号、姓名和平均成绩 

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; 

20七.        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# ; 

211.        3陆、查询任何壹门课程成绩在陆拾九分以上的真名、课程名称和分数; 

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

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

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

贰壹7.        38、查询课程编号为003且课程成绩在七十七分以上的学习者的学号和人名; 

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; 

2二一.        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# ); 

22五.        四一、查询种种学科及相应的选修人数 

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

2二7.        4二、查询不一样学科成绩一样的上学的儿童的学号、课程号、学生战表 

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

22玖.     四3、查询每门功课战绩最棒的前两名 

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八.        4四、总计每门课程的学习者选修人数(超越14位的教程才总括)。供给输出课程号和选修人数,查询结果按人口降序排列,查询结果按人口降序排列,若人数一样,按学科号升序排列  

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

240.            from  sc  

241.            group  by  C# 

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

二4三.        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二.        四7、查询没学过“叶平”老师授课的任壹门科目标学员姓名 

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

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

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

25捌.        50、删除“00贰”同学的“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.
元组、属性

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

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

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

    10. X→(Y,Z)

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

 

   1. 第二                           
2.6、4

   三. 表、建立                        四.
分组计算、排序

   伍. 局地EPRADO图、全部EEscort图            陆.
规划要求、效率完善、操作方便

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

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

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

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

 

   1. (A,D)、伪传递                     

  1. 第一、2

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

   4. primary key、foreign key

   5. 实表、虚表                        

  1. 连接、选择

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

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

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

  1. 大小写

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

 

   壹. 标题栏、菜单栏、专门的学业区  
(次序无先后)

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

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

  1. 类模块、规范模块        
    (次序无先后)

 

   
六、依据主教材第五章所给的商品库和教学库,或然依据下列所给的每条SQL查询语句写出相应的作用,可能根据下列所给的各类作用写出相应的SQL查询语句。(每小题四分,共十九分)

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

   二.
从事教育工作学库中查询出只选修了一门学科的漫天学员。

   三.
从事教育工作学库中查询出最多选修了二门科目(含未选任何学科)的全部上学的儿童。

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

        from 商品表1

        group by 分类名

   5. select distinct 学生.*

        from 学生,选课

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

          from 学生,选课

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

        )

 

三.1 名词解释

(1)SQL模式:SQL方式是表和授权的静态定义。一个SQL形式定义为基本表的会晤。
一个由形式名和形式具有者的用户名或账号来规定,并包罗情势中每3个要素(基本表、视图、索引等)的概念。
(2)SQL数据库:SQL(Structured Query
Language),即‘结构式查询语言’,选取乌Crane语单词表示和结构式的语法规则。
3个SQL数据库是表的汇总,它用三个或两个SQL格局定义。
(3)基本表:在SQL中,把古板的涉及模型中的关系格局称为基本表(Base
Table)。 基本表是实际存款和储蓄在数据库中的表,对应二个涉及。
(4)积累文件:在SQL中,把古板的涉嫌模型中的存款和储蓄方式称为存款和储蓄文件(Stored
File)。 每一个存款和储蓄文件与表面存款和储蓄器上四个大意文件对应。
(5)视图:在SQL中,把古板的关联模型中的子方式称为视图(View),视图是从若干大旨表和(或)别的视图构造出来的表。
(6):在SQL中,把古板的关系模型中的元组称为行(row)。
(7)列:在SQL中,把守旧的关系模型中的属性称为列(coloumn)。
(8)实表:基本表被称呼“实表”,它是实际存放在数据库中的表。
(9)虚表:视图被叫做“虚表”,创设1个视图时,只把视图的定义存款和储蓄在数据词典中,而不存储视图所对应的数目。
(10)相关子查询:在嵌套查询中冒出的适合以下特点的子查询:子查询中查询条件注重于外层查询中的有些值,
所以子查询的管理不只三回,要反复求值,以供外层查询利用。
(11)对接查询:查询时先对表举办笛Carl积操作,然后再做等值联接、选拔、投影等操作。
联接查询的成效比嵌套查询低。
(12)交互式SQL:在巅峰交互格局下行使的SQL语言称为交互式SQL。
(13)嵌入式SQL:嵌入在高端语言的顺序中央银行使的SQL语言称为嵌入式SQL。
(14)共享变量:SQL和宿主语言的接口。共享变量有宿主语言程序定义,再用SQL的DECLARE语句表明,
SQL语句就可援引那么些变量传递数据库音信。
(15)游标:游标是与某1查询结果相联系的标识名,用于把集合操作调换到单记录管理格局。
(16)卷游标:为了克制游标在促进时不能够回去的紧巴巴,SQL二提供了卷游标技艺。
卷游标在力促时不只可以沿查询结果瓜月组顺序从头到尾壹行行推进,也能1行行再次回到。

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

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

(贰)检索年龄超过23周岁的男学生的学号和姓名。
    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’
但上1种写法越来越好有的。

(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的几个小名。

(陆)检索全体学员都选修的科目标课程号与学科名。
    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# )

 

      

(柒)检索选修课程包蕴LIU先生所教学的学员学号。    
     SELECT DISTINCT S#
     FROM SC
     WHERE C# IN
      (SELECT C#
      FROM C
      WHERE TEACHER=’LIU’))   

3.三 设有五个为主表Kuga(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

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

三.陆 试用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′

(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

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

(七)在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=’女’)

(九)求年龄超过全体女子高校友年龄的男学生姓名和年龄。
    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的1一更新操作:
(一)往基本表S中插入叁个学员元组(‘S玖’,‘WU’,18)。
    INSERT INTO S(S#,SNAME,AGE) VALUES(’59’,’WU’,18)
(二)在大旨表S中追寻每1门学科成绩都不止等于八十多分的学习者学号、姓名和性别,并把检索到的值送往另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’)

(伍)把选修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’)

(七)在主导表SC中期维修改C四课程的实际业绩,若战表小于等于7贰分时进步5%,若战绩超越7贰分时进步四%(用三个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

三.八 在第1章例壹.四中涉及“旅馆管理”关系模型有八个涉及情势:
  零件 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瑞鹰多个基本表的当然联接定义为八个视图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#

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

    1)检索北京的供应商所供应的零件的数码和名字。
    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语句。

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

3.1二SQL的集纳处理情势与宿主语言单记录管理方式之间怎么和谐?
    由于SQL语句管理的是记录集结,而宿主语言语句一回只好管理2个记下,
因此须求用游标(cousor)机制,把集结操作转变到单记录管理格局。

二.一三 嵌入式SQL语句什么时候不必涉及到游标?曾几何时必须涉及到游标?
    (一)INSERT、DELETE、UPDATE语句,查询结果必然是单元组时的SELECT语句,
都可径直嵌入在主程序中应用,不必涉及到游标。
    (二)当SELECT语句询问结果是两个元组时,此时宿主语言程序不也许采纳,
一定要用游标机制把多个元组一回三个地传递给宿主语言管理。

 

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注