学习内容:
存储程序与函数。。。这一章学的我是云里雾里的。。。

1.存储过程。。。

  Mysql存储过程是从mysql 5.0开始增加的一个新功能.存储过程的优点其实有很多,不过我觉得存储过程最重要的优点就是实现了SQL代码的封装,那么我们为什么需要封装SQL语句呢?原因就是当我们在面对一个庞大的数据库的时候,当我们使用外部程序去访问数据库的时候。。。我们总不能在外部程序中内嵌很多的SQL语句吧。。。那样执行的效率不高,并且也不容易维护...因此存储过程将我们的操作进行封装,当我们需要对其进行操作的时候,我们只需要调用存储过程就可以了...

create procedure cl_add
(
a int,
b int
)
begin //存储过程的执行过程需要定义在begin。。。。end语句中...
declare c int; //声明一个变量。。declare只能使用在存储过程或者函数里面,否则会出错..
if a is null then //if 语句 ,用来进行条件判断。。满足条件则执行满足条件的语句..这里的if和if()是不同的。。if()是控制流程函数。。if表示条件判断的语句...二者是不一样的..
set a=0;
end if;
if b is null then
set b=0; //set 赋值语句...可以接简单的语句还可以接复杂的函数...
end if;
set c=a+b;
select c as sum;
/*
return c; 这会产生错误...
*/
end; 注:存储过程中不能使用return...return只能使用在函数中... 存储过程的调用... call cl_add(10,20); //存储过程需要使用call函数来进行调用... set @a=10; set @b=20; //我们还可以定义两个用户变量... call cl_add(@a,@b); //将用户变量的值传递过去...

2.存储函数。。。

存储函数也是由一个或多个SQL语句组成的,目的是将代码封装以便重新使用...也是为了方便开发人员操作数据库...

存 储函数使用的限制:1.不能使用临时表。2.不能在存储函数中定义timestamp,cursor,table的数据类型...3.定义函数时参数只允 许是in类型...4.系统内置了一些存储函数,在调用这些函数的时候...需要加::前缀...并启用allow updates服务器选项,才能将用户自定义的函数的所有者定义为系统类型..

DELIMITER //

CREATE FUNCTION NameByT()
RETURNS CHAR(50)
RETURN (SELECT NAME FROM t3 WHERE id=2);
//
DELIMITER ;

创建存储函数,名称为NameByT,该函数返回SELECT语句的查询结果,数值类型为字符串型...

注意:RETURNS CHAR(50)数据类型的时候,RETURNS 是有S的,而RETURN (SELECT NAME FROM t3 WHERE id=2)的时候RETURN是没有S的

3.存储函数和存储过程的区别...

本质上都是实现SQL代码块的封装,方便对数据库的操作...

存储过程和函数存在以下几个区别:

    1)一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。存储过程,功能强大,可以执行包括修改表等一系列数据库操作;用户定义函数不能用于执行一组修改全局数据库状态的操作。
    2)对于存储过程来说可以返回参数,如记录集,而函数只能返回值或者表对象。函数只能返回一个变量;而存储过程可以返回多个。存储过程的参数可以有 IN,OUT,INOUT三种类型,而函数只能有IN类~~存储过程声明时不需要返回类型,而函数声明时需要描述返回类型,且函数体中必须包含一个有效的 RETURN语句。
    3)存储过程,可以使用非确定函数,不允许在用户定义函数主体中内置非确定函数。
    4)存储过程一般是作为一个独立的部分来执行( EXECUTE 语句执行),而函数可以作为查询语句的一个部分来调用(SELECT调用),由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后 面。 SQL语句中不可用存储过程,而可以使用函数。
总结:

  用户自定义函数在处理同一数据行中的各个字段时,特别方便有用。虽然这里使用存储过程也能达到查询目的,但是显然没有使用函数方便。而且,即使使用存储过程也无法处理SELECT查询中的同一数据行中的各个字段的运算。因为存储过程不返回值(唯一可以直接返回整型值,虽然没有返回值,但是可以在存储过程中输出参数来完成返回),使用时只能单独调用;而函数却能出现在能放置表达式的任何位置。

4.Mysql也可以使用declare定义条件和存储程序来解决一些问题...这里所说的问题一般就是错误,当我们在处理一些错误的时候,我们可以自定义一个程序来处理错误....

CREATE TABLE t8(s1 INT,PRIMARY KEY(s1))

DELIMITER //
CREATE PROCEDURE handlerdemo()
BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '' SET @X2=1;
SET @X=1;
INSERT INTO t8 VALUES(1);
SET @X=2;
INSERT INTO t8 VALUES(1);
SET @X=3;
END;
//
DELIMITER ; /* 调用存储过程*/
CALL handlerdemo(); /* 查看调用存储过程结果*/
SELECT @X

  这里我们插入了两次1。。这在主键里是不允许出现的....因此我们使用了DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @X2=1;这个语句来处理这个错误发生...如果没有这句话。。这段代码就是错误的....

5.知识点有所遗漏,也是今天偶尔发现自己不会的一个知识点。。。

数据库查询语句中的having与where的区别。。。

一个很小的知识点。。。不过比较重要。。。

  一般在sql中,大多数情况下都是使用where,而很少使用having,where和having基本差不多,having子句在查询过程中慢于聚合语句,where子句在查询过程中快与查询语句,因此大多数的情况下都是使用where的。。。

SELECT * FROM `welcome` HAVING id >1 LIMIT 0 , 30
SELECT * FROM `welcome` WHERE id >1 LIMIT 0 , 30 //这两种运行结果是一样的。。。在多数情况下能使用where的时候就尽量不要使用having,。因为where要快于聚合语句。。。having的使用是要弥补where在分组数据判断时的不足。。。比如说下面代码。。。。
SELECT user, MAX(salary) FROM users GROUP BY user HAVING MAX(salary)>10;
SELECT user, MAX(salary) FROM users GROUP BY user WHERE MAX(salary)>10;
第二种语句就会出现错误,在数据库中where的后面是不允许加带判断性的聚合函数的。。因此如果当我们统计数据的时候使用到了聚合语句...我们就只能使用having了。。如果不用这些关系,那么当然where是首选。。。

再补充几点:

1、SQL标准要求HAVING必须引用GROUP BY子句中的列或用于总计函数中的列。不过,MySQL支持对此工作性质的扩展,并允许HAVING涉及SELECT清单中的列和外部子查询中的列。

2、HAVING子句必须位于GROUP BY之后ORDER BY之前。

3、如果HAVING子句引用了一个意义不明确的列,则会出现警告。在下面的语句中,col2意义不明确,因为它既作为别名使用,又作为列名使 用:mysql> SELECT COUNT(col1) AS col2 FROM t GROUP BY col2 HAVING col2 = 2;

标准SQL工作性质具有优先权,因此如果一个HAVING列名既被用于GROUP BY,又被用作输出列清单中的起了别名的列,则优先权被给予GROUP BY列中的列。

4、HAVING子句可以引用总计函数,而WHERE子句不能引用。【这应该是开发者在特定的情况下采用HAVING子句的最大原因】

5、不要将HAVING用于应被用于WHERE子句的条目,从我们开头的2条语句来看,这样用并没有出错,但是mysql不推荐。而且也没有明确说明原因,但是既然它要求,我们遵循就可以了。

Mysql学习笔记(十)存储过程与函数 + 知识点补充(having与where的区别)的更多相关文章

  1. MySQL学习笔记(四)—存储过程

    一.概述      存储过程是数据库定义的一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句.存储过程可以避免开发人员重复的编写相同的SQL语句,而且存储过程是在MySq ...

  2. mysql学习笔记:存储过程

    use test; drop table if exists t8; CREATE TABLE t8(s1 INT,PRIMARY KEY(s1)); drop procedure if exists ...

  3. MySQL学习笔记十五:优化(2)

    一.数据库性能评测关键指标 1.IOPS:每秒处理的IO请求次数,这跟磁盘硬件相关,DBA不能左右,但推荐使用SSD. 2.QPS:每秒查询次数,可以使用show status或mysqladmin ...

  4. MySql学习笔记(五) —— 存储过程

    存储过程是MySql 5支持的特性,它是一组为了完成特定功能的SQL语句集,经过编译之后存储在数据库中,当需要使用该组SQL语句时用户只需要通过指定储存过程的名字并给定参数就可以调用执行它了,简而言之 ...

  5. MySQL学习笔记十六:锁机制

    1.数据库锁就是为了保证数据库数据的一致性在一个共享资源被并发访问时使得数据访问顺序化的机制.MySQL数据库的锁机制比较独特,支持不同的存储引擎使用不同的锁机制. 2.MySQL使用了三种类型的锁机 ...

  6. MySQL学习笔记十四:优化(1)

    SQL优化 1.查看各种SQL执行的频率 mysql> show status like 'Com_select';--Com_insert,Com_delete,connections(试图连 ...

  7. MySQL学习笔记十二:数据备份与恢复

    数据备份 1.物理备份与逻辑备份 物理备份 物理备份就是将数据库的数据文件,配置文件,日志文件等复制一份到其他路径上,这种备份速度一般较快,因为只有I/O操作.进行物理备份时,一般都需要关闭mysql ...

  8. MySQL学习笔记十:日志管理

    1.错误日志文件 MySQL的错误日志文件记录错误信息,还会记录mysqld进程的关闭和启动的信息,但也不是什么错误信息都会记录,只记录mysqld进程运行过程中发生的关键性错误. 错误日志的启动,可 ...

  9. MySQL学习笔记(三):常用函数

    一:字符串函数 需要注意的几个细节: 1.cancat中有一个字符串为null,则结果为null. 2.left(str,x) 和 right(str,x)中x为null,则不返回任何字符串,不是nu ...

随机推荐

  1. Revit自定义快递访问工具栏

    Revit快速访问工具栏提供了了一些常用的绘图工具,Revit默认的快速访问工具栏在Revit界面标题栏最左边,我们可以对快速访问工具栏进行控制,比如添加删除绘图命令,让其显示在功能区下方,编辑分组, ...

  2. 重装windows7企业版时提示“安装程序无法创建新的系统分区,也无法定位现有系统

    第一步:把win7镜像发在你电脑的非系统盘的其他硬盘上. 第二步:重启机器,通过U 盘启动.进入win pe系统,关于这点我说一下,有些朋友也许不知道什么叫win pe系统,这个win pe 究竟有什 ...

  3. JMeter教程01-下载和安装

    下载JMeter http://jmeter.apache.org/download_jmeter.cgi 以上是下载地址 更多课程 访问www.bamn.cn 北盟网校 下载后解压 apache-j ...

  4. 【转载】怎样使用ZEMAX导出高质量的图像动画

    Zemax 导出高质量图片与动画 (2013-08-13 11:01:51) http://blog.sina.com.cn/s/blog_628dd2bc0101dycu.html 转载▼ How ...

  5. java生成解析xml的另外两种方法JAXB

     JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反 ...

  6. 在Linux下用源码编译安装apache2

    Linux下安装一个软件,最好去看下它的官方guide,apache2.4的安装安装guide 0. installation guide http://httpd.apache.org/docs/2 ...

  7. Github上的andoird开源组件整理

    http://blog.csdn.net/findsafety/article/details/50623627 第一部分 个性化控件(View) 主要介绍那些不错个性化的View,包括ListVie ...

  8. 修饰者模式(装饰者模式,Decoration)

    1. 装饰者模式,动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更加有弹性的替代方案. 2.组合和继承的区别 继承.继承是给一个类添加行为的比较有效的途径.通过使用继承,可以使得子类在拥有 ...

  9. [原]quick集成spine动画

    更新说明: 新增了骨骼绑定node用法 参考:http://blog.csdn.net/n5/article/details/21795265 在SkeletonRenderer.h 和cpp里面新加 ...

  10. 初探设计:Java接口和抽象类何时用?怎么用?

    今天犯了个错: “接口变动,伤筋动骨,除非你确定只有你一个人在用”.哪怕只是throw了一个新的Exception.哈哈,这是我犯的错误. 一.接口和抽象类 类,即一个对象. 先抽象类,就是抽象出类的 ...