本篇文章主要是对MySQL学习时的一些总结,作为学习笔记记录。

数据来源

存储过程和函数

存储过程和函数有点类似于C/C++中的函数,可以简化操作,提高代码的重用性。

存储过程

存储过程是一组预先编译好的sql语句的集合,可以理解成批处理语句。存储过程的好处主要有:

  • 提高代码的重用性
  • 简化操作
  • 减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率

创建语法

CREATE PROCEDURE procedurename (arg1, arg2......) 
BEGIN
  procedurebody (一组合法的 SQL 语句) 
END ;

对于存储过程来说,有几点需要注意:

  • 参数列表包含三部分:参数模式、参数名、参数类型
  • 参数模式主要分为in、out、inout
  • in:该参数可以作为输入,需要调用方传入值
  • out:该参数可以作为输出,可以作为返回值
  • inout:该参数既可以作为输入也可以作为输出,既需要传入值,又可以返回值
  • 如果存储过程体只有一句话,则begin end可以省略
  • 存储过程体中的每条sql语句的结尾要求必须加分号
  • 存储过程的结尾可以使用(DELIMITER 结束标记)重新设置

调用语法

CALL procedurename(arg1,arg2......);

空参列表

#案例:插入到admin表中三条记录
DELIMITER $
CREATE PROCEDURE p1 () 
BEGIN
  INSERT INTO admin (username, PASSWORD) 
  VALUES
    ('tom', '0000'),
    ('jane', '1111'),
    ('jack', '2222') ;
END $


#调用
CALL p1()$

创建带in模式参数的存储过程

#案例1:创建存储过程实现 根据女神名,查询对应的男神信息
CREATE PROCEDURE p2 (IN beautyName VARCHAR (20)) 
BEGIN
  SELECT 
    bo.* 
  FROM
    boys AS bo 
    RIGHT JOIN beauty AS b 
      ON b.boyfriend_id = bo.`id` 
  WHERE b.name = beautyName ;
END $

#调用
CALL p2 ('小昭') $


#案例2 :创建存储过程实现,用户是否登录成功
CREATE PROCEDURE p3 (
  IN username VARCHAR (20),
  IN PASSWORD VARCHAR (20)
) 
BEGIN
  DECLARE result INT DEFAULT 0 ;
  SELECT 
    COUNT(*) INTO result 
  FROM
    admin 
  WHERE admin.`username` = username 
    AND admin.`password` = PASSWORD ;
  SELECT 
    IF(result > 0, 'success', 'failed') ;
END $

#调用
CALL p3('tom','0000')$

创建带out模式参数的存储过程

#案例1:根据输入的女神名,返回对应的男神名
CREATE PROCEDURE p4 (
  IN beautyName VARCHAR (20),
  OUT boyName VARCHAR (20)
) 
BEGIN
  SELECT 
    bo.boyname INTO boyname 
  FROM
    boys AS bo 
    RIGHT JOIN beauty AS b 
      ON b.boyfriend_id = bo.id 
  WHERE b.name = beautyName ;
END $

#调用
CALL p4('小昭',@boyname) $
SELECT @boyname$


#案例2:根据输入的女神名,返回对应的男神名和魅力值
CREATE PROCEDURE p5 (
  IN beautyName VARCHAR (20),
  OUT boyName VARCHAR (20),
  OUT usercp INT
) 
BEGIN
  SELECT 
    bo.boyname,
    bo.usercp INTO boyName,
    usercp 
  FROM
    boys AS bo 
    RIGHT JOIN beauty b 
      ON b.boyfriend_id = bo.`id` 
  WHERE b.name = beautyName ;
END $

#调用
CALL p5('小昭',@boyname,@cpval)$
SELECT @boyname,@cpval$

创建带inout模式参数的存储过程

#案例:传入a和b两个值,最终a和b都翻倍并返回
CREATE PROCEDURE p6 (INOUT a INT, INOUT b INT) 
BEGIN
  SET a = 2 * a ;
  SET b = 2 * b ;
END $

#调用
SET @m = 10$
SET @n = 20$
CALL p6(@m,@n)$
SELECT @m,@n$

删除语法

DROP PROCEDURE procedurename;

查看语法

SHOW CREATE PROCEDURE procedurename;

 函数

函数也是一组预先编译好的sql语句的集合,可以理解为批处理语句。使用函数主要有以下几个好处:

  • 提高代码的重用性
  • 简化操作
  • 减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率

存储过程和函数的区别

  • 存储过程可以有0个返回值,也可以有多个返回值,适合做批量插入,批量更新
  • 函数有且仅有一个返回值,适合做处理数据后返回一个结果

创建语法

CREATE FUNCTION functionname (arg1, arg2......) RETURNS returntype 
BEGIN
  functionbody 
END ;

对于函数来说,需要注意的是:

  • 参数列表包含两部分:参数名、参数类型
  • 函数体中要有return语句,如果没有会报错
  • 如果return语句没有放在函数体的最后也不报错,但并不建议
  • 函数体中有且仅有一句话,则可以省略begin end
  • 函数的结尾可以使用(DELIMITER 结束标记)重新设置

调用语法

SELECT functionname(arg1,arg2......);

无参有返回

#案例:返回公司的员工个数
CREATE FUNCTION f1 () RETURNS INT 
BEGIN
  DECLARE num INT DEFAULT 0 ;
  
  SELECT 
    COUNT(*) INTO num 
  FROM
    employees ;

  RETURN num ;
END $ 

#调用
SELECT f1()$

有参有返回

#案例1:根据员工名,返回它的工资
CREATE FUNCTION f2(empName VARCHAR(20)) RETURNS DOUBLE 
BEGIN
  SET @sal = 0;
  
  SELECT salary INTO @sal FROM employees AS e WHERE e.last_name = empName;
  
  RETURN @sal;

END $

#调用
SELECT f2('Popp') $


#案例2:根据部门名,返回该部门的平均工资
CREATE FUNCTION f3(deptName VARCHAR(20)) RETURNS DOUBLE
BEGIN

  DECLARE sal DOUBLE DEFAULT 0;

  SELECT 
    AVG(salary) INTO sal 
  FROM
    employees AS e 
    INNER JOIN departments AS d 
      ON e.department_id = d.department_id 
  WHERE d.department_name = deptName ;

  RETURN sal;

END $

#调用
SELECT f3('IT') $

删除语法

DROP FUNCTION functionname;

查看语法

SHOW CREATE FUNCTION functionname;