天天看點

SQL Server常用小代碼收藏

--

SQL Server:

Select

TOP

 N 

*

From

TABLE

Order

By

NewID

() 

開頭到N條記錄

Top

 表

N到M條記錄(要有主索引ID)

 M

-

 表Where ID 

in

 (

 M ID 

 表) 

by

 ID  

Desc

選擇10從到15的記錄

select

top

5

from

15

table

order

 id 

asc

) A  order 

desc

N到結尾記錄

 表Order 

 ID 

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

test

where

id

(

)

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

<

末端ID

頂端ID

+

1

>

表名

ID

not

) ID

例如:4-10條就應該寫成

10

4

test)

 上一篇: select top 1 * from [news_table] where [新聞辨別列]<目前id号 where ......

 下一篇: select top 1 * from [news_table] where [新聞辨別列]>目前id号 where ...... order by [新聞辨別列] desc

最新釋出的20條資訊清單,要求包含:資訊ID、資訊标題、資訊釋出時間、資訊釋出人姓名、資訊評論總數和最後評論時間,并且按最後評論時間排序

100

) a.infoID,a.infoTitle,a.infoPubDate,c.userName,

Max

( b.infoReplyDate )

As

最後時間,

Count

( b.infoReplyID )

評論總數

info a

Left

Join

[

InfoReply

]

b

On

a.infoID

=

b.infoID

User

c

a.infoPubUser

c.userNo

And

b.infoReplyUser

Group

a.infoPubDate,a.infoID,a.infoTitle,c.userName

( a.infoPubDate )

一個表中的

Id

有多個記錄,把所有這個

的記錄查出來,并顯示共有多少條記錄數。

------------------------------------------

select id, Count

*) from tb group by id having count(*)>1

兩條記錄完全相同,如何删除其中一條

set

rowcount

delete

 thetablename 

 id

@duplicate_id

@duplicate_id為重複值的id 

模糊查詢

 product 

 detail 

like

'

%123.jpg%

替換字段裡面部分内容

update

 detail

replace

cast

(detail 

as

varchar

8000

)),

abc.jpg

,

efg.jpg

日期轉換參數,值得收藏

CONVERT

getdate

(), 

120

 )

2004

09

12

11

:

06

08

 ),

''

),

20040912110608

) , 

111

/

112

20040912

102

2004.09

.

一個月第一天

SELECT

DATEADD

(mm,   

DATEDIFF

(mm,

()),   

)  

  2009-06-01 00:00:00.000

當天

 product  

DateDiff

day

,modiDate,

GetDate

())

如何查詢本日、本月、本年的記錄SQL

本年:

 loanInfo 

year

(date)

()) 

本月:

getDate

month

本日:

and

Day

())   

本周的星期一   

(wk,  

(wk,

()),  

一年的第一天  

(yy,  

(yy,

季度的第一天   

(qq,  

(qq,

當天的半夜   

(dd,  

(dd,

上個月的最後一天 

       這是一個計算上個月最後一天的例子。它通過從一個月的最後一天這個例子上減去毫秒來獲得。有一點要記住,在Sql  Server中時間是精确到毫秒。這就是為什麼我需要減去毫秒來獲得我要的日期和時間。 

dateadd

(ms,

3

(mm,  

))  

       計算出來的日期的時間部分包含了一個Sql  Server可以記錄的一天的最後時刻(“:

59

997

”)的時間。 

去年的最後一天 

       連接配接上面的例子,為了要得到去年的最後一天,你需要在今年的第一天上減去毫秒。 

本月的最後一天 

       現在,為了獲得本月的最後一天,我需要稍微修改一下獲得上個月的最後一天的語句。修改需要給用DATEDIFF比較目前日期和“

”傳回的時間間隔上加。通過加個月,我計算出下個月的第一天,然後減去毫秒,這樣就計算出了這個月的最後一天。這是計算本月最後一天的SQL腳本。 

(m,

,  

本年的最後一天 

       你現在應該掌握這個的做法,這是計算本年最後一天腳本 

))。 

本月的第一個星期一 

       好了,現在是最後一個例子。這裡我要計算這個月的第一個星期一。這是計算的腳本。 

,                                                          

datepart

()),

())        

                                                                                                 ),  

)                          

       在這個例子裡,我使用了“本周的星期一”的腳本,并作了一點點修改。修改的部分是把原來腳本中“

()”部分替換成計算本月的第天,在計算中用本月的第天來替換目前日期使得計算可以獲得這個月的第一個星期一。 

删除一個月前,三個月前, 6個月前,一年前的資料 

DELETE

FROM

 表名WHERE 

datediff

(MM, AddTime,

GETDATE

(YY, AddTime,

-------------------------------------------------------------  

附錄,其他日期處理方法 

)去掉時分秒 

declare

  @  

datetime

()  

'2003-7-1  10:00:00'  

  @,

,@),  

2

)顯示星期幾 

datename

(weekday,

())    

)如何取得某個月的天數 

@m

int

月份 

2003-

-15

  ,

另外,取得本月天數 

())  

任意月份的最大天數

Dateadd

)))) 

或者使用計算本月的最後一天的腳本,然後用DAY函數區最後一天 

)))  

)判斷是否閏年: 

case

))))  

when

28

then

平年

else

閏年

end

或者 

-02-01

)一個季度多少天 

tinyint

@time

smalldatetime

between

7

convert

-01

))   

、确定某年某月有多少天

實作原理:先利用DATEDIFF取得目前月的第一天,再将月份加一取得下月第一天,然後減去分鐘,再取日期的天數部分,即為當月最大日期,也即當月天數

CREATE

FUNCTION

 DaysInMonth ( 

@date

 ) 

Returns

AS

BEGIN

RETURN

(mi,

(m, 

)))

END

調用示例:

 dbo.DaysInMonth (

2006-02-03

)計算哪一天是本周的星期一

(week, 

(week,

1900-01-01

()), 

傳回-11-06 00:00:00.000

)      

)目前季度的第一天

(quarter, 

(quarter,

)—傳回

00

)一個季度多少天

)) —傳回

.按姓氏筆畫排序: 

 TableName 

 CustomerName Collate Chinese_PRC_Stroke_ci_as 

.分頁SQL語句

 (row_number() 

OVER

ORDER

BY

 tab.ID 

)) 

 rownum,tab.

 表名As tab) 

 t 

 rownum 

 起始位置And 結束位置

.如何修改資料庫的名稱:

sp_renamedb 

old_name

new_name

.擷取目前資料庫中的所有使用者表

 sysobjects 

 xtype

U

 category

.擷取某一個表的所有字段

 name 

 syscolumns 

object_id

.檢視與某一個表相關的視圖、存儲過程、函數

 a.

 sysobjects a, syscomments b 

 a.id 

 b.id 

 b.

text

%表名%

.檢視目前資料庫中所有存儲過程

 存儲過程名稱from sysobjects 

P

.查詢使用者建立的所有資料庫

 master..sysdatabases D 

 sid 

 master..syslogins 

 name

sa

或者

 dbid, name 

DB_NAME

 master..sysdatabases 

<>

0x01

.查詢某一個表的字段和資料類型

 column_name,data_type 

 information_schema.columns 

 table_name 

.使用事務

在使用一些對資料庫表的臨時的SQL語句操作時,可以采用SQL SERVER事務處理,防止對資料操作後發現誤操作問題

開始事務

Begin

tran

Insert

Into

Values

(…) 

SQL語句操作不正常,則復原事務。

復原事務

Rollback

SQL語句操作正常,則送出事務,資料送出至資料庫。

送出事務

Commit

計算執行SQL語句查詢時間

@d

 SYS_ColumnProperties 

語句執行花費時間(毫秒)

【關閉SQL Server 資料庫所有使用連接配接】

use

  master 

go

create

proc

  KillSpByDbName(

@dbname

20

begin

@sql

nvarchar

500

@temp

1000

@spid

declare  getspid  cursor  for    

select  spid  from  sysprocesses  where  dbid=db_id(

'''

exec

  (

open

  getspid  

fetch

next

into

while

@@fetch_status

<>-

kill  

rtrim

close

deallocate

舉例使用,關閉資料庫下的所有連接配接操作

Use

  master  

Exec

  KillSpByDbName  

資料庫名稱

(一)挂起操作

在安裝Sql或sp更新檔的時候系統提示之前有挂起的安裝操作,要求重新開機,這裡往往重新開機無用,解決辦法:

到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession Manager

删除PendingFileRenameOperations

(二)收縮資料庫

重建索引

DBCC

 REINDEX

 INDEXDEFRAG

收縮資料和日志

 SHRINKDB

 SHRINKFILE

(三)壓縮資料庫

dbcc

 shrinkdatabase(dbname)

(四)轉移資料庫給新使用者以已存在使用者權限

 sp_change_users_login update_one,newname,oldname

(五)檢查備份集

RESTORE

 VERIFYONLY 

disk

Evbbs.bak

(六)修複資料庫

ALTER

DATABASE

dvbbs

SET

 SINGLE_USER

GO

 CHECKDB(dvbbs,repair_allow_data_loss) 

WITH

 TABLOCK

 MULTI_USER

 m 

 tablename 

 n id 

 tablename) 

 臨時表(或表變量) 

 columnname 

 将top m筆插入

 n 

 表變量order 

 columnname) a 

複制表(隻複制結構,源表名:a 新表名:b) (Access可用) 

法一:

 b 

 a 

法二:

拷貝表(拷貝資料,源表名:a 目标表名:b) (Access可用) 

insert

 b(a, b, c) 

 d,e,f 

 b; 

跨資料庫之間表的拷貝(具體資料使用絕對路徑) (Access可用) 

 ‘具體資料庫’

 條件

例子:..

"&Server.MapPath(".")&"/data.mdb" &"

.. 

子查詢(表名:a 表名:b) 

 a,b,c 

IN

 d 

 b ) 或者: 

顯示文章、送出人和最後回複時間

 a.title,a.username,b.adddate 

 a,(

max

(adddate) adddate 

.title

a.title) b 

外連接配接查詢(表名:a 表名:b) 

 a.a, a.b, a.c, b.c, b.d, b.f 

LEFT

 OUT 

JOIN

ON

 a.a 

 b.c 

線上視圖查詢(表名:a ) 

 a) T 

 t.a 

between的用法,between限制查詢資料範圍時包括了邊界值,

 between不包括

 table1 

 time 

 time1 

 time2 

 a,b,c, 

 數值and 數值

 的使用方法

 (‘值’,’值’,’值’,’值’) 

兩張關聯表,删除主表中已經在副表中沒有的資訊

exists

 ( 

 table2 

 table1.field1

table2.field1 ) 

四表聯查問題:

left

inner

join

on

 a.a

b.b 

right

 c 

c.c 

d.d 

 .. 

日程安排提前五分鐘提醒

SQL: 

 日程安排where 

minute

,f開始時間,

一條sql 語句搞定資料庫分頁

 主鍵字段,排序字段from 表名order 

 排序字段desc) a,表名b 

 b.主鍵字段

 a.主鍵字段order 

 a.排序字段

選擇在每一組b值相同的資料中對應的a最大的記錄的所有資訊(類似這樣的用法可以用于論壇每月排行榜,每月熱銷産品分析,按科目成績排名,等等.) 

 tablename ta 

 a

(a) 

 tablename tb 

 tb.b

ta.b) 

包括所有在TableA 中但不在TableB和TableC 中的行并消除所有重複行而派生出一個結果表

 tableA ) 

except

 tableB) 

 tableC) 

随機取出條資料

newid

随機選擇記錄

删除重複記錄

Delete

(id) 

group

 col1,col2,) 

distinct

 #Tmp 

 TB

drop

 TB 

 #Tmp

在幾千條記錄裡,存在着些相同的記錄,如何能用SQL語句,删除掉重複的呢?

、查找表中多餘的重複記錄,重複記錄是根據單個字段(peopleId)來判斷   

   people   

   peopleId   

   (

     peopleId     

     people     

having

count

(peopleId)   

)   

、删除表中多餘的重複記錄,重複記錄是根據單個字段(peopleId)來判斷,隻留有rowid最小的記錄   

   people     

   peopleId     

     peopleId       

   rowid   

min

(rowid)   

(peopleId   )

、查找表中多餘的重複記錄(多個字段)     

   vitae   a   

   (a.peopleId,a.seq)   

     (

   peopleId,seq   

   vitae   

   peopleId,seq     

、删除表中多餘的重複記錄(多個字段),隻留有rowid最小的記錄   

、查找表中多餘的重複記錄(多個字段),不包含rowid最小的記錄   

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

DECIMAL

18

1024.791454

----- 1024.8 (所影響的行數為1 行)

<%

# Eval("字段")

==

null

?"":Eval("字段").toString("

") 

%>