序言
INSERT INTO SELECT 与 SELECT INTO
通俗来讲,INSERT INTO SELECT 和 SELECT INTO 两个语句的作用都是复制表,因为都是从一个表中查询出数据然后插入到另一个表中,被查询的表可以是派生表。二者的区别在于:INSERT INTO SELECT 只复制表数据,不复制表结构,也不创建新表;而 SELECT INTO 不仅复制表数据,还复制表结构,而且会创建新表。
从另一个角度来说,INSERT INTO SELECT 要插入的表必须是已经存在的,因此需要考虑查询表与插入表的数据兼容性,而 SELECT INTO 则会把数据插入到尚不存在的新表中。
还有一个角度就是,INSERT INTO SELECT 要求必须有目标(插入)表,但可以没有(数据)源表,临时组装的数据即可;而 SELECT INTO 恰恰相反,可以(也必须)没有目标表,但必须要有源表。
复制表结构
select * into 新表 from 旧表 where 1 > 2;
ROW_NUMBER()高效分页
int pageIndex = 1;//第几页 int pageSize = 1000;//每页显示条数 int start = (pageIndex - 1) * pageSize + 1; int end = pageIndex * pageSize; string sqlQuery = string.Format("SELECT * FROM (SELECT * ,ROW_NUMBER() OVER(ORDER BY 排序字段 DESC) AS num FROM TableName ) AS t WHERE num BETWEEN {0} AND {1} ORDER BY PTime DESC", start, end);
更新字段
update [专家库20161222] set 履历 = replace(履历,'','$$')
获取数据库表和视图
select name from sysobjects where xtype in ('U','V') select name = s.name +'.'+ t.name from sys.tables t , sys.schemas s where t.schema_id = s.schema_id
SQL里面IN比较快还是EXISTS比较快?
这个题不能一概而论,要根据具体情况来看。IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。
如果查询语句使用了not in,那么对内外表都进行全表扫描,没有用到索引;而not exists的子查询依然能用到表上的索引。所以无论哪个表大,用not exists都比not in 要快。
DataReader、Dataset
数据量太大就用datareader,dataset都读到内存里了,datareader是直接读取数据库。
DataReader是一个快速的只进游标
DataReader分页速度更快
分页进化
2012的OFFSET分页方式
--2012的OFFSET分页方式 select number from spt_values where type='p' order by number offset 10 rows fetch next 5 rows only; go --2005的ROW_NUMBER分页方式 select number from ( select number,row_number() over(order by number) as num from spt_values where type='p' ) t where num between 11 and 15 order by number asc go --2000的TOP分页方式 select number from ( select top 5 number from ( select top 15 number from spt_values where type='p' order by number asc ) t order by number desc ) t order by number asc