天天看点

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("

") 

%>