最近用SQL處理數據比較多,這里整理了一些常用的SQL語句。
一、常用查詢語句
1常用SQL法一:select * into b from a where 1<>1
法二:
select
top
0
*
into b
from a
2、說明:拷貝表(拷貝數據,源表名:a 目標表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from a;
3、說明:跨數據庫之間表的拷貝(具體數據使用絕對路徑) (Access可用)
insert into b(a, b, c) select d,e,f from a in ‘具體數據庫’ where 條件
例子:.. from b in ' "&Server.MapPath(".")&"\data.mdb" &" ' where..
4、說明:子查詢(表名1:a 表名2: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)
5、說明:顯示文章、提交人和最后回復時間
select a.title,a.username,b.adddate from table a,( select max(adddate) adddate from table where table.title =a.title) b
6、說明:外連接查詢(表名1:a 表名2: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
7、說明:在線視圖查詢(表名1:a )
select * from ( SELECT a,b,c FROM a) T where t.a > 1;
8、說明:between的用法,between限制查詢數據范圍時包括了邊界值, not between不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 數值1 and 數值2
9、說明: in 的使用方法
select * from table1 where a [ not ] in (‘值1’,’值2’,’值4’,’值6’)
10、說明:兩張關聯表,刪除主表中已經在副表中沒有的信息 delete from table1 where not exists ( select * from table2 where table1.field1 =table2.field1 )
11、說明:四表聯查問題:
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 .....
12、說明:日程安排提前五分鍾提醒
SQL: select * from 日程安排 where datediff( ' minute ',f開始時間, getdate()) > 5
13、說明:一條sql 語句搞定數據庫分頁select top 10 b. * from ( select top 20 主鍵字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主鍵字段 = a.主鍵字段 order by a.排序字段
14、說明:前10條記錄
select top 10 * form table1 where 范圍
15、說明:選擇在每一組b值相同的數據中對應的a最大的記錄的所有信息(類似這樣的用法可以用於論壇每月排行榜,每月熱銷產品分析,按科目成績排名,等等.) select a,b,c from tablename ta where a =( select max(a) from tablename tb where tb.b =ta.b)
16、說明:包括所有在 TableA 中但不在 TableB和TableC 中的行並消除所有重復行而派生出一個結果表( select a from tableA ) except ( select a from tableB) except ( select a from tableC)
17、說明:隨機取出10條數據
select top 10 * from tablename order by newid()
18、說明:隨機選擇記錄
select newid()
19、說明:刪除重復記錄
Delete from tablename where id not in ( select max(id) from tablename group by col1,col2,...)
20、說明:列出數據庫里所有的表名
select name from sysobjects where type = ' U '
21、說明:列出表里的所有的select name from syscolumns where id = object_id( ' TableName ')
22、說明:列示type、vender、pcs字段,以type字段排列,case可以方便地實現多重選擇,類似select 中的case。
select type, sum( case vender when ' A ' then pcs else 0 end), sum( case vender when ' C ' then pcs else 0 end), sum( case vender when ' B ' then pcs else 0 end) FROM tablename group by type
顯示結果:
type vender pcs
電腦 A 1
電腦 A 1
光盤 B 2
光盤 A 2
手機 B 3
手機 C 3
23、說明:初始化表table1
TRUNCATE TABLE table1
24、說明:選擇從10到15的記錄select top 5 * from ( select top 15 * from table order by id asc) table_別名 order by id desc
25、隨機讀取若干條記錄
Access語法: SELECT top 10 * From 表名 ORDER BY Rnd(id)
Sql server語法: select top n * from 表名 order by newid()
MySql語法: Select * From 表名 Order By rand() Limit n
26、使用SQL語句 用...代替過長的字符串顯示
語法:
SQL數據庫: select case when len(field) > 10 then left(field, 10) + ' ... ' else field end as news_name,news_id from tablename
2、說明:拷貝表(拷貝數據,源表名:a 目標表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from a;
3、說明:跨數據庫之間表的拷貝(具體數據使用絕對路徑) (Access可用)
insert into b(a, b, c) select d,e,f from a in ‘具體數據庫’ where 條件
例子:.. from b in ' "&Server.MapPath(".")&"\data.mdb" &" ' where..
4、說明:子查詢(表名1:a 表名2: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)
5、說明:顯示文章、提交人和最后回復時間
select a.title,a.username,b.adddate from table a,( select max(adddate) adddate from table where table.title =a.title) b
6、說明:外連接查詢(表名1:a 表名2: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
7、說明:在線視圖查詢(表名1:a )
select * from ( SELECT a,b,c FROM a) T where t.a > 1;
8、說明:between的用法,between限制查詢數據范圍時包括了邊界值, not between不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 數值1 and 數值2
9、說明: in 的使用方法
select * from table1 where a [ not ] in (‘值1’,’值2’,’值4’,’值6’)
10、說明:兩張關聯表,刪除主表中已經在副表中沒有的信息 delete from table1 where not exists ( select * from table2 where table1.field1 =table2.field1 )
11、說明:四表聯查問題:
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 .....
12、說明:日程安排提前五分鍾提醒
SQL: select * from 日程安排 where datediff( ' minute ',f開始時間, getdate()) > 5
13、說明:一條sql 語句搞定數據庫分頁select top 10 b. * from ( select top 20 主鍵字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主鍵字段 = a.主鍵字段 order by a.排序字段
14、說明:前10條記錄
select top 10 * form table1 where 范圍
15、說明:選擇在每一組b值相同的數據中對應的a最大的記錄的所有信息(類似這樣的用法可以用於論壇每月排行榜,每月熱銷產品分析,按科目成績排名,等等.) select a,b,c from tablename ta where a =( select max(a) from tablename tb where tb.b =ta.b)
16、說明:包括所有在 TableA 中但不在 TableB和TableC 中的行並消除所有重復行而派生出一個結果表( select a from tableA ) except ( select a from tableB) except ( select a from tableC)
17、說明:隨機取出10條數據
select top 10 * from tablename order by newid()
18、說明:隨機選擇記錄
select newid()
19、說明:刪除重復記錄
Delete from tablename where id not in ( select max(id) from tablename group by col1,col2,...)
20、說明:列出數據庫里所有的表名
select name from sysobjects where type = ' U '
21、說明:列出表里的所有的select name from syscolumns where id = object_id( ' TableName ')
22、說明:列示type、vender、pcs字段,以type字段排列,case可以方便地實現多重選擇,類似select 中的case。
select type, sum( case vender when ' A ' then pcs else 0 end), sum( case vender when ' C ' then pcs else 0 end), sum( case vender when ' B ' then pcs else 0 end) FROM tablename group by type
顯示結果:
type vender pcs
電腦 A 1
電腦 A 1
光盤 B 2
光盤 A 2
手機 B 3
手機 C 3
23、說明:初始化表table1
TRUNCATE TABLE table1
24、說明:選擇從10到15的記錄select top 5 * from ( select top 15 * from table order by id asc) table_別名 order by id desc
25、隨機讀取若干條記錄
Access語法: SELECT top 10 * From 表名 ORDER BY Rnd(id)
Sql server語法: select top n * from 表名 order by newid()
MySql語法: Select * From 表名 Order By rand() Limit n
26、使用SQL語句 用...代替過長的字符串顯示
語法:
SQL數據庫: select case when len(field) > 10 then left(field, 10) + ' ... ' else field end as news_name,news_id from tablename
Access數據庫:SELECT iif(len(field)>2,left(field,2)+'...',field) FROM tablename;
二、常用日期處理
一天 select * from T_news where datediff(day,addtime,getdate())=0
三天
select
*
from T_news
where
datediff(
day,addtime,
getdate())
<=
2
and
datediff(
day,addtime,
getdate())
>=
0
一周 select * from T_news WHERE ( DATEPART(wk, addtime) = DATEPART(wk, GETDATE())) AND ( DATEPART(yy, addtime) = DATEPART(yy, GETDATE()))
注意:此時不能用 datediff 差值為7,因為,datediff只表示間隔數
一月 select * from T_news WHERE ( DATEPART(yy, addtime) = DATEPART(yy, GETDATE())) AND ( DATEPART(mm, addtime) = DATEPART(mm, GETDATE()))
一季度 select * from T_news where DATEPART(qq, addtime) = DATEPART(qq, GETDATE()) and DATEPART(yy, addtime) = DATEPART(yy, GETDATE())
本周: select * from table where datediff(week,C_CALLTIME, getdate()) = 0 -- C_CALLTIME 為日期字段
本月: select * from table where datediff( Month,C_CALLTIME, getdate()) = 0 -- C_CALLTIME 為日期字段
本季: select * from table where datediff(qq,C_CALLTIME, getdate()) = 0
前半年1 - 6,后半年7 - 12: select * from table where datepart(mm,C_CALLTIME) / 7 = datepart(mm, getdate()) / 7
-- --------------------------------------------------------------------------------------------
sql得到當前系統時間得 日期部分
CONVERT( varchar( 10), getDate(), 120)
求得到"昨天,今天"日期函數的SQL
所屬分類:MS -SQL Server 基礎類
-- --------------------------------------------------------------------------------------------
?
Convert( Datetime, GetDate(), 2)
GetDate()得到今天日期2007 - 03 - 26 16: 14: 12.187
1.現在我需要得到只是日期部分,時間部分不要,SQL怎么寫?
2.求以下日期SQL:
昨天
明天
最近七天
隨后七天
上周
本周
下周
上月
本月
下月
請高手幫忙。謝謝
-- --------------------------------------------------------------------
1.現在我需要得到只是日期部分,時間部分不要,SQL怎么寫?
select convert( varchar( 10), getdate(), 120)
-- ------------------------------------------------------
-- 1.
Select Convert( Varchar( 10), GetDate(), 120)
Select Convert( Varchar( 10), GetDate(), 121)
-- ------------------------------------------------------
2.求以下日期SQL:
昨天
select convert( varchar( 10), getdate() - 1, 120)
明天
select convert( varchar( 10), getdate() + 1, 120)
最近七天
select * from tb where 時間字段 >= convert( varchar( 10), getdate() - 7, 120)
隨后七天
select * from tb where 時間字段 <= convert( varchar( 10), getdate() + 7, 120) and 時間字段 >= 時間字段
-- ------------------------------------------------------
convert和dateadd函數結合使用就可以了。
-- ------------------------------------------------------
用datediff( day,時間列, getdate())
-- ------------------------------------------------------
上月
select * from tb where month(時間字段) = month( getdate()) - 1
本月
select * from tb where month(時間字段) = month( getdate())
下月
select * from tb where month(時間字段) = month( getdate()) + 1
-- ------------------------------------------------------
-- 2
-- 如果是在表中查詢
-- 昨天
Select * From TableName Where DateDiff(dd, DateTimCol, GetDate()) = 1
-- 明天
Select * From TableName Where DateDiff(dd, GetDate(), DateTimCol) = 1
-- 最近七天
Select * From TableName Where DateDiff(dd, DateTimCol, GetDate()) <= 7
-- 隨后七天
Select * From TableName Where DateDiff(dd, GetDate(), DateTimCol) <= 7
-- 上周
Select * From TableName Where DateDiff(wk, DateTimCol, GetDate()) = 1
-- 本周
Select * From TableName Where DateDiff(wk, DateTimCol, GetDate()) = 0
-- 下周
Select * From TableName Where DateDiff(wk, GetDate(), DateTimCol ) = 1
-- 上月
Select * From TableName Where DateDiff(mm, DateTimCol, GetDate()) = 1
-- 本月
Select * From TableName Where DateDiff(mm, DateTimCol, GetDate()) = 0
-- 下月
Select * From TableName Where DateDiff(mm, GetDate(), DateTimCol ) = 1
-- ------------------------------------------------------
本周
select * from tb where datediff(week , 時間字段 , getdate()) = 0
上周
select * from tb where datediff(week , 時間字段 , getdate()) = 1
下周
select * from tb where datediff(week , 時間字段 , getdate()) = - 1
-- ------------------------------------------------------
1.現在我需要得到只是日期部分,時間部分不要,SQL怎么寫?
select convert( varchar( 10), getdate(), 120)
2.求以下日期SQL:
昨天
select convert( varchar( 10), getdate() - 1, 120)
明天
select convert( varchar( 10), getdate() + 1, 120)
最近七天
select * from tb where 時間字段 >= convert( varchar( 10), getdate() - 7, 120)
隨后七天
select * from tb where 時間字段 <= convert( varchar( 10), getdate() + 7, 120) and 時間字段 >= 時間字段
上月
一周 select * from T_news WHERE ( DATEPART(wk, addtime) = DATEPART(wk, GETDATE())) AND ( DATEPART(yy, addtime) = DATEPART(yy, GETDATE()))
注意:此時不能用 datediff 差值為7,因為,datediff只表示間隔數
一月 select * from T_news WHERE ( DATEPART(yy, addtime) = DATEPART(yy, GETDATE())) AND ( DATEPART(mm, addtime) = DATEPART(mm, GETDATE()))
一季度 select * from T_news where DATEPART(qq, addtime) = DATEPART(qq, GETDATE()) and DATEPART(yy, addtime) = DATEPART(yy, GETDATE())
本周: select * from table where datediff(week,C_CALLTIME, getdate()) = 0 -- C_CALLTIME 為日期字段
本月: select * from table where datediff( Month,C_CALLTIME, getdate()) = 0 -- C_CALLTIME 為日期字段
本季: select * from table where datediff(qq,C_CALLTIME, getdate()) = 0
前半年1 - 6,后半年7 - 12: select * from table where datepart(mm,C_CALLTIME) / 7 = datepart(mm, getdate()) / 7
-- --------------------------------------------------------------------------------------------
sql得到當前系統時間得 日期部分
CONVERT( varchar( 10), getDate(), 120)
求得到"昨天,今天"日期函數的SQL
所屬分類:MS -SQL Server 基礎類
-- --------------------------------------------------------------------------------------------
?
Convert( Datetime, GetDate(), 2)
GetDate()得到今天日期2007 - 03 - 26 16: 14: 12.187
1.現在我需要得到只是日期部分,時間部分不要,SQL怎么寫?
2.求以下日期SQL:
昨天
明天
最近七天
隨后七天
上周
本周
下周
上月
本月
下月
請高手幫忙。謝謝
-- --------------------------------------------------------------------
1.現在我需要得到只是日期部分,時間部分不要,SQL怎么寫?
select convert( varchar( 10), getdate(), 120)
-- ------------------------------------------------------
-- 1.
Select Convert( Varchar( 10), GetDate(), 120)
Select Convert( Varchar( 10), GetDate(), 121)
-- ------------------------------------------------------
2.求以下日期SQL:
昨天
select convert( varchar( 10), getdate() - 1, 120)
明天
select convert( varchar( 10), getdate() + 1, 120)
最近七天
select * from tb where 時間字段 >= convert( varchar( 10), getdate() - 7, 120)
隨后七天
select * from tb where 時間字段 <= convert( varchar( 10), getdate() + 7, 120) and 時間字段 >= 時間字段
-- ------------------------------------------------------
convert和dateadd函數結合使用就可以了。
-- ------------------------------------------------------
用datediff( day,時間列, getdate())
-- ------------------------------------------------------
上月
select * from tb where month(時間字段) = month( getdate()) - 1
本月
select * from tb where month(時間字段) = month( getdate())
下月
select * from tb where month(時間字段) = month( getdate()) + 1
-- ------------------------------------------------------
-- 2
-- 如果是在表中查詢
-- 昨天
Select * From TableName Where DateDiff(dd, DateTimCol, GetDate()) = 1
-- 明天
Select * From TableName Where DateDiff(dd, GetDate(), DateTimCol) = 1
-- 最近七天
Select * From TableName Where DateDiff(dd, DateTimCol, GetDate()) <= 7
-- 隨后七天
Select * From TableName Where DateDiff(dd, GetDate(), DateTimCol) <= 7
-- 上周
Select * From TableName Where DateDiff(wk, DateTimCol, GetDate()) = 1
-- 本周
Select * From TableName Where DateDiff(wk, DateTimCol, GetDate()) = 0
-- 下周
Select * From TableName Where DateDiff(wk, GetDate(), DateTimCol ) = 1
-- 上月
Select * From TableName Where DateDiff(mm, DateTimCol, GetDate()) = 1
-- 本月
Select * From TableName Where DateDiff(mm, DateTimCol, GetDate()) = 0
-- 下月
Select * From TableName Where DateDiff(mm, GetDate(), DateTimCol ) = 1
-- ------------------------------------------------------
本周
select * from tb where datediff(week , 時間字段 , getdate()) = 0
上周
select * from tb where datediff(week , 時間字段 , getdate()) = 1
下周
select * from tb where datediff(week , 時間字段 , getdate()) = - 1
-- ------------------------------------------------------
1.現在我需要得到只是日期部分,時間部分不要,SQL怎么寫?
select convert( varchar( 10), getdate(), 120)
2.求以下日期SQL:
昨天
select convert( varchar( 10), getdate() - 1, 120)
明天
select convert( varchar( 10), getdate() + 1, 120)
最近七天
select * from tb where 時間字段 >= convert( varchar( 10), getdate() - 7, 120)
隨后七天
select * from tb where 時間字段 <= convert( varchar( 10), getdate() + 7, 120) and 時間字段 >= 時間字段
上月
三、常用SQL函數(來自:http://www.cnblogs.com/dreamof/archive/2009/02/02/1382487.html )
一、字符轉換函數
1、
ASCII()
返回字符表達式最左端字符的ASCII 碼值。在ASCII()函數中,純數字的字符串可不用‘’括起來,但含其它字符的字符串必須用‘’括起來使用,否則會出錯。
2、 CHAR()
將ASCII 碼轉換為字符。如果沒有輸入0 ~ 255 之間的ASCII 碼值, CHAR() 返回NULL 。
3、 LOWER()和UPPER()
LOWER()將字符串全部轉為小寫; UPPER()將字符串全部轉為大寫。
4、 STR()
把數值型數據轉換為字符型數據。
STR ( <float_expression > [ ,length[, <decimal> ]])
length 指定返回的字符串的長度, decimal 指定返回的小數位數。如果沒有指定長度,缺省的length 值為10, decimal 缺省值為0。
當length 或者decimal 為負值時,返回NULL;
當length 小於小數點左邊(包括符號位)的位數時,返回length 個 *;
先服從length ,再取decimal ;
當返回的字符串位數小於length ,左邊補足空格。
二、去空格函數
1、 LTRIM() 把字符串頭部的空格去掉。
2、 RTRIM() 把字符串尾部的空格去掉。
三、取子串函數
1、 left()
LEFT ( <character_expression >, <integer_expression >)
返回character_expression 左起 integer_expression 個字符。
2、 RIGHT()
RIGHT ( <character_expression >, <integer_expression >)
返回character_expression 右起 integer_expression 個字符。
3、 SUBSTRING()
SUBSTRING ( <expression >, <starting_ position >, length)
返回從字符串左邊第starting_ position 個字符起length個字符的部分。
四、字符串比較函數
1、 CHARINDEX()
返回字符串中某個指定的子串出現的開始位置。
CHARINDEX ( <’substring_expression’ >, <expression >)
其中substring _expression 是所要查找的字符表達式,expression 可為字符串也可為列名表達式。如果沒有發現子串,則返回0 值。
此函數不能用於TEXT 和IMAGE 數據類型。
2、 PATINDEX()
返回字符串中某個指定的子串出現的開始位置。
PATINDEX ( <’ % substring _expression %’ >, <column_ name >)其中子串表達式前后必須有百分號“ %”否則返回值為0。
與CHARINDEX 函數不同的是,PATINDEX函數的子串中可以使用通配符,且此函數可用於CHAR、 VARCHAR 和TEXT 數據類型。
五、字符串操作函數
1、 QUOTENAME()
返回被特定字符括起來的字符串。
QUOTENAME ( <’character_expression’ > [ , quote_ character ]) 其中quote_ character 標明括字符串所用的字符,缺省值為“ []”。
2、 REPLICATE()
返回一個重復character_expression 指定次數的字符串。
REPLICATE (character_expression integer_expression) 如果integer_expression 值為負值,則返回NULL 。
3、 REVERSE()
將指定的字符串的字符排列順序顛倒。
REVERSE ( <character_expression >) 其中character_expression 可以是字符串、常數或一個列的值。
4、 REPLACE()
返回被替換了指定子串的字符串。
REPLACE ( <string_expression1 >, <string_expression2 >, <string_expression3 >) 用string_expression3 替換在string_expression1 中的子串string_expression2。
5、 SPACE()
返回一個有指定長度的空白字符串。
SPACE ( <integer_expression >) 如果integer_expression 值為負值,則返回NULL 。
6、 STUFF()
用另一子串替換字符串指定位置、長度的子串。
STUFF ( <character_expression1 >, <start_ position >, <length >, <character_expression2 >)
如果起始位置為負或長度值為負,或者起始位置大於character_expression1 的長度,則返回NULL 值。
如果length 長度大於character_expression1 中 start_ position 以右的長度,則character_expression1 只保留首字符。
六、數據類型轉換函數
1、 CAST()
CAST ( <expression > AS <data_ type > [ length ])
2、 CONVERT()
CONVERT ( <data_ type > [ length ], <expression > [ , style ])
1)data_type為SQL Server系統定義的數據類型,用戶自定義的數據類型不能在此使用。
2)length用於指定數據的長度,缺省值為30。
3)把CHAR或VARCHAR類型轉換為諸如INT或SAMLLINT這樣的INTEGER類型、結果必須是帶正號或負號的數值。
4)TEXT類型到CHAR或VARCHAR類型轉換最多為8000個字符,即CHAR或VARCHAR數據類型是最大長度。
5)IMAGE類型存儲的數據轉換到BINARY或VARBINARY類型,最多為8000個字符。
6)把整數值轉換為MONEY或SMALLMONEY類型,按定義的國家的貨幣單位來處理,如人民幣、美元、英鎊等。
7)BIT類型的轉換把非零值轉換為1,並仍以BIT類型存儲。
8)試圖轉換到不同長度的數據類型,會截短轉換值並在轉換值后顯示“ +”,以標識發生了這種截斷。
9)用CONVERT()函數的style 選項能以不同的格式顯示日期和時間。style 是將DATATIME 和SMALLDATETIME 數據轉換為字符串時所選用的由SQL Server 系統提供的轉換樣式編號,不同的樣式編號有不同的輸出格式。
七、日期函數
1、 day(date_expression)
返回date_expression中的日期值
2、 month(date_expression)
返回date_expression中的月份值
3、 year(date_expression)
返回date_expression中的年份值
4、 DATEADD()
DATEADD ( < datepart >, < number >, <date >)
返回指定日期date 加上指定的額外日期間隔number 產生的新日期。
5、 DATEDIFF()
DATEDIFF ( < datepart >, <date1 >, <date2 >)
返回兩個指定日期在datepart 方面的不同之處,即date2 超過date1的差距值,其結果值是一個帶有正負號的整數值。
6、 DATENAME()
DATENAME ( < datepart >, <date >)
以字符串的形式返回日期的指定部分此部分。由datepart 來指定。
7、 DATEPART()
DATEPART ( < datepart >, <date >)
以整數值的形式返回日期的指定部分。此部分由datepart 來指定。
DATEPART (dd, date) 等同於DAY (date)
DATEPART (mm, date) 等同於MONTH (date)
DATEPART (yy, date) 等同於YEAR (date)
8、 GETDATE()
以DATETIME 的缺省格式返回系統當前的日期和時間。
9、Sql Server 中一個非常強大的日期格式化函數
Select CONVERT( varchar( 100), GETDATE(), 0): 05 16 2006 10:57AM
Select CONVERT( varchar( 100), GETDATE(), 1): 05 / 16 / 06
Select CONVERT( varchar( 100), GETDATE(), 2): 06.05. 16
Select CONVERT( varchar( 100), GETDATE(), 3): 16 / 05 / 06
Select CONVERT( varchar( 100), GETDATE(), 4): 16.05. 06
Select CONVERT( varchar( 100), GETDATE(), 5): 16 - 05 - 06
Select CONVERT( varchar( 100), GETDATE(), 6): 16 05 06
Select CONVERT( varchar( 100), GETDATE(), 7): 05 16, 06
Select CONVERT( varchar( 100), GETDATE(), 8): 10: 57: 46
Select CONVERT( varchar( 100), GETDATE(), 9): 05 16 2006 10: 57: 46:827AM
Select CONVERT( varchar( 100), GETDATE(), 10): 05 - 16 - 06
Select CONVERT( varchar( 100), GETDATE(), 11): 06 / 05 / 16
Select CONVERT( varchar( 100), GETDATE(), 12): 060516
Select CONVERT( varchar( 100), GETDATE(), 13): 16 05 2006 10: 57: 46: 937
Select CONVERT( varchar( 100), GETDATE(), 14): 10: 57: 46: 967
Select CONVERT( varchar( 100), GETDATE(), 20): 2006 - 05 - 16 10: 57: 47
Select CONVERT( varchar( 100), GETDATE(), 21): 2006 - 05 - 16 10: 57: 47.157
Select CONVERT( varchar( 100), GETDATE(), 22): 05 / 16 / 06 10: 57: 47 AM
Select CONVERT( varchar( 100), GETDATE(), 23): 2006 - 05 - 16
Select CONVERT( varchar( 100), GETDATE(), 24): 10: 57: 47
Select CONVERT( varchar( 100), GETDATE(), 25): 2006 - 05 - 16 10: 57: 47.250
Select CONVERT( varchar( 100), GETDATE(), 100): 05 16 2006 10:57AM
Select CONVERT( varchar( 100), GETDATE(), 101): 05 / 16 / 2006
Select CONVERT( varchar( 100), GETDATE(), 102): 2006.05. 16
Select CONVERT( varchar( 100), GETDATE(), 103): 16 / 05 / 2006
Select CONVERT( varchar( 100), GETDATE(), 104): 16.05. 2006
Select CONVERT( varchar( 100), GETDATE(), 105): 16 - 05 - 2006
Select CONVERT( varchar( 100), GETDATE(), 106): 16 05 2006
Select CONVERT( varchar( 100), GETDATE(), 107): 05 16, 2006
Select CONVERT( varchar( 100), GETDATE(), 108): 10: 57: 49
Select CONVERT( varchar( 100), GETDATE(), 109): 05 16 2006 10: 57: 49:437AM
Select CONVERT( varchar( 100), GETDATE(), 110): 05 - 16 - 2006
Select CONVERT( varchar( 100), GETDATE(), 111): 2006 / 05 / 16
Select CONVERT( varchar( 100), GETDATE(), 112): 20060516
Select CONVERT( varchar( 100), GETDATE(), 113): 16 05 2006 10: 57: 49: 513
Select CONVERT( varchar( 100), GETDATE(), 114): 10: 57: 49: 547
Select CONVERT( varchar( 100), GETDATE(), 120): 2006 - 05 - 16 10: 57: 49
Select CONVERT( varchar( 100), GETDATE(), 121): 2006 - 05 - 16 10: 57: 49.700
Select CONVERT( varchar( 100), GETDATE(), 126): 2006 - 05 -16T10: 57: 49.827
Select CONVERT( varchar( 100), GETDATE(), 130): 18 ???? ?????? 1427 10: 57: 49:907AM
Select CONVERT( varchar( 100), GETDATE(), 131): 18 / 04 / 1427 10: 57: 49:920AM
常用:
Select CONVERT( varchar( 100), GETDATE(), 8): 10: 57: 46
Select CONVERT( varchar( 100), GETDATE(), 24): 10: 57: 47
Select CONVERT( varchar( 100), GETDATE(), 108): 10: 57: 49
Select CONVERT( varchar( 100), GETDATE(), 12): 060516
Select CONVERT( varchar( 100), GETDATE(), 23): 2006 - 05 - 16
八、統計函數
AVG ( ) -返回的平均價值
count( ) -返回的行數
first( ) -返回第一個值
last( ) -返回最后一個值
max( ) -返回的最大價值
min( ) -返回最小的價值
total( ) -返回的總和
九、數學函數
abs(numeric_expr) 求絕對值
ceiling(numeric_expr) 取大於等於指定值的最小整數
exp(float_expr) 取指數
floor(numeric_expr) 小於等於指定值得最大整數
pi() 3.1415926.........
power(numeric_expr, power) 返回power次方
rand( [ int_expr ]) 隨機數產生器
round(numeric_expr,int_expr) 安int_expr規定的精度四舍五入
sign(int_expr) 根據正數, 0,負數,,返回 + 1, 0, - 1
sqrt(float_expr) 平方根
十、系統函數
suser_name() 用戶登錄名
user_name() 用戶在數據庫中的名字
user 用戶在數據庫中的名字
show_role() 對當前用戶起作用的規則
db_name() 數據庫名
object_name(obj_id) 數據庫對象名
col_name(obj_id,col_id) 列名
col_length(objname,colname) 列長度
valid_name(char_expr) 是否是有效標識符
十一、以上函數的部分實例
1: replace 函數
第一個參數你的字符串,第二個參數你想替換的部分,第三個參數你要替換成什么
select replace( ' lihan ', ' a ', ' b ')
-- ---------------------------
lihbn
(所影響的行數為 1 行)
=========================================================
2:substring函數
第一個參數你的字符串,第二個是開始替換位置,第三個結束替換位置
select substring( ' lihan ', 0, 3);
-- ---
li
(所影響的行數為 1 行)
=========================================================
3:charindex函數
第一個參數你要查找的char,第二個參數你被查找的字符串 返回參數一在參數二的位置
select charindex( ' a ', ' lihan ')
-- ---------
4
(所影響的行數為 1 行)
===========================================================
4:ASCII函數
返回字符表達式中最左側的字符的 ASCII 代碼值。
select ASCII( ' lihan ')
-- ---------
108
(所影響的行數為 1 行)
================================================================
5:nchar函數
根據 Unicode 標准的定義,返回具有指定的整數代碼的 Unicode 字符。
參數是介於 0 與 65535 之間的正整數。如果指定了超出此范圍的值,將返回 NULL。
select nchar( 3213)
-- --
unicode字符
(所影響的行數為 1 行)
=========================================================
6: soundex
返回一個由四個字符組成的代碼 ( SOUNDEX),用於評估兩個字符串的相似性。
SELECT SOUNDEX ( ' lihan '), SOUNDEX ( ' lihon ');
-- --- -----
L546 L542
(所影響的行數為 1 行)
=========================================================
7: char
參數為介於 0 和 255 之間的整數。如果該整數表達式不在此范圍內,將返回 NULL 值。
SELECT char( 125)
-- --
}
(所影響的行數為 1 行)
==========================================================
8:str函數
第一個參數必須為數字,第二個參數表示轉化成char型占的位置,小於參數一位置返回 *,大於右對齊
SELECT str( 12345, 3)
-- --
***
(所影響的行數為 1 行)
SELECT str( 12345, 12)
-- ----------
12345
(所影響的行數為 1 行)
===========================================================
9:difference函數
返回一個整數值,指示兩個字符表達式的 SOUNDEX 值之間的差異。
返回的整數是 SOUNDEX 值中相同字符的個數。返回的值從 0 到 4 不等: 0 表示幾乎不同或完全不同, 4 表示幾乎相同或完全相同。
SELECT difference( ' lihan ', ' liha ')
-- ---------
3
(所影響的行數為 1 行)
==================================================================
10:stuff函數(四個參數)
函數將字符串插入另一字符串。它在第一個字符串中從開始位置刪除指定長度的字符;然后將第二個字符串插入第一個字符串的開始位置。
SELECT stuff( ' lihan ', 2, 3, ' lihan ')
-- ------
llihann
(所影響的行數為 1 行)
===============================================================
11:left函數
返回最左邊N個字符,由參數決定
select left( ' lihan ', 4)
-- ---
liha
(所影響的行數為 1 行)
================================================================
12 right函數
返回最右邊N個字符,由參數決定
select right( ' lihan ', 4)
-- ---
ihan
(所影響的行數為 1 行)
================================================================
13:replicate函數
我的認為是把參數一復制參數二次
select replicate( ' lihan ', 4)
-- ------------------
lihanlihanlihanlihan
(所影響的行數為 1 行)
================================================================
14:len函數
返回參數長度
select len( ' lihan ')
-- ---------
5
(所影響的行數為 1 行)
================================================================
15:reverse函數
反轉字符串
select reverse( ' lihan ')
-- ---
nahil
(所影響的行數為 1 行)
=================================================================
16:lower和upper函數
參數大小寫轉化
select lower( upper( ' lihan '))
-- ------------------
lihan
(所影響的行數為 1 行)
====================================================================
17:ltrim和rtrim函數
刪除左邊空格和右面空格
select ltrim( ' lihan ')
-- ------------------------
lihan
(所影響的行數為 1 行)
select rtrim( ' lihan ')
-- -------
lihan
(所影響的行數為 1 行)
追加:
排名函數是SQL Server2005新加的功能。在SQL Server2005中有如下四個排名函數:
1. row_number
2. rank
3. dense_rank
4. ntile
下面分別介紹一下這四個排名函數的功能及用法。在介紹之前假設有一個t_table表,表結構與表中的數據如圖1所示:
圖1
其中field1字段的類型是int,field2字段的類型是varchar
一、row_number
row_number函數的用途是非常廣泛,這個函數的功能是為查詢出來的每一行記錄生成一個序號。row_number函數的用法如下面的SQL語句所示:
select row_number() over( order by field1) as row_number, * from t_table
上面的SQL語句的查詢結果如圖2所示。
圖2
其中row_number列是由row_number函數生成的序號列。在使用row_number函數是要使用over子句選擇對某一列進行排序,然后才能生成序號。
實際上,row_number函數生成序號的基本原理是先使用over子句中的排序語句對記錄進行排序,然后按着這個順序生成序號。over子句中的order by子句與SQL語句中的order by子句沒有任何關系,這兩處的order by 可以完全不同,如下面的SQL語句所示:
select row_number() over( order by field2 desc) as row_number, * from t_table order by field1 desc
上面的SQL語句的查詢結果如圖3所示。
圖3
我們可以使用row_number函數來實現查詢表中指定范圍的記錄,一般將其應用到Web應用程序的分頁功能上。下面的SQL語句可以查詢t_table表中第2條和第3條記錄:
with t_rowtable
as
(
select row_number() over( order by field1) as row_number, * from t_table
)
select * from t_rowtable where row_number > 1 and row_number < 4 order by field1
上面的SQL語句的查詢結果如圖4所示。
圖4
上面的SQL語句使用了CTE,關於CTE的介紹將讀者參閱《SQL Server2005雜談( 1):使用公用表表達式(CTE)簡化嵌套SQL》。
另外要注意的是,如果將row_number函數用於分頁處理,over子句中的order by 與排序記錄的order by 應相同,否則生成的序號可能不是有續的。
當然,不使用row_number函數也可以實現查詢指定范圍的記錄,就是比較麻煩。一般的方法是使用顛倒Top來實現,例如,查詢t_table表中第2條和第3條記錄,可以先查出前3條記錄,然后將查詢出來的這三條記錄按倒序排序,再取前2條記錄,最后再將查出來的這2條記錄再按倒序排序,就是最終結果。SQL語句如下:
select * from ( select top 2 * from( select top 3 * from t_table order by field1) a order by field1 desc) b order by field1
圖5
上面的SQL語句查詢出來的結果如圖5所示。
這個查詢結果除了沒有序號列row_number,其他的與圖4所示的查詢結果完全一樣。
二、rank
rank函數考慮到了over子句中排序字段值相同的情況,為了更容易說明問題,在t_table表中再加一條記錄,如圖6所示。
圖6
在圖6所示的記錄中后三條記錄的field1字段值是相同的。如果使用rank函數來生成序號,這3條記錄的序號是相同的,而第4條記錄會根據當前的記錄 數生成序號,后面的記錄依此類推,也就是說,在這個例子中,第4條記錄的序號是4,而不是2。rank函數的使用方法與row_number函數完全相 同,SQL語句如下:
select rank() over( order by field1), * from t_table order by field1
圖7
上面的SQL語句的查詢結果如圖7所示。
三、dense_rank
dense_rank函數的功能與rank函數類似,只是在生成序號時是連續的,而rank函數生成的序號有可能不連續。如上面的例子中如果使用dense_rank函數,第4條記錄的序號應該是2,而不是4。如下面的SQL語句所示:
select dense_rank() over( order by field1), * from t_table order by field1
上面的SQL語句的查詢結果如圖8所示。
圖8
讀者可以比較圖7和圖8所示的查詢結果有什么不同
四、ntile
ntile函數可以對序號進行分組處理。這就相當於將查詢出來的記錄集放到指定長度的數組中,每一個數組元素存放一定數量的記錄。ntile函數為每條記 錄生成的序號就是這條記錄所有的數組元素的索引(從1開始)。也可以將每一個分配記錄的數組元素稱為“桶”。ntile函數有一個參數,用來指定桶數。下 面的SQL語句使用ntile函數對t_table表進行了裝桶處理:
select ntile( 4) over( order by field1) as bucket, * from t_table
圖9
上面的SQL語句的查詢結果如圖9所示。
由於t_table表的記錄總數是6,而上面的SQL語句中的ntile函數指定了桶數為4。
也許有的讀者會問這么一個問題,SQL Server2005怎么來決定某一桶應該放多少記錄呢?可能t_table表中的記錄數有些少,那么我們假設t_table表中有59條記錄,而桶數是5,那么每一桶應放多少記錄呢?
實際上通過兩個約定就可以產生一個算法來決定哪一個桶應放多少記錄,這兩個約定如下:
1. 編號小的桶放的記錄不能小於編號大的桶。也就是說,第1捅中的記錄數只能大於等於第2桶及以后的各桶中的記錄。
2. 所有桶中的記錄要么都相同,要么從某一個記錄較少的桶開始后面所有捅的記錄數都與該桶的記錄數相同。也就是說,如果有個桶,前三桶的記錄數都是10,而第4捅的記錄數是6,那么第5桶和第6桶的記錄數也必須是6。
根據上面的兩個約定,可以得出如下的算法:
// mod表示取余,div表示取整
if(記錄總數 mod 桶數 == 0)
{
recordCount = 記錄總數 div 桶數;
將每桶的記錄數都設為recordCount
}
else
{
recordCount1 = 記錄總數 div 桶數 + 1;
int n = 1; // n表示桶中記錄數為recordCount1的最大桶數
m = recordCount1 * n;
while(((記錄總數 - m) mod (桶數 - n)) != 0 )
{
n ++;
m = recordCount1 * n;
}
recordCount2 = (記錄總數 - m) div (桶數 - n);
將前n個桶的記錄數設為recordCount1
將n + 1個至后面所有桶的記錄數設為recordCount2
}
根據上面的算法,如果記錄總數為59,桶數為5,則前4個桶的記錄數都是12,最后一個桶的記錄數是11。
如果記錄總數為53,桶數為5,則前3個桶的記錄數為11,后2個桶的記錄數為10。
就拿本例來說,記錄總數為6,桶數為4,則會算出recordCount1的值為2,在結束while循環后,會算出recordCount2的值是1,因此,前2個桶的記錄是2,后2個桶的記錄是1。
返回字符表達式最左端字符的ASCII 碼值。在ASCII()函數中,純數字的字符串可不用‘’括起來,但含其它字符的字符串必須用‘’括起來使用,否則會出錯。
2、 CHAR()
將ASCII 碼轉換為字符。如果沒有輸入0 ~ 255 之間的ASCII 碼值, CHAR() 返回NULL 。
3、 LOWER()和UPPER()
LOWER()將字符串全部轉為小寫; UPPER()將字符串全部轉為大寫。
4、 STR()
把數值型數據轉換為字符型數據。
STR ( <float_expression > [ ,length[, <decimal> ]])
length 指定返回的字符串的長度, decimal 指定返回的小數位數。如果沒有指定長度,缺省的length 值為10, decimal 缺省值為0。
當length 或者decimal 為負值時,返回NULL;
當length 小於小數點左邊(包括符號位)的位數時,返回length 個 *;
先服從length ,再取decimal ;
當返回的字符串位數小於length ,左邊補足空格。
二、去空格函數
1、 LTRIM() 把字符串頭部的空格去掉。
2、 RTRIM() 把字符串尾部的空格去掉。
三、取子串函數
1、 left()
LEFT ( <character_expression >, <integer_expression >)
返回character_expression 左起 integer_expression 個字符。
2、 RIGHT()
RIGHT ( <character_expression >, <integer_expression >)
返回character_expression 右起 integer_expression 個字符。
3、 SUBSTRING()
SUBSTRING ( <expression >, <starting_ position >, length)
返回從字符串左邊第starting_ position 個字符起length個字符的部分。
四、字符串比較函數
1、 CHARINDEX()
返回字符串中某個指定的子串出現的開始位置。
CHARINDEX ( <’substring_expression’ >, <expression >)
其中substring _expression 是所要查找的字符表達式,expression 可為字符串也可為列名表達式。如果沒有發現子串,則返回0 值。
此函數不能用於TEXT 和IMAGE 數據類型。
2、 PATINDEX()
返回字符串中某個指定的子串出現的開始位置。
PATINDEX ( <’ % substring _expression %’ >, <column_ name >)其中子串表達式前后必須有百分號“ %”否則返回值為0。
與CHARINDEX 函數不同的是,PATINDEX函數的子串中可以使用通配符,且此函數可用於CHAR、 VARCHAR 和TEXT 數據類型。
五、字符串操作函數
1、 QUOTENAME()
返回被特定字符括起來的字符串。
QUOTENAME ( <’character_expression’ > [ , quote_ character ]) 其中quote_ character 標明括字符串所用的字符,缺省值為“ []”。
2、 REPLICATE()
返回一個重復character_expression 指定次數的字符串。
REPLICATE (character_expression integer_expression) 如果integer_expression 值為負值,則返回NULL 。
3、 REVERSE()
將指定的字符串的字符排列順序顛倒。
REVERSE ( <character_expression >) 其中character_expression 可以是字符串、常數或一個列的值。
4、 REPLACE()
返回被替換了指定子串的字符串。
REPLACE ( <string_expression1 >, <string_expression2 >, <string_expression3 >) 用string_expression3 替換在string_expression1 中的子串string_expression2。
5、 SPACE()
返回一個有指定長度的空白字符串。
SPACE ( <integer_expression >) 如果integer_expression 值為負值,則返回NULL 。
6、 STUFF()
用另一子串替換字符串指定位置、長度的子串。
STUFF ( <character_expression1 >, <start_ position >, <length >, <character_expression2 >)
如果起始位置為負或長度值為負,或者起始位置大於character_expression1 的長度,則返回NULL 值。
如果length 長度大於character_expression1 中 start_ position 以右的長度,則character_expression1 只保留首字符。
六、數據類型轉換函數
1、 CAST()
CAST ( <expression > AS <data_ type > [ length ])
2、 CONVERT()
CONVERT ( <data_ type > [ length ], <expression > [ , style ])
1)data_type為SQL Server系統定義的數據類型,用戶自定義的數據類型不能在此使用。
2)length用於指定數據的長度,缺省值為30。
3)把CHAR或VARCHAR類型轉換為諸如INT或SAMLLINT這樣的INTEGER類型、結果必須是帶正號或負號的數值。
4)TEXT類型到CHAR或VARCHAR類型轉換最多為8000個字符,即CHAR或VARCHAR數據類型是最大長度。
5)IMAGE類型存儲的數據轉換到BINARY或VARBINARY類型,最多為8000個字符。
6)把整數值轉換為MONEY或SMALLMONEY類型,按定義的國家的貨幣單位來處理,如人民幣、美元、英鎊等。
7)BIT類型的轉換把非零值轉換為1,並仍以BIT類型存儲。
8)試圖轉換到不同長度的數據類型,會截短轉換值並在轉換值后顯示“ +”,以標識發生了這種截斷。
9)用CONVERT()函數的style 選項能以不同的格式顯示日期和時間。style 是將DATATIME 和SMALLDATETIME 數據轉換為字符串時所選用的由SQL Server 系統提供的轉換樣式編號,不同的樣式編號有不同的輸出格式。
七、日期函數
1、 day(date_expression)
返回date_expression中的日期值
2、 month(date_expression)
返回date_expression中的月份值
3、 year(date_expression)
返回date_expression中的年份值
4、 DATEADD()
DATEADD ( < datepart >, < number >, <date >)
返回指定日期date 加上指定的額外日期間隔number 產生的新日期。
5、 DATEDIFF()
DATEDIFF ( < datepart >, <date1 >, <date2 >)
返回兩個指定日期在datepart 方面的不同之處,即date2 超過date1的差距值,其結果值是一個帶有正負號的整數值。
6、 DATENAME()
DATENAME ( < datepart >, <date >)
以字符串的形式返回日期的指定部分此部分。由datepart 來指定。
7、 DATEPART()
DATEPART ( < datepart >, <date >)
以整數值的形式返回日期的指定部分。此部分由datepart 來指定。
DATEPART (dd, date) 等同於DAY (date)
DATEPART (mm, date) 等同於MONTH (date)
DATEPART (yy, date) 等同於YEAR (date)
8、 GETDATE()
以DATETIME 的缺省格式返回系統當前的日期和時間。
9、Sql Server 中一個非常強大的日期格式化函數
Select CONVERT( varchar( 100), GETDATE(), 0): 05 16 2006 10:57AM
Select CONVERT( varchar( 100), GETDATE(), 1): 05 / 16 / 06
Select CONVERT( varchar( 100), GETDATE(), 2): 06.05. 16
Select CONVERT( varchar( 100), GETDATE(), 3): 16 / 05 / 06
Select CONVERT( varchar( 100), GETDATE(), 4): 16.05. 06
Select CONVERT( varchar( 100), GETDATE(), 5): 16 - 05 - 06
Select CONVERT( varchar( 100), GETDATE(), 6): 16 05 06
Select CONVERT( varchar( 100), GETDATE(), 7): 05 16, 06
Select CONVERT( varchar( 100), GETDATE(), 8): 10: 57: 46
Select CONVERT( varchar( 100), GETDATE(), 9): 05 16 2006 10: 57: 46:827AM
Select CONVERT( varchar( 100), GETDATE(), 10): 05 - 16 - 06
Select CONVERT( varchar( 100), GETDATE(), 11): 06 / 05 / 16
Select CONVERT( varchar( 100), GETDATE(), 12): 060516
Select CONVERT( varchar( 100), GETDATE(), 13): 16 05 2006 10: 57: 46: 937
Select CONVERT( varchar( 100), GETDATE(), 14): 10: 57: 46: 967
Select CONVERT( varchar( 100), GETDATE(), 20): 2006 - 05 - 16 10: 57: 47
Select CONVERT( varchar( 100), GETDATE(), 21): 2006 - 05 - 16 10: 57: 47.157
Select CONVERT( varchar( 100), GETDATE(), 22): 05 / 16 / 06 10: 57: 47 AM
Select CONVERT( varchar( 100), GETDATE(), 23): 2006 - 05 - 16
Select CONVERT( varchar( 100), GETDATE(), 24): 10: 57: 47
Select CONVERT( varchar( 100), GETDATE(), 25): 2006 - 05 - 16 10: 57: 47.250
Select CONVERT( varchar( 100), GETDATE(), 100): 05 16 2006 10:57AM
Select CONVERT( varchar( 100), GETDATE(), 101): 05 / 16 / 2006
Select CONVERT( varchar( 100), GETDATE(), 102): 2006.05. 16
Select CONVERT( varchar( 100), GETDATE(), 103): 16 / 05 / 2006
Select CONVERT( varchar( 100), GETDATE(), 104): 16.05. 2006
Select CONVERT( varchar( 100), GETDATE(), 105): 16 - 05 - 2006
Select CONVERT( varchar( 100), GETDATE(), 106): 16 05 2006
Select CONVERT( varchar( 100), GETDATE(), 107): 05 16, 2006
Select CONVERT( varchar( 100), GETDATE(), 108): 10: 57: 49
Select CONVERT( varchar( 100), GETDATE(), 109): 05 16 2006 10: 57: 49:437AM
Select CONVERT( varchar( 100), GETDATE(), 110): 05 - 16 - 2006
Select CONVERT( varchar( 100), GETDATE(), 111): 2006 / 05 / 16
Select CONVERT( varchar( 100), GETDATE(), 112): 20060516
Select CONVERT( varchar( 100), GETDATE(), 113): 16 05 2006 10: 57: 49: 513
Select CONVERT( varchar( 100), GETDATE(), 114): 10: 57: 49: 547
Select CONVERT( varchar( 100), GETDATE(), 120): 2006 - 05 - 16 10: 57: 49
Select CONVERT( varchar( 100), GETDATE(), 121): 2006 - 05 - 16 10: 57: 49.700
Select CONVERT( varchar( 100), GETDATE(), 126): 2006 - 05 -16T10: 57: 49.827
Select CONVERT( varchar( 100), GETDATE(), 130): 18 ???? ?????? 1427 10: 57: 49:907AM
Select CONVERT( varchar( 100), GETDATE(), 131): 18 / 04 / 1427 10: 57: 49:920AM
常用:
Select CONVERT( varchar( 100), GETDATE(), 8): 10: 57: 46
Select CONVERT( varchar( 100), GETDATE(), 24): 10: 57: 47
Select CONVERT( varchar( 100), GETDATE(), 108): 10: 57: 49
Select CONVERT( varchar( 100), GETDATE(), 12): 060516
Select CONVERT( varchar( 100), GETDATE(), 23): 2006 - 05 - 16
八、統計函數
AVG ( ) -返回的平均價值
count( ) -返回的行數
first( ) -返回第一個值
last( ) -返回最后一個值
max( ) -返回的最大價值
min( ) -返回最小的價值
total( ) -返回的總和
九、數學函數
abs(numeric_expr) 求絕對值
ceiling(numeric_expr) 取大於等於指定值的最小整數
exp(float_expr) 取指數
floor(numeric_expr) 小於等於指定值得最大整數
pi() 3.1415926.........
power(numeric_expr, power) 返回power次方
rand( [ int_expr ]) 隨機數產生器
round(numeric_expr,int_expr) 安int_expr規定的精度四舍五入
sign(int_expr) 根據正數, 0,負數,,返回 + 1, 0, - 1
sqrt(float_expr) 平方根
十、系統函數
suser_name() 用戶登錄名
user_name() 用戶在數據庫中的名字
user 用戶在數據庫中的名字
show_role() 對當前用戶起作用的規則
db_name() 數據庫名
object_name(obj_id) 數據庫對象名
col_name(obj_id,col_id) 列名
col_length(objname,colname) 列長度
valid_name(char_expr) 是否是有效標識符
十一、以上函數的部分實例
1: replace 函數
第一個參數你的字符串,第二個參數你想替換的部分,第三個參數你要替換成什么
select replace( ' lihan ', ' a ', ' b ')
-- ---------------------------
lihbn
(所影響的行數為 1 行)
=========================================================
2:substring函數
第一個參數你的字符串,第二個是開始替換位置,第三個結束替換位置
select substring( ' lihan ', 0, 3);
-- ---
li
(所影響的行數為 1 行)
=========================================================
3:charindex函數
第一個參數你要查找的char,第二個參數你被查找的字符串 返回參數一在參數二的位置
select charindex( ' a ', ' lihan ')
-- ---------
4
(所影響的行數為 1 行)
===========================================================
4:ASCII函數
返回字符表達式中最左側的字符的 ASCII 代碼值。
select ASCII( ' lihan ')
-- ---------
108
(所影響的行數為 1 行)
================================================================
5:nchar函數
根據 Unicode 標准的定義,返回具有指定的整數代碼的 Unicode 字符。
參數是介於 0 與 65535 之間的正整數。如果指定了超出此范圍的值,將返回 NULL。
select nchar( 3213)
-- --
unicode字符
(所影響的行數為 1 行)
=========================================================
6: soundex
返回一個由四個字符組成的代碼 ( SOUNDEX),用於評估兩個字符串的相似性。
SELECT SOUNDEX ( ' lihan '), SOUNDEX ( ' lihon ');
-- --- -----
L546 L542
(所影響的行數為 1 行)
=========================================================
7: char
參數為介於 0 和 255 之間的整數。如果該整數表達式不在此范圍內,將返回 NULL 值。
SELECT char( 125)
-- --
}
(所影響的行數為 1 行)
==========================================================
8:str函數
第一個參數必須為數字,第二個參數表示轉化成char型占的位置,小於參數一位置返回 *,大於右對齊
SELECT str( 12345, 3)
-- --
***
(所影響的行數為 1 行)
SELECT str( 12345, 12)
-- ----------
12345
(所影響的行數為 1 行)
===========================================================
9:difference函數
返回一個整數值,指示兩個字符表達式的 SOUNDEX 值之間的差異。
返回的整數是 SOUNDEX 值中相同字符的個數。返回的值從 0 到 4 不等: 0 表示幾乎不同或完全不同, 4 表示幾乎相同或完全相同。
SELECT difference( ' lihan ', ' liha ')
-- ---------
3
(所影響的行數為 1 行)
==================================================================
10:stuff函數(四個參數)
函數將字符串插入另一字符串。它在第一個字符串中從開始位置刪除指定長度的字符;然后將第二個字符串插入第一個字符串的開始位置。
SELECT stuff( ' lihan ', 2, 3, ' lihan ')
-- ------
llihann
(所影響的行數為 1 行)
===============================================================
11:left函數
返回最左邊N個字符,由參數決定
select left( ' lihan ', 4)
-- ---
liha
(所影響的行數為 1 行)
================================================================
12 right函數
返回最右邊N個字符,由參數決定
select right( ' lihan ', 4)
-- ---
ihan
(所影響的行數為 1 行)
================================================================
13:replicate函數
我的認為是把參數一復制參數二次
select replicate( ' lihan ', 4)
-- ------------------
lihanlihanlihanlihan
(所影響的行數為 1 行)
================================================================
14:len函數
返回參數長度
select len( ' lihan ')
-- ---------
5
(所影響的行數為 1 行)
================================================================
15:reverse函數
反轉字符串
select reverse( ' lihan ')
-- ---
nahil
(所影響的行數為 1 行)
=================================================================
16:lower和upper函數
參數大小寫轉化
select lower( upper( ' lihan '))
-- ------------------
lihan
(所影響的行數為 1 行)
====================================================================
17:ltrim和rtrim函數
刪除左邊空格和右面空格
select ltrim( ' lihan ')
-- ------------------------
lihan
(所影響的行數為 1 行)
select rtrim( ' lihan ')
-- -------
lihan
(所影響的行數為 1 行)
追加:
排名函數是SQL Server2005新加的功能。在SQL Server2005中有如下四個排名函數:
1. row_number
2. rank
3. dense_rank
4. ntile
下面分別介紹一下這四個排名函數的功能及用法。在介紹之前假設有一個t_table表,表結構與表中的數據如圖1所示:
圖1
其中field1字段的類型是int,field2字段的類型是varchar
一、row_number
row_number函數的用途是非常廣泛,這個函數的功能是為查詢出來的每一行記錄生成一個序號。row_number函數的用法如下面的SQL語句所示:
select row_number() over( order by field1) as row_number, * from t_table
上面的SQL語句的查詢結果如圖2所示。
圖2
其中row_number列是由row_number函數生成的序號列。在使用row_number函數是要使用over子句選擇對某一列進行排序,然后才能生成序號。
實際上,row_number函數生成序號的基本原理是先使用over子句中的排序語句對記錄進行排序,然后按着這個順序生成序號。over子句中的order by子句與SQL語句中的order by子句沒有任何關系,這兩處的order by 可以完全不同,如下面的SQL語句所示:
select row_number() over( order by field2 desc) as row_number, * from t_table order by field1 desc
上面的SQL語句的查詢結果如圖3所示。
圖3
我們可以使用row_number函數來實現查詢表中指定范圍的記錄,一般將其應用到Web應用程序的分頁功能上。下面的SQL語句可以查詢t_table表中第2條和第3條記錄:
with t_rowtable
as
(
select row_number() over( order by field1) as row_number, * from t_table
)
select * from t_rowtable where row_number > 1 and row_number < 4 order by field1
上面的SQL語句的查詢結果如圖4所示。
圖4
上面的SQL語句使用了CTE,關於CTE的介紹將讀者參閱《SQL Server2005雜談( 1):使用公用表表達式(CTE)簡化嵌套SQL》。
另外要注意的是,如果將row_number函數用於分頁處理,over子句中的order by 與排序記錄的order by 應相同,否則生成的序號可能不是有續的。
當然,不使用row_number函數也可以實現查詢指定范圍的記錄,就是比較麻煩。一般的方法是使用顛倒Top來實現,例如,查詢t_table表中第2條和第3條記錄,可以先查出前3條記錄,然后將查詢出來的這三條記錄按倒序排序,再取前2條記錄,最后再將查出來的這2條記錄再按倒序排序,就是最終結果。SQL語句如下:
select * from ( select top 2 * from( select top 3 * from t_table order by field1) a order by field1 desc) b order by field1
圖5
上面的SQL語句查詢出來的結果如圖5所示。
這個查詢結果除了沒有序號列row_number,其他的與圖4所示的查詢結果完全一樣。
二、rank
rank函數考慮到了over子句中排序字段值相同的情況,為了更容易說明問題,在t_table表中再加一條記錄,如圖6所示。
圖6
在圖6所示的記錄中后三條記錄的field1字段值是相同的。如果使用rank函數來生成序號,這3條記錄的序號是相同的,而第4條記錄會根據當前的記錄 數生成序號,后面的記錄依此類推,也就是說,在這個例子中,第4條記錄的序號是4,而不是2。rank函數的使用方法與row_number函數完全相 同,SQL語句如下:
select rank() over( order by field1), * from t_table order by field1
圖7
上面的SQL語句的查詢結果如圖7所示。
三、dense_rank
dense_rank函數的功能與rank函數類似,只是在生成序號時是連續的,而rank函數生成的序號有可能不連續。如上面的例子中如果使用dense_rank函數,第4條記錄的序號應該是2,而不是4。如下面的SQL語句所示:
select dense_rank() over( order by field1), * from t_table order by field1
上面的SQL語句的查詢結果如圖8所示。
圖8
讀者可以比較圖7和圖8所示的查詢結果有什么不同
四、ntile
ntile函數可以對序號進行分組處理。這就相當於將查詢出來的記錄集放到指定長度的數組中,每一個數組元素存放一定數量的記錄。ntile函數為每條記 錄生成的序號就是這條記錄所有的數組元素的索引(從1開始)。也可以將每一個分配記錄的數組元素稱為“桶”。ntile函數有一個參數,用來指定桶數。下 面的SQL語句使用ntile函數對t_table表進行了裝桶處理:
select ntile( 4) over( order by field1) as bucket, * from t_table
圖9
上面的SQL語句的查詢結果如圖9所示。
由於t_table表的記錄總數是6,而上面的SQL語句中的ntile函數指定了桶數為4。
也許有的讀者會問這么一個問題,SQL Server2005怎么來決定某一桶應該放多少記錄呢?可能t_table表中的記錄數有些少,那么我們假設t_table表中有59條記錄,而桶數是5,那么每一桶應放多少記錄呢?
實際上通過兩個約定就可以產生一個算法來決定哪一個桶應放多少記錄,這兩個約定如下:
1. 編號小的桶放的記錄不能小於編號大的桶。也就是說,第1捅中的記錄數只能大於等於第2桶及以后的各桶中的記錄。
2. 所有桶中的記錄要么都相同,要么從某一個記錄較少的桶開始后面所有捅的記錄數都與該桶的記錄數相同。也就是說,如果有個桶,前三桶的記錄數都是10,而第4捅的記錄數是6,那么第5桶和第6桶的記錄數也必須是6。
根據上面的兩個約定,可以得出如下的算法:
// mod表示取余,div表示取整
if(記錄總數 mod 桶數 == 0)
{
recordCount = 記錄總數 div 桶數;
將每桶的記錄數都設為recordCount
}
else
{
recordCount1 = 記錄總數 div 桶數 + 1;
int n = 1; // n表示桶中記錄數為recordCount1的最大桶數
m = recordCount1 * n;
while(((記錄總數 - m) mod (桶數 - n)) != 0 )
{
n ++;
m = recordCount1 * n;
}
recordCount2 = (記錄總數 - m) div (桶數 - n);
將前n個桶的記錄數設為recordCount1
將n + 1個至后面所有桶的記錄數設為recordCount2
}
根據上面的算法,如果記錄總數為59,桶數為5,則前4個桶的記錄數都是12,最后一個桶的記錄數是11。
如果記錄總數為53,桶數為5,則前3個桶的記錄數為11,后2個桶的記錄數為10。
就拿本例來說,記錄總數為6,桶數為4,則會算出recordCount1的值為2,在結束while循環后,會算出recordCount2的值是1,因此,前2個桶的記錄是2,后2個桶的記錄是1。