• 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 @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
     SET NAMES utf8mb4 ;
    /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
    /*!40103 SET TIME_ZONE='+00:00' */;
    /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
    /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
    /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
    /*!40111 SET @OLD_SQL_NOTES=@@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 TIME_ZONE=@OLD_TIME_ZONE */;
    
    /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
    /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
    /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
    /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
    
    -- Dump completed on 2019-06-13 21:58:08



  • 相关阅读:
    Linux curl命令详解
    php技能树---大神的进阶之路
    PHP Socket 编程之9个主要函数的使用之测试案例
    史上最全的PHP正则表达式
    php 简单使用redis 队列示例
    PHP中使用 Memcached 的测试案例
    机动车驾驶(1)--- 禁令标志汇总 by John
    闵可夫斯基和(Mincowsky sum)
    二维平面上判断点是否在三角形内
    计算任意多边形的面积
  • 原文地址:https://www.cnblogs.com/HiJackykun/p/11166969.html
Copyright © 2020-2023  润新知