知識內容:html
1.SqlServer數據庫概述sql
2.SqlServer數據庫基本操做數據庫
3.Transact-SQL程序設計express
1、SqlServer數據庫概述編程
1.SqlServer系統概述緩存
SQLServer是一款面向高端的數據庫管理系統,SQLServer 是Microsoft公司推出的數據庫管理系統,是新一代大型電子商務、數據倉庫和數據庫解決方案
安全
2.SqlServer的數據庫結構服務器
(1)數據庫邏輯體系結構網絡
(2)數據庫物理體系結構架構
3.SqlServer客戶端/服務器體系結構及數據庫類型
sqlserver採用的是客戶端/服務器的體系結構,這種體系結構又叫C/S架構
客戶/服務器體系結構有利於數據庫系統把數據集中保存在中央服務器上,從而實現了多用戶共享數據的目的。根據物理結構的不一樣客戶/服務器體系結構能夠分紅兩層的客戶/服務器體系結構和三層(多層)的客戶/服務器體系結構
SQL Server2014是典型的關係型數據庫,它由表、視圖、索引、用戶、存儲過程和觸發器等對象組成,另外SQL Server2014數據庫分爲四類:
2、SqlServer數據庫基本操做 -> 只介紹用SQL語言操做的方式,不介紹圖形化界面操做
1.用戶數據庫的操做
(1)SQL語句建立:在窗口上部的工具欄的左側找到「新建查詢」按鈕,單擊「新建查詢」,在SQL Server Management Studio的窗口右側會創建一個新的查詢頁面,在這個頁面中輸入要執行的SQL語句,SQL語句以下所示:
1 CREATE DATABASE STUDENT2 2 ON PRIMARY 3 (NAME = ‘STUDENT2_DATA’, 4 FILENAME = ‘F:\STUDENT2_DATA.MDF’ , 5 SIZE = 5MB, 6 MAXSIZE = 20MB, 7 FILEGROWTH = 20%) 8 LOG ON 9 (NAME ='STUDENT2_LOG', 10 FILENAME = ‘F:\STUDENT2_LOG. LDF’, 11 SIZE = 5MB, 12 MAXSIZE = 10MB, 13 FILEGROWTH = 2MB)
(2)縮減已有數據庫文件的大小
注:爲了不存儲空間的浪費,能夠進行數據庫的手動收縮或設置自動收縮。可是,不管怎麼收縮,數據庫的大小也不會小於其初始大小,因此建立數據庫時初始大小的選擇應儘量合理
(3)用SQL語句修改:可使用ALTER DATABASE語句修改數據庫名稱,詳情以下:
1 使用ALTER DATABASE語句修改數據庫名稱的語法形式以下: 2 ALTER DATABASE old_databasename MODIFY NAME=new_databasename 3 4 也可使用SQL語句增長已有數據庫文件的大小,ALTER DATABASE 數據庫名 5 MODIFY FILE 6 (NAME=邏輯文件名, 7 SIZE=文件大小, 8 MAXSIZE=增加限制) 9 10 也可使用T-SQL語句增長數據庫文件的數目: 11 ALTER DATABASE 數據庫名 12 ADD FILE|ADD LOG FILE 13 (NAME=邏輯文件名, 14 FILE=物理文件名, 15 SIZE=文件大小, 16 MAXSIZE=增加限制)
(4)刪除用戶數據庫:
使用DROP DATABASE命令刪除數據庫:DROP DATABASE database_name[,……n]
注:用戶只能根據本身的權限刪除用戶數據庫;不能刪除當前正在使用(正打開供用戶讀寫)的數據庫;沒法刪除系統數據庫(msdb、model、master、tempdb)
補充:ALTER DATABASE的REMOVE FILE子句,能夠刪除指定的文件。語法格式以下:
1 ALTER DATABASE 數據庫名 2 REMOVE FILE 邏輯文件名
2.數據庫中的表的操做
數據庫是由各類數據庫表組成的,數據庫表是SQL Server數據庫中最重要的操做對象,是用於存儲和操做數據的邏輯結構
在數據庫中,表是由數據按必定的順序和格式構成的數據集合,是數據庫的主要對象。表的數據組織形式是行、列結構。表中每一行表明一條記錄,每一列表明記錄的一個字段。沒有記錄的表稱爲空表
(1)設計表
對於具體的某一個表,在建立以前,須要肯定表的下列特徵:
(2)經常使用數據類型
字符型:
整型:
日期時間型:
(3)建立表
使用SQL語句建立表:
1 CREATE TABLE 2 [ database_name.[ owner ] .| owner.] table_name 3 ( { < column_definition > 4 | column_name AS computed_column_expression 5 | < table_constraint >} [,…n] ) 6 [ ON { filegroup | DEFAULT } ] 7 [ TEXTIMAGE_ON { filegroup | DEFAULT } ]
參數說明:
1 ①NULL 和NOT NULL:若是表的某一列被指定具備NULL屬性,那麼就容許在插入數據時省略該列的值。反之若是表的某一列被指定具備NOT NULL屬性,那麼就不容許在沒有指定列缺省值的狀況下插入省略該列值的數據行。在SQL Server中列的缺省屬性是NULL。 2 ②PRIMARY KEY:設置字段爲主鍵。 3 ③UNIQUE:設置字段具備惟一性。 4 ④FOREIGN KEY REFERENCES ref_table [(ref_column)]:與其它表創建關聯,其中ref_table(表名),ref_column(列名)
列定義與約束:
建立表實例:
1 CREATE TABLE S 2 (SNo CHAR(6), 3 SN VARCHAR(8) CONSTRAINT S_Cons1 NOT NULL, 4 Sex CHAR(2) CONSTRAINT S_Cons2 DEFAULT '男', 5 Age INT, 6 Dept VARCHAR(20))
(4)修改表
SQL語句修改表:
1 ALTER TABLE table_name 2 [ ALTER COLUMN column_name /*修改已有列的屬性*/ 3 { new_data_type [ ( precision [ , scale ] ) ] [ NULL | NOT NULL ]} 4 | ADD [column_name data_type ] /*增長新列*/ 5 [ PRIMARY KEY | constrain ] 6 [FOREIGN KEY [(column )] 7 REFERENCES ref_table [(ref_column)] 8 | DROP /*刪除列或約束*/ 9 [ CONSTRAINT ] constraint_name | COLUMN column_name
修改表實例:
1 在學生表中修改「姓名」字段的屬性,使該字段的數據類型爲varchar(50),容許爲空: 2 ALTER TABLE 學生 ALTER COLUMN 姓名 varchar(50) NULL 3 4 在課程表中添加「任課教師」字段,數據類型爲varchar(10): 5 ALTER TABLE 課程表 6 ADD 任課教師 varchar(10) 7 8 刪除學生表中的「年齡」字段: 9 ALTER TABLE 學生表
10 DROP COLUMN 年齡
3.約束相關操做
(1)建立和刪除PRIMARY KEY約束
PRIMARY KEY(主鍵)約束在表中定義一個主鍵值,這是惟一肯定表中每一行數據的標識符。在全部的約束類型中,主鍵約束是最重要的一種約束類型,也是使用最普遍的約束類型。該約束強制實體完整性。一個表中最多隻能有一個主鍵,主鍵列不容許取空值
主鍵常常定義在一個列上,可是也能夠定義在多個列的組合上。當主鍵定義在多個列上時,雖然某一個列中的數據可能重複,可是這些列的組合值不能重複
建立PRIMARY KEY約束:
使用ALTER TABLE的ADD CONSTRAINT子句添加約束的通常格式爲:
1 ALTER TABLE table_name 2 ADD [ CONSTRAINT constraint_name ] 3 PRIMARY KEY 4 CLUSTERED | NONCLUSTERED /*由系統自動建立彙集或非彙集索引*/ 5 ( column [ ,...n ] )
實例:
1 修改學生表,對學號字段建立PRIMARY KEY約束: 2 ALTER TABLE 學生 3 ADD CONSTRAINT pk_st PRIMARY KEY (學號))
PRIMARY KEY與UNIQUE 的區別:
刪除PRIMARY KEY約束:
可使用ALTER TABLE的DROP CONSTRAINT子句刪除PRIMARY KEY約束,其通常格式爲:
1 ALTER TABLE table_name 2 DROP CONSTRAINT constraint_name [,…n]
實例:
1 刪除「學生教學管理」數據庫中 「學生」表的PRIMARY KEY約束pk_st: 2 ALTER TABLE 學生 3 DROP CONSTRAINT pk_st
(2)建立和刪除UNIQUE約束
UNIQUE(惟一性)約束指定表中某一個列或多個列不能有相同的兩行或兩行以上的數據存在。這種約束經過實現惟一性索引來強制實體完整性。當表中已經有了一個主鍵約束時,若是須要在其餘列上實現實體完整性,又由於表中不能有兩個或兩個以上的主鍵約束,因此只能經過建立UNIQUE約束來實現。通常地,把UNIQUE約束稱爲候選鍵約束。
例如,在「學生」表中,主鍵建立在「學號」列上,若是還須要保證該表中的存儲「身份證號」列的數據是惟一的,那麼可使用UNIQUE約束
建立表時設置UNIQUE約束:
1 建立「學生」表,主鍵約束建立在「學號」列上,要求「身份證號」列的數據是惟一的: 2 CREATE TABLE 學生 3 ( 學號 char(6) PRIMARY KEY, 4 姓名 char(8) NOT NULL, 5 身份證號 char(20) CONSTRAINT uk _st1 UNIQUE, 6 性別 bit NOT NULL)
修改表時設置UNIQUE約束:
可使用ALTER TABLE的ADD CONSTRAINT子句設置UNIQUE約束,其通常格式爲:
1 ALTER TABLE table_name 2 ADD [ CONSTRAINT constraint_name ] UNIQUE 3 CLUSTERED | NONCLUSTERED /*由系統自動建立彙集或非彙集索引*/ 4 ( column [ ,...n ] )
實例:
1 設置「學生」表「身份證號」字段值惟一: 2 ALTER TABLE 學生 3 ADD CONSTRAINT uk_st UNIQUE (身份證號)
刪除UNIQUE約束: 方法與刪除PRIMARY KEY約束相同
1 刪除「學生」表中建立的UNIQUE約束: 2 ALTER TABLE 學生 3 DROP CONSTRAINT uk_st
使用UNIQUE約束時應考慮的問題:
UNIQUE約束所在的列容許空值,可是主鍵約束所在的列不容許空值;一個表中能夠有多個UNIQUE約束;能夠把UNIQUE約束放在一個或者多個列上,這些列或列的組合必須有惟一的值,可是,UNIQUE約束所在的列並非表的主鍵列;UNIQUE約束強制在指定的列上建立一個惟一性索引。在默認狀況下,是建立惟一性的非彙集索引。可是,在定義UNIQUE約束時也能夠指定所建立的索引是彙集索引
(3)建立和刪除FOREIGN KEY約束
表和表之間的引用關係能夠經過FOREIGN KEY(外鍵)約束來實現。建立外鍵約束既能夠由FOREIGN KEY子句完成,也能夠在表設計器中完成
外鍵約束定義一個或多個列,這些列能夠引用同一個表或另一個表中的主鍵約束列或UNIQUE約束列。實際上,經過建立外鍵約束能夠實現表和表之間的依賴關係
通常狀況下,在Microsoft SQL Server關係型數據庫管理系統中,表和表之間常常存在着大量的關係,這些關係都是經過定義主鍵約束和外鍵約束實現的
建立表時定義外鍵約束:
1 在數據庫「學生教學管理」中建立一個「成績」表,包括:學號(主鍵)、課程號、成績,併爲成績表建立外鍵約束,該約束把「成績」表中的「學號」字段和「學生」表中的「學號」字段關聯起來: 2 3 CREATE TABLE 成績 4 ( 學號 char(6) CONSTRAINT st_xh 5 FOREIGN KEY REFERENCES 學生(學號), 6 課程號 char(4), 7 成績 int )
修改表時添加外鍵約束:
1 ALTER TABLE table_name 2 ADD [ CONSTRAINT constraint_name] 3 FOREIGN KEY ( column [ ,...n ] ) 4 REFERENCES ref_table ( ref_column [ ,...n ] )
實例:
1 將「學生教學管理」數據庫中學生表、課程表和選課表進行關聯,學生表和課程表爲主表,其中的學號和課程號字段爲主鍵,選課表爲從表,將選課表的學號和課程號字段定義爲外鍵。 2 ①ALTER TABLE 選課表 3 ADD CONSTRAINT st_foreign 4 FOREIGN KEY (學號) REFERENCES 學生表(學號 ) 5 6 ②ALTER TABLE 選課表 7 ADD CONSTRAINT kc_foreign 8 FOREIGN KEY (課程號) REFERENCES 課程表(課程號 )
刪除外鍵約束:
SQL語句的ALTER TABLE命令能夠刪除外鍵約束。
1 刪除建立的外鍵約束: 2 ALTER TABLE 成績 3 DROP CONSTRAINT st_xh
(4)建立和刪除CHECK約束
CHECK約束用來限制用戶輸入某一個列的數據,即在該列中只能輸入指定範圍的數據。CHECK約束的做用很是相似於外鍵約束,二者都是限制某個列的取值範圍,可是外鍵是經過其餘表來限制列的取值範圍,CHECK約束是經過指定的邏輯表達式來限制列的取值範圍
例如,在描述學生「性別」列中能夠建立一個CHECK約束,指定其取值範圍是「男」或者「女」。這樣,當向該列輸入數據時,要麼輸入數據「男」,要麼輸入數據「女」,而不能輸入其餘不相關的數據
SQL語句在建立表時建立CHECK約束:
1 CREATE TABLE table_name /*指定表名*/ 2 (column_name datatype 3 [[check_name ] CHECK ( logical_expression )] 4 /*CHECK約束表達式*/ 5 [,…n])
實例:
1 在 STUDENT數據庫中建立表books,其中包含CHECK約束定義: 2 3 CREATE TABLE books 4 (book_id smallint PRIMARY KEY, /*書號*/ 5 book_name varchar(50) NOT NULL, /*書名*/ 6 max_price tinyint NOT NULL CHECK (max_price <= 250) 7 /*書容許的最高價CHECK約束*/ 8 )
修改表時建立CHECK約束 :
1 語法格式: 2 ALTER TABLE table_name 3 ADD CONSTRAINT check_name CHECK (logical_expression) 4 5 經過修改STUDENT數據庫的「成績」表,增長成績字段的CHECK約束: 6 ALTER TABLE 成績 7 ADD CONSTRAINT cj_constraint CHECK (成績>=0 and 成績<=100)
刪除CHECK約束:
SQL語句的ALTER TABLE命令能夠刪除CHECK約束。
1 刪除建立的CHECK約束: 2 ALTER TABLE 成績 3 DROP CONSTRAINT cj_constraint
注:一個列上能夠定義多個CHECK約束;當執行INSERT語句或者UPDATE語句時,該約束驗證相應的數據是否知足CHECK約束的條件。可是,執行DELETE語句時不檢查CHECK約束
(5)建立和刪除DEFAULT約束
當使用INSERT語句插入數據時,若是沒有爲某一個列指定數據,那麼DEFAULT約束就在該列中輸入一個默認值
例如在學生表的性別列中定義了一個DEFAULT約束爲「男」。當向該表中輸入數據時,若是沒有爲性別列提供數據,那麼DEFAULT約束把默認值「男」自動插入到該列中。所以,DEFAULT約束能夠實現保證域完整性
在建立表時定義默認值約束:
1 CREATE TABLE table_name /*指定表名*/ 2 (column_name datatype NOT NULL | NULL 3 [DEFAULT constraint_expression] /*默認值約束表達式*/ [,…n]) 4 /*定義列名、數據類型、標識列、是否空值及定義默認值約束*/
實例:
1 先在「STUDENT」數據庫中建立表ST,定義一個「入學日期」字段的默認值爲系統當前日期: 2 CREATE TABLE ST 3 ( 學號 char(6) NOT NULL, 4 姓名 char(8) NOT NULL, 5 專業名 char(10) NULL, 6 性別 bit NOT NULL, 7 出生時間 smalldatetime NOT NULL, 8 總學分 tinyint NULL, 9 備註 text NULL, 10 入學日期 datetime DEFAULT getdate() ) /*定義默認值約束*/
在修改表時定義默認值約束:
1 修改ST表,添加一字段AddDate,併爲其設置默認值約束,默認值爲當前日期: 2 USE STUDENT 3 GO 4 ALTER TABLE ST 5 ADD AddDate smalldatetime NULL 6 CONSTRAINT AddDateDf /*默認值約束名*/ 7 DEFAULT getdate()
刪除默認值約束:
1 ALTER TABLE ST 2 DROP CONSTRAINT AddDateDf
定義DEFAULT約束時應考慮的問題:
①定義的常量值必須與該列的數據類型和精度是一致的
②DEFAULT約束只能應用於INSERT語句
③每個列只能定義一個DEFAULT約束。DEFAULT約束不能放在有IDENTITY屬性的列上或者數據類型爲timestamp的列上,由於這兩種列都會由系統自動提供數據
④DEFAULT約束容許指定一些由系統函數提供的值,這些系統函數包括SYSTEM_USER、GETDATE、CURRENT_USER等
4.數據表的建立與增刪改查
T-SQL語句相似於SQL語句,所以在此不詳細介紹T-SQL語句的語法,關於SQL語句詳細內容見:http://www.cnblogs.com/wyb666/p/9017402.html
(1)建立、刪除數據表及插入、刪除、更改數據表
1 建立數據表 CREATE TABLE語句 2 刪除數據表 DROP TABLE語句 3 向數據表中插入數據 INSERT語句 4 從數據表中刪除記錄 DELETE語句 5 修改和更新記錄 UPDATE語句
實例1:
1 在「教學庫」數據庫的「學生表」中插入一行數據(學號、姓名、性別、年級)爲(‘0100215’、‘劉玲玲’、‘女’、‘10級’): 2 INSERT into 學生表(學號,姓名,性別,年級) VALUES('0100215','劉玲玲','女','10級') 3 【例】在「STUDENT1」數據庫的「學生」表中插入一行數據(‘120101’、‘劉玲’、‘130212199407190926’、‘女’): 4 INSERT into 學生 VALUES('120101','劉玲','130212199407190926','女')
實例2:
1 刪除「學生」表中「120101」號學生的記錄: 2 USE STUDENT1 3 DELETE 學生 WHERE 學號 = '120101' 4 5 ***使用TRUNCATE TABLE清空表格*** 6 語法格式: TRUNCATE TABLE table_name 7 8 注:TRUNCATE TABLE與不含有WHERE子句的DELETE語句在功能上相同。可是,TRUNCATE TABLE速度更快,而且使用更少的系統資源和事務日誌資源。 9 10 清空「學生」表中的數據: 11 TRUNCATE TABLE 學生
實例3:
1 將STUDENT1數據庫的「學生」表中的「性別」字段的值設爲「男」: 2 UPDATE 學生 SET 性別='男' 3 在STUDENT1數據庫的「學生」表中添加一字段「備註」varchar(20),「備註」字段信息爲「已畢業」: 4 ALTER TABLE 學生 Add 備註 varchar(20) 5 UPDATE 學生 SET 備註='已畢業'0
實例3:
1 在「學生」表中,將學號爲「120101」的學生姓名改成「王武」: 2 UPDATE 學生 SET 姓名='王武' WHERE 學號='120101'
(2)簡單查詢
SELECT語句的語法格式以下:
1 SELECT select_list [INTO new_table_name ] 2 FROM table_list 3 [ WHERE search_conditions ] 4 [ GROUP BY group_by_list ] 5 [ HAVING search_conditions ] 6 [ ORDER BY order_list [ ASC | DESC ] ]
實例:
1 查詢全部記錄:SELECT * FROM 課程 2 選擇一個表中指定的列:SELECT 姓名,性別,專業號 FROM 學生 3 4 用DISTINCT關鍵字能夠過濾掉查詢結果中的重複行:SELECT DISTINCT 專業號 FROM 學生 5 前三行信息:SELECT top 3 * FROM 課程 6 查詢前50%:SELECT top 50 percent * FROM 課程 7 8 計算列值: 9 查詢「成績單」,按150分制計算成績:SELECT 學號, 課程號, 成績150=成績*1.50 FROM 成績單 10 11 選擇查詢: 12 SELECT * FROM 成績單 WHERE 成績>=60 13 SELECT * FROM 學生 WHERE 專業號=‘0501' and 性別='男' 14 SELECT * FROM 成績單 WHERE 成績 BETWEEN 80 AND 90 15 SELECT 姓名,學號,專業號 FROM 學生 WHERE 專業 IN(‘0501' ,‘0403') 16 SELECT * FROM 成績單 WHERE 成績 IS NULL 17 SELECT * FROM 學生表 WHERE 性別=’女’ AND (專業=’0501’OR 專業=’0403’) 18 19 使用通配符匹配查詢: 20 SELECT * FROM 學生 WHERE 姓名 like '張%'
(3)聚合函數查詢
SQL Server提供了一系列聚合函數。這些函數把存儲在數據庫中的數據描述爲一個總體而不是一行行孤立的記錄,經過使用這些函數能夠實現數據集合的彙總或是求平均值等各類運算
實例:
1 SELECT avg(成績) AS 平均成績 FROM 成績單 2 SELECT count (DISTINCT 專業號) AS 專業種類數 FROM 學生 3 SELECT avg(成績) AS 平均成績 FROM 成績單 WHERE 學號=’ 01053113’ Group by 學號
(4)分組和彙總
使用聚合函數返回的是全部行數據的統計結果。若是須要按某一列數據的值進行分類,在分類的基礎上再進行查詢,就要使用GROUP BY子句了。分組技術是指使用GROUP BY子句完成分組操做的技術
GROUP BY子句的語法結構以下:
[ GROUP BY [ ALL ] group_by_expression [,…n]
[ WITH { CUBE | ROLLUP } ] ]
實例:
1 查詢「學生教學管理」中男生和女生的人數: 2 SELECT 性別,count(性別) 人數 FROM 學生 GROUP BY 性別 3 注:指定 GROUP BY 子句時,選擇列表中任意非聚合表達式內的全部列都應包含在 GROUP BY 列表中(不能使用別名列),或者 GROUP BY 表達式必須與選擇列表表達式徹底匹配 4 5 在「成績單」中查詢選修了兩門及以上課程的學生學號和選課數: 6 SELECT 學號,COUNT(課程號) 選修課程數 FROM 成績單 GROUP BY 學號 HAVING COUNT(課程號)>=2
HAVING與 WHERE 子句的區別是:WHERE 子句式對整表中數據篩選知足條件的行;而HAVING子句是對GROUP BY分組查詢後產生的組加條件,篩選出知足條件的組。另外,WHERE中條件不能使用聚合函數,HAVING中條件通常使用聚合函數
(5)鏈接查詢
內鏈接:
SELECT select_list
FROM 表1 INNER JOIN 表2 ON 鏈接條件
1 查詢學生管理數據庫中有成績的學生的姓名、性別、籍貫、課程編號以及成績: 2 Select 學生.學號,姓名,籍貫,課程號,成績 From 成績單 inner join 學生 On 學生.學號=成績單.學號
自鏈接:
鏈接操做不只能夠在不一樣的表上進行,並且在同一張表內能夠進行自身鏈接,即將同一個表的不一樣行鏈接起來。自鏈接能夠看做一張表的兩個副本之間的鏈接。在自鏈接中,必須爲表指定兩個別名,使之在邏輯上成爲兩張表
1 從「學生教學管理」中查詢同名學生的信息: 2 SELECT * FROM 學生 a INNER JOIN 學生 b ON a.姓名=b.姓名 AND a.學號<>b.學號
外鏈接:
在外鏈接中,不只包括那些知足條件的數據,並且某些表不知足條件的數據也會顯示在結果集中。也就是說,外鏈接只限制其中一個表的數據行,而不限制另一個表中的數據。這種鏈接形式在許多狀況下是很是有用的,例如在連鎖超市統計報表時,不只要統計那些有銷售量的超市和商品,並且還要統計那些沒有銷售量的超市和商品
外鏈接的分類:
1 左外鏈接:SELECT select_list FROM 表1 LEFT [OUTER] JOIN 表2 ON 表1.列1=表2.列2 2 右外鏈接:SELECT select_list FROM 表1 RIGHT [OUTER] JOIN 表2 ON 表1.列1=表2.列2 3 全外鏈接:SELECT select_list FROM 表1 FULL [OUTER] JOIN 表2 ON 表1.列1=表2.列2
實例:
1 顯示全部學生信息,同時顯示選課學生的學習成績: 2 Select 學生.*,成績單.* From 學生 left join 成績單 on 學生.學號=成績單.學號 3 4 顯示全部成績單信息,同時顯示全部相關學生的信息: 5 Select 學生.*,成績單.* From 學生 right join 成績單 on 成績單.學號=學生.學號 6 7 顯示全部學生和成績單信息: 8 Select 學生.*,成績單.* From 學生 full join 成績單 on 成績單.學號=學生.學號
(6)對查詢結果進行排序
在使用SELECT語句時,排序是一種常見的操做。排序是指按照指定的列或其餘表達式對結果集進行排列順序的方式。SELECT語句中的ORDER BY子句負責完成排序操做。另外ASC表示升序,DESC表示降序,默認狀況下是升序
實例:
1 查詢「學生教學管理」中「女」學生的姓名和專業號,並按姓名升序排列: 2 SELECT 姓名,專業號 FROM 學生 WHERE 性別=’女’ ORDER BY 姓名 ASC 3 查詢「成績單」中學生的成績和學號,並按成績降序排列: 4 SELECT 學號,成績 FROM 成績單 ORDER BY 成績 DESC
5.存儲查詢結果
經過在SELECT語句中使用INTO子句,能夠建立一個新表並將查詢結果中的行添加到該表中。用戶在執行一個帶有INTO子句的SELECT語句時,必須擁有在目標數據庫上建立表的權限。SELECT...INTO不能與COMPUTE子句一塊兒使用
SELECT...INTO語句的語法格式以下:
1 SELECT select_list 2 INTO new_table 3 FROM table_source 4 [WHERE search_condition]
實例:
1 查詢學生姓名,學號,課程名,成績的相關數據存放在表「成績信息」中。並對新表進行查詢: 2 SELECT 姓名,學生.學號,課程名, 成績 INTO 成績信息 3 FROM 學生 inner join 成績單 on 學生.學號=成績單.學號 4 inner join 課程 on 成績單.課程號=課程.課程號 5 6 SELECT * FROM 成績信息
6.數據庫索引
索引相似書籍的目錄,索引經過記錄表中的關鍵值指向表中的記錄,這樣數據庫就不用掃描整個表定位到相關的記錄。相反,若是沒有索引,則會致使SQL Server搜索表中的全部記錄以獲取匹配結果
建立索引的語法格式以下:
1 CREATE [ UNIQUE ][ CLUSTERED | NONCLUSTERED ] INDEX index_name 2 ON { table_name | view_name } ( column_name [ ASC | DESC ] [ ,...n ] ) 3 [ WITH < index_option > [ ,...n] ] [ ON filegroup ] 4 < index_option > ::= 5 { PAD_INDEX | FILLFACTOR = fillfactor 6 | IGNORE_DUP_KEY | DROP_EXISTING 7 | STATISTICS_NORECOMPUTE }
實例:
1 根據學生教學管理中學生表的姓名列的升序建立一個名爲「index_學生姓名」的普通索引: 2 CREATE INDEX index_學生姓名 ON 學生(姓名) 3 4 根據「倉庫庫存」數據庫中「商品表」的商品名稱、生產商建立一個名爲「商品_生產商」的惟一性複合索引,其中商品名稱爲升序,生產商爲降序: 5 CREATE UNIQUE INDEX 商品_生產商 ON 商品(商品名稱 ASC, 生產商 DESC)
注:在定義表結構或修改表結構時,若是定義了主鍵約束(PRAMARY KEY)或者惟一性約束(UNIQUE),能夠間接建立索引
7.數據庫視圖
視圖是一種數據庫對象,爲用戶提供一個能夠檢索數據表中數據的方式。視圖是一個虛表,能夠視爲另外一種形式的表,是從一個或多個表中使用SELECT語句導出的虛擬表,那些用來導出視圖的表稱爲基本表
用戶經過視圖來瀏覽數據表中的數據,另外數據庫中只存儲視圖的定義而不存儲視圖對應的數據,這些數據仍存儲在導出視圖的基本表中。當基本表中的數據變化時,從視圖中查詢出來的數據也隨之改變
建立視圖:
1 CREATE VIEW [schema_name.]view_name [ (column_name[ ,...n ] ) ] 2 [with <view_attribute>[,…n]] 3 AS select_statement 4 [WITH CHECK OPTION]
實例:
1 建立「學生_課程_成績」視圖,包括「0501」專業的學生的學號、姓名,和他們選修的課程號、課程名和成績: 2 CREATE VIEW 學生_課程_成績 AS SELECT 學生.學號,姓名,課程.課程號,課程名,成績 3 FROM 學生,成績單,課程 WHERE 學生.學號=成績單.學號 AND 課程.課程號=成績單.課程號 AND 專業號=‘0501'
修改視圖:
1 ALTER VIEW [schema_name.]view_name 2 [ (column_name[ ,...n ] ) ] [with <view_attribute>[…n]] 3 AS select_statement [ ; ] 4 [ WITH CHECK OPTION ] 5 注:語句中的參數與CREATE VIEW語句中的參數相同
實例:
1 修改「庫存統計視圖」,求每種商品的總庫存數量和所在倉庫個數,要求包括商品編號和商品名稱: 2 ALTER VIEW 庫存統計視圖 AS SELECT 商品.商品編號,商品名稱,SUM(數量) AS 總庫存數量, 3 COUNT(倉庫編號) AS 所在倉庫個數 FROM 商品 INNER JOIN 庫存狀況 ON 商品.商品編號=庫存狀況.商品編號 GROUP BY 商品.商品編號,商品名稱
刪除索引:
1 DROP INDEX table_name.index_name 或 DROP INDEX 索引名 ON 基表名;
3、Transact-SQL程序設計
1.變量與流程控制
Transact-SQL附加語言元素不是SQL的標準內容,而是Transact-SQL語言爲了編程方便而增長的語言元素。這些語言元素包括變量、運算符、函數、流程控制語言和註釋等內容
(1)變量
實例:
1 聲明一個長度爲10的字符型變量「name」,並賦值。 2 DECLARE @name char(10) 3 SET @name=‘張三’ 4 PRINT @name 5 6 執行結果:張三
(2)set語句
聲明一個局部變量後,該變量將被初始化爲 NULL。使用 SET 語句將一個不是 NULL 的值賦給聲明的變量,給變量賦值的 SET 語句返回單值。在初始化多個變量時,爲每一個局部變量使用單獨的 SET 語句。其語法格式爲:
SET @local_variable=expression
實例:
1 聲明變量,並用SET給變量賦值: 2 DECLARE @myvar char(20) 3 SET @myvar = 'This is a test' 4 SELECT @myvar 5 GO
(3)BEGIN…END語句
做用:將多個T-SQL語句組合成一個語句塊,並將它們視爲一個單元處理
語法格式以下:
BEGIN
{ sql_statement | statement_block }
END
(4)IF… ELSE語句
語法格式以下:
IF <條件表達式>
<命令行或程序塊>
[ELSE [條件表達式]
<命令行或程序塊>]
實例:
1 學號爲「01053113」的同窗平均成績高於80分,則顯示「平均成績還不錯」,不然顯示「平均成績通常」。 2 USE 學生教學管理 3 GO 4 IF ( SELECT AVG(成績) FROM 成績單 WHERE 學號= ' 01053113' ) >80 5 PRINT ' 學號01053113的同窗平均成績還不錯' 6 ELSE 7 PRINT '學號01053113的同窗平均成績通常'
(5)CASE語句
使用CASE語句能夠進行多個分支的選擇,CASE具備如下兩種格式。
簡單CASE的語法格式:
CASE<運算式>
WHEN<運算式>THEN<運算式>
…
WHEN<運算式>THEN<運算式>
[ELSE<運算式>]
END
實例:
1 以簡單CASE格式查詢全部學生的專業狀況,包括學號,姓名和專業名: 2 USE 學生教學管理 3 SELECT 學號,姓名, 4 CASE 專業號 5 WHEN ‘0403’ THEN ‘國際法' 6 WHEN ‘0501’ THEN ‘工商管理' 7 WHEN ‘0904’ THEN ‘計算機科學' 8 END AS 專業 9 FROM 學生
搜索CASE的語法格式:
CASE
WHEN<條件表達式>THEN<運算式>
…
WHEN<條件表達式>THEN<運算式>
[ELSE<運算式>]
END
實例:
1 以搜索CASE格式查詢全部學生的考試等級,包括學號,課程號和成績級別(a、b、c、d、e): 2 USE 學生教學管理 3 SELECT 學號, 課程號, 4 CASE 5 WHEN 成績>=90 then 'a' 6 WHEN 成績>=80 then 'b' 7 WHEN 成績>=70 then 'c' 8 WHEN 成績>=60 then 'd' 9 WHEN 成績<60 then 'e' 10 END AS 成績級別 11 FROM 成績單
(6)WHILE語句
若是須要重複執行程序中的一部分語句,可以使用WHILE循環語句實現。WHILE語句經過布爾表達式來設置一個條件,當這個條件成立時,重複執行一個語句或語句塊,重複執行的部分稱爲循環體。
可使用BREAK和CONTINUE關鍵字在循環內部控制WHILE循環中語句的執行
語法格式:
WHILE<條件表達式>
BEGIN
<命令行或程序塊>
[BREAK]
[CONTINUE]
[命令行或程序塊]
END
實例:
1 顯示字符串「China」中每一個字符和其ASCII值: 2 DECLARE @position int, @string char(5) 3 SET @position = 1 4 SET @string = 'China' 5 WHILE @position <= DATALENGTH(@string) 6 BEGIN 7 SELECT SUBSTRING(@string, @position, 1) , 8 ASCII(SUBSTRING(@string, @position, 1)) 9 SET @position = @position + 1 10 END
1 求1到100的累加和,當和超過1000時中止累加,顯示累加和以及累加到的位置: 2 DECLARE @i int,@a int 3 SET @i=1 4 SET @a=0 5 WHILE @i <= 100 6 BEGIN 7 SET @a=@a+@i 8 IF @a>=1000 BREAK 9 SET @i=@i+1 10 END 11 SELECT @a AS 'a', @i AS 'i'
(7)RETURN語句
使用RETURN語句,能夠從查詢或過程當中無條件退出。可在任什麼時候候用於從過程、批處理或語句塊中退出,而不執行位於RETURN以後的語句。
語法格式爲:RETURN [integer_expression] /*整形表達式*/
其中,整型表達式爲一個整數值,是RETURN語句要返回的值。
注意:當用於存儲過程時,不能返回空值。若是試圖返回空值,將生成警告信息。並返回0值
(8)註釋
2.存儲過程
(1)什麼是存儲過程
(2)存儲過程的特點及優勢
特點:當寫完一個存儲過程後即被翻譯成可執行碼存儲在系統表內,看成是數據庫的對象之一,通常用戶只要執行存儲過程,而且提供存儲過程所需的參數就能夠獲得所要的結果而沒必要再去編輯T-SQL命令
優勢:
(3)建立存儲過程
在窗口中建立存儲過程:
1 (1)打開SQLServer Management Studio,展開要建立存儲過程的數據庫,展開「可編程性」選項,再右鍵單擊「存儲過程」選項,選擇「新建存儲過程」命令 2 (2)出現建立存儲過程的T-SQL命令,編輯相關的命令 3 (3)命令編輯成功後,進行語法檢查,而後單擊「!」按鈕,至此一個新的存儲過程創建成功 4 5 注:用戶只能在當前數據庫中建立存儲過程,數據庫的擁有者有默認的建立權限,權限也能夠轉讓給其餘用戶
使用T-SQL語句建立存儲過程:
1 CREATE { PROC | PROCEDURE } procedure_name [ ; number ] 2 [ { @parameter data_type } 3 [ VARYING ] [ = default ] [ [ OUT [ PUT ] ] [ ,...n ] 4 [ WITH { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } [ ,...n ] ] 5 [FOR REPLICATION] 6 AS sql_statement [ ...n ]
注:
實例:
1 在「學生教學管理」建立無參存儲過程,查詢每一個同窗各門功課的平均成績: 2 CREATE PROCEDURE student_avg 3 AS 4 SELECT 學號, avg(成績) as 平均分 FROM 成績單 5 GROUP BY 學號 6 GO 7 8 在學生教學管理建立帶參數的存儲過程,查詢某個同窗的基本信息: 9 CREATE PROCEDURE GetStudent @number char(8) 10 AS 11 SELECT * FROM 學生 WHERE 學號= @number 12 GO 13 14 在「學生教學管理」建立帶參數的存儲過程,修改某個同窗某門課的成績: 15 CREATE PROCEDURE Update_score @number char(8),@cn char(8),@score int 16 AS UPDATE 成績單 SET 成績=@score 17 WHERE 學號= @number and 課程號=@cn 18 GO
(4)執行存儲過程
在窗口中執行存儲過程:
1 (1)打開SQL Server Management Studio,展開存儲過程所在的數據庫,展開「可編程性」選項,右鍵單擊存儲過程名,如「學生教學管理」中的「GetStudent」,在彈出的快捷菜單中選擇「執行存儲過程」命令 2 (2)進入「執行過程」對話框,輸入要查詢的學生的學號,如「05013113」
使用T-SQL語句執行存儲過程:
1 [ [EXEC[UTE] ] [@return_status=]procedure_name[;number] 2 {[[@parameter=]value | [@ parameter=] @variable [OUTPUT]]} 3 [WITH RECOMPILE ]
實例:
1 執行存儲過程student_avg: EXECUTE student_avg 2 執行帶參數的存儲過程GetStudent,查詢學號爲‘01053113’的學生的基本信息: EXECUTE GetStudent ‘01053113’ 3 執行修改爲績的存儲過程Update_score : EXECUTE Update_score ‘01053113',‘01054010‘,100
(5)查看存儲過程
1 查看存儲過程可使用SQL Server Management Studio界面,也可使用T-SQL 語句。 2 (1)打開SQL Server Management Studio查看. 3 (2)使用T-SQL 語句查看存儲過程. 4 sp_helptext 存儲過程名稱 5 sp_help 存儲過程名稱
(6)修改和刪除存儲過程
1 修改存儲過程: 2 可在SQL Server Management Studio中;也能夠經過T-SQL中的ALTER語句來完成: 3 ALTER { PROC | PROCEDURE } procedure_name [ ; number ] [ { @parameter data_type } 4 [ VARYING ] [ = default ] [ [ OUT [ PUT ] ] [ ,...n ] 5 [ WITH { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } [ ,...n ] ] 6 [FOR REPLICATION] 7 AS sql_statement [ ...n ] 8 9 刪除存儲過程: 10 對於不須要的存儲過程能夠在SQL Server Management Studio中鼠標右擊要刪除的存儲過程,選擇「刪除」命令將其刪除,也可使用T-SQL語句中的DROP PROCEDURE命令將其刪除 11 DROP PROCEDURE {procedure_name} [,…n] 12 procedure_name指要刪除的存儲過程或存儲過程組的名稱。
3.觸發器
(1)觸發器的本質:觸發器也是一種存儲過程,它在特定語言事件發生時自動執行
本質而言,觸發器也是一種存儲過程,它是一種在基本表被修改時自動執行的內嵌過程,主要經過事件進行觸發而被執行,而存儲過程能夠經過存儲過程名字而被直接調用。
(2)觸發器的做用
當對某一張表進行諸如UPDATE、INSERT、DELETE這些操做時,SQL Server 2012就會自動執行觸發器所定義的SQL語句。從而確保對數據的處理符合由這些SQL語句所定義的規則,
觸發器的主要做用是其能實現由主鍵和外鍵所不能保證的複雜的參照完整性和數據的一致性,有助於強制引用完整性,以便在添加、更新或刪除表中的行時保留表之間已定義的關係。
(3)觸發器功能
(4)建立觸發器
利用T-SQL語句建立觸發器:SQL Server 2012提供了CREATE TRIGGER建立觸發器。
語法格式以下:
1 CREATE TRIGGER trigger_name 2 ON { table_name | view } 3 [WITH ENCRYPTION] 4 { FOR | AFTER | INSTEAD OF } 5 { [ INSERT ] [ DELETE ] [ UPDATE ] } 6 [NOT FOR REPLICATION] 7 AS sql_statement [...n ]
實例:
1 # 建立觸發器禁止向成績單表插入數據: 2 CREATE TRIGGER FORBIDDEN_INSERT ON 成績單 FOR INSERT 3 AS 4 BEGIN 5 RAISERROR('未受權',10,1) 6 ROLLBACK TRAN 7 END 8 9 INSERT INTO 成績單(學號,課程號,成績) VALUES ('02093325','09023040',95) 10 11 # 檢查要向學生插入的這條的學號是否成績單表中的學號字段中有,若是不存在則不容許插入: 12 CREATE TRIGGER TRIGINSERTEDMESSAGES ON 學生 AFTER INSERT 13 AS 14 IF EXISTS (SELECT * FROM 學生 A WHERE A.學號 NOT IN (SELECT 學號 FROM 成績單)) 15 BEGIN 16 RAISERROR('數據一致性驗證',16,1) 17 ROLLBACK TRANSACTION 18 END 19 20 # 爲學生表建立一個簡單觸發器,在插入和修改數據時,都會自動顯示提示信息: 21 USE 學生教學管理 22 GO 23 CREATE TRIGGER reminder ON 學生 24 FOR INSERT,UPDATE 25 AS print '你在插入或修改學生表的數據‘ 26 27 UPDATE 學生表 SET 姓名=‘王豔豔’ WHERE 姓名=‘王豔‘
在建立觸發器前,須要注意如下問題:
(5)查看觸發器信息
1 通常有兩種:在SQL Server Management Studio中查看觸發器和使用系統存儲過程查看觸發器。 2 在SQL Server Management Studio中查看觸發器: 3 (1)在SQL Server Management Studio的「對象資源管理器」面板中,展開「學生教學管理」選項,再展開「表」選項,選中「學生」選項並展開,最後再展開「觸發器」選項,選中要查看的觸發器名如「reminder」,鼠標右擊,在彈出的快捷菜單中選擇「編寫觸發器腳本爲」命令,再選擇「CREATE到」,再選擇「新查詢編輯器窗口」。 4 (2)在彈出的T-SQL命令窗口中顯示了該觸發器的語句內容 5 6 7 使用系統存儲過程查看觸發器: 8 系統存儲過程SP_HELP和SP_HELPTEXT分別提供有關觸發器的不一樣信息。 9 (1)經過SP_HELP系統存儲過程,能夠了解觸發器的通常信息,包括名字、擁有者名稱、類型、建立時間。 10 【例】經過SP_HELP查看學生上的觸發器reminder。 11 SP_HELP reminder 12 (2)經過SP_HELPTEXT可以查看觸發器的定義信息。 13 【例】經過SP_HELPTEXT查看學生表上的觸發器reminder 。 14 SP_HELPTEXT reminder 15 還能夠經過使用系統存儲過程SP_HELPTRIGGER來查看某張特定表上存在的觸發器的某些相關信息。 16 【例】經過SP_HELPTRIGGER查看學生表上的觸發器信息。 17 SP_HELPTRIGGER 學生
(6)修改觸發器
1 # 使用ALTER TRIGGER語句來修改觸發器: 2 ALTER RIGGER trigger_name 3 ON { table_name | view } 4 [WITH ENCRYPTION ] 5 { FOR | AFTER | INSTEAD OF } 6 { [ INSERT ] [ DELETE ] [ UPDATE ] } 7 [NOT FOR REPLICATION ] 8 AS sql_statement [...n ]
實例:
1 修改「學生教學管理」中的「學生」上的觸發器reminder,使得在用戶執行添加或修改操做時,自動給出錯誤提示信息,撤銷這次操做: 2 ALTER TRIGGER reminder 3 ON 學生 4 INSTEAD OF INSERT , UPDATE 5 AS print ’你執行的添加或修改操做無效!’
(7)禁止、啓用和刪除觸發器
禁用觸發器與刪除觸發器不一樣,禁用觸發器時,仍會爲數據表定義該觸發器,只是在執行Insert、Update或Delete語句時,除非從新啓用觸發器,不然不會執行觸發器中的操做
刪除觸發器是將該觸發器在數據表上的定義徹底刪除,若是想使用此觸發器,需從新建立
禁用、啓用觸發器:
1 ALTER TABLE table_name 2 [ENABLE | DISABLE] TRIGGER 3 [ ALL | trigger_name [ ,...n ] ] 4 5 【例】禁止學生表上建立的全部觸發器。 6 ALTER TABLE 學生 7 DISABLE TRIGGER ALL
刪除觸發器:
1 刪除已建立的觸發器通常有如下兩種方法: 2 (1)在SQL Server Management Studio的「對象資源管理器」中找到相應的觸發器,鼠標右擊,在彈出的快捷菜單中,選擇「刪除」命令便可。 3 (2)使用T-SQL命令DROP TRIGGER刪除指定的觸發器,刪除觸發器的具體語法格式以下: 4 DROP TRIGGER trigger_ name
實例:
1 使用DROP TRIGGER命令刪除學生上的reminder觸發器: 2 USE 學生教學管理 3 GO 4 DROP TRIGGER reminder 5 注:刪除觸發器所在的表時,SQL Server 將自動刪除與該表相關的觸發器
4.事務和鎖
(1)數據併發性和併發控制的概念
數據庫併發性的含義:爲了充分利用數據庫資源,不少時候數據庫用戶都是對數據庫系統並行存取數據,這樣就會發生多個用戶併發存取同一數據塊的狀況,若是對併發操做不加控制可能會產生不正確的數據,破壞數據的完整性
併發控制就是解決這類問題,以保持數據庫中數據的一致性,即在任何一個時刻數據庫都將以相同的形式給用戶提供數據。
(2)事務的定義
數據庫事務(Database Transaction) ,是指做爲單個邏輯工做單元執行的一系列操做,要麼徹底地執行,要麼徹底地不執行。 事務處理能夠確保除非事務性單元內的全部操做都成功完成,不然不會永久更新面向數據的資源
(3)事務的特徵
(4)SqlServer中的事務分類
1 顯式事務:顯式事務也稱爲用戶自定義事務。有明顯的開始和結束標緻。 2 隱式事務:隱式事務指在當前事務提交或回滾後,由SQL Server自動啓動的新事務。 3 自動事務:自動事務是SQL Server的默認事務管理模式
(5)併發操做與數據的不一致性
(6)鎖