刚刚结束了一个以sql脚本为核心的项目(算是个项目吧^-^),有几点想总结的,嗯。。。
首先,我一开始对这件事情的定位有问题,我认为这是一个纯粹的sql脚本问题,但现在看来,或许有更好的执行结果,因为简单的sql脚本解决这个问题会变得很棘手。于是乎,我放弃了简单的sql脚本,转而向更为复杂的脚本寻求帮助。在经过一番调研后,我决定采用mysql的存储过程这一高级特性,但是,使用存储过程的时候不可避免的踩到了一个又一个坑,我觉得这篇博客叫做mysql踩坑记录或许更好。好,接下来我就来回顾一下这半周以来踩得这些坑吧。
存储过程使用:
1.为了保证sql编译器能够按照我们的需要执行,我们在创建procedure之前使用delimiter声明遇到哪个符号时执行程序,如delimiter //就是告知编译器遇到下一个//时执行脚本;
2.创建procedure之前需要 drop procedure if exists 过程名;
3.//置于该过程的end后;
4.创建成功后,调用语句为call过程名(),并声明delimiter结束(delimiter;)。
游标使用:
1.游标声明语句应位于除DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;语句后的所有其他声明语句之后;
2.使用游标时一般需要通过FETCH cur INTO 变量名;来赋值后使用;
3.游标要配合循环使用。
其他小知识:
1.concat()函数拼接字符串;
2.动态sql的使用,如下:
set @sqlString = 'select * frrom stu where name=\'fish\'';
prepare s from @sqlString;
execute s;
3.ifnull()函数的使用;
4.sum()函数的使用(与count()函数的区别);
5.case when语句的使用,case后可以有变量,也可以没有;
6.''中若有引号该使用转义字符\。
行转列与嵌套查询:
下列语句可实现行转列
select id,
max( case when course='数学' THEN
score
else
0
END
) as 数学,
max( case when course='语文' THEN
score
else
0
END
) as 语文
group by id
from stu;
嵌套查询示例:
select * from (
select id,
max( case when course='数学' THEN
score
else
0
END
) as 数学,
max( case when course='语文' THEN
score
else
0
END
) as 语文
group by id
from stu;
) as t1 join stu_tech on stu.id=stu_tech.stuId;
好了,能想起来的就这些了,其他的在mysql系列后续博客中再讨论。