阅读前注意:
1. 本实验报告配套《数据库系统原理及应用教程》(苗雪兰等,第五版) 实验四:数据库的嵌套查询实验(书上10.4节以及第六章部分内容),书本中采用Microsoft SQL Server Management Studio 2008,实验报告中采用Microsoft SQL Server Management Studio 2019和Microsoft Visual Studio 2012(用于C#的编写)。
2. 如果你的数据库课程选用的书目是这本书的话,那么大概率这会是你的实验作业。建议先自己独立完成后再作参考,数据库这门课是需要自己动手的。
3. 实验报告中可能增加了一些书中没有的附加内容,读者可以有兴趣自行完成。
4. 实验报告仅供初学者参考。
5. 请谅解实验报告中可能存在的问题或错误,欢迎指出,欢迎交流讨论。
一、实验目的
本实验的目的是使学生进一步掌握SQL Server Management Studio的使用方法,加深对Transact-SQL语言的嵌套查询语句的理解。
二、实验内容
1.基本内容
按照书上P294 10.4.4的要求完成基本操作实验内容(使用IN、比较符、ANY或ALL和EXIST操作符进行嵌套查询操作)。
2.选做内容
熟悉C#的开发环境, 学习简单交互界面的设计(如:C#设计一个简易的计算器)
1、练习C#中Edit组件和Button组件的使用方法。
2、能实现计算器的基本功能。
3、要求界面的设计具有个性化。
4、提交的程序前面要有分析,中间应有注释。
三、实验过程
1.基本内容
按照书上P294 10.4.4的要求完成基本操作实验内容(使用IN、比较符、ANY或ALL和EXIST操作符进行嵌套查询操作)。
首先检查表中的内容是否符合书上的要求,代码如下:
USE Student_Class
-- 查验目前表中的信息
SELECT * FROM Student
SELECT * FROM Course
SELECT * FROM Select_Course
查询结果:
按照书上要求修改课程表,代码如下:
-- 清除表中信息后重新录入
TRUNCATE TABLE Course
INSERT INTO Course
VALUES ('C1','计算机引论',NULL),
('C2','数据结构','C3'),
('C3','C语言编程','C1'),
('C7','高等数学',NULL)
SELECT * FROM Course
执行结果如下:
将下列查询要求用T-SQL语句表示:
(1)求选修了高等数学的学生学号和姓名。
代码如下:
SELECT s_number, s_name FROM Student
WHERE s_number IN(
SELECT s_number FROM Select_Course
WHERE c_number IN(
SELECT c_number FROM Course
WHERE c_name='高等数学'))
查询结果:
(2)求C1课程的成绩高于张三的学生学号和成绩。
代码如下:
SELECT s_number, c_score FROM Select_Course
WHERE c_number='C1' AND c_score>(
SELECT c_score FROM Select_Course
WHERE c_number='C1' AND s_number=(
SELECT s_number FROM Student
WHERE s_name='张三'))
查询结果:
(3)求其它系中比计算机系某一学生年龄小的学生。
代码如下:
SELECT * FROM Student
WHERE s_age<ANY(
SELECT s_age FROM Student
WHERE s_major='计算机') AND s_major<>'计算机'
查询结果:
(4)求其它系中比计算机系学生年龄都小的学生。
代码如下:
SELECT * FROM Student
WHERE s_age<ALL(
SELECT s_age FROM Student
WHERE s_major='计算机') AND s_major<>'计算机'
查询结果:
(5)求选修了C2课程的学生姓名。
代码如下:
SELECT s_name FROM Student
WHERE EXISTS(
SELECT * FROM Select_Course
WHERE s_number=Student.s_number AND c_number='C2')
查询结果:
(6)求没有选修C2课程的学生姓名。
代码如下:
SELECT s_name FROM Student
WHERE NOT EXISTS(
SELECT * FROM Select_Course
WHERE s_number=Student.s_number AND c_number='C2')
查询结果:
(7)查询选修了全部课程的学生的姓名。
代码如下:
SELECT s_name FROM Student
WHERE NOT EXISTS(
SELECT * FROM Course
WHERE NOT EXISTS(
SELECT * FROM Select_Course
WHERE s_number=Student.s_number AND c_number=Course.c_number))
查询结果:
(8)求至少选修了学号为“S2”的学生所选修的全部课程的学生学号和姓名。
代码如下:
SELECT s_number, s_name FROM Student
WHERE NOT EXISTS(
SELECT * FROM Select_Course SC1
WHERE SC1.s_number='S2' AND NOT EXISTS(
SELECT * FROM Select_Course SC2
WHERE Student.s_number=SC2.s_number
AND SC2.c_number=SC1.c_number AND SC2.s_number<>'S2'))
查询结果:
说明:书中所给出的代码有误,缺少代码段中最后一行里的“AND SC2.s_number<>‘S2’”,因此输出的结果有S2同学本身。为避免此情况,需要加上这一段限制代码。
2.选做内容
熟悉C#的开发环境, 学习简单交互界面的设计(如:C#设计一个简易的计算器)
1、练习C#中Edit组件和Button组件的使用方法。
2、能实现计算器的基本功能。
3、要求界面的设计具有个性化。
4、提交的程序前面要有分析,中间应有注释。
实验使用的Microsoft Visual Studio 2012。打开该软件:
新建项目,选中Visual C#,新建Windows 窗体应用程序:
从右侧工具栏中分别拖出“Button”、“textBox”到窗口中,将其排版成计算器的界面并重命名(右键“属性”中)。同时可以在容器中选定一个容器将不同的区域分开(例如计算区和展示区):
创建、排版完成后,分别双击每个按钮将其添加到命名空间WindowsFormsApplication1。
由于需要在按下按钮之后在展示区中显示数字,因此需要一个字符录入的函数。其思想是textBox中的内容更改为原本的内容再加上转化为字符串类型的输入数字。过程中需要注意命名的二义性,textBox重命名的名称与它原有的名称不能相同。
接着,在数字0-9对应的按钮代码中加入这个函数:(这里只展示了一部分)
定义全局变量temp和pos,temp用于保存临时的计算结果,pos用于记录计算方案。pos=1代表加法,2、3、4依次代表减法、乘法、除法。定义的目的是便于清零功能的实现和等号功能的实现。
实现清零功能。思路是将展示区清除,textBox1.Text的值可以为字符串0,也可以为空。临时计算结果清除,计算方案清除。
实现加减乘除功能。在对应按钮中,首先规定计算方案,然后获取textBox1中计算符号之前的数字,并将该数字清零,等待第二个数字的录入。
实现等于号功能。首先记录计算符号之后的数字(即第二个数字)为temp1,然后将第一个数字(计算符号之前的数字,即temp)与其进行相应操作并转换为字符串,最后把结果展示在textBox1上。
小数点的功能实现这里不予设计,读者如果感兴趣可以自行设计。小数点的设计需要考虑很多问题,最核心的问题是将小数转化为双精度类型进行计算。此外,还有输入一组数字中不能出现两个及以上的小数点、没有数字的情况下不能输入小数点(当然有些计算器默认点开头的数字个位就是0)等输入规定也需要满足。读者可以按需要设定规则。
测试功能,满足基本的加减乘除运算即可。
完整的代码及注释如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
//添加全局变量:temp——用于保存临时计算结果,pos——用于记录计算方法
float temp = 0;
int pos = 0;
//编写字符录入函数
public void Addnum(int num)
{
textBox1.Text = textBox1.Text + num.ToString(); //注意命名的二义性
}
public Form1()
{
InitializeComponent();
}
//在显示屏中添加数字
private void button1_Click(object sender, EventArgs e)
{
Addnum(1);
}
private void button3_Click(object sender, EventArgs e)
{
Addnum(3);
}
// 等于号:首先记录计算符号之后的数字,再按照计算方案进行计算,最后展示计算结果
private void button12_Click(object sender, EventArgs e)
{
float temp1 = Convert.ToInt64(textBox1.Text); //记录计算符号之后的数字
// 按照计算方案进行计算
switch (pos)
{
case 1:
textBox1.Text = (temp + temp1).ToString();
break;
case 2:
textBox1.Text = (temp - temp1).ToString();
break;
case 3:
textBox1.Text = (temp * temp1).ToString();
break;
case 4:
textBox1.Text = (temp / temp1).ToString();
break;
}
}
private void button2_Click(object sender, EventArgs e)
{
Addnum(2);
}
private void button9_Click(object sender, EventArgs e)
{
Addnum(9);
}
private void button10_Click(object sender, EventArgs e)
{
}
//加法
private void button13_Click(object sender, EventArgs e)
{
pos = 1; //计算方案
temp = Convert.ToInt64(textBox1.Text); //获取textBox1中计算符号之前的数字
textBox1.Text = "";//清除展示框,便于第二个数字的录入和识别
}
// 清零按钮
private void button17_Click(object sender, EventArgs e)
{
textBox1.Text = "";
temp = 0;
pos = 0;
}
private void button4_Click(object sender, EventArgs e)
{
Addnum(4);
}
private void button5_Click(object sender, EventArgs e)
{
Addnum(5);
}
private void button6_Click(object sender, EventArgs e)
{
Addnum(6);
}
private void button7_Click(object sender, EventArgs e)
{
Addnum(7);
}
private void button8_Click(object sender, EventArgs e)
{
Addnum(8);
}
private void button11_Click(object sender, EventArgs e)
{
Addnum(0);
}
// 减法
private void button16_Click(object sender, EventArgs e)
{
pos = 2; //计算方案
temp = Convert.ToInt64(textBox1.Text); //获取textBox1中计算符号之前的数字
textBox1.Text = "";//清除展示框,便于第二个数字的录入和识别
}
// 乘法
private void button15_Click(object sender, EventArgs e)
{
pos = 3; //计算方案
temp = Convert.ToInt64(textBox1.Text); //获取textBox1中计算符号之前的数字
textBox1.Text = "";//清除展示框,便于第二个数字的录入和识别
}
// 除法
private void button14_Click(object sender, EventArgs e)
{
pos = 4; //计算方案
temp = Convert.ToInt64(textBox1.Text); //获取textBox1中计算符号之前的数字
textBox1.Text = "";//清除展示框,便于第二个数字的录入和识别
}
// 点按钮(读者可以按需要自行设计)
private void TextBox1(object sender, EventArgs e)
{
}
}
}