1. 程式人生 > >SQL Server基礎知識

SQL Server基礎知識

-------------------
常用語法
-------------------
SQL語句先前寫的時候,很容易把一些特殊的用法忘記,我特此整理了一下SQL語句操作。
一、基礎
1、說明:建立資料庫
Create DATABASE database-name 
2、說明:刪除資料庫
drop database dbname
3、說明:備份sql server
--- 建立 備份資料的 device
USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c:/mssql7backup/MyNwind_1.dat'
--- 開始 備份
BACKUP DATABASE pubs TO testBack 
4、說明:建立新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根據已有的表建立新表: 
A:create table tab_new like tab_old (使用舊錶建立新表)
B:create table tab_new as select col1,col2… from tab_old definition only
5、說明:刪除新表
drop table tabname 
6、說明:增加一個列
Alter table tabname add column col type
注:列增加後將不能刪除。DB2中列加上後資料型別也不能改變,唯一能改變的是增加varchar型別的長度。
7、說明:新增主鍵: Alter table tabname add primary key(col) 
說明:刪除主鍵: Alter table tabname drop primary key(col) 
8、說明:建立索引:create [unique] index idxname on tabname(col….) 
刪除索引:drop index idxname
注:索引是不可更改的,想更改必須刪除重新建。
9、說明:建立檢視:create view viewname as select statement 
刪除檢視:drop view viewname
10、說明:幾個簡單的基本的sql語句
選擇:select * from table1 where 範圍
插入:insert into table1(field1,field2) values(value1,value2)
刪除:delete from table1 where 範圍
更新:update table1 set field1=value1 where 範圍
查詢:select * from table1 where field1 like ’%value1%’ ---like的語法很精妙,查資料!
排序:select * from table1 order by field1,field2 [desc]
總數:select count as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
11、說明:幾個高階查詢運算詞
A: UNION 運算子 
UNION 運算子通過組合其他兩個結果表(例如 TABLE1 和 TABLE2)並消去表中任何重複行而派生出一個結果表。當 ALL 隨 UNION 一起使用時(即 UNION ALL),不消除重複行。兩種情況下,派生表的每一行不是來自 TABLE1 就是來自 TABLE2。 
B: EXCEPT 運算子 
EXCEPT 運算子通過包括所有在 TABLE1 中但不在 TABLE2 中的行並消除所有重複行而派生出一個結果表。當 ALL 隨 EXCEPT 一起使用時 (EXCEPT ALL),不消除重複行。 
C: INTERSECT 運算子
????INTERSECT 運算子通過只包括 TABLE1 和 TABLE2 中都有的行並消除所有重複行而派生出一個結果表。當 ALL 隨 INTERSECT 一起使用時 (INTERSECT ALL),不消除重複行。 
注:使用運算詞的幾個查詢結果行必須是一致的。 
12、說明:使用外連線 
A、left outer join: 
左外連線(左連線):結果集幾包括連線表的匹配行,也包括左連線表的所有行。 
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right outer join: 
右外連線(右連線):結果集既包括連線表的匹配連線行,也包括右連線表的所有行。 
C:full outer join: 
全外連線:不僅包括符號連線表的匹配行,還包括兩個連線表中的所有記錄。

二、提升

1、說明:複製表(只複製結構,源表名:a 新表名:b) (Access可用)
法一: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 b;

3、說明:跨資料庫之間表的拷貝(具體資料使用絕對路徑) (Access可用)
insert into b(a, b, c) select d,e,f from b 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

三、技巧

1、1=1,1=2的使用,在SQL語句組合時用的較多

“where 1=1” 是表示選擇全部   “where 1=2”全部不選,
如:
if @strWhere !='' 
begin
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere 
end
else 
begin
set @strSQL = 'select count(*) as Total from [' + @tblName + ']' 
end 

我們可以直接寫成
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere 

2、收縮資料庫
--重建索引
DBCC REINDEX
DBCC INDEXDEFRAG
--收縮資料和日誌
DBCC SHRINKDB
DBCC SHRINKFILE

3、壓縮資料庫
dbcc shrinkdatabase(dbname)

4、轉移資料庫給新使用者以已存在使用者許可權
exec sp_change_users_login 'update_one','newname','oldname'
go

5、檢查備份集
RESTORE VERIFYONLY from disk='E:/dvbbs.bak'

6、修復資料庫
Alter DATABASE [dvbbs] SET SINGLE_USER
GO
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK
GO
Alter DATABASE [dvbbs] SET MULTI_USER
GO

7、日誌清除
SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
        @MaxMinutes INT,
        @NewSize INT


USE     tablename             -- 要操作的資料庫名
Select  @LogicalFileName = 'tablename_log',  -- 日誌檔名
@MaxMinutes = 10,               -- Limit on time allowed to wrap log.
        @NewSize = 1                  -- 你想設定的日誌檔案的大小(M)

-- Setup / initialize
DECLARE @OriginalSize int
Select @OriginalSize = size 
  FROM sysfiles
  Where name = @LogicalFileName
Select 'Original Size of ' + db_name() + ' LOG is ' + 
        CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + 
        CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
  FROM sysfiles
  Where name = @LogicalFileName
Create TABLE DummyTrans
  (DummyColumn char (8000) not null)


DECLARE @Counter   INT,
        @StartTime DATETIME,
        @TruncLog  VARCHAR(255)
Select  @StartTime = GETDATE(),
        @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'

DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC (@TruncLog)
-- Wrap the log if necessary.
WHILE     @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
      AND @OriginalSize = (Select size FROM sysfiles Where name = @LogicalFileName)  
      AND (@OriginalSize * 8 /1024) > @NewSize  
  BEGIN -- Outer loop.
    Select @Counter = 0
    WHILE  ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
      BEGIN -- update
        Insert DummyTrans VALUES ('Fill Log')  
        Delete DummyTrans
        Select @Counter = @Counter + 1
      END   
    EXEC (@TruncLog)  
  END   
Select 'Final Size of ' + db_name() + ' LOG is ' +
        CONVERT(VARCHAR(30),size) + ' 8K pages or ' + 
        CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
  FROM sysfiles 
  Where name = @LogicalFileName
Drop TABLE DummyTrans
SET NOCOUNT OFF 

8、說明:更改某個表
exec sp_changeobjectowner 'tablename','dbo'

9、儲存更改全部表

Create PROCEDURE dbo.User_ChangeObjectOwnerBatch
 @OldOwner as NVARCHAR(128),
 @NewOwner as NVARCHAR(128)
AS

DECLARE @Name   as NVARCHAR(128)
DECLARE @Owner  as NVARCHAR(128)
DECLARE @OwnerName  as NVARCHAR(128)

DECLARE curObject CURSOR FOR 
 select 'Name'   = name,
  'Owner'   = user_name(uid)
 from sysobjects
 where user_name(uid)
[email protected]
order by name OPEN curObject FETCH NEXT FROM curObject INTO @Name, @Owner WHILE(@@FETCH_STATUS=0) BEGIN if @[email protected] begin set @OwnerName = @OldOwner + '.' + rtrim(@Name) exec sp_changeobjectowner @OwnerName, @NewOwner end -- select @name,@NewOwner,@OldOwner FETCH NEXT FROM curObject INTO @Name, @Owner END close curObject deallocate curObject GO 10、SQL SERVER中直接迴圈寫入資料 declare @i int set @i=1 while @i<30 begin insert into test (userid) values(@i) set @
[email protected]
+1 end 小記儲存過程中經常用到的本週,本月,本年函式 Dateadd(wk,datediff(wk,0,getdate()),-1) Dateadd(wk,datediff(wk,0,getdate()),6) Dateadd(mm,datediff(mm,0,getdate()),0) Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0)) Dateadd(yy,datediff(yy,0,getdate()),0) Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) 上面的SQL程式碼只是一個時間段 Dateadd(wk,datediff(wk,0,getdate()),-1) Dateadd(wk,datediff(wk,0,getdate()),6) 就是表示本週時間段. 下面的SQL的條件部分,就是查詢時間段在本週範圍內的: Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6) 而在儲存過程中 select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1) select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6)
------------------------------------------
全域性變數
------------------------------------------
@@SERVERNAME    : 返回執行SQL Server 2000本地伺服器的名稱。 
@@REMSERVER       : 返回登入記錄中記載的遠端SQL Server伺服器的名稱。 
@@CONNECTIONS : 返回自上次啟動SQL Server以來連線或試圖連線的次數,用其可讓管理人員方便地瞭解今天所有試圖連線伺服器的次數。 
@@CURSOR_ROWS : 返回最後連線上並開啟的遊標中當前存在的合格行的數量。 
@@ERROR                 : 返回最後執行的Transact-SQL語句的錯誤程式碼。 
@@ROWCOUNT       : 返回受上一語句影響的行數,任何不返回行的語句將這一變數設定為0。 
@@VERSION             : 返回SQL Server當前安裝的日期、版本和處理器型別。 
@@CPU_BUSY          : 返回自SQL Server最近一次啟動以來CPU的工作時間其單位為毫秒。 
@@DATEFIRST         : 返回使用SET DATEFIRST命令而被賦值的DATAFIRST引數值。SET DATEFIRST命令用來指定每週的第一天是星期幾。 
@@DBTS                    : 返回當前資料庫的時間戳值必須保證資料庫中時間戳的值是惟一的。 
@@FETCH_STATUS : 返回上一次FETCH語句的狀態值。 
@@IDENTITY            : 返回最後插入行的標識列的列值。 
@@IDLE                     : 返回自SQL Server最近一次啟動以來CPU處於空閉狀態的時間長短,單位為毫秒。 
@@IO_BUSY             : 返回自SQL Server最後一次啟動以來CPU執行輸入輸出操作所花費的時間(毫秒)。 
@@LANGID               : 返回當前所使用的語言ID值。 
@@LANGUAGE         : 返回當前使用的語言名稱。 
@@LOCK_TIMEOUT: 返回當前會話等待鎖的時間長短其單位為毫秒。 
@@MAX_CONNECTIONS : 返回允許連線到SQL Server的最大連線數目。 
@@MAX_PRECISION : 返回decimal 和 numeric資料型別的精確度。
@@NESTLEVEL         : 返回當前執行的儲存過程的巢狀級數,初始值為0。 
@@OPTIONS              : 返回當前SET選項的資訊。 
@@PACK_RECEIVED : 返回SQL Server通過網路讀取的輸入包的數目。 
@@PACK_SENT         : 返回SQL Server寫給網路的輸出包的數目。 
@@PACKET_ERRORS : 返回網路包的錯誤數目。 
@@PROCID                 : 返回當前儲存過程的ID值。 
@@SERVICENAME   : 返回SQL Server正運行於哪種服務狀態之下:如 MS SQLServer、MSDTC、SQLServerAgent。 
@@SPID                       : 返回當前使用者處理的伺服器處理ID值。 
@@TEXTSIZE             : 返回SET語句的TEXTSIZE選項值SET語句定義了SELECT語句中text或image。資料型別的最大長度基本單位為位元組。 
@@TIMETICKS          : 返回每一時鐘的微秒數。 
@@TOTAL_ERRORS : 返回磁碟讀寫錯誤數目。 
@@TOTAL_READ      : 返回磁碟讀操作的數目。 
@@TOTAL_WRITE    : 返回磁碟寫操作的數目。 
@@TRANCOUNT      : 返回當前連線中處於啟用狀態的事務數目。
-----------------------------------------
函式列表
-----------------------------------------
一.聚合函式
AVG  返回組中值的平均值。空值將被忽略
BINARY_CHECKSUM  返回對錶中的行或表示式列表計算的二進位制校驗值。BINARY_CHECKSUM 可用於檢測表中行的更改
CHECKSUM  返回在表的行上或在表示式列表上計算的校驗值。CHECKSUM 用於生成雜湊索引
CHECKSUM_AGG  返回組中值的校驗值。空值將被忽略
COUNT  返回組中專案的數量
COUNT_BIG  返回組中專案的數量。COUNT_BIG 的使用與 COUNT 函式相似。它們之間的唯一差別是它們的返回值:COUNT_BIG 總是返回 bigint 資料型別值,而 COUNT 則總是返回 int 資料型別值
GROUPING  "是一個聚合函式,它產生一個附加的列,當用 CUBE 或 ROLLUP 運算子新增行時,附加的列輸出值為1,當所新增的行不是由 CUBE 或 ROLLUP 產生時,附加列值為0。
僅在與包含 CUBE 或 ROLLUP 運算子的 GROUP BY 子句相聯絡的選擇列表中才允許分組"
MAX  返回表示式的最大值
MIN  返回表示式的最小值
SUM  返回表示式中所有值的和,或只返回 DISTINCT 值。SUM 只能用於數字列。空值將被忽略
STDEV  返回給定表示式中所有值的統計標準偏差
STDEVP  返回給定表示式中所有值的填充統計標準偏差
VAR  返回給定表示式中所有值的統計方差。
VARP  返回給定表示式中所有值的填充的統計方差。

二.數學函式
ABS  返回給定數字表達式的絕對值
ACOS  返回以弧度表示的角度值,該角度值的餘弦為給定的 float 表示式;本函式亦稱反餘弦。
ASIN  返回以弧度表示的角度值,該角度值的正弦為給定的 float 表示式;亦稱反正弦
ATAN  返回以弧度表示的角度值,該角度值的正切為給定的 float 表示式;亦稱反正切
ATN2  返回以弧度表示的角度值,該角度值的正切介於兩個給定的 float 表示式之間;亦稱反正切
CEILING  返回大於或等於所給數字表達式的最小整數
COS  一個數學函式,返回給定表示式中給定角度(以弧度為單位)的三角餘弦值
COT  一個數學函式,返回給定 float 表示式中指定角度(以弧度為單位)的三角餘切值
DEGREES  當給出以弧度為單位的角度時,返回相應的以度數為單位的角度
EXP  返回所給的 float 表示式的指數值
FLOOR  返回小於或等於所給數字表達式的最大整數
LOG  返回給定 float 表示式的自然對數
LOG10  返回給定 float 表示式的以 10 為底的對數
PI  返回 PI 的常量值
POWER  返回給定表示式乘指定次方的值
RADIANS  對於在數字表達式中輸入的度數值返回弧度值
RAND  返回 0 到1 之間的隨機float 值
ROUND  返回數字表達式並四捨五入為指定的長度或精度
SIGN  返回給定表示式的正 (+1)、零 (0) 或負 (-1) 號
SIN  以近似數字 (float) 表示式返回給定角度(以弧度為單位)的三角正弦值
SQUARE  返回給定表示式的平方
SQRT  返回給定表示式的平方根
TAN  返回輸入表示式的正切值

三.日期函式
DATEADD  在向指定日期加上一段時間的基礎上,返回新的 datetime 值。
DATEDIFF  返回跨兩個指定日期的日期和時間邊界數
DATENAME  返回代表指定日期的指定日期部分的字串
DATEPART  返回代表指定日期的指定日期部分的整數
DAY  返回代表指定日期的天的日期部分的整數
GETDATE  按 datetime 值的 Microsoft® SQL Server™ 標準內部格式返回當前系統日期和時間
GETUTCDATE  返回表示當前 UTC 時間(世界時間座標或格林尼治標準時間)的 datetime 值
MONTH  返回代表指定日期月份的整數
YEAR  返回表示指定日期中的年份的整數


四.系統函式
APP_NAME  返回當前會話的應用程式名稱(如果應用程式進行了設定)。
CASE 表示式  計算條件列表並返回多個可能結果表示式之一(case column when value then value)
CAST 和 CONVERT  將某種資料型別的表示式顯式轉換為另一種資料型別(case():convert())
COALESCE  返回其引數中第一個非空表示式
COLLATIONPROPERTY  返回給定排序規則的屬性
CURRENT_TIMESTAMP  返回當前的日期和時間。此函式等價於 GETDATE()
CURRENT_USER  返回當前的使用者。此函式等價於 USER_NAME()
DATALENGTH  返回任何表示式所佔用的位元組數
@@ERROR  返回最後執行的 Transact-SQL 語句的錯誤程式碼
fn_helpcollations  返回 Microsoft® SQL Server™ 2000 支援的所有排序規則的列表。
fn_servershareddrives  返回由群集伺服器使用的共享驅動器名稱
fn_virtualfilestats  返回對資料庫檔案(包括日誌檔案)的 I/O 統計
FORMATMESSAGE  從 sysmessages 現有的訊息構造訊息。FORMATMESSAGE 與 RAISERROR 語句的功能相似;但 RAISERROR 立即輸出訊息而 FORMATMESSAGE 返回編輯後的資訊供進一步處理
GETANSINULL  返回會話的資料庫的預設為空性。
HOST_ID  返回工作站標識號。
HOST_NAME  返回工作站名稱。
IDENT_CURRENT  返回為任何會話和任何作用域中的指定表最後生成的標識值。 
IDENT_INCR  返回增量值(返回形式為 numeric(@@MAXPRECISION,0)),該值是在帶有標識列的表或檢視中建立標識列時指定的
IDENT_SEED  返回種子值(返回形式為 numeric(@@MAXPRECISION,0)),該值是在帶有標識列的表或檢視中建立標識列時指定的
@@IDENTITY  返回最後插入的標識值
IDENTITY(函式)  只用在帶有 INTO table 子句的 SELECT 語句中,以將標識列插入到新表中。儘管類似,但是 IDENTITY 函式不是與 CREATE TABLE 和 ALTER TABLE 一起使用的 IDENTITY 屬性。(自動採番時可以起到作用)
ISDATE  確定輸入表示式是否為有效的日期
ISNULL  使用指定的替換值替換 NULL
ISNUMERIC  確定表示式是否為一個有效的數字型別
NEWID  建立 uniqueidentifier 型別的唯一值
NULLIF  如果兩個指定的表示式相等,則返回空值。
PARSENAME  返回物件名的指定部分。可以檢索的物件部分有物件名、所有者名稱、資料庫名稱和伺服器名稱
PERMISSIONS  返回一個包含點陣圖的值,表明當前使用者的語句、物件或列許可權。
@@ROWCOUNT  返回受上一語句影響的行數
ROWCOUNT_BIG  返回受執行的最後一個語句影響的行數。該函式的功能與 @@ROWCOUNT 一樣,除非 ROWCOUNT_BIG 的返回型別是 bigint。
SCOPE_IDENTITY  返回插入到同一作用域中的 IDENTITY 列內的最後一個 IDENTITY 值。
SERVERPROPERTY  返回有關伺服器例項的屬性資訊
SESSIONPROPERTY  返回會話的 SET 選項設定
SESSION_USER  是一個 niladic 函式,允許在未指定預設值時將系統為當前會話的使用者名稱提供的值插入到表中。還允許在查詢、錯誤資訊等中使用使用者名稱
STATS_DATE  返回最後一次更新指定索引統計的日期
SYSTEM_USER  返回當前系統使用者名稱
@@TRANCOUNT  返回當前連線的活動事務數
USER_NAME  返回給定標識號的使用者資料庫使用者名稱

五.字元函式
ASCII  返回字元表示式最左端字元的ASCII程式碼值。
CHAR  將intASCII程式碼轉換為字元的字串函式。
CHARINDEX  返回字串中指定表示式的起始位置
DIFFERENCE  以整數返回兩個字元表示式的SOUNDEX值之差。
LEFT  返回字串中從左邊開始指定個數的字元。
LEN  返回給定字串表示式的字元(而不是位元組)個數,其中不包含尾隨空格
LOWER  將大寫字元資料轉換為小寫字元資料後返回字元表示式。
LTRIM  刪除起始空格後返回字元表示式
NCHAR  根據Unicode標準所進行的定義,用給定整數程式碼返回Unicode字元
PATINDEX  返回指定表示式中某模式第一次出現的起始位置;如果在全部有效的文字和字元資料型別中沒有找到該模式,則返回零
REPLACE  用第三個表示式替換第一個字串表示式中出現的所有第二個給定字串表示式
QUOTENAME  返回帶有分隔符的Unicode字串,分隔符的加入可使輸入的字串成為有效的Microsoft®SQLServer™分隔識別符號。
REPLICATE  以指定的次數重複字元表示式
REVERSE  返回字元表示式的反轉。
RIGHT  返回字串中從右邊開始指定個數的字元
RTRIM  截斷所有尾隨空格後返回一個字串
SOUNDEX  返回由四個字元組成的程式碼(SOUNDEX)以評估兩個字串的相似性
SPACE  返回由重複的空格組成的字串
STR  由數字資料轉換來的字元資料
STUFF  刪除指定長度的字元並在指定的起始點插入另一組字元
SUBSTRING  返回字元、binary、text或image表示式的一部分
UNICODE  按照Unicode標準的定義,返回輸入表示式的第一個字元的整數值
UPPER  返回將小寫字元資料轉換為大寫的字元表示式

-----------------------------------------
常用函式用法
-------------------------

判斷刪除臨時表
if OBJECT_ID('tempdb..'+'#TEMP_Product') is not null
DROP TABLE #TEMP_Product
轉換資料為指定位數的值.轉換後沒有多餘的位數0
 select convert(numeric(10,0),1231.5343)
兩個數字做除法保留位數
select convert(numeric(10,3),cast(154 as float)/1000)


日期比較使用DataDiff

1:ASCII(varchar,輸入),UNICODE(nvarchar,輸入)
  說明:得到字元的ASCII碼的整數值和UNIDODE碼的整數值
  select ascii('a')
  /*結果
    97
  */


2:Char(int,輸入),NChar(int,輸入)
   說明:由字元得到相應的ASCII碼和UNICODE字元,當輸入的整數找不到相應的字元時返回NULL
    select char(97)
   /*結果
    a
   */


3:CharIndex(字串1,字串2)
  說明:返回字串1在字串2中的位置,如果字串1不在2中,則返回0
  select charindex('d','abcd')
  /*結果
    4
  */
  select charindex('cd','abcd')
  /*結果
    3
  */
 
  select charindex('dd','abcd')
  /*結果
    0
  */


4:left(string,int)
  說明:返回字串左邊的整數個字元,如果字串的長度小於輸入的整數,則返回所有字串
  select left('abcdef',3)
  /*結果
    abc
  */


5:right(string,int)
  說明:返回字串右邊的整數個字元,如果字串的長度小於輸入的整數,則返回所有字串
  select right('abcdef',3)
  /*結果
    def
  */


6:len(string)
  說明:返回字串中字元的個數
  select len('abcd')
  /*結果
    4
  */


7:lower(string)
  說明:將字串中大寫字元轉換為小寫字元
  select lower('SDSF')
  /*結果
    sdsf
  */


8:upper(string)
  說明:將字串中小寫字元轉換為大寫字元
  select lower('sdsf')
  /*結果
    SDSF
  */


9:rtrim(string)
 說明:刪除字串右邊開始的所有空格
  select rtrim('abcd  ')
  /*結果
    'abcd'
  */


10:ltrim(string)
 說明:刪除字串左邊開始的所有空格
  select rtrim('   abcd')
  /*結果
    'abcd'
  */


11:patindex('%string1%',string2)
   說明:string1在string2中第一次出現的起始位置
   select patindex('%de%','abcdef')
   /*結果
    4
  */


12:replace(string1,string2,string3)
  說明:用string3替換string1中的string2,如果string2不是string1的子字串的話,最終會返回string1
  select replace('abcdef','bcd','xxx')
  /*結果
    'axxxef'
  */


13:stuff(string1,int1,int2,string2)
   說明:用string2替換string1中int1到int2中的這部分字元
   select stuff('abcdef',1,3,'xxx')
   /*結果
    'xxxdef'
   */ 


14:substring(sting,int1,int2)
    說明:返回string中int1到int2中的這部分字元
    select substring('abcdef',2,4)
    /*結果
    'bcde'
    */


15:space(int)
    說明:返回int個空格組成的字串
    select space(10)
    /*結果
    '          '
    */


16:reverse(string)
   說明:將string反轉
    select reverse('abcdef')
    /*結果
      fedcba
    */

--資料操作

   Select --從資料庫表中檢索資料行和列
      Insert --向資料庫表新增新資料行
      Delete --從資料庫表中刪除資料行
      Update --更新資料庫表中的資料

  --資料定義

   Create TABLE --建立一個數據庫表
      Drop TABLE --從資料庫中刪除表
      Alter TABLE --修改資料庫表結構
      Create VIEW --建立一個檢視
      Drop VIEW --從資料庫中刪除檢視
      Create INDEX --為資料庫表建立一個索引
      Drop INDEX --從資料庫中刪除索引
      Create PROCEDURE --建立一個儲存過程
      Drop PROCEDURE --從資料庫中刪除儲存過程
      Create TRIGGER --建立一個觸發器
      Drop TRIGGER --從資料庫中刪除觸發器
      Create SCHEMA --向資料庫新增一個新模式
      Drop SCHEMA --從資料庫中刪除一個模式
      Create DOMAIN --建立一個數據值域
      Alter DOMAIN --改變域定義
      Drop DOMAIN --從資料庫中刪除一個域

  --資料控制

   GRANT --授予使用者訪問許可權
      DENY --拒絕使用者訪問
      REVOKE --解除使用者訪問許可權

  --事務控制

   COMMIT --結束當前事務
      ROLLBACK --中止當前事務
      SET TRANSACTION --定義當前事務資料訪問特徵

  --程式化SQL

   DECLARE --為查詢設定遊標
      EXPLAN --為查詢描述資料訪問計劃
      OPEN --檢索查詢結果開啟一個遊標
      FETCH --檢索一行查詢結果
      CLOSE --關閉遊標
      PREPARE --為動態執行準備SQL 語句
      EXECUTE --動態地執行SQL 語句
      DESCRIBE --描述準備好的查詢  

  ---區域性變數

   declare @id char(10)
      --set @id = '10010001'
      select @id = '10010001'  

  ---全域性變數

  ---必須以@@開頭  

  --IF ELSE

  declare @x int @y int @z int
      select @x = 1 @y = 2 @z=3
      if @x > @y
       print 'x > y' --列印字串'x > y'
      else if @y > @z
       print 'y > z'
      else print 'z > y'
      --CASE
      use pangu
      update employee
      set e_wage =
       case
       when job_level = ’1’ then e_wage*1.08
       when job_level = ’2’ then e_wage*1.07
       when job_level = ’3’ then e_wage*1.06
       else e_wage*1.05
       end
      --WHILE CONTINUE BREAK
      declare @x int @y int @c int
      select @x = 1 @y=1
      while @x < 3
       begin
       print @x --列印變數x 的值
       while @y < 3
       begin
       select @c = 100*@x + @y
       print @c --列印變數c 的值
       select @y = @y + 1
       end
       select @x = @x + 1
       select @y = 1
       end
      --WAITFOR

  --例 等待1 小時2 分零3 秒後才執行Select 語句

  waitfor delay ’01:02:03’
      select * from employee

    --例 等到晚上11 點零8 分後才執行Select 語句

    waitfor time ’23:08:00’


Select  

   select *(列名) from table_name(表名) where column_name operator value ex宿主)
     select * from stock_information where stockid = str(nid)
     stockname = 'str_name'
     stockname like '% find this %'
     stockname like '[a-zA-Z]%' --------- ([]指定值的範圍)
     stockname like '[^F-M]%' --------- (^排除指定範圍)
     --------- 只能在使用like關鍵字的where子句中使用萬用字元)
     or stockpath = 'stock_path'
     or stocknumber < 1000
     and stockindex = 24
     not stocksex = 'man'
     stocknumber between 20 and 100
     stocknumber in(10,20,30)
     order by stockid desc(asc) --------- 排序,desc-降序,asc-升序
     order by 1,2 --------- by列號
     stockname = (select stockname from stock_information where stockid = 4)
     --------- 子查詢
     --------- 除非能確保內層select只返回一個行的值
     --------- 否則應在外層where子句中用一個in限定符
     select distinct column_name form table_name
   --------- distinct指定檢索獨有的列值,不重複
     select stocknumber ,"stocknumber + 10" = stocknumber + 10 from table_name
     select stockname , "stocknumber" = count(*) from table_name group by stockname
     --------- group by 將表按行分組,指定列中有相同的值
     having count(*) = 2 --------- having選定指定的組

   select *
     from table1, table2
where table1.id *= table2.id -------- 左外部連線,table1中有的而table2中沒有得以null表示
     table1.id =* table2.id -------- 右外部連線
     select stockname from table1
     union [all] -------- union合併查詢結果集,all-保留重複行
     select stockname from table2 

   insert 

   insert into table_name (Stock_name,Stock_number) value ("xxx","xxxx"
   value (select Stockname , Stocknumber from Stock_table2)
   -------value為select語句  

   update  

   update table_name set Stockname = "xxx" [where Stockid = 3]
   Stockname = default
   Stockname = null
   Stocknumber = Stockname + 4  

   delete  

   delete from table_name where Stockid = 3
   truncate table_name --------- 刪除表中所有行,仍保持表的完整性
   drop table table_name --------- 完全刪除表 

   alter table -------- 修改資料庫表結構  

   alter table database.owner.table_name add column_name char(2) null ..
   sp_help table_name -------- 顯示錶已有特徵
   create table table_name (name char(20), age smallint, lname varchar(30))
   insert into table_name select -------- 實現刪除列的方法(建立新表)
   alter table table_name drop constraint Stockname_default
   --------- 刪除Stockname的default約束


常用函式(function)  

轉換函式

convert(資料型別,值,格式)

  統計函式

  AVG --求平均值
  COUNT --統計數目
  MAX --求最大值
  MIN --求最小值
  SUM --求和 

  AVG

  use pangu
  select avg(e_wage) as dept_avgWage
  from employee
  group by dept_id  

  MAX

  --求工資最高的員工姓名
  use pangu
  select e_name
  from employee
  where e_wage =
   (select max(e_wage)
   from employee)  

  STDEV()

  --STDEV()函式返回表示式中所有資料的標準差
  --STDEVP()
  --STDEVP()函式返回總體標準差  

  VAR()

  --VAR()函式返回表示式中所有值的統計變異數  

  VARP()

  --VARP()函式返回總體變異數  

  算術函式  

  三角函式

  SIN(float_expression) --返回以弧度表示的角的正弦
  COS(float_expression) --返回以弧度表示的角的餘弦
  TAN(float_expression) --返回以弧度表示的角的正切
  COT(float_expression) --返回以弧度表示的角的餘切

  反三角函式

  ASIN(float_expression) --返回正弦是FLOAT 值的以弧度表示的角
  ACOS(float_expression) --返回餘弦是FLOAT 值的以弧度表示的角
  ATAN(float_expression) --返回正切是FLOAT 值的以弧度表示的角
  ATAN2(float_expression1,float_expression2)
   ------返回正切是float_expression1 /float_expres-sion2的以弧度表示的角
  DEGREES(numeric_expression)
   ------把弧度轉換為角度返回與表示式相同的資料型別可為
   ------INTEGER/MONEY/REAL/FLOAT 型別
  RADIANS(numeric_expression)
------把角度轉換為弧度返回與表示式相同的資料型別可為

   ------INTEGER/MONEY/REAL/FLOAT 型別
  EXP(float_expression) --返回表示式的指數值
  LOG(float_expression) --返回表示式的自然對數值
  LOG10(float_expression)--返回表示式的以10 為底的對數值
  SQRT(float_expression) --返回表示式的平方根

  取近似值函式

  CEILING(numeric_expression)
-------返回>=表示式的最小整數返回的資料型別與表示式相同可為
   -------INTEGER/MONEY/REAL/FLOAT 型別
  FLOOR(numeric_expression)
-------返回<=表示式的最小整數返回的資料型別與表示式相同可為
   -------INTEGER/MONEY/REAL/FLOAT 型別
  ROUND(numeric_expression)
-------返回以integer_expression 為精度的四捨五入值返回的資料
   -------型別與表示式相同可為INTEGER/MONEY/REAL/FLOAT 型別
  ABS(numeric_expression)
-------返回表示式的絕對值返回的資料型別與表示式相同可為
   -------INTEGER/MONEY/REAL/FLOAT 型別
  SIGN(numeric_expression)
-------測試引數的正負號返回0 零值1 正數或-1 負數返回的資料型別
   -------與表示式相同可為INTEGER/MONEY/REAL/FLOAT 型別
  PI() -------返回值為π 即3.1415926535897936
  RAND([integer_expression])
-------用任選的[integer_expression]做種子值得出0-1 間的隨機浮點數


字串函式

  ASCII() ------函式返回字元表示式最左端字元的ASCII 碼值
  CHAR() ------函式用於將ASCII 碼轉換為字元
   ------如果沒有輸入0 ~ 255 之間的ASCII 碼值CHAR 函式會返回一個NULL 值
  LOWER() ------函式把字串全部轉換為小寫
  UPPER() ------函式把字串全部轉換為大寫
  STR() ------函式把數值型資料轉換為字元型資料
  LTRIM() ------函式把字串頭部的空格去掉
  RTRIM() ------函式把字串尾部的空格去掉
  LEFT(),RIGHT(),SUBSTRING() --函式返回部分字串
  CHARINDEX(),PATINDEX() --函式返回字串中某個指定的子串出現的開始位置
  SOUNDEX() ------函式返回一個四位字元碼
   ------SOUNDEX函式可用來查詢聲音相似的字串但SOUNDEX函式對數字和漢字均只返回0 值
  DIFFERENCE() ------函式返回由SOUNDEX 函式返回的兩個字元表示式的值的差異
   ------0 兩個SOUNDEX 函式返回值的第一個字元不同
   ------1 兩個SOUNDEX 函式返回值的第一個字元相同
   ------2 兩個SOUNDEX 函式返回值的第一二個字元相同
   ------3 兩個SOUNDEX 函式返回值的第一二三個字元相同
   ------4 兩個SOUNDEX 函式返回值完全相同同
  QUOTENAME() ------函式返回被特定字元括起來的字串

  /**//*select quotename('abc', '{') quotename('abc')
  執行結果如下

  {
  {abc} [abc]*/
  REPLICATE() ------函式返回一個重複character_expression 指定次數的字串
  /**//*select replicate('abc', 3) replicate( 'abc', -2)

  執行結果如下

  abcabcabc NULL*/
  REVERSE() ------函式將指定的字串的字元排列順序顛倒
  REPLACE() ------函式返回被替換了指定子串的字串
  /**//*select replace('abc123g', '123', 'def')

  執行結果如下
  
  abcdefg*/  

  SPACE() ------函式返回一個有指定長度的空白字串
  STUFF() ------函式用另一子串替換字串指定位置長度的子串  

  資料型別轉換函式

  CAST() 函式語法如下
  CAST() ( AS [ length ])
  CONVERT() 函式語法如下
  CONVERT() ([ length ], [, style])
  select cast(100+99 as char) convert(varchar(12), getdate())

  執行結果如下
  199 Jan 15 2000 

  日期函式

  DAY() ------函式返回date_expression 中的日期值
  MONTH() ------函式返回date_expression 中的月份值
  YEAR() ------函式返回date_expression 中的年份值
  DATEADD( , ,)
   -----函式返回指定日期date 加上指定的額外日期間隔number 產生的新日期
  DATEDIFF( , ,)
   -----函式返回兩個指定日期在datepart 方面的不同之處

  DATENAME( , ------函式以字串的形式返回日期的指定部分
  DATEPART( , ------函式以整數值的形式返回日期的指定部分
  GETDATE() ------函式以DATETIME 的預設格式返回系統當前的日期和時間  

  系統函式

  APP_NAME() ------函式返回當前執行的應用程式的名稱
  COALESCE() -----函式返回眾多表達式中第一個非NULL 表示式的值
  COL_LENGTH(<'table_name'>, <'column_name'> ----函式返回表中指定欄位的長度值
  COL_NAME(, ----函式返回表中指定欄位的名稱即列名
  DATALENGTH() -----函式返回資料表示式的資料的實際長度
  DB_ID(['database_name']) ------函式返回資料庫的編號
  DB_NAME(database_id) ------函式返回資料庫的名稱
  HOST_ID() -----函式返回伺服器端計算機的名稱
  HOST_NAME() -----函式返回伺服器端計算機的名稱
  IDENTITY([, seed increment]) [AS column_name])
   --IDENTITY() 函式只在Select INTO 語句中使用用於插入一個identity column列到新表中
  /**//*select identity(int, 1, 1) as column_name
   into newtable
   from oldtable*/

  ISDATE() ----函式判斷所給定的表示式是否為合理日期
  ISNULL(, --函式將表示式中的NULL 值用指定值替換
  ISNUMERIC() ----函式判斷所給定的表示式是否為合理的數值
  NEWID() ----函式返回一個UNIQUEIDENTIFIER 型別的數值
  NULLIF(,
   ----NULLIF 函式在expression1 與expression2 相等時返回NULL 值若不相等時則返回xpression1 的值

日期處理
1、日期格式化處理

DECLARE @dt datetime
SET @dt=GETDATE()

--1.短日期格式:yyyy-m-d
SELECT REPLACE(CONVERT(varchar(10),@dt,120),N'-0','-')

--2.長日期格式:yyyy年mm月dd日
--A. 方法1
SELECT STUFF(STUFF(CONVERT(char(8),@dt,112),5,0,N'年'),8,0,N'月')+N'日'
--B. 方法2
SELECT DATENAME(Year,@dt)+N'年'+DATENAME(Month,@dt)+N'月'+DATENAME(Day,@dt)+N'日'

--3.長日期格式:yyyy年m月d日
SELECT DATENAME(Year,@dt)+N'年'+CAST(DATEPART(Month,@dt) AS varchar)+N'月'+DATENAME(Day,@dt)+N'日'

--4.完整日期+時間格式:yyyy-mm-dd hh:mi:ss:mmm
SELECT CONVERT(char(11),@dt,120)+CONVERT(char(12),@dt,114)

2、日期推算處理

DECLARE @dt datetime
SET @dt=GETDATE()

DECLARE @number int
SET @number=3

--1.指定日期該年的第一天或最後一天
--A. 年的第一天
SELECT CONVERT(char(5),@dt,120)+'1-1'

--B. 年的最後一天
SELECT CONVERT(char(5),@dt,120)+'12-31'


--2.指定日期所在季度的第一天或最後一天
--A. 季度的第一天
SELECT CONVERT(datetime,
CONVERT(char(8),
DATEADD(Month,
DATEPART(Quarter,@dt)*3-Month(@dt)-2,
@dt),
120)+'1')

--B. 季度的最後一天(CASE判斷法)
SELECT CONVERT(datetime,
CONVERT(char(8),
DATEADD(Month,
DATEPART(Quarter,@dt)*3-Month(@dt),
@dt),
120)
+CASE WHEN DATEPART(Quarter,@dt) in(1,4)
THEN '31'ELSE '30' END)

--C. 季度的最後一天(直接推演算法)
SELECT DATEADD(Day,-1,
CONVERT(char(8),
DATEADD(Month,
1+DATEPART(Quarter,@dt)*3-Month(@dt),
@dt),
120)+'1')


--3.指定日期所在月份的第一天或最後一天
--A. 月的第一天
SELECT CONVERT(datetime,CONVERT(char(8),@dt,120)+'1')

--B. 月的最後一天
SELECT DATEADD(Day,-1,CONVERT(char(8),DATEADD(Month,1,@dt),120)+'1')

--C. 月的最後一天(容易使用的錯誤方法)
SELECT DATEADD(Month,1,DATEADD(Day,-DAY(@dt),@dt))


--4.指定日期所在周的任意一天
SELECT DATEADD(Day,@number-DATEPART(Weekday,@dt),@dt)


--5.指定日期所在周的任意星期幾
--A.  星期天做為一週的第1天
SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)[email protected]@DATEFIRST-1)%7,@dt)

--B.  星期一做為一週的第1天
SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)[email protected]@DATEFIRST-2)%7-1,@dt)

 =======================================================================

--事務程式設計經典例子
--
begin transaction是開始事務,commit transaction是提交事務,rollback transaction是回滾事務
--
這個例子是先插入一條記錄,如果出現錯誤的話就回滾事務,也就是取消,並直接return(返回),如果沒錯的話就commit 提交這個事務了哦
--
上面的那個return返回可以返回一個整數值,如果這個值是0的話就是執行的時候沒出錯,如果出錯了就是一個負數,
--
這個return也可以用在儲存過程中,可用用 exec @return_status= pro_name來獲取這個值use pubs
gobegintran mytran
insertinto stores(stor_id,stor_name)
values('333','my books')
goinsertinto discounts(discounttype,stor_id,discount)
values('清倉甩賣','9999',50.00)
if@@error<>0beginrollbacktran mytran
print'插入打折記錄出錯'returnendcommittran mytran

--事務處理的儲存點示例
--
做了事務儲存點後可以rollback(回滾)到指定的儲存點,不至於所有的操作都不能用use pubs
goselect*from stores
begintransaction testsavetran
insertinto stores(stor_id,stor_name)
values('1234','W.Z.D Book')
savetransaction before_insert_data2
goinsertinto stores(stor_id,stor_name)
values('5678','foreat Books')
gorollbacktransaction before_insert_data2
select*from stores

--儲存儲存過程use pubs
ifexists(select name from sysobjects where name='proc_calculate_taxes'and type='P')
dropprocedure proc_calculate_taxes
gocreateprocedure proc_calculate_taxes (@p1smallint=42,@p2char(1),@p3varchar(8)='char')
asselect*from titles
--執行過程EXECUTE PROC_CALCULATE_TAXES @P2='A'=============create function 語法====================================CREATE FUNCTION  名稱(@ID VARCHAR(10))
RETURNS varchar(8000)
AS
BEGIN
 declare @i int,@ret varchar(8000)
    declare @t table(ID VARCHAR(10),PID VARCHAR(10),Level INT)
    set @i = 1
    insert into @t select CategoryID,ParentCategoryID,@i from Category where CategoryID = @ID
   
    while @@rowcount<>0
    begin
        set @i = @i + 1
       
        insert into @t
        select
            a.CategoryID,a.ParentCategoryID,@i
        from
            Category a,@t b
        where
            a.CategoryID=b.PID and b.Level = @i-1
    end
   
    select @ret = isnull(@ret,'')+ID+',' from @t order by Level
   
    return @ret
END