mysql 视图案例_MySQL数据库视图实例详解

对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少。

视图是存储在数据库中的查询的SQL 语句,它主要出于两种原因:安全原因, 视图可以隐藏一些数据,如:社会保险基金表,可以用视图只显示姓名,地址,而不显示社会保险号和工资数等,另一原因是可使复杂的查询易于理解和使用。

视图:查看图形或文档的方式。

视图是从一个或多个表或视图中导出的表,其结构和数据是建立在对表的查询基础上的。和表一样,视图也是包括几个被定义的数据列和多个数据行,但就本质而言这些数据列和数据行来源于其所引用的表。

所以视图不是真实存在的基础表而是一张虚表,视图所对应的数据并不实际地以视图结构存储在数据库中,而是存储在视图所引用的表中。

视图一经定义便存储在数据库中,与其相对应的数据并没有像表那样又在数据库中再存储一份,通过视图看到的数据只是存放在基本表中的数据。对视图的操作与对表的操作一样,可以对其进行查询、修改(有一定的限制)、删除。

当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化,同时,若基本表的数据发生变化,则这种变化也可以自动地反映到视图中。

视图有很多优点,主要表现在:

•视点集中

•简化操作

•定制数据

•合并分割数据

•安全性

当然视图也存在一些缺点,最大的缺点就是视图带来的更新负担,比如源数据改了,那么视图中要做相应更新,视图中数据改了源数据也要做同步,这和MySQL的Cache差不多。

二. 创建视图——CREATE VIEW

1. 语法

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW [db_name.]view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]

通过该语句可以创建视图,若给定了[OR REPLACE],则表示当已具有同名的视图时,将覆盖原视图。select_statement是一个查询语句,这个查询语句可从表或其它的视图中查询。视图属于数据库,因此需要指定数据库的名称,若未指定时,表示在当前的数据库创建新视图。

表和数据库共享数据库中相同的名称空间,因此,数据库不能包含相同名称的表和视图,并且,视图的列名也不能重复。

2. 使用举例

Eg. 本例创建一个产品表(product)和一个购买记录表(purchase),再通过视图purchase_detail查询出购买的详细信息。

创建表

CREATE TABLE product

(

product_id INT NOT NULL,

name VARCHAR(50) NOT NULL,

price DOUBLE NOT NULL

);

插入数据

INSERT INTO product VALUES(1, ‘apple ‘, 5.5);

创建表

CREATE TABLE purchase

(

id INT NOT NULL,

product_id INT NOT NULL,

qty INT NOT NULL DEFAULT 0,

gen_time DATETIME NOT NULL

);

插入数据

INSERT INTO purchase VALUES(1, 1, 10, NOW());

创建视图

CREATE VIEW purchase_detail AS SELECT product.name as name, product .price as price, purchase.qty as qty, product .price * purchase.qty as total_value from product, purchase where product.product_id = purchase.product_id;

创建成功后,输入:SELECT * FROM purchase_detail;

运行效果如下:

+——-+——-+—–+————-+

| name | price | qty | total_value |

+——-+——-+—–+————-+

| apple | 5.5 | 10 | 55 |

+——-+——-+—–+————-+

1 row in set (0.01 sec)

3. 注意事项

创建视图存在如下注意事项:

(1) 运行创建视图的语句需要用户具有创建视图(CRATE VIEW)的权限,若加了[OR REPLACE]时,还需要用户具有删除视图(DROP VIEW)的权限;

(2) SELECT语句不能包含FROM子句中的子查询;

(3) SELECT语句不能引用系统或用户变量;

(4) SELECT语句不能引用预处理语句参数;

(5) 在存储子程序内,定义不能引用子程序参数或局部变量;

(6) 在定义中引用的表或视图必须存在。但是,创建了视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用CHECK TABLE语句;

(7) 在定义中不能引用TEMPORARY表,不能创建TEMPORARY视图;

(8) 在视图定义中命名的表必须已存在;

(9) 不能将触发程序与视图关联在一起;

(10) 在视图定义中允许使用ORDER BY,但是,如果从特定视图进行了选择,而该视图使用了具有自己ORDER BY的语句,它将被忽略。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MySQL 视图的限制包括: 1. 视图不能使用临时表 2. 视图不能包含 ORDER BY 子句,除非同时使用了 TOP 或 LIMIT 子句 3. 视图不能包含 INTO OUTFILE 或 INTO DUMPFILE 子句 4. 视图不能被索引,也不能被视为基表 5. 视图不能修改基表的数据,除非使用了特定的 WITH CHECK OPTION 子句 下面是一个 MySQL 视图限制的实例: 假设有一个名为 `orders` 的表,包含以下字段:`order_id`、`customer_id`、`order_date` 和 `total_amount`。 我们可以创建一个名为 `orders_view` 的视图,它只包含 `customer_id` 和 `total_amount` 这两个字段,如下所示: ``` CREATE VIEW orders_view AS SELECT customer_id, total_amount FROM orders; ``` 然而,我们不能在这个视图中包含 ORDER BY 子句,否则会收到以下错误消息: ``` ERROR 1351 (HY000): View's SELECT contains a subquery in the FROM clause ``` 因此,我们应该在使用 ORDER BY 子句时,同时使用 TOP 或 LIMIT 子句来限制结果集的大小,如下所示: ``` CREATE VIEW orders_view AS SELECT customer_id, total_amount FROM orders ORDER BY total_amount DESC LIMIT 10; ``` 这样就可以避免上述错误。 ### 回答2: MySQL视图是虚拟的表,它是根据定义视图时指定的查询语句动态生成的,可以简化复杂的查询操作。然而,MySQL视图也有一些限制。 首先,MySQL视图不支持带有全局或本地临时表的查询。这意味着如果查询需要使用临时表,无法将其放在视图中进行处理。 其次,MySQL视图不能索引。因为视图是根据查询结果动态生成的,而不是实际存储数据,所以无法为视图创建索引。这可能会导致在对视图进行复杂查询时性能下降。 此外,MySQL视图还有许多使用限制。例如,视图不能引用临时表、不能使用存储函数、不能使用用户变量,并且定义视图的SELECT语句不能包含DISTINCT关键字。 下面是一个关于MySQL视图限制的示例: 假设有一个名为"employees"的表,包含员工的姓名、年龄和工资信息。我们希望创建一个名为"young_employees"的视图,只包含年龄小于30岁的员工信息。 创建视图的语句可以是: CREATE VIEW young_employees AS SELECT * FROM employees WHERE age < 30; 然而,如果我们尝试在这个视图上使用DISTINCT关键字进行查询,就会遇到限制: SELECT DISTINCT * FROM young_employees; 会报错,因为MySQL不允许在视图的查询中使用DISTINCT关键字。 综上所述,MySQL视图不支持临时表、无法索引、存在许多其他使用限制。在使用MySQL视图时,我们应该遵守这些限制并考虑它们可能带来的性能问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值