精华内容
下载资源
问答
  • 数据库 之视图基本操作SQL语句

    千次阅读 2020-02-11 17:26:08
    一、创建视图 语句格式 CREATE VIEW <视图名> [(<列名> [,<列名>]…)] AS <子查询> [WITH CHECK OPTION]; 1、子查询可以是任意的SELECT语句,是否可以含有ORDER BY子句和DISTINCT短语,则...
    一、创建视图

    语句格式

    CREATE  VIEW  <视图名>  [(<列名>  [,<列名>])]
    AS  <子查询>
    [WITH  CHECK  OPTION];
    

    1、子查询可以是任意的SELECT语句,是否可以含有ORDER BY子句和DISTINCT短语,则决定具体系统的实现
    2、WITH CHECK OPTION:对视图进行UPDATE,INSERT和DELETE操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)

    注:修改基表的结构后,可能导致表与视图的映象关系被破坏,从而导致该视图不能正确工作

    例1:建立信息系学生的视图

    CREATE VIEW IS_Student
    AS SELECT Sno,Sname,Sage FROM Student WHERE  Sdept= 'IS';
    

    例2:建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有信息系的学生

    CREATE VIEW IS_Student
    AS SELECT Sno,Sname,Sage FROM  Student WHERE  Sdept= 'IS'
    WITH CHECK OPTION;
    
    1、基于多个基表的视图

    例3:建立信息系选修了1号课程的学生的视图(包括学号、姓名、成绩)

    CREATE VIEW IS_S1(Sno,Sname,Grade)
    AS SELECT Student.Sno,Sname,Grade FROM  Student,SC
    WHERE  Sdept= 'IS' AND Student.Sno=SC.Sno AND SC.Cno= '1';
    
    2、基于视图的视图

    例4:建立信息系选修了1号课程且成绩在90分以上的学生的视图

    // IS_S2 基于视图IS_s1:FROM  IS_S1
    CREATE VIEW IS_S2
    AS SELECT Sno,Sname,Grade FROM  IS_S1  WHERE  Grade>=90;
    
    3、带表达式的视图

    例5:定义一个反映学生出生年份的视图

    // 表达式:2014-Sage
    CREATE VIEW BT_S(Sno,Sname,Sbirth)
    AS SELECT Sno,Sname,2014-Sage FROM  Student;
    
    4、分组视图

    例6:将学生的学号及平均成绩定义为一个视图

    // 分组:GROUP BY
    CREAT  VIEW S_G(Sno,Gavg)
    AS SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno;
    
    二、删除视图

    语句的格式:

    DROP  VIEW  <视图名>[CASCADE];
    
    • 该语句从数据字典中删除指定的视图定义
    • 如果该视图上还导出了其他视图,使用CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除
    • 删除基表时,由该基表导出的所有视图定义都必须显式地使用DROP VIEW语句删除
    三、查询视图

    查询视图与查询基本表相同
    例子:在信息系学生的视图中找出年龄小于20岁的学生

    SELECT Sno,Sage FROM IS_Student WHERE Sage<20;
    
    四、更新视图

    更新视图和更新基本表相同

    注:一些视图是不可更新的——当对视图的更新无法转换成对基本表SC的更新时,如修改平均成绩视图中某个学生的平均成绩不可实现

    例:

    // 插入
    INSERT INTO IS_Student VALUES(201215129,’赵新’,20);
    // 修改
    UPDATE IS_Student SET Sname= '刘辰' WHERE Sno= ' 201215122 ';
    // 删除
    DELETE FROM IS_Student WHERE Sno= ' 201215129 ';
    
    展开全文
  • MySQL视图(view)基本用法

    千次阅读 2019-11-24 21:28:28
    MySQL视图(view)基本用法 MySQL中的视图(view)是一种虚拟表,其内容由查询定义,是一个逻辑表,本身并不包含数据。视图看起来和真实的表完全相同,但其中的数据来自定义视图时用到的基本表,并且在打开视图时...

    MySQL视图(view)基本用法

    MySQL中的视图(view)是一种虚拟表,其内容由查询定义,是一个逻辑表,本身并不包含数据。视图看起来和真实的表完全相同,但其中的数据来自定义视图时用到的基本表,并且在打开视图时动态生成。

    视图可以在基本表上定义,也可以使用其他视图定义。与直接操作基本表相比,视图具备以下优点:
    (1)简化操作:通过视图可以使用户将注意力集中在他所关心的数据上。使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件。
    (2)提高数据的安全性:在设计数据库时可以针对不同的用户定义不同的视图,使用视图的用户只能访问他们被允许查询的结果集。
    (3)数据独立:视图的结构定义好之后,如果增加新的关系或对原有的关系增加新的字段对用户访问的数据都不会造成影响。

    一、创建视图的语法

    创建视图的基本语法如下:

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

    说明:

    1、OR REPLACE:表示该语句能够替换已有视图;
    2、ALGORITHM:可选参数,表示视图选择的算法,默认算法是UNDEFINED;
    3、view_name:要创建的视图名称;
    4、column_list:可选参数,表示视图的字段列表。如果省略,则使用select语句中的字段列表;
    5、AS select_statement:创建视图的select语句;
    6、WITH CHECK OPTION:表示更新视图时要保证该视图的WHERE子句为【真】。比如:定义视图create view v1 as select * from salary>5000;如果要更新视图,则必须保证salary字段的值在5000以上,否则报错;

    二、数据准备

    创建两张表:部门(dept)和员工(emp),并插入数据,代码如下:

    create table dept(
        dept_id int primary key auto_increment comment '部门编号',
        dept_name char(20) comment '部门名称'
    );
    insert into dept(dept_name) values('销售部'),('财务部'),('生产部'),('人事部');
    
    create table emp(
        emp_id int primary key auto_increment comment '员工号',
        emp_name char(20) not null default '' comment '员工姓名',
        gender char(2) not null default '男' comment '性别',
        birth datetime not null default '1990-1-1' comment '出生日期',
        salary decimal(10,2) not null default 0 comment '工资',
        address varchar(200) not null default '' comment '通讯地址',
        dept_id int comment '部门编号'
    );
    
    create index idx_name on emp(emp_name);
    create index idx_birth on emp(birth);
    create index idx_deptid_name on emp(dept_id,emp_name);
    
    insert into emp(emp_name,gender,birth,salary,address,dept_id) 
    values('张晓红','女','1980-1-23',5800,'河南省郑州市中原路10号',1),
    ('张静静','女','1987-10-3',5400,'河南省新乡市平原路38号',1),
    ('王云飞','男','1992-11-15',5600,'河南省新乡市人民路28号',1),
    ('王鹏飞','男','1987-10-1',6800,'河南省新乡市东明大道12号',1),
    ('王大鹏','男','1989-2-11',5900,'河南省郑州市东风路15号',1),
    ('王萌萌','女','1986-12-30',5000,'河南省开封市五一路14号',2),
    ('王大光','男','1988-11-8',6200,'河南省开封市八一路124号',2),
    ('王小明','男','1998-1-3',4800,'河南省驻马店市雪松路128号',2),
    ('王娜娜','女','1994-3-5',5200,'河南省驻马店市车站路2号',2),
    ('刘云飞','男','1992-8-13',6800,'河南省南阳市民生路255号',3),
    ('张陆军','男','1991-9-6',6200,'河南省南阳市张仲景路14号',3);
    

    三、创建视图

    (一)创建一个单表视图

    mysql> create or replace view v_emp_dept_id_1 as select emp_name,address 
           from emp where dept_id=1;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from v_emp_dept_id_1;
    +-----------+-------------------------------------+
    | emp_name  | address                             |
    +-----------+-------------------------------------+
    | 张晓红    | 河南省郑州市中原路10号              |
    | 张静静    | 河南省新乡市平原路38号              |
    | 王云飞    | 河南省新乡市人民路28号              |
    | 王大鹏    | 河南省郑州市东风路15号              |
    | 王鹏飞    | 河南省新乡市东明大道12号            |
    +-----------+-------------------------------------+
    5 rows in set (0.00 sec)
    

    (二)创建一个多表视图

    mysql>  create or replace view v_emp_dept as select emp_name,address,dept_name 
            from emp join dept on emp.dept_id=dept.dept_id where dept.dept_id=1;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from v_emp_dept;
    +-----------+-------------------------------------+-----------+
    | emp_name  | address                             | dept_name |
    +-----------+-------------------------------------+-----------+
    | 张晓红    | 河南省郑州市中原路10号              | 销售部    |
    | 张静静    | 河南省新乡市平原路38号              | 销售部    |
    | 王云飞    | 河南省新乡市人民路28号              | 销售部    |
    | 王大鹏    | 河南省郑州市东风路15号              | 销售部    |
    | 王鹏飞    | 河南省新乡市东明大道12号            | 销售部    |
    +-----------+-------------------------------------+-----------+
    5 rows in set (0.00 sec)
    

    (三)指定视图中的列名

    mysql>  create or replace view v_dept_emp_count(dept_name,emp_count,avg_salary) 
            as select dept_name,count(*),avg(salary) 
            from empp join dept on emp.dept_id=dept.dept_id group by dept.dept_name;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> select * from v_dept_emp_count;
    +-----------+-----------+-------------+
    | dept_name | emp_count | avg_salary  |
    +-----------+-----------+-------------+
    | 生产部    |         2 | 6500.000000 |
    | 财务部    |         4 | 5300.000000 |
    | 销售部    |         5 | 5900.000000 |
    +-----------+-----------+-------------+
    3 rows in set (0.00 sec)
    

    (四)指定WITH CHECK OPTION参数

    mysql> create view v_emp_dept_produce as select emp_name,salary from emp
        -> where dept_id=(select dept_id from dept where dept_name='生产部')
        -> with check option;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> select * from v_emp_dept_produce;
    +-----------+---------+
    | emp_name  | salary  |
    +-----------+---------+
    | 刘云飞    | 6800.00 |
    | 张陆军    | 6200.00 |
    +-----------+---------+
    2 rows in set (0.01 sec)
    

    四、查看视图

    (一)利用show tables查看视图名称

    mysql> show tables;
    +--------------------+
    | Tables_in_test     |
    +--------------------+
    | area               |
    | dept               |
    | emp                |
    | goods              |
    | orders             |
    | orders_logs        |
    | t1                 |
    | v1                 |
    | v_dept_emp_count   |
    | v_emp_dept         |
    | v_emp_dept_id_1    |
    | v_emp_dept_produce |
    +--------------------+
    12 rows in set (0.00 sec)
    

    (二)利用desc查看视图的字段信息

    mysql> desc v_emp_dept;
    +-----------+--------------+------+-----+---------+-------+
    | Field     | Type         | Null | Key | Default | Extra |
    +-----------+--------------+------+-----+---------+-------+
    | emp_name  | char(20)     | NO   |     |         |       |
    | address   | varchar(200) | NO   |     |         |       |
    | dept_name | char(20)     | YES  |     | NULL    |       |
    +-----------+--------------+------+-----+---------+-------+
    3 rows in set (0.00 sec)
    

    (三)利用show table status语句查看视图的基本信息

    mysql> show table status like 'v_emp_dept'\G
    *************************** 1. row ***************************
               Name: v_emp_dept
             Engine: NULL
            Version: NULL
         Row_format: NULL
               Rows: NULL
     Avg_row_length: NULL
        Data_length: NULL
    Max_data_length: NULL
       Index_length: NULL
          Data_free: NULL
     Auto_increment: NULL
        Create_time: NULL
        Update_time: NULL
         Check_time: NULL
          Collation: NULL
           Checksum: NULL
     Create_options: NULL
            Comment: VIEW
    1 row in set (0.01 sec)
    

    (四)利用show create view命令查看视图的详细信息

    mysql> show create view v_emp_dept\G
    *************************** 1. row ***************************
                    View: v_emp_dept
             Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v_emp_dept` AS select `emp`.`emp_name` AS `emp_name`,`emp`.`address` AS `address`,`dept`.`dept_name` AS `dept_name` from (`emp` join `dept` on((`emp`.`dept_id` = `dept`.`dept_id`))) where (`dept`.`dept_id` = 1)
    character_set_client: utf8
    collation_connection: utf8_general_ci
    1 row in set (0.00 sec)
    

    五、修改视图

    (一)使用create or replace view命令修改视图

    mysql> create or replace view v_emp_dept as select emp_name,address,salary,dept_name 
        -> from emp join dept on emp.dept_id=dept.dept_id where dept.dept_id=1
        -> with check option;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from v_emp_dept;
    +-----------+-------------------------------------+---------+-----------+
    | emp_name  | address                             | salary  | dept_name |
    +-----------+-------------------------------------+---------+-----------+
    | 张晓红    | 河南省郑州市中原路10号              | 5800.00 | 销售部    |
    | 张静静    | 河南省新乡市平原路38号              | 5400.00 | 销售部    |
    | 王云飞    | 河南省新乡市人民路28号              | 5600.00 | 销售部    |
    | 王大鹏    | 河南省郑州市东风路15号              | 5900.00 | 销售部    |
    | 王鹏飞    | 河南省新乡市东明大道12号            | 6800.00 | 销售部    |
    +-----------+-------------------------------------+---------+-----------+
    5 rows in set (0.00 sec)
    

    (二)使用alter view命令修改视图

    mysql> alter view v_emp_dept as select emp_name,address,salary,dept_name 
        -> from emp join dept on emp.dept_id=dept.dept_id where dept.dept_id=1
        -> order by salary desc with check option;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from v_emp_dept;
    +-----------+-------------------------------------+---------+-----------+
    | emp_name  | address                             | salary  | dept_name |
    +-----------+-------------------------------------+---------+-----------+
    | 王鹏飞    | 河南省新乡市东明大道12号            | 6800.00 | 销售部    |
    | 王大鹏    | 河南省郑州市东风路15号              | 5900.00 | 销售部    |
    | 张晓红    | 河南省郑州市中原路10号              | 5800.00 | 销售部    |
    | 王云飞    | 河南省新乡市人民路28号              | 5600.00 | 销售部    |
    | 张静静    | 河南省新乡市平原路38号              | 5400.00 | 销售部    |
    +-----------+-------------------------------------+---------+-----------+
    5 rows in set (0.00 sec)
    

    六、更新视图数据

    因为视图时虚拟表,所以更新视图中的数据实际上是更新创建视图时用到的基本表中的数据。

    (一)更新单表视图

    mysql> select * from dept;
    +---------+-----------+
    | dept_id | dept_name |
    +---------+-----------+
    |       1 | 销售部    |
    |       2 | 财务部    |
    |       3 | 生产部    |
    |       4 | 人事部    |
    +---------+-----------+
    4 rows in set (0.00 sec)
    
    mysql> select * from emp;
    +--------+-----------+--------+---------------------+---------+--------------------------------------+---------+
    | emp_id | emp_name  | gender | birth               | salary  | address                              | dept_id |
    +--------+-----------+--------+---------------------+---------+--------------------------------------+---------+
    |      1 | 张晓红    | 女     | 1980-01-23 00:00:00 | 5800.00 | 河南省郑州市中原路10号               |       1 |
    |      2 | 张静静    | 女     | 1987-10-03 00:00:00 | 5400.00 | 河南省新乡市平原路38号               |       1 |
    |      3 | 王云飞    | 男     | 1992-11-15 00:00:00 | 5600.00 | 河南省新乡市人民路28号               |       1 |
    |      4 | 王鹏飞    | 男     | 1987-10-01 00:00:00 | 6800.00 | 河南省新乡市东明大道12号             |       1 |
    |      5 | 王大鹏    | 男     | 1989-02-11 00:00:00 | 5900.00 | 河南省郑州市东风路15号               |       1 |
    |      6 | 王萌萌    | 女     | 1986-12-30 00:00:00 | 5000.00 | 河南省开封市五一路14号               |       2 |
    |      7 | 王大光    | 男     | 1988-11-08 00:00:00 | 6200.00 | 河南省开封市八一路124号              |       2 |
    |      8 | 王小明    | 男     | 1998-01-03 00:00:00 | 4800.00 | 河南省驻马店市雪松路128号            |       2 |
    |      9 | 王娜娜    | 女     | 1994-03-05 00:00:00 | 5200.00 | 河南省驻马店市车站路2号              |       2 |
    |     10 | 刘云飞    | 男     | 1992-08-13 00:00:00 | 6800.00 | 河南省南阳市民生路255号              |       3 |
    |     11 | 张陆军    | 男     | 1991-09-06 00:00:00 | 6200.00 | 河南省南阳市张仲景路14号             |       3 |
    +--------+-----------+--------+---------------------+---------+--------------------------------------+---------+
    11 rows in set (0.00 sec)
    
    mysql> create view v_emp_1 as select emp_name,salary,address 
           from emp where salary>6000;   --不带 with check option 参数
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from v_emp_1;
    +-----------+---------+-------------------------------------+
    | emp_name  | salary  | address                             |
    +-----------+---------+-------------------------------------+
    | 王鹏飞    | 6800.00 | 河南省新乡市东明大道12号            |
    | 王大光    | 6200.00 | 河南省开封市八一路124号             |
    | 刘云飞    | 6800.00 | 河南省南阳市民生路255号             |
    | 张陆军    | 6200.00 | 河南省南阳市张仲景路14号            |
    +-----------+---------+-------------------------------------+
    4 rows in set (0.00 sec)
    
    mysql> update v_emp_1 set salary=3000 where emp_name='王鹏飞';
    Query OK, 1 row affected (0.01 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> select * from v_emp_1;
    +-----------+---------+-------------------------------------+
    | emp_name  | salary  | address                             |
    +-----------+---------+-------------------------------------+
    | 王大光    | 6200.00 | 河南省开封市八一路124号             |
    | 张陆军    | 6200.00 | 河南省南阳市张仲景路14号            |
    | 刘云飞    | 6800.00 | 河南省南阳市民生路255号             |
    +-----------+---------+-------------------------------------+
    3 rows in set (0.00 sec)
    
    mysql> select * from emp;
    +--------+-----------+--------+---------------------+---------+--------------------------------------+---------+
    | emp_id | emp_name  | gender | birth               | salary  | address                              | dept_id |
    +--------+-----------+--------+---------------------+---------+--------------------------------------+---------+
    |      1 | 张晓红    | 女     | 1980-01-23 00:00:00 | 5800.00 | 河南省郑州市中原路10号               |       1 |
    |      2 | 张静静    | 女     | 1987-10-03 00:00:00 | 5400.00 | 河南省新乡市平原路38号               |       1 |
    |      3 | 王云飞    | 男     | 1992-11-15 00:00:00 | 5600.00 | 河南省新乡市人民路28号               |       1 |
    |      4 | 王鹏飞    | 男     | 1987-10-01 00:00:00 | 3000.00 | 河南省新乡市东明大道12号             |       1 |
    |      5 | 王大鹏    | 男     | 1989-02-11 00:00:00 | 5900.00 | 河南省郑州市东风路15号               |       1 |
    |      6 | 王萌萌    | 女     | 1986-12-30 00:00:00 | 5000.00 | 河南省开封市五一路14号               |       2 |
    |      7 | 王大光    | 男     | 1988-11-08 00:00:00 | 6200.00 | 河南省开封市八一路124号              |       2 |
    |      8 | 王小明    | 男     | 1998-01-03 00:00:00 | 4800.00 | 河南省驻马店市雪松路128号            |       2 |
    |      9 | 王娜娜    | 女     | 1994-03-05 00:00:00 | 5200.00 | 河南省驻马店市车站路2号              |       2 |
    |     10 | 刘云飞    | 男     | 1992-08-13 00:00:00 | 6800.00 | 河南省南阳市民生路255号              |       3 |
    |     11 | 张陆军    | 男     | 1991-09-06 00:00:00 | 6200.00 | 河南省南阳市张仲景路14号             |       3 |
    +--------+-----------+--------+---------------------+---------+--------------------------------------+---------+
    11 rows in set (0.00 sec)
    
    
    mysql> create or replace view v_emp_2 as select emp_name,salary,address 
        ->        from emp where salary>5500 with check option;  --添加 with check option 参数
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> select * from v_emp_2;
    +-----------+---------+-------------------------------------+
    | emp_name  | salary  | address                             |
    +-----------+---------+-------------------------------------+
    | 张晓红    | 5800.00 | 河南省郑州市中原路10号              |
    | 王云飞    | 5600.00 | 河南省新乡市人民路28号              |
    | 王大鹏    | 5900.00 | 河南省郑州市东风路15号              |
    | 王大光    | 6200.00 | 河南省开封市八一路124号             |
    | 刘云飞    | 6800.00 | 河南省南阳市民生路255号             |
    | 张陆军    | 6200.00 | 河南省南阳市张仲景路14号            |
    +-----------+---------+-------------------------------------+
    6 rows in set (0.00 sec)
    
    mysql> update v_emp_2 set salary=3000 where emp_name='王云飞';
    ERROR 1369 (HY000): CHECK OPTION failed 'test.v_emp_2'
    ---由于违反了视图定义的条件,则更新失败
    

    (二)更新多表视图

    mysql> create view v_emp_dept_11 as select emp_name,salary,dept.* 
    from emp,dept where emp.dept_id=dept.dept_id;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> select * from v_emp_dept_11;
    +-----------+---------+---------+-----------+
    | emp_name  | salary  | dept_id | dept_name |
    +-----------+---------+---------+-----------+
    | 张晓红    | 5800.00 |       1 | 销售部    |
    | 张静静    | 5400.00 |       1 | 销售部    |
    | 王云飞    | 5600.00 |       1 | 销售部    |
    | 王鹏飞    | 3000.00 |       1 | 销售部    |
    | 王大鹏    | 5900.00 |       1 | 销售部    |
    | 王萌萌    | 5000.00 |       2 | 财务部    |
    | 王大光    | 6200.00 |       2 | 财务部    |
    | 王小明    | 4800.00 |       2 | 财务部    |
    | 王娜娜    | 5200.00 |       2 | 财务部    |
    | 刘云飞    | 6800.00 |       3 | 生产部    |
    | 张陆军    | 6200.00 |       3 | 生产部    |
    +-----------+---------+---------+-----------+
    11 rows in set (0.00 sec)
    
    mysql> update v_emp_dept_11 set salary=10000 where emp_name='张静静';
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> update v_emp_dept_11 set dept_name='销售事业部' where emp_name='张静静';
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> select * from v_emp_dept_11;
    +-----------+----------+---------+-----------------+
    | emp_name  | salary   | dept_id | dept_name       |
    +-----------+----------+---------+-----------------+
    | 张晓红    |  5800.00 |       1 | 销售事业部      |
    | 张静静    | 10000.00 |       1 | 销售事业部      |
    | 王云飞    |  5600.00 |       1 | 销售事业部      |
    | 王鹏飞    |  3000.00 |       1 | 销售事业部      |
    | 王大鹏    |  5900.00 |       1 | 销售事业部      |
    | 王萌萌    |  5000.00 |       2 | 财务部          |
    | 王大光    |  6200.00 |       2 | 财务部          |
    | 王小明    |  4800.00 |       2 | 财务部          |
    | 王娜娜    |  5200.00 |       2 | 财务部          |
    | 刘云飞    |  6800.00 |       3 | 生产部          |
    | 张陆军    |  6200.00 |       3 | 生产部          |
    +-----------+----------+---------+-----------------+
    11 rows in set (0.00 sec)
    

    七、删除视图

    drop view [if exists] view_name;
    drop view v_emp_dept_11;
    
    展开全文
  • UML基本概念——动态视图

    千次阅读 2020-08-23 23:50:20
    内容来源:《Thinking in UML》第版 4.2 动态视图 故名思义,动态视图是描述事物动态行为的。需要注意的是,动态视图不能够独立存在,它必须特指一个静态视图或UML元素,说明在静态视图规定的事物结构下它们的...

    内容来源:《Thinking in UML》第二版。仅供交流学习,若涉及版权,会立即删除。

    4.2 动态视图

    故名思义,动态视图是描述事物动态行为的。需要注意的是,动态视图不能够独立存在,它必须特指一个静态视图或UML元素,说明在静态视图规定的事物结构下它们的动态行为。本节讲述的动态视图包括活动图、状态图、时序图和协作图。

    4.2.1 活动图

    活动图描述了为了完成某一个目标需要做的活动以及这些活动的执行顺序。UML中有两个层面的活动图,一种用于描述用例场景,另一种用于描述对象交互。在正式介绍活动图之前,让我们先来讨论一下有关活动图的一些争议。活动图被引入UML中是有争议的,因为活动图实际上描述的是业务流程,是一种过程化的分析方法,很多人担心面向过程的活动图引入会导致面向对象的类职责的混乱,这种担心是有道理的。在1.1.3面向对象方法一节中我们讲过,在面向对象的眼中是没有业务流程这种东西的,所谓流程只不过是在某个外部力量推动下对象之间相互交流的一个过程,它只是“瞬时”的。如果从活动图的观点来描述业务,实际上是不能直接看到对象是如何发挥作用的。这样在观念上很容易导致对象独立性被破坏,例如有的设计者可能会试图得到一个从头到尾参与了整个业务流程的“对象”。

    但是,在UML中引入活动图可能也是无奈之举,因为在1.1.4面向对象的困难一节中我们提到过从现实世界映射到对象世界有着诸多困难。面向对象要求对象越独立、封装度越高越好,可是面向对象越纯粹,我们越难以理解这些对象将会干什么。正所谓上帝什么都能做,但其实他什么也没有做;纯粹的对象结构也许能做无数的事情,但实际上我们只需要明确其中的一件。我们面临着这样一个矛盾,既要保持面向对象观点中对象的独立性,又要保持现实世界中业务目标的过程化描述。活动图的引入解决了业务目标过程化描述,但也给对象分析造成了混乱。虽然如此,活动图在描述用例场景时仍然是十分有效的工具,关键还是建模者自己要避免被过程化的观点所困扰,而不必忌讳使用活动图。

    笔者要提示读者,在使用活动图时,要随时保持清醒的头脑,活动图只是我们用来描述业务目标的达成过程并借此来发现对象的工具,它不是我们的分析目标,也不是编程的依据,它只是对象的应用场景之一。我们使用活动图来描述用例场景,帮助我们认识问题领域,从问题领域中发现关键的对象,然后就应该把活动图中的流程忘掉,而专心研究关键对象的特性。最后,再来验证一下这些关键对象的某个交互结果是否的确能够达到用例场景所描述的业务目标。

    4.2.1.1 用例活动图

    4.2.1.2 对象活动图

    4.2.1.3 泳道

    4.2.1.4 业务场景建模

    4.2.1.5 用例场景建模

    4.2.2 状态图

    4.2.3 时序图

    时序图用于描述按时间顺序排列的对象之间的交互模式;它按照参与交互的对象所具有的“生命线”和它们相互发送的消息来显示这些对象。在时序图中包含对象和主角实例,以及说明它们如何交互的消息。时序图描述了在参与交互的对象中所发生的事件(从激活的角度来说明),以及这些对象如何通过相互发送消息进行通信。可以为用例事件流的各种不同形式制作时序图。以上是官方文档对时序图的定义。通常我们使用时序图来描述用例实现,通过贡献于该用例实现的对象之间的交互来说明用例是如何被对象实现的。使用时序图来描述用例实现是一种从现实世界到对象世界的映射方法,它对我们确定对象职责和接口有着显著的作用。而对象的核心就是职责和接口。时序图与协作图是可以互相转换的,与协作图不同的是,时序图强调消息事件的发生顺序,更方便于阐述事件流的过程;但是时序图却难以表达对象之间的关系。在4.1.2类图一节中我们提到过类有三个层次的观点:概念层、说明层和实现层,它们分别对应于业务建模阶段、概念建模阶段和设计建模阶段。相应的,也可以在这三个层次上分别对业务实体对象、分析类对象和设计类对象绘制时序图。

    下面就结合4.1.2类图一节中三个层次的静态类图来看看时序图如何应用于这三个层次,并且实现网上购物这一业务目标。相应的,三个层次的时序图是业务模型时序图、概念模型时序图和设计模型时序图。

    4.2.3.1 业务模型时序图

    业务模型时序图用于为领域模型中的业务实体交互建模,其目标是实现业务用例。在绘制业务实体时序图之前,你应当已经绘制了业务用例实现过程的活动图。在4.2.1.5用例场景建模一节中提到,活动图可以帮助我们发现业务实体,实际上,如果之前已经有了活动图再来绘制业务实体时序图时,你会发现有迹可循,非常容易。图4.18展示了图4.7所示业务实体如何实现网上购物过程的时序图。这个时序图对这些业务实体对象如何参与业务提供了非常直观的描述,从图中我们可以非常容易地分辨出对象的职责、生命周期和会话过程。对业务模型时序图的理解将有助于我们了解业务架构。

     ■ 对象表示参与交互的对象。

    每个对象都带有一条生命周期线,对象被激活(创建或者被引用)时,生命周期线上会出现一个长条(会话),表示对象的存在。

    ■ 生命周期线

    生命周期线表示对象的存在,当对象被激活(创建或者被引用)时,生命周期线上出现会话,表示对象参与了这个会话。

    ■ 消息

    消息由一个对象的生命周期线指向另一个对象的生命周期线。如果消息指到空白的生命周期线,将创建一个新的会话;如果消息指到已有的会话,表示该对象延续已有会话。与实际的编程环境相似,消息有许多不同的类型。[插图]为简单消息。简单消息适用于大多数情况。它不强调消息的类型,仅表示一个交互。一般情况下使用简单消息就足够了,除非在设计模型的类交互时需要强调消息类型时才使用其他消息类型。

    为返回消息。返回消息为源消息的返回体,而非新的消息。一般来说不需要为每个源消息都绘制返回消息,一方面因为默认情况下源消息都有返回,另一方面太多的返回消息会使图变得更复杂。

    为同步消息。同步消息表示发出消息的对象将停止所有后续动作一直等到接收消息方响应。同步消息将阻塞源消息对象的所有行为。同步消息最为常用,通常程序之间的方法调用都是同步消息。

    为限时消息。限时消息是同步消息的一种特殊情况。源消息对象发出消息后将等待响应一段时间,在限定时间内还没有响应时,源消息对象将取消阻塞状态而执行后续操作。限时消息也很常用,例如访问一个网站,在限定时间内没有响应时浏览器会显示“找不到指定网址”的信息。

    为异步消息。异步消息表示源消息对象发出消息后不等待响应,而可以继续执行其他操作。异步消息一般需要消息中间件的支持,如JMS、MQ等。Rose里还定义了其他一些类型的消息,但这里介绍的这些消息类型已经足够了。笔者建议,在建模过程尤其是业务和概念模型中没有必要花费时间在研究消息类型上。图形简洁才能更有表达力,太多的细节只会复杂化,相反不利于理解。

    ■ 会话

    会话表示一次交互,在会话过程中所有对象共享一个上下文环境。例如事务上下文、安全上下文等。

    ■ 销毁

    销毁绘制在生命周期线上,表示对象生命周期的终止。虽然示例图中绘制了,但销毁也没有必要强调。最后,绘制业务模型时序图时要注意:第一,时序图以达成业务目标为准则;第二,这个阶段处于业务阶段,使用的描述语言应当采用业务术语;第三,时序图表达的内容会对将来的分析设计带来帮助,但是相对于编码实现来讲由于太粗略而不能够作为依据。

    4.2.3.2 概念模型时序图

    概念阶段的时序图采用分析类来绘制,目标同样是实现业务用例。但是,由于分析类本身代表了系统原型,所以这个阶段的时序图已经带有计算机理解。概念用例时序图通常是依据业务模型场景图来绘制的,它将业务模型场景用分析类重新绘制一遍,这样,既保留了实际业务需求,又得到了计算机实现的基本理念。图4.19展示了图4.8所示的说明层类图的一个时序图片段,描述了分析类实现查询商品的过程。

            请注意对比图4.8,我们看到其中的计算机实现理念的引入。这时的时序图依稀已经有了实现的影子。实际上,分析类所展示出来的已经是系统实现的原型,在设计模型阶段要做的工作就是选择适合的实现方式来实现这个蓝图。

    4.2.3.3 设计模型时序图

    设计模型时序图使用设计类作为对象绘制。目标是实现概念模型中的某个事件流,一般以一个完整交互为单位,消息细致到方法级别。显然,在实际工作中我们很难为所有的交互都绘制时序图,那将是一个巨大的工作量。好在统一方法是讲究架构驱动的,并且近几年来不使用现成软件框架的软件项目已经很少了,所以笔者建议在设计模型阶段,只需要用框架中的关键类描述典型的交互场景即可,不需要为每一个交互都绘制时序图。例如我们只需要绘制通过框架来进行增删改查的事件流,具体的查询都遵循同样的编程模型,因此参考框架事件流即可,不需要一一绘制。

    为了保证软件实现满足需求,省略了大量设计模型时序图的同时,要求有更多的概念模型时序图,这样才能保留足够的信息来说明需求与实现之间的过渡。当然,与设计模型时序图相比,概念模型时序图需要处理的信息量要少得多,工作量自然也就少得多。图4.20展示了图4.9所示的实现层类图在J2EE架构下实现查询商品过程的片断。在这个例子中,所有的类和方法都与实际编程无异,已经可以看作是伪代码了。

    小结:时序图的三种应用场合是在建模过程中经常使用的动态视图。除了这些场合,在任何时候需要表达对象间的交互时,或者想分析对象的职责和接口时都可以使用时序图。特别的,在建立软件架构时,为了说明架构中的关键对象交互场景,或者为了说明应用程序如何使用架构的编程模型,也可以使用时序图来说明。这些时序图可以作为架构文档的一部分,也可用作编程规范和指南使用。甚至,在非正式建模工作中,例如一时不能确定如何设计接口,或者不能确定设计是否合理时都可以用时序图帮助分析。时序图是十分有用的工具,掌握并随时使用它是很好的分析设计习惯。接下来,我们将学习最后一种动态视图:协作图。

    4.2.4 协作图

    协作图描述了对象间交互的一种模式;它通过对象之间的连接和它们相互发送的消息来显示参与交互的对象。协作图中可以有对象和主角实例,以及描述它们之间关系和交互的连接和消息。通过说明对象间如何通过互相发送消息来实现通信,协作图描述了参与对象中发生的情况。可以为用例事件流的每一个变化形式制作一个协作图。与时序图的作用相似,协作图用于显示对象之间如何进行交互以执行特定用例或用例中特定部分的行为,协作图的建模结果用于获取对象的职责和接口。与时序图不同的是,协作图因为展示了对象间的关系,使得它更适用于获得对对象结构的理解,而时序图则更适于获得对于调用过程的理解。不过在本质上,它们是可以互换的。

    同样的,通常我们也使用协作图来描述用例实现,通过贡献于该用例实现的对象之间的交互来说明用例是如何被对象实现的。也同样可以针对概念层、说明层和实现层分别对业务实体对象、分析类对象和设计类对象绘制协作图。如果你更在意对象间的结构关系,请选择使用协作图;如果你更在意对象交互的执行顺序,则请选择使用时序图。下面将使用与时序图相同的例子来描述协作图如何绘制。

    4.2.4.1 业务模型协作图

    业务模型协作图同样采用业务实体来绘制,目标也是实现用例场景。不过有时候协作图并不要求实现完整的场景,只需要将影响对象的关键消息绘制出来即可。因为协作图更在意的是对象的结构及其相互的影响。协作图(图4.21)展示了与时序图(图4.18)同样的信息,请读者体会它们之间在表达上不同的视觉感受和蕴含的侧面意义。

    协作图与时序图相比,对象间的结构一目了然,并且很容易就能知道哪些消息影响了对象(或者说对象需要提供哪些接口)。不过虽然用数字标明了消息的顺序,从图中我们还是很难看出执行的顺序,更无法了解一次完整的会话过程。协作图和时序图展示着对象不同的方面。 

    ■ 对象表示参与协作的对象。对象可以指定它的类,也可以直接用空对象表示,在将来再指定它的类。

    ■ 对象关联连接两个对象,表示两者的关联。与类关系不同,协作图中的对象关联是临时关联,即只在本次交互中存在;而类关系是永久关联,例如继承关系不论在什么情况下都是存在的。Rose中还定义了对象关联的可见属性,它们是:[插图]:域(Field)可见。表示关联的对象在交互域内是一直可见的。这有些类似于Java中的包内可见的性质。[插图]:参数(Parameters)可见。表示关联的对象仅在交互过程中可见,它们是通过参数传递产生关联的。[插图]:本地(Local)可见。表示关联的对象在本地可见。本地的概念类似于指对象在同一个JVM(Java虚拟机)或者同一个Server中,或者同一个进程中是可见的。[插图]:全局(Global)可见。表示关联的对象是全局可见的。全局的概念类似于指对象在整个分布式应用程序中,或者一个服务器群集中,或者整个万维网中是可见的。

    ■ 消息协作图中的消息与时序图中的消息定义完全一样。请参看4.2.3.1业务模型时序图一节中关于消息的解释部分。不过在Rose中并不能展示不同消息类型的不同符号,消息类型在打开消息属性对话框时才能看到。

    ■ 消息序号其实消息序号也是消息的一部分,这里分开讲只是为了强调。序号表明消息传递的先后顺序。在Rose中这个序号是由Rose自动维护的,并且不能够手工调整。正因为如此,如果要在已经完成的图中插入一条消息,基本上需要把整个图重画一遍来重新调整顺序。遇到这种情况时,“必杀技”就派上用场了,我们可以将协作图转化成时序图,在时序图中插入消息,再转换回协作图。

    4.2.4.2 概念模型协作图与时序图相同,

    概念阶段的协作图采用分析类来绘制,目标是实现业务用例。同样这个阶段的协作图已经带有计算机理解。图4.22展示了与时序图(图4.19)表达内容完全相同的协作图。读者可参照理解,这里就不再赘述了。

     4.2.4.3 设计模型协作图与时序图相同,

    设计模型协作图使用设计类为对象来绘制。目标是实现概念模型中的某个事件流,一般以一个完整交互为单位,消息细致到方法级别。协作图(图4.23)展示了与时序图(图4.20)完全相同的信息,读者可参照理解,不再赘述。

     小结:到此为止UML核心视图中的动态视图就学习完了。在动态视图中,我们学习了活动图、状态图、时序图和协作图,这些视图各有其适用的场合。笔者在本章的学习过程中按适用场合进行了一些讲解,不过肯定不能覆盖所有可能的情况。我们知道静态视图表达事物的结构性观点,而动态视图则表达事物的行为性观点。一个好的建模,结构性和行为性缺一不可,而且要相得益彰。既要说明该事物长得像什么样子,还要说明该事物应该怎么用。不论是静态视图还是动态视图都是建模的重要工具,熟练掌握它们除了学习基本概念之外,诀窍就是多用。这些视图不但可以用在软件建模过程中,也可以用在分析现实生活中的一些事例。只要愿意,总可以从生活中找到非常多的例子来练习。相对于掌握工具,理解其背后的本质才是更重要的。而这些理解是只可意会不能言传的,尽管作者作了以上的努力,仍然不能保证读者能深刻理解。希望大家多学多用,达到手中无剑心中有剑的层次。下一章,我们将开始学习UML的核心模型。预习:简单的理解,其实一个模型就是一堆有意义的静态图和动态图组合在一起,表达了一个有意义的中心思想。因此,学习模型最重要的不是死记硬背一个模型需要做什么,而是需要理解模型的中心思想。

     

     

     

    展开全文
  • 视图函数和视图

    千次阅读 2020-03-20 08:18:09
    文章目录视图函数和视图类一、 视图函数1.1 endpoint简介1.2 装饰器注册路由源码浅析1.3 另一种注册路由的方式---app.add_url_rule()1.4 视图函数中添加自定义装饰器视图类2.1 视图类的基本写法三、 详细讲解...

    视图函数和视图类

    一、 视图函数

    之前我们已经了解过了视图函数的大概用法,本节深入了解一下视图函数

    img

    1.1 endpoint简介

    endpint参数是写在注册路由的装饰器中的一个参数,学名叫端点,我们可以理解为函数的别名。原来我们翻转视图函数的url的时候是直接通过是如函数的名字,如url_for('函数名'),现在我们可以指定一个endpoint='fbv'参数来进行翻转url。如果不指定endpoint,默认就以函数名作为端点名。

    实例:

    @app.route('/fbvtest/',methods=['GET','POST'],endpoint='fbv')  
    def fbvtest():
        url_demo = url_for('fbv')
        return '利用视图函数别名翻转的url为:{}'.format(url_demo)
    

    img

    关键词:

    • 利用@app.route()endpoint='fbv'参数可以自由指定端点名,url_for可以根据指定的端点名进行翻转。

    1.2 装饰器注册路由源码浅析

    (1) 首先写一个小视图函数

    #注册装饰器的原理
    #1 v = app.route('/source_code_demo/',endpoint='source_code')
    #2 v(source_code_demo)
    @app.route('/source_code_demo/',endpoint='source_code')
    def source_code_demo():
    
        return 'source_code_demo'
    

    (2) 查看app.route()源码

        ... 
        def route(self, rule, **options):
        ...
             def decorator(f):
                    endpoint = options.pop('endpoint', None)
                    self.add_url_rule(rule, endpoint, f, **options)
                    return f
                return decorator
    

    解析:

    • ,发现route()返回的是decorator函数地址,然后基于语法糖和装饰器的原理,decorator会加括号运行,像这样decorator(source_code_demo)
    • decorator函数中首先取出endpoint,然后运行self.add_url_rule(rule, endpoint, f, **options)
    • 所以 self.add_url_rule(rule, endpoint, f, **options)就是注册路由的核心

    (3) 点进self.add_url_rule(rule, endpoint, f, **options)查看源码,

    再点进_endpoint_from_view_func(view_func)查看源码

      ...
        
      @setupmethod
      def add_url_rule(self, rule, endpoint=None, view_func=None,
                         provide_automatic_options=None, **options):
            
      ...
    
           if endpoint is None:
                endpoint = _endpoint_from_view_func(view_func)
            options['endpoint'] = endpoint
            methods = options.pop('methods', None)
    
            # if the methods are not given and the view_func object knows its
            # methods we can use that instead.  If neither exists, we go with
            # a tuple of only ``GET`` as default.
            if methods is None:
                methods = getattr(view_func, 'methods', None) or ('GET',)
                
            ...
    
    def _endpoint_from_view_func(view_func):
        """Internal helper that returns the default endpoint for a given
        function.  This always is the function name.
        """
        assert view_func is not None, 'expected view func if endpoint ' \
                                      'is not provided.'
        return view_func.__name__
    

    解析:

    • 由上述代码我们可以直到如果没有指定endpoint,我们调用了 _endpoint_from_view_func()
    • 观察_endpoint_from_view_func函数我们可以知道,返回了视图函数的名字给了endpoint赋值
    • methos没有指定会给methos赋默认值('GET',)

    小结:

    1. self.add_url_rule(rule, endpoint, f, options)就是注册路由的核心
    2. 观察_endpoint_from_view_func函数我们可以知道,返回了视图函数的名字给了endpoint赋值
    3. methos没有指定会给methods赋默认值('GET',)

    img

    1.3 另一种注册路由的方式—app.add_url_rule()

    通过看上一个小节写的源码,现在我们知道了app.route() 的核心就是self.add_url_rule(rule, endpoint, f, options)就是注册路由的核心。所以我们可以直接使用app.add_url_rule()的方式来注册路由。

    实例:

    def add_url_test():
    
        return '实现了add_url方式注册路由'
                     # url                       端点                 函数地址
    app.add_url_rule('/add_url_test/',endpoint='add_demo',view_func=add_url_test)
    

    img

    1.4 视图函数中添加自定义装饰器

    我们在平时的开发的过程中,很多需要权限验证的功能需要用到装饰器,下面的代码是如何在flask中实现一个装饰器。

    from flask import Flask, request
    from functools import  wraps
    
    app = Flask(__name__)
    
    def login_verify(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            user_name = request.args.get('user')
            password = request.args.get('password')
            if user_name == 'mark' and password == '123':
                return func(*args,**kwargs)
            else:
                return '请登录'
        return wrapper
    
    @app.route('/')
    def hello_world():
        return 'Hello World!'
    
    @app.route('/my_info/')
    @login_verify
    def my_info():
        return '个人信息页面'
    

    关键词

    1. 装饰器一定要写在注册路由的下面,写在视图函数的上面。
    2. 装饰器内部一定要使用@wraps(func)方法,用于保护被装饰函数的属性。

    img

    二、 视图类

    2.1 视图类的基本写法

    from flask import Flask, views, request, url_for
    from functools import wraps
    
    def login_verify(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            user_name = request.args.get('user')
            password = request.args.get('password')
            if user_name == 'mark' and password == '123':
                return func(*args,**kwargs)
            else:
                return '请登录'
        return wrapper
    
    
    class CBVTest(views.MethodView):
    
        methods = ['GET','POST']  # 指定可以接收的方法有什么
        decorators = [login_verify,]  # 指定自定义的装饰器
    
        def get(self):
            print(url_for('cbvtest'))
            return 'cbv_get'
        def post(self):
            return 'cbv_post'
    app.add_url_rule('/cbvtest',view_func=CBVTest.as_view(name='cbvtest'),endpoint='end_demo')
    

    讲解:

    1. 首先从flask中导入 views

    2. 写一个类一定要继承 views.MethodView

    3. 在类中写methods = ['GET','POST'] 可以指定可接受的请求类型

    4. 在类中写decorators = [login_verify,]可以指定装饰器,第一个装饰器是最里层函数依次往后包裹

    5. 在类中写def get(self):用于获取get请求

    6. 在类中写def post(self):用于获取post请求

    7. 添加路由的方法使用

      app.add_url_rule(
          '路由',view_func=CBVTest.as_view(name='自定义一个端点名字'))
      

      其原理是CBVTest.as_view(name='自定义一个端点名字')会返回一个函数,name是为这个函数命的名字,可以通过这个函数进行分发请求等操作。

    img

    三、 详细讲解注册路由的参数:

    常用的参数

    @app.route和app.add_url_rule参数:
    rule, URL规则
    view_func, 视图函数名称
    endpoint = None, 名称,用于反向生成URL,即: url_for('名称')
    methods = None, 允许的请求方式,如:["GET", "POST"]
    

    不常用的参数(了解)

    (1) 对URL最后的 / 符号是否严格要求 strict_slashes = False

    strict_slashes = False
        '''
            @app.route('/index', strict_slashes=False)
            #访问http://www.xx.com/index/ 或http://www.xx.com/index均可
            @app.route('/index', strict_slashes=True)
            #仅访问http://www.xx.com/index
        '''
    

    (2) 重定向到指定地址redirect_to=“ ”

    @app.route("/",redirect_to='/home/')
    def index():
    
        return '根路径'
    
    @app.route("/home/")
    def admin_demo():
    
        return 'home路径'
    

    (3) 为函数提供默认参数值

    defaults = None, 默认值, 当URL中无参数,函数需要参数时,使用defaults = {'k': 'v'}
    

    **(4)**子域名设置subdomain=“ ”

    from flask import Flask,url_for
    
    app = Flask(__name__)
    app.debug = True
    '''
    先在hosts设置域名解析(就是在本机的hosts文件上编辑上域名对应ip的关系) 
    域名解析会先解析本地如果没有再解析dns服务器
    C:\Windows\System32\drivers\etc\hosts
    
    127.0.0.1 mark.com
    127.0.0.1 admin.mark.com
    
    '''
    app.config['SERVER_NAME'] = 'mark.com:5000' # 这个代表访问这个域名的时候要访问5000端口
    
    @app.route("/")
    def index():
    
        return '设置域名成功'
    
    @app.route("/admin_demo/",subdomain='admin')
    def admin_demo():
    
        return '设置子域名成功'
    
    '''
    在浏览器中访问主域名
    mark.com:5000/
    
    在浏览器中访问子域名
    admin.mark.com:5000/admin_demo/
    
    注意:后面跟的path路径部分正常写
    '''
    
    if __name__ == '__main__':
        app.run(host='127.0.0.1',port=5000) # 测试服务器不稳定,尽量手动制定ip和端口
    

    img

    img

    img

    展开全文
  • SAP物料主数据_基本视图设置1

    万次阅读 2011-07-16 11:39:34
    物料主数据_基本视图1一.视图说明 物料主数据的基本视图是维护一个物料的最为基本的数据,也都是无组织机构数据。这些数据不会因为不同的组织机构(如工厂、库存地点)改变而改变。 基本视图创建(如TCODE:MM01...
  • 1、最常用的几种视图状态 1. enabled 表示当前视图是否可用。可以调用setEnable()方法来改变视图的可用状态,传入true表示可用,传入false表示不可用。它们之间最大的区别在于,不可用的视图是无法响应onTouch...
  • DB基本概念之 --- 视图

    千次阅读 2013-10-23 15:35:46
    1 普通视图: 普通视图仅仅就是一系列复杂SQL语句的封装。 其不存储任何数据的,只有定义,在查询中会转换为对应的定义SQL去查询。 三个特征: 1、简化设计,目的是清晰编码,并不是提高性能的,他的存在只会降低...
  • MySQL视图

    千次阅读 2018-07-24 18:25:44
    MySQL视图 视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。通过视图,可以展现基表的部分数据;视图数据来自定义视图的查询中使用的表,使用视图动态...
  • SQL Server 视图

    2019-06-25 02:43:08
    视图分类 1.行列子集视图:从单个基本表导出,保留基本表的码,但去掉其它的某些列和部分行的视图。 2.表达式视图:带虚拟列的视图。 3.分组视图:子查询目标表带有组函数或子查询带有...
  • 文章目录0.前言1.思维导图2.基本表更新---TABLE(1)插入数据---INSERT INTO① 插入元组② 插入子查询结果(2)修改...视图---VIEW(1)定义视图① 建立视图② 删除视图(2)查询视图(3)更新视图① 更新数据---UP...
  • 数据库之视图、索引

    千次阅读 2016-10-10 09:03:01
    数据库视图以及索引的概念和作用介绍
  • 数据库 视图

    2012-10-18 14:53:06
    今天用了一把数据库中的视图,事情是这样,实际要求从约10多个数据表中查询出5个结果集传递给另一个模块。开始准备直接用sql语句,但感觉很不好,一个一个的写sql语句,一个字累。很自然地想到了视图,过程很简单,...
  • 数据库实验--视图

    千次阅读 2019-11-11 21:17:53
    3. 熟悉视图更新与基本表更新的区别与联系 4. 认识视图的作用 、实验内容 使用 SSMS 和 Transact-SQL 语句 CREATE VIEW 创建视图 使用 Transact-SQL 语句 ALTER VIEW 修改视图 学习删除视图的 Transact-SQL ...
  • 数据库关系图、表和视图(1) 基本表和独立表  安装数据库:aspnet_regsql     ASPNETDB 这个隐藏在ASP.NET 2.0四大“插件”  (  SqlMembershipProvider、  SqlRoleProvider、  ...
  • SQL server视图的定义和操作

    千次阅读 2020-09-03 11:48:51
    、实验内容 1、创建视图、修改视图、删除视图、使用视图 2、熟练掌握对视图的操作 三、实验要求 在本题下面提交基本操作效果截图 1、建立学生试图,进行修改查询。 use pppp go create view v_阮世明 as select ...
  • 物化视图的快速刷新(

    千次阅读 2009-01-19 16:31:00
    物化视图的快速刷新() =========================================================== 作者: yangtingkun(http://yangtingkun.itpub.net)发表于: 2005.01.28 17:23分类: ORACLE 出处: ...
  • 数据更新与视图

    千次阅读 2016-10-08 13:34:00
    数据更新与视图
  • 数据库实验8——视图的定义与使用

    千次阅读 2020-05-08 21:03:10
    文章目录视图的定义与使用一、实验目的、实验要求三、实验内容1.定义视图2.使用视图四、实验步骤五、实验总结 视图的定义与使用 一、实验目的 ……. 熟悉和掌握对数据表中视图的查询操作和SQL语句的使用; 熟悉和...
  • oracle视图原理以及dml操作视图限制

    千次阅读 2017-07-07 18:10:10
    1 视图的概念 oracle视图实际上就是封装sql语句,对外提供一个别名,使用者不需要关心复杂的sql,视图执行之后会将执行的结果当做一个表来使用,相当于一个虚拟的表,如果想在视图上进行DML的操作,在创建时候有两...
  • 视图的定义与操作

    千次阅读 2019-07-25 10:11:49
    实验名称 视图的定义与操作 实验地点 实验楼502 实验日期 一、实验目的及要求 ... 熟悉视图更新与基本表更新的区别与联系 4. 认识视图的作用 、实验环境 Windows10+SQL Sever 20...
  • 物化视图 数据库

    千次阅读 2014-01-20 20:03:58
    基本定义: 物化视图,它是用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,从而快速的得到结果。 物化视图有很多方面和索引很相似:使用物化视图的...
  • 模型-视图 编程

    千次阅读 2016-07-20 23:43:18
    模型/视图 编程模型/视图编程简介QT包含了 item view 类,这些类,使用模型/视图架构来管理数据与数据呈现方式之间的关系。这种架构引入了功能的分离,给程序员带来了非常大的灵活性来自定义数据的展示,也提供了一...
  • 自定义控件我们上一节探讨了一种最简单的自定义是直接继承View的子类,实现控件的不同UI视图展示及功能的拓展,在学习新知识前可以温习下之前所学知识-自定义控件之对现有控件拓展(一)。ok,在回顾了之前所学的...
  • 数据库——视图

    千次阅读 热门讨论 2013-06-26 22:57:17
     在设计表的时候,需要考虑到数据的冗余,数据的一致性问题,通常对数据表设计要满足范式的要求,这也就造成了我们的需要的数据分布在不同的表中,如果不使用视图,我们就需要在代码中查询多个表,来查找需要的数据. ...
  • 实验4:索引和视图

    千次阅读 2019-11-18 20:41:15
    、实验目的 (1)理解索引的概念与类型。 (2)掌握使用企业管理器创建与维护索引的方法。 (3)掌握T-SQL语句创建与维护索引的方法。 (4)理解视图的概念。 (5)掌握视图创建、更改的方法。 (6)掌握用...
  • mysql实现物化视图

    千次阅读 2020-01-14 10:30:33
    原项目用的是国产数据库人大金仓,因用户要求,需要迁移到mysql5.7上,在搜索解决方法之前有了大致思路就是建立物化视图表,然后使用存储过程或者触发器去更新物化视图表就可以了,但想要找有没有更优的方案,于是就...
  • 模型-视图 教程

    千次阅读 2016-07-12 23:35:57
    模型/视图 教程每一个UI开发者都应该了解Model/View编程,这篇教程的目标就是对这个主题提供一个容易理解的介绍。Table, list and tree 窗口部件都是在图形用户界面中常用的组件。这些窗口部件能够通过两种不同的...
  • 一、物化视图 Oracle的物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也可以称为快照。 物化视图可以用于预先计算...
  • 教科书从复习初中学过的正方体、长方体……的三视图出发,要求学生自己画出球、长方体的三视图;接着,通过“思考”提出了“由三视图想象几何体”的学习任务.进行几何体与其三视图之间的相互转化是高中阶段的新任务...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 130,779
精华内容 52,311
关键字:

二视图的基本要求