zoukankan      html  css  js  c++  java
  • SQL Server 基础:朝花夕拾

    序言

    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
    View Code
    DECLARE @pageSize INT
    DECLARE @pageIndex INT
    
    --第4页,每页显示10条数据
    SET @pageSize = 10
    SET @pageIndex = 4
                
    SELECT * FROM
    (
        SELECT ROW_NUMBER() OVER (ORDER BY Created_Time ASC) AS 'RowNumber', * FROM dbo.COM_UserInfo
    ) AS UserInfo
    WHERE RowNumber BETWEEN ( ( ( @pageIndex - 1 ) * @pageSize ) + 1 ) AND ( @pageIndex * @pageSize )
    View Code
    SELECT TOP 页大小 * 
    FROM
        (
            SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1
        )   as A  
    WHERE RowNumber > 页大小*(页数-1) 
     
    --注解:首先利用Row_number()为table1表的每一行添加一个行号,给行号这一列取名'RowNumber' 在over()方法中将'RowNumber'做了升序排列
    --然后将'RowNumber'列 与table1表的所有列 形成一个表A
    --重点在where条件。假如当前页(currentPage)是第2页,每页显示10个数据(pageSzie)。那么第一页的数据就是第11-20条
    --所以为了显示第二页的数据,即显示第11-20条数据,那么就让RowNumber大于 10*(2-1) 即:页大小*(当前页-1)
    View Code

     Merge —— 一步实现 insert,update,delete

    MERGE INTO TargetTable AS T        --可添加 TOP 限制操作行数: MERGE TOP(2)
    USING SourceTable AS S
    ON T.id=S.id
    WHEN MATCHED            --当两者的id能匹配,id=1,2的数据被更新
        THEN UPDATE SET T.[desc]=s.[desc]
    WHEN NOT MATCHED        --目标表没有的ID, 在原表中有,则插入相关的数据
        THEN INSERT VALUES(s.id,s.[desc])
    WHEN NOT MATCHED BY SOURCE --目标表中存在,源表不存在,则删除
        THEN DELETE
    OUTPUT $ACTION AS [Action]
        ,INSERTED.id AS [插入的id]
        ,INSERTED.[desc] AS [插入的DESC]
        ,DELETED.id AS [删除的id]
        ,DELETED.[desc] AS [删除的DESC]
    View Code

    经典SQL语句大全

    1.1=1,1=2的使用,在SQL语句组合时用的较多 "where 1=1" 是表示选择全部 "where 1=2"全部不选.

    资料

    http://www.codeisbug.com/Doc/8/1145

    大型项目中,DataReader几乎是首选,DataSet难觅踪影。

    https://blog.csdn.net/naughty610/article/details/5358494

    C# SqlDataReader提高效率的方法

    https://blog.csdn.net/limlimlim/article/details/8626920

    SQL的六种约束

    SQL merge into 表合并

  • 相关阅读:
    【今日CS 视觉论文速览】4 Jan 2019
    【今日CS 视觉论文速览】3 Jan 2019
    【今日CS 视觉论文速览】1 Jan 2019
    【机器学习】混淆矩阵及其绘制
    【Vim】批量插入注释符号
    【今日CS 视觉论文速览】31 Dec 2018
    【深度学习风格化/生成艺术】图像融合--毫无违和
    CSDN的一些年度大牛(2018)
    【今日CS 视觉论文速览】 27 Dec 2018
    python与机器视觉(X)打包为exe可执行文件
  • 原文地址:https://www.cnblogs.com/cnki/p/5264963.html
Copyright © 2011-2022 走看看