基本开题的感觉是了-mysql继续继续(自定义函数&存储过程),开题-mysqlhi
感觉论文开题基本确定了,凯森
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
http://www.bkjia.com/phpjc/1070040.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/1070040.htmltecharticle基本开题的感觉是了-mysql继续继续(自定义函数存储过程),开题-mysql hi 感觉论文开题基本确定了,凯森 1、mysql -----自定义函数----- ----基...