美文网首页程序员
SQL-视图(15)

SQL-视图(15)

作者: 小白201808 | 来源:发表于2018-09-01 07:54 被阅读14次

1.含义:

    mysql5.1出现的新特性,本身是一张虚拟表,和普通的表一样使用,它的数据来自于表,通过执行时动态生成。

2.视图和表的区别:

      使用方式     占用物理空间

视图   完全相同     不占用,仅仅保存的是sql逻辑

表     完全相同      占用

3.视图的好处:

1、sql语句提高重用性,效率高
2、和表实现了分离,提高了安全性

一.视图的创建

语法:
CREATE  VIEW  视图名
AS
查询语句;

案例:创建一个视图emp_v1,要求查询部门的最高工资高于12000的部门的信息

mysql> #创建一个视图emp_v1,要求查询部门的最高工资高于12000的部门的信息
mysql> create view emp_v1
-> as
-> select max(salary) mx,department_id  from employees group by department_id having  mx>12000;
Query OK, 0 rows affected (0.08 sec)
mysql> select d.*,m.mx from departments d join emp_v1 m  on m.department_id = d.department_id;
+---------------+-----------------+------------+-------------+----------+
| department_id | department_name | manager_id | location_id | mx       |
+---------------+-----------------+------------+-------------+----------+
|            20 | Mar             |        201 |        1800 | 13000.00 |
|            80 | Sal             |        145 |        2500 | 14000.00 |
|            90 | Exe             |        100 |        1700 | 24000.00 |
+---------------+-----------------+------------+-------------+----------+
3 rows in set (0.15 sec)

注意⚠️:视图我们一般不更新数据,一般只有简单的视图才能实现数据的增删改。大多情况视图只做查询,我们会为视图添加只读权限,或者说一般视图的查询语句都不是简单地查询的一个表的数据,当涉及复杂语句时,视图的数据我们是修改不了的,会报错的。

二.视图的增删改查

1、查看视图的数据 ★(和表的查看一样道理)

SELECT * FROM 视图名;
 mysql> select * from emp_v1;
+----------+---------------+
| mx       | department_id |
+----------+---------------+
| 13000.00 |            20 |
| 14000.00 |            80 |
| 24000.00 |            90 |
+----------+---------------+
3 rows in set (0.00 sec)

mysql> select * from emp_v1 where mx=13000;
+----------+---------------+
| mx       | department_id |
+----------+---------------+
| 13000.00 |            20 |
+----------+---------------+
1 row in set (0.29 sec)

2、插入视图的数据
    insert into 视图名 (列名...) valuse (...)
    
3、修改视图的数据
update 视图名 set 字段 where 筛选条件

4、删除视图的数据
DELETE FROM 视图名;

创建一个简单视图进行简单修改

mysql> create view my_v1
    -> as 
    -> select last_name ,email
    -> from employees;
Query OK, 0 rows affected (0.20 sec)

mysql>#插入数据,添加‘小白’
mysql> insert into my_v1 values('小白','1234@qq.com');
Query OK, 1 row affected (0.19 sec)

mysql> select * from my_v1;
+-------------+-------------+
| last_name   | email       |
+-------------+-------------+
| K_ing       | SKING       |
...
...
| Gietz       | WGIETZ      |
| 小白        | 1234@qq.com |
+-------------+-------------+
108 rows in set (0.00 sec)

#也影响了实际表的数据,我没骗你吧!!!
mysql> select * from employees;
+-------------+-------------+-------------+-------------+--------------------+------------+----------+----------------+------------+---------------+---------------------+
| employee_id | first_name  | last_name   | email       | phone_number       | job_id     | salary   | commission_pct | manager_id | department_id | hiredate            |
+-------------+-------------+-------------+-------------+--------------------+------------+----------+----------------+------------+---------------+---------------------+
|         100 | Steven      | K_ing       | SKING       | 515.123.4567       | AD_PRES    | 24000.00 |           NULL |       NULL |            90 | 1992-04-03 00:00:00 |
...
...
|         207 | NULL        | 小白        | 1234@qq.com | NULL               | NULL       |     NULL |           NULL |       NULL |          NULL | NULL                |
+-------------+-------------+-------------+-------------+--------------------+------------+----------+----------------+------------+---------------+---------------------+
108 rows in set (0.00 sec)

mysql> #修改,将‘小白’名字改为’小黑‘
mysql> update my_v1 set last_name='小黑' where last_name ='小白';
Query OK, 1 row affected (0.18 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from my_v1;
+-------------+-------------+
| last_name   | email       |
+-------------+-------------+
| K_ing       | SKING       |
...
...
| Gietz       | WGIETZ      |
| 小黑        | 1234@qq.com |
+-------------+-------------+
108 rows in set (0.06 sec)

mysql> select * from employees;
+-------------+-------------+-------------+-------------+--------------------+------------+----------+----------------+------------+---------------+---------------------+
| employee_id | first_name  | last_name   | email       | phone_number       | job_id     | salary   | commission_pct | manager_id | department_id | hiredate            |
+-------------+-------------+-------------+-------------+--------------------+------------+----------+----------------+------------+---------------+---------------------+
|         100 | Steven      | K_ing       | SKING       | 515.123.4567       | AD_PRES    | 24000.00 |           NULL |       NULL |            90 | 1992-04-03 00:00:00 |
...
...
|         207 | NULL        | 小黑        | 1234@qq.com | NULL               | NULL       |     NULL |           NULL |       NULL |          NULL | NULL                |
+-------------+-------------+-------------+-------------+--------------------+------------+----------+----------------+------------+---------------+---------------------+
108 rows in set (0.01 sec)

#删除‘小黑’
mysql> delete from my_v1 where last_name = '小黑';
Query OK, 1 row affected (0.14 sec)

#查看会发现没有小黑的信息了就剩107条记录了。
mysql> select * from my_v1;
+-------------+----------+
| last_name   | email    |
+-------------+----------+
| K_ing       | SKING    |
...
...
| Gietz       | WGIETZ   |
+-------------+----------+
107 rows in set (0.00 sec)

mysql> select * from employees;
+-------------+-------------+-------------+----------+--------------------+------------+----------+----------------+------------+---------------+---------------------+
| employee_id | first_name  | last_name   | email    | phone_number       | job_id     | salary   | commission_pct | manager_id | department_id | hiredate            |
+-------------+-------------+-------------+----------+--------------------+------------+----------+----------------+------------+---------------+---------------------+
|         100 | Steven      | K_ing       | SKING    | 515.123.4567       | AD_PRES    | 24000.00 |           NULL |       NULL |            90 | 1992-04-03 00:00:00 |
...
...
|         206 | William     | Gietz       | WGIETZ   | 515.123.8181       | AC_ACCOUNT |  8300.00 |           NULL |        205 |           110 | 2016-03-03 00:00:00 |
+-------------+-------------+-------------+----------+--------------------+------------+----------+----------------+------------+---------------+---------------------+
107 rows in set (0.00 sec)





四.某些视图数据不能更新

包含以下关键字的sql语句:分组函数、distinct、group  by、having、union或者union all
常量视图
Select中包含子查询
join
from一个不能更新的视图
where子句的子查询引用了from子句中的表

五.视图逻辑的更新

#方式一:
    CREATE OR REPLACE VIEW 视图名
    AS
    查询语句
    CREATE OR REPLACE VIEW test_v1
    AS
    SELECT last_name FROM employees
    WHERE employee_id>100;
#方式二:
ALTER VIEW 视图名
AS
查询语句
    ALTER VIEW test_v1
    AS
    SELECT employee_id FROM employees;
    
    SELECT * FROM test_v1;

六.视图的删除

DROP VIEW 视图名1,视图名2 ...视图名n;(可以删除多个)

七.视图结构的查看

1.DESC 视图名;

mysql> desc emp_v1;
+---------------+--------------+------+-----+---------+-------+
| Field         | Type         | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+-------+
| mx            | double(10,2) | YES  |     | NULL    |       |
| department_id | int(4)       | YES  |     | NULL    |       |
+---------------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

2.SHOW CREATE VIEW 视图名;(查询出的内容很详细)

mysql> show create view emp_v1;
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| View   | Create View                                                                                                                                                                                                                                                     | character_set_client | collation_connection |
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| emp_v1 | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `emp_v1` AS select max(`employees`.`salary`) AS `mx`,`employees`.`department_id` AS `department_id` from `employees` group by `employees`.`department_id` having (`mx` > 12000) | utf8                 | utf8_general_ci      |
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
1 row in set (0.06 sec)

注:这是本人的学习笔记及练习,如果有错误的地方望指出一起讨论,谢谢!

相关文章

  • SQL-视图(15)

    1.含义: 2.视图和表的区别: 3.视图的好处: 一.视图的创建 案例:创建一个视图emp_v1,要求查询部门的...

  • sql-视图

    1,什么是视图 视图(view)是一种虚拟的表,并不在数据库中实际存在。通俗的来说,视图就是执行select语句后...

  • SQL-视图

    视图本质就是对查询的封装。 create view 视图名称 as select语句; (其实存储过程也是对查询的...

  • 一、数据库之SQL语句

    一、SQL创表 二、SQL-插入 三、SQL-修改 四、SQL-删除 五、SQL-查询 以上是SQL语句常用的用法...

  • sql

    sql-基础sql-基础查询-1sql-基础查询-2sql-更新 概览 数据库(Database,DB):将大量数...

  • 15、视图

    视图: 是一个封装了各种复杂查询的语句,就称为视图。 创建视图 CREATE VIEW视图名字(字段) AS 子查...

  • sql-将日期转换为YYYYMM格式 几种方式

    sql-将日期转换为YYYYMM格式SELECT CONVERT(nvarchar(6), GETDATE(), ...

  • B15. Trend View-1

    B15趋势视图 Trend(趋势)视图用于查看Exasmoc输入/输出数据的实际DCS趋势。此视图每页可以显示8笔...

  • oracle 常用查询语言

    SQL- Data Query Language 1. select 2. where 3. distinct 4...

  • Ubuntu下mysql的常用命令,MySQL数据库的基本操作命

    一、mysql服务操作 0.0 进入mysql $mysql -uroot -p 0、查看数据库版本 sql-> ...

网友评论

    本文标题:SQL-视图(15)

    本文链接:https://www.haomeiwen.com/subject/jfcrwftx.html