• 菜鸟的MySQL学习笔记(五)


    7、自定义函数
    用户自定义函数(user-defined function,UDF)是一种对MySQL扩展的途径,其用法与内置函数相同。包含了两个必要条件,参数与返回值。没有必然内在联系。
    函数可以返回任意类型的值,同样可以接收这些类型的参数;
    创建自定义函数:
    CREATE FUNCTION function_name             #函数名
    RETURNS
    {STRING | INTEGER | REAL | DECIMAL}        #返回值类型
    routine_body                                                 #函数体
    函数体可以包含合法的SQL语句;也可以是简单的SELECT或INSERT语句;
    函数体如果是复合结构则可以使用BEGIN  ... END 语句;
    复合结构可以包含声明,循环,控制结构。
    创建不带参数的函数
    #SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日   %H点:%i分:%s秒');  #将时间显示为年月日,时分秒, 函数要实现的功能
    #CREATE  FUNCTION  f1()  RETURNS  VARCHAR(30)
    RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日   %H点:%i分:%s秒'); #此时使用select f1() 即可获得上面的结果
    创建带参数的函数
    #CREATE FUNCTION f2(num1 SMALLINT UNSIGNED, num2 SMALLINT UNSIGNED)
    RETURNS FLOAT(10,2) UNSIGED
    RETURN (num1 + num2)/2;     #计算两个值的平均值
    创建带多个参数的函数
    CREATE FUNCTION adduser(username VARCHAR(20)) 
    RETURNS INT UNSIGNED
    BEGIN                                                        #由于使用了两个语句所以需要使用BEGIN 。。END语句
    INSERT test(username) VALUES(username);   #将username值插入
    RETURN  LAST_INSERT_ID();                         #返回插入的ID
    END
    //     #修改后的分隔符 如果不修改会报错,需要将默认分隔符分号修改为//或其他的符号,命令为DELIMITER //
    删除函数
    DROP FUNCTION [IF EXISTS] function_name;
    #DROP FUNCTION f2;
    8、存储过程
    MySQL的执行过程:
    存储过程是SQL语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理。
    优点:
    增强SQL语句的功能和灵活性
    实现了较快的执行速度
    减少了网络流量
    创建存储过程:
    CREATE
    [DEFINER = { user | CURRENT_USER } ]                 #指向创建者
    PROCEDURE sp_name ([proc_parameter [,...] ])    #带0个或多个参数
    [characteristic ...] routine_body                              #特性
     
    proc_parameter:     #参数的写法
    [IN | OUT | INOUT ] param_name type   #IN,表示该参数的值必须在调用存储过程时指定;OUT,表示该参数的值可以被存储过程改变,并且可以返回 ; INOUT,表示该参数的调用时指定,并且可以被改变和返回。
     
    特性:
    characteristic 'string'
    | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
    | SQL SECURITY { DEFINER | INVOKER }
    #COMMENT:               注释
    CONTAINS SQL :            包含SQL语句,但不包含读或写数据的语句
    NO SQL:                      不包含SQL语句
    READS SQL DATA :        包含读数据的语句
    MODIFIES SQL DATA :     包含写数据的语句
    SQL SECURITY { DEFINER | INVOKER }     指明谁有权限来执行
     
    过程体
    过程体由合法的SQL语句构成,可以是任意(对记录的增删改查,多表的链接操作)SQL语句;
    过程体如果为复合结构则使用BEGIN ... END语句;复合结构可包含声明,循环,控制结构;
     
    创建没有参数的过程:
    CREATE PROCEDURE sp1()  SELECT VERSION();
    调用存储过程
    CALL sp_name ([parameter [, ... ] ])
    CALL sp_name [ ( ) ]   #带参数 小括号不可以省略
     
    创建一个带有IN类型参数的过程:
    CREATE PROCEDURE removeUserById (IN p_id INT UNSIGNED )  #创建过程,为删除userID
    BEGIN
    DELETE FROM users WHERE id = p_id;  #第一个ID是数据表的字段,第二个为过程传递的参数
    END 
    //      #需要将该过程分隔符修改为//
    创建过程需要将字段和参数的名称分别开来,不然会认为两个均为字段,将过程传参修改为p_id
     
    创建一个带有OUT类型的过程
    CREATE PROCEDURE removeUserAndRetrunUserNums (IN p_id INT UNSIGNED , OUT userNums INT UNSIGNED)  #创建过程,删除user 返回userID
    BEGIN
    DELETE FROM users WHERE id = p_id;
    SELECT count(id) FROM users INTO userNums;
    END
    //
    调用该过程
    CALL removeUserAndRetrunUserNums (24,@Nums); # @Nums 为局部变量,只在BEGIN。。END之间声明
    SELECT @Nums ;
     
    创建一个带有INOUT类型的过程
    CREATE PROCEDURE removeUserByAgeAndRrturnInfos( IN p_age SMALLINT UNSIGNED ,OUT deleteUsers SMALLINT UNSIGNEND, OUT userCounts SMALLINT UNSIGNED)
    BEGIN
    DELETE FROM users WHERE age = p_age;
    SELECT ROW_COUNT( ) INTO deleteUsers; # ROW_COUNT( )用来统计最近受影响的行数,结果为数值 几行
    SELECT COUNT( id ) FROM users  INTO userCounts;  
    END
    //  #此处需要修改分隔符
    CALL  removeUserByAgeAndRrturnInfos(23,@a,@b); #此处@a,@b为局部变量
    存储过程与自定义函数的区别
    1、存储过程实现的功能要复杂一些;而函数的针对性更强
    2、存储过程可以返回多个值,函数只有一个返回值;
    3、存储过程一般独立的来执行,而函数可以作为其他SQL语句的组成部分来实现。
     
     
    9、存储引擎
    MyISAM     
    InnoDB
    Memory
    CSV
    Archive
    并发控制:当多个连接对记录进行修改时保证数据的一致性和完整性。
    共享锁(读锁):同一时间段内,多个用户可以读取同一个资源,读取过程中任何数据不会发生变化。
    排他锁(写锁):在任何时候只能有一个用户写入资源,当进行写锁时会阻塞其他的读锁或写锁操作。
    锁策略
    表锁,是一种开销最小的锁策略。锁表
    行锁,是一种开销最大的锁策略。锁行
    事物:用于保证数据库的完整性。
    外键:是保证数据一致性的策略。
    索引:是对数据表中的一列或者多列的值进行排序的一种结构。
    修改存储引擎的方法:
    1、通过修改MySQL的配置文件实现
    - default-storage-engine = engine
    2、通过创建数据表的命令实现
    -CREATE TABLE tbl_name( ...) ENGINE = engine  
     
    10、MySQL的管理工具
    PHPMyAdmin
    Navicat
    MySQL Workbench
  • 相关阅读:
    博弈论专题(持续更新)
    数论专题(持续更新)
    树的遍历专题(持续更新)
    直线折线分割平面问题
    字典树模板 HDU1251
    差分数组——面对大数据的处理
    最短路——dijkstra算法
    并查集与最小生成树
    KMP的初步认识及题目分析
    Codeforces Round#636(Div.3) D题 差分数组
  • 原文地址:https://www.cnblogs.com/wyf-349/p/5434470.html
Copyright © 2020-2023  润新知