69期-Java SE-035_MySQL-6 存储过程SQL练习 -doing

Posted hijackykun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了69期-Java SE-035_MySQL-6 存储过程SQL练习 -doing相关的知识,希望对你有一定的参考价值。

 

### 存储过程

存储过程是一组为了完成特定功能的 SQL 语句集合,经过编译后存储在数据库中,用户通过指定存储过程的名称以及参数来执行相应的存储过程。

一次编写,多次调用,避免开发人员重复编写相同的 SQL 语句,存储过程是在数据库中存储和执行的,可以减少客户端和服务端之间的数据传输,从而提高效率。

### 优点

- 模块化的程序设计,只需要创建一次存储过程,以后就可以在程序中调用该存储过程任意次。
- 执行速度更快,如果某个操作需要执行大量的 SQL 语句或者需要重复执行 SQL 语句,存储过程比 SQL 语句执行的更快。
- 更好的安全机制,对于没有权限执行存储过程的用户,也可以授权他们执行存储过程。

### 具体使用

```sql
create procedure 存储过程名称 (参数列表) routine_body
```

参数列表由 3 部分组成:输入输出类型,参数名称,参数数据类型。

in 表示入参,从外部调用方传给存储过程内部,相当于 Java 方法中的参数。

out 表示出参,存储过程内部返回给外部调用者的值,相当于 Java 方法中的返回值。

routine_body SQL 代码的内容,begin/end 来标识代码的开始和结束。

创建存储过程

```sql
create procedure add_name(in target int)
begin
  declare name varchar(20);
  if target = 1 then
  set name = "mysql";
  else
  set name = "Java";
  end if;
  insert into test.student(name) values(name);
end;
```

使用存储过程:call 存储过程名称(参数列表)

```sql
call add_name(2);
```

删除存储过程:drop procedure 存储过程名称

```sql
drop procedure add_name;
```



### 出参存储过程

创建存储过程

```sql
create procedure count_of_student(out count_num int)
begin
  select count(*) into count_num from test.student;
end;
```

使用存储过程

```sql
call count_of_student(@count_num);
select @count_num;
```



### 流程控制语句:

- if

```sql
create procedure example_if(in x int)
begin
  if x = 1 then
    select id from student;
    elseif x = 2 then
    select name from student;
  end if;
end;
```

- case

```sql
create procedure example_case(in x int)
begin
  case x
    when 1 then select id from student;
    when 2 then select name from student;
    when 3 then select score from student;
    end case;
end;
```

- while

```sql
create procedure example_while(out sum int)
begin
  declare i int default 1;
  declare s int default 0;
  while i<=100 do
    set s = s+i;
    set i = i+1;
  end while;
  set sum = s;
end;
```
技术图片
第一道:
  现有图书管理数据库的三个关系模式,他们的字段分别如下:
  图书表:总编号, 分类号, 书名, 作者, 出版单位, 单价
  读者表:借书证号, 单位, 姓名, 性别, 职称, 地址
  借阅表:借书证号, 总编号, 借书日期
  以上表对应的字段明细如下:
   book :
     b_no ,b_type ,b_name , b_author ,b_publish ,b_price
   reader :
     r_no ,  r_unit  , r_name  ,r_sex  ,r_pro  ,r_address
   borrow :
     r_no  , b_no  ,b_time
1、查找出价格位于10元和20元之间的图书种类,结果按
单价升序排序

2、找出藏书中各个出版社的册数、价值总额

3、求出各个出版社图书的最高价格、最低价格和册数


4、查找所有借了书的读者的姓名以及所在单位

5、找出李某所借所有图书的书名及借书日期

6、查询1997年10月以后借书的读者借书证号、姓名和单位


7、找出借阅了FoxPro大全一书的借书证号以及作者

8、分别找出借书人次超过1人次的单位及人次数

9、找出与赵正义在同一天借书的读者姓名、所在单位以及借书
   日期

10、求信息系当前借阅图书的读者人次数

11、找出当前至少借阅了2本书的读者姓名及所在单位

12、找出姓李的读者姓名和所在单位

13、求科学出版社图书的最高单价、最低单价和平均单价



14、查找出高等教育出版社的所有图书及单价,结果按单价降序
   排列

15、列出图书库中所有藏书的书名以及出版单位

第二道:
本题用到下面三个关系表:
借书卡表:卡号 、姓名 、班级 
图书表:书号、书名、作者、单价、库存册数 
借书记录表: 借书卡号、 书号、 还书日期
以上表对应的字段明细如下:
card  (  CNO  , NAME , CLASS  )
books ( BNO ,BNAME ,  AUTHOR ,PRICE ,QUANTITY  )
borrows  ( CNO ,BNO ,RDATE )
备注:限定每人每种书只能借一本;库存册数随借书、还书而改变。

1.找出借书超过5本的读者,输出借书卡号及所借图书册数。

2.查询借阅了"水浒"一书的读者,输出姓名及班级。


3.查询过期未还图书,输出借阅者(卡号)、书号及还书日期。

4.查询书名包括"网络"关键词的图书,输出书号、书名、作者。

5.查询现有图书中价格最高的图书,输出书名及作者。

7. 查询当前借了"计算方法"但没有借"计算方法习题集"的读者, 
输出其借书卡号,并按卡号降序排序输出。

8.将"C01"班同学所借图书的还期都延长一周。

9.从BOOKS表中删除当前无人借阅的图书记录。

10.查询当前同时借有"计算方法"和"组合数学"两本书的读者,
   输出其借书卡号,并按卡号升序排序输出。

技术图片

 

 

 

dump.sql

-- MySQL dump 10.13  Distrib 8.0.11, for macos10.13 (x86_64)
--
-- Host: 127.0.0.1    Database: mysql_exam
-- ------------------------------------------------------
-- Server version    8.0.11

/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */;
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */;
/*!40101 SET @[email protected]@COLLATION_CONNECTION */;
 SET NAMES utf8mb4 ;
/*!40103 SET @[email protected]@TIME_ZONE */;
/*!40103 SET TIME_ZONE=‘+00:00‘ */;
/*!40014 SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @[email protected]@SQL_MODE, SQL_MODE=‘NO_AUTO_VALUE_ON_ZERO‘ */;
/*!40111 SET @[email protected]@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `book`
--

DROP TABLE IF EXISTS `book`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
 SET character_set_client = utf8mb4 ;
CREATE TABLE `book` (
  `b_no` int(11) NOT NULL,
  `b_type` varchar(11) DEFAULT NULL,
  `b_name` varchar(10) DEFAULT NULL,
  `b_author` varchar(10) DEFAULT NULL,
  `b_publish` varchar(10) DEFAULT NULL,
  `b_price` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `book`
--

LOCK TABLES `book` WRITE;
/*!40000 ALTER TABLE `book` DISABLE KEYS */;
INSERT INTO `book` VALUES (112266,TP3/12,FoxBASE,张三,电子工业出版社,23.60),(113388,TR7/90,大学英语,胡玲,清华大学出版社,12.50),(114455,TR9/12,线性代数,孙业,北京大学出版社,20.80),(118801,TP4/15,计算机网络,黄力钧,高等教育出版社,21.80),(118802,TP4/15,计算机网络,黄力钧,高等教育出版社,21.80),(332211,TP5/10,计算机基础,李伟,高等教育出版社,18.00),(445501,TP3/12,数据库导论,王强,科学出版社,17.90),(445502,TP3/12,数据库导论,王强,科学出版社,17.90),(445503,TP3/12,数据库导论,王强,科学出版社,17.90),(446601,TP4/13,数据库基础,马凌云,人民邮电出版社,22.50),(446602,TP4/13,数据库基础,马凌云,人民邮电出版社,22.50),(446603,TP4/13,数据库基础,马凌云,人民邮电出版社,22.50),(449901,TP4/14,FoxPro大全,周虹,科学出版社,32.70),(449902,TP4/14,FoxPro大全,周虹,科学出版社,32.70),(665544,TS7/21,高等数学,刘明,高等教育出版社,20.00);
/*!40000 ALTER TABLE `book` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `borrow`
--

DROP TABLE IF EXISTS `borrow`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
 SET character_set_client = utf8mb4 ;
CREATE TABLE `borrow` (
  `r_no` int(11) DEFAULT NULL,
  `b_no` int(11) DEFAULT NULL,
  `b_time` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `borrow`
--

LOCK TABLES `borrow` WRITE;
/*!40000 ALTER TABLE `borrow` DISABLE KEYS */;
INSERT INTO `borrow` VALUES (112,445501,1997-03-19),(125,332211,1997-02-12),(111,445503,1997-08-21),(112,112266,1997-03-14),(114,665544,1997-10-21),(120,114455,1997-11-02),(120,118801,1997-10-18),(119,446603,1997-12-12),(112,449901,1997-10-23),(115,449902,1997-08-21),(118,118801,1997-09-10);
/*!40000 ALTER TABLE `borrow` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `reader`
--

DROP TABLE IF EXISTS `reader`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
 SET character_set_client = utf8mb4 ;
CREATE TABLE `reader` (
  `r_no` int(11) DEFAULT NULL,
  `r_unit` varchar(11) DEFAULT NULL,
  `r_name` varchar(10) DEFAULT NULL,
  `r_sex` varchar(10) DEFAULT NULL,
  `r_pro` varchar(10) DEFAULT NULL,
  `r_address` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `reader`
--

LOCK TABLES `reader` WRITE;
/*!40000 ALTER TABLE `reader` DISABLE KEYS */;
INSERT INTO `reader` VALUES (111,信息系,王维利,,教授,1号楼),(112,财会系,李立,,副教授,2号楼),(113,经济系,张大三,,讲师,3号楼),(114,信息系,周华发,,讲师,1号楼),(115,信息系,赵正义,,工程师,1号楼),(116,信息系,李明大,,副教授,1号楼),(117,计算机系,李小峰,,助教,1号楼),(118,计算机系,许鹏飞,,教授,1号楼),(119,计算机系,刘大李龙,,副教授,4号楼),(120,国际贸易,李雪,,副教授,4号楼),(121,国际贸易,李爽,,讲师,4号楼),(122,国际贸易,王纯,,讲师,4号楼),(123,财会系,沈小霞,,助教,2号楼),(124,财会系,朱海,,讲师,2号楼),(125,财会系,马英明李,,副教授,2号楼);
/*!40000 ALTER TABLE `reader` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET [email protected]_TIME_ZONE */;

/*!40101 SET [email protected]_SQL_MODE */;
/*!40014 SET [email protected]_FOREIGN_KEY_CHECKS */;
/*!40014 SET [email protected]_UNIQUE_CHECKS */;
/*!40101 SET [email protected]_CHARACTER_SET_CLIENT */;
/*!40101 SET [email protected]_CHARACTER_SET_RESULTS */;
/*!40101 SET [email protected]_COLLATION_CONNECTION */;
/*!40111 SET [email protected]_SQL_NOTES */;

-- Dump completed on 2019-06-13 21:58:08

 

 

 

 

 

 

 

 




 

以上是关于69期-Java SE-035_MySQL-6 存储过程SQL练习 -doing的主要内容,如果未能解决你的问题,请参考以下文章

69期-Java SE-045_JSP-2

69期-Java SE-008_面向对象-2-001-002

69期-Java SE-007_面向对象-1-001-002

69期-Java SE-015_集合-1-001-002

69期-Java SE-044_JSP-1

69期-Java SE-040_JDBC-4