基本开题的感觉是了-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
基本开题的感觉是了-MySQL继续继续(自定义函数&存储过程)的更多相关文章
- MySQL学习——操作自定义函数
MySQL学习——操作自定义函数 摘要:本文主要学习了使用DDL语句操作自定义函数的方法. 了解自定义函数 是什么 自定义函数是一种与存储过程十分相似的过程式数据库对象.它与存储过程一样,都是由SQL ...
- MySQL常用SQL语句/函数/存储过程
一句话总结 SELECT count(*) FROM user WHERE id>0 GROUP BY name HAVING count(*)>1 ORDER BY count(*)DE ...
- mysql视图 触发器 事物 函数 存储过程
一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...
- mysql 查询表,视图,触发器,函数,存储过程
1. mysql查询所有表: SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '数据库名' AND TAB ...
- MySQL巧用自定义函数进行查询优化
用户自定义变量是一个很容易被遗忘的MySQL特性,但是用的好,发挥其潜力,在很多场景都可以写出非常高效的查询语句. 一. 实现一个按照actorid排序的列 mysql; Query OK, rows ...
- mysql中的自定义函数
创建不带参数的自定义函数: 使用: 创建带参数的自定义函数: 使用: 创建具有复合结构的函数体的自定义函数:
- mysql 自定义函数
原文:http://www.cnblogs.com/zhangminghui/p/4113160.html 引言 MySQL本身提供了内置函数,这些函数的存在给我们日常的开发和数据操作带来了很大的便利 ...
- mySQL 教程 第7章 存储过程和函数
存储过程和存储函数 MySQL的存储过程(stored procedure)和函数(stored function)统称为stored routines. 1. MySQL存储过程和函数的区别 函数只 ...
- MySQL之自定义函数
引言 MySQL本身提供了内置函数,这些函数的存在给我们日常的开发和数据操作带来了很大的便利,比如我前面提到过的聚合函数SUM().AVG()以及日期时间函数等等,可是我们总会出现其他的需求:我们需要 ...
随机推荐
- 设置跨域的iframe的高度
原因 如下图,A域中有个B域的页面,但是B的页面的长度不确定,A无法去设置一个准确的高度. PS:iframe高度设置auto是无效的 解决办法 如上图, (1)在B页面中加一个A的代理页面的ifra ...
- Node.js的基础学习1
nodejs windows下的调用方法: C:\Users\owen>node helloworld.jsHello WorldHello: 25 C:\Users\owen>nod ...
- 微信 小程序 canvas
测试手机为IPHONE6,开发者工具版本0.10.102800.开发者工具0.11.112301版本也一样 微信小程序里的canvas 非 h5 canvas有很多不一样的地方,以下把微信小程序的ca ...
- Tomcat系统部署启动问题分析一例[sudo 启动]
今天的系统获取新的版本后部署时突然tomcat无法启动,而比较版本的变化内容,也就是几个jsp和js文件的变化,对于web.xml等都没有调整. 这个问题很是奇怪,下面把步骤总结一下,以避免类似的问题 ...
- SAML : A SAML stack
http://nzpcmad.blogspot.co.nz/2013/06/saml-saml-stack.html You have an application – .NET, JAVA what ...
- 2015年Java开发岗位面试题归类
一.Java基础 1. String类为什么是final的. 2. HashMap的源码,实现原理,底层结构. 3. 说说你知道的几个Java集合类:list.set.queue.map实现类咯... ...
- Facebook开源动画库 POP-POPBasicAnimation运用
动画在APP开发过程中还是经常出现,将花几天的时间对Facebook开源动画库 POP进行简单的学习:本文主要针对的是POPBasicAnimation运用:实例源代码已经上传至gitHub,地址:h ...
- 【工具相关】iOS-Reveal的使用
一,首先下载Reveal工具. Reveal的下载地址:http://revealapp.com/download. 下载界面如下图所示,选择Download Trail蓝色按钮可以进行下载: 二,新 ...
- 在FlashDevelop里使用1.8版本的的TortoiseSVN
前几天更新TortoiseSVN到1.8版本后发现FD(FlashDevelop)里不能使用svn了,在项目面板里的所有文件及文件夹都不能正确显示svn状态了,清一色都显示为未添加版本控制的状态图标, ...
- 0. CMMI快乐之旅——内容简介及目录
摘要: 这是我几年前发表于 www.cmmionline.net 网站(现在升级为www.umlonline.org 网站)数十篇文章,全方位分享了我对CMMI的理解,现我打算整理这些文章陆续在CSD ...