首页 > 数据库 >c203数据库练习题下半

c203数据库练习题下半

时间:2023-12-20 20:24:34浏览次数:34  
标签:练习题 xh 选课 数据库 存储 c203 xsxkb xsjbxxb select

2、视图练习

(1)建立视图v_xs_1,要求包含男生的学号,姓名,性别,出生日期,班级编号,专业名称字段,并要求视图操作数据时进行检查。使用select命令查询创建的视图。

create view v_xs_1 as select xh,xm,xb,csrq,bjbh,zymc

from xsjbxxb

where xb='男'

with check option;

4

捕获

建立一个学院教师的视图v_xyjs,包含部门号,部门名称,教师姓名字段。使用select命令查询创建的视图。

create view v_xyjs as select bmdmb.bmh,bmmc,jsxm

from bmdmb join jsjbxxb

on bmdmb.bmh=jsjbxxb.bmh;

5

捕获

在jwgl数据库中,创建学生的选课信息视图v_xs_xk,包括学生的学号,姓名,性别,专业名称,课程名称,成绩字段。使用select命令查询创建的视图。

create view v_xs_xk as select xsjbxxb.xh,xm,xb,zymc,kcmc,cj

from xsjbxxb join xsxkb on xsjbxxb.xh=xsxkb.xh

join kcdmb on kcdmb.kcdm=xsxkb.kcdm;

6

捕获

创建一个计算每门课程平均成绩的视图v_kc_avg,要包含课程名称,课程平均成绩字段。使用select命令查询创建的视图。

create view v_kc_avg as select kcdmb.kcmc,avg(cj)

from kcdmb join xsxkb

on kcdmb.kcdm=xsxkb.kcdm

group by kcdmb.kcmc;

7

捕获

通过视图v_xs_xk,查询男同学的选课信息。

select * from v_xs_xk where xb='男';

8

修改视图v_xs_xk,要求视图包含2000年及以后出生的男生信息。

alter view v_xs_xk as

select xs.xh,xm,xb,zymc,kcmc,cj from xsjbxxb as xs join xsxkb

on xs.xh=xsxkb.xh

join kcdmb

on kcdmb.kcdm=xsxkb.kcdm

where xb='男' and year(csrq)>=2000;

9

利用视图v_kc_avg查询微机原理与应用这门课程的课程平均分。

select * from v_kc_avg

where kcmc='微机原理与应用';

输入一条数据:('201920505101','王红','女','2001-4-9','2019205051','财务管理')验证视图v_xs_1的WITH CHECK OPTION功能。

insert into v_xs_1 values('2303210516','孙晓峰','女','2002-1-15','2019205051','财务管理');

11

删除视图v_xyjs。

Drop view v_xyjs;

(1)使用变量查询学号为201820109101的学生的姓名和出生日期。

SET @number='201820109101';

SELECT xm, csrq

FROM xsjbxxb

WHERE xh=@number;

(2)使用IF语句编写一个存储过程xsxk。查询根据输入的课程名称查询该课程上课人数,如果人数多于或等于30人,则显示选课结果为“选课成功”,否则显示选课结果为“选课失败”。调用存储过程,查询“微机原理与汇编语言”课程上课人数,选课结果。

DELIMITER $$

create procedure xsxk(cname char(50))

begin

declare count int;

select count(*) into count

from xsxkb join kcdmb on xsxkb.kcdm=kcdmb.kcdm

where kcmc=cname;

if count>=30 then

select count as 选课人数,'选课成功' as 选课结果;

else

select count as 选课人数,'选课失败' as 选课结果;

end if;

end $$

调用存储过程:

call xsxk('微机原理与汇编语言')

$$

(3)使用带有简单 CASE 语句编写一个存储过程xsxb。根据学生学号查询学生性别,显示性别分类信息,如果性别是“男”,显示“该生是男同学”;如果性别是“女”,显示“该生是女同学”。调用存储过程,查询“201720409101”同学的性别分类信息。

create procedure xsxb(xsxh varchar(20))

begin

declare xbfl char(2);

select xb into xbfl from xsjbxxb where xh=xsxh;

case xbfl

when '男' then select xbfl as 性别,'该生是男同学' as 性别分类;

when '女' then select xbfl as 性别,'该生是女同学' as 性别分类;

end case;

end

$$

调用存储过程:

call xsxb('201720409101')

$$

(4)使用CASE语句编写程序:建立一个存储过程getGradeCase,该存储过程通过学生学号(stu_no)和课程编号(cour_no)查询其成绩(grade),返回成绩和成绩的等级,成绩大于等于90分的为优秀,小于90分大于等于80分的为良好,小于80分大于等于70分的为中等,小于70分大于等于60分的为及格,小于60分为不及格。调用存储过程getGradeCase,查看学号为“201720505101”,课程代码为“00202117”的成绩及成绩等级。

Create procedure getGradeCase(stu_no varchar(20),cour_no varchar(10))

begin

declare stu_grade float;

select cj into stu_grade from xsxkb where xh=stu_no and kcdm=cour_no;

case

WHEN stu_grade >=90 THEN

select stu_grade as '成绩','优秀' as '等级';

WHEN stu_grade <90 and stu_grade >=80 THEN

select stu_grade as '成绩','良好' as '等级';

WHEN stu_grade <80 and stu_grade >=70 THEN

select stu_grade as '成绩','中等' as '等级';

WHEN stu_grade <70 and stu_grade >=60 THEN

select stu_grade as '成绩','及格' as '等级';

else

select stu_grade as '成绩','不及格' as '等级';

end case;

end

$$

调用存储过程:

call getGradeCase('201720505101','00202117');

(5)使用REPEAT语句编写一个存储过程oddsum,求1到任意数以内各奇数的和。调用存储过程sum,求100以内的奇数和。

create procedure oddsum(a int)

begin

declare sum int default 0;

declare i int default 1;

repeat

set sum=sum+i;

set i=i+2;

until i>a

end repeat;

select sum;

end

$$

调用存储过程:

call oddsum(100)

$$

(6)使用WHILE语句编写一个存储过程multiply,实现1到任意数的累积。调用存储过程multiply,求1*2*3……*20的乘积。

create procedure multiply(a int)

begin

declare mul bigint default 1;

declare i int default 1;

while i<=a DO

set mul=mul*i;

set i=i+1;

end while;

select mul;

end

$$

调用存储过程:

call multiply(20)$$

2.运算符和表达式的使用方法:(每题5分,共30分)

(1)运算符准备,执行代码如下:

mysql> CREATE TABLE t1(a INT,s CHAR(10));

mysql> INSERT INTO t1 VALUE(20,'beijing');

(2)执行如下SQL运算符代码,并分析结果。

①SELECT a,a+5,a*2 FROM t1;

②SELECT a,a/3,a DIV 3,a%5,MOD(a,5) FROM t1;

③SELECT a,a=24,a<12,a>40,a>=24,a<=24,a!=24,a<>24,a<=>24 FROM t1;

④SELECT s,s LIKE 'beijing',s LIKE 'b%g',s LIKE 'bei_',s LIKE '%jing' FROM t1;

三、实验步骤

1. MySQL系统内置函数的使用:

(1)SELECT ABS(0.5), ABS(-0.5), PI();

(2)SELECT CEIL(2.3), CEIL(-2.3), CEILING(2.3), CEILING(-2.3);

(3)SELECT ROUND(2.3), ROUND(2.5), ROUND(2.53,1), ROUND(2.55,1);

(4)SELECT SUBSTRING('helloworld',1,5);

(5)SELECT LENGTH('helo');

(6)SELECT CONNECTION_ID();

(7)SELECT DATABASE(), SCHEMA():

(8)SELECT USER(), SYSTEM_USER(), SESSION_USER();

2. MySQL自定义函数的创建和调用:

(1)创建一个无参数的自定义函数并调用该函数。(例题9.16)

代码为:

DROP FUNCTION IF EXISTS hello;

DELIMITER $$

CREATE FUNCTION hello()

RETURNS VARCHAR(255)

BEGIN

RETURN 'Hello world,i am mysql';

END $$

DELIMITER ;

调用hello函数:SELECT hello();

(2)创建带参数的自定义函数formatDate,实现简单调用DATE_FORMAT(date,format)函数功能,并调用该函数。(例题9.17)

DELIMITER $$

DROP FUNCTION IF EXISTS formatDate $$

CREATE FUNCTION formatDate(fdate datetime)

RETURNS VARCHAR(255)

BEGIN

DECLARE x VARCHAR(255) DEFAULT '';

SET x= date_format(fdate,'%Y年%m月%d日%h时%i分%s秒');

RETURN x;

END $$

DELIMITER ;

调用formatDate函数。输入SQL语句:

select formatDate(now());

(3)使用数据库中的xsxkb表、kcdmb表,创建自定义函数num_func,统计指定课程名称的选课人数。

mysql> delimiter $$

mysql> create function num_func(kcmc varchar(20))

-> returns int

-> begin

-> declare num int;

-> select count(*) into num from xsxkb,kcdmb

-> where xsxkb.kcdm=kcdmb.kcdm and kcmc=kcdmb.kcmc;

-> return num;

-> end $$

调用函数num_func ,查看“计算机网络技术”的选课人数。

select num_func('计算机网络技术');

(4)删除函数num_func 。

drop function num_func;

(一)创建并调用存储过程:

1.在jwgl数据库系统中,创建一个名为proc_select存储过程,实现查询所有学生基本信息。调用存储过程查看学生基本信息。

创建函数代码如下:

mysql> delimiter $$

mysql> create procedure proc_select()

-> begin

-> select * from xsjbxxb;

-> end $$

调用存储过程:

mysql> delimiter ;

mysql> call proc_select();

2. 在jwgl数据库系统中,创建一个名为proc_kc _cj存储过程,要求实现如下功能:根据学生的姓名,查询该学生选课成绩(包括xh、xm、kcmc、cj字段)。调用存储过程,查询杨丽娟和唐宇坤的选课成绩。

创建存储过程代码如下:

delimiter $$

create procedure proc_kc_cj(in name varchar(50))

begin

select xsjbxxb.xh,xm,kcmc,cj from xsjbxxb,xsxkb,kcdmb

where xsjbxxb.xh=xsxkb.xh

and kcdmb.kcdm=xsxkb.kcdm

and xm=name;

end $$

delimiter ;

调用存储过程查看:

call proc_kc_cj('杨丽娟');

call proc_kc_cj('唐宇坤');

3.在jwgl数据库系统中创建存储过程,存储过程名proc_kc_cjcx,要求实现如下功能:根据课程名称,查询该课程的选课情况,如果该课程没有学生选课,则输出“某某课程没有学生选课”信息,否则输出该门课程所有学生选课的相关消息,包括学生姓名、班级名称、课程名称和成绩等。通过调用存储过程proc_kc_cjcx,显示选修“网络数据库应用技术” 课程的学生情况。

创建存储过程代码如下:

Delimiter $$

CREATE PROCEDURE proc_kc_cjcx(IN CourseName varchar(30))

begin

if((select count(kcdmb.kcdm)

from kcdmb,xsxkb

where kcdmb.kcdm=xsxkb.kcdm and kcdmb.kcmc=CourseName)=0) then

select "该课程没有学生选课";

else

select xm,bjzwmc,kcmc,cj from xsjbxxb,xsxkb,kcdmb,bjdmb

where xsxkb.xh=xsjbxxb.xh and kcdmb.kcdm=xsxkb.kcdm and xsjbxxb.bjbh=bjdmb.bjbh

and kcmc=CourseName;

end if;

end $$

Delimiter ;

调用存储过程查询:

Call proc_kc_cjcx(‘网络数据库应用技术’);

4.在jwgl数据库系统中创建存储过程,存储过程名stu_grcount,要求实现如下功能:当输入一个学生的学号时,通过返回输出参数获取该学生选修课程的门数。执行存储过程 stu_grcount,显示学号为 201720909101的选课门数。

创建存储过程代码如下:

Delimiter $$

create procedure stu_grcount(in xuehao varchar(20),out num int)

begin

select count(*) into num from xsxkb

Where xh=xuehao;

End $$

delimiter ;

调用存储过程:

mysql> call stu_grcount('2017209091011',@num);

mysql> select @num;

5. 删除jwgl数据库中的存储过程proc_kc_cjcx。(只写代码,不执行)

DROP PROCEDURE IF EXISTS proc_kc_cjcx;

(二)触发器的应用

1. 在jwgl数据库系统创建触发器trigger_delete,实现如下的功能:当在jwgl数据库系统中的表xsjbxxb中删除某个学生时,同时更新对应表xsxkb中相应学生的选课记录。

代码如下:

delimiter $$

DROP TRIGGER IF EXISTS trigger_delete$$

CREATE TRIGGER trigger_delete

AFTER DELETE ON xsjbxxb

FOR EACH ROW

BEGIN

delete from xsxkb where xh=old.xh;

END$$

delimiter ;

验证:

mysql> delete from xsjbxxb where xh='201720409101';

mysql> select * from xsxkb where xh='201720409101';

mysql> select * from xsjbxxb where xh='201720409101';

2. 查看触发器trigger_delete的文本定义。

mysql> SHOW TRIGGERS WHERE `TRIGGER` LIKE 'trigger_delete'\G;

3. 对表xsjbxxb创建名为 trigger_update的触发器,当修改表xsjbxxb中某一条记录时,同时更新对应表xsxkb中相应学生的选课记录。

代码如下:

CREATE TRIGGER trigger_update

AFTER UPDATE ON xsjbxxb

FOR EACH ROW

BEGIN

update xsxkb set xsxkb.xh=new.xh where xsxkb.xh=old.xh;

END$$

delimiter ;

验证:

mysql> update xsjbxxb set xh='2003210514' where xm='马文慧';

4.删除触发器xsjbxxb_deleted. (只写代码,不执行)

DROP TRIGGER jwgl.xsjbxxb_deleted;

标签:练习题,xh,选课,数据库,存储,c203,xsxkb,xsjbxxb,select
From: https://www.cnblogs.com/mhyweb/p/17917406.html

相关文章

  • c203数据库练习题上半
    1.使用SQL语言创建满足以下要求的数据库。(1)创建数据库名称为jwgl,字符集选择utf8,排序规则选择utf8_general_ci。createdatabasejwglcharactersetutf8collateutf8_general_ci;(2)查看数据库。showdatabases;(3)将数据库jwgl的指定字符集修改为gb2312。mysql>alterdatabasejwg......
  • 关于数据库的基础
    单一索引:只是用某一列数据作为索引,默认是index索引,这一列可以包含重复数据;如果某一列不存在重复数据最好设置成unique形式的索引,比index的索引速度更快,在text数据上要使用fulltext索引。联合索引:为了更进一步提高检索速度,每次检索都需要用多列同时进行时,就可以把这多列设为联合索......
  • 数据库备份与恢复
    在任何数据库环境中,总会有不确定的意外情况发生,比如例外的停电、计算机系统中的各种软硬件故障、人为破坏、管理员误操作等是不可避免的,这些情况可能会导致数据的丢失、服务器瘫痪等严重的后果。存在多个服务器时,会出现主从服务器之间的数据同步问题。为了有效防止数据丢失,并......
  • 倍增基础练习题
    syoj806.序列翻转P6148[USACO20FEB]SwapitySwapitySwapS\(n\)个进行\(m\)次操作,每次操作将所给的\(l\)到\(r\)区间进行翻转。一共会重复\(k\)次上述操作。\(k<=1e9\)。倍增\(k\),设\(f[i][j]\)表示总操作重复\(2^i\)次后的序列。预处理时,转移方程为\(f[......
  • 达梦数据库V8 命令行静默安装
    unzipdm8_20230420_x86_kylin10_64.zipmount-oloop-tiso9660dm8_20230420_x86_kylin10_64.iso/mnt/ulimit-HSn65535groupadddinstalluseradd-gdinstall-m-d/home/dmdba-s/bin/bashdmdbapasswddmdbamkdir/data/dm8chown-Rdmdba:dinstall/......
  • 数据库软硬件选型的思考
    数据库软硬件选型的思考背景最近有多个项目出现过数据库的问题这里想总结语一下遇到的问题.以及可能的软硬件优化方案与思路.暂时还没有进行过系统的测试验证,所以仅是一个思考,后续会慢慢完善.硬件选型截止现在2024年元旦之前.Oracle数据库我认为还是选择Inte......
  • duplicate克隆数据库脚本例子
      建议目的端执行(源端也可以执行)rmantargetsys/oracle@tnsora11g_sourceauxiliarysys/oracle@tnsora11g_target  run{allocatechannelprmy1typedisk;allocatechannelprmy2typedisk;allocatechannelprmy3typedisk;allocateauxiliarychannels......
  • Cpolar内网穿透本地MariaDB数据库
    Cpolar内网穿透本地MariaDB数据库cpolar内网穿透本地MariaDB数据库,实现外公网环境下使用navicat图形化工具远程连接本地内网的MariaDB数据库配置MariaDB数据库安装MariaDB数据库进入MariaDB数据库官网https://mariadb.com/downloads/community/,然后下载相应的windows版本下载好后......
  • Redis数据库 | 发布订阅、主从复制、哨兵模式、缓存雪崩
    ......
  • 硕迪填报如何自动生成UUID并存入数据库
    硕迪填报如何自动生成UUID并存入数据库需求:1、在不修改jsp页面的情况下,如何生成一个UUID并存入数据库?2、修改数据时,根据UUID去更新数据。现在我总结一个更简洁的方法,具体操作步骤如下:1、填报表界面2、数据来源界面可以通过“使用向导生成脚本”直接生成如下查询:>ss=A1.query("SELEC......