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 ...
随机推荐
- linux定时器HZ和Jiffies
1.linux HZ Linux核心几个重要跟时间有关的名词或变数,以下将介绍HZ.tick与jiffies. HZ Linux核心每隔固定周期会发出timer interrupt (IRQ 0),H ...
- POSIX-Centos查看rpm包安装位置及相关信息
rpm -qifl `which svnserve`; http://www.ctohome.com/FuWuQi/56/122.html [国外服务器及ip租用价格] Centos6 kvm网桥配置 ...
- java dubug调试
摘要:调试不仅可以查找到应用程序缺陷所在,还可以解决缺陷.对于Java程序员来说,他们不仅要学会如何在Eclipse里面开发像样的程序,更需要学会如何调试程序.本文介绍了Java程序员必知的10个调试 ...
- Linux内存寻址之分页机制
在上一篇文章Linux内存寻址之分段机制中,我们了解逻辑地址通过分段机制转换为线性地址的过程.下面,我们就来看看更加重要和复杂的分页机制. 分页机制在段机制之后进行,以完成线性—物理地址的转换过程.段 ...
- hdoj 2802 F(N)【递推 规律】
F(N) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- C++:private继承与public继承
1 private, public, protected 访问标号的访问范围 private:只能由1.该类中的函数.2.其友元函数访问. 不能被任何其他访问,该类的对象也不能访问. protecte ...
- 新发现:原来java正则表达式不写^和$也可以运行
最近用了好多正则表达式,都是循规蹈矩的在前面加上^在后面加上$ 像这个样子"^[.]\\S+$",但实际上我在eclipse和editplus下都试了一下,不加前缀和后缀也是可以的 ...
- 判断数组中有没有某个键 isset 和 array_key_exists 的效率比较
判断数组中有没有某个键 isset 和 array_key_exists 谁的效率高呢? 使用 array_key_exists 代码如下 结果如下 如果使用 isset 代码如下 结果如下: 很明显 ...
- CopyU!SW新版发布!
CopyU!SW新版发布,版本号为:2.1.412.213 主要更新内容如下: 此版本(2.1.412.213)主要作了如下更新: 1.修复了CopyU!SW版本中的运行模式规则的设定错 ...
- Xcode6为什么干掉pch(Precompile Prefix Header)&如何添加pch文件
转载: http://blog.csdn.net/iosdevtip/article/details/40918353 一直在用xcode6开发,但项目都是在xcode5上创建的,所以一直没注意到, ...