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
- 菜鸟的MySQL学习笔记(一)
本学习笔记是照搬慕课网<与MySQL的零距离接触>内容,特此感谢! 1-1 mysql的安装与配置 Windows环境下的MSI安装: 1.安装: 双击MSI文件->用户协议-> ...
- mysql学习笔记五 —— MHA
MySQL_MHA ABB(主从复制)-->MHA(实现mysql高可用.读写分离.脚本控制vip飘逸)-->haproxy(对slave集群实现分发,负载均衡)-->keepali ...
- MySQL学习笔记五:数据类型
MySQL支持多种数据类型,大致可以分为数值,日期/时间和字符类型. 数值类型 MySQL支持所有标准SQL数值数据类型,包括严格数值数据类型(INTEGER.SMALLINT.DECIMAL和NUM ...
- 菜鸟的MySQL学习笔记(四)
MySQL中的运算符和函数: 1.字符函数: 2.数值运算符与函数: 3.比较运算符与函数: 4.日期时间函数: 5.信息函数: 6.聚合函数: 7.加密函数等: 6-1.字符函数: CONCAT ...
- 菜鸟的MySQL学习笔记(三)
4-1插入记录INSERT INSERT [INTO] tbl_name [(col_name)] {VALUES|VALUE} ({expr|DEFAULT},...), (...), ... ...
- 菜鸟的MySQL学习笔记(二)
3-1约束: 1.约束保证数据的完整性和一致性: 2.约束分表级约束(两个或两个个以上字段的约束)和列级约束(一个字段约束): 3.NOT NULL 非空: PRIMARY KEY ...
- MySql学习笔记(五) —— 存储过程
存储过程是MySql 5支持的特性,它是一组为了完成特定功能的SQL语句集,经过编译之后存储在数据库中,当需要使用该组SQL语句时用户只需要通过指定储存过程的名字并给定参数就可以调用执行它了,简而言之 ...
- MySQL学习笔记(五):MySQL表级锁和行级锁
一:概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...
- Mysql学习笔记(三)对表数据的增删改查。
正文内容. 这一部分是最简单的,也是最麻烦的.简单是因为其实只包括增删该插四个部分.大体上看,增加数据.删除数据.修改数据.查询数据都不麻烦啊,我们日常都是常用的.这个谁不会呢?以前在培训机构学mys ...
随机推荐
- [一]初识Ajax
是什么? 一种网页交换数据的技术 作用: 使页面局部刷新,获取后台数据 怎么做? 调用浏览器内置对象发送异步请求
- Java时间转换类实现
Java时间类型非常的差,首先版本问题,本人使用java在Android平台开发.很多Data类的方法已经不提倡使用,一个时间,居然要使用Calendar.DateFormat等类共同编码,非常麻烦. ...
- 如何减少不能重现的Bug
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:如何减少不能重现的Bug.
- 收集内存信息(总量、可用、已用、百分比)导出到csv
#############################脚本功能及说明##################################################该脚本用来在各台ERP服务器 ...
- Android架构分析之Android消息处理机制(二)
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android版本号:4.4.2 在上一篇文章中我们看了一个使用Handler处理Message消息的样例,本文我们 ...
- android101 获取、备份、插入短信
package com.itheima.getsms; import java.io.File; import java.io.FileNotFoundException; import java.i ...
- Struts---- <s:bean>标签
近几天学习的都是跟struts有关的.详细写<s:bean>标签 具体内容为: 一.准备工作 1.新建Web工程 2.添加struts:右键点击工程名选择My Eclipse-->点 ...
- html-01
1.HTML:超文本标记语言,由浏览器解析成页面.html文件是以.html或者 .htm 2.HTML的作用 |- 控制页面的外观. |- 发布帮助文档 3.常见的浏览器 |-IE:微 ...
- Android no such table (找不到表)
今天在学习项目时,一直报错no such table Users.说找不到Users表.我就纳闷了,数据库是复制过去的,检查表名也没有写错.这是怎么回事呢?检查了半天才发现原来是数据库的路径错了. 我 ...
- Linux中tshark(wireshark)抓包工具使用方法详解
在Linux下,当我们需要抓取网络数据包分析时,通常是使用tcpdump抓取网络raw数据包存到一个文件,然后下载到本地使用wireshark界面网络分析工具进行网络包分析.最近才发现,原来wires ...