精华内容
下载资源
问答
  • sql语句创建唯一性索引
    千次阅读
    2016-01-27 08:37:52

    使用sql语句创建唯一索引,格式如下:
    create unique index 索引名 on 表名(列名1,列名2……)

    示例;在表GoodsMade_Labour的SID列上创建唯一索引IX_GoodsMade_Labour,代码如下:

    create unique index IX_GoodsMade_Labour on GoodsMade_Labour(SID)

    这样情况下创建的是非聚集索引,它和使用nonclustered关键效果是一样的。

    create unique nonclustered index IX_GoodsMade_Labour on GoodsMade_Labour(SID)

    如果要创建聚集索引,可使用关键字clustered,代码如下:

    create unique clustered index IX_GoodsMade_Labour on GoodsMade_Labour(SID)

    本文来自:.Net学习网 http://www.lmwlove.com/ac/ID902

    更多相关内容
  • Sql Server 创建唯一聚集索引典型实现

    千次阅读 2020-03-10 14:41:55
    创建唯一聚集索引典型实现 唯一索引可通过以下方式实现: PRIMARY KEY 或 UNIQUE 约束 在创建 PRIMARY KEY 约束时,如果不存在该表的聚集索引且未指定唯一非聚集索引,则将自动对一列或多列创建唯一聚集索引。...

    创建唯一聚集索引典型实现

    唯一索引可通过以下方式实现:

    • PRIMARY KEY 或 UNIQUE 约束

      在创建 PRIMARY KEY 约束时,如果不存在该表的聚集索引且未指定唯一非聚集索引,则将自动对一列或多列创建唯一聚集索引。 主键列不允许空值。

      在创建 UNIQUE 约束时,默认情况下将创建唯一非聚集索引,以便强制 UNIQUE 约束。 如果不存在该表的聚集索引,则可以指定唯一聚集索引。

      有关详细信息,请参阅 Unique Constraints and Check Constraints 和 Primary and Foreign Key Constraints

    • 独立于约束的索引

      可以为一个表定义多个唯一非聚集索引。

      有关详细信息,请参阅 CREATE INDEX (Transact-SQL)

    • 索引视图

      若要创建索引视图,请对一个或多个视图列定义唯一聚集索引。 视图将执行,并且结果集存储在该索引的页级别中,其存储方式与表数据存储在聚集索引中的方式相同。 有关详细信息,请参阅 创建索引视图

    创建唯一聚集索引限制和局限

    • 如果数据中存在重复的键值,则不能创建唯一索引、UNIQUE 约束或 PRIMARY KEY 约束。

    • 唯一非聚集索引可以包括包含性非键列。 有关详细信息,请参阅 Create Indexes with Included Columns

    使用SSMS数据库管理工具创建唯一聚集索引

    使用表设计器创建唯一索引

    1、连接数据库,选择数据库,选择数据表-》右键点击数据表-》选择设计。

    2、在表设计器窗口-》选择要添加索引的数据列-》右键点击-》选择索引/键。

    3、在索引/键弹出款-》点击添加-》类型选择索引-》点击选择列。

    4、在索引列弹出框-》选择索引数据列-》选择索引排序方式-》可以添加多个索引列-》点击确定。

    5、在索引/键弹出框-》是唯一的选择是-》输入索引名称-》输入索引描述-》创建为聚集的选择为是-》其它可以选择默认或者自己设置-》点击关闭。

    6、点击保存(或者按下ctrl+s)-》关闭表设计器-》刷新表-》查看创建结果。

    使用对象资源管理器创建唯一索引

    1、连接数据库,选择数据库,选择数据表-》展开对象资源管理器-》右键点击索引-》点击新建索引-》选择聚集索引。

    2、在新建索引弹出框-》输入索引名称-》选择唯一创建为唯一聚集索引-》点击添加选择索引数据列。

    3、在表选择列弹出框中-》选择数据列,可以选择多个-》点击确定。

    4、在新建索引弹出框-》点击选项-》可以自行设置索引属性。

    5、在新建索引弹出框-》点击存储-》选择设置存储存储属性。

    6、在新建索引弹出框-》点击扩展属性-》添加扩展属性名称-》添加扩展属性值-》点击确定。

    7、查看创建结果。

    使用T-SQL脚本创建唯一聚集索引

    语法:

    --声明数据库引用
    use 数据库名;
    go

    --判断索引是否存在
    if exists(select * from sysindexes where name=索引名)
    drop index 索引名 on 表名 with (online=off);
    go

    --添加索引
    create 
    --[unique] --指定聚集索引是否唯一
    [clustered | nonclustered]  --指定为聚集索引
    index 索引名称 --索引名称
    on 表名  --索引添加在哪个表
    (列名 [asc | desc],列名 [asc | desc],...) --索引添加在哪个数据列

    with(

    --pad_index:指定索引填充
    --pad_index=on:FILLFACTOR 指定的可用空间百分比应用于索引的中间级页。
    --pad_index=off或未指定 fillfactor:考虑到中间级页上的键集,可以将中间级页几乎填满,但至少要为最大索引行留出足够空间。
    pad_index={ on | off },

    --statistics_norecompute:指定是否重新计算统计信息。
    --statistics_norecompute=on:过时的统计信息不会自动重新计算。
    --statistics_norecompute=off:启用自动统计信息更新。
    statistics_norecompute={ on | off },

    --sort_in_tempdb:指定是否将排序结果存储在 tempdb 中。
    --sort_in_tempdb=on:在tempdb中存储用于生成索引的中间排序结果。如果tempdb与用户数据库不在同一组磁盘上,就可缩短创建索引所需的时间。但是,这会增加索引生成期间所使用的磁盘空间量。
    --sort_in_tempdb=off:中间排序结果与索引存储在同一数据库中。
    sort_in_tempdb={ on | off },

    --ignore_dup_key:指定在插入操作尝试向唯一索引插入重复键值时的响应类型。 IGNORE_DUP_KEY 选项仅适用于创建或重新生成索引后发生的插入操作。 当执行 CREATE INDEX、ALTER INDEX 或 UPDATE 时,该选项无效。 默认为 OFF。
    --ignore_dup_key=on:打开,将重复键值插入唯一索引时会出现警告消息。只有违反唯一性的行为才会失败。
    --ignore_dup_key=off:关闭,将重复键值插入唯一索引时会出现错误消息。回滚整个INSERT操作。对于对视图创建的索引、非唯一索引、XML 索引、空间索引以及筛选的索引,IGNORE_DUP_KEY 不能设置为 ON
    ignore_dup_key={ on | off },

    --drop_existing:表示如果这个索引还在表上就 drop 掉然后在 create 一个新的。 默认为 OFF。
    --drop_existing=on:指定要删除并重新生成现有索引,其必须具有相同名称作为参数 index_name。
    --drop_existing=off:指定不删除和重新生成现有的索引。 如果指定的索引名称已经存在,SQL Server 将显示一个错误。
    drop_existing={ on | off },

    --online:指定在索引操作期间基础表和关联的索引是否可用于查询和数据修改操作。 默认为 OFF。 REBUILD 可作为 ONLINE 操作执行。
    --online=on:在索引操作期间不持有长期表锁。 在索引操作的主要阶段,源表上只使用意向共享 (IS) 锁。 
    --这使得能够继续对基础表和索引进行查询或更新。 
    --操作开始时,在很短的时间内对源对象持有共享 (S) 锁。
    --操作结束时,如果创建非聚集索引,将在短期内获取对源的 S(共享)锁;
    --当联机创建或删除聚集索引时,以及重新生成聚集或非聚集索引时,将在短期内获取 SCH-M(架构修改)锁。 但联机索引锁是短的元数据锁,特别是 Sch-M 锁必须等待此表上的所有阻塞事务完成。 
    --在等待期间,Sch-M 锁在访问同一表时阻止在此锁后等待的所有其他事务。 对本地临时表创建索引时,ONLINE 不能设置为 ON。
    --online=off:在索引操作期间应用表锁。这样可以防止所有用户在操作期间访问基础表。
    --创建、重新生成或删除聚集索引或者重新生成或删除非聚集索引的脱机索引操作将对表获取架构修改 (Sch-M) 锁。 
    --这样可以防止所有用户在操作期间访问基础表。 创建非聚集索引的脱机索引操作将对表获取共享 (S) 锁。 这样可以防止更新基础表,但允许读操作(如 SELECT 语句)。
    online={ on | off },

    --aloow_row_locks:指定是否允许行锁。
    --allow_row_locks=on:访问索引时允许行锁。数据库引擎确定何时使用行锁。
    --allow_row_locks=off:不使用行锁。
    allow_row_locks={ on | off }, 

    --allow_page_locks:指定是否允许使用页锁。
    --allow_page_locks=on:访问索引时允许页锁。数据库引擎确定何时使用页锁。
    -- allow_page_locks=off:不使用页锁。
    allow_page_locks={ on | off },

    --fillfactor=n:指定一个百分比,指示在数据库引擎创建或修改索引的过程中,应将每个索引页面的叶级填充到什么程度。 指定的值必须是 1 到 100 之间的整数。 默认值为 0。
    fillfactor=n

    --maxdop=max_degree_of_parallelism:在索引操作期间替代 max degree of parallelism 配置选项。 有关详细信息,请参阅 配置 max degree of parallelism 服务器配置选项。 使用 MAXDOP 可以限制在执行并行计划的过程中使用的处理器数量。 最大数量为 64 个处理器。
    --max_degree_of_parallelism 可以是:
    --1 - 取消生成并行计划。
    -->1 - 将并行索引操作中使用的最大处理器数量限制为指定数量。
    --0(默认值)- 根据当前系统工作负荷使用实际数量的处理器或更少数量的处理器。
    --有关详细信息,请参阅 配置并行索引操作。
    --maxdop=max_degree_of_parallelism,

    --data_compression=row:为指定的表、分区号或分区范围指定数据压缩选项。 选项如下所示:
    --none
    --不压缩表或指定的分区。 仅适用于行存储表;不适用于列存储表。
    --row
    --使用行压缩来压缩表或指定的分区。 仅适用于行存储表;不适用于列存储表。
    --page
    --使用页压缩来压缩表或指定的分区。 仅适用于行存储表;不适用于列存储表。
    --columnstore
    --适用范围: SQL Server 2014 (12.x) 到 SQL Server 2017。
    --仅适用于列存储表。 COLUMNSTORE 指定对使用 COLUMNSTORE_ARCHIVE 选项压缩的分区进行解压缩。 还原数据时,将继续通过用于所有列存储表的列存储压缩对 COLUMNSTORE 索引进行压缩。
    --columnstore_archive
    --适用范围: SQL Server 2014 (12.x) 到 SQL Server 2017。
    --仅适用于列存储表,这是使用聚集列存储索引存储的表。 COLUMNSTORE_ARCHIVE 会进一步将指定分区压缩到更小。 这可用于存档,或者用于要求更少存储并且可以付出更多时间来进行存储和检索的其他情形
    --data_compression={ none | row | page | columnstore | columnstore_archive }

    --on partitions ( { <partition_number_expression> | <range> } [ ,...n ] ) 适用范围: SQL Server 2008 到 SQL Server 2017。
    --指定对其应用 DATA_COMPRESSION 设置的分区。 如果表未分区,ON PARTITIONS 参数将生成错误。 如果不提供 ON PARTITIONS 子句,DATA_COMPRESSION 选项将应用于已分区表的所有分区。
    --可以按以下方式指定 <partition_number_expression>:
    --提供一个分区号,例如:ON PARTITIONS (2)。
    --提供若干单独分区的分区号并用逗号将它们隔开,例如:ON PARTITIONS (1, 5)。
    --同时提供范围和单个分区,例如:ON PARTITIONS (2, 4, 6 TO 8)。
    --<range> 可以指定为以单词 TO 隔开的分区号,例如:ON PARTITIONS (6 TO 8)。
    --,请多次指定 DATA_COMPRESSION 选项 
    --on partitions(1-2)

    )
    on [primary];--数据空间规范
    go

    --添加注释
    execute sp_addextendedproperty N'MS_Description',N'索引说明',N'schema',N'dbo',N'table',N'表名',N'index',N'索引名称';
    go

    示例:

    --声明数据库应用
    use testss;
    go

    --判断是否存在索引
    if exists(select * from sysindexes where name='uniqueclus1')
    drop index uniqueclus1 on test1 with (online=off);
    go

    create 
    unique --唯一
    clustered --聚集索引 
    index --索引关键字
    uniqueclus1 --索引名称
    on test1 --索引建立在哪张表
    (name asc) --索引建立在哪个数据列
    with(

    --pad_index:指定索引填充
    --pad_index=on:FILLFACTOR 指定的可用空间百分比应用于索引的中间级页。
    --pad_index=off或未指定 fillfactor:考虑到中间级页上的键集,可以将中间级页几乎填满,但至少要为最大索引行留出足够空间。
    pad_index=on,

    --statistics_norecompute:指定是否重新计算统计信息。
    --statistics_norecompute=on:过时的统计信息不会自动重新计算。
    --statistics_norecompute=off:启用自动统计信息更新。
    statistics_norecompute=on,

    --sort_in_tempdb:指定是否将排序结果存储在 tempdb 中。
    --sort_in_tempdb=on:在tempdb中存储用于生成索引的中间排序结果。如果tempdb与用户数据库不在同一组磁盘上,就可缩短创建索引所需的时间。但是,这会增加索引生成期间所使用的磁盘空间量。
    --sort_in_tempdb=off:中间排序结果与索引存储在同一数据库中。
    sort_in_tempdb=off,

    --ignore_dup_key:指定在插入操作尝试向唯一索引插入重复键值时的响应类型。 IGNORE_DUP_KEY 选项仅适用于创建或重新生成索引后发生的插入操作。 当执行 CREATE INDEX、ALTER INDEX 或 UPDATE 时,该选项无效。 默认为 OFF。
    --ignore_dup_key=on:打开,将重复键值插入唯一索引时会出现警告消息。只有违反唯一性的行为才会失败。
    --ignore_dup_key=off:关闭,将重复键值插入唯一索引时会出现错误消息。回滚整个INSERT操作。对于对视图创建的索引、非唯一索引、XML 索引、空间索引以及筛选的索引,IGNORE_DUP_KEY 不能设置为 ON
    ignore_dup_key=off,

    --drop_existing:表示如果这个索引还在表上就 drop 掉然后在 create 一个新的。 默认为 OFF。
    --drop_existing=on:指定要删除并重新生成现有索引,其必须具有相同名称作为参数 index_name。
    --drop_existing=off:指定不删除和重新生成现有的索引。 如果指定的索引名称已经存在,SQL Server 将显示一个错误。
    drop_existing=off,

    --online:指定在索引操作期间基础表和关联的索引是否可用于查询和数据修改操作。 默认为 OFF。 REBUILD 可作为 ONLINE 操作执行。
    --online=on:在索引操作期间不持有长期表锁。 在索引操作的主要阶段,源表上只使用意向共享 (IS) 锁。 
    --这使得能够继续对基础表和索引进行查询或更新。 
    --操作开始时,在很短的时间内对源对象持有共享 (S) 锁。
    --操作结束时,如果创建非聚集索引,将在短期内获取对源的 S(共享)锁;
    --当联机创建或删除聚集索引时,以及重新生成聚集或非聚集索引时,将在短期内获取 SCH-M(架构修改)锁。 但联机索引锁是短的元数据锁,特别是 Sch-M 锁必须等待此表上的所有阻塞事务完成。 
    --在等待期间,Sch-M 锁在访问同一表时阻止在此锁后等待的所有其他事务。 对本地临时表创建索引时,ONLINE 不能设置为 ON。
    --online=off:在索引操作期间应用表锁。这样可以防止所有用户在操作期间访问基础表。
    --创建、重新生成或删除聚集索引或者重新生成或删除非聚集索引的脱机索引操作将对表获取架构修改 (Sch-M) 锁。 
    --这样可以防止所有用户在操作期间访问基础表。 创建非聚集索引的脱机索引操作将对表获取共享 (S) 锁。 这样可以防止更新基础表,但允许读操作(如 SELECT 语句)。
    online=off,

    --allow_row_locks:指定是否允许行锁。
    --allow_row_locks=on:访问索引时允许行锁。数据库引擎确定何时使用行锁。
    --allow_row_locks=off:不使用行锁。
    allow_row_locks=on,

    --allow_page_locks:指定是否允许使用页锁。
    --allow_page_locks=on:访问索引时允许页锁。数据库引擎确定何时使用页锁。
    --allow_page_locks=off:不使用页锁。
    allow_page_locks=on,

    --fillfactor=n:指定一个百分比,指示在数据库引擎创建或修改索引的过程中,应将每个索引页面的叶级填充到什么程度。 指定的值必须是 1 到 100 之间的整数。 默认值为 0。
    fillfactor=1,

    --maxdop=max_degree_of_parallelism:在索引操作期间替代 max degree of parallelism 配置选项。 有关详细信息,请参阅 配置 max degree of parallelism 服务器配置选项。 使用 MAXDOP 可以限制在执行并行计划的过程中使用的处理器数量。 最大数量为 64 个处理器。
    --max_degree_of_parallelism 可以是:
    --1 - 取消生成并行计划。
    -->1 - 将并行索引操作中使用的最大处理器数量限制为指定数量。
    --0(默认值)- 根据当前系统工作负荷使用实际数量的处理器或更少数量的处理器。
    --有关详细信息,请参阅 配置并行索引操作。
    maxdop=1

    --data_compression=row:为指定的表、分区号或分区范围指定数据压缩选项。 选项如下所示:
    --none
    --不压缩表或指定的分区。 仅适用于行存储表;不适用于列存储表。
    --row
    --使用行压缩来压缩表或指定的分区。 仅适用于行存储表;不适用于列存储表。
    --page
    --使用页压缩来压缩表或指定的分区。 仅适用于行存储表;不适用于列存储表。
    --columnstore
    --适用范围: SQL Server 2014 (12.x) 到 SQL Server 2017。
    --仅适用于列存储表。 COLUMNSTORE 指定对使用 COLUMNSTORE_ARCHIVE 选项压缩的分区进行解压缩。 还原数据时,将继续通过用于所有列存储表的列存储压缩对 COLUMNSTORE 索引进行压缩。
    --columnstore_archive
    --适用范围: SQL Server 2014 (12.x) 到 SQL Server 2017。
    --仅适用于列存储表,这是使用聚集列存储索引存储的表。 COLUMNSTORE_ARCHIVE 会进一步将指定分区压缩到更小。 这可用于存档,或者用于要求更少存储并且可以付出更多时间来进行存储和检索的其他情形
    --data_compression=none

    --on partitions ( { <partition_number_expression> | <range> } [ ,...n ] ) 适用范围: SQL Server 2008 到 SQL Server 2017。
    --指定对其应用 DATA_COMPRESSION 设置的分区。 如果表未分区,ON PARTITIONS 参数将生成错误。 如果不提供 ON PARTITIONS 子句,DATA_COMPRESSION 选项将应用于已分区表的所有分区。
    --可以按以下方式指定 <partition_number_expression>:
    --提供一个分区号,例如:ON PARTITIONS (2)。
    --提供若干单独分区的分区号并用逗号将它们隔开,例如:ON PARTITIONS (1, 5)。
    --同时提供范围和单个分区,例如:ON PARTITIONS (2, 4, 6 TO 8)。
    --<range> 可以指定为以单词 TO 隔开的分区号,例如:ON PARTITIONS (6 TO 8)。
    --,请多次指定 DATA_COMPRESSION 选项 
    --on partitions(1-2)
    )
    on [primary];
    go

    --添加唯一聚集索引描述
    execute sp_addextendedproperty N'MS_Description',N'第一个唯一聚集索引',N'schema',N'dbo',N'table',N'test1',N'index',N'uniqueclus1';
    go

     

    创建唯一索引优缺点

    优点:

    1、多列唯一索引能够保证索引键中值的每个组合都是唯一的。 

    2、只要每个列中的数据是唯一的,就可以为同一个表创建一个唯一聚集索引。

    3、唯一索引能够确保定义的列的数据完整性。

    4、唯一索引提供帮助查询优化器生成更高效的执行计划的其他信息。

    5、创建唯一索引只会创建一个唯一索引,不会创建约束。

    缺点:

    1、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。

    2、索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。

    3、当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

    展开全文
  • 使用SQL创建唯一索引

    万次阅读 2019-04-27 08:10:00
    使用sql语句创建唯一索引,格式如下: create unique index 索引名 on 表名(列名1,列名2……) 示例;在表GoodsMade_Labour的SID列上创建唯一索引IX_GoodsMade_Labour,代码如下: create unique index IX_...
    复制代码
    使用sql语句创建唯一索引,格式如下:
    create unique index 索引名 on 表名(列名1,列名2……)
    
    示例;在表GoodsMade_Labour的SID列上创建唯一索引IX_GoodsMade_Labour,代码如下:
    create unique index IX_GoodsMade_Labour on GoodsMade_Labour(SID)
    
    这样情况下创建的是非聚集索引,它和使用nonclustered关键效果是一样的。
    create unique nonclustered index IX_GoodsMade_Labour on GoodsMade_Labour(SID)
    
    如果要创建聚集索引,可使用关键字clustered,代码如下:
    create unique clustered index IX_GoodsMade_Labour on GoodsMade_Labour(SID)
    复制代码

     

     

    其他几种常用索引的添加方法

    复制代码
    1.添加PRIMARY KEY(主键索引) 
    mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 
    2.添加UNIQUE(唯一索引) mysql>ALTER TABLE `table_name` ADD UNIQUE ( `column` )
    3.添加INDEX(普通索引) mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
    4.添加FULLTEXT(全文索引) mysql>ALTER TABLE `table_name` ADD FULLTEXT ( `column`)
    5.添加多列索引 mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )

    复制代码

     

    转载于:https://www.cnblogs.com/xinzhyu/p/10777562.html

    展开全文
  • sql——创建视图和索引

    千次阅读 2021-09-13 15:44:35
    创建视图:给BILLS表创建视图。创建的视图实际上是一个虚表。 CREATE VIEW DEBTS AS SELECT * FROM BILLS; 可以选择特定的行进行新视图的创建。 CREATE VIEW CREDITCARD_DEBTS AS SELECT * FROM DEBTS WHERE ...

    一、视图

    1、使用视图

    创建视图:给BILLS表创建视图。创建的视图实际上是一个虚表。

    CREATE VIEW DEBTS AS 
    SELECT * FROM BILLS;

    可以选择特定的行进行新视图的创建。

    CREATE VIEW CREDITCARD_DEBTS AS
    SELECT * FROM DEBTS
    WHERE ACCOUNT_ID = 4;
    
    SELECT * FROM CREDITCARD_DEBTS;

    可以从表中挑选特定的列创建视图。


    2、列的重命名

    视图继承了已有列的名字,此外视图还可以有自己的名字。

    例如:把 COMPANY 中的 ADDRESS CITY 和 STATE 字段组合起来并打印到信封。

    CREATE VIEW ENVELOPE(COMPANY, MAILING_ADDRESS) AS
    SELECT NAME, ADDRESS + " " + CITY + ", " + STATE
    FROM COMPANY;
    
    select * from ENVELOPE;

    注:当在视图中使用 SQL 的计算功能时,SQL 会要求你给出一个虚字段的名字, 像 COUNT(*)或 AVG(PAYMENT)是不能作为名字的。

    3、sql对视图的处理过程

    视图应用于经常运行一个查询。

    例如:你需要例行公事地将 BILLS 表与 BANK_ACCOUNT 表进行归并以得到支付信息

    create table BANK_ACCOUNTS (
    ACCOUNT_ID NUMBER NOT NULL,
    TYPE CHAR(30),
    BALANCE NUMBER,
    BANK CHAR(30));
    
    --使用sql语句进行
    SELECT BILLS.NAME, BILLS.AMOUNT, BANK_ACCOUNTS.BALANCE
    BLANCE, BANK_ACCOUNTS.BANK BANK FROM BILLS, BANK_ACCOUNTS
    WHERE BILLS.ACCOUNT_ID = BANK_ACCOUNTS.ACCOUNT_ID;
    
    --使用视图进行
    CREATE VIEW BILLS_DUE (NAME, AMOUNT, ACCT_BALANCE, BANK) AS
    SELECT BILLS.NAME, BILLS.AMOUNT, BANK_ACCOUNTS.BALANCE
    BANK_ACCOUNTS.BANK FROM BILLS, BANK_ACCOUNTS
    WHERE BILLS.ACCOUNT_ID = BANK_ACCOUNTS.ACCOUNT_ID;

    如果对BILLS_DUE视图执行查询操作。

    SELECT * FROM BILLS_DUE
    WHERE ACCT_BALANCE > 500;
    
    --因为BILLS_DUE是一个视图,不是真实的表。找不到可能会从系统表中发现BILLS_DUE是一个视图,会对视图进行诠释,语句为:
    SELECT BILLS.NAME, BILLS.AMOUNT, BANK_ACCOUNTS.BALANCE,
    BANK_ACCOUNTS.BANK FROM BILLS, BANK_ACCOUNTS
    WHERE BILLS.ACCOUNT_ID = BANK_ACCOUNTS.ACCOUNT_ID
    AND BANK_ACCOUNTS.BALANCE > 500;

    4、在select语句中使用约束

    4.1  在视图中修改数据

    更新 BILLS 表中的10%的费用。

    create view LATE_PAYMENT as
    select * from BILLS;
    
    update LATE_PAYMENT
    set AMOUNT=NMOUNT*1.10;
    
    select *from LATE_PAYMENT;

    从视图中删除一行:

    delete from LATE_PAYMENT
    where ACCOUNT_ID=4;

    update函数

    例如:为BILLS表中所有的NEW_TOTAL中对于100的增加10。

    update LATE_PAYMENT
    set NEW_TOTAL=new_TOTAL+10;
    where NEW_TOTAL>100;
    
    select * from LATE_PAYMENNT;

    4.2  在视图中修改数据的几个问题

    4.2.1  视图与安全性

    数据库系统的用户通常会根据使用的数据库进行分组:

    数据库管理员(database adminstrators)

    数据库开发人员(database developers)

    数据录入人员(data entry personnel)

    大众用户

    不同的组在使用数据库时有着不同的权限,系统管理员有系统的完全控制权限,包括更新、插入、删除、修改。大众则只有数据库使用select语句的权限。

    例如:希望用户访问BILLS表中的字段,需要创建一个名字叫BILLS_NAME的视图。

    CREATE VIEW BILLS_NAME AS SELECT NAME FROM BILLS;

    4.2.2  在单位换算中使用视图

    视图在你提供给用户的数据与数据库中的真实数据不同时也相当有用 。

    例如:如果 AMOUNT 字段实际上存储于美国,加拿大的用户不想频繁地进行美元与加拿大元之间的转换工作。那么你可以创建一个叫 CANADA_BILLS 的视图。

    CREATE VIEW CANADIAN_BILLS (NAME, CAN_AMOUNT) AS
    SELECT NAME, AMOUNT / 1.10
    FROM BILLS;
    
    select * from CANADIAN_BILLS;

    4.2.3 在视图中使用简单的结构化复合查询

    视图在你需要按次序运行一系列查询以后得到某个结果的情况下也很有用。

    例如:找出所有发给德克萨斯州的账单金额少于 50 美元的银行的名字。

    可以将问题分解成两个问题:

    1、得到所有发给得克萨斯州的账单。

    2、找出账单中金额小于50美元的记录。

    两个子问题的解决语句为:

    CREATE TABLE BILLS1 AS
    SELECT * FROM BILLS
    WHERE AMOUNT < 50;
    
    CREATE TABLE BILLS2 (NAME, AMOUNT, ACCOUNT_ID) AS
    SELECT BILLS * FROM BILLS, COMPANY
    WHERE BILLS.NAME = COMPANY.NAME AND COMPANY.STATE = "TX";

    使用sql中的in子句来找出所有在 BILLS1中发往德州的账单,这个信息来创建一个名字叫 BILLS3 的视图:

    CREATE VIEW BILLS3 AS
    SELECT * FROM BILLS2 WHERE NAME IN
    (SELECT * FROM BILLS1);

    将上述的BANK_ACCOUNT表进行合并得到最初想要的结果:

    CREATE VIEW BANKS_IN_TEXAS (BANK) AS
    SELECT BANK_ACCOUNTS.BANK
    FROM BANK_ACCOUNTS, BILLS3
    WHERE BILLS3.ACCOUNT_ID = BANK_ACCOUNTS.ACCOUNT_ID;
    
    select * from BANK_IN_TEXAS;

    4.2.4  删除视图语句

    drop view view_name;

    drop view命令会将所有与drop视图相关联的视图不能正常运行,一些数据库系统甚至会将所有与要drop的视图相关联的视图也要删除掉。

    例如:删除BILLS视图,查询相关的视图BANKS_IN_TEXAS也会返回错误,

    drop view BILLS;

    select *from BANKS_IN_TEXAS;

    删除视图不会对真实的表有任何影响,视图是一个虚的表。

    二、索引

    1、使用索引

    SQL使用索引的原因是因为以下几种:

    (1)在使用UNIQUE关键字时强制性地保证数据的完整性。

    (2)可以容易地用索引字段或其他字段进行排序。

    (3)提高查询的执行速度

    2、什么是索引?

            索引是方便查询的一种手段,SQL采用树形结构存储和返回索引数据,用以指示的数据存储在树的最末端,每个节点中有一个指向其他节点的指针,节点左边的值只是它的双亲节点,节点右边的值则是孩子节点或叶子。

    基本的索引语法:

    2.1  创建索引

    create index index_name;

    例如:要对BILLS表中的ACCOUNTID字段创建索引,其CREATE INDEX语句如下:

    select * from BILLS;
    create INDEX ID_INDEX on BILLS(ACCOUNT_ID);
    select * from BILLS;

    `直至索引被drop index语句删除前,BILLS表是按照ACCOUNT_ID的顺序进行排序的。

    2.2  删除索引

    drop index index_name;

    例如:删除刚刚创建的ACCOUNTID索引。

    drop index ID_INDEX;
    
    --查看BILLS存储结构
    select * from BILLS;

    现在BILLS表就是它原本的形态,使用索引不会对表中的物理存储造成影响。

    注:使用select * from BILLS order by ACCOUNT_ID;的结果和和创建索引的结果相同,不同在于当使用order by子句时,每次运行它都要重新进行排序,当使用索引的时候,数据库会建立一个物理索引对象,在你每次运行查询时,都访问同一个索引。

    注:当表被删除时,所有与表相关的索引都将会被删除。

    2.3  使用索引的技巧

    (1)对于小表来说,使用索引对于性能不会有任何提高。

    (2)当你的索引列中有极多的不同的数据和空值时索引会使性能有极大的提高。

    (3)当查询要返回的数据很少时索引可以优化你的查询(比较好的情况是少于全部数据的 25%),如果你要返回的数据很多时索引会加大系统开销。

    (4)索引可以提高查询的速度,但会使得数据的更新操作变慢。进行大量的更新操作时,可以删除索引,在更新完成后进行索引的恢复。

    (5)索引会占据数据库的空间,设计数据库可用空间时需要考虑索引占用的空间。

    (6)对字段的索引已经对两个表进行了归并操作,可以提高归并的速度。

    (7)对视图创建索引,在 SELECT 语句中对视图的数据进行排序。

    (8)不要创建对经常需要更新或修改的字段创建索引,更新索引的开销会降低你所期望获得的性能。

    (9)不要将索引与表存储在同一个驱动器上,分开存储会去掉访问的冲突从而使结果返回的更快。

    2.4   复合索引

    复合索引:对多个字段进行索引。虽然进行的是多个字段的索引,但是索引在物理结构上还是只有一个。

    例如:对BILLS表的ACCOUNTID和AMOUNT字段创建索引。

    create INDEX ID_CMPD_INDIX on BILLS(ACCOUNT_ID,AMOUNT);
    select * from BILLS;

    选择唯一值越多的列建立索引,可以达到更好的性能。

    如果你经常在BILLS表中查询某一位人员,例如:SELECT * FROM BILLS WHERE NAME = "Cable TV Company";这时为了更好的查询性能,可以对name列创建一个索引。

    create INDEX NAME_INDEX on BILLS(NAME);
    //或者使用复合索引
    create INDEX NAME_INDEX on BILLS(NAME,AMOUNT);

            如果你在查询条件中经常指定某一特定的列那个你可以创建这个列的索引。而当你的查询需要复合条件时你可以创建复合索引。

    2.5  使用unique关键字创建索引

    复合索引通常使用unique关键字防止有相同数据的多个记录多次出现。

    ORACLE不支持UNIQUE 语法,它是用UNIQUE 完整性约束来达到内容唯一这一特性的。

    使用unique关键字创建索引以后,如果想要添加一列相同的记录则将会报错。

    使用DESC 操作创建的索引,它将告诉SQL 将索引降序排列。

    例如:在 BILLS 表中创建一个索引以对 AMOUNT 字段进行降序排列。(一般默认为升序)

    create INDEX DESC_AMOUNT on BILLS(AMOUNT DESC);

    2.6  索引与归并

    对 BILS 表与 BANK_ACCOUNT 表根据 ACCOUNT_ID 字段创建索引:

    CREATE INDEX BILLS_INDEX ON BILLS(ACCOUNT_ID);
    
    CREATE INDEX BILLS_INDEX2 ON BANK_ACCOUNTS(ACCOUNT_ID);
    
    SELECT BILLS.NAME NAME, BILLS.AMOUNT AMOUNT,
    BANK_ACCOUNTS.BALANCE ACCOUNT_BALANCE
    FROM BILLS, BANK_ACCOUNTS
    WHERE BILLS.ACCOUNT_ID = BANK_ACCOUNTS.ACCOUNT_ID;

    在每一个表中均对 ACCOUNT_ID 字段创建了索引以后,归并就可以更快地访问特定行的数据。

    2.7  群集(簇)的使用

            当使用群集索引时,数据在表中的物理排列方式将会被修改,使用群集索引通常比传统的不使用群集的索引速度要快。但是许多数据库管理系统(如 Sybase 的 SQL Server),只允许一个表有一个群集索引,用于创建群集索引的字段常常是主关键字。

    例如:对 BANK_ACCOUNT 的 ACCOUNT_ID 字段创建一个群集的,不重复的索引。

    create unique clustered index id_index on BANK_ACCOUNTS(ACCOUNT_ID)
    go

    ORACLE 中群集的概念与此不同,当使用 ORACLE 关系数据库系统时,群集就是一 个像数据或表一样的对象,群集一般是存储了表的共有字段以提高对表的访问速度。

    例如:ORACLE7 中创建群集。

    CREATE CLUSTER [schema.]cluster (column datatype [,column datatype] ... )
    [PCTUSED integer] [PCTFREE integer] [SIZE integer [K|M] ]
    [INITRANS integer] [MAXTRANS integer] [TABLESPACE tablespace]
    [STORAGE storage_clause] [!!under!!INDEX | [HASH IS column] HASHKEYS integer]

    创建集群以后 ,之后创建的该表的群集的索引会被加入到集群中,然后把表也加在群集中。

    展开全文
  • SQL语句(五) 索引建立

    万次阅读 2018-07-16 16:59:42
    1.创建唯一性索引 SET STATISTICS TIME ON SELECT * FROM customer WHERE name ='阿爆' ; SET STATISTICS TIME OFF CREATE UNIQUE INDEX customer_name ON customer(name);--在customer表上的name列创建唯一性索引 ...
  • 利用SQL语句查询数据库中所有索引

    千次阅读 2021-01-21 03:51:37
    本章我们就要讲解一下如何利用sql语句来查询出数据库中所有索引明细。当然了,我们可以在microsoftsqlservermanagementstudio中选择"表"->"索引"来查看单个表的索引明细。但这样,查询效率就很低了。要利用sql...
  • MySQL数据库中的索引(含SQL语句

    千次阅读 2022-04-20 19:17:01
    在执行这条SQL语句的时候,MySQL需要扫描全表来查询id = 7900的记录。 全表扫描就是从“数据页1”开始,向后逐页查询。对于少量数据来说,查询的速度会很快,但是,当随着数据量的增加,性能会急剧下降....
  • SQL语句 创建表、模式、索引

    千次阅读 2020-04-10 11:16:45
    一、数据定义语句 一、 数据定义: 操作对象 创建 删除 修改 模式 CREATE SCHEMA DROP ~ 表 CREATE TABLE DROP ~ ALTER TABLE 视图 CREATE VIEW DROP VIEW 索引 CREATE INDEX DROP INDEX ALTER ...
  • 如何某表的某个字段有主键约束和唯一性约束,则Oracle 则会自动在相应的约束列上建议唯一索引。数据库索引主要进行提高访问速度。 建设原则:  1、索引应该经常建在Where 子句经常用到的列上。如果某个大表经常...
  • SQLServer之创建唯一聚集索引

    千次阅读 2018-09-18 17:03:35
    创建唯一聚集索引典型实现 唯一索引可通过以下方式实现: PRIMARY KEY 或 UNIQUE 约束 在创建 PRIMARY KEY 约束时,如果不存在该表的聚集索引且未指定唯一非聚集索引,则将自动对一列或多列创建唯一聚集索引。...
  • 查看oracle表中所有索引,主键sql语句

    千次阅读 2022-04-25 11:28:34
    1、查找表的所有索引(包括索引名,类型,构成列): select t.*,i.index_type from user_ind_columns t,user_indexes i where t.index_name = i.index_name and t.table_name = i.table_name and t.table_name = ...
  • 1.索引创建与使用 2.创建索引的原则 3.索引的分类 4.创建索引的多种方法 5.管理索引 6.索引优化 7.查看、修改索引属性 8.修改索引名 9.删除索引
  • SQLSERVER数据库、表的创建SQL语句命令 备份,还原,创建,删除,查询,修改 ** 数据库定义及操作命令:** 按照数据结构来组织、存储和管理数据的仓库。由表、关系以及操作对象组成,把数据存放在数据表中。 修改数据库...
  • SQLServer之创建全文索引

    千次阅读 2018-09-25 16:40:21
    创建全文索引的必须条件 必须具有全文目录,然后才能创建全文索引。 目录是包含一个或多个全文索引的虚拟容器。 使用SSMS数据库管理工具创建全文索引 1、连接数据库,选择数据库,选择数据表-》右键数据表-》...
  • SQL 创建索引,语法

    万次阅读 2014-06-07 16:10:16
    SQL SERVER将主键默认定义为聚集索引,事实上,索引是否唯一与是否聚集是不相关的,聚集索引可以是唯一索引,也可以是非唯一索引唯一索引实际上就是要求指定的列中所有的数据必须不同 /* 主键一唯一索引的区别...
  • ORACLE创建唯一索引

    千次阅读 2020-05-12 18:34:45
    oracle创建唯一索引 Create UNIQUE Index PK_INSTANCE_ID on TB_DD_APPROVAL_OUT ( INSTANCE_ID ) oracle基于多列的唯一性约束 alter table tb_products add constraint tb_products_u1 unique (product_id,product_...
  • SQL Server 创建索引

    千次阅读 2020-07-30 13:02:02
    索引的简介: 索引分为聚集索引和非聚集索引,数据库中的索引类似于一...索引建多了,不利于新增、修改和删除等操作,因为做这些操作时,SQLSERVER 除了要更新数据表本身,还要连带立即更新所有的相关索引,而且...
  • SQLServer之创建唯一非聚集索引

    千次阅读 2018-09-19 06:54:59
    创建唯一非聚集索引典型实现 唯一索引可通过以下方式实现: PRIMARY KEY 或 UNIQUE 约束 在创建 PRIMARY KEY 约束时,如果不存在该表的聚集索引且未指定唯一非聚集索引,则将自动对一列或多列创建唯一聚集索引。 ...
  • 1、主键的创建方法一:直接在sql语句中声明字段主键约束create table table_name (id type[length]constraintpk_nameprimary key,name tyoe[length],age type[length],class_id);方法二:alter更改表添加约束alter ...
  • SQL:聚集索引和非聚集索引

    千次阅读 2021-02-08 03:33:45
    注:第一列的地址表示该行数据在磁盘中的物理地址,后面三列才是我们SQL里面用的表里的列,其中id是主键,建立了聚集索引。结合上面的表格就可以理解这句话了吧:数据行的物理顺序与列值的顺序相同,如果我们查询id...
  • SQL SERVER 聚集索引创建

    万次阅读 2018-10-12 13:19:27
    启动企业管理器--选择数据库------选在要创建索引的表------在表的下拉菜单中选择索引---在快捷菜单中选择新建索引-- 在新建索引对话框中单击“添加”按钮,弹出“从列表中选择列”,在该对话框中选择要添加到索引...
  • 然后分析,发现其中有些字段在大部分的SQL语句查询时候都会用到,那么就果断为他建立索引。 2、唯一性太差的字段不适合建立索引 什么是唯一性太差的字段。如状态字段、类型字段。那些只存储固定几个值的字段,例如...
  • 如何某表的某个字段有主键约束和唯一性约束,则Oracle 则会自动在相应的约束列上建议唯一索引。数据库索引主要进行提高访问速度。 建设原则:  1、索引应该经常建在Where 子句经常用到的列上。如果某个大表经常使用...
  • 如何在SQL创建索引

    千次阅读 2019-10-30 19:34:56
    我们通过一个简单的例子来开始教程,解释为什么我们需要数据库索引。假设我们有一个数据库表 Employee, 这个表有三个字段(列)分别是 Employee_Name、Employee_Age 和Employee_Address。假设表Employee 有上千行...
  • 【单选题】下列关于节俭的说法不正确的是( )【单选题】不属于栅格系统的实现原理的是( )【单选题】CMYK 模型中的 K 表示何种颜色,该模式主要用于打印行业【单选题】在php中,语句for(k=0;k==1;k++)执行的次数分别是( ...
  • Sql Server 创建索引 、复合索引

    万次阅读 2017-03-05 17:19:56
    想要做到捞取数据较少,就必须在高唯一性的字段上建立索引,这样的话在非聚集索引B树中符合的数据相对较少,也就 减少了我蹦跶到”主键索引“的B树次数。。。这样的话来回蹦跶的次数远远比”聚集索引“扫描来...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 146,622
精华内容 58,648
关键字:

sql语句创建唯一性索引