SQL Server基礎知識彙總
阿新 • • 發佈:2018-12-31
第六章:用表組織資料
參照SQL Server 2008 R2圖形化操作介面總結.docx
小結:
1.資料完整性:正確反映實際情況;存在一定的資料冗餘(資料重複)
2.系統資料庫:
A.Master資料庫:系統級別的資訊:
(1)登入賬戶和系統配置資訊
(2)所有其他資料庫及資料庫檔案的位置
(3)初始化資訊
B.Temp資料庫:臨時資料庫,存放臨時表、臨時儲存過程、臨時工作表
(1)每次啟動的時候都要重新建立
C.Model:系統上建立的資料庫模板
D.Ms資料庫:代理程式、作業及記錄、備份和還原記錄。
3.sa登入名:
A.不能把sa的密碼設定為空
4. 資料庫檔案:
A.一個數據庫至少包含一個數據庫檔案和一個事務日誌檔案
B.資料庫檔案:存放資料和資料庫物件的檔案,一個數據庫可以有一個或多個數據庫檔案;
C.一個數據庫檔案只屬於一個數據庫
D.資料庫檔案可以包含:主資料檔案(.mdf)、次資料庫檔案(.ndf)、事務日誌檔案(.ldf);
E.檔案組:主檔案組和次檔案組
第七章:用表組織資料
小結:
1.資料完整性體現方式:
A.實體完整性約束:每一行反映不同的實體,不能存在相同資料行。
實現方式:索引、唯一約束、主鍵約束、標識列
B.域完整性約束:輸入有效性。
實現方式:索引、唯一約束、主鍵約束、標識列
C .引用完整性約束:保持表之間定義的主外來鍵關係。
實現方式:外來鍵約束
規則:
(1)主表中先插入資料,再插入外來鍵表中的資料,而且外來鍵表中外來鍵的資料必須來源於主表被引用的列
(2)更改主表中被引用的資料,外來鍵表中的資料也應當隨之改變
(3)不能直接刪除主表中被外來鍵表引用的資料。
D.自定義完整性約束:使用特定規則。
實現方式:使用資料庫的規則,儲存過程等
2.主鍵:
定義:唯一標識表中的每一行;不允許重複、不允許為空;一個表中只能有一個主鍵。
方式:單列主鍵;符合主鍵。
原則:最少性和穩定性
3.標識列:
定義:自增長。
要求:
(1 )只能是整數型別的資料
(2)標識種子:起始值;標識增量:每一次增加值
(3)每一次執行新增語句都會自動增加。
(4)一張表中只允許有一個標識列。
(5)修改和刪除不會佔用標識列增長。
(6)標識列不允許賦值、也不可以設定預設值
4.檢查約束:
(1)性別只能是男或女:Sex='男' OR Sex='女'
(2)年齡大於0並且小於100:Age>=0 AND Age<=100 BETWEEN 0 AND 100
(3)密碼長度至少6位:Len(password)>=6;
(4)姓張的學員:Sname LIKE '張%'
(5)性別只能是男或女:Sex='男' OR Sex='女'
第八章:用SQL語句操作資料
1).新增語句:單條語句。
1.給指定列新增資料
INSERT INTO Students (SName,SAddress,SGrade,SEmail,SSEX) VALUES ('張青裁','上海松江',6,'[email protected]',0);
**2.給指定列新增資料**
INSERT INTO Students (SName,SAddress,SGrade,SSex) VALUES('李四','shenzhen2',5,0);
**3.給指定列新增資料(省略欄位)**
INSERT INTO Students VALUES('王五','shenzhen4',5);
**4.給指定列新增資料(省略欄位)**
INSERT INTO Students VALUES('趙六','shenzhen',5,'[email protected]',1);
**5.給指定列新增資料(省略欄位、預設值)**
INSERT INTO Students VALUES('jim',DEFAULT,5,'[email protected]',1);
小結:
1.語法:INSERT [INTO] 表名 [([列名)] VALUES(值列表);
2.[]代表的部分可以省略,標識列不允許賦值;除標識列以外如果其他欄位都需要賦值,則可以省略
3.列名需要與值列表匹配(數目一致,型別對應,順序對應)
4.對於字元、日期型別資料,使用''
5.建議列名不要省略;關鍵字大寫。
6.值列表需要滿足檢查約束要求
7.外來鍵列需要滿足外來鍵要求。
2).新增語句:多條語句(INSERT SELECT方式)
小結:
1.語法:
INSERT INTO <表名>(列名)
SELECT <列名>
FROM <源表名>
2.新表必須提前建立;欄位型別需要與源表一致;
3.查詢資料個數、順序、資料型別等必須一致
INSERT INTO AddressList(姓名,地址,電子郵箱) SELECT SName,SAddress,SEmail FROM Students;
3).新增語句:多條語句(SELECT INTO方式)
小結:
1.語法:SELECT 源列 INTO 新表 FROM 源表
2.新表不能提前建立,在執行的過程中建立新表
3.SQL語句只能執行一次
*/
SELECT SName,SAddress,SEmail INTO AddressList2 FROM Students;
--建立表的同時建立標識列
SELECT SName,SAddress,SEmail,IDENTITY(INT ,1,1) INTO AddressList2 FROM Students;
4).新增語句:多條語句(UNION關鍵字聯合方式)
INSERT Students (SName,SGrade,SSex)
SELECT '張可',7,1 UNION
SELECT '李揚',4,0 UNION
SELECT '楊曉',2,0 UNION
SELECT '湯美',3,0 UNION
SELECT '蘇三東',7,1 UNION
SELECT '王立巖',3,1 UNION
SELECT '張偉',7,1 UNION
SELECT '陳剛',4,1 UNION
SELECT '王娟娟',7,0
4).更新資料
1.語法:UPDATE 表名 SET 列名 = 更新值 [WHERE 更新條件]
2.更新多列資料使用逗號隔開
--修改單列資料
UPDATE Scores
SET Scores = Scores + 5
WHERE Scores <= 95;
--修改多列資料
UPDATE Scores
SET Scores = Scores + 5,ClassHour=68
WHERE Scores <= 95
--多條件的聯合使用AND
UPDATE Scores SET Scores = Scores + 5 WHERE ExamDate='2013-9-13' AND SubjectId=1 AND StudentResult<60
5).刪除資料
1.語法:DELETE FROM 表名 [WHERE 更新條件]
DELETE FROM Students
--TRUNCATE刪除資料特點
語法:TRUNCATE TABLE 表名
1.表結構、列、約束等不被改動
2.不能用於有外來鍵約束引用的表(即主表);外來鍵表可以直接使用
3.標識列重新開始編號
4.少用TRUNCATE TABLE,因為它刪除的資料不能恢復
TRUNCATE TABLE Students
第九章:資料查詢基礎
1).查詢語句:
語法:
SELECT <列名>
FROM <表名>
[WHERE <查詢條件表示式>]
[ORDER BY <排序的列名>[ASC或DESC]]
1.查詢的結果是虛擬表(從真實資料表中得到的臨時資料)
SELECT * FROM Students;
--查詢完整寫法
SELECT SCode,SName,SAddress FROM Students WHERE SSEX = 0 ORDER BY SCode;
--給查詢出來的列起別名(AS方式)
SELECT SCode AS 學生編號,SName AS 學生姓名,SAddress AS 學生地址 FROM Students;
--給查詢出來的列起別名(姓名 =方式)
SELECT 姓名 = FirstName+'.'+LastName FROM Employees;
--查詢空值
SELECT SName FROM Students WHERE SEmail IS NULL;
SELECT SName FROM Students WHERE SEmail='';
SELECT SName FROM Students WHERE SEmail IS NULL OR SEmail='';
--使用常量
SELECT 姓名=SName,地址= SAddress , '北京新興橋' AS 學校名稱 FROM Students;
--限定返回行數
SELECT TOP 5 SName, SAddress FROM Students WHERE SSex = 0;
--限定返回行數(百分比形式):得到的結果可以反推出總數(只是大約)
SELECT TOP 20 PERCENT SName, SAddress FROM Students WHERE SSex = 0;
--單列排序
SELECT StudentID,Score FROM Score ORDER BY Score;
--多列排序
SELECT StudentID AS 學生編號, CourseID AS 課程ID, Score AS 成績 FROM Score WHERE Score > 60 ORDER BY CourseID, Score;
2).字串函式:
--CHARINDEX:查詢字串在源字串中出現的位置,從1開始;最後一個引數可選
SELECT CHARINDEX('MY','My Jbns Course',1 );
--字串長度函式:相當於String.length();
SELECT LEN('SQL Server課程');
--轉換為大寫
SELECT UPPER('sql server課程');
--左邊去除空格
SELECT LTRIM (' 周智宇 ');
--右邊去除空格
SELECT RTRIM (' 周智宇 ');
--從右往左取出指定長度的字串
SELECT RIGHT('買賣提.吐爾鬆',3);
--從左往右取出指定長度的字串
SELECT LEFT('買賣提.吐爾鬆',3);
--替換指定文字為新的內容
SELECT REPLACE('莫樂可切.楊可','可','蘭');
--從指定位置刪除一定長度的字串,新增新的字串到該位置
SELECT STUFF('ABCDEFG', 2, 3, '我的音樂我的世界');
3).日期函式:
--獲得當前日期
SELECT GETDATE();
--新增日期中指定的部分(可以是負數)
SELECT DATEADD(MM,4,'01/01/2009');
--獲得指定日期部分的相隔差
SELECT DATEDIFF(DD, '01/01/2009', '05/01/2009');
--獲得指定日期部分的字串
SELECT DATENAME(DW, '01/01/2000');
--獲得指定日期部分的整數(注意是西方的日期習慣:如星期天是1)
SELECT DATEPART(day, '01/15/2000');
4).數學函式:
--獲得隨機數(引數表示種子,種子相同則返回的隨機數結果相同)
SELECT RAND();
SELECT RAND(20);
SELECT RAND(20);
SELECT RAND(200);
--返回絕對值
SELECT ABS(-43);
--向上取整
SELECT CEILING(43.4);
SELECT CEILING(43.5);
SELECT CEILING(43.6);
--向下取整
SELECT FLOOR(43.4);
SELECT FLOOR(43.5);
SELECT FLOOR(43.6);
--求冪
SELECT POWER(5,2);
--四捨五入
SELECT ROUND(43.543,1)
--區分正、負、0
SELECT SIGN(-43);
--求平方根
SELECT SQRT(9);
--4).系統函式:
--轉換資料型別
SELECT CONVERT (VARCHAR (5),12345);
--獲得字串的位元組長度
SELECT DATALENGTH ('中國A聯盟');
--獲得所屬使用者名稱dbo
SELECT CURRENT_USER;
--獲得當前連線登入名(如:sa);
SELECT SYSTEM_USER;
第十章:模糊查詢和聚合函式
1).模糊查詢:
A.萬用字元
1._:匹配一個字元
2.%:匹配任意長度字串
3.[]:匹配括號中指定範圍內的一個字元
4.[^]:與[]相反,排除[]中的字元
LIKE關鍵字
SELECT * FROM Students WHERE 姓名 like '張%';
IS NULL
SELECT SName As 姓名, SAddress AS 地址 FROM Students WHERE SAddress IS NULL;
--''空內容
SELECT SName As 姓名, SAddress AS 地址 FROM Students WHERE SAddress = '';
BETWEEN
1.包含60和80
2.等價於Score>=60 AND Score<=80
3.必須小的數字在前,不可以顛倒(如Score BETWEEN 80 AND 60);
SELECT StudentID, Score FROM SCore WHERE Score BETWEEN 60 AND 80;
IN關鍵字
1.查詢某一列中內容與所列出的內容列表匹配的記錄
2.等價於SAddress='北京' OR SAddress='廣州' OR SAddress='上海'
SELECT SName AS 學生姓名,SAddress AS 地址 FROM Students WHERE SAddress IN ('北京','廣州','上海');
2).聚合函式:
1.聚合函式不能出現在WHERE 字句中
2.只返回一個數值,不能與可能返回多行的列一起使用。
SUM():求和
1.忽略空值
2.只能處理數字型別
SELECT SUM(Score) AS 學號為23的學生總分 FROM Score WHERE StudentID = 23;
AVG():求平均值
1.忽略空值
2.只能處理數字型別
SELECT AVG(SCore) AS 及格平均成績 FROM Score WHERE Score >= 60;
MAX():求最大值
1.返回最大值,忽略空值
2.可以處理數字型別、字元型別、日期/時間型別的資料
SELECT AVG(SCore) AS 平均成績, MAX (Score) AS 最高分, MIN (Score) AS 最低分 FROM Score WHERE Score >= 60;
MIN():求最小值
1.返回最小值,忽略空值
2.可以處理數字型別、字元型別、日期/時間型別的資料
SELECT AVG(SCore) AS 平均成績, MAX (Score) AS 最高分, MIN (Score) AS 最低分 FROM Score WHERE Score >= 60;
COUNT():計數
1.返回總數
2.除去text、image、ntext以外的資料型別
3.COUNT(*)包含空值的行;COUNT(列)不包含
SELECT COUNT (*) AS 及格人數 FROM Score WHERE Score >= 60;
SELECT COUNT (Score) AS 及格人數 FROM Score WHERE Score >= 60;
第十一章:連線查詢和分組查詢
1).分組查詢:
1.語法:
SELECT 列 FROM 表 [WHERE 條件]
GROUP BY 分組列1[,分組列2,....]
[HAVING 篩選條件]
[ORDER BY 排序列1[,排序列2,....]]
2.列:被分組的列;為每個分組返回一個值的表示式,如聚合函式
3.分組的列可以有多個,使用,隔開
4.WHERE 字句表示分組前的資料篩選
5.HAVING字句:分組後的篩選;可以出現聚合函式
SELECT CourseID, AVG(Score) AS 課程平均成績 FROM Score GROUP BY CourseID;
SELECT CourseID, AVG(Score) AS 課程平均成績 FROM Score GROUP BY CourseID ORDER BY AVG(Score);
SELECT COUNT(*) AS 人數,SGrade AS 年級,SSex AS 性別 FROM StudentS GROUP BY SGrade,SSex ORDER BY SGrade;
SELECT COUNT(*) AS 人數,SGrade AS 年級 FROM Students GROUP BY SGrade HAVING COUNT(*)>15;
2).連線查詢:
1.內連線 INNER JOIN ON
2.外連線
左外連線:LEFT [OUTER] JOIN ON
右外連線:RIGHT [OUTER] JOIN ON
內連線:
兩表連線
SELECT S.SName,C.CourseID,C.Score FROM Students AS S INNER JOIN Score AS C ON C.StudentID = S.SCode;
SELECT Students.SName, Score.CourseID, Score.Score FROM Students,Score WHERE Students.SCode = Score.StudentID;
兩表連線加WHERE條件
SELECT G.GradeName,J.SubjectName FROM Subject AS J INNER JOIN Grade AS G ON J.GradeId=G.GradeId WHERE G.GradeId=1;
SELECT Students.SName, Score.CourseID, Score.Score FROM Students,Score WHERE Students.SCode = Score.StudentID WHERE Score.StudentID =1;
三表連線:表沒有順序要求
SELECT S.SName AS 姓名, CS.CourseName AS 課程, C.Score AS 成績 FROM Students AS S
INNER JOIN Score AS C ON (S.SCode = C.StudentID)
INNER JOIN Course AS CS ON (CS.CourseID = C.CourseID);
左外連線:
1、匹配,返回到結果集
2、無匹配,NULL值返回到結果集
3.LEFT左邊的表是主要的表,要求它的主鍵列中的編號都要在結果中有所體現
4.兩個表出現的順序不同,代表的結果和意義不同
--Students主表作為主要的表:有可能會出現主鍵編號對應其它資料為NULL
SELECT S.SName,C.CourseID,C.Score FROM Students AS S LEFT JOIN Score AS C ON C.StudentID = S.SCode;
--Score外來鍵表作為主要的表,不可能出現對應不到的主鍵編號