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> DELI