sql server 學習教程

SQL Server 系統數據庫

在我們安裝 SQL Server 的時候,會自動創建下面的四個數據庫。

master

master 數據庫記錄了所有的 SQL Server 數據庫系統的系統級信息,如用戶帳戶,配置設置,並在所有其他數據庫信息。

model

model 數據庫是一個模板數據庫。每當創建一個新的數據庫(包括系統數據庫的TempDB),會創建一個以 Model 數據庫爲副本數據庫,並更改成你創建數據庫時所用的名稱。

msdb

msdb 數據庫是 SQL Server 代理的數據庫,用於配置警報使用 SQL Server 代理和預定作業等。

tempdb

tempddb 數據庫是由 SQL Server 用於暫時存儲數據的,這其中包含所有臨時表,臨時存儲過程,並通過 SQL Server 生成任何其他臨時存儲需求。
這些系統數據庫有它們特有的用處,系統數據庫是我們新建數據庫的模板。
SQL Server 是不區分大小寫的

索引

參考文獻:https://www.cnblogs.com/kissdodog/archive/2013/06/12/3133345.html
https://segmentfault.com/a/1190000016560785

定義

拿漢語字典的目錄頁(索引)打比方:正如漢語字典中的漢字按頁存放一樣,SQL Server中的數據記錄也是按頁存放的,每頁容量一般爲4K 。爲了加快查找的速度,漢語字(詞)典一般都有按拼音、筆畫、偏旁部首等排序的目錄(索引),我們可以選擇按拼音或筆畫查找方式,快速查找到需要的字(詞)。

同理,SQL Server允許用戶在表中創建索引,指定按某列預先排序,從而大大提高查詢速度。

索引:是SQL Server編排數據的內部方法。它爲SQL Server提供一種方法來編排查詢數據 。
索引頁:數據庫中存儲索引的數據頁;索引頁類似於漢語字(詞)典中按拼音或筆畫排序的目錄頁。

分類

唯一索引

唯一索引不允許兩行具有相同的索引值。
提示:創建了唯一約束,將自動創建唯一索引。儘管唯一索引有助於找到信息,但爲了獲得最佳性能,建議使用主鍵約束或唯一約束。

主鍵索引

爲表定義一個主鍵將自動創建主鍵索引,主鍵索引是唯一索引的特殊類型。主鍵索引要求主鍵中的每個值是唯一的,並且不能爲空。

在數據庫關係圖中爲表定義一個主鍵將自動創建主鍵索引,主鍵索引是唯一索引的特殊類型。主鍵索引要求主鍵中的每個值是唯一的。當在查詢中使用主鍵索引時,它還允許快速訪問數據。

聚集索引(Clustered)

表中各行的物理順序與鍵值的邏輯(索引)順序相同,每個表只能有一個。例如:漢語字(詞)典默認按拼音排序編排字典中的每頁頁碼。拼音字母a,b,c,d……x,y,z就是索引的邏輯順序,而頁碼1,2,3……就是物理順序。默認按拼音排序的字典,其索引順序和邏輯順序是一致的。即拼音順序較後的字(詞)對應的頁碼也較大。如拼音“ha”對應的字(詞)頁碼就比拼音“ba” 對應的字(詞)頁碼靠後。

非聚集索引(Non-clustered)

非聚集索引指定表的邏輯順序。數據存儲在一個位置,索引存儲在另一個位置,索引中包含指向數據存儲位置的指針。可以有多個,小於249個。

如果不是聚集索引,表中各行的物理順序與鍵值的邏輯順序不匹配。聚集索引比非聚集索引(nonclustered index)有更快的數據訪問速度。例如,按筆畫排序的索引就是非聚集索引,“1”畫的字(詞)對應的頁碼可能比“3”畫的字(詞)對應的頁碼大(靠後)。

提示:SQL Server中,一個表只能創建1個聚集索引,多個非聚集索引。設置某列爲主鍵,該列就默認爲聚集索引

作用

通過使用索引,可以大大提高數據庫的檢索速度,改善數據庫性能。

優點

1、 通過創建唯一索引,可以保證數據庫表的每一行數據的唯一性。
2、 可以大大加快數據的查詢速度,這也是創建索引的最主要的原因。
3、 實現數據的參照完整性,可以速表和表之間的連接。
4、 在使用分組和排序子句進行查詢時,也可以顯著減少查詢中分組和排序的時間。

缺點

1、 創建索引和維護索引要耗費時間,並且隨着數據量的增加所耗費的時間也會增加。
2、 索引需要佔磁盤空間,除了數據表佔數據空間之外,每一個索引還要佔一定的物理空間,如果有大量的索引,索引文件可能比數據文件更快達到做大文件尺寸。
3、 當對錶中的數據進行增加,刪除和修改的時候,索引也要動態地維護,這樣就就降低了數據的維護速度。

創建索引的原則

1、 該列用於頻繁搜索。
2、 該列用於對數據進行排序。
3、 請不要使用下面的列創建索引:
3.1、列中僅包含幾個不同的值。
3.2、表中僅包含幾行。爲小型表創建索引可能不太划算,因爲SQL Server在索引中搜索數據所花的時間比在表中逐行搜索所花的時間更長。

創建索引

CREATE   [UNIQUE]   [CLUSTERED | NONCLUSTERRED]
INDEX    index_name   ON {table | view }(column [ASC | DESC ]  [,...n])
[ INCLUDE ( column_name [ ,...n])]
[with 
(
PAD_INDEX={ON | OFF}
|  FILLFACTOR =fillfactor
|  SORT_IN_TEMPDB={ ON | OFF}
|  IGNORE_DUP_KEY ={ ON  | OFF}
|  STATISRICS_NORECOMPUTE ={ ON | OFF}
|   DROP_EXISTING = { ON | OFF}
|  ONLINE ={ ON | OFF}
|  ALLOW_ROW_LOCKS ={ ON | OFF}
|  ALLOW_PAGE_LOCKS={ ON   | OFF}
|  MAXDOP =max_degree_of_parallelism
)  [,...n]]

UNIQUE:表示在表或視圖上創建唯一索引。唯一索引不允許兩行具有相同的索引鍵值。視圖的聚集索引必須唯一。

CLUSTERED:表示創建聚集索引,在創建任何非聚集索引之前創建聚集索引,創建聚集索引時會重新生成表中現有的非聚集索引。如果沒有指定CLUSTERED,則創建非聚集索引。

NONCLUSTERED:表示創建一個非聚集索引,非聚集索引數據行的物理順序獨立於與索引排序,每個表最多可包含999個非聚集索引,NONCLUSTERED是CREATE INDEX的默認值。

index_name:指定索引的名稱,索引名稱在表或視圖中必須唯一,但在數據庫中可不必唯一。

ON{table | view }:指定索引所屬的表或視圖。

Column:指定索引基於一列或者多列。指定兩個或者多個列名,可爲指定的列的組合值創建組合索引,{table | view}後的括號中,按排序優先級列出組合索引要包括的列。一個組合索引鍵中最多可組合16列。組合索引鍵中的所有列必須在同一個表或視圖中。

INCLUDE(column[,…n]):指定要添加到非聚集索引的葉級別的非鍵列。

PAD_INDEX:表示指定索引填充,默認值爲OFF。ON值表示fillfactor指定的可用空間百分比應用於索引的中間級頁。

FILLFACTOR=fillfactor:制定一個百分比,表示在索引創建或重新生成過程中數據庫引擎應使每個索引頁的葉級別達到的填充程度。fillfactor必須爲介於1至100直接的整數值,默認值爲0;

SORT_IN_TESTDB:指定是否在tempdb中存儲臨時排序結果,默認值爲OFF,ON值表示在tempdb中存儲用於生成索引的中間排序結果,OFF表示中間排序結果與索引存儲在同一數據庫中。

IGNORE_DUP_KEY:指定唯一聚集索引或唯一非聚集索引執行多行插入操作時,出現重複鍵值的錯誤響應。默認值爲OFF。ON表示發出一跳警告消息,但只有違反了唯一索引的行纔會失敗,OFF表示發出錯誤消息,並回滾整個INSERT事物。

STATISRICS_NORECOMPUTE:指定是否重新計算分發統計信息,默認值爲OFF。ON表示不會自動重新計算過時的統計信息,OFF表示啓用統計信息自動更新功能。

DROP_EXISTING:指定刪除並重新生成已命名的先前存在的聚集或非聚集索引。默認值爲OFF。ON表示刪除並重新生成現有索引。指定的索引名稱必須與當前現有的索引相同,但可以修改索引定義,例如:可以指定不同的列,排序順序,分區方案或索引選項。OFF表示如果指定的索引名已存在,則會顯示一條錯誤。

ONLINE={ON | OFF}:指定在索引操作期間,基礎表和關聯的索引是否用於查詢和數據修改操縱,默認值爲OFF。

ALLOW_ROW_LOCKS:指定是否允許行鎖,默認值爲ON,ON表示在訪問索引時允許行所。數據庫引擎確定何時使用行鎖。OFF表示未使用行鎖。

ALLOW_PAGE_LOCKS:指定是否允許頁鎖,默認值爲ON,ON表示在訪問索引時允許頁鎖。數據庫引擎確定何時使用頁鎖。OFF表示未使用頁鎖。

MAXDOP:指定在索引操作期間,覆蓋【最大並行度】配置選項,使用MAXDOP可以限制在執行並行計劃的過程中使用的處理器數量,最大數量爲64.

【例】在teacher表中的t_phone列上,創建一個名稱爲Idx_phone的唯一聚集索引,降序排列,填充因子爲30%,輸入語句如下:

CREATE  UNIQUE  CLOSTERED  INDEX  Idx_phone
ON  teacher (t_phone  DESC)
WITH
FILLFACTOR=30;

修改索引

ALTER INDEX {<name of index> | ALL}
ON<table or view name>
{ REBUILD
[[ WITH (
[PAD_INDEX = {ON | OFF}]
| [[,] FILLFACTOR = <fillfactor>
| [[,] SORT_IN_TEMPDB = { ON | OFF }]
| [[,] IGNORE_DUP_KEY = { ON | OFF }]
| [[,] STATISTICS_NORECOMPUTE = { ON | OFF }]
| [[,] ONLINE = { ON| OFF }]
| [[,] ALLOW_ROW_LOCKS = { ON | OFF }]
| [[,] ALLOW_PAGE_LOCKS = { ON | OFF }]
| [[,] MAXDOP = <max degree of parallelism>
)]
|[ PARTITION = <partition number>
[ WITH (< partition rebuild index option>
[,...N])]]]
| DISABLE
| REORGANIZE
[ PARTITION = <partition number> ]
[ WITH (LOB_COMPACTION = { ON | OFF })]
| SET ([ ALLOW_ROW_LOCKS = { ON | OFF} ]
| [[,] ALLOW_PAGE_LOCKS = { ON | OFF } ]
| [[,] IGNORE_DUP_KEY = { ON | OFF } ]
| [[,] STATISTICS_NORECOMPUTE = { ON | OFF }]
)
}[;]

刪除索引

DROP  INDEX  '[table | view ].  index' [,...n]
或者
DROP  INDEX    ' index'  ON   '[table | view ].index' 

index:用於指定要刪除的索引名稱。

注意:DROP INDEX 命令不能刪除由 CREATE TABLE或者ALTER TABLE命令創建的主鍵(PRIMARY KEY)或者唯一性(UNIQUE)約束索引,也不能刪除系統表重的索引。

【例】刪除表teacher中的索引 multi_index,如下:

USE  sample_db;
GO
exec   sp_helpindex   'teacher'
DROP   INDEX   teacher.multi_index
Exec    sp_helpindex   'teacher';

查看索引

用系統存儲過程查看索引信息
系統存儲過程sp_helpindex可以返回某個表或視圖中的索引信息,語法如下:
sp_helpindex [@objectname= ] ‘name’;

[@objectname=] ‘name’:用戶定義的表或視圖的限定或非限定名稱。僅當指定限定的表或視圖名稱時,才需要使用引號。如果提供了完全限定的名稱,包括數據庫名稱,則該數據庫名稱必須是當前數據庫的名稱。

【例】使用存儲過程查看是 sample_db數據庫中teacher表中定義的索引信息,輸入語句如下。

USE  sample_db; 
GO
exec sp_helpindex 'teacher';

視圖

從用戶角度來看,一個視圖是從一個特定的角度來查看數據庫中的數據 。

從數據庫系統內部來看,一個視圖是由 SELECT 語句組成的查詢定義的虛擬表(因爲一個視圖可以拉動多個表,並彙總數據在一起並將其顯示,就好像它是一個單一的表)

視圖是由一張或多張表中的數據組成的,當你運行視圖,會看到它的結果,就像打開一個表時一樣。

從數據庫系統外部來看,視圖就如同一張表一樣,對錶能夠進行的一般操作都可以應用於視圖,例如查詢,插入,修改,刪除操作等。但是視圖屬於虛擬表,只能查詢數據,不能對其數據進行修改,插入,刪除等操作。

創建視圖

通過使用 CREATE VIEW 語句創建一個視圖,其次是 SELECT 語句,如下:

CREATE  VIEW  ViewName  AS
SELECT ...

查詢視圖

查詢視圖就像是查詢數據庫表數據一樣。 如下:

SELECT  *  FROM  ViewName;

修改視圖

通過使用 ALTER 修改現有的視圖,而不是 CREATE。

如果我們想要更改視圖就要使用 StatusName 字段,而不是 StatusId,做法如下:

ALTER VIEW ToDoList AS
SELECT	Tasks.TaskName, Tasks.Description
FROM	Status INNER JOIN
			Tasks ON Status.StatusId = Tasks.StatusId
WHERE	(Status.StatusName = 'To Do')

刪除視圖

drop  view  ViewName;

注:使用查詢設計器也可以右鍵單擊視圖,然後選擇設計來修改您的視圖。
正如你所看到的,視圖讓您保存查詢,以便可以做一個 SELECT,再次運行它也會比較簡單。
但它們的確有其侷限性:它們允許選擇數據,但不允許執行任何業務邏輯,如條件語句等。

存儲過程

參考文獻:https://www.w3cschool.cn/sql/sql-storage.html

視圖通過簡單的SELECT查詢來解決複雜的查詢,但是視圖不能提供業務邏輯功能,而存儲過程可以辦到這點。

定義

存儲過程 Procedure 是一組爲了完成特定功能的 SQL 語句集合,經編譯後存儲在數據庫中,用戶通過指定存儲過程的名稱並給出參數來執行。

存儲過程中可以包含邏輯控制語句和數據操縱語句,它可以接受參數、輸出參數、返回單個或多個結果集以及返回值。

由於存儲過程在創建時即在數據庫服務器上進行了編譯並存儲在數據庫中,所以存儲過程運行要比單個的 SQL 語句塊要快。同時由於在調用時只需用提供存儲過程名和必要的參數信息,所以在一定程度上也可以減少網絡流量、簡單網絡負擔。

優點

1、 存儲過程只在創造時進行編譯,以後每次執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高數據庫執行速度,效率要比T-SQL語句高。
2、 當對數據庫進行復雜操作時,可將此複雜操作用存儲過程封裝起來與數據庫提供的事務處理結合一起使用。
3、 一個存儲過程在程序在網絡中交互時可以替代大堆的T-SQL語句,所以也能降低網絡的通信量,提高通信速率。
4、 存儲過程可以重複使用,可減少數據庫開發人員的工作量。
5、 安全性高,可設定只有某些用戶才具有對指定存儲過程的使用權。
在這裏插入圖片描述

創建存儲過程

我們需要使用 CREATE PROCEDURE 語句創建一個存儲過程,接着要補充存儲過程的代碼,如果存儲過程將要接受參數,它們需要被包括在名稱後,如下:

CREATE  PROCEDURE  ProcedureName  AS
OR
CREATE  PROCEDURE  ProcedureName  @{Parameter Name} {data type}  AS

執行存儲過程

創建了存儲過程後,要在任何時候執行它,可以執行或者調用 EXEC。如果存儲過程的參數要求提供這些程序名在後面,像這樣:

EXECUTE  ProcedureName 
EXEC  ProcedureName  
EXEC  ProcedureName  @Parameter = 5

修改存儲過程

如果需要修改現有的存儲過程,只需更換掉 CREATE ,使用 ALTER。

我們在 “Latest” 和 “Tasks”間添加一個空格(即“Latest Tasks”),並添加描述字段,如下:

ALTER PROCEDURE  ProcedureName  @Count int AS
SET ROWCOUNT @Count
SELECT TaskName AS "Latest Tasks", Description, DateCreated
FROM Tasks
ORDER BY DateCreated DESC

刪除存儲過程

drop  procedure  ProcedureName ;

觸發器

定義

觸發器是一種特殊類型的存儲過程,它在您使用一種或多種數據修改操作(UPDATE、INSERT 或 DELETE)來修改指定表中的數據時運行。

優點

1、 觸發器是自動的。當對錶中的數據做了任何修改之後立即被激活。
2、 觸發器可以通過數據庫中的相關表進行層疊修改。
3、 觸發器可以強制限制。這些限制比用CHECK約束所定義的更復雜。與CHECK約束不同的是,觸發器可以引用其他表中的列。

作用

觸發器的主要作用就是其能夠實現由主鍵和外鍵所不能保證的複雜參照完整性和數據的一致性,它能夠對數據庫中的相關表進行級聯修改,提高比CHECK約束更復雜的的數據完整性,並自定義錯誤消息。觸發器的主要作用主要有以下接個方面:
1、 強制數據庫間的引用完整性。
2、 級聯修改數據庫中所有相關的表,自動觸發其它與之相關的操作。
3、 跟蹤變化,撤銷或回滾違法操作,防止非法修改數據。
4、 返回自定義的錯誤消息,約束無法返回信息,而觸發器可以。
5、 觸發器可以調用更多的存儲過程。

分類

DML(數據操作語言,Data Manipulation Language)觸發器

DML觸發器是一些附加在特定表或視圖上的操作代碼,當數據庫服務器中發生數據操作語言事件時執行這些操作。SQL Server中的DML觸發器有三種:
1、 insert觸發器: 向表中插入數據時被觸發;
2、 delete觸發器:從表中刪除數據時被觸發;
3、 update觸發器:修改表中數據時被觸發。

DDL(數據定義語言,Data Definition Language)觸發器

DDL觸發器是當服務器或者數據庫中發生數據定義語言(主要是以create,drop,alter開頭的語句)事件時被激活使用,使用DDL觸發器可以防止對數據架構進行的某些更改或記錄數據中的更改或事件操作。

登錄觸發器

登錄觸發器將爲響應 LOGIN 事件而激發存儲過程。與SQL Server實例建立用戶會話時將引發此事件。登錄觸發器將在登錄的身份驗證階段完成之後且用戶會話實際建立之前激發。因此,來自觸發器內部且通常將到達用戶的所有消息(例如錯誤消息和來自PRINT語句的消息)會傳送到SQL Server錯誤日誌。如果身份驗證失敗,將不激發登錄觸發器。

注意

Instead of 和 After觸發器。這兩種觸發器的差別在於他們被激活的同:
Instead of觸發器用於替代引起觸發器執行的T-SQL語句。除表之外,Instead of 觸發器也可以用於視圖,用來擴展視圖可以支持的更新操作。
After觸發器在一個Insert,Update或Deleted語句之後執行,進行約束檢查等動作都在After觸發器被激活之前發生。After觸發器只能用於表。
一個表或視圖的每一個修改動作(insert,update和delete)都可以有一個instead of 觸發器,一個表的每個修改動作都可以有多個After觸發器。

工作原理

觸發器觸發時,系統自動在內存中創建臨時表(inserted表或者deleted表);該表只讀,不允許修改,觸發器執行完成後,自動刪除臨時表。
在這裏插入圖片描述

創建觸發器

CREATE   TRIGGER   TriggerName
  ON   { TableName | ViewName }
[ WITH ENCRYPTION ]  //用於加密觸發器 ,可以省略
{  FOR  | AFTER  |  INSTEAD  OF }   [INSERT | UPDATE | DELETE]
AS
BEGIN 
/*  執行的sql 語句  */
END 

修改觸發器

ALTER   TRIGGER   TriggerName
  ON   { TableName | ViewName }
[ WITH ENCRYPTION ]  //用於加密觸發器 ,可以省略
{  FOR  | AFTER  |  INSTEAD  OF }   [INSERT | UPDATE | DELETE]
AS
BEGIN 
/*  執行的sql 語句  */
END 

禁用觸發器

DISABLE  TRIGGER  TriggerName
  ON   { TableName | ViewName }

啓用觸發器

ENABLE  TRIGGER  TriggerName
  ON   { TableName | ViewName }

查詢已存在的觸發器

select * from sys.triggers;
select * from sys.objects where type = 'TR';

查看觸發器觸發事件

select  te.* , t.* from sys.trigger_events te 
join sys.triggers t  on t.object_id = te.object_id

查看創建觸發器語句

exec  sp_helptext  'trigger_name';

刪除觸發器

drop trigger trigger_name

作業

參考文獻:https://www.cnblogs.com/kerrycode/p/3279559.html
創建/修改 定時作業:https://jingyan.baidu.com/article/adc81513be3423f722bf7351.html
查看 定時作業 執行歷史記錄:
https://jingyan.baidu.com/article/0f5fb099efaa2c6d8334eae5.html

備份:https://jingyan.baidu.com/article/46650658e78e82f549e5f8c8.html
自動備份:https://www.cnblogs.com/punkrocker/p/11337149.html
備份/還原:https://docs.microsoft.com/zh-cn/sql/relational-databases/backup-restore/back-up-and-restore-of-sql-server-databases?view=sql-server-ver15

同步(一主多從)

項目讀寫分離,修改主表數據,同步從表數據
參考文獻:https://jingyan.baidu.com/article/73c3ce2844c43be50343d9d4.html
https://blog.csdn.net/weixin_34146410/article/details/92407244?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-5
https://www.cnblogs.com/zhengcheng/p/4492423.html

注意:後期文檔需要提交

鏈接服務器

參考文獻:https://www.w3cschool.cn/sqlserver/sqlserver-xy1g28p7.html

SQL Server 中存在可以鏈接到其他服務器的選項,一般情況下是用來與別的 SQL Server 數據庫相連接,但是有時候也可以與一個Microsoft Access數據庫 相連接。這樣的操作是通過鏈接服務器節點實現的。

鏈接服務器節點可以連接到另一個數據庫,通常/通常在不同的機器上運行,也許在不同的城市/國家。如果您需要執行分佈式查詢(查詢遠程數據庫),這可能是有用的。

設置鏈接服務器就是相當於使用簡單的 SQL Server 管理套件,所有需要的就是查詢遠程服務器的詳細信息,以及數據庫。

創建鏈接服務器

exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '遠程服務器名或ip地址 '
exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用戶名 ', '密碼 '

查詢示例

select * from ITSV.數據庫名.dbo.表名

導入示例

select * into 表 from ITSV.數據庫名.dbo.表名

以後不再使用時刪除鏈接服務器

exec sp_dropserver 'ITSV ', 'droplogins '

連接遠程/局域網數據

openrowset

查詢示例:

select * from openrowset( 'SQLOLEDB ', 'sql服務器名 '; '用戶名 '; '密碼 ',數據庫名.dbo.表名)

生成本地表:

select * into 表 from openrowset( 'SQLOLEDB ', 'sql服務器名 '; '用戶名 '; '密碼 ',數據庫名.dbo.表名)

把本地表導入遠程表:

insert openrowset( 'SQLOLEDB ', 'sql服務器名 '; '用戶名 '; '密碼 ',數據庫名.dbo.表名)
select *from 本地表

更新本地表:

update b
set b.列A=a.列A
from openrowset( 'SQLOLEDB ', 'sql服務器名 '; '用戶名 '; '密碼 ',數據庫名.dbo.表名)as a inner join 本地表 b
on a.column1=b.column1

openquery

首先創建一個連接創建鏈接服務器

exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '遠程服務器名或ip地址 '

查詢

select *
FROM openquery(ITSV, 'SELECT * FROM 數據庫.dbo.表名 ')

把本地表導入遠程表

insert openquery(ITSV, 'SELECT * FROM 數據庫.dbo.表名 ')
select * from 本地表

更新本地表

update b
set b.列B=a.列B
FROM openquery(ITSV, 'SELECT * FROM 數據庫.dbo.表名 ') as a
inner join 本地表 b on a.列A=b.列A

opendatasource/openrowset

SELECT *
FROM opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陸名;Password=密碼' ).test.dbo.roy_ta

把本地表導入遠程表

insert opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陸名;Password=密碼 ').數據庫.dbo.表名
select * from 本地表

SQL 語句

參考文獻:https://www.w3cschool.cn/sql/sql-sentence.html

變量

局部變量

declare  @id char(10)   -- 聲明
set @id = ‘01’
select  @id = ‘02’ –  賦值

全局變量

全局變量聲明必須以@@開頭

判斷語句

IF ELSE

if  判斷條件
執行語句
else if 判斷條件
執行語句
else 執行語句

CASE

 CASE 
 WHEN  條件 then  執行語句
 WHEN  條件 then  執行語句
else 語句
end

循環 while

WHILE 條件
BEGIN 
  執行
END 

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

方法一:select * into b from a where 1<>1
方法二:select top 0 * into b from a

拷貝表(拷貝數據,源表名:a 目標表名:b) (Access可用)

insert into b(a, b, c) select d,e,f from a;

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

insert into b(a, b, c) select d,e,f from b in ‘具體數據庫’ where 條件 
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..

初始化表table1

此sql 只刪除表數據 不更改表結構

TRUNCATE  ABLE   ble1

刪除數據庫表

DROP  ABLE  ableName 

分頁

select top 10 b.* from (select top 20 主鍵字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主鍵字段 = a.主鍵字段 order by a.排序字段

數據庫分頁:

declare @start int,@end int
@sql nvarchar(600)
set @sql=’select top’+str(@end-@start+1)+’+from T where rid not in(select top’+str(@str-1)+’Rid from T where Rid>-1)’
exec sp_executesql @sql

注意:在top後不能直接跟一個變量,所以在實際應用中只有這樣的進行特殊的處理。Rid爲一個標識列,如果top後還有具體的字段,這樣做是非常有好處的。因爲這樣可以避免
top的字段如果是邏輯索引的,查詢的結果後實際表中的不一致(邏輯索引中的數據有可能和數據表中的不一致,而查詢時如果處在索引則首先查詢索引)

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

Select Top M-N * From 表 Where ID in (Select Top M ID From 表) Order by ID Desc 

例:一張表有一萬多條記錄,表的第一個字段 RecID 是自增長字段, 寫一個SQL語句, 找出表的第31到第40個記錄。

select top 10 b.*  from ( select  top  40  a.*  from a order by a.recid ) b  order by b.recid desc 

並集 UNION 運算符

UNION 運算符通過組合其他兩個結果表(例如 TABLE1 和 TABLE2)並消去表中任何重複行而派生出一個結果表。當 ALL 隨 UNION一起使用時(即 UNION ALL),不消除重複行。兩種情況下,派生表的每一行不是來自 TABLE1 就是來自 TABLE2。

交集 INTERSECT

INTERSECT 運算符通過只包括 TABLE1 和 TABLE2 中都有的行並消除所有重複行而派生出一個結果表。當 ALL 隨 INTERSECT 一起使用時 (INTERSECT ALL),不消除重複行。

去重 EXCEPT

EXCEPT 運算符通過包括所有在 TABLE1 中但不在 TABLE2 中的行並消除所有重複行而派生出一個結果表。當 ALL 隨 EXCEPT 一起使用時 (EXCEPT ALL),不消除重複行。

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

(select a from tableA ) except (select a from tableB) except (select a from tableC)

ROW_NUMBER()

說明:返回結果集分區內行的序列號,每個分區的第一行從1開始。
語法:ROW_NUMBER () OVER ([ <partition_by_clause> ] <order_by_clause>) 。
備註:ORDER BY 子句可確定在特定分區中爲行分配唯一 ROW_NUMBER 的順序。
參數:<partition_by_clause> :將 FROM 子句生成的結果集劃入應用了 ROW_NUMBER 函數的分區。
<order_by_clause>:確定將 ROW_NUMBER 值分配給分區中的行的順序。
返回類型:bigint 。
例:統計每一個客戶最近下的訂單是第幾次下的訂單。

with tabs as 
( 
select ROW_NUMBER() over(partition by customerID  order by totalPrice) as rows,customerID,totalPrice, DID from OP_Order 
 ) 
select MAX(rows) as '下單次數',customerID from tabs group by customerID
   

備註:此文章內容來源w3cschool教程,如有問題,請評論指教!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章