SQL Server數據庫及T-SQL實戰
聲明
你好!很高興你看到這篇博客,我寫這篇博客的目的有兩個:
1.總結有關T-SQl的實戰效果
2.總結SQL Server數據庫使用過程中給的技巧
希望朋友你有什麼好的意見可以留言,謝謝
名詞解釋
- 邏輯名稱:邏輯名稱就是給用戶看的名稱,在數據庫管理工具中顯示的名稱,即創建數據庫中 create database 邏輯名稱。
- 物理名稱:物理名稱即存儲在系統文件夾中的名字,在數據庫管理工具中右鍵數據庫,屬性,文件即可查看。
- ps: 邏輯名稱和物理名稱在不同的書和系統中的名字有些不同,數據庫管理工具中可能將邏輯名稱設爲數據庫文件創建時name後的名稱。無傷大雅。
SQL Server數據庫
Sql Server數據庫是我們公司最常用的數據庫之一,那麼關於數據庫的基本內容講解,我在這裏就不重複了,想要了解的可以簡單看一下sql server百科.
關於學習sql server的優質學習資源我這裏收集了一下,下載鏈接
安裝sql server
可到官網下載最新版本的sql server,安裝教程可以到知乎或者百度查找。
若安裝不成功或者有好的安裝教程可以留言。
ps:學習資料中的SQL SERVER學習手冊,有介紹安裝的詳細步驟。
數據庫中的三種完整性
1.域完整性
對錶中字段屬性的約束,通常指數據的有效性,它包括字段的值域、字段的類型及字段的有效值值等,域完整性可以確保不會輸入無效的值。
2.實體完整性
實體完整性就是:主鍵的約束。
即:關係中的主屬性值不能爲null且不能有相同的值。
3.參照完整性
外鍵約束,關係中的外鍵必須是另一個關係的主鍵有效值,或者爲null.參照完整性維護表間數據的有效性,完整性,通常通過建立外部鍵聯繫另一表的主鍵實現,還可以用觸發器來維護參照完整性。
SQL Server數據庫基本操作
T-SQL語言和sql語言是差不多的,唯一的不同是改變了一些語法書寫或者規範,只要你學過sql,那麼學習t-sql就是一樣的了,相差無幾。
ps: t-sql語言不區分大小寫
創建數據庫
以上截圖來自《sql server完全學習手冊》,[ ]內的數據可以不寫。
在該語法中,on用來創建數據文件,加上primary代表是主數據文件。
filegroup關鍵字用來創建次文件組,其中還可以創建次數據文件。
log on 觀健字用來創建事務日誌文件。name爲所創建文件的文件名稱。
filename 指出了文件的存儲路徑。size定義初始化大小,maxsize定義文件的最大容量,filegrowth指定了文件增長值。
指定多個數據庫文件創建數據庫
在創建數據庫時,可以爲數據庫指定多個數據文件(一主多輔)
例如:創建【學生成績管理系統】數據庫,並指定多個數據庫文件。
爲什麼sql server一個數據庫有多個數據文件
SQL Server中一個數據庫可以對應多個物理文件,其中有一個的主數據庫文件,擴展名爲MDF,其他爲次數據庫文件,擴展名爲NDF。可以將不同的文件存放在不同的驅動器上,可以提高數據訪問速度。
指定多個文件組的數據庫
文件組時分配和管理數據文件的集合,是根據數據文件而創建的。通過創建文件組,可以將不同的數據文件存儲在不同的文件組中,這樣不僅可以優化數據存儲還可以提高數據的I/O讀寫性能。、
使用過程中需要注意以下幾點:
- 只有數據文件具有文件組,日誌文件沒有文件組
- 主數據文件一定存在在主文件組中
- 與系統相關的數據文件一定在主文件組中
- 一個數據文件只能存放在一個文件組中
創建【學生成績管理系統】數據庫,併爲該數據庫指定兩個文件組
在上述語句中,創建了兩個文件組,即:DBGROUP1 與 DBGROUP2。其中,DBGROUP1文件組中學生成績管理系統_GROUP1和學生成績管理系統_GROUP2兩個數據文件。DBGROUP2文件組中學生成績管理系統_GROUP3和學生成績管理系統_GROUP4兩個數據文件。
說明
目前用到文件組的情形是,在創建數據庫表的時候用關鍵字ON進行分組。
修改數據庫
1. 採用alter關鍵字
alter database database_name modify name = newdatabase_name
例如:把“學生成績管理系統” 改爲 “Student_result”
alter database “學生管理成績系統” modify name = “Student_result”
說明:alter修改的是數據庫的邏輯名稱,對物理名稱無影響。
2. 使用系統存儲過程 sp
EXEP sp_renamedb ‘學生成績管理系統’ ‘Student_result’
擴大和收縮數據庫文件
擴大和收縮數據庫文件目前還沒有找到相關語句,解決方案是在數據庫管理系統中操作即可。
添加輔助數據庫文件
使用add file 語句
修改“學生成績管理系統”,增加一個新的次要文件,大小爲5M
alter database 學生成績管理系統
add file
(
name = “學生成績管理系統_data1”,
filename=‘d:\sql server\database\學生成績管理系統_data1.mdf’,
size=5M,
maxsize=15M,
filegrowth=15%
)
刪除數據庫
drop database database_name […n]
例如,刪除【學生成績管理系統】數據庫,
drop database 學生成績管理系統
查看數據庫狀態
採用DATABASEPROPERTYEX(database_name,property)函數
此函數一次只能返回一個選項的信息。
例如:查看【學生成績管理系統】數據庫的狀態
use 學生成績管理系統
go
select DATABASEPROPERTYEX(‘學生成績管理系統’,‘status’)
as ‘當前數據庫狀態’
DATABASEPROPERTYEX函數參數說明
DATABASEPROPERTYEX ( database , property )
參數說明:
參數 | 說明 |
---|---|
database | 當前鏈接的數據庫名稱 |
property | 說明 |
Collation | 排序規則 |
ComparisonStyle | 排列樣式 |
Edition | 數據庫版本信息(標準版還是企業版) |
IsAnsiNullDefault | 數據庫遵循IOS規則,允許值爲null |
IsAnsiNullsEnabled | 所有與null的比較取值爲未知 |
IsAnsiPaddingEnabled | 在比較或插入前,字符串將被填充到相同長度 |
IsAnsiWarningsEnabled | 發生標準錯誤條件時,SQL Server 會發出錯誤消息或警告消息 |
IsArithmeticAbortEnable | 如果執行查詢時發生溢出或被零除錯誤,則將結束查詢 |
IsAutoClose | 在最後一個用戶退出後,數據庫完全關閉並釋放資源 |
IsAutoCreateStatistics | 查詢優化器根據需要創建單列統計信息以提高查詢性能 |
IsAutoCreateStatisticsIncremental | 條件允許時,自動創建的單列統計信息遞增 |
IsAutoShrink | 可以定期自動收縮數據庫文件 |
IsAutoUpdateStatistics | 自動更新統計信息 |
IsClone | 數據庫是使用 DBCC CLONEDATABASE 創建的用戶數據庫的僅限架構和僅限統計數據 |
IsCloseCursorsOnCommitEnabled | 提交事務後,會關閉所有打開的遊標 |
IsFulltextEnabled | 支持對數據庫進行全文和語義索引 |
IsInStandBy | 數據庫以只讀方式聯機,並允許還原日誌。 |
IsLocalCursorsDefault | 遊標聲明默認爲 LOCAL |
IsMemoryOptimizedElevateToSnapshotEnabled | 在會話設置 TRANSACTION ISOLATION LEVEL 設置爲 READ COMMITTED、READ UNCOMMITTED 或較低的隔離級別時,使用 SNAPSHOT 隔離訪問內存優化表。 |
IsMergePublished | 如果安裝了複製,則 SQL Server 支持發佈數據庫表供合併複製使用 |
IsNullConcat | Null 串聯操作數產生 NULL |
IsNumericRoundAbortEnabled | 表達式中缺少精度時將產生錯誤 |
IsParameterizationForced | PARAMETERIZATION 數據庫 SET 選項爲 FORCED |
IsQuotedIdentifiersEnabled | 允許對標識符使用英文雙引號 |
IsPublished | 如果安裝了複製, SQL Server 支持發佈數據庫表供快照複製或事務複製使用 |
IsRecursiveTriggersEnabled | 已啓用觸發器遞歸觸發 |
IsSubscribed | 數據庫已訂閱發佈 |
IsSyncWithBackup | 數據庫爲發佈數據庫或分發數據庫,並且支持在不中斷事務複製的情況下還原 |
IsTornPageDetectionEnabled | SQL Server 數據庫引擎檢測到因電力故障或其他系統故障造成的不完全 I/O 操作 |
IsVerifiedClone | 數據庫是使用 DBCC CLONEDATABASE 的 WITH VERIFY_CLONEDB 選項創建的用戶數據庫的僅限架構和僅限統計信息副本 |
IsXTPSupported | 指示數據庫是否支持內存中 OLTP,即創建和使用內存優化表和本機編譯模塊。 |
LastGoodCheckDbTime | 上次在指定數據庫上成功運行 DBCC CHECKDB 的日期和時間 |
LCID | 排序規則的 Windows 區域設置標識符 (LCID) |
MaxSizeInBytes | 最大數據庫大小(以字節爲單位) |
Recovery | 數據庫恢復模式 |
ServiceObjective | SQL Database或 SQL 數據倉庫 中的數據庫的性能級別 |
ServiceObjectiveId | SQL Database 中的服務器目標 ID |
SQLSortOrder | SQL Server 早期版本中支持的 SQL Server 排序順序 ID |
Status | 數據庫狀態 |
Updateability | 指示是否可以修改數據 |
UserAccess | 指示哪些用戶可以訪問數據庫 |
Version | 用於創建數據庫的 SQL Server 代碼的內部版本號。 標識爲僅供參考。 不提供支持。 不保證以後的兼容性 |
數據庫其他操作
分離數據庫
分離數據庫是指將數據庫從SQL SERVER 2008實例中刪除,但是保存其數據庫文件和日誌文件。
例如:使用sp_detach_db存儲過程分離“學生成績管理系統”數據庫
EXEC sp_detach_db 學生成績管理系統
附加數據庫
附加數據庫是指重新將分離的數據庫定位到相同/不同的是服務器中。
附加數據庫時,所有的數據庫文件(包括.mdf 和 .ndf文件)都必須可用。
如果任何數據庫的文件路徑有變,則必須指定文件的當前路徑。
使用 FOR ATTACH 語句將分離的“學生成績管理系統”附加到指定的數據庫實例中:
create database 學生成績管系統
on
(
filename='d:\sql server\DATABASE\學生成績管理系統_DAT.mdf ’
)
log on
(
filename=‘d:\sql server\DATABASE\學生成績管理系統_log.ldf’
)
for attach
收縮數據庫、複製和移動數據庫
語句未找到,可參考手冊中的數據庫管理工具進行操作。
優化數據庫
在sql server 2008中主要從以下三個方面進行優化數據庫:
1、數據文件和日誌文件的存儲位置
在數據庫系統中,如果將數據文件和日誌文件存放在同一個磁盤中,那麼在對這兩種數據進行讀寫操作中,會降低磁盤的運行效率。
方案:將數據文件和日誌文件存放在不同的磁盤中,對於多個數據文件應當將它們分散於不同的磁盤進行存儲。
2、文件組的使用
文件組時多個數據文件的集合,方便數據文件的管理和訪問。
文件組可以提高系統的性能,主要有兩個方面:平衡負荷和並行訪問。
另外,通過備份單個文件和文件組可以防止數據庫發生意外。當數據庫出現錯誤時,通過回覆備份的文件和文件組就可以還原數據庫,從而簡化了數據庫的維護工作。
將數據庫表和索引放在不同的文件組中,對於經常使用的表來說可以提高查詢效率。
注意:文件組可以提高數據庫的效率但是不能提高其穩定性
3、RAID技術
RAID 獨立磁盤構成的具有冗餘能力的陣列
(redundant 英[rɪˈdʌndənt] 多餘的
arrays 排列 of
Independent 英[ˌɪndɪˈpendənt] 獨立的
Disks 英[dɪsks] 磁盤
)
技術詳細介紹.
RAID是由多個磁盤驅動器組成的磁盤系統,它將多個磁盤驅動器組成一個磁盤陣列,以便提供高性能、高可靠性、大存儲容量、低成本的磁盤系統。
SQL SERVER中主要涉及的是RAID0、RAID1、RAID5
- RAID0是數據條帶化
raid0不斷地分割數據,將數據存儲在不同地磁盤中,因此具有很高地磁盤讀寫率。
打個比方:4個磁盤組成的磁盤系統,把數據分割存儲在四個磁盤中,在多核計算機中,I/O效率是單個磁盤的4倍。
不足:沒有冗餘容錯機制,一旦一個磁盤損壞,整個磁盤系統都不可以使用。
- RAID1是磁盤鏡像化
RAID1最大限度的保證了用戶數據的安全性和可修復性。RAID1的操作方式是把用戶存儲的數據完全複製到另一個磁盤中,就像鏡子一樣。RAID1的磁盤使用率是50%(如果是兩個磁盤)。在sql server中,RAID1策略可用於日誌。
- RAID5是帶奇偶校驗的條帶化
什麼是奇偶檢驗
簡單的說奇偶校驗就是根據檢驗讀取數據時1的個數有沒有發生奇偶變化,雖然說一次變化兩個的機率比較小,但是奇偶校驗檢驗不出雙位錯誤。
RAID5是最常用的容錯等級,沒有固定的校驗盤,而是按照規則將奇偶校驗信息均勻地分佈在陣列所屬地硬盤上,所以在每塊硬盤上,既有數據信息也有校驗信息。這樣解決了爭奪校驗盤地問題,而且同一組數據增加了併發操作。既解決了性能問題,也解決了安全問題,既適用於大量數據地操作也適用於各類事務的操作。
數據庫中的表及相關操作
SQL Server屬於關係型數據庫,所謂的關係,指的就是表。
表由行和列組成,每一列都是一個屬性,每一行都代表了一條完整的數據。
數據類型
常用語法
切換數據庫
use + 數據庫的名稱
例子:切換成DB2數據庫
use DB2
創建表
一般我們在創建表之前已經切換到相應的數據庫了
簡單的書寫:
create table table_name
(
屬性列名 數據類型(所佔字節) [not null / null] [約束條件]
…
)
完整的寫法
s
說明
database_name 用於指定在哪個數據庫中建立表
owner 用於指定該數據表的所有者
table_name: 數據表名
column_definition 用於定義數據表中的字段名稱
table_constraint 該字段的約束條件
column_name 列名
computed_column_expression 定義計算字段值的表達式
on {filegroup|default} 指定數據表所存儲的文件組
textimage_on {filegroup | default} 指定text文本和image文件存儲的文件組
data_type 數據類型
constant_expression 指定字段默認值的常量、null或者系統函數
indentity 用於指定該字段爲標識字段
seed 標識字段的起始值
increment 用於定義字段的標識增量
例如:在學生成績管理系統中創建以學號爲主鍵的學生信息表
修改表
- 添加列(屬性),語法規範
alter table 表名
add 屬性 數據類型[(長度)][NULL | NOT NULL]
例子:爲student表添加sno列,數據類型爲varchar,字節數爲15,不能爲空
alter table student
add sno varchar(15) not null - 修改數據類型,語法規範
alter table 表名
alter column 屬性 數據類型
例子:將student表中的sno列改爲int數據類型
alter table student
alter column sno int - 刪除(列)屬性
alter table 表名
drop column 屬性
例子:student表中刪除sno列
alter table student
drop column sno - 修改列名
exec sp_rename ‘表名.列名’,‘新列名’ - 修改表名
exec sp_rename ‘原表名’,‘新表名’
約束
- 主鍵約束 primary key 唯一確定表中每一條記錄的標識符
- 外鍵約束 foreign key 用於建立和加強兩個表數據之間的連接
- 唯一約束 unique 指定一個列或多個列的值具有唯一性
- 檢查約束 check 設置檢查條件,以限制輸入值
- 默認約束 default 插入操作中沒有提供輸入值時系統會自動加上指定值
創建約束
alter table 表名
add constraint 約束名 約束類型 (列名)
說明:約束名是自定義的。
-
主鍵約束,爲學生表中的學號列增加主鍵約束 primary key
alter table 學生表
add constraint pk_學號 primary key (學號)
強調:主鍵約束列不可爲空 -
唯一約束 unique , 給姓名添加一個唯一約束 unique
alter table 學生表
add constraint un_姓名 unique(姓名) -
檢查約束 check,給年齡添加檢查約束,年齡大於18 check
alter table 學生表
add constraint ck_年齡 check (年齡 > 18) -
默認約束 default,給性別添加默認約束,男
alter tale 學生表
add constraint de_性別 default ‘男’ for 性別。 -
外鍵約束:加強兩個表之間的聯繫
foreign key : 找到有相同的列
外鍵的取值規則:空值或參照的主鍵值
注意
1、插入非空值時,如果主鍵中沒有這個值則不能插入
2、更新時,不能改爲主鍵表中沒有的值
3、刪除主鍵表記錄時,可以在外鍵時選定外鍵記錄一起刪除還是拒絕刪除
4、更新主鍵記錄時,可以同時更新外鍵的值或者拒絕更改
示例:
有兩張表,成績表和學生表,都有學號的屬性,給成績表中的學號建立一個外鍵約束,來自於學生表
alter table 成績表
add constraint fk_學號 foregin key(學號)
references 學生表 (學號)
要求
1、兩個表中的字段、類型、長度保持一致
2、引用的列,references + 的列,必須是主鍵約束或者唯一約束
3、兩個表中的列,儘量名字保持一致(規範)
創建表時添加約束
eg: test庫中,創建dz(編號,姓名,單位,性別,電話);
編號爲主鍵,所有屬性都是字符型,長度自己設定;
限制性別的取值爲男,女,單位默認值爲‘跳動字符’
create table dz
(
編號 char(20) primary key,
姓名 char(20),
單位 char(50) default ‘跳動字符’,
性別 char(5) check (性別=‘男’ or 性別=‘女’),
電話 char(20) unique
)
聲明
若存在聯合主鍵,則在最後聲明
primary key(列1,列2)
刪除約束
alter table 表名
drop constraint 約束名
根據添加約束中的語句操作:
- 刪除默認約束
alter table 學生表
drop constraint de_性別 - 刪除主鍵:若存在外鍵,則先刪除外鍵
刪除外鍵約束(成績表的外鍵)
alter table 成績表
drop constraint fk_學號
刪除主鍵約束
alter table 學生表
drop constraint pk_學號
T-SQL語言
基本概念
對sql server數據庫操作的,增強的sql語言
詳情.
標識符
數據庫對象的名稱即爲其標識符
命名規則
- 第一個字符必須是英文字母,下劃線、@符或#號
- 其他字符可以是:英文字母、十進制數字、@、$、#、_(下劃線)
- Transact_SQL爲保留字
- 不允許嵌入空格或者其他字符
批處理
t-sql語言一次可提交多條,語句順序依次執行。
變量
語法: declare @ 字符名稱 字符類型
eg:聲明兩個變量 name 字符類型 age int
declare @name varchar(10),age int
賦值 set 變量 = 值
eg: set @name = ‘張三’
同時多個賦值
select @name = ‘李四’,@age = 19.
輸出
print @name
print @age
全局變量
系統內部定義好的,用戶只能調用,不可修改
@@+字符名
DML
數據操作語言(Data Manipulation Language)
Manipulation 英[məˌnɪpjʊˈleɪʃən]
包括對數據庫的增刪改查
查詢
使用關鍵字DISTINCT
如果用戶希望在查詢返回結果中刪除重複行
select distinct 列名 from 表名稱
TOP 關鍵字
用於規定返回的記錄的數目
select top n *|column from table
top n 用於指定查詢結果返回的行數
使用別名查詢
使用select語句查詢數據時,可使用別名的方法根據需要對數據顯示的標題進行修改
1、在列的表達式中給出別名
select 列名 ‘別名’ from 表名
eg: select 學號 ‘no’ , 姓名 ‘name’, 性別 ‘sex’, 年級 ‘grade’ from 學生信息
2、使用‘=’表達式
select ‘別名’ = 列名 from 表名
eg: select ‘no’ = 學號,‘name’ = 姓名,‘sex’ = 性別 from 學生信息
3、使用AS關鍵字來連接列表達式和指定的別名
select 列名 as ‘別名’ from 表名
eg: select 學號 as ‘no’, 姓名 as ‘name’, 性別 as ‘sex’ from 表名
計算列
在進行數據查詢時,經常需要對查詢列的數據進行再次計算
eg:
select 編號,學號,‘調整前成績’ = 成績,‘調整後成績’ = 成績-10 from 成績表
選擇查詢
關鍵字where , sql server 支持比較、範圍、列表、字符串匹配等選擇方法
1、比較搜索條件
符號 | 說明 | 符號 | 說明 |
---|---|---|---|
= | 等於 | <> | 不等於 |
> | 大於 | !> | 不大於 |
< | 小於 | !< | 不小於 |
>= | 大於等於 | != | 不等於 |
<= | 小於等於 |
2、邏輯運算符
and 兩邊條件同時滿足
or 兩邊條件滿足其一
3、範圍搜索條件
範圍搜索返回介於兩個指定值之間的所有值,可分爲包括範圍和排他範圍兩種類型
用between , not between
4、列表搜索條件
IN 關鍵字,使用戶可以選擇與列表中的任意值匹配的行
例子:
select 學號,班級編號,姓名,性別,籍貫
from 學生信息
where 籍貫 in (‘beijing’,‘shenzhen’)
5、搜索條件中的字符匹配符
like 關鍵字搜索與指定模式匹配的字符串
字符 | 說明 |
---|---|
% | 替代零個或多個字符 |
_ | 替代一個字符 |
[ ] | 指定範圍內單個字符,[ ] 中可以是單個字符[abcd],或者多個字符[a-f] |
[^] | abcd不在範圍內的單個字符,單個 [ ^abcd],不在字符範圍[ ^a-f ] |
6、涉及空值的查詢
- 空值(null),在數據庫中表示不確定的值
- 判斷取值爲空的格式爲: 列名 is null
- 判斷取值不爲空的語句格式爲:列名 is not null
7、聚合函數
對一組值執行計算,並返回單個值
函數名 | 作用 |
---|---|
SUM([distinct] <列名>) | 計算列值總和 |
AVG([distinct] <列名>) | 計算列值平均值 |
max([distinct] <列名>) | 求列中最大值 |
min([distinct] <列名>) | 求列中最小值 |
count(*) | 統計表中行的個數 |
count([distinct] <列名>) | 統計本列列值個數 |
上述函數中除了count(*)外,其他函數在計算的過程中均忽略null值。
語法:select 聚合函數 from 表名
8、數據分組
group by 語句用於結合聚合函數,根據一個或多個列對結果集進行分組
使用技巧:
group by 後面的字段,要寫在select 的後面第一位
eg:
查詢每個年級的總人數和班級總數
select 年級,sum(人數) as ‘總人數’,count(班級編號) as ‘班級個數’
from 班級信息
group by 年級
eg:
查詢每門課的最高分和最低分(表爲成績表)
select 課程編號 ,max(成績) as ‘最高分’,
min (成績) as ‘最低分’
from 成績表
group by 課程編號
having通常與group by子句一起使用。相當於一個用於組的where子句,制定組的搜索條件。having子句包含聚合函數,但where不可以使用。
select 學號,sum(成績)
group by 學號
having sum(成績) <60
9、order by 排序
- order by 語句用於對指定的結果集進行排序
- order by 默認升序
- 降序排序可以使用desc關鍵字
- select * from 成績表 order by 成績 [desc]
10、where
- where子句可以使用的條件
運算符 | 符號 | 說明 |
---|---|---|
比較符 | =、>、<、>=等 | 比較兩個表達式 |
邏輯 | and、or、not | 組合兩個表達式的運算結果或取反 |
範圍 | between、not between | 搜索值是否在範圍內 |
列表 | in、not in | 查詢值是否屬於列表之一 |
字符匹配符 | like、not like | 字符串是否匹配 |
語法
select select_list
[into new_table_name]
from table_list
[where search_conditions]
[group by group_by_list]
[having search_conditions]
[order by order_list [ASC | DESC]]
說明:
select 選擇列表 into 新表名 from 表名
在查詢的基礎上創建新表
表連接
在實際查詢應用中,用戶所需要的數據並不全在一個表中,可能存在多個表中,這時就需要使用多表查詢。
在數據庫應用中,經常需要從多個相關的表中查詢數據,這就是需要進行表連接
- 使用內部連接 (只有匹配到的纔會有輸出)
內部連接是比較常用的一種數據連接查詢方式。
內部連接有以下兩種語法式:
select select_list from 表名1,表名2
where 表1.列 = 表2.列
或者
select select_list from 表1 [inner] join 表2
on 表1.列 = 表2.列