精华内容
下载资源
问答
  • 查询视图的sql语句(mysql创建视图sql语句)2020-07-24 12:07:14共10个回答两种方式,一种是直接在sqlserver的列表中找到,另一种用写语句的方式查询.方法一:1、登陆sqlservermanagerstudio.2、在左边的树找到自己要查询...

    查询视图的sql语句(mysql创建视图sql语句)

    2020-07-24 12:07:14

    共10个回答

    两种方式,一种是直接在sqlserver的列表中找到,另一种用写语句的方式查询.方法一:1、登陆sqlservermanagerstudio.2、在左边的树找到自己要查询的数据库.如图:3、点击“表”,就能看到这个库中的所有表了.方法二:1、登陆sqlservermanagerstudio.2、点击左上角的“新建查询”.3、在窗口中编写sql语句如下,然后运行1selectnamefromsysobjectswherextype='u'orderbyname结果截图:

    33fe8bfaec8c9b1db1e6cbacd31e2a4e.png

    如果你是使用者那是看不到代码的如果你是开发者在recordset和connection附近很容易就能找到对应的sql语句

    137aa1570818c7c28d76772138768d23.png

    SELECTnameAS视图名,textAS视图定义FROMsys.objectsJOINsys.syscommentsONsys.objects.object_id=sys.syscomments.idWHEREtype='V'ORDERBYname

    91f4a0260e8d8b33f255dc067937938d.png

    select*fromsysobjectswhere[xtype]='V'select[name]fromsysobjectswhere[xtype]='V'查询分析器里using你要查找的数据库名字select[name]fromsysobjectswhere[xtype]='V'就可以得到结果了

    25776f62de592e93be5392310139197a.png

    createviewDep_MSalaryasselect部门名称,salary.月份,max(sum(salary.工资))最高工资,min(sum(salary.工资))最低工资fromEmployee,Departments,Salarywhere

    de292524810b3d95b38923b505828571.png

    什么意思啊?视图是基于基本表建立的,不实际存储数据.查询是一种操作,sql是一种语言(结构化查询语言),查询的实现就要用到sql语句,视图的建立也需要用sql语句,另外可以基于视图就行查询(检索数据).

    24a7bd6aa8e7f35e3e8a0bd00bd4ebf2.png

    可以通过sp_helptext来读取视图对应的sql语句如:sp_helptext视图名

    2882c89e639363000f15bc20406364c4.png

    视图是一种虚拟的表,是一个为了简化复杂查询语句的书写,另外也提高了数据库一定的安全性.查询是利用sql语句并按照自己的需求进行的检索过程,最终得到自己想要的结果.对数据库中的数据并不进行更新修改等.SQL语言是一种结构化的查询语言,利用sql语言可以对数据库中数据进行各种查询、更新等操作

    51a205c2b1f8c659857e136bace428b8.png

    要建立视图首先你要有权限,登录sys把视图权限给你操作的数据库grantcreateviewto你使用的数据库名然后在创建视图比如createorreplaceviewv_menu_pop(视图

    4cbc7335cf89dfe95f706bfb2ff33868.png

    从三个方面来区分的话:1、存储:视图存储为数据库设计的一部分,而查询不是.视图可以禁止所有用户访问数据库中的基表,而要求用户只能通过视图操作数据.这种方法可以保护用户和应用程序不受某些数据库修改的影响,同样也可以保护数据表的安全性.2、排序:可以排序任何查询结果,但是只有当视图包括TOP子句时才能排序视图.3、加密:可以加密视图,但不能加密查询.

    展开全文
  • 我有以下几张表:-------image表--------org表-----------user表---------album表----我要将以上四张表关联,可以用sql的join连接语句,但是会很麻烦,现在在mysql创建一个视图会很方便的解决这四个表连接...

    视图可以说是一种虚拟表,建立在基本表的基础上,通过关联一个表或者多个表来获取多个表中需要的字段,视图只是用来查询数据并不能用来存储数据信息。

    我有以下几张表:

    591527c02db987e22e88466d16c71f34.png

    a710ca539ee8cdb0bcec84feb545ed74.png

    -------image表----

    8ede3a083cfad6e20520f8e87570b0b0.png

    ----org表------

    a8a8cecaa629f8fad45a2240699f46f6.png

    -----user表-----

    1378a14de2926780458f97c5fbb240f2.png

    ----album表----

    我要将以上四张表关联,可以用sql的join连接语句,但是会很麻烦,现在在mysql中创建一个视图会很方便的解决这四个表连接的问题。sql语句如下:

    CREATE

    VIEW v_image_org_user_album AS--创建视图并命名v_image_org_user_album

    SELECT --先开from中表的命名

    a.id AS imgid,--将a表中的id命名为新的表(视图)中的imgid字段,剩下的都一样,就是将之前的字段重新命名到新视图表中的字段

    a.comment AS comment,

    a.createtime AS createtime,

    a.path AS path,

    b.name AS authorname,

    b.orgcode AS userorgcode,

    c.name AS orgname,

    e.name AS album

    FROM

    t_image a,--image表命名为a

    t_user b,--user表命名为b

    t_organization c,--organzation表命名为c

    t_album_image d,--album_image表命名为d

    t_album e--album表命名为e

    WHERE

    a.useracc = b.account

    AND b.orgcode = c.orgcode

    AND a.id = d.imageid

    AND d.albumid = e.id

    在数据库中的的编译器中执行该段sql语句,生成以v_image_org_user_album命名的视图表,并且会自动匹配到数据库中存储的数据

    然后在项目中创建相应的域类(grails项目),字段就是视图表中新命名的字段,就可以直接按照新字段进行sql语句的增删改查操作,但是,项目移植时视图要重新生成。这样就将多个表进行关联了,可以直接使用视图表中的字段。

    展开全文
  • 创建视图sql>create view 视图名 as select语句;修改视图并添加别名sql>create or replace view empvu10 (employee_number,employe_name,job_title)as select empno,ename,jobfrom empwhere deptno=10;删除...

    创建视图

    sql>create view 视图名 as select语句;

    修改视图并添加别名

    sql>create or replace view empvu10 (employee_number,employe_name,job_title)

    as select empno,ename,job

    from emp

    where deptno=10;

    删除视图

    drop view 视图名

    创建存储过程

    create procedure 过程名(in n varchar(20),out m int)

    begin

    select count(sal) into m from emp where name=n;

    end;

    调用

    call 过程名(n)

    删除

    drop procedure 过程名

    定义变量

    用户变量:使用set或select直接赋值,变量名以@开头例如:set @var=1;select @var:=5;、

    定义:基于会话变量实现的, 可以暂存值, 并传递给同一连接里的下一条sql使用的变量.当客户端连接退出时,变量会被释放

    用户变量:以"@"开始,形式为"@变量名"

    注意:用户变量跟mysql客户端是绑定的,设置的变量,只对当前用户使用的客户端生效。也叫会话变量。

    赋值

    set @test=1;--或者

    set @test:=1;--或者

    select @test,@tt:=2;

    注意:如果使用没有初始化的变量,其值是NULL。使用set赋值时,使用的是“=”或者":=",使用select赋值时必须使用的是“:="

    局部变量:declare声明,只能在存储过程中使用。

    declare var1 int default 0;declare v1,v2 varchar(20);

    赋值

    set语句进行赋值

    set i=500;--或者

    set i :=500;

    declare必须在begin...end语句块中,必须在最前面

    为了和oracle赋值相匹配,尽量都使用 ":=" 来赋值

    从其他表中拷贝记录

    SQL>insert into managers(id,name,salary,hiredate)

    select empno,ename,sal,hiredate from emp where job='manager';

    可插入多行,插入了3行数据

    展开全文
  • 此外,对于涉及索引视图的 SELECT 语句,如果任何 SET 选项的值不是所需的值,则 SQL Server 在处理该 SELECT 语句时不考虑索引视图替换。在受上述 SET 选项影响的情况中,这将确保查询结果的正确性。 如果应用程序...

    语法:

    CREATE [索引类型] INDEX 索引名称

    ON 表名(列名)

    WITH FILLFACTOR = 填充因子值0~100

    GO

    USE 库名

    GO

    IF EXISTS (SELECT * FROM SYSINDEXES WHERE NAME='IX_TEST_TNAME')--检测是否已经存在IX_TEST_TNAME索引

    DROP INDEX TEST.IX_TEST_TNAME--如果存在则删除

    --创建索引

    CREATE NONCLUSTERED INDEX IX_TEST_TNAME --创建一个非聚集索引

    ON TEST(TNAME) --为TEST表的TNAME字段创建索引

    WITH FILLFACTOR = 30 --填充因子为30%

    GO

    SELECT * FROM TEST(INDEX = IX_TEST_TNAME) WHERE TNAME = 'A' --指定按‘IX_TEST_TNAME’索引查询

    总结:1.什么是索引:数据库中的索引是某个表中一列或多列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。

    2.分类:

    唯一索引(UNIQUE):不允许两行具有相同的索引值(创建了唯一约束,系统将自动创建唯一索引)

    主键索引:主键索引要求主键中的每个值是唯一的,(创建主键自动创建主键索引)

    聚集索引(CLUSTERED):表中各行的物理顺序与键值的逻辑(索引)顺序相同,表中只能包含一个聚集索引,主键列默认为聚集索引

    非聚集索引(NONCLUSTERED):表中各行的物理顺序与键值的逻辑(索引)顺序不匹配,表中可以有249个非聚集索引

    3.创建索引的标准:用于频繁搜索的列;用于对数据进行排序的列

    注意:如果表中仅有几行,或列中只包含几个不同的值,不推荐创建索引,因为SQL Server 在小型表中用索引搜索数据所花的时间比逐行搜索更长。

    实际上,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。下面,我们举例来说明一下聚集索引和非聚集索引的区别:

    其实,我们的汉语字典的正文本身就是一个聚集索引。比如,我们要查“安”字,就会很自然地翻开字典的前几页,因为“安”的拼音是“an”,而按照拼音排序汉字的字典是以英文字母“a”开头并以“z”结尾的,那么“安”字就自然地排在字典的前部。如果您翻完了所有以“a”开头的部分仍然找不到这个字,那么就说明您的字典中没有这个字;同样的,如果查“张”字,那您也会将您的字典翻到最后部分,因为“张”的拼音是“zhang”。也就是说,字典的正文部分本身就是一个目录,您不需要再去查其他目录来找到您需要找的内容。

    我们把这种正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”。

    如果您认识某个字,您可以快速地从自动中查到这个字。但您也可能会遇到您不认识的字,不知道它的发音,这时候,您就不能按照刚才的方法找到您要查的字,而需要去根据“偏旁部首”查到您要找的字,然后根据这个字后的页码直接翻到某页来找到您要找的字。但您结合“部首目录”和“检字表”而查到的字的排序并不是真正的正文的排序方法,比如您查“张”字,我们可以看到在查部首之后的检字表中“张”的页码是672页,检字表中“张”的上面是“驰”字,但页码却是63页,“张”的下面是“弩”字,页面是390页。很显然,这些字并不是真正的分别位于“张”字的上下方,现在您看到的连续的“驰、张、弩”三字实际上就是他们在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。我们可以通过这种方式来找到您所需要的字,但它需要两个过程,先找到目录中的结果,然后再翻到您所需要的页码。

    我们把这种目录纯粹是目录,正文纯粹是正文的排序方式称为“非聚集索引”。

    通过以上例子,我们可以理解到什么是“聚集索引”和“非聚集索引”。

    为给定表或视图创建索引。 只有表或视图的所有者才能为表创建索引。表或视图的所有者可以随时创建索引,无论表中是否有数据。可以通过指定限定的数据库名称,为另一个数据库中的表或视图创建索引。

    语法 CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name ON { table | view } ( column [ ASC | DESC ] [ ,...n ] ) [ WITH < index_option > [ ,...n] ] [ ON filegroup ]

    < index_option > ::= { PAD_INDEX | FILLFACTOR = fillfactor | IGNORE_DUP_KEY | DROP_EXISTING | STATISTICS_NORECOMPUTE | SORT_IN_TEMPDB }

    参数 UNIQUE

    为表或视图创建唯一索引(不允许存在索引值相同的两行)。视图上的聚集索引必须是 UNIQUE 索引。

    在创建索引时,如果数据已存在,Microsoft? SQL Server? 会检查是否有重复值,并在每次使用 INSERT 或 UPDATE 语句添加数据时进行这种检查。如果存在重复的键值,将取消 CREATE INDEX 语句,并返回错误信息,给出第一个重复值。当创建 UNIQUE 索引时,有多个 NULL 值被看作副本。

    如果存在唯一索引,那么会产生重复键值的 UPDATE 或 INSERT 语句将回滚,SQL Server 将显示错误信息。即使 UPDATE 或 INSERT 语句更改了许多行但只产生了一个重复值,也会出现这种情况。如果在有唯一索引并且指定了 IGNORE_DUP_KEY 子句情况下输入数据,则只有违反 UNIQUE 索引的行才会失败。在处理 UPDATE 语句时,IGNORE_DUP_KEY 不起作用。

    SQL Server 不允许为已经包含重复值的列创建唯一索引,无论是否设置了 IGNORE_DUP_KEY。如果尝试这样做,SQL Server 会显示错误信息;重复值必须先删除,才能为这些列创建唯一索引。

    CLUSTERED

    创建一个对象,其中行的物理排序与索引排序相同,并且聚集索引的最低一级(叶级)包含实际的数据行。一个表或视图只允许同时有一个聚集索引。

    具有聚集索引的视图称为索引视图。必须先为视图创建唯一聚集索引,然后才能为该视图定义其它索引。

    在创建任何非聚集索引之前创建聚集索引。创建聚集索引时重建表上现有的非聚集索引。

    如果没有指定 CLUSTERED,则创建非聚集索引。

    说明 因为按照定义,聚集索引的叶级与其数据页相同,所以创建聚集索引时使用 ON filegroup 子句实际上会将表从创建该表时所用的文件移到新的文件组中。在特定的文件组上创建表或索引之前,应确认哪些文件组可用并且有足够的空间供索引使用。文件组的大小必须至少是整个表所需空间的 1.2 倍,这一点很重要。

    NONCLUSTERED

    创建一个指定表的逻辑排序的对象。对于非聚集索引,行的物理排序独立于索引排序。非聚集索引的叶级包含索引行。每个索引行均包含非聚集键值和一个或多个行定位器(指向包含该值的行)。如果表没有聚集索引,行定位器就是行的磁盘地址。如果表有聚集索引,行定位器就是该行的聚集索引键。

    每个表最多可以有 249 个非聚集索引(无论这些非聚集索引的创建方式如何:是使用 PRIMARY KEY 和 UNIQUE 约束隐式创建,还是使用 CREATE INDEX 显式创建)。每个索引均可以提供对数据的不同排序次序的访问。

    对于索引视图,只能为已经定义了聚集索引的视图创建非聚集索引。因此,索引视图中非聚集索引的行定位器一定是行的聚集键。

    index_name

    是索引名。索引名在表或视图中必须唯一,但在数据库中不必唯一。索引名必须遵循标识符规则。

    table

    包含要创建索引的列的表。可以选择指定数据库和表所有者。

    view

    要建立索引的视图的名称。必须使用 SCHEMABINDING 定义视图才能在视图上创建索引。视图定义也必须具有确定性。如果选择列表中的所有表达式、WHERE 和 GROUP BY 子句都具有确定性,则视图也具有确定性。而且,所有键列必须是精确的。只有视图的非键列可能包含浮点表达式(使用 float 数据类型的表达式),而且 float 表达式不能在视图定义的其它任何位置使用。

    若要在确定性视图中查找列,请使用 COLUMNPROPERTY 函数(IsDeterministic 属性)。该函数的 IsPrecise 属性可用来确定键列是否精确。

    必须先为视图创建唯一的聚集索引,才能为该视图创建非聚集索引。

    在 SQL Server 企业版或开发版中,查询优化器可使用索引视图加快查询的执行速度。要使优化程序考虑将该视图作为替换,并不需要在查询中引用该视图。

    在创建索引视图或对参与索引视图的表中的行进行操作时,有 7 个 SET 选项必须指派特定的值。SET 选项 ARITHABORT、CONCAT_NULL_YIELDS_NULL、QUOTED_IDENTIFIER、ANSI_NULLS、 ANSI_PADDING 和 ANSI_WARNING 必须为 ON。SET 选项 NUMERIC_ROUNDABORT 必须为 OFF。

    如果与上述设置有所不同,对索引视图所引用的任何表执行的数据修改语句 (INSERT、UPDATE、DELETE) 都将失败,SQL Server 会显示一条错误信息,列出所有违反设置要求的 SET 选项。此外,对于涉及索引视图的 SELECT 语句,如果任何 SET 选项的值不是所需的值,则 SQL Server 在处理该 SELECT 语句时不考虑索引视图替换。在受上述 SET 选项影响的情况中,这将确保查询结果的正确性。

    如果应用程序使用 DB-Library 连接,则必须为服务器上的所有 7 个 SET 选项指派所需的值。(默认情况下,OLE DB 和 ODBC 连接已经正确设置了除 ARITHABORT 外所有需要的 SET 选项。)

    如果并非所有上述 SET 选项均有所需的值,则某些操作(例如 BCP、复制或分布式查询)可能无法对参与索引视图的表执行更新。在大多数情况下,将 ARITHABORT 设置为 ON(通过服务器配置选项中的 user options)可以避免这一问题。

    强烈建议在服务器的任一数据库中创建计算列上的第一个索引视图或索引后,尽早在服务器范围内将 ARITHABORT 用户选项设置为 ON。

    有关索引视图注意事项和限制的更多信息,请参见注释部分。

    column

    应用索引的列。指定两个或多个列名,可为指定列的组合值创建组合索引。在 table 后的圆括号中列出组合索引中要包括的列(按排序优先级排列)。

    说明 由 ntext、text 或 image 数据类型组成的列不能指定为索引列。另外,视图不能包括任何 text、ntext 或 image 列,即使在 CREATE INDEX 语句中没有引用这些列。

    当两列或多列作为一个单位搜索最好,或者许多查询只引用索引中指定的列时,应使用组合索引。最多可以有 16 个列组合到一个组合索引中。组合索引中的所有列必须在同一个表中。组合索引值允许的最大大小为 900 字节。也就是说,组成组合索引的固定大小列的总长度不得超过 900 字节。有关组合索引中可变类型列的更多信息,请参见注释部分。

    [ASC | DESC]

    确定具体某个索引列的升序或降序排序方向。默认设置为 ASC。

    n

    表示可以为特定索引指定多个 columns 的占位符。

    PAD_INDEX

    指定索引中间级中每个页(节点)上保持开放的空间。PAD_INDEX 选项只有在指定了 FILLFACTOR 时才有用,因为 PAD_INDEX 使用由 FILLFACTOR 所指定的百分比。默认情况下,给定中间级页上的键集,SQL Server 将确保每个索引页上的可用空间至少可以容纳一个索引允许的最大行。如果为 FILLFACTOR 指定的百分比不够大,无法容纳一行,SQL Server 将在内部使用允许的最小值替代该百分比。

    说明 中间级索引页上的行数永远都不会小于两行,无论 FILLFACTOR 的值有多小。

    FILLFACTOR = fillfactor

    指定在 SQL Server 创建索引的过程中,各索引页叶级的填满程度。如果某个索引页填满,SQL Server 就必须花时间拆分该索引页,以便为新行腾出空间,这需要很大的开销。对于更新频繁的表,选择合适的 FILLFACTOR 值将比选择不合适的 FILLFACTOR 值获得更好的更新性能。FILLFACTOR 的原始值将在 sysindexes 中与索引一起存储。

    如果指定了 FILLFACTOR,SQL Server 会向上舍入每页要放置的行数。例如,发出 CREATE CLUSTERED INDEX ...FILLFACTOR = 33 将创建一个 FILLFACTOR 为 33% 的聚集索引。假设 SQL Server 计算出每页空间的 33% 为 5.2 行。SQL Server 将其向上舍入,这样,每页就放置 6 行。

    说明 显式的 FILLFACTOR 设置只是在索引首次创建时应用。SQL Server 并不会动态保持页上可用空间的指定百分比。

    用户指定的 FILLFACTOR 值可以从 1 到 100。如果没有指定值,默认值为 0。如果 FILLFACTOR 设置为 0,则只填满叶级页。可以通过执行 sp_configure 更改默认的 FILLFACTOR 设置。

    只有不会出现 INSERT 或 UPDATE 语句时(例如对只读表),才可以使用 FILLFACTOR 100。如果 FILLFACTOR 为 100,SQL Server 将创建叶级页 100% 填满的索引。如果在创建 FILLFACTOR 为 100% 的索引之后执行 INSERT 或 UPDATE,会对每次 INSERT 操作以及有可能每次 UPDATE 操作进行页拆分。

    如果 FILLFACTOR 值较小(0 除外),就会使 SQL Server 创建叶级页不完全填充的新索引。例如,如果已知某个表包含的数据只是该表最终要包含的数据的一小部分,那么为该表创建索引时,FILLFACTOR 为 10 会是合理的选择。FILLFACTOR 值较小还会使索引占用较多的存储空间。

    下表说明如何在已指定 FILLFACTOR 的情况下填充索引页。

    FILLFACTOR 中间级页叶级页 0 一个可用项 100% 填满 1% -99 一个可用项 <= FILLFACTOR% 填满 100% 一个可用项 100% 填满

    一个可用项是指页上可以容纳另一个索引项的空间。

    重要 用某个 FILLFACTOR 值创建聚集索引会影响数据占用存储空间的数量,因为 SQL Server 在创建聚集索引时会重新分布数据。

    IGNORE_DUP_KEY

    控制当尝试向属于唯一聚集索引的列插入重复的键值时所发生的情况。如果为索引指定了 IGNORE_DUP_KEY,并且执行了创建重复键的 INSERT 语句,SQL Server 将发出警告消息并忽略重复的行。

    如果没有为索引指定 IGNORE_DUP_KEY,SQL Server 会发出一条警告消息,并回滚整个 INSERT 语句。

    下表显示何时可使用 IGNORE_DUP_KEY。

    索引类型 选项 聚集 不允许 唯一聚集 允许使用 IGNORE_DUP_KEY 非聚集 不允许 唯一非聚集 允许使用 IGNORE_DUP_KEY

    DROP_EXISTING

    指定应除去并重建已命名的先前存在的聚集索引或非聚集索引。指定的索引名必须与现有的索引名相同。因为非聚集索引包含聚集键,所以在除去聚集索引时,必须重建非聚集索引。如果重建聚集索引,则必须重建非聚集索引,以便使用新的键集。

    为已经具有非聚集索引的表重建聚集索引时(使用相同或不同的键集), DROP_EXISTING 子句可以提高性能。DROP_EXISTING 子句代替了先对旧的聚集索引执行 DROP INDEX 语句,然后再对新的聚集索引执行 CREATE INDEX 语句的过程。非聚集索引只需重建一次,而且还只是在键不同的情况下才需要。

    如果键没有改变(提供的索引名和列与原索引相同),则 DROP_EXISTING 子句不会重新对数据进行排序。在必须压缩索引时,这样做会很有用。

    无法使用 DROP_EXISTING 子句将聚集索引转换成非聚集索引;不过,可以将唯一聚集索引更改为非唯一索引,反之亦然。

    说明 当执行带 DROP_EXISTING 子句的 CREATE INDEX 语句时,SQL Server 假定索引是一致的(即索引没有损坏)。指定索引中的行应按 CREATE INDEX 语句中引用的指定键排序。

    STATISTICS_NORECOMPUTE

    指定过期的索引统计不会自动重新计算。若要恢复自动更新统计,可执行没有 NORECOMPUTE 子句的 UPDATE STATISTICS。

    重要 如果禁用分布统计的自动重新计算,可能会妨碍 SQL Server 查询优化器为涉及该表的查询选取最佳执行计划。

    SORT_IN_TEMPDB

    指定用于生成索引的中间排序结果将存储在 tempdb 数据库中。如果 tempdb 与用户数据库不在同一磁盘集,则此选项可能减少创建索引所需的时间,但会增加创建索引时使用的磁盘空间。

    有关更多信息,请参见 tempdb 和索引创建。

    ON filegroup

    在给定的 filegroup 上创建指定的索引。该文件组必须已经通过执行 CREATE DATABASE 或 ALTER DATABASE 创建。

    注释 为表或索引分配空间时,每次递增一个扩展盘区(8 个 8 KB 的页)。每填满一个扩展盘区,就会再分配一个。如果表非常小或是空表,其索引将使用单页分配,直到向索引添加了 8 页后,再转而进行扩展盘区分配。若要获得有关索引已分配和占用的空间数量的报表,请使用 sp_spaceused。

    创建聚集索引要求数据库中的可用空间大约为数据大小的 1.2 倍。该空间不包括现有表占用的空间;将对数据进行复制以创建聚集索引,旧的无索引数据将在索引创建完成后删除。使用 DROP_EXISTING 子句时,聚集索引所需的空间数量与现有索引的空间要求相同。所需的额外空间可能还受指定的 FILLFACTOR 的影响。

    在 SQL Server 2000 中创建索引时,可以使用 SORT_IN_TEMPDB 选项指示数据库引擎在 tempdb 中存储中间索引排序结果。如果 tempdb 在不同于用户数据库所在的磁盘集上,则此选项可能减少创建索引所需的时间,但会增加用于创建索引的磁盘空间。除在用户数据库中创建索引所需的空间外, tempdb 还必须有大约相同的额外空间来存储中间排序结果。有关更多信息,请参见 tempdb 和索引创建。

    CREATE INDEX 语句同其它查询一样优化。SQL Server 查询处理器可以选择扫描另一个索引,而不是执行表扫描,以节省 I/O 操作。在某些情况下,可以不必排序。

    在运行 SQL Server 企业管理器和程序员版的多处理器计算机上,CREATE INDEX 自动使用多个处理器执行扫描和排序,与其它查询的操作方式相同。执行一条 CREATE INDEX 语句所使用的处理器数由配置选项 max degree of parallelism 和当前的工作负荷决定。如果 SQL Server 检测到系统正忙,则在开始执行语句之前,CREATE INDEX 操作的并发程度会自动降低。

    自上一次文件组备份以来受 CREATE INDEX 语句影响的全部文件组必须作为一个单位备份。有关文件和文件组备份的更多信息,请参见 BACKUP。

    备份和 CREATE INDEX 操作不相互防碍。如果正在进行备份,则在完整日志记录模式中创建索引,而这可能需要额外的日志空间。

    若要显示有关对象索引的报表,请执行 sp_helpindex。

    可以为临时表创建索引。在除去表或终止会话时,所有索引和触发器都将被除去。

    索引中的可变类型列 索引键允许的最大大小为 900 字节,不过 SQL Server 2000 允许在可能包含大量可变类型列的列上创建索引,而这些列的最大大小超过 900 字节。

    在创建索引时,SQL Server 检查下列条件:

    所有参与索引定义的固定数据列的总长度必须小于或等于 900 字节。当所要创建的索引只由固定数据列构成时,固定数据列的总计大小必须小于或等于 900 字节。否则将不能创建索引,且 SQL Server 将返回错误。

    如果索引定义由固定类型列和可变类型列组成,且固定数据列满足前面的条件(小于或等于 900 字节),则 SQL Server 仍要检查可变类型列的总大小。如果可变类型列的最大大小与固定数据列大小的和大于 900 字节,则 SQL Server 将创建索引,不过将给用户返回警告消息以提醒用户:如果随后在可变类型列上的插入或更新操作导致总大小超过 900 字节,则操作将失败且用户将收到运行时错误。同样,如果索引定义只由可变类型列组成,且这些列的最大总大小大于 900 字节,则 SQL Server 将创建索引,不过将返回警告消息。 有关更多信息,请参见索引键的最大值。

    在计算列和视图上创建索引时的考虑 在 SQL Server 2000 中,还可以在计算列和视图上创建索引。在视图上创建唯一聚集索引可以提高查询性能,因为视图存储在数据库中的方式与具有聚集索引的表的存储方式相同。

    UNIQUE 或 PRIMARY KEY 只要满足所有索引条件,就可以包含计算列。具体说来就是,计算列必须具有确定性、必须精确,且不能包含 text、ntext 或 image 列。有关确定性的更多信息,请参见确定性函数和非确定性函数。

    在计算列或视图上创建索引可能导致前面产生的 INSERT 或 UPDATE 操作失败。当计算列导致算术错误时可能产生这样的失败。例如,虽然下表中的计算列 c 将导致算术错误,但是 INSERT 语句仍有效:

    CREATE TABLE t1 (a int, b int, c AS a/b) GO INSERT INTO t1 VALUES ('1', '0') GO

    相反,如果创建表之后在计算列 c 上创建索引,则上述 INSERT 语句将失败。

    CREATE TABLE t1 (a int, b int, c AS a/b) GO CREATE UNIQUE CLUSTERED INDEX Idx1 ON t1.c GO INSERT INTO t1 VALUES ('1', '0') GO

    在通过数字或 float 表达式定义的视图上使用索引所得到的查询结果,可能不同于不在视图上使用索引的类似查询所得到的结果。这种差异可能是由对基础表进行 INSERT、DELETE 或 UPDATE 操作时的舍入错误引起的。

    若要防止 SQL Server 使用索引视图,请在查询中包含 OPTION (EXPAND VIEWS) 提示。此外,任何所列选项设置不正确均会阻止优化程序使用视图上的索引。有关 OPTION (EXPAND VIEWS) 提示的更多信息,请参见 SELECT。

    对索引视图的限制 定义索引视图的 SELECT 语句不得包含 TOP、DISTINCT、COMPUTE、HAVING 和 UNION 关键字。也不能包含子查询。

    SELECT 列表中不得包含星号 (*)、'table.*' 通配符列表、DISTINCT、COUNT(*)、COUNT()、基表中的计算列和标量聚合。

    非聚合 SELECT 列表中不能包含表达式。聚合 SELECT 列表(包含 GROUP BY 的查询)中可能包含 SUM 和 COUNT_BIG();它一定包含 COUNT_BIG(*)。不允许有其它聚合函数(MIN、MAX、STDEV,...)。

    使用 AVG 的复杂聚合无法参与索引视图的 SELECT 列表。不过,如果查询使用这样的聚合,则优化程序将能使用该索引视图,用 SUM 和 COUNT_BIG 的简单聚合组合代替 AVG。

    若某列是从取值为 float 数据类型或使用 float 表达式进行取值的表达式得到的,则不能作为索引视图或表中计算列的索引键。这样的列被视为是不精确的。使用 COLUMNPROPERTY 函数决定特定计算列或视图中的列是否精确。

    索引视图受限于以下的附加限制:

    索引的创建者必须拥有表。所有表、视图和索引必须在同一数据库中创建。

    定义索引视图的 SELECT 语句不得包含视图、行集函数、行内函数或派生表。同一物理表在该语句中只能出现一次。

    在任何联接表中,均不允许进行 OUTER JOIN 操作。

    搜索条件中不允许使用子查询或者 CONTAINS 或 FREETEXT 谓词。

    如果视图定义包含 GROUP BY 子句,则视图的 SELECT 列表中必须包含所有分组依据列及 COUNT_BIG(*) 表达式。此外,CREATE UNIQUE CLUSTERED INDEX 子句中必须只包含这些列。 可以创建索引的视图的定义主体必须具有确定性且必须精确,这类似于计算列上的索引要求。请参见在计算列上创建索引。

    权限 CREATE INDEX 的权限默认授予 sysadmin 固定服务器角色、db_ddladmin 和 db_owner 固定数据库角色和表所有者且不能转让。

    示例 A. 使用简单索引 下面的示例为 authors 表的 au_id 列创建索引。

    SET NOCOUNT OFF USE pubs IF EXISTS (SELECT name FROM sysindexes WHERE name = 'au_id_ind') DROP INDEX authors.au_id_ind GO USE pubs CREATE INDEX au_id_ind ON authors (au_id) GO

    B. 使用唯一聚集索引 下面的示例为 emp_pay 表的 employeeID 列创建索引,并且强制唯一性。因为指定了 CLUSTERED 子句,所以该索引将对磁盘上的数据进行物理排序。

    SET NOCOUNT ON USE pubs IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'emp_pay') DROP TABLE emp_pay GO USE pubs IF EXISTS (SELECT name FROM sysindexes WHERE name = 'employeeID_ind') DROP INDEX emp_pay.employeeID_ind GO USE pubs GO CREATE TABLE emp_pay ( employeeID int NOT NULL, base_pay money NOT NULL, commission decimal(2, 2) NOT NULL ) INSERT emp_pay VALUES (1, 500, .10) INSERT emp_pay VALUES (2, 1000, .05) INSERT emp_pay VALUES (3, 800, .07) INSERT emp_pay VALUES (5, 1500, .03) INSERT emp_pay VALUES (9, 750, .06) GO SET NOCOUNT OFF CREATE UNIQUE CLUSTERED INDEX employeeID_ind ON emp_pay (employeeID) GO

    C. 使用简单组合索引 下面的示例为 order_emp 表的 orderID 列和 employeeID 列创建索引。

    SET NOCOUNT ON USE pubs IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'order_emp') DROP TABLE order_emp GO USE pubs IF EXISTS (SELECT name FROM sysindexes WHERE name = 'emp_order_ind') DROP INDEX order_emp.emp_order_ind GO USE pubs GO CREATE TABLE order_emp ( orderID int IDENTITY(1000, 1), employeeID int NOT NULL, orderdate datetime NOT NULL DEFAULT GETDATE(), orderamount money NOT NULL )

    INSERT order_emp (employeeID, orderdate, orderamount) VALUES (5, '4/12/98', 315.19) INSERT order_emp (employeeID, orderdate, orderamount) VALUES (5, '5/30/98', 1929.04) INSERT order_emp (employeeID, orderdate, orderamount) VALUES (1, '1/03/98', 2039.82) INSERT order_emp (employeeID, orderdate, orderamount) VALUES (1, '1/22/98', 445.29) INSERT order_emp (employeeID, orderdate, orderamount) VALUES (4, '4/05/98', 689.39) INSERT order_emp (employeeID, orderdate, orderamount) VALUES (7, '3/21/98', 1598.23) INSERT order_emp (employeeID, orderdate, orderamount) VALUES (7, '3/21/98', 445.77) INSERT order_emp (employeeID, orderdate, orderamount) VALUES (7, '3/22/98', 2178.98) GO SET NOCOUNT OFF CREATE INDEX emp_order_ind ON order_emp (orderID, employeeID)

    D. 使用 FILLFACTOR 选项 下面的示例使用 FILLFACTOR 子句,将其设置为 100。FILLFACTOR 为 100 将完全填满每一页,只有确定表中的索引值永远不会更改时,该选项才有用。

    SET NOCOUNT OFF USE pubs IF EXISTS (SELECT name FROM sysindexes WHERE name = 'zip_ind') DROP INDEX authors.zip_ind GO USE pubs GO CREATE NONCLUSTERED INDEX zip_ind ON authors (zip) WITH FILLFACTOR = 100

    E. 使用 IGNORE_DUP_KEY 下面的示例为 emp_pay 表创建唯一聚集索引。如果输入了重复的键,将忽略该 INSERT 或 UPDATE 语句。

    SET NOCOUNT ON USE pubs IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'emp_pay') DROP TABLE emp_pay GO USE pubs IF EXISTS (SELECT name FROM sysindexes WHERE name = 'employeeID_ind') DROP INDEX emp_pay.employeeID_ind GO USE pubs GO CREATE TABLE emp_pay ( employeeID int NOT NULL, base_pay money NOT NULL, commission decimal(2, 2) NOT NULL ) INSERT emp_pay VALUES (1, 500, .10) INSERT emp_pay VALUES (2, 1000, .05) INSERT emp_pay VALUES (3, 800, .07) INSERT emp_pay VALUES (5, 1500, .03) INSERT emp_pay VALUES (9, 750, .06) GO SET NOCOUNT OFF GO CREATE UNIQUE CLUSTERED INDEX employeeID_ind ON emp_pay(employeeID) WITH IGNORE_DUP_KEY

    F. 使用 PAD_INDEX 创建索引 下面的示例为 authors 表中的作者标识号创建索引。没有 PAD_INDEX 子句,SQL Server 将创建填充 10% 的叶级页,但是叶级之上的页几乎被完全填满。使用 PAD_INDEX 时,中间级页也填满 10%。

    说明 如果没有指定 PAD_INDEX,唯一聚集索引的索引页上至少会出现两项。

    SET NOCOUNT OFF USE pubs IF EXISTS (SELECT name FROM sysindexes WHERE name = 'au_id_ind') DROP INDEX authors.au_id_ind GO USE pubs CREATE INDEX au_id_ind ON authors (au_id) WITH PAD_INDEX, FILLFACTOR = 10

    G. 为视图创建索引 下面的示例将创建一个视图,并为该视图创建索引。然后,引入两个使用该索引视图的查询。

    USE Northwind GO

    --Set the options to support indexed views. SET NUMERIC_ROUNDABORT OFF GO SET ANSI_PADDING,ANSI_WARNINGS,CONCAT_NULL_YIELDS_NULL,ARITHABORT,QUOTED_IDENTIFIER,ANSI_NULLS ON GO

    --Create view. CREATE VIEW V1 WITH SCHEMABINDING AS SELECT SUM(UnitPrice*Quantity*(1.00-Discount)) AS Revenue, OrderDate, ProductID, COUNT_BIG(*) AS COUNT FROM dbo.[Order Details] od, dbo.Orders o WHERE od.OrderID=o.OrderID GROUP BY OrderDate, ProductID GO

    --Create index on the view. CREATE UNIQUE CLUSTERED INDEX IV1 ON V1 (OrderDate, ProductID) GO

    --This query will use the above indexed view. SELECT SUM(UnitPrice*Quantity*(1.00-Discount)) AS Rev, OrderDate, ProductID FROM dbo.[Order Details] od, dbo.Orders o WHERE od.OrderID=o.OrderID AND ProductID in (2, 4, 25, 13, 7, 89, 22, 34) AND OrderDate >= '05/01/1998' GROUP BY OrderDate, ProductID ORDER BY Rev DESC

    --This query will use the above indexed view. SELECT OrderDate, SUM(UnitPrice*Quantity*(1.00-Discount)) AS Rev FROM dbo.[Order Details] od, dbo.Orders o WHERE od.OrderID=o.OrderID AND DATEPART(mm,OrderDate)= 3 AND DATEPART(yy,OrderDate) = 1998 GROUP BY OrderDate ORDER BY OrderDate ASC

    展开全文
  • MySQL 获取创建视图SQL语句
  • 2018-06-01 回答一、 简单查询简单的transact-sql查询只包括选择列表、from子句和where子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。例如,下面的语句查询testtable表中姓名为"张三"的nickname字段...
  • MySql 数据库查看视图创建sql语句

    万次阅读 2019-02-22 22:16:06
    在网上能找到大量的视图创建、修改、删除的语句,但是查看创建语句语句不好找。 show create view VIEW_NAME  
  • SQL语法(包括建库、建表、建视图、查询、增加、删除、修改)SQL分类:DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)DCL—数据控制语言(GRANT,REVOKE,COMMIT...
  • 创建视图CREATE[ORREPLACE][ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]VIEWview_name[(column_list)]ASselect_statement[WITH[CASCADED|LOCAL]CHECKOPTION]修改视图ALTER[ALGORITHM={UNDEFINED|MERGE|T...
  • 视图相当于我们提前编写好的查询,在需要使用的时候才执行,这样就简化了SQL语句,对于一些复杂且又需要重复的语句起到了简化的作用,也提高了SQL的重用性。其次视图只是一个虚拟表,对原始的数据起到了保护的作用,...
  • 为了避免复杂的数据库级联,可以采用视图的方式,将多个表中的字段加到视图中。这样在查询或修改数据时,只需查询或... 2、切换到“定义”选项卡,可以看到创建视图的实际sql语句。`info` join `user` 表示:info表...
  • 什么是视图视图是数据库中的一个对象,它是数据库管理系统提供给用户的以多种角度观察数据库...重用SQL语句4.保护数据安全5.共享所需数据6.更改数据格式CREATE TABLE customers(cust_id int NOT NULL AUTO_INCREMEN...
  • SQL 中,一个视图是基于某个 SELECT 语句的结果集的可视化的表。视图包含行和列,就像一个真实的表。视图中的域就是来自一个或多个数据库中的真实的表中的域。我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句...
  • 一、视图本质上相当于一张“虚拟表”,可当作...使得外部调用不用每次都编写复杂的SQL语句,直接当作一张“虚拟表”来调用即可等等,听说你们都很喜欢我~那给个小心心00~,为了表扬你们,戳这里有你们想要的完整zlCu...
  • 视图:对于一个sql查询,如果发生了修改,就需要修改sql语句。我们可以通过定义视图来解决问题。改变需求之后就改变视图视图是对查询的封装定义视图: create view 视图名称 as select语句;例如:定义视图 查询所有...
  • 一、视图视图是一个虚拟表(非真实存在),其本质是【根据SQL语句获取动态的数据集,并为其命名】,用户使用时只需使用【名称】即可获取结果集,可以将该结果集当做表来使用。使用视图我们可以把查询过程中的临时表摘...
  • 概念一条或者多条sql语句的集合!事务:就是一堆操作的集合,他们同生共死。要么都执行成功,要么都执行失败2.事务的特性 ACIDA:原子性 完整的,不可分割的原子性 (Atomicity):在事务中的操作,要么都执行,要么都...
  • 如果我们的语句为:sql;">IF NOT EXISTS(SELECT 1 FROM sys.views WHERE name='Report_IndividualTicket')BEGINcreate view Report_IndividualTicketasSELECT Ticket.TicketNumber,Ticket.TicketID,GisProcess....
  • 一、注意点1、索引视图所引用的基表...4、在创建索引视图的select语句时,不能使用*,必须指定具体的列名;5、只能为索引视图创建唯一聚集索引;6、索引视图中的select包含一个或多个 UNION、INTERSECT 或 EXCEPT...
  • 本文实例讲述了mysql视图之创建视图(CREATE VIEW)和使用限制。分享给大家供大家参考,具体如下:mysql5.x 版本之后支持数据库视图,在mysql中,视图的几乎特征符合SQL:2003标准。 mysql以两种方式处理对视图的查询...
  • |-用于检索和修改数据 DDL(DataDefinition Language)数据定义语言 |-用于创建、修改、删除数据库对象(表,关系、索引、视图) DLC(Data Control Language)数据控制语SQL语句从功能上可以区分如下三类:DML(Data ...
  • 在不同的使用场景下,比如商品展示的,商品列表,商品详情,可能会用到相同的业务逻辑,而且这个逻辑写出的sql语句特别的麻烦,没有必要重复书写多次,可以使用视图,一次创建,下一次使用相同的逻辑的时候,使用...
  • 创建视图sql>create view 视图名 as select语句;修改视图并添加别名sql>create or replace view empvu10 (employee_number,employe_name,job_title)as select empno,ename,jobfrom empwhere deptno=10;删除...
  • MySQL创建视图
  • 请按要求对YGGL库建立相关索引(1)使用create index 语句创建索引1.对employees表中的员工部门号创建普通索引depart_ind.mysql> create index depart_ind-> on employees(员工编号);Query OK, 12 rows affected...
  • 为了避免复杂的数据库级联,可以采用视图的方式,将多个表中的字段加到视图中。这样在查询或修改数据时,只需查询或...2、切换到“定义”选项卡,可以看到创建视图的实际sql语句。`info` join `user` 表示:info表与...
  • SQL语句中的大小写问题a.关键字、函数名、列名和索引名不区分大小写。b.数据库名、表名、别名及视图名区分大小写。一.基本的操作1.库操作mysql>show databases; #查看所有库mysql> usemysql; #切换库mysql>...

空空如也

空空如也

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

mysql创建视图sql语句

mysql 订阅