mysql高级语法- view视图操作
2015-08-28 14:46
1596 查看
视图和表一样,也可用于查询
1.什么是视图 ?
视图是存储在数据库中的用于查询的SQL语句,使用视图主要用于两种原因:
1. 安全原因。视图可以隐藏一些数据,如对于社会保险金表,可以用视图只显示
姓名、地址,而不显示社会保险好和工资数等。
2. 另一个原因是可使复杂的查询易于理解和使用。
2. 视图的语法
mysql在处理视图时有两种算法,分别为 merge 和 temptable, 可以指定使用哪种算法。merge是指在处理涉及到视图的操作时,将对视图额操作根据视图的定义进行展开,优点类似于C语言中的宏展开。
mysql>pager more;
mysql>
? create view
Name: 'CREATE VIEW'
Description:
Syntax:
CREATE
[OR
REPLACE]
[ALGORITHM=
{UNDEFINED | MERGE
| TEMPTABLE}]
[DEFINER =
{ user | CURRENT_USER
}]
[SQL SECURITY{ DEFINER
| INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED
| LOCAL] CHECK
OPTION]
该语句能创建新的视图,如果给定了OR REPLACE子句,该语句还能替换已有的视图。select_statement 是一种SELECT语句,它给定了视图的定义。该语句可从基表或其他视图进行选择。
该语句要求具有针对视图的 CREATE VIEW 权限,以及针对有SELECT语句选择的每列上的某些权限。对于在SELECT语句中其他地方使用的列,必须具有select权限。如果还有 OR REPLACE子句,必须在视图上具有DROP权限。
视图属于数据库。在默认情况下,将在当前数据库创建新视图。要想在给定数据库中明确的创建视图,创建时,应将名称指定为db_name.view_name
如:
mysql>create view test.v asselect
* from t
表和视图共享数据库中相同的名称空间,因此,数据库不能包含具有相同名称的表和视图。
视图必须具有唯一的列名。
视图创建成功后,如果需要修改,可以使用alter view修改
mysql>
? alter view
Name: 'ALTER VIEW'
Description:
Syntax:
ALTER
[ALGORITHM=
{UNDEFINED | MERGE
| TEMPTABLE}]
[DEFINER =
{ user | CURRENT_USER
}]
[SQL SECURITY{ DEFINER
| INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED
| LOCAL] CHECK
OPTION
删除视图
mysql>
? drop view
Name: 'DROP VIEW'
Description:
Syntax:
DROP VIEW [IFEXISTS]
view_name [,view_name]
...
[RESTRICT | CASCADE]
可以使用关键字 IF EXISTS 来防止因存在的视图而出错
此外,还可以通过下面的语句查看 view_name 的完整定义
mysql>show create view view_name
3. 视图的使用 ?
对视图的操作与对表的操作一样,可以对其进行查询、修改(有一定的限制)、删除。当通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化,同时,若基本表的数据发生变化,则这种变化也可以自动的反映到视图中。
在mysql中,对视图的使用有如下规则:
1. 视图必须有唯一命名
2. 在mysql中视图的数量没有限制
3. 创建视图必须从管理员那里获得必要的权限
4. 视图支持嵌套,也就是说可以利用其他视图检索出来的数据创建新的视图
5. 在视图中可以使用 OREDR BY,但是如果视图内已经使用该排序子句,则视图的ORDER BY 将覆盖前面的 ORDERBY。
6. 视图不能索引,也不能关联触发器或默认值。
7 视图可以和表同时使用
现在假设我们有一个产品表product和一个购买记录表purchase
ywx@ywx:/opt/mysql5151$ sudo
./bin/mysqld_safe
--defaults-file=./my.cnf
--user=ywx
&
ywx@ywx:/opt/mysql5151$ sudo ./bin/mysql--defaults-file=./my.cnf
mysql> create tableproduct(product_id
int not
null, name varchar(50)
not null,price double
not null);
Query OK, 0 rowsaffected
(0.06 sec)
mysql> insert into productvalues(1,'apple',5.5);
Query OK, 1 rowaffected
(0.40 sec)
mysql> create tablepurchase(id
int not
null, product_id
int not null, qty
int not
null default 0, gen_tim datetime
not null);
Query OK, 0 rowsaffected
(0.04 sec)
mysql> insert into purchasevalues(1,1,10,now());
Query OK, 1 rowaffected
(0.00 sec)
创建视图 purchase_detail,用于查询购买的详细信息:
mysql> create viewpurchase_detail as
selectproduct.name asname,product.price as price,purchase.qty
as qty,product.price
* purchase.qty as total_value fromproduct,purchase whereproduct.product_id=purchase.product_id;
Query OK, 0 rowsaffected
(0.02 sec)
查看视图
mysql>
select * from purchase_detail;
+-------+-------+-----+-------------+
| name | price
| qty | total_value
|
+-------+-------+-----+-------------+
| apple | 5.5
| 10 | 55
|
+-------+-------+-----+-------------+
1 row in set
(0.36 sec)
删除视图
mysql> drop viewif existspruchase_detail;
Query OK, 0 rowsaffected, 1 warning(0.00 sec)
1.什么是视图 ?
视图是存储在数据库中的用于查询的SQL语句,使用视图主要用于两种原因:
1. 安全原因。视图可以隐藏一些数据,如对于社会保险金表,可以用视图只显示
姓名、地址,而不显示社会保险好和工资数等。
2. 另一个原因是可使复杂的查询易于理解和使用。
2. 视图的语法
mysql在处理视图时有两种算法,分别为 merge 和 temptable, 可以指定使用哪种算法。merge是指在处理涉及到视图的操作时,将对视图额操作根据视图的定义进行展开,优点类似于C语言中的宏展开。
mysql>pager more;
mysql>
? create view
Name: 'CREATE VIEW'
Description:
Syntax:
CREATE
[OR
REPLACE]
[ALGORITHM=
{UNDEFINED | MERGE
| TEMPTABLE}]
[DEFINER =
{ user | CURRENT_USER
}]
[SQL SECURITY{ DEFINER
| INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED
| LOCAL] CHECK
OPTION]
该语句能创建新的视图,如果给定了OR REPLACE子句,该语句还能替换已有的视图。select_statement 是一种SELECT语句,它给定了视图的定义。该语句可从基表或其他视图进行选择。
该语句要求具有针对视图的 CREATE VIEW 权限,以及针对有SELECT语句选择的每列上的某些权限。对于在SELECT语句中其他地方使用的列,必须具有select权限。如果还有 OR REPLACE子句,必须在视图上具有DROP权限。
视图属于数据库。在默认情况下,将在当前数据库创建新视图。要想在给定数据库中明确的创建视图,创建时,应将名称指定为db_name.view_name
如:
mysql>create view test.v asselect
* from t
表和视图共享数据库中相同的名称空间,因此,数据库不能包含具有相同名称的表和视图。
视图必须具有唯一的列名。
视图创建成功后,如果需要修改,可以使用alter view修改
mysql>
? alter view
Name: 'ALTER VIEW'
Description:
Syntax:
ALTER
[ALGORITHM=
{UNDEFINED | MERGE
| TEMPTABLE}]
[DEFINER =
{ user | CURRENT_USER
}]
[SQL SECURITY{ DEFINER
| INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED
| LOCAL] CHECK
OPTION
删除视图
mysql>
? drop view
Name: 'DROP VIEW'
Description:
Syntax:
DROP VIEW [IFEXISTS]
view_name [,view_name]
...
[RESTRICT | CASCADE]
可以使用关键字 IF EXISTS 来防止因存在的视图而出错
此外,还可以通过下面的语句查看 view_name 的完整定义
mysql>show create view view_name
3. 视图的使用 ?
对视图的操作与对表的操作一样,可以对其进行查询、修改(有一定的限制)、删除。当通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化,同时,若基本表的数据发生变化,则这种变化也可以自动的反映到视图中。
在mysql中,对视图的使用有如下规则:
1. 视图必须有唯一命名
2. 在mysql中视图的数量没有限制
3. 创建视图必须从管理员那里获得必要的权限
4. 视图支持嵌套,也就是说可以利用其他视图检索出来的数据创建新的视图
5. 在视图中可以使用 OREDR BY,但是如果视图内已经使用该排序子句,则视图的ORDER BY 将覆盖前面的 ORDERBY。
6. 视图不能索引,也不能关联触发器或默认值。
7 视图可以和表同时使用
现在假设我们有一个产品表product和一个购买记录表purchase
ywx@ywx:/opt/mysql5151$ sudo
./bin/mysqld_safe
--defaults-file=./my.cnf
--user=ywx
&
ywx@ywx:/opt/mysql5151$ sudo ./bin/mysql--defaults-file=./my.cnf
mysql> create tableproduct(product_id
int not
null, name varchar(50)
not null,price double
not null);
Query OK, 0 rowsaffected
(0.06 sec)
mysql> insert into productvalues(1,'apple',5.5);
Query OK, 1 rowaffected
(0.40 sec)
mysql> create tablepurchase(id
int not
null, product_id
int not null, qty
int not
null default 0, gen_tim datetime
not null);
Query OK, 0 rowsaffected
(0.04 sec)
mysql> insert into purchasevalues(1,1,10,now());
Query OK, 1 rowaffected
(0.00 sec)
创建视图 purchase_detail,用于查询购买的详细信息:
mysql> create viewpurchase_detail as
selectproduct.name asname,product.price as price,purchase.qty
as qty,product.price
* purchase.qty as total_value fromproduct,purchase whereproduct.product_id=purchase.product_id;
Query OK, 0 rowsaffected
(0.02 sec)
查看视图
mysql>
select * from purchase_detail;
+-------+-------+-----+-------------+
| name | price
| qty | total_value
|
+-------+-------+-----+-------------+
| apple | 5.5
| 10 | 55
|
+-------+-------+-----+-------------+
1 row in set
(0.36 sec)
删除视图
mysql> drop viewif existspruchase_detail;
Query OK, 0 rowsaffected, 1 warning(0.00 sec)
相关文章推荐
- 【MySQL】mysql join语法解析与性能分析
- Mysql时间函数
- 批量更新逗号隔开的名称 (部门里面将多个用逗号隔开的ID转换成用逗号隔开的名称)(mysql)
- mysql 索引类型以及创建
- MySQL 事件
- perl脚本远程连接mysql数据库
- 由浅入深探究mysql索引结构原理、性能分析与优化
- MySQL 的 RowNum 实现
- 关于 mysql中非null判断
- MYSQL 安全添加/移除column 脚本
- mysql常用函数
- MySQL MVCC 设计缺陷
- Data Base mysql批量操作
- MYSQL 取树型数据
- 公司一哥们整理的mysql查询语句优化
- MySQL:日期函数、时间函数总结(MySQL 5.X)
- 使用crontab定时备份Mysql整个数据库的方法
- JBoss+Keepalived+MySQL主从配置详解
- mysql如何查看超出多少天的记录数?
- MySql修改root密码、设置IP访问