SQL“常用查詢語句”、“常用日期查詢方式”、“常用函數”整理


      最近用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  endFROM 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 - 12select  *  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, 120and 時間字段  >= 時間字段

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

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, 120and 時間字段  >= 時間字段

上月

 

 

三、常用SQL函數(來自:http://www.cnblogs.com/dreamof/archive/2009/02/02/1382487.html )

       一、字符轉換函數

1ASCII()
返回字符表達式最左端字符的ASCII 碼值。在ASCII()函數中,純數字的字符串可不用‘’括起來,但含其它字符的字符串必須用‘’括起來使用,否則會出錯。

2CHAR()
將ASCII 碼轉換為字符。如果沒有輸入0  ~  255 之間的ASCII 碼值, CHAR() 返回NULL 。

3LOWER()和UPPER()
LOWER()將字符串全部轉為小寫; UPPER()將字符串全部轉為大寫。

4STR()
把數值型數據轉換為字符型數據。
STR ( <float_expression > [ ,length[, <decimal> ]])
length 指定返回的字符串的長度, decimal 指定返回的小數位數。如果沒有指定長度,缺省的length 值為10,  decimal 缺省值為0。
當length 或者decimal 為負值時,返回NULL;
當length 小於小數點左邊(包括符號位)的位數時,返回length 個 *
先服從length ,再取decimal ;
當返回的字符串位數小於length ,左邊補足空格。

二、去空格函數
1LTRIM() 把字符串頭部的空格去掉。

2RTRIM() 把字符串尾部的空格去掉。

三、取子串函數
1left() 
LEFT ( <character_expression >,  <integer_expression >)
返回character_expression 左起 integer_expression 個字符。

2RIGHT() 
RIGHT ( <character_expression >,  <integer_expression >)
返回character_expression 右起 integer_expression 個字符。

3SUBSTRING()
SUBSTRING ( <expression >,  <starting_ position >, length)
返回從字符串左邊第starting_ position 個字符起length個字符的部分。

四、字符串比較函數
1CHARINDEX()
返回字符串中某個指定的子串出現的開始位置。
CHARINDEX ( <’substring_expression’ >,  <expression >)
其中substring _expression 是所要查找的字符表達式,expression 可為字符串也可為列名表達式。如果沒有發現子串,則返回0 值。
此函數不能用於TEXT 和IMAGE 數據類型。

2PATINDEX()
返回字符串中某個指定的子串出現的開始位置。
PATINDEX ( <% substring _expression %>,  <column_ name >)其中子串表達式前后必須有百分號“ %”否則返回值為0。
與CHARINDEX 函數不同的是,PATINDEX函數的子串中可以使用通配符,且此函數可用於CHAR、  VARCHAR 和TEXT 數據類型。

五、字符串操作函數
1QUOTENAME()
返回被特定字符括起來的字符串。
QUOTENAME ( <’character_expression’ > [ , quote_ character ]) 其中quote_  character 標明括字符串所用的字符,缺省值為“ []”。

2REPLICATE()
返回一個重復character_expression 指定次數的字符串。
REPLICATE (character_expression integer_expression) 如果integer_expression 值為負值,則返回NULL 。

3REVERSE()
將指定的字符串的字符排列順序顛倒。
REVERSE ( <character_expression >) 其中character_expression 可以是字符串、常數或一個列的值。

4REPLACE()
返回被替換了指定子串的字符串。
REPLACE ( <string_expression1 >,  <string_expression2 >,  <string_expression3 >) 用string_expression3 替換在string_expression1 中的子串string_expression2。

5SPACE()
返回一個有指定長度的空白字符串。
SPACE ( <integer_expression >) 如果integer_expression 值為負值,則返回NULL 。

6STUFF()
用另一子串替換字符串指定位置、長度的子串。
STUFF ( <character_expression1 >,  <start_ position >,  <length ><character_expression2 >)
如果起始位置為負或長度值為負,或者起始位置大於character_expression1 的長度,則返回NULL 值。
如果length 長度大於character_expression1 中 start_ position 以右的長度,則character_expression1 只保留首字符。

六、數據類型轉換函數
1CAST()
CAST ( <expression >  AS  <data_ type > [  length  ])

2CONVERT()
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 系統提供的轉換樣式編號,不同的樣式編號有不同的輸出格式。

七、日期函數
1day(date_expression) 
返回date_expression中的日期值

2month(date_expression)
返回date_expression中的月份值

3year(date_expression)
返回date_expression中的年份值

4DATEADD()
DATEADD ( < datepart >,  < number >,  <date >)
返回指定日期date 加上指定的額外日期間隔number 產生的新日期。

5DATEDIFF()
DATEDIFF ( < datepart >,  <date1 >,  <date2 >)
返回兩個指定日期在datepart 方面的不同之處,即date2 超過date1的差距值,其結果值是一個帶有正負號的整數值。

6DATENAME()
DATENAME ( < datepart >,  <date >)
以字符串的形式返回日期的指定部分此部分。由datepart 來指定。

7DATEPART()
DATEPART ( < datepart >,  <date >)
以整數值的形式返回日期的指定部分。此部分由datepart 來指定。
DATEPART (dd, date) 等同於DAY (date)
DATEPART (mm, date) 等同於MONTH (date)
DATEPART (yy, date) 等同於YEAR (date)

8GETDATE()
以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  1606
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  162006
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 行)
=========================================================
6soundex
返回一個由四個字符組成的代碼 ( SOUNDEX),用於評估兩個字符串的相似性。
SELECT  SOUNDEX ( ' lihan '),  SOUNDEX ( ' lihon ');
-- --- ----- 
L546  L542
(所影響的行數為  1 行)
=========================================================
7char
參數為介於  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  descas 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  *  fromselect  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( 4over( 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。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM