MySQL学习-存储过程与函数练习

128 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情

前言

上篇我们学习了MySQL中的存储函数与存储过程的修改删除与查看,以及优缺点。有兴趣的小伙伴可以阅读(# MySQL学习-存储过程之修改删除以及优缺点)。
下面针对MySQL中的存储过程与函数做一些练习。

创建数据库

创建数据库test_pro。

CREATE DATABASE test_pro;

USE test_pro;

创建表

创建表admin。增加用户名与密码字段。

CREATE TABLE admin(
id INT PRIMARY KEY AUTO_INCREMENT,
uesr_name VARCHAR(15) NOT NULL,
pwd VARCHAR(25) NOT NULL
);

练习一

创建存储过程insert_user(),实现传入用户名和密码,插入到admin表中。

分析: 需要传入参数,这里使用IN传参。

DELIMITER $
CREATE PROCEDURE insert_user(IN USER VARCHAR(15), IN pwd VARCHAR(25))
BEGIN
    INSERT INTO admin(uesr_name, pwd)
    VALUES (USER, pwd);
END $
DELIMITER ;

调用存储过程插入数据。

CALL insert_user('xiaoming', '123');

SELECT *
FROM admin
iduesr_namepwd
1xiaoming123

从结果中可以看出,插入数据成功。

练习二

创建存储过程get_phone(),实现传入学生编号,返回学生姓名和电话。

首先创建一张表students。并插入数据

CREATE TABLE students(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(15) NOT NULL,
phone VARCHAR(15) UNIQUE,
birth DATE
);

INSERT INTO students(name, phone, birth)
VALUES ('xiaoming', '123', 2000-01-02),
('xiaolan', '1234', 2001-05-02),
('xiaoqiang', '12345', 2000-09-02),

创建存储过程,使用IN, OUT。

DELIMITER $
CREATE PROCEDURE get_phone(IN id INT, IN name VARCHAR(15), OUT phone VARCHAR(15))
BEGIN
    SELECT s.name, s.phone INTO name, phone
    FROM students s
    WHERE s.id = id;
END $
DELIMITER ;

调用存储过程,传入参数。

CALL get_phone(1, @name, @phone);
SELECT @name, @phone
@name@phone
xiaoming123

练习三

创建存储过程date_diff(),实现传入日期,返回日期间隔大小。

DELIMITER $
CREATE PROCEDURE date_diff(IN birth1 DATE, IN birth2 DATE, OUT diff_date INT)
BEGIN
    SELECT DATEDIFF(birth1, birth2) INTO diff_date;
END $
DELIMITER ;

调用存储过程

SET @birth1 = '1992-09-08';
SET @birth2 = '1992-10-30';

CALL date_diff(@birth1, @birth2, @diff_date);
SELECT @diff_date;
@diff_date
-52

练习四

创建带INOUT模式参数的存储过程,传入a和b两个值,最终a和b都翻倍并返回。

DELIMITER $
CREATE PROCEDURE add_double(INOUT a INT, INOUT b INT)
BEGIN
    SET a = a * 2;
    SET b = b * 2;
END $
DELIMITER ;

调用存储过程。

SET @a = 3, @b = 5;
CALL add_double(@a, @b);
SELECT @a, @b;
@a@b
610

练习五

删除练习三的存储过程。

DROP PROCEDURE IF_EXISTS date_diff;

练习六

查看练习四的存储过程信息。

SHOW TABLE PROCEDURE add_double;

或者

SHOW PROCEDURE STATUS LIKE 'add_%';

练习七

创建函数get_count(), 返回员工个数。

DELIMITER $
CREATE FUNCTION get_count()
RETURNS INT
BEGIN
    RETURN (
        SELECT COUNT(*)
        FROM employees
    );
END $
DELIMITER ;

调用函数。

SELECT get_count();
get_count()
3

练习八

创建函数ename_salary(),根据员工的姓名,返回他的工资。

DELIMITER $
CREATE FUNCTION ename_salary(emp_name VARCHAR(15))
RETURNS DOUBLE
BEGIN
    RETURN (
        SELECT salary
        FROM employees
        WHERE name = emp_name
    );
END $
DELIMITER ;

调用函数。

SELECT ename_salary('xiaoming');
ename_salary('xiaoming')
3400

今天先学习到这里,明天继续。