Skip to content

用户变量局部变量

sh
# 准备工作:
# 1.导入atguigudb数据库
# 2.建立dbtest08数据库
CREATE DATABASE dbtest08 CHARACTER SET utf8;

# 3.切换当前数据库为dbtest08
USE dbtest08;

# 4.建立表
CREATE TABLE emps
AS
SELECT * FROM atguigudb.employees;

CREATE TABLE depts
AS
SELECT * FROM atguigudb.departments;

SELECT * FROM emps;

SELECT * FROM depts;

# ------------------用户变量与局部变量----------------------
# 例1:编写一个过程get_value,使用局部变量,查询员工号为102的员工名和工资。
DELIMITER //
CREATE PROCEDURE get_value(IN emp_id INT, OUT emp_name VARCHAR(30), OUT emp_sal DOUBLE)
BEGIN
    SELECT last_name, salary INTO emp_name, emp_sal
    FROM emps
    WHERE employee_id = emp_id;
END //
DELIMITER ;

CALL get_value(102, @emp_name, @emp_sal);

SELECT @emp_name, @emp_sal;

# 例2:编写一个过程add_value,使用局部变量,实现两个整型变量的求和并打印。
DELIMITER //
CREATE PROCEDURE add_value(IN a INT, IN b INT)
BEGIN
    DECLARE res INT;
    SET res = a + b;
    SELECT res;
END //
DELIMITER ;

CALL add_value(10, 20);

# 例3:创建存储过程“different_salary”,查询某员工和他领导的薪资差距,并用IN参数emp_id接收员工id,用OUT参数dif_salary输出薪资差距结果。
DELIMITER //
CREATE PROCEDURE different_salary(IN emp_id INT, OUT dif_salary DOUBLE)
BEGIN
    DECLARE emp_sal, mgr_sal DOUBLE;
    DECLARE mgr_id INT;
    #根据员工号,得到员工工资和领导的编号
    SELECT salary, manager_id INTO emp_sal, mgr_id
    FROM emps
    WHERE employee_id = emp_id;
    #根据领导的编号得到领导的工资
    SELECT salary INTO mgr_sal
    FROM emps
    WHERE employee_id = mgr_id;
    #计算员工与领导的工资之差
    SET dif_salary = emp_sal - mgr_sal;
END //
DELIMITER ;

CALL different_salary(102, @res);
SELECT @res;

# 例4: 创建函数get_count(),返回公司的员工个数
DELIMITER //
CREATE FUNCTION get_count()
RETURNS INT
BEGIN
    DECLARE cnt INT;
    SELECT COUNT(*) INTO cnt
    FROM emps;
    RETURN cnt;
END //
DELIMITER ;

SELECT get_count();

# 例5: 创建函数ename_salary(),根据员工姓名,返回它的工资
DELIMITER //
CREATE FUNCTION ename_salary(emp_name VARCHAR(30))
RETURNS DOUBLE
BEGIN
    DECLARE emp_sal DOUBLE;
    SELECT salary INTO emp_sal
    FROM emps
    WHERE last_name = emp_name;
    RETURN emp_sal;
END //
DELIMITER ;

SELECT ename_salary('Chen');

# 例6:创建函数dept_sal() ,根据部门名,返回该部门的平均工资
DELIMITER //
CREATE FUNCTION dept_sal(dept_name VARCHAR(30))
RETURNS DOUBLE
BEGIN
    DECLARE avg_sal DOUBLE;
    DECLARE dept_id INT;
    #根据部门名,得到部门编号
    SELECT department_id INTO dept_id
    FROM depts
    WHERE department_name = dept_name;
    #根据部门编号,统计该部门的平均工资
    SELECT AVG(salary) INTO avg_sal
    FROM emps
    WHERE department_id = dept_id;
    #返回该部门的平均工资
    RETURN avg_sal;
END //
DELIMITER ;

SELECT dept_sal('IT');

# 例7:创建函数add_float(),实现传入两个float变量,返回二者之和
DELIMITER //
CREATE FUNCTION add_float(a FLOAT, b FLOAT)
RETURNS FLOAT
BEGIN
    DECLARE res FLOAT;
    SET res = a + b;
    RETURN res;
END //
DELIMITER ;

SELECT add_float(12.5, 23.5);