数据库题目整理及详解(四)


前言

有多少次挥汗如雨,伤痛曾添满记忆,只因为始终相信,去拼搏才能胜利。总在鼓舞自己,要成功就得努力。热血在赛场沸腾,巨人在赛场升起。

相信自己,你将赢得胜利,创造奇迹;相信自己,梦想在你手中,这是你的天地。当一切过去,你们将是第一。

相信自己,你们将超越极限,超越自己!

相信自己,加油吧,健儿们,相信你自己。

坐在中体对面, 听着这振奋激昂的加油欢呼声, 照样可以感受到校运会的气势磅礴, 虽然我还在敲代码……

来个这个吧, 特殊纪念, 沃夫慈悲:


说明

老生常谈! 接着之前的SQL语句继续整理, 内容参考了互联网上的很多内容, 结尾缀上出处, 感谢分享.

这一部分主要内容为:mysql数据库存储过程相关的SQL语句, 在书写上的格式、规范及环境配置等,详见:数据库题目整理及详解(一),说明部分 .


题目详情

设某学生信息系统数据库包含如下关系:

STUDENT(ID, NAME, CLASSNO, BIRTH)

请根据所学存储过程相关知识完成如下如下表示的功能:

(1) 创建数据库及 student 表,并至少插入 3 条数据;

(2) 创建并调用名为 sp 的存储过程,查询学生的所有信息;

(3)创建并调用名为 sp1 的存储过程,向表中插入一条学生信息;

(4) 创建并调用名为 sp2 的存储过程,查询学生表中的最大班级号;

(5)创建并调用名为 sp3 的存储过程,修改学生学号,如果学号为 1,修改为

10;否则,修改学号为 20,并查看信息表中的最大学号值;

(6) 创建并调用名为 sp4 的存储过程,使得学生的班级号既做输入参数又做输出参数;

(7) 创建并调用名为 sp5 的存储过程,根据输入的班级号,判断班级名称;

(8) 创建并调用名为 sp6的存储过程,根据输入的班级号,更新班级名称;


题目解答

(1) 创建数据库及 student 表, 并至少插入 3 条数据;

create database procedure_test;     ## 创建数据库
use procedure_test;     ## 切换至该数据库下

drop table if exists student;       ## 好习惯
create table student (      ## 建表
id int(11) primary key,
name char(10)
not null,
classno int(11),
birth datetime);

desc student;   ## 看一下表结构

## 插入数据
insert into student values(1, ‘xiaohua‘, 01, ‘1992-02-01 10:20:31‘);
insert into student values(2, ‘xiaohua1‘, 02, ‘1993-05-11 20:34:35‘);
insert into student values(3, ‘xiaohua2‘, 03, ‘1989-011-11 11:11:11‘);

## 查询一下啊
select * from student;



(2) 创建并调用名为 sp 的存储过程,查询学生的所有信息;

drop procedure if exists sp;    ## 好习惯
create procedure sp() select * from student;  ## 建立存储过程
call sp();      ## 调用一哈
show procedure status \G;       ## 参看一哈



(3)创建并调用名为 sp1 的存储过程,向表中插入一条学生信息;

delimiter //    ## 自制分隔符,防止“;”带来的意外

## 接下来就和上边一样一样啦, 就不写了啊
create procedure sp1(in id int, in name char(10), in
classno int(11), in birth datetime ) comment ‘insert into a value to student‘
begin
    set @id = id;
    set @name = name;
    set @classno = classno;set @birth = birth;
    insert into student values(id, name, classno, birth);
end//

call sp1(4, ‘xiaohua4‘, 4, ‘2010-10-05 13:14:27‘)//
select * from student//
show procedure status \G



(4) 创建并调用名为 sp2 的存储过程,查询学生表中的最大班级号;

create procedure sp2(out p int)
deterministic
begin
    select max(classno) into p from student;
end//

call sp2(@pv)//
select @pv//
show procedure status \G



(5) 创建并调用名为 sp3 的存储过程,修改学生学号,如果学号为 1,修改为

10;否则,修改学号为 20,并查看信息表中的最大学号值;

create procedure sp3(in p1 int, out p2 int)
begin
    if p1 = 1 then
        set @v = 10;
    else
        set @v = 20;
    end if;
    select max(id) into p2 from student;
end//

call sp3(1, @ret)//
select @ret;
show procedure status \G



(6) 创建并调用名为 sp4 的存储过程,使得学生的班级号既做输入参数又做输

出参数;

drop procedure if exists sp4//
create procedure sp4(inout p4 int)
begin
    if p4 = 3 then
        set @value = 13;
    else
        set @value = 14;
    end if;
    select @value;
end//

call sp4(@result)//
set @result = 4//
call sp4(@result)//



(7) 创建并调用名为 sp5 的存储过程,根据输入的班级号,判断班级名称;

drop procedure if exists sp5//

## 眼尖的童鞋可能会看到,这里加了一步操作, 为了弥补第一题所犯的错,表结构忘记建立该属性了
alter table student add classname char(11)//  

create procedure sp5(in classno int, out classname char(11))
begin
    if classno = 1 then
        set classname = ‘firstclass‘;
    end if;

    if classno = 2 then
        set classname = ‘secondclass‘;
    end if;

    if classno = 3 then
        set classname = ‘thirdclass‘;
    end if;

    if classno = 4 then
        set classname = ‘fourthclass‘;
    end if;

    select * from student;
end//

call sp5(2, @ret)//
select @ret;



(8) 创建并调用名为 sp5 的存储过程,根据输入的班级号,更新班级名称;

## 错误总是无独有偶, 显然!这步是弥补上步未完成的任务
create procedure sp6(in classno int)
begin
    if classno = 1 then
        update student set classname = ‘firstclass‘ where id=1;
    end if;

    if classno = 2 thenupdate student set classname =     ‘secondclass‘ where id=2;
    end if;

    if classno = 3 then
        update student set classname = ‘thirdclass‘ where id=3;
    end if;

    if classno = 4 then
        update student set classname = ‘fourthclass‘ where id=4;
    end if;

    select * from student;
end//

call sp6(1)//
call sp6(2)//
call sp6(3)//
call sp6(4)//


参考资料

[1]. http://www.cnblogs.com/zhuawang/p/4185302.html

[2]. http://blog.csdn.net/woshixuye/article/details/8348180

[3]. http://www.2cto.com/database/201408/327315.html

时间: 2024-08-08 09:40:17

数据库题目整理及详解(四)的相关文章

数据库题目整理及详解中文版(五)

前言 有雨的时候既没有太阳也没有月亮,人们却多不以为许. 有雨的夜晚则另有一番月夜所没有的韵味. 有时不由让人想起李商隐"何当共剪西窗烛,却话巴山夜雨时"的名句 雨中, 从对面天空中传来丝丝音符; 这里, 静谧而又舒畅. 说明 本文算作一篇译文吧, 题目来自于卡内基.梅隆大学的数据库技术课程的Homework, 在数据库postgresql中亲测通过; 各版本的SQL环境差别不大, 看看下文就知道, 在其他版本的数据库, 如mysql | sqlite等都能通过. 这部分主要是使用SQ

数据库题目整理及详解英文版(五)

Preface when there is rain neither sun nor moon, the people actually do not think so. Perhaps there are seasonal climate not to be cold rain, let the sun or the cool side. Has the rain the night is otherwise a moonlit night no flavor. Sometimes not r

[数据库事务与锁]详解四: 数据库的锁机制

注明: 本文转载自http://www.hollischuang.com/archives/898 数据库的读现象浅析中介绍过,在并发访问情况下,可能会出现脏读.不可重复读和幻读等读现象,为了应对这些问题,主流数据库都提供了锁机制,并引入了事务隔离级别的概念. 并发控制 在计算机科学,特别是程序设计.操作系统.多处理机和数据库等领域,并发控制(Concurrency control)是确保及时纠正由并发操作导致的错误的一种机制. 数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存

expdp impdp 数据库导入导出命令详解

一.创建逻辑目录,该命令不会在操作系统创建真正的目录,最好以system等管理员创建. create directory dpdata1 as 'd:\test\dump'; 二.查看管理理员目录(同时查看操作系统是否存在,因为Oracle并不关心该目录是否存在,如果不存在,则出错) select * from dba_directories; 三.给scott用户赋予在指定目录的操作权限,最好以system等管理员赋予. grant read,write on directory dpdata

Android基础入门教程——8.3.7 Paint API之—— Xfermode与PorterDuff详解(四)

Android基础入门教程--8.3.7 Paint API之-- Xfermode与PorterDuff详解(四) 标签(空格分隔): Android基础入门教程 本节引言: 上节我们写了关于Xfermode与PorterDuff使用的第一个例子:圆角&圆形图片ImageView的实现, 我们体会到了PorterDuff.Mode.DST_IN给我们带来的好处,本节我们继续来写例子练练手, 还记得Android基础入门教程--8.3.2 绘图类实战示例给大家带来的拔掉美女衣服的实现吗? 当时我

SQL Server数据库ROW_NUMBER()函数使用详解

SQL Server数据库ROW_NUMBER()函数使用详解 摘自:http://database.51cto.com/art/201108/283399.htm SQL Server数据库ROW_NUMBER()函数的使用是本文我们要介绍的内容,接下来我们就通过几个实例来一一介绍ROW_NUMBER()函数的使用. 实例如下: 1.使用row_number()函数进行编号,如 select email,customerID, ROW_NUMBER() over(order by psd) a

C# Oracle数据库操作类实例详解

本文所述为C#实现的Oracle数据库操作类,可执行超多常用的Oracle数据库操作,包含了基础数据库连接.关闭连接.输出记录集.执行Sql语句,返回带分页功能的dataset .取表里字段的类型和长度等,同时还有哈稀表自动插入数据库等高级任务.需要特别指出的是:在执行SQL语句,返回 DataReader之前一定要先用.read()打开,然后才能读到数据,再用hashTable对数据库进行insert,update,del操作,注意此时只能用默认的数据库连接"connstr". 本文

数据库三个范式详解

数据库三个范式详解 数据库范式的提出是为了对关系数据库中的数据进行规范而提出的一个概念,第一范式,第二范式,第三范式这三个范式逐渐对数据进行细分,意思就是指属于这三种范式之一的关系数据库的数据相互之间的依赖关系越来越清晰明了.下面对三种范式进行详细的讲解. 第一范式(1NF):属于第一范式的数据库的表的列(属性)是不能再进一步拆分的.如 学号 课程 2014212797 软件技术基础   高数 很显然,这个表格的第二列是可以在细分的,所以不属于第一范式.第一范式是数据库数据的最低要求,不满足第一

LinearLayout详解四:彻底解决软键盘遮挡输入框的问题

之前把预备知识都介绍完了,话说学以致用,接下来我们要通过重载LinearLayout类来解决软键盘覆盖的问题. 首先阐述一下这个问题,如下图所示: 然后看挡住输入框的情况 然后我们给出xml的源代码: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:lay