视图
视图是虚拟的表,只包含使用时动态检索数据的查询。
视图不包含任何列和数据,它包含的是一个查询。
重要的是视图仅仅是用来查看存储在别处的数据的一种设施,视图本身不包含数据,因此它们返回的数据时从其他表中检索出来的。在添加或更改这些表中的数据时,视图将返回改变过的数据。
基本语法: CREATE VIEW 视图名称 AS (这里是SELECT 查询语句)
—>使用视图的好处?
- 使操作简单化,可以对经常使用的查询定义一个视图,使用户不必为同样的查询操作指定条件。
- 增加数据的安全性,通过视图,用户只能查询和修改指定的数据。
- 提高表的逻辑独立性,视图可以屏蔽原有表结构变化带来的影响。
2.存储过程
存储过程简单来说,就是为以后的使用而保存的一条或者多条SQL语句的集合。可将其视为批文件。
总的来说,使用存储过程有三个主要的好处,即简单、安全、高性能。
就我个人理解来说,存储过程就类似一个实现某个特定功能的小接口或者函数,调用它可以实现对数据的某种处理。
下面举例来说明一下:
首先我们修改一下MYSQL中的结束符(从;修改为//)
mysql> delimiter //
1.无传入参数的存储过程:
显示版本:
mysql> CREATE PROCEDURE pro2()
-> SELECT VERSION()//
Query OK, 0 rows affected (0.00 sec)
mysql> CALL pro2()//
+------------+
| VERSION() |
+------------+
| 5.6.26-log |
+------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
其中 CALL 存储过程名称 用来执行存储过程。
2.带有传入参数的存储过程
现在我们创建一个删除指定id记录的存储过程:
原表:
mysql> select * from course//
+-----------+-------------+
| course_id | course_name |
+-----------+-------------+
| 1 | chinese |
| 2 | math |
| 3 | english |
| 4 | phy |
| 7 | bio |
+-----------+-------------+
5 rows in set (0.00 sec)
创建存储过程并且调用:
mysql> CREATE PROCEDURE removebyid(IN id int)
-> BEGIN
-> DELETE FROM course WHERE course_id=id;
-> END
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;
mysql> CALL removebyid(7);
Query OK, 1 row affected (0.06 sec)
mysql> select * from course;
+-----------+-------------+
| course_id | course_name |
+-----------+-------------+
| 1 | chinese |
| 2 | math |
| 3 | english |
| 4 | phy |
+-----------+-------------+
4 rows in set (0.00 sec)
注意,这里我们用到的‘形参’为id,这个形参的名字不能与表的字段的名字相同,否则会产生意想不到的后果。
IN:表示后面跟的是输入参数。
3.带有输出参数的存储过程
例子如下:
mysql> DELIMITER //
mysql> CREATE PROCEDURE pro1(IN id INT,OUT nums INT)
-> BEGIN
-> DELETE FROM course WHERE course_id=id;
-> SELECT COUNT(*) FROM course INTO nums;
-> END
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;
mysql> SELECT * FROM course;
+-----------+-------------+
| course_id | course_name |
+-----------+-------------+
| 1 | chinese |
| 3 | english |
| 2 | math |
| 4 | phy |
+-----------+-------------+
4 rows in set (0.00 sec)
mysql> CALL rpo(2,@num);
ERROR 1305 (42000): PROCEDURE learnsql.rpo does not exist
mysql> CALL pro1(2,@num);
Query OK, 1 row affected (0.06 sec)
mysql> select @num;
+------+
| @num |
+------+
| 3 |
+------+
1 row in set (0.00 sec)
上面我们在调用存储过程的时候,将输出参数传入@num这个参数。最后可以显示这个参数。
同理,可以选择多个输出参数,这也正是存储过程与函数不相同的一点。
存储过程的修改:存储过程不能修改过程体,只能删除重新建立存储过程。