存储过程和函数
而存储过程可以返回多个。存储过程是为了尽量发挥一个数据库软件的性能而设计的。定义存储过程的语法如下
create proc usp_StudentByGenderAge
@gender nvarchar(10) [='男'],
@age int [=30]
as
select * from MyStudent where FGender=@gender and FAge=@age
显然,颇为类似定义了一个函数。有两个输入参量。还制定了默认值。[]表示可有可无的东西。调用的语法也比较简单
exec usp_StudentByGenderAge ‘女’,50
在mysql中创建存储过程是create procedure
mysql> DELIMITER //
mysql> CREATE PROCEDURE proc1(OUT s int)
-> BEGIN
-> SELECT COUNT(*) INTO s FROM user;
-> END
-> //
mysql> DELIMITER ;
调用的办法是
mysql > SET @p_in=1;
mysql > CALL demo_in_parameter(@p_in);
而数据库中的常用函数有
合计函数:count,sum,avg,min,max
日期与实践函数 day month year weekday date today current等等。
数据库中的游标
游标是一种临时的数据库对象。可以用来存放数据库表中的数据行副本。所以,常见的的用出就是用来保存查询结果。如果一个结果集需要重复使用若干次,显然重复查询若干次不是什么好办法。
在mysql中,定义游标的语句是
DECLARE cursor_name CURSOR FOR select_statement
打开游标的语句是
OPEN cursor_name
使用游标的语句是
FETCH cursor_name INTO var_name [, var_name] …
关闭游标的语句是
CLOSE cursor_name
MYSQL中使用游标的一个存储过程如下:
BEGIN
DECLARE no_more_record INT DEFAULT 0;
DECLARE pID BIGINT(20);
DECLARE pValue DECIMAL(15,5);
DECLARE cur_record CURSOR FOR SELECT colA, colB from tableABC; /*首先这里对游标进行定义*/
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_record = 1; /*这个是个条件处理,针对NOT FOUND的条件,当没有记录时赋值为1*/
OPEN cur_record; /*接着使用OPEN打开游标*/
FETCH cur_record INTO pID, pValue; /*把第一行数据写入变量中,游标也随之指向了记录的第一行*/
WHILE no_more_record != 1 DO
INSERT INTO testTable(ID, Value)
VALUES (pID, pValue);
FETCH cur_record INTO pID, pValue;
END WHILE;
CLOSE cur_record; /*用完后记得用CLOSE把资源释放掉*/
END
触发器
触发器是一种特殊类型的存储过程。触发器主要是通过事件(增,删,改)而进行触发而自动调用执行的。
分为事前触发器,时候触发器,行级触发器,语句级触发器
mysql中定义触发器的语句如下
create trigger triggerName
after/before insert/update/delete on 表名
for each row #这句话在mysql是固定的
begin
sql语句;
end;
一个例子为
需要先执行该语句:delimiter $(意思是告诉mysql语句的结尾换成以$结束)
create trigger tg1
after insert on o
for each row
begin
update g set num=num-3 where id=1;
end$
这时候我们只要执行:
insert into o(gid,much) values(1,3)$
就会发现触发器被自动工作了
聚集索引和非聚集索引
聚集索引一个表只能有一个。一般如果你不特意指定,数据库会将你的主键指定为聚集索引。当主键没有业务价值的时候(比如一个单纯的UUID),你也可以选择其他列作为聚集索引。对于innodb,如果你连主键都没有选,mysql会为你创建一个并加上聚集索引(内部生成的rowid)。
聚集索引表示数据按照索引的顺序进行存储。显然,这样的检索效率高。但是如果插入和删除数据则会出发很大问题。
非聚集索引是索引存储在一个地方,索引带有的指针指向数据存储位置。索引中的项目按照索引的顺序存储,但是索引指向的数据没有规律。虽然检索效率低,但是,数据更新方便。
聚集索引适合在经常要搜索范围的值。这样知道第一个便可以依次遍历到最后一个。
事件调度器
就是一个定时任务