发新话题
打印

[转载]SQL Sever - 基础知识

[转载]SQL Sever - 基础知识

文章作者:黑凤凰
信息来源:http://www.blueidea.com/bbs/newsdetail.asp?id=2342341

SQL Sever - 索引简介

表的索引与字典中的索引非常相似。它可以极大地提高查询的速度。对一个较大的表来说,通过加索引,一个通常要花费几个小时来完成的查询只要几分钟就可以完成。(对于包含索引的数据库,SQL Sever需要一个可观的额外空间。例如,要建立一个聚簇索引,需要大约1.2倍于数据大小的空间。速度是需要付出代价的。)

聚簇索引和非聚簇索引

假设你已经通过字典的索引找到了一个字所在的页码。一旦已经知道了页码后,你很可能随机的翻寻字典,直至找到正确的页码。这里还有一种找到页码的更有效的方法。
首先,把字典翻到大概一半的地方,如果要找的页码比半本字典处的页码小,就翻到四分之一处,否则,就把书翻到四分之三的地方。通过这种方法,你可以继续把字典分成更小的部分,直至找到正确的页码附近。这是找到书页的非常有效的一种方法。(呵呵,到处都是这个例子,跟Hello world有一拼)SQL Sever的表索引以类似的方式工作。一个表索引由一组页组成,这些页构成了一个树形结构。根页通过指向另外两个页,把一个表的记录从逻辑上分成和两个部帧6乘赶虻牧礁鲆秤址直鸢鸭锹挤指畛筛〉牟糠帧C扛鲆扯及鸭锹挤殖筛〉姆指睿敝恋酱镆都兑场?

索引有两种类型:聚簇索引和非聚簇索引。

在聚簇索引中,索引树的叶级页包含实际的数据:记录的索引顺序与物理顺序相同。
在非聚簇索引中,叶级页指向表中的记录:记录的物理顺序与逻辑顺序没有必然的联系。

聚簇索引非常象目录表,目录表的顺序与实际的页码顺序是一致的。非聚簇索引则更象书的标准索引表,索引表中的顺序通常与实际的页码顺序是不一致的。一本书也许有多个索引。例如,它也许同时有主题索引和作者索引。同样,一个表可以有多个非聚簇索引。

通常情况下,你使用的是聚簇索引,但是你应该对两种类型索引的优缺点都有所理解。

每个表只能有一个聚簇索引,因为一个表中的记录只能以一种物理顺序存放。通常你要对一个表按照标识字段建立聚簇索引。但是,你也可以对其它类型的字段建立聚簇索引,如字符型,数值型和日期时间型字段。
从建立了聚簇索引的表中取出数据要比建立了非聚簇索引的表快。当你需要取出一定范围内的数据时,用聚簇索引也比用非聚簇索引好。例如,假设你用一个表来记录访问者在你网点上的活动。如果你想取出在一定时间段内的登录信息,你应该对这个表的DATETIME型字段建立聚簇索引。
对聚簇索引的主要限制是每个表只能建立一个聚簇索引。但是,一个表可以有不止一个非聚簇索引。实际上,对每个表你最多可以建立249个非聚簇索引。你也可以对一个表同时建立聚簇索引和非聚簇索引。
假如你不仅想根据日期,而且想根据用户名从你的网点活动日志中取数据。在这种情况下,同时建立一个聚簇索引和非聚簇索引是有效的。你可以对日期时间字段建立聚簇索引,对用户名字段建立非聚簇索引。如果你发现你需要更多的索引方式,你可以增加更多的非聚簇索引。
非聚簇索引需要大量的硬盘空间和内存。另外,虽然非聚簇索引可以提高从表中 取数据的速度,它也会降低向表中插入和更新数据的速度。每当你改变了一个建立了非聚簇索引的表中的数据时,必须同时更新索引。因此你对一个表建立非聚簇索引时要慎重考虑。如果你预计一个表需要频繁地更新数据,那么不要对它建立太多非聚簇索引。另外,如果硬盘和内存空间有限,也应该限制使用非聚簇索引的数量。

索引属性

这两种类型的索引都有两个重要属性:
你可以用两者中任一种类型同时对多个字段建立索引(复合索引);
两种类型的索引都可以指定为唯一索引。
你可以对多个字段建立一个复合索引,甚至是复合的聚簇索引。假如有一个表记录了你的网点访问者的姓和名字。如果你希望根据完整姓名从表中取数据,你需要建立一个同时对姓字段和名字字段进行的索引。这和分别对两个字段建立单独的索引是不同的。当你希望同时对不止一个字段进行查询时,你应该建立一个对多个字段的索引。如果你希望对各个字段进行分别查询,你应该对各字段建立独立的索引。
两种类型的索引都可以被指定为唯一索引。如果对一个字段建立了唯一索引,你将不能向这个字段输入重复的值。一个标识字段会自动成为唯一值字段,但你也可以对其它类型的字段建立唯一索引。假设你用一个表来保存你的网点的用户密码,你当然不希望两个用户有相同的密码。通过强制一个字段成为唯一值字段,你可以防止这种情况的发生。

ORACLE 索引
索引(i n d e x e)是为了加速对特定表数据的访问而创建的数据段。一个索引拥有表的一列或多列的值以及与这些列值相对应的行内部地址( R O W I D)。
[rowid 和物理硬盘地址有关]

当O r a c l e服务器需要在表中查找某一指定行时,它在索引中查找R O W I D,然后直接从表中提出数据。
在Oracle RDBMS中有几种可用的索引类型。
到目前为止,最常用的索引类型是B * - Tr e e(B -树)索引。这是执行标准的C R E ATE INDEX语句时,需要使用的索引类型。
B * - Tr e e索引是标准的搜索树算法的一个变异,其中通过遍历索引树,你保证能在相同数量的树遍历过程中找到所有的叶子结点。每一个叶子结点指向下一个和前一个叶子结点的位置,这样就能够在索引扫描范围内进行快速索引搜索及类似操作。B * - Tr e e索引能确保维持平衡状态,并且每个结点的四分之三都是空的,以便为更新提供可用空间。
簇(c l u s t e r)索引是在簇中被表共享的列的索引。不同于常规的索引,簇索引在索引中只存储一次索引键值,而不管索引键在表中重复多少次。在簇上能够执行任何数据操作语言( D M L)前,必须在簇上创建簇索引。
最新的索引类型是位映射( b i t m a p)索引,在一个位映射索引中,位映射是从索引表的列值中创建而来的,并存储在索引中,而不是由实际的列值创建的。换句话说,在键上索引为每一行保存一个位映射,键对于表中的每一行包含一位信息。如果值包含在行里,位值是1,否则是0。在基数较低(不同值数量较小)的列中,位映射索引可以比传统的B * - Tr e e索引更小,更有效。

SQL查询语句基础 - Select篇


本篇试验环境SQL Server。数据库使用SQL Server默认安装的NorthWind。仅对select语句进行简单的操作讲解。通俗易懂(不懂就装懂吧)


引用:
--------------------------------------------------------------------------------
SQL (Struct Query Language)即结构化查询语言,它是使用关系模型的数据库应用语言,由IBM在70年代开发出来。现在SQL结构化查询语言已经成为一个工业标准,几乎所有的数据库都支持它的查询,SQL Server更是如此。

SQL Server服务器中,用SELECT语句实现数据库的查询操作。同时,它可以使用各种子句对查询结果进行分组统计、合计、排序等操作。SELECT语句还可将查询结果生成另一个表(临时表或永久表)。
--------------------------------------------------------------------------------



SELECT 语句的语法格式为:

SELECT [ALL|DISTINCT] select_list
[INTO [new_table_name>
[FROM{table_name|view_name}[(optimizer_hints)]
<,{table_name2|view_name2}[(optimizer_hints)]
[…,{table_name16|view_name16}[(optimizer_hints)>]
[WHERE clouse]
[GROUP BY clause]
[HAVING clause]
[ORDER BY clause]
[COMPUTE clause]
[FOR browse]


以上格式中,“[]”括的项表示可选项,大写的词为关键字,小写的词表示不确定的实体名称。除第一行外,每一行为一个子句,在SELECT中子句可以省略,但在列出时,必须按照以上顺序。(呵呵,规矩很多,固定搭配,用的时候照葫芦画瓢就是了)
 

下面开始做试验:

一、简单查询语句

简单的SQL查询只包括SELECT子句、FROM子句和WHERE子句,它们分别说明查询列、要查询的表和搜索条件。

例如:
SELECT CustomerID,CompanyName
FROM Customers
WHERE (City = N&#39;London&#39;)


以上SELECT语句查询Customers表中City字段为&#39;London’的记录的CustomerID和CompanyName字段。

其查询结果可能为:

AROUT   Around the Horn
BSBEV   B&#39;s Beverages
CONSH   Consolidated Holdings
EASTC   Eastern Connection
NORTS   North/South
SEVES   Seven Seas Imports

(所影响的行数为 6 行)
 

二、SELECT 条件列表

1> 显示Customers表中所有列的内容

SELECT * FROM Customers


将对Customers表中每个字段的值进行显示。

2> 按顺序显示指定列
SELECT CustomerID,CompanyName FROM Customers WHERE (City = N&#39;London&#39;)


在SELECT 列表中指定列名来选择不同的列,个列之间用逗号分开,结果的显示顺序为SELECT列表中字段的排列顺序。

3> 更改列标题(以下三句可以达到相同的目的)
SELECT CustomerID,公司名=CompanyName FROM Customers WHERE (City = N&#39;London&#39;)
SELECT CustomerID,CompanyName as 公司名 FROM Customers WHERE (City = N&#39;London&#39;)
SELECT CustomerID,CompanyName  公司名 FROM Customers WHERE (City = N&#39;London&#39;)


执行结果为:

CustomerID 公司名
-----------------------------------------------------------------
AROUT   Around the Horn
BSBEV   B&#39;s Beverages
CONSH   Consolidated Holdings
EASTC   Eastern Connection
NORTS   North/South
SEVES   Seven Seas Imports

(所影响的行数为 6 行)

在SELECT语句中可以为选择列指定列标题,其格式为:

列标题=列名 或: 列名 列标题 或 列名 AS 列标题

4>删除重复行(或者叫选择唯一行,即相同的纪录只显示一个)

SELECT语句中可以使用ALL|DISTINCT选项来显示所有行(ALL)或删除重复的行(DISTINCT),缺省为ALL,即不去重。

在前面的例子中将查语句换为:
SELECT DISTINCT keys,marc_id FROM keys
SELECT DISTINCT City,CompanyName FROM Customers

查询结果为:

City      CompanyName
-----------------------------------------------------------------
Aachen         Drachenblut Delikatessen   
Albuquerque Rattlesnake Canyon Grocery   
...
(所影响的行数为 91 行)

FROM子句

FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定16个表或视图,它们相互之间用逗号分开,如果这些表属于不同的数据库,可用&#39;数据库.所有者名称.对象’格式加以限定。在缺省情况下,FROM子句不指定数据库名称,查询的数据库为当前数据库。

WHERE子句

SELECT 语句中的WHERE子句用来指定查询条件。

WHERE子句中包含各种查询条件,如下表:

运算符分类
运算符
意义

比较运算符
> >= < <= = <> !> !<[code]

大小比较 [code]
BETWEEN…AND…
NOT BETWEEN…AND…
IN
NOT IN
LIKE
NOT LIKE
IS NULL
NOT IS NULL
AND
OR
NOT


经常用到的条件运算符是:列表运算符IN和模式匹配符LIKE。

列表运算符IN

列表运算符的格式为:
表达式 [NOT] IN (列表项1,列表项2,列表项3…)
它要求查询时表达式的值(不)在列表内。例如:

SELECT CustomerID,CompanyName FROM Customers WHERE  City IN(&#39;London&#39;,&#39;Graz&#39;)

(所影响的行数为 7 行)

表示要查询的City来源必须在(&#39;London&#39;,&#39;Graz&#39;)中,即City字段值为&#39;London&#39;或&#39;Graz&#39;。

模式匹配符 LIKE

模式匹配符[NOT] LIKE 常用于模糊查询,它判断列值是否与指定的字符串格式匹配。在SQL Server中可使用的匹配符有以下几种:

百分号(%):可匹配任意类型和长度的字符。
下划线(_):匹配单个任意字符。
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任何一个。
[^]:与[]取值相同,但要求所匹配的对象为指定范围以外的任何一个字符。

例如下面的语句利用通配符%来查找以“F”开头的字符串:

SELECT CompanyName FROM Customers WHERE  CompanyName LIKE &#39;F%&#39;


查询结果为:

CompanyName
-----------------------------------------------------------------
Familia Arquibaldo
FISSA Fabrica Inter. Salchichas S.A.
Folies gourmandes
Folk och f? HB
France restauration
Franchi S.p.A.
Frankenversand
Furia Bacalhau e Frutos do Mar
(所影响的行数为 8 行)

GROUP BY子句

GROUP BY 子句的语法格式为:

GROUP BY [ALL] aggregate_free_expression
[, aggregate_free_expression]


在SELECT 语句中,GROUP BY子句和集合函数对数据库进行分组统计,在查询结果中,每一组统计出一个结果。例如:
SELECT COUNT(*) AS Expr2, City AS Expr1
FROM Customers
WHERE (City LIKE &#39;L%&#39;)
GROUP BY City


执行的结果为:

keystring hitcount

1        Lander
1        Leipzig   
1        Lille   
2        Lisboa   
6        London   
1        Lule?   
1        Lyon   
(所影响的行数为 7 行)

在上面的例子中,GROUP BY子句和集合函数COUNT按照fields字段对Customers表进行分组统计。集合函数COUNT对每一组的行数进行计算,分组的标准是GROUP BY中定义的字段 fields。
 
INTO子句(用查询结果创建新表)

SELECT语句中使用INTO选项可以将查询结果写进新表,新表结构与SELECT语句选择列表中的字段相同。例如:
SELECT COUNT(*) AS Expr2, City AS Expr1
into #temp/*into*/
FROM Customers
WHERE (City LIKE &#39;L%&#39;)
GROUP BY City


通过子句into #temp SQL Server将SELECT查询结果和COUNT的统计结果写入临时表temp中,临时表temp结构包含Expr1和Expr2两个字段。在以后用到这些信息时,就可以从temp表中读取。

UNION子句运算符实现多查询联合

UNION运算符可以将两个或两个以上的查询结果合并成一个结果集合显示。UNION运算符的语法格式为:
查询1 [UNION [ALL] 查询n]…
[ORDER BY 子句]
[COMPUTE 子句]


查询1的格式为:
SELECT select_list
[INTO子句]
[FROM子句]
[WHERE子句]
[GROUP BY 子句]
[HAVING 子句]


查询n 的格式为:
SELECT select_list
[FROM子句]
[WHERE子句]
[GROUP BY 子句]
[HAVING 子句]


查询1与查询不同之处在于查询1多了一个用来指定新表的INTO子句,通过UNION子句句查询n的结果也将写进查询中INTO运算符定义的新表中。

在使用UNION子句时,应保证每个查询语句的选择列表中有相同数量的表达式,并且每个查询选择列表中的对应表达式应具有相同或可以自动转换成相同的数据类型。

缺省情况下,UNION运算符将删除不同查询语句中行值相同的行,如果要保留这些相同的行,应使用ALL选项。
http://iittss.com/ kijs与牛人在一起不是有理由的让自己变懒,那是为了让视野更开阔

TOP

发新话题