MYSQL复习笔记12-视图
Date: 20140223
Auth: Jin
参考:
http://blog.sina.com.cn/s/blog_436732df0100e768.html
一、介绍
1、概念
视图是从一个或几个基本表(或视图)导出的表,是数据库的用户使用数据库的观点。
视图是一个虚表即所应对的数据不进行实际存储,数据库中只存储视图的定义。
2.视图的优点:
1).为用户集中数据简化用户的查询和处理。
2).屏蔽数据库的复杂性
3).简化用户权限的管理 grant语句可以针对视图进行授予权限。
4).便于数据库共享
5).可以重新组织数据以便输出到其他应用程序
视点集中,简化操作,定制数据,合并分割数据,安全性
3.视图的缺点
1).只有在当前数据库中才能创建视图,视图到命名必须遵循标示符命名规则不能与表同名
视图的来源数据可以是同一个实例下的其他库
2).不能把规则,默认值,或触发器与视图相关联。
二、操作SQL
1、查看库中有的视图
表明上视图表和没什么区别
SQL语句:show table status where Comment='VIEW';
3304-phpcms>show table status where Comment='VIEW';
+--------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------
+-------------+-------------+------------+-----------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time
| Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+--------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------
+-------------+-------------+------------+-----------+----------+----------------+---------+
| v_carseats_article | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL
| NULL | NULL | NULL | NULL | NULL | VIEW |
+--------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------
+-------------+-------------+------------+-----------+----------+----------------+---------+
2、查看创建视图的SQL语句
3304-phpcms>show create view v_carseats_article\G
*************************** 1. row ***************************
View: v_carseats_article
Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`127.0.0.1` SQL SECURITY DEFINER VIEW `v_carseats_article` AS select `a`.`id` AS `id`,`a`.`title` AS
`title`,`a`.`catid` AS `module_id`,`a`.`thumb` AS `img`,`c`.`catname` AS `module_name`,`b`.`content` AS `content`,`a`.`username` AS `publish_user`,`a`.`status` AS
`is_del`,`a`.`listorder` AS `order`,`a`.`updatetime` AS `update_time`,`a`.`inputtime` AS `add_time`,`b`.`copyfrom` AS `copyfrom`,`a`.`keywords` AS
`keywords`,`a`.`islink` AS `islink`,`a`.`url` AS `url` from ((`v9_news` `a` join `v9_news_data` `b`) join `v9_category` `c`) where ((`a`.`catid` = `c`.`catid`) and
(`a`.`id` = `b`.`id`))
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.00 sec)
3304-anquanzuo>show create view carseats_article\G
*************************** 1. row ***************************
View: carseats_article
Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`dbproxy`@`192.168.201.201` SQL SECURITY DEFINER VIEW `carseats_article` AS select `a`.`id` AS
`id`,`a`.`title` AS `title`,`a`.`catid` AS `module_id`,`a`.`thumb` AS `img`,`c`.`catname` AS `module_name`,`b`.`content` AS `content`,`a`.`username` AS
`publish_user`,`a`.`status` AS `is_del`,`a`.`listorder` AS `order`,`a`.`updatetime` AS `update_time`,`a`.`inputtime` AS `add_time`,`b`.`copyfrom` AS
`copyfrom`,`a`.`keywords` AS `keywords`,`a`.`islink` AS `islink`,`a`.`url` AS `url` from ((`phpcms`.`v9_news` `a` join `phpcms`.`v9_news_data` `b`) join
`phpcms`.`v9_category` `c`) where ((`a`.`catid` = `c`.`catid`) and (`a`.`id` = `b`.`id`))
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.01 sec)
3、创建视图
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是一个查询语句,这个查询语句可从表或其它的视图中查询。视图属于数
据库,因此需要指定数据库的名称,若未指定时,表示在当前的数据库创建新视图。
表和数据库共享数据库中相同的名称空间,因此,数据库不能包含相同名称的表和视图,并且,视图的列名也不能重复。
创建视图存在如下注意事项:
(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的语句,它将被忽略。
实例1:
DROP VIEW IF EXISTS `v_carseats_article`;
CREATE VIEW `v_carseats_article` AS
SELECT
`a`.`id` AS `id`,
`a`.`title` AS `title`,
`a`.`catid` AS `module_id`,
`a`.`thumb` AS `img`,
`c`.`catname` AS `module_name`,
`b`.`content` AS `content`,
`a`.`username` AS `publish_user`,
`a`.`status` AS `is_del`,
`a`.`listorder` AS `order`,
`a`.`updatetime` AS `update_time`,
`a`.`inputtime` AS `add_time`,
`b`.`copyfrom` AS `copyfrom`,
`a`.`keywords` AS `keywords`,
`a`.`islink` AS `islink`,
`a`.`url` AS `url`
FROM ((`v9_news` AS `a` JOIN `v9_news_data` AS `b`) JOIN `v9_category` AS `c`)
WHERE ((`a`.`catid` = `c`.`catid`) AND (`a`.`id` = `b`.`id`));
重点是用SELECT语句确定数据源。
实例2
本例创建一个产品表(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 |
+-------+-------+-----+-------------+
4.修改
alter [algorithm = {undefined | merge | temptable}] view view_name [(column_list)] as select_statement [with [cascaded | local] check option]该语句用于更改已有视图的定
义。其语法与create view类似。
将上面创建的视purchase_detail进行修改,去掉qty列,语句如下:
alter view purchase_detail as
select
product.name as name,
product.price as price,
product.price * purchase.qty as total_value
from product, purchase where product.product_id = purchase.product_id;
查询
mysql> select * from purchase_detail;
+--------+-------+-------------+
| name | price | total_value |
+--------+-------+-------------+
| apple | 5.5 | 55 |
+--------+-------+-------------+
1 row in set (0.00 sec)
三、通过更新视图实现更新真实表
参考:http://www.cnblogs.com/wangtao_20/archive/2011/02/24/1964276.html
注意:视图一般只查询,尽量避免修改,防止出现数据问题
四、视图用于远程表
http://www.cnblogs.com/diege/p/3548445.html
五、备份和迁移
1、备份和表一样
2、迁移和表一样
和存储过程不一样,DUMP时候不用特殊参数
MYSQL复习笔记12-视图的更多相关文章
- MySQL学习笔记之视图
视图是对磁盘上保存的表数据的抽象,即抽取一个表或多个表的部分行或列的数据,展示给使用者. 首先列举下MySQL中最简单的对视图操作的语法: 1.创建视图: create view 视图名 as sel ...
- MYSQL复习笔记5-select-from-where子句
Date: 20140125Auth: Jin参考:http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#select一.select子句主要定 ...
- mysql复习笔记
阅读目录 1.什么是SQL语句2.使用sql语句创建数据库和表3.创建数据表4.数据完整性约束5.四中基本字符类型说明6.SQL基本语句7.类型转换函数8.日期函数9.数学函数10.字符串函数11.联 ...
- mysql学习笔记--数据库视图
一.视图 1. 概念 a. 视图是一张虚拟表,它表示一张表的部分或多张表的综合的结构 b. 视图仅仅是表结构,没有数据.视图的结构和数据建立在表的基础上 2. 创建视图 a. 语法: create [ ...
- MySQL 复习笔记
本文内容 SQL 语句 创建数据库 创建数据表 数据完整性约束 四种基本字符类型说明 SQL 基本语句 类型转换函数 日期函数 数学函数 字符串函数 合并结果集 union CASE 函数用法 IF ...
- MYSQL复习笔记13-触发器trigger
Date: 20140305Auth: Jin 一.概念1.基本概念触发器是一个被指定关联到一个表的数据对象,触发器是不需要调用的,当对一个表的特别事件出现时,它就被激活.触发器的代码也是由SQL语句 ...
- MYSQL复习笔记6-字符集
Date: 20100101 Auth: Jin 参考http://blog.sina.com.cn/s/blog_9707fac301016wxm.html 一.字符集介绍 计算机只处理二进制代码 ...
- MYSQL复习笔记3-用户和安全
Date: 20140115Auth: Jin参考:http://dev.mysql.com/doc/refman/5.1/en/security.html 一.权限系统实现方式相关权限信息存储在几个 ...
- MYSQL复习笔记10-连接
Date: 20140219Auth: Jin 一.介绍连接是二元运算,可以对两个表或多个表进行查询.T-SQL中分两大类,一是符合SQL标准的连接谓词表示形式,二是T-SQL扩展的使用关键字JOIN ...
随机推荐
- C++中多线程与Singleton的那些事儿
前言 前段时间在网上看到了个的面试题,大概意思是如何在不使用锁和C++11的情况下,用C++实现线程安全的Singleton. 看到这个题目后,第一个想法就是用Scott Meyer在<Effe ...
- Linux系统编程——进程间通信(一)
基本操作命令: ps -ajx/-aux/-ef 查看进程间状态/的相互关系 top 动态显示系统中的进程 nice 按照指定的优先级运行 /renice 改变正在运行的进程的优先级 kill -9杀 ...
- JDBC数据源连接池(2)---C3P0
我们接着<JDBC数据源连接池(1)---DBCP>继续介绍数据源连接池. 首先,在Web项目的WebContent--->WEB-INF--->lib文件夹中添加C3P0的j ...
- datatables的学习总结
$(document).ready(function() { var oTable= $('#dataTables-example').DataTable({ // searching : false ...
- linux的rpm教程
1.rmp查询 1.1 软件包详细信息 rpm -qpi httpd-2.4.25-9.fc27.x86_64.rpm 系统将会列出这个软件包的详细资料,包括含有多少个文件.各文件名称.文件大小.创 ...
- linux下查看机器配置
查看cpu信息:lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): ...
- HDU-5317
RGCDQ Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- 从Java Future到Guava ListenableFuture实现异步调用
原文地址: http://blog.csdn.net/pistolove/article/details/51232004 Java Future 通过Executors可以创建不同类似的线程 ...
- phpcms v9表单向导添加验证码
要做留言板的功能,故用添加表单,想要在提交留言前加一个验证码的功能.网上的教程比较混乱,于是亲自实验了下,步骤如下: 首先是调用表单的页面加入验证码.表单js调用模版默认的是 \phpcms\temp ...
- hdu 2818(并查集,带权更新)
Building Block Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...