精华内容
下载资源
问答
  • 当只想把表中的一部分内容展示给另一个用户,则可以建立一个视图,视图表中的内容是父表中能展示的部分。 视图和父表可以联动,当父标的内容发生了改变,视图内容也会更着变化。 可以之间新建一张表,新表也可以取父...

    视图创建

    创建视图的原因:

    1. 当只想把表中的一部分内容展示给另一个用户,则可以建立一个视图,视图表中的内容是父表中能展示的部分。
    2. 视图和父表可以联动,当父标的内容发生了改变,视图内容也会更着变化。
    3. 可以之间新建一张表,新表也可以取父标的一部分内容展示给用户,但是会存在问题,当父表内容产生改变,子表不会产生变化。
      综上原因:使用视图展示一部分内容给其他用户是一种更好的选择。

    子标

    创建子表的方法:(会存在上诉第三点问题)

    create table tb_emp_simple2
    (
    eno integer not null,
    ename varchar(20) not null,
    job varchar(20) not null,
    primary key (eno)
    );
    
    
    insert tb_emp_simple2 select eno,ename,job from tb_emp;
    

    将子标的权限给到用户

    -- 删除用户
    drop user 'pengdingming'@'%';     
    -- 创建新用户
    create user 'pedingming'@'%' identified by '123Hl46&';
    -- 将hrs库中tb_emp_simple2表的select权限给到pedingming
    grant select on hrs.tb_emp_simple2 to 'pedingming'@'%';
    

    父表为:tb_emp

    在这里插入图片描述
    建立出来的子标为:tb_emp_simple2
    在这里插入图片描述

    视图

    创建视图的方法

    create view vw_emp_simple2 as 
    select eno, ename ,job from tb_emp;
    

    删除视图的方法:

    -- 删除视图
    drop view vw_emp_simple2;
    

    将视图的权限给到用户

    drop user 'pengdingming'@'%';
    -- identified后面跟的是用户的密码
    create user 'pengdingming'@'%' identified by '123Hcl456&';
    grant show view on hrs.vw_emp_simple2 to 'pedingming'@'%';
    grant select on hrs.vw_emp_simple2 to 'pedingming'@'%';
    

    父表和前面的父表为同一个表
    视图表为:
    在这里插入图片描述

    展开全文
  • 问题描述:如果我有数据库A和数据库B,数据库A和B属于同一个库,是否可以在MySQL中创建B数据库下的视图test,对应数据库A下的a表。我该怎么做。 解决方案:创建视图的语句为: CREATE VIEW b.test AS SELECT * ...
    编辑历史:
    2018.3.15  小赖   文档初始化

    问题描述:如果我有数据库A和数据库B,数据库A和B属于同一个库,是否可以在MySQL中创建B数据库下的视图test,对应数据库A下的a表。我该怎么做。

    解决方案:创建视图的语句为: CREATE VIEW b.test AS SELECT * FROM a.a 创建完成如下图所示。

    这里写图片描述

    展开全文
  • 不需要给单列 Visit 、ID、Count、SubId、LoginId建索引,这里在order by 的字段上建立索引,还是不能避免排序。 ------------------------- Re回5楼cyb的帖子 普通limit M,N的翻页写法,往往在越往后翻页的过程中...

    Re回4楼cyb的帖子

    distinct 可以认为是group by的特例。

    SELECT DISTINCT

    LoginId,

    SubId

    FROM

    TB

    WHERE 1

    ORDER BY Visit ASC

    LIMIT 8888, 10

    这个SQL等价于: select

    LoginId, SubId

    from TB where 1 group by

    LoginId, SubId

    ORDER BY Visit ASC

    LIMIT 8888, 10

    单纯就这条SQL而言,

    ORDER BY Visit ASC 是没必要的,因为select选出的字段中没有

    Visit字段,建议添加组合索引(

    LoginId,

    SubId

    )。

    假如SQL是 select

    LoginId,SubId,Visit

    from TB where 1 group by

    LoginId, SubId

    ORDER BY Visit ASC

    LIMIT 8888, 10

    这里可以建议组合索引(

    LoginId,

    SubId) 或者(

    LoginId,

    SubId,Visit)

    Visit字段添加到索引中,仍旧避免不了排序,上面SQL的执行过程是:

    1.

    select

    LoginId,SubId,Visit from TB where 1 group by LoginId, SubId

    2.

    ORDER BY Visit ASC

    LIMIT 8888, 10

    第一步中的group by (或者distinct)可以利用到索引(

    LoginId,

    SubId

    )避免临时表,排序

    下面是测试案例:

    mysql> show create table tb\G

    *************************** 1. row ***************************

    Table: tb

    Create Table: CREATE TABLE `tb` (

    `id` int(11) DEFAULT NULL,

    `LoginId` int(11) DEFAULT NULL,

    `SubId` int(11) DEFAULT NULL,

    `vist` int(11) DEFAULT NULL,

    KEY `idx1` (`id`),

    KEY `login_subId` (`LoginId`,`SubId`),

    KEY `login_subId_vist` (`LoginId`,`SubId`,`vist`)

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8

    1 row in set (0.00 sec)

    mysql> explain select LoginId, SubId, vist from tb where 1 group by LoginId,SubId ;

    +----+-------------+-------+-------+------------------------------+-------------+---------+------+------+-------+

    | id | select_type | table | type  | possible_keys                | key         | key_len | ref  | rows | Extra |

    +----+-------------+-------+-------+------------------------------+-------------+---------+------+------+-------+

    |  1 | SIMPLE      | tb    | index | login_subId,login_subId_vist | login_subId | 10      | NULL |    9 | NULL  |

    +----+-------------+-------+-------+------------------------------+-------------+---------+------+------+-------+

    1 row in set (0.00 sec)

    第二步中将步骤1中的结果集按照

    Visit 字段排序,这一步的排序不可避免。

    上面提到了将visit字段加入到组合索引中,是为了构建覆盖索引。避免返回到数据行去查询。

    对于您提到的问题,

    排序方式有多种,Visit 、ID、Count等,是不是有一种排序就要建一个“覆盖索引”?

    distinct/group by的优化,关键是要利用索引,避免distinct/group by时的创建临时表,排序。

    将order by的字段加入到组合索引中,目的是为了直接从二级索引字段获取到结果集,避免再去查数据行。

    加了覆盖索引,索引字段变长,查询性能变好,同时也会导致占用空间、插入性能变慢。

    所以是否去创建覆盖索引,还是需要依旧您的具体业务而定的。

    还需要单列给Visit 、ID、Count、SubId、LoginId建索引吗?

    不需要给单列

    Visit 、ID、Count、SubId、LoginId建索引,这里在order by 的字段上建立索引,还是不能避免排序。

    -------------------------

    Re回5楼cyb的帖子

    普通limit M,N的翻页写法,往往在越往后翻页的过程中速度越慢,原因

    mysql会读取表中的前M+N条数据,M越大,性能就越差:

    select  *  from t where sellerid=100 limit 100000,20

    优化写法:

    select t1.* from  t t1,

    (select id from t  sellerid=100 limit 100000,20) t2

    where t1.id=t2.id;

    优化后的翻页写法,先查询翻页中需要的N条数据的主键id,在根据主键id

    回表查询所需要的N条数据,此过程中查询N条数据的主键ID在索引中完成

    这种优化的根本出发点,是减少在数据页中的扫描量。

    覆盖索引,也是一种优化思路,出发点就是直接从二级索引中直接获取查询结果。

    您也可以将您的业务SQL发一下,一起来看看如何优化。

    -------------------------

    回15楼cyb的帖子

    T_Query 是一个视图对吧?

    可否将T_Query的建表语句发一下呢?

    -------------------------

    Re回15楼cyb的帖子

    SELECT DISTINCT

    LoginId,

    SubId

    FROM

    T_Query

    WHERE 1

    ORDER BY fenshu DESC

    LIMIT 61630, 10

    这条SQL从实现的功能而言,其实没必要加ORDER BY fenshu DESC 的。

    distinct只能返回它的目标字段,而无法返回其它字段。 所以在SELECT DISTINCT LoginId, SubId FROM T_Query中取出的是 LoginId,SubId不重复的行。也就是说,必须LoginId和SubId都相同才会被排除。

    做个测试:

    mysql> select * from tb;

    +------+---------+-------+------+

    | id   | LoginId | SubId | vist |

    +------+---------+-------+------+

    |    1 |     123 |    21 |   78 |

    |    2 |      43 |    71 |   78 |

    |    3 |      43 |    21 |   78 |

    |    2 |      43 |    71 |   78 |

    |    3 |      43 |    21 |   78 |

    |    2 |      43 |    71 |   78 |

    |    5 |      73 |    21 |   78 |

    |    2 |      55 |    67 |   78 |

    |    1 |      98 |    21 |   78 |

    +------+---------+-------+------+

    9 rows in set (0.01 sec)

    mysql> select distinct LoginId,SubId from tb ;

    +---------+-------+

    | LoginId | SubId |

    +---------+-------+

    |      43 |    21 |

    |      43 |    71 |

    |      55 |    67 |

    |      73 |    21 |

    |      98 |    21 |

    |     123 |    21 |

    +---------+-------+

    6 rows in set (0.00 sec)

    mysql> select distinct LoginId,SubId from tb where 1 order by vist;

    +---------+-------+

    | LoginId | SubId |

    +---------+-------+

    |      43 |    21 |

    |      43 |    71 |

    |      55 |    67 |

    |      73 |    21 |

    |      98 |    21 |

    |     123 |    21 |

    +---------+-------+

    6 rows in set (0.00 sec)

    这里如果建了(LoginId,SubId)即可避免distinct的创建临时表,避免排序。

    mysql> explain select distinct LoginId,SubId from tb;

    +----+-------------+-------+-------+------------------------------+-------------+---------+------+------+-------------+

    | id | select_type | table | type  | possible_keys                | key         | key_len | ref  | rows | Extra       |

    +----+-------------+-------+-------+------------------------------+-------------+---------+------+------+-------------+

    |  1 | SIMPLE      | tb    | index | login_subId,login_subId_vist | login_subId | 10      | NULL |    9 | Using index |

    +----+-------------+-------+-------+------------------------------+-------------+---------+------+------+-------------+

    1 row in set (0.00 sec)

    所以,对于您给出的SQL,我的建议是改写SQL为:

    SELECT DISTINCT

    LoginId,

    SubId

    FROM

    T_Query

    LIMIT 61630, 10

    并添加索引( LoginId, SubId),这里一方面可以利用到索引避免临时表、排序;另一方面其实也是覆盖索引。

    如果您发现去掉ORDER BY fenshu DESC 不符合您的业务需求,那么就需要考虑一下distinct的用法是否正确? select出来的结果集是否是您真实需要的。

    另外需要提到一点:

    您发给我的这张表,索引用法有点问题,建了很多不必要的索引。

    假如建了(A),(A,B),(A,B,C)三个索引,其实(A),(A,B)都是不需要的。

    -------------------------

    Re回20楼华夏一剑的帖子

    在您给的例子中,select id, title from tb_news where title like '%mal%'; 是可以走上索引的,并且是覆盖索引。

    innodb表的二级索引上存储了主键值,上面的SQL语句只需要查询id(主键字段)和title,所以扫描二级索引字段就可以获取到结果,不要再返回主键索引读取数据了。

    mysql> explain select id, title from tb_news where title like '%mal%';

    +----+-------------+---------+-------+---------------+---------------+---------+------+------+--------------------------+

    | id | select_type | table   | type  | possible_keys | key           | key_len | ref  | rows | Extra                    |

    +----+-------------+---------+-------+---------------+---------------+---------+------+------+--------------------------+

    |  1 | SIMPLE      | tb_news | index | NULL          | tb_news_title | 203     | NULL |    5 | Using where; Using index |

    +----+-------------+---------+-------+---------------+---------------+---------+------+------+--------------------------+

    1 row in set (0.00 sec)

    而类似这种,select * from tb_news where title like '%mal%';会走全表扫描。

    mysql> explain select * from tb_news where title like '%mal%';

    +----+-------------+---------+------+---------------+------+---------+------+------+-------------+

    | id | select_type | table   | type | possible_keys | key  | key_len | ref  | rows | Extra       |

    +----+-------------+---------+------+---------------+------+---------+------+------+-------------+

    |  1 | SIMPLE      | tb_news | ALL  | NULL          | NULL | NULL    | NULL |    5 | Using where |

    +----+-------------+---------+------+---------------+------+---------+------+------+-------------+

    1 row in set (0.00 sec)

    通过覆盖索引可以获得性能上的一定优化,但是在数据量特别大,请求频繁的业务场景下不要在数据库进行模糊查询;

    非得使用数据库的话 ,建议不要在生产库进行查询,可以在只读节点进行查询,避免查询造成主业务数据库的资源消耗完,导致故障;

    可以使用MySQL自带的全文检索,或者一些开源的搜索引擎技术,比如sphinx.

    展开全文
  • oracle 数据库 建立视图 时 提示 ORA-00936:missing expression ORA-06512:at line 1 create or replace force view V_contestSell as select A.uuid,A.unitId,A.sellDate,A.interval,A.shopId.A.remark,A....
  • 视图概述视图是一张虚拟表,它表示一张表的部分数据或多张表的综合数据,其结构和数据是建立在对表的查询基础上视图中并不存放数据,而是存放在视图所引用的原始表(基表)中同一张原始表,根据不同用户的不同需求,...

    视图

    概述

    视图是一张虚拟表,它表示一张表的部分数据或多张表的综合数据,其结构和数据是建立在对表的查询基础上

    视图中并不存放数据,而是存放在视图所引用的原始表(基表)中

    同一张原始表,根据不同用户的不同需求,可以创建不同的视图

    作用

    筛选表中的行

    防止未经许可的用户访问敏感数据

    隐藏数据表的结构

    降低数据表的复杂程度

    创建视图

    语法

    -- 创建视图

    create view 视图名

    as

    select 语句;

    -- 查询视图

    select 列名 from 视图

    MariaDB [sel]> create view best

    -> as

    -> select * from grades;

    # `Query OK, 0 rows affected (0.012 sec)`

    MariaDB [sel]> select math from best;

    +------+

    | math |

    +------+

    | 96 |

    | 91 |

    | 94 |

    | 94 |

    +------+

    # `4 rows in set (0.008 sec)`

    视图可以使得降低SQL语句的复杂度

    mysql> create view view2

    -> as

    -> select stuno,stusex,writtenexam,labexam from stuinfo natural join stumarks;

    # `Query OK, 0 rows affected (0.01 sec)`

    修改视图

    语法

    alter view 视图名

    as

    select 语句

    mysql> alter view view2

    -> as

    -> select stuname from stuinfo;

    # `Query OK, 0 rows affected (0.00 sec)`

    删除视图

    语法

    drop view [if exists ] 视图1,视图,...

    mysql> drop view view2;

    # `Query OK, 0 rows affected (0.00 sec)`

    查看视图信息

    方法一

    显示所有的表和视图

    mysql> show tables;

    方法二

    精确查找视图(视图信息存储在information_schema下的views表中)

    mysql> select table_name from information_schema.views;

    +------------+

    | table_name |

    +------------+

    | view1 |

    +------------+

    # `1 row in set (0.05 sec)`

    方法三

    通过表的comment属性查询视图

    -- 查询所有表和视图的详细状态信息

    mysql> show table status\G;

    -- 只查找视图信息

    mysql> show table status where comment='view'\G

    查询视图的结构

    mysql> desc view1;

    查询创建视图的语法

    mysql> show create view view1\G;

    视图算法

    一般场景

    找出数学成绩最高的男生和女生

    MariaDB [sel]> select * from (select * from grades order by math desc) tab group by sex;

    +-------+------+---------+------+

    | name | sex | chinese | math |

    +-------+------+---------+------+

    | Sunny | boy | 93 | 96 |

    | Marry | girl | 95 | 94 |

    +-------+------+---------+------+

    # `2 rows in set (0.001 sec)`

    MariaDB [sel]> create view bestMath

    -> as

    -> select * from grades order by math desc;

    # `Query OK, 0 rows affected (0.010 sec)`

    MariaDB [sel]> select * from bestMath group by sex;

    +-------+------+---------+------+

    | name | sex | chinese | math |

    +-------+------+---------+------+

    | Sunny | boy | 93 | 96 |

    | Marry | girl | 95 | 94 |

    +-------+------+---------+------+

    # `2 rows in set (0.001 sec)`

    视图的算法

    视图的算法有

    merge 合并算法

    将视图语句和外层语句合并后再执行

    temptable 临时表算法

    将视图作为一个临时表来执行

    undefined 未定义算法

    用哪种算法有MySQL决定,这是默认算法,视图一般会选merge算法

    重新通过视图实现

    场景

    找出语文成绩最高的男生和女生

    方法一

    mysql> select * from (select * from stu order by ch desc) t group by stusex;

    +--------+----------+--------+--------+---------+------------+------+------+

    | stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math |

    +--------+----------+--------+--------+---------+------------+------+------+

    | s25321 | Tabm | 女 | 23 | 9 | 河北 | 88 | 77 |

    | s25318 | 争青小子 | 男 | 26 | 6 | 天津 | 86 | 92 |

    +--------+----------+--------+--------+---------+------------+------+------+

    # `2 rows in set (0.00 sec)`

    方法二

    mysql> create view view3

    -> as

    -> select * from stu order by ch desc;

    Query OK, 0 rows affected (0.00 sec)

    mysql> select * from view3 group by stusex;

    +--------+---------+--------+--------+---------+------------+------+------+

    | stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math |

    +--------+---------+--------+--------+---------+------------+------+------+

    | s25301 | 张秋丽 | 男 | 18 | 1 | 北京 | 80 | NULL |

    | s25303 | 李斯文 | 女 | 22 | 2 | 北京 | 55 | 82 |

    +--------+---------+--------+--------+---------+------------+------+------+

    # `2 rows in set (0.00 sec)`

    方法三

    mysql> create or replace algorithm=temptable view view3

    -> as

    -> select * from stu order by ch desc;

    # `Query OK, 0 rows affected (0.00 sec)`

    mysql> select * from view3 group by stusex;

    +--------+----------+--------+--------+---------+------------+------+------+

    | stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math |

    +--------+----------+--------+--------+---------+------------+------+------+

    | s25321 | Tabm | 女 | 23 | 9 | 河北 | 88 | 77 |

    | s25318 | 争青小子 | 男 | 26 | 6 | 天津 | 86 | 92 |

    +--------+----------+--------+--------+---------+------------+------+------+

    # `2 rows in set (0.00 sec)`

    结论

    方法一和方法二的结果不一样,这是因为视图的算法造成的

    方法三指定算法为临时表算法,和子查询结果一致

    展开全文
  • 转自:... 1.在visio中新建数据库模型图  打开visio 2010,文件—>新建—>数据库—&...建立数据库模型图之后,菜单栏多出一个菜单项"...2.依次画数据库建立的每张表...
  • PowerDesigner15建立数据库的连接,并生成数据库视图 详细图解
  • 任务五 数据库的视图设计...在多表上建立视图3.创建带表达式的视图4.创建分组视图二、查看视图1.使用DESC语句查看视图2.使用SHOW TABLE STATUS语句查看视图3.使用SHOW CREATE VIEW查看视图三、查询视图四、更新...
  • 视图建立 create view <视图名> ([<列名>[,<列名>]…]) as 子查询 [with check option]; 其中属性列名全部指定或全部省略 with check option:表示对视图进行 增、删、改时保证更新、插入、...
  • 数据库视图

    2019-10-05 16:41:26
    数据库视图建立在基础表上的虚表,它只存放定义信息在数据库的数据字典里。 好处:加快访问数据的速度。限制数据的访问。对视图的修改不会影响到底层的基础表。对底层的基础表修改会影响到视图视图需要重新...
  • 建立数据库视图

    2013-11-11 11:33:12
    可能楼主对数据库还不是很了解,首先视图可以将不同表中的数据通过关联实现多表数据输出,比如说,有一个类型表 uType,有字段tId,tName,有个产品表 uProduct,有字段pId,pName,tId,此时你可以通过建立一张视图...
  • 数据库视图

    2018-06-08 19:31:24
    数据更新操作的结构:视图 视图定义 CREATE VIEW 建立视图 DROP VIEW 删除视图 ALTER VIEW 修改视图 视图操作 SELECT … FROM VIEW 查询视图 UPDATE DELETE INSERT 更新试图 视图对应的就是数据库三层模式中的外模式...
  • 视图的结构和数据建立在表的基础上。2. 视图2.1 创建视图语法:create [or replace] view 视图的名称asselect 语句例题:mysql> create view vw_stu-> as-> select stuname,stusex,writtenexa...
  • 数据库 - 视图

    千次阅读 2015-05-05 14:30:49
    视图视图的特点 虚表,是从一个或几个基本表(或视图)导出的表 只存放视图的定义,不存放视图对应的数据 ... 定义基于该视图的新视图定义视图建立视图: 语句格式 CREATE VIEW <视图名> [(<列名> [,<列名>]…)]
  • 任务五 数据库的视图设计 ...在多表上建立视图3.创建带表达式的视图4.创建分组视图二、查看视图1.使用DESC语句查看视图2.使用SHOW TABLE STATUS语句查看视图3.使用SHOW CREATE VIEW查看视图三、查询视图...
  • 所以一个表的主键常常建立在拥有这种数据类型的字段上。“订货单位”、“货物名称”和“经手人”定义为“文本”类型,“货物单价”和“订货金额”定义为“货币”类型,“订货数量”应是“数字”类型,“订货日期”则...
  • 数据库 视图建立

    2014-05-22 12:36:06
    1:关联查询,建立在表关系之上 例如: SELECT m.*,n.realname as realname FROM dbo.tbl_ask m,dbo.tbl_member n where m.userid=n.id 2:几张没关系的表输入进行融合到一张视图里面 例如: SELECT id,...
  • 数据库视图建立

    2014-05-16 14:16:40
    表1:tbl_magazine 表2:tbl_mag_news 3:视图建立 4:生成的视图
  • 记一次数据库视图建立问题说明解决步骤建立视图 问题说明 项目上客户要求费用申请单上,想看到关联的报销单已支付的金额【这个已支付要结算后才算】 由于系统自带公式无法实现,所以通过数据库视图解决 解决步骤 !...
  • 本文实例讲述了mysql视图原理与用法。...视图建立和删除不影响基本表。视图的插入,修改操作会影响基本表。如果视图来自多个基本表,那么不可以修改基本表。视图的用处:1.视图基于查询结果,使得视图可以隐藏...
  • [Django]中建立数据库视图

    千次阅读 2014-09-18 23:46:48
    Django中没有建立视图的接口,如果要建立一个视图需要一些手动的改变。 这里使用的Django 版本>1.5, 使用的数据库为mysql 第一步 建立视图,例如视图的名称叫做 user_info 第二步 model中这么写: class ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,719
精华内容 1,487
关键字:

数据库建立视图