SQL练习题完整,H伍游戏开荒

By admin in web前端 on 2019年4月29日

H5游戏开荒:消灭星星

2018/01/25 · HTML5 ·
游戏

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

「消灭星星」是1款很杰出的「解决类游戏」,它的玩的方法很简短:解决相连通的同色砖块。

图片 1

H5游戏开采:单笔画

2017/11/07 · HTML5 ·
游戏

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

图片 2

SQL 演练题答案

一. 游戏规则

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

一. 色砖布满

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

二. 免去规则

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

三. 分值规则

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

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

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

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

肆. 关卡分值

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

5. 过关条件

  • 可祛除色块不设有
  • 一共分值 >= 当前关卡分值

下面多个规格还要创建游戏才得以过得去。

H5游戏开垦:一笔画

by leeenx on 2017-11-02

一笔画是图论[科普](https://zh.wikipedia.org/wiki/%E5%9B%BE%E8%AE%BA)中3个著名的主题素材,它起点于柯波德戈里察堡七桥主题材料[科普](https://zh.wikipedia.org/wiki/%E6%9F%AF%E5%B0%BC%E6%96%AF%E5%A0%A1%E4%B8%83%E6%A1%A5%E9%97%AE%E9%A2%98)。地经济学家欧拉在她1736年发表的杂谈《柯Madison堡的7桥》中不但化解了7桥难点,也建议了一笔画定理,顺带解决了一笔画难题。用图论的术语来说,对于三个加以的连通图[科普](https://zh.wikipedia.org/wiki/%E8%BF%9E%E9%80%9A%E5%9B%BE)存在一条恰好含有全体线段并且未有重新的门路,这条路径正是「一笔画」。

找寻连通图那条路径的长河正是「一笔画」的游艺经过,如下:

图片 3

 

2. MVC 设计情势

小编这一次又是行使了 MVC
格局来写「消灭星星」。星星「砖块」的数据结构与各样景况由 Model
完成,游戏的中坚在 Model 中产生;View 映射 Model
的改换并做出相应的一颦一笑,它的任务重视是呈现动画;用户与游乐的竞相由
Control 完成。

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

游戏的落成

「单笔画」的落到实处不复杂,笔者把达成进程分成两步:

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

「底图绘制」把连通图以「点线」的方式呈未来画布上,是娱乐最轻松达成的有个别;「交互绘制」是用户绘制解题路线的长河,这几个历程会重点是处理点与点动态成线的逻辑。

一、补充作业一、

 

设有三个关系:

               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
]

Tiguan – 浅绿,G – 水绿,B – 藤黄,Y – 银色,P – 浅紫。Model
的为主职务是以下多少个:

  • 转换砖墙
  • 打消砖块 (生成砖块分值)
  • 压实砖墙
  • 解除残砖 (生成嘉奖分值)

底图绘制

「一笔画」是多关卡的游戏情势,作者决定把关卡(连通图)的定制以3个安排接口的花样对外暴光。对外揭示关卡接口需求有一套描述连通图形状的正规化,而在小编日前有五个选项:

  • 点记法
  • 线记法

举个连通图 —— 伍角星为例来说一下那五个选用。

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

「点记法」记录关卡通关的2个答案,即端点要按自然的依次存放到数组
coords中,它是有序性的记录。「线记法」通过两点描述连通图的线条,它是冬日的笔录。「点记法」最大的优势是展现更简洁,但它必须记录二个及格答案,作者只是关卡的搬运工不是关卡创立者,所以小编最终选项了「线记法」。:)

 

3.一 生成砖墙

砖墙分两步生成:

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

辩白上,能够将 100 个格子能够均分到 5类颜色,然而小编玩过的「消灭星星」都不行使均分政策。通过分析两款「消灭星星」,其实能够开采三个规律
—— 「色砖之间的多少差在2个恒定的距离内」。

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

图片 5

作者把上边的「不完全均分」称作「波动均分」,算法的具体贯彻可以崇敬「不定均分算法」。

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

以下是伪代码的兑现:

JavaScript

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

相互绘制

在画布上绘制路线,从视觉上实属「接纳或一而再连通图端点」的进程,这些历程必要减轻一个难点:

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

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

JavaScript

// 端点坐标消息 let coords = []; lines.forEach(({x一, y一, x2, y2})
=> { // (x1, y壹) 在 coords 数组不设有 if(!isExist(x1, y1))
coords.push([x1, y1]); // (x2, y二) 在 coords 数组不存在
if(!isExist(x2, y2)) coords.push([x2, y2]); });

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

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

JavaScript

easel.addEventListener(“touchmove”, e => { let x0 =
e.targetTouches[0].pageX, y0 = e.targetTouches[0].pageY; // 端点半径
—— 取连通图端点半径的二倍,进步活动端体验 let r = radius * 2;
for(let [x, y] of coords){ if(Math.sqrt(Math.pow(x – x0, 二) +
Math.pow(y – y0), 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(({x一, y一, x2, y贰}) => { //
坐标是日前线段的源点 if(coord.x === x1 && coord.y === y1) {
coord.validCoords.push([x2, y2]); } // 坐标是当前线段的终点 else
if(coord.x === x2 && coord.y === y二) { coord.validCoords.push([x1,
y1]); } }) })

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

But…有效连接点只好剖断多少个点是还是不是为底图的线条,那只是二个静态的参阅,在实质上的「交互绘制」中,会境遇以下情况:

图片 7
如上图,AB已串连成线段,当前选中式点心B的实用连接点是 A 与 C。AB
已经一而再成线,即使 BA 也串连成线段,那么线段就重新了,所以这时候 BA
不可能成线,唯有 AC 才干成线。

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

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

内部「未成线的立见成效连接点」才具参加「交互绘制」,并且它是动态的。

图片 8

回头本节内容开端提的两个难题「手指下是否有端点」 与
「选中式点心到待选中式点心时期是还是不是成线」,其实可统1为三个难点:手指下是还是不是存在「未成线的可行连接点」。只须把监听手指滑动遍历的数组由连通图全体的端点坐标
coords 替换为当下选中式点心的「未成线的实用连接点」即可。

从那之后「一笔画」的严重性成效已经达成。能够当先体验一下:

图片 9

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

三.二 解决砖块

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

图片 10
前五个结合符合「相邻相连通一样色就能够防止去」,所以它们能够被排除;第5个组成即使「相邻同样色」可是不「相衔接」所以它无法被解决。

「化解砖块」的还要有四个第二的天职:生成砖块对应的分值。在「游戏规则」中,作者曾经提供了对应的数学公式:「解决砖块得分值
= 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(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;
}
}
}
}

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

自行识图

小编在录加入关贸总协定协会卡配置时,开掘三个七条边以上的交接图很轻易录错或录重线段。我在思维是不是开采贰个自动识别图形的插件,毕竟「一笔画」的图形是有规则的几何图形。

图片 11

下面的卡子「底图」,1眼就足以识出七个颜色:

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

与此同时这二种颜色在「底图」的面积大小顺序是:白底 > 线段颜色 >
端点颜色。底图的「采撷色值表算法」很轻松,如下伪代码:

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 坚实砖墙

砖墙在排除了一些砖块后,会现出空洞,此时须要对墙体举行坚实:

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

1种高效的贯彻方案是,每一次「解决砖块」后一向遍历砖墙数组(十×十数组)再把空洞做实,伪代码表示如下:

JavaScript

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

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

But…
为了抓好叁个浮泛对一张大数组进行全量遍历并不是壹种高效的算法。在笔者眼里影响「墙体抓好」功效的因素有:

  1. 固化空洞
  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…
上边的算法只好跑无损图。小编在使用了一张手提式无线电话机截屏做测试的时候开采,搜聚到的「色值表」长度为
四千+ !这直接导致端点和线条的色值无法直接拿走。

因此分析,能够发掘「色值表」里许多色值都以类似的,也正是在原来的「搜罗色值表算法」的底蕴上增添3个像样颜色过滤即能够寻找端点和线条的主色。伪代码落成如下:

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

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

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

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

加了小端点归并算法后,「端点识别」的精确度就上来了。经笔者本地质衡量试已经得以
百分百 识别有损的联网图了。

 

三.肆 化解残砖

上一小节提到了「描述墙体的边界并记下墙体的思梅止渴」的「列集合」,作者是直接利用这一个「列会集」来撤销残砖的,伪代码如下:

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

图片 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({x1, y①, 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})
}
}

 2、查询7号课程成绩在89分以上或57分以下的上学的小孩子学号。

4. View

View 首要的作用有多个:

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

UI
管理主若是指「分界面绘制」与「财富加载管理」,那两项作用相比布满本文就直接略过了。View
的侧器重是「映射 Model
的转移」并落成对应的动画片。动画是繁体的,而映射的规律是总结的,如下伪代码:

JavaScript

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

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

Model 的砖块每趟数据的转移都会打招呼到 View 的砖头,View
会依照对应的变动做相应的动作(动画)。

质量优化

出于「自动识图」须要对图像的的像素点实行扫描,那么质量确实是个须要关心的主题材料。作者设计的「自动识图算法」,在辨别图像的进度中须要对图像的像素做三回扫描:「搜聚色值表」
与 「搜集端点」。在扫描次数上其实很难下跌了,可是对于一张 750 * 1334
的底图来讲,「自动识图算法」供给遍历三遍长度为
750 * 1334 * 4 = 4,002,000
的数组,压力照旧会有些。笔者是从压缩被扫描数组的尺寸来提高品质的。

被围观数组的尺码怎么削减?
作者直接通过压缩画布的尺码来达到裁减被围观数组尺寸的。伪代码如下:

JavaScript

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

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

把源图片缩短四倍后,得到的图纸像素数组只有原来的
4^2 = 16倍。那在性质上是非常大的晋级。

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

5. Control

Control 要拍卖的事体比较多,如下:

  • 绑定 Model & View
  • 退换通过海关分值
  • 认清通过海关条件
  • 对外交事务件
  • 用户交互

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

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

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

「通过海关分值」与「推断通关条件」那对逻辑在本文的「游戏规则」中有有关介绍,那里不再赘述。

对外交事务件规划如下:

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

用户交互 APIs 规划如下:

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

运用「自动识图」的提出

尽管作者在本土测试的时候能够把具备的「底图」识别出来,可是并无法有限支撑别的开垦者上传的图片是不是被很好的鉴定分别出来。小编提出,能够把「自动识图」做为3个独立的工具使用。

笔者写了八个「自动识图」的单独工具页面:
能够在这些页面生成对应的卡子配置。

 

6. 问题

在腾讯网有三个关于「消灭星星」的话题:popstar关卡是怎么着安插的?

本条话题在终极提议了一个主题素材 ——
「无法排除和最大得分不满意过关条件的矩阵」

图片 21

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

最大得分不满足过关条件的矩阵
求「矩阵」的最大得分是二个「包包难题」,求解的算法轻便:对当前矩阵用「递归」的款型把具备的消灭分支都施行一遍,并取最高分值。但是javascript 的「递归」极易「栈溢出」导致算法不可能实践。

事实上在天涯论坛的话题中提到3个化解方案:

网络查到次序明显提出做个工具随便生成关卡,自动测算,把符合得分条件的卡子筛选出来

本条消除方案代价是昂贵的!小编提供有源码并不曾减轻那一个标题,而是用1个相比取巧的措施:跻身娱乐前检查是事为「不能够排除矩阵」,即便是再一次生成关卡矩阵

注意:笔者利用的取巧方案并未缓和难点。

结语

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

图片 9

二101十七日游的源码托管在:
内部游戏实现的基本点代码在:
电动识图的代码在:

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

感激您的翻阅,本文由 坑坑洼洼实验室
版权全部。假设转发,请注解出处:凹凸实验室()

1 赞 1 收藏
评论

图片 23

 三、查询课程名以“数据”五个字开端的兼具课程的课程号和课程名。

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

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

    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

 九、查询于今并未考试不如格的上学的小孩子学号。

    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

拾、查询全体考试战绩的平分分同样的学员学号分组

二、

 1、搜索选修课程号为C2的学生学号与成就。

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

 

 二、寻觅选修课程号为C四的学习者学号与姓名。

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

    注意本题也足以用嵌套做

观念本题改为“搜索选修课程号为C四的学员学号、姓名与成就”后仍可以用嵌套做吧?

 

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

    Selects.sno,sname from s,sc,c

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

只顾本题也能够用嵌套做

 

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

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

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

 

 5、寻找选修课程号为C二和C四的上学的小孩子学号。

    Select sno fromsc where cno=’C2′ and
sno in

         ( Select sno from sc where
cno=’C4′ )

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

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

 

 陆、找寻不学C二课程的学习者姓名和年龄。

    Selectsname,sage from s where sno not
in

         ( Selectsno from sc where
cno=’C2′ )

    或: Select sname,sage from s where
not exists

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

 

 七、寻觅选修了数据库课程的享有学生姓名。(同三)

    Select snamefrom s,sc,c

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

 

 八、搜索数据库课程不如格的女人姓名。

    连接:Select sname from s,sc,c

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

                and grade<60 and
ssex=’女’

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

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

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

               )

 

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

    Selectcname,avg(grade) from
sc,c

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

探讨本题也得以用嵌套做呢?

 

十、寻觅各样学生的平分成绩,输出学生姓名和平均成绩。

    Selectsname,avg(grade) from
s,sc

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

观念本题也足以用嵌套做吗?

 

1一、搜索足足有二1八个学生选修的教程名。

    Select cnamefrom c where cno in

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

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

 

1贰、搜索选修了不少于3门课程的学员姓名。

    Select snamefrom s where sno in

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

小心本题也足以用延续做

 

壹三、找寻各门课程的实际业绩均一点都不小于89分的学习者姓名。

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

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

方法二:

Select sname from s where sno not
in

         ( Selectsno from sc where
grade<90 )

①旦有一门不低于捌拾柒分就会输出该学员学号

 

1四、寻找数据库课程战表不低于该门课程平均分的学童姓名。

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

         )

1伍、寻觅种种系科男女学生的平均年龄和人口。

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

1陆、搜索计算机系(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、(补充)查询每门科目标及格率。

    本题能够分三步做:

   

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

     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

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

     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

思量本题也足以用嵌套做吗?

 

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

    Select count(*)from student

    where sno in

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

    下边是1个首屈一指的失实

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

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

 

三、

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

    SelectYname,Ono from YWY

    where Salarybetween 1000 and 3000 and
Ysex=’男’

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

    SelectOno,count(*) from YWY group by
Ono

 3、查询每一个客户在2000年3月购置的总金额,输出客户号和相应的总金额。

    SelectKno,sum(Fmoney) from FP

    where Fdatebetween ‘2002.5.1’ and
‘2002.5.31’

    group by Kno

 四、查询二零零零年3月选购次数超越七遍的有所客户号,且按客户号升序排序。 

    Select Kno fromFP

    where Fdatebetween ‘2002.5.1’ and
‘2002.5.31’

    group by Kno

    havingcount(*)>5

    order by KnoASC

 伍、查询各办公室男人和女子业务员的平均薪金。

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

 6、查询2004年四月曾经在王海亮业务员手中进货过商品的客户号、

            客户姓名和联系电话。

    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、查询全数薪酬比153⑧号业务员高的业务员的号码、姓名和报酬。

    SelectYno,Yname,Salary from YWY where
Salary >

         ( SelectSalary from YWY where
Yno=’1538′ )

 八、查询全体与1538号业务员在同二个办公的此外业务员的号码和人名。

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

         ( SelectOno from YWY where
Yno=’1538′ )

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

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

         ( Selectsum(Fmoney) from FP group
by Yno )

拾、查询全部业务员的编号、姓名、薪水以及薪给比她高的别的业务员的平均报酬。

    动用自连接

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

    from   YWY Y1, YWY Y2

    where  Y1.Salary < Y2.Salary

    group by  Y1.Yno  

 

四、

 壹、搜索各类班级的班级代码、学生人数、平均战绩。

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

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

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

    group byBJDM,BNXH,XSXM

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

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

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

    from  SC SC1, SC SC2, SC SC3

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

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

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

 4、输出一张表格,有实际业绩低于6贰分的每人学生对应一条记下,包罗字段:

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

    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

 ⑤、输出一张表格,有实际业绩低于613分的各位学生对应一条记下,包涵字段:

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

    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人学生对应一条记下,包涵字段:

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

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

    group byBJDM,BNXH,XSXM

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

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

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

    group by KM

 

 

 

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

 

 一、查询年龄在1玖至213周岁时期的女子的学号,姓名,年龄,按年龄从大到小排列。

    Selectsno,sname,sage from
student

    where sagebetween 19 and 21 and
ssex=’女’

    order by sagedesc

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

    Select count(*)from student

    where snamelike “%明%”

 三、查询100一科目没有成绩的上学的儿童的学号。

    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

 陆、查询平均分当先89分的男学生学号及平均分。

    连接:

    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’

    本题也能够用嵌套做

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

拾、查询学生姓名以及他选修课程的科目号及战绩。

    Selectsname,cno,grade from
student,sc

    wherestudent.sno=sc.sno

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

1一、查询选修“数据库原理”课且成绩 80
以上的学生姓名(用一连和嵌套二种办法)

    连接: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四、查询未有选修100二课程的上学的小孩子的上学的小孩子姓名。

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

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

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

要从语义上分解:(一)选取课程的学科号与课程名,不设有不选那门课的同桌。
   当中,“不选那门课的同学”能够象征为:

SELECT *

 FROM  S

 WHERE  S# NOT IN

  (SELECT  *

      FROM SC  

      WHERE  SC.C#=C.C#)

 

或者

SELECT *

 FROM  S

 WHERE   NOT EXISTS

  (SELECT  *

      FROM SC  

      WHERE S.S#=C.S# AND 

SC.C#=C.C# )

 

      

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

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

3.四叁.四 设有八个主导表Rubicon(A,B,C)和S(A,B,C)试用SQL查询语句表述下列关系代数表达式:
  (1)R∪S  (2)R∩S  (3)R-S  (4)πA,B(R)πB,C(S)

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

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

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

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

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

三.陆 试用SQL查询语句表述下列对教学数据库中多少个着力表S、SC、C的询问:

(一)总结有上学的小孩子选修的课程门数。
    SELECT COUNT(DISTINCT C#) FROM SC

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

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

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

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

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

(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=’女’)
除法运算

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

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

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

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

(七)在基本表SC中期维修改C4学科的大成,若战表小于等于7叁分时升高5%,若战表当先七十四分时提升四%(用五个UPDATE语句达成)。
    UPDATE SC
     SET GRADE=GRADE*1.05
     WHERE C#=’C4′ AND GRADE<=75
    UPDATE SC
     SET GRADE=GRADE*1.04
     WHERE C#=’C4′ AND GRADE>75

三.8 在第①章例一.四中提到“商旅产和土地资金财产管理理”关系模型有三个关系格局:
  零件 PART(P#,PNAME,COLOR,WEIGHT)
  项目 PROJECT(J#,JNAME,DATE)
  供应商 SUPPLIER(S#,SNAME,SADDR)
  供应 P_P(J#,P#,TOTOAL)
  采购 P_S(P#,S#,QUANTITY)

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

(2)试将PROGECT、P_P、PART多个基本表的当然联接定义为3个视图VIEW一,PART、P_S、SUPPLIEKoleos四个基本表的本来联接定义为贰个视图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#

(三)试在上述五个视图的根基上进行数量查询:

    一)检索Hong Kong的供应商所供应的组件的数码和名字。
    SELECT P#,PNAME FROM VIEW2 WHERE SADDR=’SHANGHAI’

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

叁.玖 对于教学数据库中挑大梁表SC,已创制下列视图:
CREATEVIEWS_GRADE(S#,C_NUM,AVG_GRADE)
ASSELECTS#,COUNT(C#),AVG(GRADE)
FROMSC
GROUPBYS#
试判别下列查询和更新是不是允许施行。若允许,写出转变来大旨表SC上的对应操作。
  (1)
SELECT*
FROMS_GRADE
      允许
   SELECT S#,COUNT(C#),AVG(GRADE)FROM SC GROUP BY S#

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

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

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

  (5)
DELETEFROMS_GRADE
WHEREC_NUM>4
    不允许

三.拾 预管理情势对于嵌入式SQL的贯彻有怎样主要意义?
   
预管理格局是先用预管理程序对源程序开始展览扫描,识别出SQL语句,并拍卖成宿主语言的函数调用情势;
然后再用宿主语言的编写翻译程序把源程序编写翻译成目的程序。那样,不用扩大宿主语言的编写翻译程序,
就能管理SQL语句。

三.1壹 在宿主语言的顺序中采纳SQL语句有哪些规定?
在宿主语言的次序中动用SLQ语句有以下规定:
(一)在先后中要区别SQL语句与宿主语言说话
(2)允许嵌入的SQL语句引用宿主语言的程序变量(称为共享变量),但有两条规定:
   一)引用时,这个变量前必须加“:”作为前缀标志,以示与数据库中变量有分别。
   贰)那一个变量由宿主语言的程序定义,并用SQL的DECLARE语句表明。
(三)SQL的晤面管理方式与宿主语言单记录管理格局之间要协调。
须求运用游标机制,把集结操作转换成单记录管理方式。

3.12SQL的联谊管理方式与宿主语言单记录管理情势之间怎么样和谐?
    由于SQL语句管理的是记录会集,而宿主语言语句二回只好管理1个笔录,
因而须求用游标(cousor)机制,把集合操作转变到单记录管理情势。

二.一③ 嵌入式SQL语句什么时候不必涉及到游标?曾几何时必须涉及到游标?
    (1)INSERT、DELETE、UPDATE语句,查询结果一定是单元组时的SELECT语句,
都可直接嵌入在主程序中应用,不必涉及到游标。
    (2)当SELECT语句询问结果是五个元组时,此时宿主语言程序无法选择,
一定要用游标机制把多个元组二次1个地传递给宿主语言管理。

 

 

 

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

 

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

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

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

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

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

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

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

    4.Access用户操作界面由(   
)部分组成。

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

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

       A.         B.         C.        D.

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

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

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

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

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

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

   
九.得以经过Internet实行数量公布的目的是(    )。

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

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

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

 

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

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

   
二.在文件系统中,存取数据的大旨单位为___记录____,在数据库系统中,存取数据的基本单位为___数据项_____。

   
叁.若实体A和B是多对多的交换,实体B和C是壹对一的联络,则实体A和C是___多_____对___多_____的联系。

   
四.在二个关系中不容许出现重复的____元组____,也不容许出现具备一样名字的___属性_____。

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

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

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

   
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选项完毕对结果表的____排序_____功能。

   
5.对于较复杂的类别,概念设计阶段的要紧职务是:首先遵照系统的逐一部分应用画出各自对应的____局部ER图______,然后再进行总结和完整安顿,画出_____整体ER图_____。

   
6.机器完毕阶段的对象是在管理器体系中赢得二个满足______统一图谋供给、作用完善、操作方便___的数据库应用系统。

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

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

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

 

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

   1.
设三个涉嫌为福睿斯(A,B,C,D,E),它的异常的小函数正视集为FD={A→B,A→C,(C,D)→E},则该关系的候选码为_____(A,D)___,候选码函数决定E是___伪传递___性。

   
贰.设2个涉嫌为汉兰达(A,B,C,D,E),它的小不点儿函数重视集为FD={A→B,A→C,(A,D)→E},该关系只满意___第一_____范式,若要标准化为高顶级的范式,则将赢得____2____个关系。

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

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

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

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

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

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

   
玖.在旅店管理中,涉及到的基本表有多少个,它们分别为客房表、留宿表、_____游子登记表、消费卡表____。

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

 

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

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

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

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

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

 

   
6、依照主教材第陆章所给的商品库和教学库,可能依据下列所给的每条SQL查询语句写出相应的功能,只怕遵照下列所给的每个作用写出相应的SQL查询语句。(每小题伍分,共二十分)

   
在名字为货色库的数据库中包涵有商品表1和商品表贰,它们的定义分别为:

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

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

   
在名为教学库的数据库中包涵有学员、课程和选课四个表,它们的概念分别为:

       学生(学生号 char(柒),姓名 char(陆),性别
char(二),出生日期 datetime,

            专业 char(10),年级 int)

       课程(课程号 char(四),课程名 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门科目(含未选任何学科)的全套学童。

 

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

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

        from 商品表1

        group by 分类名

 

   
5.从事教育工作学库中查询出至少选修了人名称为@m一学员所选课程中一门课的百分之百上学的小孩子。

select distinct 学生.*

        from 学生,选课

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

          from 学生,选课

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

        )

 

 

 

 

 

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

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

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

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

5.  
 

6.  
问题: 

七.  
①、查询“001”课程比“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#; 

11. 
二、查询平均战绩超过五二十三分的同桌的学号和平均战表; 

12. 
    select S#,avg(score) 

13. 
    from sc 

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

1伍. 
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九. 
四、查询姓“李”的教员的个数; 

20. 
  select count(distinct(Tname)) 

21. 
  from Teacher 

22. 
  where Tname like ‘李%’; 

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

二柒. 
陆、查询学过“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=’叶平’)); 

3叁. 
八、查询课程编号“00二”的成就比课程编号“00一”课程低的有着同学的学号、姓名; 

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; 

3六. 
九、查询全部课程战绩小于伍拾陆分的同桌的学号、姓名; 

37. 
  select S#,Sname 

38. 
  from Student 

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

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

41. 
    select Student.S#,Student.Sname 

42. 
    from Student,SC 

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

4四. 
1一、查询至少有1门课与学号为“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一”同学全体壹门课的别的同学学号和姓名; 

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. 
1叁、把“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四. 
14、查询和“100二”号的校友学习的教程完全一样的别的同学学号和人名; 

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

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

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

58. 
    Delect SC 

59. 
    from course ,Teacher  

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

陆1. 
1陆、向SC表中插入一些记录,这个记录须求符合以下原则:未有上过编号“00叁”课程的同室学号、二、 

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

陆五. 
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#=’00壹’) AS 企业管理 

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

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

71. 
    FROM SC AS t 

72. 
    GROUP BY S# 

73. 
    ORDER BY avg(t.score)  

7四. 
1八、查询各科战表最高和压低的分:以如下方式体现:课程ID,最高分,最低分 

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

76. 
    FROM SC L ,SC AS R 

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

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

79. 
                      FROM SC AS IL,Student AS IM 

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

81. 
                      GROUP BY IL.C#) 

82. 
        AND 

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

84. 
                      FROM SC AS IR 

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

86. 
                  GROUP BY IR.C# 

87. 
                    ); 

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

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

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

91. 
    FROM SC T,Course 

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

93. 
    GROUP BY t.C# 

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

玖5. 
20、查询如下课程平均成绩和及格率的百分比(用”一行”展现): 公司管理(00壹),Marx(002),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 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# = ’00四’ THEN 一 ELSE 0 END) AS 数据库及格百分数 

104.          FROM SC 

10五.        二一、查询分裂老师所教分裂科目平均分从高到低显示 

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

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

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

109.          GROUP BY C.C# 

110.          ORDER BY AVG(Score) DESC 

11一.        22、查询如下课程战绩第 三 名到第 陆 名的学员战表单:企业管理(001),马克思(002),UML (00叁),数据库(004) 

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

113.            SELECT  DISTINCT top 3 

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

11五.                Student.Sname AS 学生姓名 , 

116.              T一.score AS 公司管理, 

117.              T2.score AS 马克思, 

118.              T3.score AS UML, 

119.              T4.score AS 数据库, 

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

121.              FROM Student,SC  LEFT JOIN SC AS T1 

122.                              ON SC.S# = T1.S# AND T1.C# = ‘001’ 

123.                    LEFT JOIN SC AS T2 

124.                              ON SC.S# = T2.S# AND T2.C# = ‘002’ 

125.                    LEFT JOIN SC AS T3 

126.                              ON SC.S# = T3.S# AND T3.C# = ‘003’ 

127.                    LEFT JOIN SC AS T4 

128.                              ON SC.S# = T4.S# AND T4.C# = ‘004’ 

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

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

131.              NOT IN 

132.              (SELECT 

133.                    DISTINCT 

134.                    TOP 15 WITH TIES 

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

136.              FROM sc 

137.                    LEFT JOIN sc AS T1 

138.                              ON sc.S# = T1.S# AND T1.C# = ‘k1’ 

139.                    LEFT JOIN sc AS T2 

140.                              ON sc.S# = T2.S# AND T2.C# = ‘k2’ 

141.                    LEFT JOIN sc AS T3 

142.                              ON sc.S# = T3.S# AND T3.C# = ‘k3’ 

143.                    LEFT JOIN sc AS T4 

144.                              ON sc.S# = T4.S# AND T4.C# = ‘k4’ 

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

146.         

14柒.        2三、总括列印各科成绩,各分数段人数:课程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.         

①57.        2四、查询学毕生均成绩及其排行 

15捌.              SELECT 1+(SELECT COUNT( distinct 平均成绩) 

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

160.                              FROM SC 

161.                          GROUP BY S# 

162.                          ) AS T1 

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

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

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

166.                    FROM SC 

167.                GROUP BY S# 

168.                ) AS T2 

16九.            O福睿斯DE奥迪Q7 BY 平均成绩 desc; 

170.          

17壹.        25、查询各科成绩前3名的记录:(不思虑成绩并列意况) 

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

1八二.        2柒、查询出只选修了1门科目标全套学员的学号和姓名 

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

184.          from SC ,Student 

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

1捌陆.        28、查询男人、女子人数 

187.            Select count(Ssex) as 匹老婆数 from Student group by Ssex having Ssex=’男’; 

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

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

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

191.        30、查询同名同性学生名单,并总结同名人数 

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

1九三.        3一、壹玖八三年降生的学生名单(注:Student表中Sage列的等级次序是datetime) 

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

195.            from student 

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

1九七.        32、查询每门学科的平均战表,结果按平均战表升序排列,平均战表一样时,按学科号降序排列 

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

19玖.        3三、查询平均成绩超过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; 

20三.        3肆、查询课程名字为“数据库”,且分数低于60的学员姓名和分数 

204.            Select Sname,isnull(score,0) 

205.            from Student,SC,Course 

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

207.        3五、查询全体学员的选课情形; 

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

209.            FROM SC,Student,Course 

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

21一.        36、查询别的一门学科战表在7十分以上的全名、课程名称和分数; 

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

二1五.        叁七、查询不如格的学科,并按学科号从大到小排列 

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

217.        38、查询课程编号为00三且课程战绩在七十七分以上的上学的小孩子的学号和姓名; 

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二1.        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.        4一、查询种种科目及相应的选修人数 

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

2二七.        4贰、查询分化科目成绩一样的学员的学号、课程号、学生成绩 

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

22玖.     肆三、查询每门功课成绩最棒的前两名 

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

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

240.            from  sc  

241.            group  by  C# 

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

二四三.        45、检索至少选修两门学科的上学的小孩子学号 

244.            select  S#  

245.            from  sc  

246.            group  by  s# 

247.            having  count(*)  >  =  2 

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

249.            select  C#,Cname  

250.            from  Course  

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

25二.        四七、查询没学过“叶平”老师授课的任一门课程的上学的小孩子姓名 

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

25陆.        4九、检索“004”课程分数小于60,按分数降序排列的同学学号 

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

258.        50、删除“00二”同学的“00一”课程的成绩 

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

260.         

 

 

 

 

 

 

 

 

 

 

依傍考核武器试验题参考答案

 

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

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

  1. B 9. D  10. B

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

 

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

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

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

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

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

    10. X→(Y,Z)

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

 

   1. 第二                           
2.6、4

   3. 表、创建                        四.
分组总括、排序

   5. 局部E牧马人图、全部EHighlander图            陆.
规划要求、功效完善、操作便利

   7.
标题栏、菜单栏、专业区(次序无先后)

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

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

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

 

   1. (A,D)、伪传递                     

  1. 第一、2

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

   4. primary key、foreign key

   5. 实表、虚表                        

  1. 连接、选择

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

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

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

  1. 大小写

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

 

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

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

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

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

 

   
陆、依照主教材第伍章所给的商品库和教学库,只怕依照下列所给的每条SQL查询语句写出相应的法力,或许根据下列所给的每一种意义写出相应的SQL查询语句。(每小题6分,共十几分)

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

   2.
从教学库中询问出只选修了壹门课程的百分百学生。

   三.
从事教育工作学库中查询出最多选修了二门学科(含未选任何学科)的方方面面上学的小孩子。

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

        from 商品表1

        group by 分类名

   5. select distinct 学生.*

        from 学生,选课

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

          from 学生,选课

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

        )

 

叁.一 名词解释

(1)SQL模式:SQL格局是表和授权的静态定义。几个SQL形式定义为基本表的集结。
一个由情势名和方式具有者的用户名或账号来明确,并涵盖形式中每2个因素(基本表、视图、索引等)的概念。
(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)游标:游标是与某1查询结果相沟通的暗号名,用于把集结操作转变来单记录管理格局。
(16)卷游标:为了克制游标在拉动时不能再次来到的忙绿,SQL贰提供了卷游标才干。
卷游标在促进时不仅能沿查询结果中元组顺序从头到尾一行行推进,也能1行行再次来到。

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

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

(贰)检索年龄大于贰14岁的男学生的学号和姓名。
    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’
但上1种写法更加好有的。

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

(伍)检索至少选修两门科目标学习者学号。
    SELECT DISTINCT X.SNO
    FROM SC X,SC Y
    WHERE X.SNO=Y.SNO AND X.CNO<>Y.CNO
Notice:对表SC举行自连接,X,Y是SC的八个小名。

(陆)检索全部上学的小孩子都选修的课程的课程号与课程名。
    SELECT C#,CNAME
    FROM C
    WHERE NOT EXISTS
     (SELECT *
     FROM S
     WHERE S# NOT IN
      (SELECT *
      FROM SC
      WHERE  SC.C#=C.C#))

要从语义上分解:(一)选择课程的教程号与课程名,不设有不选那门课的同校。
   在那之中,“不选那门课的同窗”可以表示为:

SELECT *

 FROM  S

 WHERE  S# NOT IN

  (SELECT  *

      FROM SC  

      WHERE  SC.C#=C.C#)

 

或者

SELECT *

 FROM  S

 WHERE   NOT EXISTS

  (SELECT  *

      FROM SC  

      WHERE S.S#=C.S# AND 

SC.C#=C.C# )

 

      

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

三.3 设有三个主导表Escort(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

三.四叁.肆 设有五个主题表CR-V(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)

三.6 试用SQL查询语句表述下列对教学数据库中八个着力表S、SC、C的查询:

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

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

(3)求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%’

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

(九)求年龄大于全数女子学校友年龄的男学生姓名和年龄。
    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的逐条更新操作:
(一)往基本表S中插入1个学员元组(‘S九’,‘WU’,1八)。
    INSERT INTO S(S#,SNAME,AGE) VALUES(’59’,’WU’,18)
(二)在中央表S中寻找每壹门科目战绩都高出等于76分的上学的小孩子学号、姓名和性别,并把检索到的值送往另二个已存在的基本表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’)

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

(柒)在基本表SC中期维修改C4课程的实际业绩,若战绩小于等于七十五分时提升伍%,若战绩超过712分时提升四%(用八个UPDATE语句实现)。
    UPDATE SC
     SET GRADE=GRADE*1.05
     WHERE C#=’C4′ AND GRADE<=75
    UPDATE SC
     SET GRADE=GRADE*1.04
     WHERE C#=’C4′ AND GRADE>75

三.8 在第2章例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#))
    

(贰)试将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)试在上述四个视图的基础上进行数量查询:

    一)检索香港的供应商所供应的零件的号子和名字。
    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.十 预管理格局对于嵌入式SQL的达成有怎么着重要意义?
   
预管理方式是先用预管理程序对源程序开展围观,识别出SQL语句,并拍卖成宿主语言的函数调用情势;
然后再用宿主语言的编写翻译程序把源程序编写翻译成目的程序。那样,不用扩大宿主语言的编写翻译程序,
就能管理SQL语句。

三.1一 在宿主语言的主次中动用SQL语句有哪些规定?
在宿主语言的顺序中应用SLQ语句有以下规定:
(1)在程序中要不相同SQL语句与宿主语言说话
(二)允许嵌入的SQL语句引用宿主语言的主次变量(称为共享变量),但有两条规定:
   1)引用时,这一个变量前务必加“:”作为前缀标记,以示与数据库中变量有分别。
   二)那个变量由宿主语言的程序定义,并用SQL的DECLARE语句表明。
(三)SQL的集聚管理方式与宿主语言单记录管理方式之间要和睦。
须要利用游标机制,把集结操作转换来单记录管理格局。

叁.1二SQL的成团管理格局与宿主语言单记录管理情势之间怎么协和?
    由于SQL语句管理的是记录集结,而宿主语言语句2次只好管理2个记下,
因而需求用游标(cousor)机制,把集结操作调换来单记录管理格局。

二.一三 嵌入式SQL语句曾几何时不必涉及到游标?何时必须涉及到游标?
    (壹)INSERT、DELETE、UPDATE语句,查询结果必然是单元组时的SELECT语句,
都可径直嵌入在主程序中央银行使,不必涉及到游标。
    (贰)当SELECT语句询问结果是八个元组时,此时宿主语言程序无法采用,
一定要用游标机制把四个元组3次3个地传递给宿主语言管理。

 

发表评论

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

网站地图xml地图
Copyright @ 2010-2020 澳门新葡亰官网app 版权所有