《数据库系统原理及应用教程》(苗雪兰等,第五版) 实验四:数据库的嵌套查询实验

阅读前注意:

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

        }
    }
}
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

K2SO4钾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值