SQL經典短小代碼收集

轉自:http://www.cnblogs.com/accumulater/p/6178083.htmlhtml

 

--SQL Server:
Select TOP N * From TABLE Order By NewID() 

--開頭到N條記錄
Select Top N * From 表

--N到M條記錄(要有主索引ID)
Select Top M-N * From 表Where ID in (Select Top M ID From 表) Order by ID  Desc

--選擇10從到15的記錄
select top 5 * from (select top 15 * from table order by id asc) A  order by id desc 

--N到結尾記錄
Select Top N * From 表Order by ID Desc
 
統計比例:0.11node

select cast( (sum( case when id=2 then 1 else 0 end) +0.00)/Count(1) as decimal(18,2)) as 比例 from @rtb  

 

 

 

--顯示最後5條記錄,可是顯示的順序必須爲5,6,7,8,9,10,而不是10,9,8,7,6,5 以下解決方法:

select top 5 from test where id in(select top 5 from test orderby id desc) orderby id asc 


--經過這個問題也能總結出4-10條,5-100條這種限定必定範圍內的sql語句的寫法:

selecttop<末端ID-頂端ID+1>*from<表名>where ID notin(selecttop<頂端ID-1>) ID from<表名>)

--例如:4-10條就應該寫成
selecttop10-4+1*from test where id notin(selecttop4-1 id from test)sql

  

 上一篇: select top 1 * from [news_table] where [新聞標識列]<當前id號 where ......
 下一篇: select top 1 * from [news_table] where [新聞標識列]>當前id號 where ...... order by [新聞標識列] desc數據庫

 

 

--最新發布的20條信息列表,要求包含:信息ID、信息標題、信息發佈時間、信息發佈人姓名、信息評論總數和最後評論時間,而且按最後評論時間排序SelectTop(100) a.infoID,a.infoTitle,a.infoPubDate,c.userName,Max( b.infoReplyDate ) As 最後時間,Count( b.infoReplyID ) As 評論總數 From info a LeftJoin[InfoReply] bOn a.infoID = b.infoID LeftJoin[User] c On a.infoPubUser = c.userNo And b.infoReplyUser =c.userNo GroupBy a.infoPubDate,a.infoID,a.infoTitle,c.userName OrderByMax( a.infoPubDate ) desc

 

 create table t (name varchar(20))express

複製代碼
複製代碼
--drop table t
--DELETE t

insert  into t
        select  '1'
        union all
        select  '2'
        union all
        select  '3'
        union all
        select  '5'
        union all
        select  '5'
        union all
        select  '5'
        union all
        select  '6'
        union all
        select  '3'
        union all
        select  '4'
 
/*  找出相同的 

3
5
5
5
3
*/

--1.   in
select  *
from    t
where   NAME in (select name
                 from   t
                 group by name
                 having count(name)>1)


--2.  join

select  t.*
from    t
join    (select name
         from   t
         group by name
         having count(name)>1
        ) a on T.NAME=a.name

 
--3 .  EXISTS
select  *
from    t
where   exists ( select *
                 from   (select name
                         from   t
                         group by name
                         having count(name)>1
                        ) a
                 where  a.NAME=t.name )

-- 4.  2005  ROW_NUMBER()
select  t.*
from    t
join    (select *
         from   (select row_number() over (partition by NAME order by name) as id,
                        name
                 from   t
                ) a
         where  id=2
        ) b on t.NAME=b.name
複製代碼
複製代碼

 

複製代碼
複製代碼
--a b 字段phone
--A表大 B表小 a和b可能有重複數據
--隨機刪除a表n條數據 重複的保留
DELETE  A
FROM    A
        JOIN ( SELECT TOP ( 6000 )
                        *
               FROM     ( SELECT    ROW_NUMBER() OVER ( ORDER BY u2.phone ) id ,
                                    u2.phone
                          FROM      ( SELECT    *
                                      FROM      ( SELECT    phone
                                                  FROM      A
                                                  EXCEPT
                                                  SELECT    phone
                                                  FROM      B
                                                ) u1
                                    ) u2
                        ) result1
               WHERE    id > 30  --30條以後的隨機刪除
               ORDER BY NEWID()  --隨機
               
             ) result3 ON A.phone = result3.phone



BULK INSERT A
FROM 'C:\Users\zengzhan\Desktop\a.txt'
WITH (
    FIELDTERMINATOR = '|',
    ROWTERMINATOR = '\n'
)
--2w

BULK INSERT B
FROM 'C:\Users\zengzhan\Desktop\B.txt'
WITH (
    FIELDTERMINATOR = '|',
    ROWTERMINATOR = '\n'
)
--927  
複製代碼
複製代碼

 

 

 --號碼相同 內容不一樣
select a.* from hebin4 a where exists(select 1 from hebin4 b where Phone=a.Phone and msg <>a.msg)  
--大數據找差集
select  t.ip into  iptemp from  (
SELECT  b.ip FROM  tb1  a  JOIN   tb2 b
on    b.num  between  a.startnum and    a.endnum
) t
  
SELECT   ip FROM  tb2 except
SELECT   ip FROM  iptemp

  

 

 清理日誌:c#

複製代碼
複製代碼
use CTC315
select * from sysfiles

  dump transaction CTC315 with no_log  
  DBCC SHRINKFILE ('CTC315_Log')

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
create procedure [dbo].[p清除日誌]
@databasename varchar(100) -- 數據庫名稱
as
begin
 declare @execsql nvarchar(max), --  執行語句
  @logfilename varchar(100) -- 日誌邏輯文件
 select @execsql='select @filename=name from  '+@databasename
  +'.dbo.[sysfiles]  where fileid=2' --  查詢文件名
-- select 1,@execsql,@logfilename 
 exec sp_executesql @execsql,N'@filename varchar(100) output ',@logfilename output 
-- select 1,@logfilename
 select @execsql='use '+@databasename
  +'   dump transaction '+@databasename+'  with no_log  '
  +'  DBCC SHRINKFILE ('+@logfilename+') '  -- 清除腳本
-- select @execsql
 exec sp_executesql @execsql -- 清除
 
end
/*
exec [p清除日誌] 'master'
*/
複製代碼
複製代碼

 

複製代碼
複製代碼
SQL 7.0/2000:
BACKUP TRANSACTION DBName WITH TRUNCATE_ONLY DBCC SHRINKFILE(2,200)

SQL 2005:
在 SQL 2005 中備份 Transaction Log 語法改為 Backup LOG
BACKUP LOG DBName WITH NO_LOG
DBCC SHRINKFILE(2,200)

SQL 2008:
必須先將復原模式改為 "簡單" 才能清除,完成之後再將模式改回 "完整"
USE DBName
Alter Database DBName Set Recovery Simple DBCC SHRINKFILE(2,100) Alter Database DBName Set Recovery Full

SQL 2008 R2:
USE DBName;
GO
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE DBName
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 10 MB.
DBCC SHRINKFILE (2, 10);
GO
-- Reset the database recovery model.
ALTER DATABASE DBName
SET RECOVERY FULL;
GO
*上述 DBCC  SHRINKFILE (2, 10),2指的是LOG File, 10指的是壓到10MB哦!
複製代碼
複製代碼


一個表中的Id有多個記錄,把全部這個id的記錄查出來,並顯示共有多少條記錄數。
------------------------------------------
select id, Count(*) from tb group by id having count(*)>1
app

 

--刪除上萬條記錄 不要用 not in
delete from acct_item a where not exists (select 1 from subs b where a.subs_id=b.subs_id ) 

 

 

--兩條記錄徹底相同,如何刪除其中一條
set rowcount=1 
delete from thetablename where id=@duplicate_id--@duplicate_id爲重複值的id 


--模糊查詢
select *  from product where detail like '%123.jpg%'
--替換字段裏面部份內容
update product set detail=replace(cast(detail as varchar(8000)),'abc.jpg','efg.jpg') dom

 

--SQL 替換掉 括號部份內容
select reverse(stuff(reverse(ServiceShopName), 1, charindex('(', reverse(ServiceShopName)), '')) from dbo.[簽名] 

update dbo.簽名 set ServiceShopName=reverse(stuff(reverse(ServiceShopName), 1, charindex('(', reverse(ServiceShopName)), ''))

select distinct('【'+ServiceShopName+'】') from dbo.簽名

 

 

 

--查詢邏輯順序 (8) SELECT (9) DISTINCT (11) <TOP_specification><select_list> (1) FROM<left_table>(3) <join_type>JOIN<right_table> (2) ON<join_condition> (4) WHERE<where_condition> (5)GROUPBY<group_by_list> (6) WITH {CUBE | ROLLUP} (7) HAVING<having_condition> (10)ORDERBY<order_by_list>

 

 

 

複製代碼
複製代碼
(5) SELECT (5-2) DISTINCT (5-3) TOP(<top_specification>) (5-1) <select_list>
(1) FROM (1-J) <left_table> <join_type> JOIN <right_table> ON <on_predicate>
       | (1-A) <left_table> <apply_type> APPLY <right_table_expression> AS <alias>
       | (1-P) <left_table> PIVOT(<pivot_specification>) AS <alias>
       | (1-U) <left_table> UNPIVOT(<unpivot_specification>) AS <alias>
(2) WHERE <where_predicate>
(3) GROUP BY <group_by_specification>
(4) HAVING <having_predicate>
(6) ORDER BY <order_by_list>
複製代碼
複製代碼

 

複製代碼
複製代碼
 --存儲過程 批量插入txt
 DECLARE @filepath NVARCHAR(200)
 SET @filepath = @path
 DECLARE @bulkinsert NVARCHAR(2000)
 SET @bulkinsert = N'BULK INSERT #PhoneData FROM ''' + @filepath
     + N''' WITH (FIELDTERMINATOR = '''', ROWTERMINATOR = ''\n'')'
 CREATE TABLE #PhoneData ( phone VARCHAR(12) )
 EXEC sp_executesql @bulkinsert
複製代碼
複製代碼

 

--取到小數第二位四捨五入
SelectConvert(Numeric(20,2), IsNull(50.01634,0))
--50.02
SelectConvert(Numeric(20,2), IsNull(9,0))
--9.00

 

 



--日期轉換參數,值得收藏
select CONVERT(varchar, getdate(), 120 )
2004-09-12 11:06:08 

select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),'-',''),' ',''),':','')
20040912110608

select CONVERT(varchar(12) , getdate(), 111 )
2004/09/12

select CONVERT(varchar(12) , getdate(), 112 )
20040912

select CONVERT(varchar(12) , getdate(), 102 )
2004.09.12

 

--一個月第一天
SELECT   DATEADD(mm,   DATEDIFF(mm,0,getdate()),   0)  --  2009-06-01 00:00:00.000

--當天
select  * from product  where DateDiff(day,modiDate,GetDate())>1 

--如何查詢本日、本月、本年的記錄SQL
本年:
select * from loanInfo where year(date)=year(getdate()) 
本月:
select * from loanInfo where year(date)=year(getDate()) And month(date)=month(getdate()) 
本日:
select * from loanInfo where year(date)=year(getDate()) And month(date)=month(getdate()) and Day(date)=Day(getDate())   

昨天的記錄:
datediff(day,[Datetime],getdate())=1  把Datetime換爲你的相應字段,getdate()-Datetime即爲時間差。
本月記錄:
SELECT * FROM 表 WHERE datediff(month,[dateadd],getdate())=0
本週記錄:
SELECT * FROM 表 WHERE datediff(week,[dateadd],getdate())=0
本日記錄:
SELECT * FROM 表 WHERE datediff(day,[dateadd],getdate())=0

本週的星期一   SELECT  DATEADD(wk,  DATEDIFF(wk,0,getdate()),  0)  
 
一年的第一天  SELECT  DATEADD(yy,  DATEDIFF(yy,0,getdate()),  0)  
 
季度的第一天   SELECT  DATEADD(qq,  DATEDIFF(qq,0,getdate()),  0)  
 
當天的半夜   SELECT  DATEADD(dd,  DATEDIFF(dd,0,getdate()),  0)  
 
上個月的最後一天 
 
       這是一個計算上個月最後一天的例子。它經過從一個月的最後一天這個例子上減去毫秒來得到。有一點要記住,在Sql  Server中時間是精確到毫秒。這就是爲何我須要減去毫秒來得到我要的日期和時間。 
 
       SELECT  dateadd(ms,-3,DATEADD(mm,  DATEDIFF(mm,0,getdate()),  0))  
 
       計算出來的日期的時間部分包含了一個Sql  Server能夠記錄的一天的最後時刻(「:59:59:997」)的時間。 
 
去年的最後一天 
 
       鏈接上面的例子,爲了要獲得去年的最後一天,你須要在今年的第一天上減去毫秒。 
 
       SELECT  dateadd(ms,-3,DATEADD(yy,  DATEDIFF(yy,0,getdate()),  0))  
 
本月的最後一天 
 
       如今,爲了得到本月的最後一天,我須要稍微修改一下得到上個月的最後一天的語句。修改須要給用DATEDIFF比較當前日期和「-01-01」返回的時間間隔上加。經過加個月,我計算出下個月的第一天,而後減去毫秒,這樣就計算出了這個月的最後一天。這是計算本月最後一天的SQL腳本。 
 
       SELECT  dateadd(ms,-3,DATEADD(mm,  DATEDIFF(m,0,getdate())+1,  0))  
 
本年的最後一天 
 
       你如今應該掌握這個的作法,這是計算本年最後一天腳本 
 
       SELECT  dateadd(ms,-3,DATEADD(yy,  DATEDIFF(yy,0,getdate())+1,  0))。 
 
本月的第一個星期一 
 
       好了,如今是最後一個例子。這裏我要計算這個月的第一個星期一。這是計算的腳本。 
 
         select  DATEADD(wk,  DATEDIFF(wk,0,                                                          
                               dateadd(dd,6-datepart(day,getdate()),getdate())        
                                                                                                 ),  0)                          
 
       在這個例子裏,我使用了「本週的星期一」的腳本,並做了一點點修改。修改的部分是把原來腳本中「getdate()」部分替換成計算本月的第天,在計算中用本月的第天來替換當前日期使得計算能夠得到這個月的第一個星期一。 


--刪除一個月前,三個月前, 6個月前,一年前的數據 

DELETE FROM 表名WHERE datediff(MM, AddTime,GETDATE()) > 1
DELETE FROM 表名WHERE datediff(MM, AddTime,GETDATE()) > 3
DELETE FROM 表名WHERE datediff(MM, AddTime,GETDATE()) > 6
DELETE FROM 表名WHERE datediff(YY, AddTime,GETDATE()) > 1

---------------------------------------------------------------  
附錄,其餘日期處理方法 
 
1)去掉時分秒 
declare  @  datetime  
set  @  =  getdate()  --'2003-7-1  10:00:00'  
SELECT  @,DATEADD(day,  DATEDIFF(day,0,@),  0)  
 
2)顯示星期幾 
select  datename(weekday,getdate())    
 
3)如何取得某個月的天數 
declare  @m  int  
set  @m=2  --月份 
select    datediff(day,'2003-'+cast(@m  as  varchar)+'-15'  ,'2003-'+cast(@m+1    as  varchar)+'-15')  

另外,取得本月天數 
select    datediff(day,cast(month(GetDate())  as  varchar)+'-'+cast(month(GetDate())  as  varchar)+'-15'  ,cast(month(GetDate())  as  varchar)+'-'+cast(month(GetDate())+1    as  varchar)+'-15')  

任意月份的最大天數
select  day(dateadd(dd,-1,dateadd(mm,1,Dateadd(mm,datediff(mm,0,getdate()),0)))) 


或者使用計算本月的最後一天的腳本,而後用DAY函數區最後一天 
SELECT  Day(dateadd(ms,-3,DATEADD(mm,  DATEDIFF(m,0,getdate())+1,  0)))  
 
4)判斷是否閏年: 

SELECT  case  day(dateadd(mm,  2,  dateadd(ms,-3,DATEADD(yy,  DATEDIFF(yy,0,getdate()),  0))))  when  28  then  '平年'  else  '閏年'  end  

或者 
select  case  datediff(day,datename(year,getdate())+'-02-01',dateadd(mm,1,datename(year,getdate())+'-02-01'))  
when  28  then  '平年'  else  '閏年'  end  
 
5)一個季度多少天 
declare  @m  tinyint,@time  smalldatetime  
select  @m=month(getdate())  
select  @m=case  when  @m  between  1  and  3  then  1  
                       when  @m  between  4  and  6  then  4  
                       when  @m  between  7  and  9  then  7  
                       else  10  end  
select  @time=datename(year,getdate())+'-'+convert(varchar(10),@m)+'-01'  
select  datediff(day,@time,dateadd(mm,3,@time))   


 

 一、肯定某年某月有多少天

實現原理:先利用DATEDIFF取得當前月的第一天,再將月份加一取得下月第一天,而後減去分鐘,再取日期的天數部分,即爲當月最大日期,也即當月天數

CREATE FUNCTION DaysInMonth ( @date datetime ) Returns int
AS
BEGIN
 RETURN Day(dateadd(mi,-3,DATEADD(m, DATEDIFF(m,0,@date)+1,0)))
END

調用示例:

select dbo.DaysInMonth ('2006-02-03') 

(2)計算哪一天是本週的星期一

SELECT DATEADD(week, DATEDIFF(week,'1900-01-01',getdate()), '1900-01-01')  --返回-11-06 00:00:00.000

SELECT DATEADD(week, DATEDIFF(week,0,getdate()),0)      

(3)當前季度的第一天

SELECT DATEADD(quarter, DATEDIFF(quarter,0,getdate()), 0)—返回-10-01 00:00:00.000 

(4)一個季度多少天

declare @m tinyint,@time smalldatetime 

select @m=month(getdate()) 
select @m=case when @m between 1 and 3 then 1 
                       when @m between 4 and 6 then 4 
                       when @m between 7  and 9 then 7 
                       else 10 end 

select @time=datename(year,getdate())+'-'+convert(varchar(10),@m)+'-01' 
select datediff(day,@time,dateadd(mm,3,@time)) —返回



 

1.按姓氏筆畫排序: 
Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as 

2.分頁SQL語句
select * from(select (row_number() OVER (ORDER BY tab.ID Desc)) as rownum,tab.* from 表名As tab) As t where rownum between 起始位置And 結束位置

8.如何修改數據庫的名稱:

sp_renamedb 'old_name', 'new_name' 


3.獲取當前數據庫中的全部用戶表
select * from sysobjects where xtype='U' and category=0 

4.獲取某一個表的全部字段
select name from syscolumns where id=object_id('表名') 

5.查看與某一個表相關的視圖、存儲過程、函數
select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like '%表名%' 

6.查看當前數據庫中全部存儲過程
select name as 存儲過程名稱from sysobjects where xtype='P' 

7.查詢用戶建立的全部數據庫
select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name='sa') 
或者
select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x01 

8.查詢某一個表的字段和數據類型
select column_name,data_type from information_schema.columns where table_name = '表名' 

 

 

9.使用事務
在使用一些對數據庫表的臨時的SQL語句操做時,能夠採用SQL SERVER事務處理,防止對數據操做後發現誤操做問題

開始事務
Begin tran 
Insert Into TableName Values(…) 
SQL語句操做不正常,則回滾事務。

回滾事務
Rollback tran 
SQL語句操做正常,則提交事務,數據提交至數據庫。

提交事務
Commit tran 


計算執行SQL語句查詢時間

declare @d datetime 
set @d=getdate() 
select * from SYS_ColumnProperties select [語句執行花費時間(毫秒)]=datediff(ms,@d,getdate()) 函數

 

 

 

set statistics io on 
set statistics time on 

 

 

 

 

ALTERproc[dbo].[seequerytime]@sqlvarchar(max) asset nocount ondeclare@ddatetimeset@d=getdate()/*你的SQL腳本開始*/exec (@sql) /*你的SQL腳本結束*/declare@resultintselect@result=datediff(ms, @d,getdate()) select@resultprint@result 調用 exec[seequerytime]'select * from dbo.費用表 where 生成日期=''2008-12-09 00:00:00.000'''

 

 


【關閉SQL Server 數據庫全部使用鏈接】

use  master 
go 
create  proc  KillSpByDbName(@dbname  varchar(20))  
as  
begin  
declare  @sql  nvarchar(500),@temp varchar(1000) 
declare  @spid  int  
set  @sql='declare  getspid  cursor  for    
select  spid  from  sysprocesses  where  dbid=db_id('''+@dbname+''')'  
exec  (@sql)  
open  getspid  
fetch  next  from  getspid  into  @spid  
while  @@fetch_status <>-1  
begin  
  set @temp='kill  '+rtrim(@spid) 
  exec(@temp) 
fetch  next  from  getspid  into  @spid  
end  
close  getspid  
deallocate  getspid  
end  

--舉例使用,關閉數據庫下的全部鏈接操做
Use  master  
Exec  KillSpByDbName  '數據庫名稱' 


(一)掛起操做
在安裝Sql或sp補丁的時候系統提示以前有掛起的安裝操做,要求重啓,這裏每每重啓無用,解決辦法:
到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession Manager
刪除PendingFileRenameOperations

(二)收縮數據庫
--重建索引
DBCC REINDEX
DBCC INDEXDEFRAG
--收縮數據和日誌
DBCC SHRINKDB
DBCC SHRINKFILE

(三)壓縮數據庫
dbcc shrinkdatabase(dbname)

(四)轉移數據庫給新用戶以已存在用戶權限
exec sp_change_users_login update_one,newname,oldname
go

(五)檢查備份集
RESTORE VERIFYONLY from disk=Evbbs.bak

(六)修復數據庫
ALTER DATABASE [dvbbs] SET SINGLE_USER
GO
DBCC CHECKDB(dvbbs,repair_allow_data_loss) WITH TABLOCK
GO
ALTER DATABASE [dvbbs] SET MULTI_USER
GO

fetch

複製代碼
複製代碼
--過濾關鍵詞
declare @sql varchar(max)
set @sql = 
    ' select  Id, UserId, SendId, Phone, Message, 
       SentTime, CreateTime, BatchId,null Result1,CompanyID  from #tb 
 where 1=1 '                                
select @sql = @sql + '  and  [Message]  not    like  '       + '''' + '%' + Name + '%' + '''' from  ShieldWord 
where  1 = 1 
 --exec (@sql)
複製代碼
複製代碼

 

 

複製代碼
複製代碼
 --地址 加 市(沒有就加,有則不改) 
update Business_Login
set
[Address] =CASE WHEN [Address]  LIKE '廣州%' THEN [Address]  ELSE  '廣州市'+ [Address] ENd 
where CityID=190 


--跨數據庫更新表
update 
Business_Login 
set
Business_Login.[Address] = A.[Address] FROM  Yht.dbo.Business_Login A
where Business_Login.BusinessId= A.BusinessId
and Business_Login.CityID=190
and Business_Login.CityID=A.CityID

 

SELECT a.BusinessId,
       a.CityID,
       CASE 
            WHEN CHARINDEX(b.CityName, a.[Address]) = 0 THEN b.CityName + a.[Address]
            ELSE a.[Address]
       END AS ADDRESS
FROM   Business_Login a
       LEFT JOIN T_City b
            ON  b.CityID = a.CityID
--批量更新
update  a 
set
a.[Address] =CASE WHEN CHARINDEX(b.CityName, a.[Address]) = 0 THEN b.CityName + a.[Address] ELSE a.[Address] END
FROM Business_Login a, T_City b
          where  b.CityID = a.CityID


--Tag
update Business_Login
set
    Tag = A.CategoryName  from B_Category A 
where TypeId2=A.CategoryId 

 

複製代碼
複製代碼

 

--限制某ip一個小時內不能頻繁操做
SELECT COUNT(1) AS num FROM PhoneVcode  
where datediff( s, CreateTime,getdate())>=1 AND datediff( s, CreateTime,getdate())<=3600

and Ip in (SELECT   Ip FROM PhoneVcode WHERE Ip='127.0.0.1' GROUP BY Ip   having count(Ip)>2)  

 


select top m * from tablename where id not in (select top n id from tablename) 


select top m * into 臨時表(或表變量) from tablename order by columnname -- 將top m筆插入
set rowcount n 
select * from 表變量order by columnname desc 


select top n * from 
(select top m * from tablename order by columnname) a 
order by columnname desc 

 

 

--Trim not removing spaces 不能去掉空白
-- 10- 換行, 13 - 回車, 32 - 空格 ,160 - 空格&nbsp; 
SELECT 
LTRIM(RTRIM(REPLACE(REPLACE(REPLACE([YourColumn], CHAR(10), CHAR(32)),
                                        CHAR(13), CHAR(32)), CHAR(160),
                                CHAR(32)))) AS [YourColumn] 
FROM [YourTable] 




複製表(只複製結構,源表名:a 新表名:b) (Access可用) 
法一:select * into b from a where 1 <>1 
法二:select top 0 * into b from a 

select * into SendBatch_DianXin from SendBatch  where 1=0


拷貝表(拷貝數據,源表名:a 目標表名:b) (Access可用) 
insert into b(a, b, c) select d,e,f from b; 

跨數據庫之間表的拷貝(具體數據使用絕對路徑) (Access可用) 
insert into b(a, b, c) select d,e,f from b in ‘具體數據庫’where 條件
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where.. 

子查詢(表名:a 表名:b) 
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3) 

顯示文章、提交人和最後回覆時間
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b 

外鏈接查詢(表名:a 表名:b) 
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c 

在線視圖查詢(表名:a ) 
select * from (SELECT a,b,c FROM a) T where t.a > 1; 

between的用法,between限制查詢數據範圍時包括了邊界值,not between不包括
select * from table1 where time between time1 and time2 
select a,b,c, from table1 where a not between 數值and 數值

in 的使用方法
select * from table1 where a [not] in (‘值’,’值’,’值’,’值’) 

兩張關聯表,刪除主表中已經在副表中沒有的信息
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) 

四表聯查問題:
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .. 

日程安排提早五分鐘提醒
SQL: select * from 日程安排where datediff('minute',f開始時間,getdate())>5 

一條sql 語句搞定數據庫分頁
select top 10 b.* from (select top 20 主鍵字段,排序字段from 表名order by 排序字段desc) a,表名b where b.主鍵字段= a.主鍵字段order by a.排序字段


選擇在每一組b值相同的數據中對應的a最大的記錄的全部信息(相似這樣的用法能夠用於論壇每個月排行榜,每個月熱銷產品分析,按科目成績排名,等等.) 
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) 

包括全部在TableA 中但不在TableB和TableC 中的行並消除全部重複行而派生出一個結果表
(select a from tableA ) except (select a from tableB) except (select a from tableC) 

隨機取出條數據
select top 10 * from tablename order by newid() 

隨機選擇記錄
select newid() 

 

selectdistinct provincename ,newid() from City orderbynewid(),provincename

 

 
複製代碼
複製代碼
 --隨機更新 n條 
UPDATE TOP(10) SEND
SET    Result3 = 0
FROM   SEND b
       JOIN (
                SELECT TOP 10 * 
                FROM   SEND
                WHERE  Result3 IS NULL
                       AND BatchID = '20101004093814'
                ORDER BY
                       NEWID()
            ) a
            ON  a.sendid = b.sendid   
複製代碼
複製代碼

 

複製代碼
複製代碼
--隨機提取10個號碼 獲取城市 
CREATE procedure [dbo].[Applet_RandomTop10City](  
    @phones        nvarchar(max)   
)
as
begin
    declare @strphone nvarchar(max)
    set @strphone = @phones
    begin
        set arithabort on
    SELECT  B.phone ,
        ( SELECT    provincename + '-' + areaname  
          FROM      mobilearea
          WHERE     listid = LEFT(B.phone, 7)
        ) AS city
FROM    ( SELECT    [phone] = CONVERT(XML, '<root><v>' + REPLACE([phone], ',',
                                                              '</v><v>')
                    + '</v></root>')
          FROM      ( SELECT    '' + @strphone + '' AS [phone]
                    ) t
        ) A
        OUTER APPLY ( SELECT    phone = N.v.value('.', 'varchar(100)')
                      FROM      A.[phone].nodes('/root/v') N ( v )
                    ) B
    end
end
複製代碼
複製代碼

 

 

複製代碼
複製代碼
   declare @x xml
    select @x=cast('<A>'+replace(@Ids,',','</A><A>')+'</A>' as xml)     
    
    begin
    --插入
        INSERT dbo.tb
                select 111,t.value('.','int'),getdate()
                    from @x.nodes('/A') as x (t) 
複製代碼
複製代碼

 

 

 

 

複製代碼
複製代碼
Sql Server隨機抽取數據效率優化 
Declare @d Datetime
Set @d=getdate()
SELECT Top 1* FROM [TGBus_Card].[dbo].[Ka_Card] 
WHERE 0.01 >= CAST(CHECKSUM(NEWID(), CardNo) & 0x7fffffff AS float) / CAST (0x7fffffff AS int)
And ActivityID = 501 And State = 0
Select [語句執行花費時間(毫秒)] = Datediff(ms,@d,Getdate())

--200w數據 就幾毫秒 重複可能多 io消耗大  下面更加高效快速
複製代碼
複製代碼

 

複製代碼
複製代碼
--top 5 
  SET STATISTICS IO ON 
  SET STATISTICS TIME ON  
  SELECT   *    FROM news WHERE DocId=CEILING (rand()* ( SELECT  max(DocId)  FROM news  )-1) UNION all
  SELECT   *    FROM news WHERE DocId=CEILING (rand()* ( SELECT  max(DocId)  FROM news  )-1) UNION all
  SELECT   *    FROM news WHERE DocId=CEILING (rand()* ( SELECT  max(DocId)  FROM news  )-1) UNION all
  SELECT   *    FROM news WHERE DocId=CEILING (rand()* ( SELECT  max(DocId)  FROM news  )-1) UNION all
  SELECT   *    FROM news WHERE DocId=CEILING (rand()* ( SELECT  max(DocId)  FROM news  )-1) 
複製代碼
複製代碼

   

 

--效率提升幾百倍 (號碼前n位相同視爲連續 數目小於3的) 
select a.* from 提取不連續號碼 a
join (select left(phone,7) as p from 提取不連續號碼 group by left(phone,7) having count(1)<3) b
on left(a.phone,7)=b.p 
複製代碼
複製代碼
 sql to c# linq 
var q = list.GroupBy(x => x.Substring(0, m))
    .Select(x => new { count = x.Count(), name = x.Key })
    .Where(x => x.count <= n)
    .ToList();
var query = from c in list
            join p in q on c.Substring(0, m) equals p.name 
        select c;  
複製代碼
複製代碼

  

複製代碼
複製代碼
--先後比較 
  
with t as
(select row_number() over(order by getdate()) rn,
left( phone,5) p,phone from tb
)
select a.rn,a.phone
from t a
left join t b on a.rn=b.rn+1
left join t c on a.rn=c.rn-1
where cast(a.p as int)-cast(b.p as int)<>0
and cast(a.p as int)-cast(c.p as int)<>0  
複製代碼
複製代碼
複製代碼
複製代碼
 sql to c# linq 
var q = list
    .Select((u, index) => new { phone = u,p=u.Substring(0,m), num = index+1})
    .ToList();
var query = from b in q
            join a in q on b.num equals a.num + 1
            join c in q on b.num equals c.num - 1
            where b.p.CompareTo( a.p)!=0  && b.p.CompareTo(c.p)!=0
            select new
            { b.phone
 };  
複製代碼
複製代碼

                

 

 

刪除重複記錄
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,) 

select distinct * into #Tmp from TB
drop table TB
select * into TB from #Tmp
drop table #Tmp


複製代碼
複製代碼
 ----每次按須要取14 電話號碼跟消息相同的 每次取只取2條 先進先出原則 
SELECT  b.*
INTO    #tb
FROM    ( SELECT TOP 15
                    *
          FROM      ( SELECT    Id, UserId, SendId, Phone, Message, SendTime,
                                CreateTime, BatchId,
                                ROW_NUMBER() OVER ( PARTITION  BY [Message] ORDER BY [Message], Phone, CreateTime )
                                AS keyid
                      FROM      dbo.Send_Api
                    ) a
          WHERE     a.keyid < 3
        ) b
複製代碼
複製代碼


在幾千條記錄裏,存在着些相同的記錄,如何能用SQL語句,刪除掉重複的呢?
一、查找表中多餘的重複記錄,重複記錄是根據單個字段(peopleId)來判斷   
select   *   from   people   
where   peopleId   in   (select     peopleId     from     people     group     by     peopleId     having     count(peopleId)   >   1)   
    
二、刪除表中多餘的重複記錄,重複記錄是根據單個字段(peopleId)來判斷,只留有rowid最小的記錄   
delete   from   people     
where   peopleId     in   (select     peopleId     from   people     group     by     peopleId       having     count(peopleId)   >   1)   
and   rowid   not   in   (select   min(rowid)   from     people     group   by   peopleId     having   count(peopleId   )>1)   
    
三、查找表中多餘的重複記錄(多個字段)     
select   *   from   vitae   a   
where   (a.peopleId,a.seq)   in     (select   peopleId,seq   from   vitae   group   by   peopleId,seq     having   count(*)   >   1)   
    
四、刪除表中多餘的重複記錄(多個字段),只留有rowid最小的記錄   
delete   from   vitae   a   
where   (a.peopleId,a.seq)   in     (select   peopleId,seq   from   vitae   group   by   peopleId,seq   having   count(*)   >   1)   
and   rowid   not   in   (select   min(rowid)   from   vitae   group   by   peopleId,seq   having   count(*)>1)   
    
五、查找表中多餘的重複記錄(多個字段),不包含rowid最小的記錄   
select   *   from   vitae   a   
where   (a.peopleId,a.seq)   in     (select   peopleId,seq   from   vitae   group   by   peopleId,seq   having   count(*)   >   1)   
and   rowid   not   in   (select   min(rowid)   from   vitae   group   by   peopleId,seq   having   count(*)>1) 

 


經典嘗試 刪除重複值

declare @table table (id int,name nvarchar(10))
insert into @table select 1,'aa'
union all select 1,'aa'
union all select 2,'bb'
union all select 3,'bb'
union all select 4,'cc'
union all select 1,'aa'
union all select 4,'cc'

delete a
from (
select id,name,rn = row_number() over (partition by id,name order by id) from @table 
) a where rn > 1

select * from @table 

id name
----------- ----------
1 aa
2 bb
3 bb
4 cc

(4 row(s) affected)

 

複製代碼
複製代碼
--去重複 重複超過3個以上的保留前3個 不保留重複的順序
SELECT *  
FROM  
(  
   SELECT rid=ROW_NUMBER() OVER(PARTITION BY phone ORDER BY id desc),*  
   FROM 去重複保留前三  
) AS T  
WHERE rid<=3
ORDER BY id 
複製代碼
複製代碼
複製代碼
複製代碼
--保留重複的順序 
SELECT * FROM (  
SELECT TOP 100 PERCENT r=ROW_NUMBER() OVER( PARTITION BY T.phone ORDER BY t.rid ),T.*  
FROM  
(  SELECT rid=ROW_NUMBER() OVER(ORDER BY GETDATE() ),phone 
   FROM 去重複保留前三
   
) AS T ORDER BY T.rid 
) tb
WHERE tb.r<=3
ORDER BY tb.rid
複製代碼
複製代碼

 

複製代碼
複製代碼
// 去重複 順序不變 保留n個
if (n == 1)
{
    IEnumerable<string> p = phones.Distinct();
    mobile = string.Join(",", p);
}
if (n > 1)
{
    var q = phones.Select((u, index) => new { phone = u, id = index + 1 }).ToList();
    var s = q.OrderBy(x => x.id).GroupBy(x => x.phone)
        .Select(g => new { g, count = g.Count() })
        .SelectMany(t => t.g.Select((j, i) => new { j.phone, j.id, rn = i + 1 }));
    var o = s.OrderBy(t => t.id).Select(t => t);
  List<string> list=new List<string>();
    foreach (var item in o)
    {
        if (item.rn <= n)
        {
            list.Add(item.phone);
        }
    }
    mobile = string.Join(",", list);
}
複製代碼
複製代碼



--float字段保留一位小數,四捨五入

SELECT CONVERT(DECIMAL(18,1),1024.791454) ------- 1024.8 (所影響的行數爲1 行)
 <%# Eval("字段")==null?"":Eval("字段").toString("0.0") %>

 

複製代碼
複製代碼
--事務(進程 ID 77)與另外一個進程被死鎖在 鎖 | 通訊緩衝區 資源上,而且已被選做死鎖犧牲品。請從新運行該事務。

--優先選擇3,2,1

--1.表後面加
with (nolock)
--2.會話前面加 update的時候,能select
SET TRANSACTION ISOLATION LEVEL Read uncommitted 
--3.整個數據庫隔離級別改成行版本
ALTER DATABASE SMMM SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE SMMM SET read_committed_snapshot ON --行版本隔離
ALTER DATABASE SMMM set MULTI_USER
複製代碼
複製代碼

 

複製代碼
複製代碼
select object_name(id) as 表名,
       rows as 使用行數,
       rtrim(8*reserved/1024)+'Mb' as 分配空間,
       rtrim(8*dpages/1024) as 使用空間,
       rtrim(8*(reserved-dpages)/1024) as 未使用空間,
       rtrim(8*dpages/1024-rows/1024*minlen/1024) as 空閒空間 
from sysindexes 
order by rows desc 
複製代碼
複製代碼

 

 

 

 

 

相關文章
相關標籤/搜索