SQL Server從頭學到尾-----期末總複習

時隔多月終於有時間寫博客了

因爲快要期末了,今天抽時間來更新一下SQL Server,方便一下大家,順順利利期末不掛科
1.數據庫設計步驟
(1)需求分析
(2)概念結構設計
(3)邏輯結構設計
(4)數據庫實施
(5)數據庫運行和維護


2.基本概念
 數據庫系統:由數據庫,硬件,數據庫管理系統組成
 數據庫:表,關係,操作對象
 數據:數字,文字,圖形


3.數據庫文件有三類(主要記住後綴)

主數據文件(.mdf):一個數據庫只有一個
輔助數據文件(.ndf):可以有多個
日誌文件(.ldf):用於恢復數據庫所需的事務日誌信息

4.數據庫標識符

規則:
(1)首字母必須是下列字符之一
a~z,A~Z,“_”,“#”
(2)後面字符
字母、數字、下劃線  “$”,"@"
注意的是 1.以“@”符號開始的標識符表示局部變量或參數  2.以一個數字符號“#”開始的是表示臨時表或過程, 3.以雙數字符號“##”開始的標識符全局臨時對象 如“##gzb”則是全局臨時表4.全局變量:系統提供,以@@開頭,只讀的,也就是說由系統賦值,我們取值,全局變量由系統定義和維護,我們只能讀取,不能修改全局變量的值

5.ER圖(考試大題可能會讓你畫圖)
在這裏插入圖片描述


6.三大範式

1、第一範式(1NF):元組的分量不可再分(每一列都不能再分)
2、第二範式(2NF):在1NF的基礎上,非碼屬性必須完全依賴於候選碼(在1NF基礎上消除非主屬性對主碼的部分函數依賴)
3、第三範式(3NF):在2NF基礎上,任何非主屬性不依賴於其它非主屬性(在2NF基礎上消除傳遞依賴)

例子
(1)第一範式
在這裏插入圖片描述
調整後就滿足第一範式
(2)第二範式
在這裏插入圖片描述
(3)第三範式
在這裏插入圖片描述


7.T-SQL語句分類

DDL(定義語言)create,alter,drop
DQL(查詢語言)insert,update
DML(操作語言)select
DCL(控制語言)revoke,deny,grant

8.註釋

 --這裏是單行註釋
/*這裏是多行註釋*/
/ *sqlserver中不區分大小寫 * /

9.創建刪除語句

(1)create database test --創建數據庫
drop database test --刪除數據庫
(2)create table 表名()
drop database 表名
(3)create view 視圖名--創建視圖
drop view 視圖名
(4)create unique 索引名--創建索引
drop unique 索引名
(5)create trigger 觸發器名
drop trigger 觸發器名

10.SQL語法
(1)0select A from web;
   select * from web;
(2)select distinct country from A;
distinct 查詢不重複的
(3)where
查詢中滿足條件,文本用‘’,數值不用

where中的運算符
=,<> !=,>,<,>=,<=
between 120 and 200包含邊界值
not between  120 and  300  不包含邊界值
like 搜索某種模式
      %表示多個數值
      _表示一個字符
      M%以M開頭
      %M%包含M
      %M_倒數第二個爲M

in 針對某個列的多個可能值
     where A in(200,300)
     A中的列等於200,300的值

(4)order by排序
desc 降序 默認升序
(5)insert into 向表中插入新紀錄

不指定列名
insert into employee(empName, empAge, empAddress)
values('李四',21,'北門')

指定列名
insert into employee(empName, empAge, empAddress)
values('李四',21,'北門')

舊錶插入新表
select * into 新表 from 舊錶 (相當於把表備份了,只備份表結構與數據,約束消失)
select * into student2 from student

--select 列名 into 新表 from 舊錶 (相當於把表備份了,只需要其中幾列)
select stuName,stuSex,stuAddress into student3 from student

--select 列名 as 別名 into 新表 from 舊錶 (相當於把表備份了,只需要其中幾列,可用as加別名)
select stuName as '姓名',stuSex as 性別,stuAddress 地址 into student4 from student

(6)更新表中的記錄(是已經存在的數據)

update 表名
set country='USA'--更新了國家爲USA
where    --固定規定哪些記錄被更新如不寫則全更新

(7)delect刪除表中的行

 delect  from  web
 where name=‘張三’
 where規定哪些行要被刪除,不寫全被刪除

(8)top 規定返回行的數目

select top 5  percent *  from --返回前5行
select top 5  percent * from  A  order by  ID decs  返回後5行

(9)別名AS

 可以使用as關鍵字起別名
 也可以用=來起別名

(10)join 用來把兩個表或者多個表的行連接起來

left join (左連接)右邊沒有用null
right join(右連接)左邊沒有用null
inner join(全連接)都得右
實例
1.左連接
SELECT *FROM 
student AS stu --左表
LEFT JOIN
exam exa --右表 可以省略as關鍵字
ON (stu.stuId = exa.stuId)--on是條件

(11)合併兩個或者多個select 結果

union (兩個select 內部必須有相同列)
選取不同值,不允許重複
union all 
允許重複

(12)數據庫的完整性(約束)
數據完整性=數據的有效性和正確性(完整性=有效,正確)
完整性約束這裏是考試重點要很熟悉

1.唯一約束(允許一行數據爲空) unique
2.主鍵約束(唯一約束 + 非空約束)  primary key
3.默認值約束 default  
4.check約束 限制列中值得範圍
5.主外鍵約束  foreign key
6.非空約束  not null
一個表在不同的關係中既可以是主表又可以是子表
主外鍵是一對多關係

create table student(--創建表
–字段名 數據類型 約束 (一般在此只加非空約束)
 stuId int not null,
 stuName varchar(20) not null,
 stuAge int not null,
 stuSex bit not null,
 stuTel varchar(13) not null,
 stuAddress varchar(30)
)
go
–添加主鍵約束

alter table student  --alter是修改已經存在的
add constraint PK_stuId primary key (stuId)

–添加唯一約束

alter table student
add constraint UQ_stuName unique (stuName)

–添加check約束

alter table student
add constraint CK_stuAge check (stuAge >=18 and stuAge <= 35)

–添加默認約束

alter table student 
add constraint DF_stuAddress default ('地址不詳') for stuAddress

go

create table exam(
examId int not null,
stuId int not null,
labExam int not null,
writtenAxam int not null
)
go
–添加主鍵約束

alter table exam
add constraint PK_examId primary key (examId)

–添加check約束

alter table exam
add constraint CK_labExam check (labExam between 0 and 100)--

between Aand 來確定範圍表示在AB之間
–添加非空約束

alter table exam
add constraint NN_labExam check (labExam is not null)

–設置非空

(alter table 表名 alter column 列名 該列的類型 NOT NULL)
alter table exam 
alter column writtenAxam int not null

在設置空與非空時用is、not is

–添加check約束

alter table exam
add constraint CK_writtenAxam check (writtenAxam >= 0 and writtenAxam <= 100 )

–添加外鍵約束

alter table exam --修改外鍵表
add constraint FK_stuId
foreign key(stuId) references student(stuId)
		  --外鍵表字段			主鍵表字段

go

--刪除約束(alter table 表名 drop constraint 約束名)
alter table exam
drop constraint FK_stuId

哪個是外鍵表,就給它添加外鍵約束
給表添加主外鍵約束的時候遵循3個一致
1.外鍵表外鍵與主鍵表主鍵數據類型一致(語法規範)
2.長度一致(語法規範)
3.名稱一致(一般是項目規範,名稱最好是一致)
也就是說要與主鍵表一一對應


11.索引
對索引不瞭解的可以看一下這個索引介紹
類似於目錄
(1)類型

1.唯一索引(UNIQUE):不允許兩行具有相同的索引值(創建了唯一約束,系統將自動創建唯一索引)
2.主鍵索引:主鍵索引要求主鍵中的每個值是唯一的,(創建主鍵自動創建主鍵索引)
3.聚集索引(CLUSTERED):表中各行的物理順序與鍵值的邏輯(索引)順序相同,表中只能包含一個聚集索引,主鍵列默認爲聚集索引
4.非聚集索引(NONCLUSTERED):表中各行的物理順序與鍵值的邏輯(索引)順序不匹配,表中可以有249個非聚集索引

(2)創建

USE xmgl
GO   --創建索引
IF EXISTS(SELECT* FROM sysindexes WHERE name='emp_id')--創建索引之前要判斷是否存在索引
DROP INDEX UserInfo.emp_id--表名.索引名
GO--先判斷索引是否存在存在則刪除 GO 批處理
CREATE NONCLUSTERED INDEX emp_id-- NONCLUSTERED 非聚集索引 INDEX代表創建的是索引
ON 員工表(員工號)--ON代表在哪個表哪個列(索引關鍵字)
WITH  FILLFACTOR =80  --代表填充因子爲80
GO

(3)指定按照某個索引進行查詢如下

SELECT 字段1,字段2 FROM 表名 WITH (INDEX = 索引名) WHERE 查詢條件
SELECT 字段1,字段2 FROM 表名 WITH (INDEX(索引名)) WHERE 查詢條件
指定按'IX_stuName'索引查詢
--指定按索引IX_stuName進行查詢
SELECT * FROM student WITH(INDEX(IX_stuName))
WHERE stuName = '令狐沖'
-指定按索引IX_stuName進行查詢
SELECT * FROM student WITH(INDEX = IX_stuName)
WHERE stuName = '令狐沖'

12.group by
定義:具體學習在group by我覺得講的比較好

 對其進行分組GROUP BY必須得配合聚合函數來用,分組之後你可以計數(COUNT),求和(SUM),求平均數(AVG)等。

聚合函數

count() 計數
sum() 求和
avg() 平均數
max() 最大值
min() 最小值

需要注意的
NUll不計算在內,如下示例

SELECT COUNT(schoolName),COUNT(hobby), COUNT(*) FROM student

13.having

where 和 having 的區別
where 對錶中的原始數據進行的篩選
having 對分組後使用聚合函數計算後的數據進行的篩選,與GROUP BY結合使用

我們舉個例子:

每個部門人數都有了,那如果我們想要進一步知道員工人數大於30000的部門是哪些,這個時候就得用到HAVING了。

SELECT
dept_no as 部門,
count( emp_no) as 人數
FROM
dept_emp 
WHERE
to_date = '9999-01-01' 
GROUP BY
dept_no

13.in or 關鍵字
in可以用or代替

--使用or關鍵字
SELECT * FROM student WHERE stuAge = 18 OR stuAge = 27 OR stuAge = 26
--使用in關鍵字
SELECT * FROM student WHERE stuAge IN (18, 27, 26)
--使用BETWEEN AND 關鍵字
SELECT * FROM student WHERE stuAge BETWEEN 18 AND 27
SELECT * FROM student WHERE stuAge >= 18 AND stuAge <= 27

14.自動增加
在定義創建表的時候可以用

ID int identity (1,1) primary key
開始值爲1,後面自動加1

15.字符串函數
CHARINDEX函數,下標從1開始,如果沒找到的話返回0,而在java中下標從0開始,沒找到的話返回-1

SELECT CHARINDEX('on', 'my name is jiongjiong', 15)
--LEN函數
SELECT LEN('jack')
--LEN函數是求長度
SELECT stuName, stuAddress, LEN(stuAddress) AS '長度' FROM student

--RTRIM函數和LTRIM函數是去掉左右兩邊的空格
SELECT * FROM student WHERE RTRIM(LTRIM(stuAddress)) = '江西省贛州市'
SELECT *FROM student WHERE LTRIM(stuAddress) = '江西省贛州市'
UPDATE student SET stuAddress = ' 江西省 贛州市 ' WHERE stuId =19

16.日期函數
詳細講解點擊日期函數講解
(1)GETDATE() 返回當前系統日期
(2)DATEADD(日期部分,常數,日期) 返回將日期的指定日期部分加常數後的結果返回
(3)DATEDIFF( 日期部分,日期1,日期2) 返回兩個日期之間的差值,日期部分(日期1-日期2)
(4)DATENAME() 返回指定日期的日期部分的字符串(返回字符串)
(5)DATEPART() 返回指定日期的日期部分的整數(返回整數)
(6)DAY() 返回指定日期的日部分的整數
(7)MONTH() 返回指定日期的月部分的整數
(8)YEAR() 返回指定日期的年部分的整數


17.T-SQL定義變量
聲明變量 :DECLARE 變量名 數據類型
定義變量:使用@符號
給變量賦值使用:set關鍵字

DECLARE @age INT
SET @age = 10
PRINT @age
--SELECT @age
PRINT '@age = ' + CONVERT(VARCHAR(5), @age)
SELECT @age = stuAge FROM student WHERE stuId = 10 --必須確保只有一條記錄
PRINT @age
PRINT '@age = ' + CONVERT(VARCHAR(5), @age)
DECLARE @stuAge INT
SELECT @stuAge = stuAge FROM student WHERE stuName = '李四'
SELECT * FROM student WHERE stuAge > @stuAge

18.子查詢(非常重要!!!自己去找練習題多做題
子查詢(一個查詢的結果作爲另外一個查詢的條件一般子查詢要保證返回結果只有一個(即一行,一列)in子查詢返回一列多行子查詢從內往外讀(寫)當要顯示多個表數據時使用聯結,只顯示一個表數據時使用子查詢
)

SELECT * FROM student WHERE 
stuAge > (SELECT stuAge FROM student WHERE stuName = '李四')

牛客上有許多練習題區多練習!!!!


19.流程控制

SELECT  * FROM exam
SELECT  *, '等級' =  
CASE 
	WHEN labExam < 60 THEN 'E'
	WHEN labExam > 60  AND labExam <= 69 THEN 'D'
	WHEN labExam BETWEEN 70 AND 79 THEN 'C'
	WHEN labExam BETWEEN 80 AND 89 THEN 'B'
	ELSE 'A'
END
FROM exam

回顧下以前的知識
流程控制,分支判斷
多重判斷:嵌套if,階梯式if(可以是區間範圍,可以是定值),switch(只能是某個定值)


20.WHILE循環

DECLARE @testIndex int
SET @testIndex = 0
WHILE(@testIndex < 10)
 BEGIN
	PRINT '第' + CAST((@testIndex + 1 ) AS VARCHAR(3))+ '次打印hello'
	SET @testIndex = @testIndex + 1
END

21.視圖
視圖的優點或用途:

1.篩選表中的行
2.防止未經許可的用戶訪問敏感數據
3.降低數據庫的複雜程度(或者說降低sql的複雜度)
4.將多個物理數據庫抽象爲一個邏輯數據庫

視圖特點:

視圖是爲查詢服務的,不能通過視圖新增、修改、刪除數據,同一張

表可以根據需求創建不同的視圖

將多個物理數據庫抽象爲一個邏輯數據庫,以下示例

CREATE VIEW 視圖名 
AS 
SELECT 表A.列1,表A.列2,表B.列1,表B.列2 FROM 數據庫名1.角色名.表名1 AS 表A
INNER JOIN 數據庫名2.角色名.表名2 AS 表B
ON (表A.主鍵 = 表B.外鍵)

CREATE VIEW test1 
AS 
SELECT * FROM student WHERE stuSex = 0 
GO
SELECT * FROM test1
go
alter VIEW test1 AS SELECT *,stuId AS 'id', stuName AS 'myName' FROM student WHERE stuSex = 0
GO

更新視圖中的數據,對視圖中的數據的增加,刪除,修改時也會影響原表

UPDATE test1 SET stuName = '風清揚老前輩' WHERE id = 5
IF('a' = 'a')
PRINT '相等'
ELSE
PRINT '不相等'

IF('a' = 'A')
PRINT '相等'
ELSE
PRINT '不相等'

22.事務
(1)事務什麼時候用:

同時執行多個insert,update,delete,sql語句時使用事務是作爲單個邏輯工作單元執行的一系列操作,這些操作作爲一個整體一起向系統提交,要麼都執行,要麼都不執行,事務是一個不可分割的工作邏輯單元

(2)事務必須具備一下4個屬性,簡稱ACID

1.原子性A
2.一致性C
3.隔離性I
4.永久性D

(3)語句

BEGIN TRANSACTION 開始事務
COMMIT TRANSACTION 提交事務
ROLLBACK TRANSACTION 回滾事務

(4)事務分類

1.顯示事務:用BEGIN TRANSACTION 關鍵字明確指定事務的開始和明確指定提交事務(COMMIT TRANSACTION )和明確指定回滾(ROLLBACK TRANSACTION)
2.隱式事務:不需要指定事務的開始即不需要使用BEGIN TRANSACTION關鍵字開始,但是需要手工提交事務和手工回滾事務,如果要用隱式事務的話,需要設置一個開關(即SET IMPLICIT_TRANSACTIONS ON)。你也可以理解爲顯示事務和隱式事務沒什麼區別,不同的地方就是,顯示需要用BEGIN TRANSACTION 關鍵字,隱式不需要用BEGIN TRANSACTION 關鍵字。因爲它已經是隱式事務了,就沒有必要每次都加上BEGIN TRANSACTION 了,但是我們必須在後面加上提交事務(COMMIT TRANSACTION )和回滾事務(ROLLBACK TRANSACTION),必須手工去提交事務或手工回滾事務了
3.自動提交事務:這是sqlserver的默認模式,它將每條單獨的T-SQL語句視爲一個事務

開啓隱式事務:SET IMPLICIT_TRANSACTIONS ON
關閉隱式事務:SET IMPLICIT_TRANSACTIONS OFF

我們暫時只能在一條conn上做事務,如果要在多條conn上做事務,一般藉助框架或容器,使用JTA(java TRANSACTION API)即java事務接口


23.存儲過程
看這篇文章吧小編又變懶了存儲過程


24.觸發器
(1)定義

觸發器(TRIGGER)是由事件來觸發某個操作。這些事件包括INSERT語句、UPDATE語句和DELETE語句。當數據庫系統執行這些事件時,會激活促發其執行相應的操作。

(2)觸發器語法

CREATE TRIGGER trigger_name
ON table_name
[WITH encryption] --是否加密
FOR [DELETE,INSERT,UPDATE]
AS
T_SQL語句
GO

(3)查看觸發器

SHOW TRIGGERS 語句查看觸發器信息
SHOW TRIGGERS;
在 triggers 表中查看觸發器信息
DROP TRIGGER trig_book2 ;

這裏就不進行具體講解詳細學習點擊這個查看觸發器

在這裏插入圖片描述
點贊+收藏,有錯誤評論區歡迎指出

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