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

时间:2019-09-14 02:50来源:亚洲城ca88唯一官方网站
H5游戏开垦:消灭星星 2018/01/25 · HTML5 ·游戏 原来的书文出处: 坑坑洼洼实验室    「消灭星星」是一款很优异的「解决类游戏」,它的游戏的方法极粗略:消除相连通的同色砖块。

H5游戏开垦:消灭星星

2018/01/25 · HTML5 · 游戏

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

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

图片 1

H5游戏开拓:一笔画

2017/11/07 · HTML5 · 游戏

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

图片 2

SQL 练习题答案

1. 游戏法规

「消灭星星」存在多少个版本,可是它们的平整除了「关卡分值」有些出入外,别的的条条框框都以一模二样的。小编介绍的本子的游戏法规整理如下:

1. 色砖布满

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

2. 革除法则

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

3. 分值准绳

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

「n」表示砖块数量。上边是「总」分值的条条框框,还会有「单」个砖块的分值法规:

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

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

4. 关卡分值

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

5. 合格条件

  • 可免去色块官样文章
  • 累计分值 >= 当前关卡分值

上边八个原则还要成立游戏才方可过得去。

H5游戏开辟:单笔画

by leeenx on 2017-11-02

一笔画是图论[科普](https://zh.wikipedia.org/wiki/图论)中两个名牌的主题材料,它起点于柯汉诺威堡七桥主题材料[科普](https://zh.wikipedia.org/wiki/柯尼斯堡七桥问题)。化学家欧拉在她1736年刊载的舆论《柯华雷斯堡的七桥》中不仅消除了七桥主题素材,也提议了一笔画定理,顺带解决了一笔画难点。用图论的术语来讲,对于二个加以的连通图[科普](https://zh.wikipedia.org/wiki/连通图)存在一条恰好含有全部线段何况未有重新的门路,那条门路正是「一笔画」。

搜索连通图那条门路的历程正是「一笔画」的嬉戏进度,如下:

图片 3

 

2. MVC 设计方式

作者此番又是使用了 MVC 方式来写「消灭星星」。星星「砖块」的数据结构与各个状态由 Model 实现,游戏的着力在 Model 中形成;View 映射 Model 的变动并做出相应的行为,它的任务首如果显示动画;客户与游乐的并行由 Control 达成。

从逻辑规划上看,Model 十分重而View 与 Control 比较轻,但是,从代码量上看,View 比较重而 Model 与 Control 相对相当的轻。

十三日游的贯彻

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

  1. 底图绘制
  2. 相互之间绘制

「底图绘制」把连通图以「点线」的花样映未来画布上,是二11日游最轻松完结的局地;「交互绘制」是顾客绘制解题路线的进程,这么些进度会首如若管理点与点动态成线的逻辑。

一、补充作业一、

 

设有三个关系:

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

               SC(SNO, CNO, GRADE)

               C(CNO, CNAME, TEACHER)

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

 

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

  

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

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

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

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

补充作业二、

 

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

 

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

方法1:

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

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

 

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

自身连接:

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

 

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

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

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

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

 

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

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

SELECT DISTINCT Sno

   FROM SC as SCX

   WHERE NOT EXISTS

      (SELECT *

       FROM SC as SCY

       WHERE SCY.Sno =‘2’AND NOT EXISTS

                               (SELECT *

                                  FROM SC SCZ

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



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

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

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

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

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

3. Model

10 x 10 的报表用长度为 100 的数组可周详映射游戏的蝇头「砖块」。

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

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

CR-V – 金黄,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}
]
}
]

「点记法」记录关卡通关的三个答案,即端点要按一定的相继存放到数组 coords中,它是有序性的记录。「线记法」通过两点描述连通图的线条,它是冬辰的记录。「点记法」最大的优势是表现更简短,但它必需记录一个合格答案,作者只是关卡的搬运工不是关卡创制者,所以小编最后选用了「线记法」。:)

 

3.1 生成砖墙

砖墙分两步生成:

  • 色砖数量分配
  • 打垮色砖

斟酌上,能够将 100 个格子能够均分到 5 类颜色,然而小编玩过的「消灭星星」都不接纳均分政策。通过深入分析五款「消灭星星」,其实能够窥见多少个法则—— 「色砖之间的数目差在一个恒久的间隔内」。

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

图片 5

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

「击溃色砖」其实正是将数组乱序的历程,作者推荐使用「 费雪耶兹乱序算法」。

以下是伪代码的贯彻:

JavaScript

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

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

相互绘制

在画布上制图路线,从视觉上实属「选拔或延续连通图端点」的进程,那么些历程须要解决2个难点:

  • 手指下是或不是有端点
  • 当选点到待选中式茶食之间是不是成线

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

JavaScript

// 端点坐标音讯 let coords = []; lines.forEach(({x1, y1, x2, y2}) => { // (x1, y1) 在 coords 数组海市蜃楼 if(!isExist(x1, y1)) coords.push([x1, y1]); // (x2, y2) 在 coords 数组不设有 if(!isExist(x2, y2)) coords.push([x2, y2]); });

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

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

JavaScript

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

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

在未绘制任何线段或端点此前,手指滑过的任性端点都会被当作「一笔画」的伊始点;在绘制了线段(或有选中式茶食)后,手指滑过的端点能无法与选中点串连成线段须要基于现成标准举办推断。

图片 6

上海教室,点A与点B可一连成线段,而点A与点C无法接二连三。作者把「能够与钦定端点连接成线段的端点称作使得连接点」。连通图端点的灵光连接点从连通图的线条中领到:

JavaScript

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

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

But…有效连接点只可以决断四个点是不是为底图的线条,那只是一个静态的参阅,在实质上的「交互绘制」中,会高出以下情状:

图片 7
如上航海用图书馆,AB已串连成线段,当前选中式茶食B的可行连接点是 A 与 C。AB 已经三翻五次成线,倘若 BA 也串连成线段,那么线段就再也了,所以这时 BA 不能够成线,只有 AC 本事成线。

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

  • 与选中式茶食「成线的有效连接点」
  • 与选中式茶食「未成线的立竿见影连接点」

中间「未成线的有效性连接点」才具参加「交互绘制」,况兼它是动态的。

图片 8

回头本节内容最初提的八个问题「手指下是不是有端点」 与 「选中式茶食到待选中式茶食时期是还是不是成线」,其实可统一为二个标题:手指下是或不是存在「未成线的卓有功能连接点」。只须把监听手指滑动遍历的数组由连通图全数的端点坐标 coords 替换为日前选中式茶食的「未成线的有效连接点」就可以。

迄今「一笔画」的要害作用已经完成。能够超越体验一下:

图片 9

 1、查询7号课程没有考试成绩的学员学号。

3.2 化解砖块

「化解砖块」的法则很简短 —— 紧邻相连通同样色即能够撤消

图片 10
前多个组成符合「相邻相连通同样色即能够去掉」,所以它们得以被清除;第八个组成即使「相邻同样色」不过不「相连结」所以它无法被拔除。

「化解砖块」的还要有四个根本的职分:生成砖块对应的分值。在「游戏准则」中,笔者曾经提供了对应的数学公式:「化解砖块得分值 = 10 * i 5」。

「消除砖块」算法实现如下:

JavaScript

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

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

解除的算法使用「递归」逻辑上会清晰一些,但是「递归」在浏览器上轻巧「栈溢出」,所以作者未有利用「递归」达成。

电动识图

小编在录加入关贸总协定协会卡配置时,开掘贰个7条边以上的联网图很轻巧录错或录重线段。我在构思是或不是开拓二个自动识别图形的插件,毕竟「一笔画」的图纸是有法规的几何图形。

图片 11

地点的关卡「底图」,一眼就能够识出多个颜色:

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

再者那二种颜色在「底图」的面积大小顺序是:白底 > 线段颜色 > 端点颜色。底图的「收集色值表算法」相当粗略,如下伪代码:

JavaScript

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

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

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

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

3.3 狠抓砖墙

砖墙在破除了一部分砖头后,会并发空洞,此时内需对墙体进行做实:

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

一种高效的完毕方案是,每一次「消除砖块」后向来遍历砖墙数组(10×10数组)再把空洞抓好,伪代码表示如下:

JavaScript

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

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

But… 为了抓牢一个虚幻对一张大数组实行全量遍历并不是一种高效的算法。在小编看来影响「墙体加强」功用的因素有:

  1. 固定空洞
  2. 砖块移动(做实)

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

墙体的「空洞」是出于「消除砖块」产生的,换种说法 —— 被扫除的砖头留下来的坑位正是墙体的悬空。在「消除砖块」的同期标识空洞的任务,那样就毫无全量扫描墙体数组,伪代码如下:

JavaScript

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

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

在上面的做实动图,其实能够看看它的坚实进程如下:

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

墙体在「狠抓」进程中,它的界线是实时在转移,纵然「抓实」不按实际边界进行扫描,会发生多余的空域扫描:

图片 12

怎么着记录墙体的边界?
把墙体拆分成一个个独立的列,那么列最最上端的空白格片段正是墙体的「空白」,而别的非顶端的空白格片段即墙体的「空洞」。

图片 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. 从底图上铲除端点并记录它的坐标,再次来到继续第一步

伪代码如下:

JavaScript

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

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

But… 上边的算法只可以跑无损图。作者在使用了一张手提式有线电话机截屏做测量试验的时候开采,收罗到的「色值表」长度为 五千 !这直接导致端点和线条的色值无法直接拿走。

由此剖判,能够开掘「色值表」里大多色值都以类似的,也正是在原本的「收集色值表算法」的底蕴上增加一个像样颜色过滤即能够找寻端点和线条的主色。伪代码达成如下:

JavaScript

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

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

取到端点的主色后,再跑贰次「端点识别算法」后居识别出 203 个端点!那是干什么吧?

图片 17

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

图片 18

因而上航海用图书馆,能够直观地搜查捕获叁个结论:识别出来的小端点只在目的(大)端点上汇聚布满,並且大端点范围内的小端点叠合交错。

假定把叠加交错的小端点归并成三个多头点,那么那么些大端点将这么些近乎目的端点。小端点的联合伪代码如下:

JavaScript

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

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

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

 

3.4 消除残砖

上一小节提到了「描述墙体的边界并记录墙体的止渴望梅」的「列集结」,小编是直接使用那么些「列会集」来驱除残砖的,伪代码如下:

JavaScript

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

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

线条识别

笔者分四个步骤完结「线段识别」:

  1. 加以的两个端点连接成线,并收集连线上N个「样本点」;
  2. 遍历样本点像素,如若像素色值不对等线段色值则表示那三个端点之间不设有线段

哪些采摘「样式点」是个难点,太密集会耳濡目染属性;太疏松精准度不可能保障。

在笔者前边有八个挑选:N 是常量;N 是变量。
假设 N === 5。局地提取「样式点」如下:

图片 19

上海体育场地,会识别出三条线条:AB, BC 和 AC。而实际上,AC不可能成线,它只是因为 AB 和 BC 视觉上共一线的结果。当然把 N 值向上升高能够缓慢解决这么些主题素材,可是 N 作为常量的话,这一个常量的取量须要靠经验来判别,果然放任。

为了制止 AB 与 BC 同处一直线时 AC 被识别成线段,其实很简短 —— 八个「样本点」的距离小于或等于端点直径
假设 N = S / (2 * R),S 代表两点的偏离,传祺代表端点半径。局地提取「样式点」如下:

图片 20

如上海体育场地,成功地绕过了 AC。「线段识别算法」的伪代码完毕如下:

JavaScript

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

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

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

4. View

View 主要的成效有两个:

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

UI 管理首倘若指「分界面绘制」与「财富加载管理」,这两项成效相比布满本文就直接略过了。View 的本位是「映射 Model 的变通」并成功对应的动画。动画是复杂的,而映射的规律是回顾的,如下伪代码:

JavaScript

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

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

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

质量优化

是因为「自动识图」要求对图像的的像素点举办围观,那么质量确实是个需求关爱的主题素材。小编设计的「自动识图算法」,在辨明图像的进度中须要对图像的像素做两遍扫描:「收集色值表」 与 「采撷端点」。在扫描次数上其实很难下跌了,不过对于一张 750 * 1334 的底图来讲,「自动识图算法」必要遍历两遍长度为 750 * 1334 * 4 = 4,002,000 的数组,压力照旧会有些。我是从压缩被扫描数组的尺寸来提升质量的。

被围观数组的尺码怎么压缩?
小编直接通过压缩画布的尺寸来达到降低被围观数组尺寸的。伪代码如下:

JavaScript

// 要削减的翻番 let resolution = 4; let [width, height] = [img.width / resolution >> 0, img.height / resolution >> 0]; ctx.drawImage(img, 0, 0, width, height); let imageData = ctx.getImageData(), data = imageData;

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

把源图片减弱4倍后,得到的图样像素数组只有原本的 4^2 = 16倍。那在质量上是不小的进级。

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

5. Control

Control 要拍卖的思想政治工作非常多,如下:

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

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

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

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

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

对外交事务件规划如下:

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

客商交互 APIs 规划如下:

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

应用「自动识图」的提议

固然作者在地面测量试验的时候能够把持有的「底图」识别出来,但是并无法确定保证别的开采者上传的图形是或不是被很好的辨别出来。作者建议,能够把「自动识图」做为四个独门的工具使用。

小编写了二个「自动识图」的单身工具页面:
能够在这一个页面生成对应的关卡配置。

 

6. 问题

在和讯有一个关于「消灭星星」的话题:popstar关卡是怎么准备的?

那么些话题在最后提出了一个标题 —— 「十分的小概清除和最大得分不满意过关条件的矩阵」

图片 21

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

最大得分不满足过关条件的矩阵
求「矩阵」的最大得分是二个「托特包难题」,求解的算法轻便:对脚下矩阵用「递归」的方式把具有的消灭分支都实行叁次,并取最高分值。但是javascript 的「递归」极易「栈溢出」导致算法不能够实施。

实际上在腾讯网的话题中关系一个缓和方案:

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

其一建设方案代价是昂贵的!作者提供有源码并从未解决这几个主题素材,而是用贰个比较取巧的主意:步入游戏前检查是事为「不能够清除矩阵」,借使是重新生成关卡矩阵

静心:小编利用的取巧方案并从未缓慢解决难点。

结语

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

图片 22

游戏的源码托管在:
其间玩耍完结的焦点代码在:
自行识图的代码在:

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

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

1 赞 1 收藏 评论

图片 23

 3、查询课程名以“数据”五个字开首的全部科目标课程号和学科名。

7. 结语

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

图片 24

娱乐的源码托管在:

多谢耐心阅读完本文章的读者。本文仅表示我的个人观点,如有不妥之处请不吝赐教。
若果对「H5游戏开垦」感兴趣,迎接关怀我们的专栏。

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

仿效资料

  • Knapsack problem
  • NP-completeness
  • popstar关卡是何许布置的?
  • 费雪耶兹乱序算法
  • 兵慌马乱均分算法

    1 赞 收藏 评论

图片 25

 

 4、查询种种学生具有科指标平分成绩,输出学生学号和平均成绩。

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

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

    Selectcno,count(*) from sc group by cno

 6、查询选修7号课程的上学的小孩子的学号、姓名、性别。

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

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

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

 7、查询选修7号课程的上学的小孩子的平均年龄。

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

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

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

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

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

 9、查询于今尚无考试比不上格的学生学号。

    Select distinctsno from sc where sno not in

         ( Select sno from sc where grade<60 )

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

10、查询全体考试战绩的平均分同样的学习者学号分组

二、

 1、寻找选修课程号为C2的上学的小孩子学号与成就。

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

 

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

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

    注意本题也可以用嵌套做

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

 

 3、搜索选修课程名称叫 Maths 的上学的儿童学号与姓名。

    Selects.sno,sname from s,sc,c

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

稳重本题也足以用嵌套做

 

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

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

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

 

 5、找寻选修课程号为C2和C4的上学的儿童学号。

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

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

    注意本题也足以用延续做

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

 

 6、搜索不学C2课程的学生姓名和年龄。

    Selectsname,sage from s where sno not in

         ( Selectsno from sc where cno='C2' )

    或: Select sname,sage from s where not exists

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

 

 7、寻觅选修了数据库学科的保有学员姓名。(同3)

    Select snamefrom s,sc,c

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

 

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

    连接:Select sname from s,sc,c

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

                and grade<60 and ssex='女'

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

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

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

               )

 

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

    Selectcname,avg(grade) from sc,c

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

合计本题也得以用嵌套做吧?

 

10、搜索种种学生的平均战绩,输出学生姓名和平均战表。

    Selectsname,avg(grade) from s,sc

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

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

 

11、寻觅足足有三贰13个学生选修的学科名。

    Select cnamefrom c where cno in

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

小心本题也足以用三番五次做

 

12、找寻选修了不少于3门课程的上学的小孩子姓名。

    Select snamefrom s where sno in

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

注意本题也足以用接二连三做

 

13、寻觅各门课程的成就均不低于90分的学生姓名。

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

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

方法二:

Select sname from s where sno not in

         ( Selectsno from sc where grade<90 )

如若有一门非常的大于90分就能输出该学生学号

 

14、寻觅数据库课程成绩十分大于该门课程平均分的学生姓名。

    Select snamefrom s,sc,c

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

         ( Selectavg(grade) from sc,c

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

         )

15、寻找各种系科男女学生的平均年龄和人口。

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

16、搜索计算机系(JSJ)课程平均分最高的学习者学号和人名。

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

    group bys.sno,sname

    havingavg(grade) >=ALL

         ( Selectavg(grade) from s,sc

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

           group bys.sno

         )

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

    本题能够分三步做:

   

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

     createview  v_all(cno,cnt)

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

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

     createview  v_pass(cno,cnt_pass)

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

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

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

     where v_all.cno = v_pass.cno

 

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

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

    wherestudent.sno=sc.sno

    group bysc.sno,sname

    havingavg(grade)<60

考虑本题也得以用嵌套做啊?

 

19、查询平均分比不上格的学员人数。

    Select count(*)from student

    where sno in

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

    上面是八个头名的一无所长

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

那是种种学生有几门比不上格的数码

 

三、

 1、查询薪酬在一千到2000元之间的男人业务员的人名和办公室编号。

    SelectYname,Ono from YWY

    where Salarybetween 1000 and 3000 and Ysex='男'

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

    SelectOno,count(*) from YWY group by Ono

 3、查询各样客商在二零零三年1月进货的总金额,输出客商号和呼应的总金额。

    SelectKno,sum(Fmoney) from FP

    where Fdatebetween '2002.5.1' and '2002.5.31'

    group by Kno

 4、查询二〇〇四年三月购入次数超越5次的持有客商号,且按客户号升序排序。 

    Select Kno fromFP

    where Fdatebetween '2002.5.1' and '2002.5.31'

    group by Kno

    havingcount(*)>5

    order by KnoASC

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

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

 6、查询2000年1十二月早就在王海亮业务员手中买入过商品的客商号、

            客商姓名和联系电话。

    SelectKno,Kname,Phone from KH where Kno in

         ( SelectKno from FP

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

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

         )

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

 7、查询全部报酬比1538号业务员高的业务员的号码、姓名和工资。

    SelectYno,Yname,Salary from YWY where Salary >

         ( SelectSalary from YWY where Yno='1538' )

 8、查询全部与1538号业务员在同多个办公的别的业务员的号码和人名。

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

         ( SelectOno from YWY where Yno='1538' )

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

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

         ( Selectsum(Fmoney) from FP group by Yno )

10、查询全数业务员的编号、姓名、薪给以及薪金比她高的其余业务员的平均薪俸。

    采纳自连接

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

    from   YWY Y1, YWY Y2

    where  Y1.Salary < Y2.Salary

    group by  Y1.Yno  

 

四、

 1、寻找每一种班级的班级代码、学生人数、平均战绩。

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

 2、找寻每种学员的班级代码、学生姓名、考试科目数、总战绩。

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

    group byBJDM,BNXH,XSXM

 3、出口一张表格,每位学生对应一条记下,包涵字段:

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

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

    from  SC SC1, SC SC2, SC SC3

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

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

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

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

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

    SelectBJDM,XSXM,min(CJ) from SC

    where  CJ<60 group by BJDM,BNXH,XSXM

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

          group byBJDM,BNXH,XSXM

          havingmin(CJ)<60

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

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

    SelectBJDM,XSXM,max(CJ) from SC

    group byBJDM,BNXH,XSXM

    havingmin(CJ)<60

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

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

         where  CJ<60 group byBJDM,BNXH,XSXM

 6、输出一张表格,全数战绩都不低于60分的各位学生对应一条记下,包罗字段:

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

    SelectBJDM,XSXM,avg(CJ) from SC

    group by BJDM,BNXH,XSXM

    havingmin(CJ)>=60

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

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

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

    group byBJDM,BNXH,XSXM

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

          科目、去掉多个最低分后的平分成绩。

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

    group by KM

 

 

 

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

 

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

    Selectsno,sname,sage from student

    where sagebetween 19 and 21 and ssex='女'

    order by sagedesc

 2、查询姓名中有“明”字的上学的小孩子人数。

    Select count(*)from student

    where snamelike "%明%"

 3、查询1001课程没有实际绩效的上学的儿童的学号。

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

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

    Selectsno,sname,sdept from student

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

    order bysdept,sno

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

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

    from sc

    group by cno

 6、查询平均分超越90分的男学生学号及平均分。

    连接:

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

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

    group by sc.sno

    havingavg(grade)>90

    嵌套:

    selectsno,avg(grade) from sc

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

    group by sno

    havingavg(grade)>90

 7、查询选修课程超过2门的学生姓名。

    select snamefrom student,sc

    where student.sno=sc.sno

    group bysc.sno,sname

    havingcount(*)>2

    本题也得以用嵌套做

 8、查询 JSJ 系的学员选修的课程号。

    Select distinctcno from student,sc

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

    本题也可以用嵌套做

 9、查询选修1002学科的上学的小孩子的上学的小孩子姓名(用三翻五次和嵌套2种格局)

    连接:Select sname from student,sc

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

    嵌套:Select sname from student where sno in

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

10、查询学生姓名以及她选修课程的教程号及战表。

    Selectsname,cno,grade from student,sc

    wherestudent.sno=sc.sno

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

11、查询选修“数据库原理”课且成绩 80 以上的上学的小孩子姓名(用一而再和嵌套2种情势)

    连接:Select sname from student,sc,course

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

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

    嵌套:Select sname from student where sno in 

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

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

               )

 

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

    Select snamefrom student

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

    或: select sname from student

         where notexists

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

    思虑本题也得以用一般的总是做啊?

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

    Selectsno,avg(grade)

    from sc

    group by sno

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

                              from sc

                              group by sno

                            )

16、查询每门科目成绩都不仅仅该门课程平均分的上学的小孩子学号。

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

    create viewc_avg(cno,avg_grade)

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

    再查询

    Select distinctsno from sc

    where sno notin ( Select sno from sc,c_avg

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

                    )

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

    SELECT DISTINCT Sno

    FROM SC SC1

    WHERE SC1.SnoNOT IN

          ( SELECT SC2.Sno

            FROM SC SC2

            WHERE SC2.Grade <=

                 ( SELECT AVG(SC3.Grade)

                   FROM SC SC3

                   WHERE SC3.Cno=SC2.Cno

                 )

          )

    或:

    SELECT DISTINCTSno

    FROM SC SC1

    WHERE NOTEXISTS

          (SELECT *

            FROM SC SC2

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

                       (SELECT AVG(SC3.Grade)

                         FROM SC SC3

                         WHERE SC3.Cno=SC2.Cno

                       )

          )

   

 

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

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

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

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

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

要从语义上分解:(1)采取课程的学科号与学科名,荒诞不经不选那门课的同班。
   个中,“不选那门课的同校”可以表示为:

SELECT *

 FROM  S

 WHERE  S# NOT IN

  (SELECT  *

      FROM SC  

      WHERE  SC.C#=C.C#)

 

或者

SELECT *

 FROM  S

 WHERE   NOT EXISTS

  (SELECT  *

      FROM SC  

      WHERE S.S#=C.S# AND 

SC.C#=C.C# )

 

      

(7)追寻选修课程包括LIU先生所教学的学生学号。    
     SELECT DISTINCT S#
     FROM SC
     WHERE C# IN
      (SELECT C#
      FROM C
      WHERE TEACHER='LIU'))   

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

3.43.4 设有两个中央表路虎极光(A,B,C)和S(A,B,C)试用SQL查询语句表述下列关系代数表达式:
  (1)R∪S  (2)R∩S  (3)R-S  (4)πA,B(R)πB,C(S)

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

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

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

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

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

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

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

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

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

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

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

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

(7)在SC中搜索成绩为空值的上学的小孩子学号和课程号。
    SELECT S#,C#
    FROM SC
    WHERE GRADE IS NULL

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

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

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

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

(4)把WANG同学的求学选课和实际业绩全体删减。
    DELETE FROM SC
     WHERE S# IN
      (SELECT S#
      FROM S
      WHERE SNAME='WANG')

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

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

(7)在主题表SC中期维修改C4科目标战绩,若成绩小于等于75分时提升5%,若战绩超乎75分时进步4%(用八个UPDATE语句完毕)。
    UPDATE SC
     SET GRADE=GRADE*1.05
     WHERE C#='C4' AND GRADE<=75
    UPDATE SC
     SET GRADE=GRADE*1.04
     WHERE C#='C4' AND GRADE>75

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

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

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

(3)试在上述多个视图的根基上开展多少查询:

    1)检索法国巴黎的经销商所供应的组件的编号和名字。
    SELECT P#,PNAME FROM VIEW2 WHERE SADDR='SHANGHAI'

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

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

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

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

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

  (5) DELETEFROMS_GRADE
WHEREC_NUM>4
    不允许

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

3.11 在宿主语言的先后中使用SQL语句有怎么着规定?
在宿主语言的次第中选用SLQ语句有以下规定:
(1)在程序中要有别于SQL语句与宿主语言说话
(2)允许嵌入的SQL语句引用宿主语言的顺序变量(称为分享变量),但有两条规定:
   1)援引时,这个变量前必得加“:”作为前缀标记,以示与数据库中变量有分别。
   2)那些变量由宿主语言的程序定义,并用SQL的DECLARE语句说明。
(3)SQL的聚众管理情势与宿主语言单记录管理格局之间要和睦。 要求使用游标机制,把集结操作转换来单记录管理方式。

3.12SQL的相会管理情势与宿主语言单记录管理格局之间什么和煦?
    由于SQL语句处理的是记录集结,而宿主语言语句一次只可以处理一个笔录, 由此须求用游标(cousor)机制,把集合操作转换到单记录管理格局。

2.13 嵌入式SQL语句何时不必涉及到游标?哪一天必需涉及到游标?
    (1)INSERT、DELETE、UPDATE语句,查询结果明确是单元组时的SELECT语句, 都可直接嵌入在主程序中采用,不必涉及到游标。
    (2)当SELECT语句询问结果是四个元组时,此时宿主语言程序不能够利用, 一定要用游标机制把四个元组一次二个地传递给宿主语言管理。

 

 

 

(电商)数据库原理及运用_依傍考核武器试验题及参照他事他说加以考察答案

 

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

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

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

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

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

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

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

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

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

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

       A.         B.         C.        D.

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

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

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

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

    8.在三个宏中要开采贰个表格,应该使用的操作是(    )。

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

    9.方可因此Internet实行数量发表的对象是(    )。

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

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

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

 

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

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

    2.在文件系统中,存取数据的宗旨单位为___记录____,在数据库系统中,存取数据的主题单位为___数据项_____。

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

    4.在四个涉嫌中不容许出现重复的____元组____,也不容许出现具备同样名字的___属性_____。

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

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

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

    8.设二个涉及A具备a1个属性和a2个元组,关系B具有b1个天性和b2个元组,则提到A´B具备___a1 b1____个属性和____ a2´b2 ____个元组。

    9.设二个学生关系为S(学生号,姓名),课程关系为C(课程号,课程名),选课关系为X(学生号,课程号,战表),求出全数选课的学生消息的运算表明式为_____Õ学生号(X)______与____S ____的当然连接。

   10.在多个关系瑞鹰中,若存在X→Y和X→Z,则存在_____ X→(Y,Z)_______,称此为函数信赖的合并性准绳。

 

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

    1.若八个关系的其余非主属性都不有的依附正视于其余候选码,则称该关系达成____第二____范式。

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

   3. 在SQL中,每一个视图中的列能够来自分化的___表___,它是在原有表的基础上____建立____的逻辑意义上的新涉及。

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

    5.对此较复杂的种类,概念设计阶段的最首要义务是:首先依照系统的逐个部分应用画出各自对应的____局部ER图______,然后再张开总结和完整统一希图,画出_____整体ER图_____。

    6.机器完成阶段的对象是在Computer体系中获得贰个知足______安排须求、成效完善、操作方便___的数据库应用连串。

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

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

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

 

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

   1. 设叁个关乎为CR-V(A,B,C,D,E),它的细微函数注重集为FD={A→B,A→C,(C,D)→E},则该关系的候选码为_____(A,D)___,候选码函数决定E是___伪传递___性。

    2.设贰个涉嫌为Tiguan(A,B,C,D,E),它的微小函数重视集为FD={A→B,A→C,(A,D)→E},该关系只满意___第一_____范式,若要标准化为高超级的范式,则将收获____2____个关系。

    3.在实际上的数据库管理种类中,对数据库的操作方法有_____一声令下交互、程序实践、窗口分界面______等三种。

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

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

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

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

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

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

   10.在设置或收回数据库密码的进程中,密码对于字母     大小写     是敏感的。

 

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

    1.Access的顾客操作分界面由   标题栏、菜单栏、工作区   、工具栏、状态栏等多少个部分组成。

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

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

    4.在Access中模块分为   类模块       和       标准模块     两种档期的顺序。

 

    六、根据主教材第四章所给的商品库和教学库,大概根据下列所给的每条SQL查询语句写出相应的机能,可能依据下列所给的种种功效写出相应的SQL查询语句。(每小题4分,共20分)

    在称呼为商品库的数据库中富含有商品表1和货色表2,它们的定义分别为:

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

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

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

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

            专业 char(10),年级 int)

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

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

    1.select distinct 产地

        from 商品表2

       作用:从事商业品库中询问出装有商品的两样产地。

 

    2.select *

        from 学生

        where 学生号 in (select 学生号

          from 选课

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

        )

    效能:从教学库中询问出只选修了一门课程的全体上学的儿童。

 

    3.select *

         from 学生

         where 学生号 in (select 学生号

           from 选课

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

         ) or not exists (select *

              from 选课

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

         )

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

 

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

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

        from 商品表1

        group by 分类名

 

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

select distinct 学生.*

        from 学生,选课

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

          from 学生,选课

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

        )

 

 

 

 

 

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

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

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

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

5.    

6.   问题: 

7.   1、查询“001”课程比“002”课程战绩高的具有学生的学号; 

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

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

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

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

12.      select S#,avg(score) 

13.      from sc 

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

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

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

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

18.    group by Student.S#,Sname 

19.  4、查询姓“李”的教授的个数; 

20.    select count(distinct(Tname)) 

21.    from Teacher 

22.    where Tname like '李%'; 

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

24.      select Student.S#,Student.Sname 

25.      from Student  

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

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

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

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

30.    select S#,Sname 

31.    from Student 

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

33.  8、查询课程编号“002”的成就比课程编号“001”课程低的有着同学的学号、姓名; 

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

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

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

37.    select S#,Sname 

38.    from Student 

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

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

41.      select Student.S#,Student.Sname 

42.      from Student,SC 

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

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

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

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

47.      select distinct SC.S#,Sname 

48.      from Student,SC 

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

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

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

52.      from SC SC_2 

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

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

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

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

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

58.      Delect SC 

59.      from course ,Teacher  

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

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

62.      号课的平均战表; 

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

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

65.  17、按平均成绩从高到低呈现全体学员的“数据库”、“集团管理”、“韩文”三门的课程成绩,按如下情势展现: 学生ID,,数据库,公司管理,罗马尼亚语,有效课程数,有效平均分 

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#='001') AS 企管 

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

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

71.      FROM SC AS t 

72.      GROUP BY S# 

73.      ORDER BY avg(t.score)  

74.  18、查询各科成绩最高和压低的分:以如下格局显得:课程ID,最高分,最低分 

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

76.      FROM SC L ,SC AS R 

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

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

79.                        FROM SC AS IL,Student AS IM 

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

81.                        GROUP BY IL.C#) 

82.          AND 

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

84.                        FROM SC AS IR 

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

86.                    GROUP BY IR.C# 

87.                      ); 

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

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

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

91.      FROM SC T,Course 

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

93.      GROUP BY t.C# 

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

95.  20、查询如下课程平均战表和及格率的比例(用"1行"彰显): 集团管理(001),马克思(002),OO&UML (003),数据库(004) 

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

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

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

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

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

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

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

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

104.          FROM SC 

105.        21、查询差异老师所教差别学科平均分从高到低显示 

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

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

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

109.          GROUP BY C.C# 

110.          ORDER BY AVG(Score) DESC 

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

112.            [学生ID],[学生姓名],集团处理,马克思,UML,数据库,平均战绩 

113.            SELECT  DISTINCT top 3 

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

115.                Student.Sname AS 学生姓名 , 

116.              T1.score AS 集团处理, 

117.              T2.score AS 马克思, 

118.              T3.score AS UML, 

119.              T4.score AS 数据库, 

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

121.              FROM Student,SC  LEFT JOIN SC AS T1 

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

123.                    LEFT JOIN SC AS T2 

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

125.                    LEFT JOIN SC AS T3 

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

127.                    LEFT JOIN SC AS T4 

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

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

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

131.              NOT IN 

132.              (SELECT 

133.                    DISTINCT 

134.                    TOP 15 WITH TIES 

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

136.              FROM sc 

137.                    LEFT JOIN sc AS T1 

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

139.                    LEFT JOIN sc AS T2 

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

141.                    LEFT JOIN sc AS T3 

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

143.                    LEFT JOIN sc AS T4 

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

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

146.         

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

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

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

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

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

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

153.            FROM SC,Course 

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

155.            GROUP BY SC.C#,Cname; 

156.         

157.        24、查询学终生均战表及其排名 

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

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

160.                              FROM SC 

161.                          GROUP BY S# 

162.                          ) AS T1 

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

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

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

166.                    FROM SC 

167.                GROUP BY S# 

168.                ) AS T2 

169.            OTucsonDEWrangler BY 平均战表 desc; 

170.          

171.        25、查询各科战表前三名的笔录:(不考虑成绩并列情状) 

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

173.              FROM SC t1 

174.              WHERE score IN (SELECT TOP 3 score 

175.                      FROM SC 

176.                      WHERE t1.C#= C# 

177.                    ORDER BY score DESC 

178.                      ) 

179.              ORDER BY t1.C#; 

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

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

182.        27、查询出只选修了一门科目的任何上学的小孩子的学号和姓名 

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

184.          from SC ,Student 

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

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

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

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

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

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

191.        30、查询同名同性学生名单,并计算同有名的人数 

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

193.        31、1985年出生的学生名单(注:Student表中Sage列的门类是datetime) 

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

195.            from student 

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

197.        32、查询每门课程的平分成绩,结果按平均战表升序排列,平均战绩一样时,按学科号降序排列 

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

199.        33、查询平均战表超乎85的有所学员的学号、姓名和平均成绩 

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

201.            from Student,SC 

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

203.        34、查询课程名为“数据库”,且分数低于60的上学的儿童姓名和分数 

204.            Select Sname,isnull(score,0) 

205.            from Student,SC,Course 

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

207.        35、查询全体学生的选课情形; 

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

209.            FROM SC,Student,Course 

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

211.        36、查询任何一门学科成绩在70分以上的真名、课程名称和分数; 

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

213.            FROM student,Sc 

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

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

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

217.        38、查询课程编号为003且课程成绩在80分以上的学习者的学号和姓名; 

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

219.        39、求选了课程的学习者人数 

220.            select count(*) from sc; 

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

222.            select Student.Sname,score 

223.            from Student,SC,Course C,Teacher 

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

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

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

227.        42、查询差异科目战绩一样的学生的学号、课程号、学生成绩 

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

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

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

231.              FROM SC t1 

232.              WHERE score IN (SELECT TOP 2 score 

233.                      FROM SC 

234.                      WHERE t1.C#= C# 

235.                    ORDER BY score DESC 

236.                      ) 

237.              ORDER BY t1.C#; 

238.        44、总结每门课程的学生选修人数(当先10人的科目才总计)。必要输出课程号和选修人数,查询结果按人口降序排列,查询结果按人口降序排列,若人数同样,按学科号升序排列  

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

240.            from  sc  

241.            group  by  C# 

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

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

244.            select  S#  

245.            from  sc  

246.            group  by  s# 

247.            having  count(*)  >  =  2 

248.        46、查询任何上学的小孩子都选修的学科的课程号和课程名 

249.            select  C#,Cname  

250.            from  Course  

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

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

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

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

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

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

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

258.        50、删除“002”同学的“001”课程的成就 

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

260.         

 

 

 

 

 

 

 

 

 

 

仿照考核武器试验题参照他事他说加以考察答案

 

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

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

  1. B 9. D  10. B

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

 

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

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

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

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

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

    10. X→(Y,Z)

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

 

   1. 第二                            2.6、4

   3. 表、创建                        4. 分组计算、排序

   5. 局地EEvoque图、全体ETucson图            6. 规划须求、功效完善、操作方便

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

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

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

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

 

   1. (A,D)、伪传递                     

  1. 第一、2

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

   4. primary key、foreign key

   5. 实表、虚表                        

  1. 连接、选择

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

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

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

  1. 大小写

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

 

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

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

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

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

 

    六、依据主教材第四章所给的商品库和教学库,大概依据下列所给的每条SQL查询语句写出相应的功力,或许依据下列所给的每一种成效写出相应的SQL查询语句。(每小题4分,共20分)

   1. 从事商业品库中询问出具备商品的不如产地。

   2. 从事教育工作学库中查询出只选修了一门课程的全体学生。

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

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

        from 商品表1

        group by 分类名

   5. select distinct 学生.*

        from 学生,选课

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

          from 学生,选课

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

        )

 

3.1 名词解释

(1)SQL模式:SQL格局是表和授权的静态定义。贰个SQL格局定义为基本表的聚焦。 三个由情势名和方式具备者的客户名或账号来规定,并包括方式中每二个要素(基本表、视图、索引等)的概念。
(2)SQL数据库:SQL(Structured Query Language),即‘结构式查询语言’,选择英文单词表示和结构式的语法则则。 三个SQL数据库是表的聚集,它用一个或五个SQL形式定义。
(3)基本表:在SQL中,把古板的关系模型中的关系情势称为基本表(Base Table)。 基本表是实在存款和储蓄在数据库中的表,对应三个关乎。
(4)存款和储蓄文件:在SQL中,把古板的关系模型中的存款和储蓄方式称为存款和储蓄文件(Stored File)。 各种存款和储蓄文件与外存上一个物理文件对应。
(5)视图:在SQL中,把古板的关联模型中的子方式称为视图(View),视图是从若干主干表和(或)别的视图构造出来的表。
(6):在SQL中,把古板的关系模型中的元组称为行(row)。
(7)列:在SQL中,把古板的关系模型中的属性称为列(coloumn)。
(8)实表:基本表被可以称作“实表”,它是实际上存放在数据库中的表。
(9)虚表:视图被叫做“虚表”,创设一个视图时,只把视图的概念存款和储蓄在多少词典中,而不存款和储蓄视图所对应的数据。
(10)相关子查询:在嵌套查询中出现的契合以下特点的子查询:子查询中询问条件重视于外层查询中的有个别值, 所以子查询的处理不只二回,要反复求值,以供外层查询利用。
(11)紧接查询:查询时先对表举办笛Carl积操作,然后再做等值联接、采用、投影等操作。 联接查询的功效比嵌套查询低。
(12)交互式SQL:在终端交互情势下利用的SQL语言称为交互式SQL。
(13)嵌入式SQL:嵌入在高端语言的程序中使用的SQL语言称为嵌入式SQL。
(14)分享变量:SQL和宿主语言的接口。分享变量有宿主语言程序定义,再用SQL的DECLARE语句表达, SQL语句就可援用这么些变量传递数据库消息。
(15)游标:游标是与某一询问结果相联系的记号名,用于把集合操作转变来单记录管理情势。
(16)卷游标:为了战胜游标在推进时不可能回去的困顿,SQL2提供了卷游标技艺。 卷游标在力促时不仅可以沿查询结果相月组顺序从头到尾一行行推动,也能一行行再次回到。

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

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

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

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

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

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

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

(6)检索全体学生都选修的学科的学科号与学科名。
    SELECT C#,CNAME
    FROM C
    WHERE NOT EXISTS
     (SELECT *
     FROM S
     WHERE S# NOT IN
      (SELECT *
      FROM SC
      WHERE  SC.C#=C.C#))

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

SELECT *

 FROM  S

 WHERE  S# NOT IN

  (SELECT  *

      FROM SC  

      WHERE  SC.C#=C.C#)

 

或者

SELECT *

 FROM  S

 WHERE   NOT EXISTS

  (SELECT  *

      FROM SC  

      WHERE S.S#=C.S# AND 

SC.C#=C.C# )

 

      

(7)检索选修课程饱含LIU先生所助教的学童学号。    
     SELECT DISTINCT S#
     FROM SC
     WHERE C# IN
      (SELECT C#
      FROM C
      WHERE TEACHER='LIU'))   

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

3.43.4 设有三个基本表奇骏(A,B,C)和S(A,B,C)试用SQL查询语句表述下列关系代数表明式:
  (1)R∪S  (2)R∩S  (3)R-S  (4)πA,B(R)πB,C(S)

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

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

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

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

3.5 试陈述SQL语言的涉及代数特点和元组演算特点。
(P61-62)

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

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

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

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

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

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

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

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

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

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

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

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

(4)把WANG同学的读书选课和培育全体去除。
    DELETE FROM SC
     WHERE S# IN
      (SELECT S#
      FROM S
      WHERE SNAME='WANG')

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

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

(7)在主题表SC中期维修改C4课程的实际业绩,若成绩小于等于75分时提高5%,若战绩领先75分时升高4%(用五个UPDATE语句达成)。
    UPDATE SC
     SET GRADE=GRADE*1.05
     WHERE C#='C4' AND GRADE<=75
    UPDATE SC
     SET GRADE=GRADE*1.04
     WHERE C#='C4' AND GRADE>75

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

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

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

(3)试在上述七个视图的基础上海展览中心开数据查询:

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

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

3.9 对于教学数据库中基本表SC,已创设下列视图:
CREATEVIEWS_GRADE(S#,C_NUM,AVG_GRADE)
ASSELECTS#,COUNT(C#),AVG(GRADE)
FROMSC
GROUPBYS#
试判别下列查询和立异是或不是同意实行。若允许,写出转变来中央表SC上的呼应操作。
  (1) SELECT*
FROMS_GRADE
      允许
   SELECT S#,COUNT(C#),AVG(GRADE)FROM SC GROUP BY S#

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

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

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

  (5) DELETEFROMS_GRADE
WHEREC_NUM>4
    不允许

3.10 预管理情势对于嵌入式SQL的落到实处有何首要意义?
    预管理情势是先用预管理程序对源程序实行扫描,识别出SQL语句,并管理成宿主语言的函数调用格局; 然后再用宿主语言的编译程序把源程序编写翻译成指标程序。那样,不用扩展宿主语言的编写翻译程序, 就能够管理SQL语句。

3.11 在宿主语言的前后相继中运用SQL语句有如何规定?
在宿主语言的次第中使用SLQ语句有以下规定:
(1)在前后相继中要有别于SQL语句与宿主语言说话
(2)允许嵌入的SQL语句援用宿主语言的前后相继变量(称为分享变量),但有两条规定:
   1)引用时,这么些变量前必得加“:”作为前缀标识,以示与数据库中变量有分别。
   2)那一个变量由宿主语言的程序定义,并用SQL的DECLARE语句表达。
(3)SQL的聚焦管理格局与宿主语言单记录管理情势之间要和谐。 须求使用游标机制,把集结操作转变来单记录管理格局。

3.12SQL的集纳管理格局与宿主语言单记录处理格局之间什么和睦?
    由于SQL语句管理的是记录集合,而宿主语言语句二次只能管理二个笔录, 由此需求用游标(cousor)机制,把集结操作调换到单记录管理格局。

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

 

编辑:亚洲城ca88唯一官方网站 本文来源:SQL演练题完整,H5游戏开辟

关键词: 亚洲城ca88