mysql视图,存储过程与存储函数

第十四章 视图

CREATE TABLE emps
AS
SELECT* FROM atguigudb.employees;

CREATE TABLE depts
AS
SELECT*FROM atguigudb.departments;

DESC emps;
DESC depts;

#创建视图
#1.针对于单表
CREATE VIEW vu_emp1
AS SELECT employee_id,last_name,salary
FROM emps;

SELECT * FROM vu_emp1;

CREATE VIEW vu_emp2
AS
SELECT employee_id emp_id,last_name lname,salary #查询语句中字段的别名会作为视图中的字段显示
FROM emps
WHERE salary>8000;
SELECT * FROM vu_emp2;

CREATE VIEW vu_emp3(emp_id,NAME,monthly_sal)
#查询语句中字段的别名会依次匹配上面自定义的字段
AS
SELECT employee_id,last_name,salary
FROM emps
WHERE salary>8000;

SELECT * FROM vu_emp3;

#情况二 视图中的字段在基表中不存在
CREATE VIEW vu_emp_sal
AS
SELECT department_id,AVG(salary)avg_sal
FROM emps
WHERE department_id IS NOT NULL
GROUP BY department_id;

SELECT * FROM vu_emp_sal;

#针对于多表的情况
CREATE VIEW vu_emp_dept
AS
SELECT e.employee_id,e.department_id,d.department_name
FROM emps e JOIN depts d
ON e.department_id=d.department_id;

SELECT * FROM vu_emp_dept;
/* 规则为
create view 视图名
as
多表查询
*/

#利用视图对数据进行格式化
CREATE VIEW vu_emp_dept1
AS
SELECT CONCAT(e.last_name,‘(’,d.department_name,‘)’)emp_info
FROM emps e JOIN depts d
ON e.department_id=d.department_id;

SELECT *FROM vu_emp_dept1;

CREATE VIEW vu_emp4
AS SELECT employee_id,last_name
FROM vu_emp1;

SELECT * FROM vu_emp1;

#查看视图结构
DESC vu_emp1;
DESCRIBE vu_emp1;

#查看数据库中的表对象,视图对象
SHOW TABLES;

#查看视图的属性信息
SHOW TABLE STATUS LIKE’vu_emp1’;

#查看视图的详细定义信息
SHOW CREATE VIEW vu_emp1;

增删改视图中的数据,表中的数据也会跟着改变
视图的优点:1.操作简单 2.减少数据冗余 3.数据安全 4.适合灵活多变的业务需求 5.能够分解复杂的查询逻辑
视图的缺点:如果实际的数据表发生了变更,需要及时对相关的数据库进行维护;视图过多会造成数据库维护成本的问题

第十五章 存储过程与存储函数

CREATE TABLE employees
AS
SELECT *FROM atguigudb.employees;

CREATE TABLE departments
AS
SELECT *FROM atguigudb.departments;

#1.创建存储过程
#举例一:创建存储过程select_all_data(),查看employees表的所有数据
DELIMITER $

CREATE PROCEDURE select_all_data()
BEGIN
SELECT * FROM employees;
END $

DELIMITER ;

CALL select_all_data();

#2.存储过程的调用(不同的存储过程调用方法不同,是否有参数)
CALL select_all_data();

#举例二:创建存储过程avg_employee_salary(),返回所有员工的平均工资
DELIMITER //
CREATE PROCEDURE avg_employee_salary ()
BEGIN
SELECT AVG(salary) AS avg_salary FROM emps;
END //
DELIMITER ;

#调用如下
CALL avg_employee_salary ()

#举例3:创建存储过程show_max_salary(),用来查看“emps”表的最高薪资值
DELIMITER //
CREATE PROCEDURE show_max_salary()
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ‘查看最高薪资’
BEGIN
SELECT MAX(salary) FROM emps;
END //
DELIMITER ;

#调用
CALL show_max_salary()

#举例4:创建存储过程show_min_salary(),查看“emps”表的最低薪资值。并将最低薪资通过OUT参数“ms”输出
DELIMITER //
CREATE PROCEDURE show_min_salary(OUT ms DOUBLE)
BEGIN
SELECT MIN(salary) INTO ms FROM employees;
END //
DELIMITER ;

#调用带参数的存储过程
CALL show_min_salary(@ms)
#再查看
SELECT @ms;

#举例5:创建存储过程show_someone_salary(),查看“emps”表的某个员工的薪资,并用IN参数empname
#输入员工姓名。
DELIMITER //
CREATE PROCEDURE show_someone_salary(IN empname VARCHAR(20))
BEGIN
SELECT salary FROM employees WHERE last_name = empname;
END //
DELIMITER ;
#调用
SET @empname1=‘King’
CALL show_someone_salary(@empname1)
#或者
CALL show_someone_salary(‘King’);

#举例6:创建存储过程show_someone_salary2(),查看“emps”表的某个员工的薪资,并用IN参数empname
#输入员工姓名,用OUT参数empsalary输出员工薪资。
DELIMITER //
CREATE PROCEDURE show_someone_salary2(IN empname VARCHAR(20),OUT empsalary DOUBLE)
BEGIN
SELECT salary INTO empsalary FROM emps WHERE last_name = empname;
END //
DELIMITER ;
#调用
SET @empname=‘Abel’;
CALL show_someone_salary2(@empname,@empsalary)
SELECT @empsalary

#举例7:创建存储过程show_mgr_name(),查询某个员工领导的姓名,并用INOUT参数“empname”输入员
#工姓名,输出领导的姓名。
DELIMITER //
CREATE PROCEDURE show_mgr_name(INOUT empname VARCHAR(20))
BEGIN
SELECT last_name INTO empname FROM employees
WHERE employee_id = (SELECT manager_id FROM employees WHERE last_name=empname);
END //
DELIMITER ;
#调用
SET @empname=‘Abel’
CALL show_mgr_name(@empname)
SELECT @empname

#存储函数的使用
#创建存储函数,名称为email_by_name(),参数定义为空,该函数查询Abel的email,并返回,数据类型为字符串型。

DELIMITER //
CREATE FUNCTION email_by_name()
RETURNS VARCHAR(25)
DETERMINISTIC
CONTAINS SQL
BEGIN
RETURN (SELECT email FROM employees WHERE last_name=‘Abel’)
END //
DELIMITER ;
#不是必须return 语句最前面有缩进,注意格式的变化
DELIMITER //
CREATE FUNCTION email_by_name()
RETURNS VARCHAR(25)
DETERMINISTIC
CONTAINS SQL
BEGIN
RETURN (SELECT email FROM employees WHERE last_name = ‘Abel’);
END //
DELIMITER ;
#调用
SELECT email_by_name();

#不检验函数特征的设置
SET GLOBAL log_bin_trust_function_creators=1;
#例2:创建存储函数,名称为email_by_id(),参数传入emp_id,该函数查询emp_id的email,并返回,数据类型
#为字符串型。
DELIMITER //
CREATE FUNCTION email_by_id(emp_id INT)
RETURNS VARCHAR(25)
BEGIN
RETURN(SELECT email FROM employees WHERE employee_id=emp_id);
END //
DELIMITER ;

#调用方式一
SET @emp_id=103;
SELECT email_by_id(@emp_id);

#调用方式二
SELECT email_by_id(102);

#例3:创建存储函数count_by_id(),参数传入dept_id,该函数查询dept_id部门的员工人数,并返回,数据类型
#为整型。
DELIMITER //
CREATE FUNCTION count_by_id(dept_id INT)
RETURNS INT
BEGIN
RETURN(SELECT COUNT(*)FROM employees WHERE department_id=dept_id);
END //
DELIMITER ;

#调用方式一
SET @dept_id=50;
SELECT count_by_id(@dept_id);

#调用方式二
SELECT count_by_id(50);

#存储过程和函数的查看
#1.使用show create语句查看存储过程和存储函数的创建信息
SHOW CREATE PROCEDURE show_max_salary;
SHOW CREATE FUNCTION count_by_id;

#2.显示存储过程或存储函数的状态信息
SHOW PROCEDURE STATUS LIKE ‘show%’;

#3.举例:从Routines表中查询名称为CountProc的存储函数的信息,代码如下:
SELECT * FROM information_schema.Routines
WHERE ROUTINE_NAME=‘count_by_id’ AND ROUTINE_TYPE = ‘FUNCTION’;

#查看数据库中所有的存储过程和存储函数
SELECT NAME FROM mysql.proc WHERE db=‘dbtest1’;

#显示所有存储过程的状态信息
SHOW PROCEDURE STATUS WHERE db=‘dbtest1’

#显示所有存储函数的状态信息
SHOW FUNCTION STATUS WHERE db=‘dbtest1’

#查看单个存储过程的状态信息
SHOW PROCEDURE STATUS LIKE ‘show_max_salary’

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据小理

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值