发布新日志

  • SQL 触发器

    2008-11-18 09:41:34

    SQL触发器有3种: insert触发器.update触发器.delete触发器
    insert触发器:用insert语句向表中插入数据时都会执行的触发器.当触发insert触发器时新的数据行就会被插入到触发器表和inserted表中。inserted表是一个逻辑表它包含了已经插入的数据行的一个副本。
    例:
    create trigger tri_insert 
    on student
    for insert
    as
    declare @student_id char(10)
    select @student_id=s.student_id from
    student s inner join
    inserted i
    on s.student_id=i.student_id
    if @student_id='000000001'
    begin
         raiserror('can't insert number 1',16,8)
         rollback tran
    end
    go
    delete触发器:当触发delete触发器后从受影响的表中删除的行将被放置到一个特殊的deleted表中。deleted表是一个逻辑表它保留已被删除数据行的一个副本。
    • 当某行被添加到deleted表中时,它就不再存在于数据库表中;因此,deleted表和数据库表没有相同的行。
    • 创建deleted表时,空间是从内存中分配的。deleted表总是被存储在高速缓存中。
    • DELETE动作定义的触发器并不执行TRUNCATE TABLE语句原因在于日志不记录TRUNCATE TABLE语句。
    例:
    create trigger tri_delete
    on student 
    for delete 
    as 
    declare @student_id varchar(10)
    select @student_id=student_id from deleted 
    if @student_id='admin' 
    begin
       raiserror('错误',16,8
       
    rollback tran 
    end
    update触发器:可将update语句看成两步操作即捕获数据前像(before image)的delete语句和捕获数据后像(after image)的insert语句。当在定义有触发器的表上执行update语句时原始行前像)被移入到deleted更新行后像)被移入到inserted表。
    例:
    create trigger tri_update 
    on student
    for update
    as 
    if update(student_id) 
    begin
       raiserror('学号不能修改!',16,8
       
    rollback tran 
    end

    go
  • SQL Server索引简单总结

    2008-11-10 17:25:43

          SQL Server中索引属于SQL Server对象的一种,其最主要的目的是加快查询速度。原本需要100秒的查询在加了索引后可能会降低到10秒以下。
          索引分为2类,一类是聚集索引(clustered index),另一类是非聚集索引(nonclustered index),其中加了聚集索引的表是只指按照一定顺序排列的表,而这个顺序就是一个聚集索引,当为一个table的一个column加上聚集索引后,就相当与为这个table做一个排序,而排序的规则就是按照这个column。而非聚集索引则相当与在聚集索引中加了一道,如果为一个table的多个column加了非聚集索引后,就相当与为这个table做了多个排序方式,如果要找到某个值,就要先找到一个排序方式,然后再来找到需要的内容。
          为一个表建立一个主键后,聚集索引会自动加到这个主键上,而通常这个并不是最好的方式,正确的方式是加到一些经常被用来查询的字段。通常只要加了索引后,查询速度都能得到显著的提高,而且聚集索引在数据量小的情况下也远比非聚集索引要快的多,一个好的方式是在每段查询语句后面加上一个函数:
            declare @d datetime
    set @d=getdate()
    select [语句执行的毫秒数]=datadiff(ms,@d,getdate());
          建立/删除聚集及非聚集索引的SQL语句:
    • DROP INDEX mytable.mycolumn_index
    • CREATE INDEX mycolumn_index ON mytable (myclumn)
    • CREATE CLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn) WITH ALLOW_DUP_ROW
    • CREATE INDEX name_index ON username(firstname,lastname)
          还有一个复合的聚集索引,就是将多个字段连在一个组合成一个非聚集索引,作为主索引的复合聚集索引同样会对速度带来提升。
          索引有助于提高检索性能,但过多或不当的索引也会导致系统低效。因为用户在表中每加进一个索引,数据库就要做更多的工作。过多的索引甚至会导致索引碎片。
          
  • SQL常用的Function

    2008-11-09 11:02:01

    SQL Server中的Aggregate函数
    1. AVG(column)  返回某列的平均值。
    2. Count(column) 返回某列的行数。
    3. Count(distinct column) 返回相异结果的数目。
    4. First(column)返回在指定结果中的第一个值。
    5. Last(column)返回在指定结果中的最后一个值。
    6. MAX(column)返回某列的最高值。
    7. MIN(column)返回某列的最低值。
    8. SUM(column)返回某列的总和,也就是全部加起来。

    SQL Server中的Scalar函数
    1. UCASE(column)将某个域转换为大写。
    2. LCASE(column)将某个域转换为小写。
    3. MID(column,start[,end])从某个文本域提取字符。
    4. LEN(column)返回某个文本域的长度。
    5. LEFT(column,number_of_char)返回某个被请求的文本域的左侧部分。
    6. RIGHT(column,number_of_char)返回某个被请求的文本域的右侧部分。
    7. ROUND(column,decimals)对某个数值域进行指定小数位数的四舍五入。
    8. NOW()返回的系统日期。
    9. FORMAT(column,format)改变某个域的显示方式。
  • SQL Select语句的执行顺序

    2008-11-09 10:43:54

    1、from子句组装来自不同数据源的数据;
    2、where子句基于指定的条件对记录行进行筛选;
    3、group by子句将数据划分为多个分组;
    4、使用聚集函数进行计算;
    5、使用having子句筛选分组;
    6、计算所有的表达式;
    7、使用order by对结果集进行排序。

    简单的Select结构
    Select SUM(*),distinct column
    From Table a inner join Table b
    where conditions and|or|between conditions in (select...)
    group by <column> 
    having count(colume) condition 
    order by column ASC|DESC

    要把我们语言思维种的语义变成SQL种的语句要注意几点:
    1、首先看最后我们需要的是什么东西,也就是把select后面的字段搞清楚。
    2、然后看要把这些字段搞清楚需要那些表来支持、是否需要要将多个表join起来,注意inner join形成的是一个X*X的字段。
    3、比较难的地方在where后的conditions中,首先要看where语句中conditions是否只用and或or就能表达出来,如果不能的话那就用in 然后再在后面加一个select,相当与从一个新表中找到结果。
    4、group by可以理解成将column distinct起来,在distinct的过程中可以用having 语句来从distinct中选择需要被显示出来的项目。
Open Toolbar