• 基本开题的感觉是了-MySQL继续继续(自定义函数&存储过程)


      hi

    感觉论文开题基本确定了,凯森

    1、MySQL

    -----自定义函数-----

    ----基本

    两个必要条件:参数和返回值(两者没有必然联系,参数不一定有,返回一定有)

    函数体:合法的SQL语句;以及简单的SELECT或INSERT语句;如果为复合结构则使用BEGIN...END语句

    ----不带参数的自定义函数

    把当前时刻转换为中文显示,效果如下

    mysql> SET NAMES gbk;
    Query OK, 0 rows affected (0.05 sec)

    mysql> SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日 %h点:%I分:%s秒');
    +--------------------------------------------------+
    | DATE_FORMAT(NOW(),'%Y年%m月%d日 %h点:%I分:%s秒') |
    +--------------------------------------------------+
    | 2015年11月11日 07点:07分:39秒 |
    +--------------------------------------------------+
    1 row in set (0.00 sec)

    把这个功能写成函数f1()

    mysql> CREATE FUNCTION f1() RETURNS VARCHAR(30)
    -> RETURN DATE_FORMAT(NOW(),'%y年%m月%d日 %h点:%I分:%s秒');
    Query OK, 0 rows affected (0.05 sec)

    调用

    mysql> SELECT f1();

    ----带有参数的函数

    mysql> CREATE FUNCTION f2(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED)
    -> RETURNS FLOAT(10,2) UNSIGNED
    -> RETURN (num1+num2);
    Query OK, 0 rows affected (0.00 sec)

    mysql> SELECT f2(32,33);
    +-----------+
    | f2(32,33) |
    +-----------+
    | 65.00 |
    +-----------+
    1 row in set (0.03 sec)

    我就不解释了,都看的懂

    ----具有复合结构体的函数

    复合结构的函数往往意味着有多条语句要实现。比如往以下数据库中,创建函数实现插入参数作为新的username,返回最后插入字段的id

    mysql> DESC test;
    +----------+---------------------+------+-----+---------+----------------+
    | Field | Type | Null | Key | Default | Extra |
    +----------+---------------------+------+-----+---------+----------------+
    | id | tinyint(3) unsigned | NO | PRI | NULL | auto_increment |
    | username | varchar(20) | YES | | NULL | |
    +----------+---------------------+------+-----+---------+----------------+

    mysql> SELECT * FROM test;
    +----+----------+
    | id | username |
    +----+----------+
    | 1 | 111 |
    | 2 | JOHN |
    +----+----------+

    实现的时候会发现,如果直接写,会有两句话是要打分号的,不合适,改!

    mysql> DELIMITER //

    把结束符号改为//

    实际函数就是

    mysql> CREATE FUNCTION adduser(username VARCHAR(20))
    -> RETURNS INT UNSIGNED
    -> BEGIN
    -> INSERT test(username) VALUES(username);
    -> RETURN LAST_INSERT_ID();
    -> END
    -> //

    调用检查

    mysql> SELECT adduser('Rose')//
    +-----------------+
    | adduser('Rose') |
    +-----------------+
    | 3 |
    +-----------------+

    当然这时候可以改回来定界符

    mysql> DELIMITER ;
    mysql> SELECT adduser('Rose2');
    +------------------+
    | adduser('Rose2') |
    +------------------+
    | 4 |
    +------------------+

    ----最后一点说明

    一般不会用到自定义函数,很少用,用好自带函数就好

    -----MySQL存储过程-----

     ----简介

    一般的目的是提高MySQL的效率,去掉或者缩减其自身的存储过程

    存储过程的定义是:它是SQL语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理(实际理解就是说把一系列,当然也可以是某一个,操作合并/封装为一个操作;又由于这是在MySQL中的,数据库一般的操作成为存储,所以称为存储过程)

    采用存储过程后,只有在第一次进行语法检查和编译,以后用户再调用就省去这两步,效率提高

    ---

    优点:增强SQL语句的功能和灵活性;较快的执行速度(如上);减少网络流量(即缩减命令的长度);

    ----结构解析/创建

    类似创建自定义函数,参数处不太一样

    ---参数

    给参数可以赋值类型IN OUT INOUT

    IN表示该参数的值必须在调用存储过程时指定,且不能返回

    OUT表示~~~可以被存储过程改变,且可以返回

    INOUT表示~~~在调用时指定,且可以被改变和返回

    ---结构体

    类似函数体

    可以是任意的SQL语句构成

    复合结构也得用BEGIN...END

    可以声明,循环等

    ----不带参数的存储过程

    mysql> CREATE PROCEDURE sp1() SELECT VERSION();
    Query OK, 0 rows affected (0.00 sec)

    mysql> SELECT sp1();
    ERROR 1305 (42000): FUNCTION test.sp1 does not exist
    mysql> CALL sp1();
    +-----------+
    | VERSION() |
    +-----------+
    | 5.6.17 |
    +-----------+

    存储过程的调用时CALL,且有两种调用方法-带或者不带括号

    ----带有IN类型参数的存储过程

    删除记录的存储过程,通过id来删除

    mysql> DELIMITER //
    mysql> CREATE PROCEDURE removeUserById(IN id INT UNSIGNED)
    -> BEGIN
    -> DELETE FROM test WHERE id=id;
    -> END
    -> //
    Query OK, 0 rows affected (0.04 sec)

    mysql> DELIMITER ;

    注意这里的id=id,前者是表中的id,后者是传递的参数,是可以这么写的(?)

    还有要注意这里的习惯,DELIMITER开头结尾+BEGIN...END语句的写法

    调用

    mysql> CALL removeUserById(3);

    Query OK, 4 rows affected (0.05 sec)

    注意,有参数的过程,不能省略小括号

    这里,数据中所有记录都被删除。所以一般过程的参数不要和数据表中字段名相同!

    这里的修改只能是删除过程再重建个正确的。DROP PROCEDURE REMOVEUSERBYID;

    ----带有IN和OUT参数

    过程定义为:删除某id的记录,返回剩余记录数量

    和写正则表达式等的流程差不多,先考虑需求:两个操作,返回一个值,传递进一个值,所以两个参数,一个IN,一个OUT

    mysql> DELIMITER //
    mysql> CREATE PROCEDURE REMOVEIDRETURNLENGTH(IN p_id INT UNSIGNED,OUT usernums INT UNSIGNED)
    -> BEGIN
    -> DELETE FROM test WHERE id=p_id;
    -> SELECT count(id) FROM test INTO usernums;
    -> END
    -> //
    Query OK, 0 rows affected (0.02 sec)

    mysql> DELIMITER ;

    调用

    mysql> CALL REMOVEIDRETURNLENGTH(3,@NUMS);
    Query OK, 1 row affected (0.03 sec)

    mysql> SELECT @NUMS;
    +-------+
    | @NUMS |
    +-------+
    | 4 |
    +-------+
    1 row in set (0.00 sec)

    这里的@nums是变量

    mysql> SET @QQ=2;
    Query OK, 0 rows affected (0.00 sec)

    这种变量称为用户变量,仅对当前用户有效,带有@符号

    ----带有多个OUT参数的过程

    比如一个拥有很多字段的数据表

    实现过程:删除某个id的字段,返回被删除的用户,以及返回剩余的用户

    DELIMITER //

    CREATE PROCEDURE removereturn2(IN p_age SMALLINT UNSIGNED,OUT remove_user SMALLINT UNSIGNED,OUT usercount SMALLINT UNSIGNED)

    BEGIN

    DELETE FROM test WHERE age=p_age;

    SELECT ROW_COUNT() INTO REMOVE_USER;

    SELECT COUNT(ID) FROM test INTO USERCOUNT;

    END

    //

    DELIMITER ;

    其中,ROW_COUNT是个自带函数

    CALL REMOVERETURN2(20,@A,@B);

    SELECT @A,@B;

    需要注意的是,由于过程的创建后不能修改,第一次创建尽量不要错,要不就不要怕麻烦

    ----存储过程和自定义函数的区别

    存储过程功能复杂一些,常用于对表的操作;函数一般不用做对表的操作

    ~~~~可以返回多个值;函数一般返回一个值

    ~~~~一般独立的来执行;函数可以作为其他SQL语句的组成部分来出现

    ~~~~常用,来封装复杂过程;函数很少用

    2、PHP与MySQL

    明天开始学习PHP中常用的MySQL函数(?)

    bye

  • 相关阅读:
    js事件入门(6)
    js事件入门(5)
    js事件入门(4)
    js事件入门(3)
    js事件入门(2)
    js事件入门(1)
    js语法基础入门(7)
    js语法基础入门(6)
    spark web ui
    命令行笔记(一)
  • 原文地址:https://www.cnblogs.com/andy1202go/p/4957241.html
Copyright © 2020-2023  润新知