SQL知识小结

2013-06-14  籽藤 

折腾了半年多的Financial Reporting Service,把一些常用的SQL知识都捡起来了。虽然都是在网上讲烂了的知识,但在面试的时候,还是考倒了不少人。课堂上或许老师也不会特别讲授这些知识点,印象中老师更爱讲第N范式,内模式,外模式之类的理论  

1. Select … into VS insert into … select

前者会创建一张新表,后者是把select之后的结果集插入到已存在的表中。

The SELECT INTO statement creates a new table and populates it with the result set of the SELECT statement.

The select * into table1 from table2 where 1=1 creates table1 and inserts the values of table2 in them. So, if the table is already created that statement would give an error.The insert into table1 select * from table2 only inserts the values of table2 in table1.

2. 临时表 VS 表变量

局部/全局临时表 用#/##定义
局部/全局表变量 用@/@@定义

临时表一般被创建后,如果在执行的时候,没有通过DROP Table的操作,第二次就不能再被创建,因为它已经存在于tempdb中;而定义表变量不需要进行DROP Table的操作,一次执行完成后就会消失。

1)使用表变量主要需要考虑的就是应用程序对内存的压力,如果代码的运行实例很多,就要特别注意内存变量对内存的消耗。我们对于较小的数据或者是通过计算出来的推荐使用表变量。如果数据的结果比较大,在代码中用于临时计算,在选取的时候没有什么分组的聚合,就可以考虑使用表变量。

2)一般对于大的数据结果,或者因为统计出来的数据为了便于更好的优化,我们就推荐使用临时表,同时还可以创建索引,由于临时表是存放在Tempdb中,一般默认分配的空间很少,需要对tempdb进行调优,增大其存储的空间。

3. nolock使用

这篇博文对nolock的使用场景做了详细阐述。总之,在生产环境中,在海量数据中查看历史记录,要养成使用nolock的好习惯。
http://www.cnblogs.com/GoGoagg/archive/2010/08/15/1799939.html

4. quotename的使用

quote字面意思就是‘引用’。比如,有个表名是特殊关键字,index,good luck一类的,那么若要在query中提到这个表名,就采用[index],[good luck]...所以quotename就应运而生了:
DECLARE @tbname VARCHAR(256)
SET @tbname = 'index'
EXEC ('select * from ' + QUOTENAME(@tbname))

上面是网上随处可见的quotename用法的例子,但exec有语法错误。正确的写法应该是:

use appletest

declare @tbname varchar(256), @sql varchar(256)
set @tbname='index'
set @sql = 'select * from '+QUOTENAME(@tbname)
exec(@sql)

367°/3677 人阅读/0 条评论 发表评论

登录 后发表评论