视图是虚拟的。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。
示例
# 此查询⽤来检索订购了某种产品的顾客。 SELECT cust_name, cust_contact FROM Customers, Orders, OrderItems WHERE Customers.cust_id = Orders.cust_id AND OrderItems.order_num = Orders.order_num AND prod_id = 'RGAN01';
为了使任何使用这个数据的人都不需要了解表的结构、表的联结。
将查询包装成一个名为ProductCustomers的虚拟表,使用视图
SELECT cust_name, cust_contact FROM ProductCustomers WHERE prod_id = 'RGAN01';
这就是视图的作⽤。ProductCustomers是⼀个视图,作为视图,它不包含任何列或数据,包含的是⼀个查询(与上⾯⽤以正确联结表的相同查询)。
性能问题
因为试图不包含数据,所以每次使用时,都必须处理查询执行时所需要的所有检索。如果你⽤多个联结和过滤创建了复杂的视图或者嵌套了视图,性能可能会下降得很厉害。因此,在部署使⽤了⼤量视图的应⽤前,应该进⾏测试。
CREATE VIEW virw_name AS SELECT * FROM employees WHERE employee_id = '001';
DROP VIEW view_name;
存储过程就是为以后使用而保存的一条或多条SQL语句。
使⽤存储过程有三个主要的好处,即简单、安全、⾼性能。
EXECUTE 存储过程的名字
DELIMITER $$ # 声明语句结束符为$$ CREATE PROCEDURE procedure_name (IN params int) # 声明存储过程 BEGIN # 存储过程的开始符号 SELECT * FROM employees END $$ # 存储过程的结束符号 delimiter; #将语句的结束符号恢复为分号
示例
mysql> delimiter $$ #将语句的结束符号从分号;临时改为两个$$(可以是自定义) mysql> CREATE PROCEDURE delete_matches(IN p_playerno INTEGER) -> BEGIN -> DELETE FROM MATCHES -> WHERE playerno = p_playerno; -> END$$ Query OK, 0 rows affected (0.01 sec) mysql> delimiter; #将语句的结束符号恢复为分号
解析:默认情况下,存储过程和默认数据库相关联,如果想指定存储过程创建在某个特定的数据库下,那么在过程名前面加数据库名做前缀。 在定义过程时,使用 DELIMITER $$ 命令将语句的结束符号从分号 ; 临时改为两个 $$,使得过程体中使用的分号被直接传递到服务器,而不会被客户端(如mysql)解释。
调用存储过程:
mysql> select * from MATCHES; +---------+--------+----------+-----+------+ | MATCHNO | TEAMNO | PLAYERNO | WON | LOST | +---------+--------+----------+-----+------+ | 1 | 1 | 6 | 3 | 1 | | 7 | 1 | 57 | 3 | 0 | | 8 | 1 | 8 | 0 | 3 | | 9 | 2 | 27 | 3 | 2 | | 11 | 2 | 112 | 2 | 3 | +---------+--------+----------+-----+------+ 5 rows in set (0.00 sec) mysql> call delete_matches(57); Query OK, 1 row affected (0.03 sec) mysql> select * from MATCHES; +---------+--------+----------+-----+------+ | MATCHNO | TEAMNO | PLAYERNO | WON | LOST | +---------+--------+----------+-----+------+ | 1 | 1 | 6 | 3 | 1 | | 8 | 1 | 8 | 0 | 3 | | 9 | 2 | 27 | 3 | 2 | | 11 | 2 | 112 | 2 | 3 | +---------+--------+----------+-----+------+ 4 rows in set (0.00 sec)
解析:在存储过程中设置了需要传参的变量p_playerno,调用存储过程的时候,通过传参将57赋值给p_playerno,然后进行存储过程里的SQL操作