《SQL Server 2000编程员指南》笔记

SQL SERVER 中的索引是以B-树结构来维护的,B-树是一个多层次、自维护的结构。索引列的宽度越大,B-树的深度越深,即层次越多,读取记录所要访问的索引页就越多。也就是说,数据查询的性能将随索引层次数目的增加而降低。

在SQL SERVER数据库中按存储结构的不同将索引分为两类:簇索引(Clustered Index)和非簇索引(Nonclustered Index)

簇索引
********
簇索引对表的物理数据页中的数据按列进行排序,然后再重新存储到磁盘上 即簇索
它的叶节点中存储的是实际的数据 由于簇索引对表中的数据一引与数据是混为一体的
一进行了排序因此用簇索引查找数据很快 但由于簇索引将表的所有数据完全重新排列
120%它所需要的空间也就特别大 大概相当于表中数据所占空间的 表的数据行只
了能以一种排序方式存储在磁盘上 所以一个表只能有一个簇索引.

非簇索引
*********
非簇索引具有与表的数据完全分离的结构 使用非簇索引不用将物理数据页中的数据按列排序。
非簇索引的叶节点中存储了组成非簇索引的关键字的值和行定位器。行定位器的结构和存储内容取决于数据的存储方式。如果数据是以簇索引方式存储的,则行定位器中存储的是簇索引的索引键;如果数据不是以簇索引方式存储的,这种方式又称为堆存储方式(Heap Structure),则行定位器存储的是指向数据行的指针。非簇索引将行定位器按关键字的值用一定的方式排序,这个顺序与表的行在数据页中的排序是不匹配的。
由于非簇索引使用索引页存储,因此它比簇索引需要更多的存储空间,且检索效率较低。但一个表只能建一个簇索引,当用户需要建立多个索引时,就需要使用非簇索引了。从理论上讲,一个表最多可以建249个非簇索引.

簇索引可以改变表的物理顺序
非簇索引可以提高查询性能

**********************************************************************************************************************

连接查询分为等值连接查询、非等值连接查询、自连接查询、外部连接查询和复合条件连接查询

=======================
内部连接和外部连接的区别:==
=======================
内部连接:连接的结果是从2个或2个以上的表的组合中挑出符合连接条件的数据,如果数据无法满足连接条件则将丢弃。内部连接的表是平等的。

外部连接:参与连接的表有主次之分,以主表的每行数据去匹配从表的数据列,符合连接条件的数据将直接返回到结果集中,对那些不符合条件的列,将被填上NULL值后再返回到结果集中(对BIT类型的列,由于BITl类型不允许NULL值,因此将会被填上0再返回到结果集中)
**外部连接分为左外部连接,主表在左边,则称为左外部连接,主表在右边,则称为右外部连接。

嵌套查询:在一个SELECT语句的WHERE子句或HAVING子句中嵌套另一个SELECT语句的查询称为嵌套查询,又称子查询。子查询是SQL语句的扩展。

合并查询:就是使用UNION操作符将来自不同查询的数据组合起来,形成一个具有综合信息的查询结果。UNION操作会自动将重复的数据行剔除。必须注意的是,参加合并查询的各子查询的使用的表结构应该相同,即各子查询中的数据数目和对应的数据类型都必须相同。

**********************************************************************************************************************
存储过程优点:
1、允许标准组件式编程
2、能够实现较快的执行速度(预编译的,在首次运行一个存储过程的时候,查询优化器对其进行分析、优化,并给出最终被存在系统表中的执行计划)
3、能够减少网络流量(传输的只是调用语句而非SQL语句)
4、可被作为一种安全机制来充分利用

@@存储过程虽然既有参数又有返回值,但是它与函数不同。存储过程的返回值只是指明执行是否成功,并且它不能像函数那样被直接调用,也就是在调用存储过程时,在存储过程名字前要有EXEC保留字。

用CREATE PROCEDURE命令创建存储过程要考虑以下几个问题:
1)在一个批处理中,CREATE PROCEDURE语句不能与其它SQL语句合并在一起;
2)数据库所有者具有默认的创建存储过程的权限,它可把该权限传递给其它的用户;
3)存储过程作为数据库对象其命名必须符合命名规则;
4)只能在当前数据库中创建属于当前数据库的存储过程。

触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。除此之外,触发器还有其它许多不同的功能:
1、强化约束
2、跟踪变化
3、级联运行
4、存储过程的调用

触发器的种类:
SQL SERVER 2000支持2种类型的触发器:AFTER触发器和INSTEAD OF触发器。

AFTER触发器要求只有执行某一操作(INSERT、UPDATE、DELETE)之后,触发器才被触发,且只能在表上定义。可以为针对表的同一操作定义多个触发器。对应AFTER触发器,可以定义哪一个触发器被最先触发,哪一个被最后触发,通常使用系统过程sp_settriggerorder来完成此任务。

INSTEAD OF触发器表示并不执行其所定义的操作(INSERT、UPDATE、DELETE),而仅是执行触发器本身。既可在表上定义INSTEAD OF触发器,也可以在视图上定义INSTEAD OF触发器,但对同一操作只能定义一个INSTEAD OF触发器。
INSTEAD OF触发器的另外的优点是,通过使用逻辑语句以执行批处理的某一部分而放弃执行其余部分。比如,可以定义触发器在遇到某一错误时,转而执行触发器的另外部分。

*************************************************************************

一、统计函数:
1、AVG(求平均值)
2、COUNT(统计数目)
3、MAX(求最大值)
4、MIN(求最小值)
5、SUM(求和)
6、STDEV(<expression>)(返回表达式中所有数据的标准差)
7、STDEVP(<expression>)(返回总体标准差)
8、VAR(<expression>)(返回表达式中所有值的统计变异数)
9、VARP()(返回总体变异数)

二、算术函数:
1、SIN
2、COS
3、TAN
4、COT
5、ASIN
6、ACOS
7、ATAN
8、ATAN2
9、DEGREES
10、RADIANS
11、EXP
12、LOG
13、LOG10
14、SQRT
15、CEILING
16、FLOOR
17、ROUND
18、ABS
19、SIGN
20、PI()
21、RAND

===============
三、字符串函数: ==
===============

3.1 字符转换函数:
**********************
1、ASCII(<character_expression>) 返回字符表达式最左端字符的ASCII码值。
2、CHAR(<integer_expression>) 用于将ASCII码转换为字符。
3、LOWER(<character_expression>) 把字符串全部转换为小写
4、UPPER(<character_expression>) 把字符串全部转换为大写
5、STR(<float_expression>[,length[,<decimal_expression>]]) 把数值型数据转换为字符型数据

3.2 去空格函数
*****************
1、LTRIM() 把字符串头部的空格去掉
2、RTRIM()  把字符串尾部的空格去掉

3.3 取字串函数
*****************
1、LEFT(<character_expression>,<integer_expression>)
说明:返回的字串是从字符串右边第integer_expression个字符起到最后一个字符的部分

2、RIGHT(<character_expression>,<integer_expression>)
说明:返回的字串是从字符串最左边起到第integer_expression个字符的部分

3、SUBSTRING(<expression>,<staring_position>,length)
说明:返回的字串是从字符串左边第starting_position个字符起length个字符的部分,SUBSTRING()函数不能用于TEXT和IMAGE数据类型

3.4 字符串比较函数
*********************
1、CHARINDEX(<'substring_expression'>,<expression>)
说明:substring_expression是所要查找的字符表达式,expression可为字符串也可为列名表达式。如果没有发现字串,则返回0值。此函数不能用于TEXT和IMAGE数据类型

2、PATINDEX(<'%substring_expression%'>,<column_name>)
说明:返回字符串中某个指定的字串出现的开始位置,其中字串表达式前后必须有百分号%,否则返回值为0

3、SOUNDEX(<character_expression>)
说明:函数将character_expression转换为4个字符的声音码。其中第一个码为原字符串的第一个字符,第二到第四个字符则为数字,是该字符串的声音字母所对应的数字,但是忽略了除首字母外的串中的所有元音字母。SOUNDEX()函数可用来查找声音相似的字符串。但SOUNDEX()函数对数字和汉字均只返回0值

4、DIFFERENCE(<character_ex1>,<character_exp2>)
说明:DIFFERENCE()函数返回由SOUNDEX()函数返回的两个字符表达式的值的差异
值的差异是用0、1、2、3、4来表示的,含义如下:
0-----两个SOUNDEX()函数返回值的第一个字符不同
1-----两个SOUNDEX()函数返回值的第一个字符相同
2-----两个SOUNDEX()函数返回值的第一、二个字符相同
3-----两个SOUNDEX()函数返回值的第一、二、三个字符相同
4-----两个SOUND的函数返回值完全相同

3.5 字符串操作函数
*********************
1、QUOTENAME(<'character_exp'>[,quote_character])
说明:返回特定字符括起来的字符串,其中quote_character标明字符串所用的字符,如‘、(、[

2、REPLICATE(character_exp,integer_exp)
说明:返回一个重复character_exp指定次数的字符串,如果integer_exp值为负值,则此函数返回NULL串

3、REVERSE(<character_exp>)
说明:将指定的字符串的字符排列顺序颠倒,其中character_exp可以是字符串、常数或一个列的值

4、REPLACE(<string_exp1>,<string_exp2>,<string_exp3>)
说明:返回被替换了指定子串的字符串,此函数用string_exp3替换在string_exp1中的字串string_exp2

5、SPACE(<integer_exp>)
说明:返回一个有指定长度的空白字符串,如果integer_exp值为负值,则此函数返回NULL串

6、STUFF(<character_exp1>,<start_position>,<length>,<character_exp2>)
说明:用另一子串替换字符串指定位置、长度的子串,如果起始位置为负或长度值为负,或者起始位置大于character_exp1的长度,则此函数返回NULL值。如果length长度大于character_exp1的长度,则character_exp1只保留首字符

3.6 数据类型转换函数
************************
1、CAST(<exp> AS <data_type>](length)])
2、CONVERT(<data_type>[(length)],<exp>[,style])


3.7 日期函数
**************
1、DAY(<date_exp>) 返回date_exp中的日期值
2、MONTH(<date_exp>) 返回月份值
3、YEAR(<date_exp>) 返回年份值
4、DATEADD(<datepart>,<number>,<date>)
说明:返回指定日期date加上指定的额外日期间隔number产生的新日期。
5、DATEDIFF(<datepart>,<date1>,<date2>)
说明:返回两个指定日期在datepart方面的不同之处,即date2超过date1的差距值,其结果值是一个带有正符号的整数值
6、DATENAME(<datepart>,<date>) 以字符串的形式返回日期的指定部分
7、DATEPART(<datepart>,<date>) 以整数值的形式返回日期的指定部分
8、GETDATE() 返回系统当前的日期和时间

一个通用的获取当月天数的SQL:SELECT  32-Day(getdate()+32-Day(getdate()))  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值