--1.SQL由什麼檔案和什麼檔案組成?
/* 答:SQL由資料檔案和記錄檔組成 */
--2.SQL的資料檔案分哪兩類?副檔名分別是什嗎?分別可以有多少個?
/* 答:SQL的資料檔案分主要資料檔案和二級資料檔案。
主要資料檔案有且只有一個,二級資料檔案0-N個 副檔名:主要資料檔案:MDF 二級資料檔案:NDF */
--3.SQL檔案組和檔案的關係?
/* 答:檔案存放在檔案組中,一個檔案只能屬於一個檔案組; 一個檔案組可以有多個檔案。 */
--4.用代碼建立多個資料檔案的資料庫?
/* 答:
CREATE DATABASE DatabaseName primary ON
( name=邏輯名, filename=實體名稱, --副檔名是mdf size=初始大小, maxsize=最大值, filegrowth=增長 ),
--多個檔案組之間用逗號分隔 filegroup 檔案組名
( name=邏輯名, filename=實體名稱, --副檔名是ndf size=初始大小, maxsize=最大值, filegrowth=增長 )
log ON
( name=邏輯名, filename=實體名稱, --副檔名是ldf size=初始大小, maxsize=最大值, filegrowth=增長 ) */
--5.用代碼建立表?
CREATE TABLE TABLE_NAME --建立表的表名
( [ID] int IDENTITY(1,1) PRIMARY KEY, --設定ID為自增長的主鍵
[NAME] varchar(20) NOT NULL , --設定名字不為空白
[AGE] tinyint CHECK([AGE]<120) --設定年齡小於120 )
--6.用代碼實現修改資料庫,添加檔案組?
ALTER DATABASE DATABASENAME --要修改的資料庫名
ADD FILEGROUP FILEGROUPNAME --要添加的檔案組名
--7.用代碼實現修改檔案,檔案組?
/* 答: --修改檔案樣本
ALTER DATABASE DATABASENAME
modify file (
[name]='原邏輯名',
[NEWNAME] = '新邏輯名',
[FILENAME] = '新檔案名稱',
[SIZE] = '檔案大小',
[MAXSIZE] = '檔案的最大值',
[FILEGROWTH] = '檔案增長值或增長百分比' )
*/ --修改檔案組
ALTER DATABASE Demo_20091230NEW
MODIFY FILEGROUP filegroup2 name = Newfilegroup_name
-- 8.用代碼修改表實現添加列、修改列、刪除列?
-- 添加列 範例程式碼 ALTER TABLE Student ADD [S_Number] Varchar(20)
-- 刪除列 範例程式碼 ALTER TABLE Student DROP COLUMN [S_Number]
-- 修改列 範例程式碼 ALTER TABLE Student ALTER COLUMN [S_Name] varchar(8)
--修改列名 通過系統預存程序 SP_RENAME 'Student.S_Name' ,'S_NAME_NEW'
-- 9.用代碼實現查看錶、資料庫的資訊?
/* 答:查看錶:sp_help 表名 查看資料庫:sp_helpDB 資料庫名
*/ --範例程式碼: --查看錶: sp_help class
--查看錶: sp_helpdb Demo_20091230NEW
-- 10.重新命名資料庫和表的SQL語句?
--重新命名表的SQL語句(調用預存程序) SP_RENAME class,classNew
--不添加引號 SP_RENAME 'class','classNew'
--添加引號 --重新命名表的SQL語句(ALTER DATABASE) ALTER DATABASE Demo_20091230NEW Modify name = Demo_20091230
--重新命名資料庫的SQL語句 SP_RENAMEDB Demo_20091230NEW,Demo_20091230
--不添加引號 SP_RENAMEDB 'Demo_20091230','Demo_20091230NEW' --添加引號
-- 11.什麼是資料庫的完整性?
/*答:確保資料庫的一致性和精確性, 可以用約束和觸發器來實現。 */
-- 12.資料庫完整性的分類?
/*答:實體完整性:規定表的每一行在表中是唯一的實體。(主鍵)
值域完整性:是指表中列滿足特定的資料類型和約束。
參考完整性:兩個表的主鍵和外鍵的關鍵字一致。
自訂完整性:使用者自己定義的資料類型的約束。 */
-- 13.約束分為哪兩個層級,它和完整性的關係?
/* 答:約束分表層級和列層級,可以相互轉換,只是寫法不同。
建立聯合主鍵的時候一定要用表級約束
PRIMARY KEY約束 (實現實體完整性)
UNIQUE KEY約束 (實現值域完整性)
NOT NULL約束 (實現值域完整性)
CHECK約束 (實現值域完整性)
FOREIGN KEY約束 (實現參考完整性) 自訂資料類型(實現自訂完整性) 其中PRIMARY KEY、UNIQUE KEY、FOREIGN KEY 可以建立表層級和列層級約束。 */
-- 14.用代碼建立NOT NULL 約束?
/* 答:直接在建立表的時候添加。
*/ --程式碼範例: CREATE TABLE Student ( [ID] int NOT NULL )
-- 15.用代碼建立primary key 約束(兩種方式)?
/* 答:primary key 約束可以用列級和表級兩種方式建立。 建立聯合主鍵的時候,必須用表級的方式建立。
*/ --範例程式碼(列級) CREATE TABLE Student ( [ID] int PRIMARY KEY, [NAME] varchar(20) )
--範例程式碼(表級) CREATE TABLE Student ( [ID] int , [NAME] varchar(20) CONSTRAINT PK_STUDENT PRIMARY KEY ([ID],[NAME]) )
-- 16.用代碼建立foreign key 約束(兩種方式)?
/* 答:foreign key 約束可以用列級和表級兩種方式建立。
*/ --範例程式碼(列級) CREATE TABLE Student ( [ID] int PRIMARY KEY, [C_NAME] varchar(20) REFERENCES CLASS([C_NAME])
--學生表中的課程名引用課程表中的課程名 )
--範例程式碼(表級) CREATE TABLE Student } ( [ID] int PRIMARY KEY, [C_NAME] varchar(20), CONSTRAINT FK_C_NAME FOREIGN KEY ([C_NAME]) REFERENCES CLASS([C_NAME]) --學生表中的課程名引用課程表中的課程名 )
-- 17.用代碼建立unique key 約束(兩種方式)?
/* 答:unique key 約束可以用列級和表級兩種方式建立。 在建立約束的列上添加唯一約束。
*/ --範例程式碼(列級) CREATE TABLE Student ( [ID] int PRIMARY KEY, [C_NAME] varchar(20) REFERENCES CLASS([C_NAME]), --學生表中的課程名引用課程表中的課程名 [S_NUM] varchar(20) UNIQUE --學號必須唯一 )
--範例程式碼(表級)
CREATE TABLE Student ( [ID] int PRIMARY KEY, [C_NAME] varchar(20) REFERENCES CLASS([C_NAME]), --學生表中的課程名引用課程表中的課程名 [S_NUM] varchar(20), CONSTRAINT UN_S_NUM UNIQUE([S_NUM]) --學號必須唯一 )
-- 18.用代碼建立check 約束(兩種方式)?
/* 答:check 約束可以用列級和表級兩種方式建立。
*/ --範例程式碼(列級) CREATE TABLE Student ( [ID] int PRIMARY KEY, [C_NAME] varchar(20) REFERENCES CLASS([C_NAME]), --學生表中的課程名引用課程表中的課程名 [S_NUM] varchar(20) UNIQUE, --學號必須唯一 [S_AGE] tinyint CHECK([S_AGE]<60) --年齡必須小於60歲 ) --範例程式碼(表級) CREATE TABLE Student ( [ID] int PRIMARY KEY, [C_NAME] varchar(20) REFERENCES CLASS([C_NAME]), --學生表中的課程名引用課程表中的課程名 [S_NUM] varchar(20), [S_AGE] tinyint , CONSTRAINT CK_S_AGE CHECK([S_AGE]<60) --學號必須唯一 )
-- 19.用代碼實現修改、刪除約束?
/*答:修改約束:只有NOT NULL能通過修改列的方式修改約束。
刪除約束:DROP CONSTRAINT 關鍵字,後面跟約束名稱。
*/ --範例程式碼(通過修改列的方式修改NOT NULL約束。): ALTER TABLE class ALTER COLUMN [NAME] varchar(20) NOT NULL
--刪除代碼: DROP CONSTRAINT CK_S_AGE --刪除學號唯一約束
-- 20.用代碼實現查看約束的資訊?
/*答:查看約束SP_HELPCONSTRAINT 約束名稱 */
--程式碼範例: SP_HELPCONSTRAINT CK_S_AGE
--查看學號唯一約束 sp_helpconstraint CK_S_AGE
-- 21.SQL有哪些資料類型?
/*答: 日期類型:DATETIME、SMALLDATETIME
整數類型:BIGINT、INT、SMALLINT、TINYINT
浮點型:DOUBLE、FLOAT、DECIMAL、REAL、NUMERIC
貨幣類型:MONEY、SMALLMONEY
字元類型:CHAR、VARCHAR、NCHAR、NVARCHAR
位元據類型:BINARY、VARBINARY、IMAGE
全域唯一標識:UNIQUEIDENTIFIER
大容量資料類型:TEXT、NTEXT、IMAGE */
-- 22.SQL語句分類(DDL、DQL、DML、DCL)?
/* 答:資料定義語言 (Data Definition Language):DDL(Data Definition Language)建立、刪除、修改資料庫物件
如:表、視圖、模式、觸發器、預存程序等。
資料查詢語言:DQL(Data Query Language)使用者檢索資料庫的。
資料操縱語言:DML(Data Manipulation Language)用於添加、修改、刪除儲存在 資料庫物件中的資料。
資料控制語言:DCL(Data Control Language)控制訪問資料庫許可權的。
資料定義語言 (Data Definition Language):CREATE、DROP、ALTER
資料查詢語言:SELECT
資料操縱語言:INSERT、UPDATE、DELETE
資料控制語言:GRANT(授權)、DENY(拒絕)、REVOKE(移除) */
-- 23.關鍵字identity是什麼意思?
/* 答:關鍵字identity表示自動編號,自增長。 */
-- 24.uniqueidentifier是什麼意思?如何產生?
/* 答:uniqueidentifier表示全球唯一標識。用SELECT NEWID()產生 */
--程式碼範例: SELECT NEWID() AS 全球唯一標識
-- 25.預設值建立?綁定預設值?取消綁定預設值?
/* 答:建立預設值有兩種:
a)建立表的時候附帶建立
b)使用CREATE DEFAULT 關鍵字
區別:後再獨立於表存在,前者必須要有表。
綁定預設值:使用sp_bindefault 預設值名,表名.列名。
注意:只有使用CREATE DEFAULT 關鍵字才需要綁定。
取消綁定預設值:使用sp_unbindefault 預設值名,表名.列名。
注意:只有使用CREATE DEFAULT 關鍵字才需要綁定。
*/ --程式碼範例:建立表的時候附帶建立 CREATE TABLE CLASS ( [ID] int PRIMARY KEY , [NAME] varchar(20) DEFAULT('tom') )
--程式碼範例:使用CREATE DEFAULT 關鍵字建立 CREATE DEFAULT DF_NAME AS 'tom'
--程式碼範例:綁定預設值到CLASS表的NAME列上 sp_bindefault DF_NAME,'CLASS.NAME'
--程式碼範例:取消綁定預設值到CLASS表的NAME列上 sp_unbindefault DF_NAME,'CLASS.NAME'
-- 26.規則建立?綁定規則?取消綁定規則?
/* 答:建立規則用CREATE RULE 關鍵字
綁定規則用SP_BINDRULE系統預存程序
取消綁定規則SP_UNBINDRULE系統預存程序
*/ --程式碼範例:使用CREATE DEFAULT 關鍵字建立 CREATE RULE RU_NAME AS @NAME ='tom'
--程式碼範例:綁定規則到CLASS表的NAME列上 SP_BINDRULE RU_NAME,'CLASS.NAME'
--程式碼範例:取消綁定規則到CLASS表的NAME列上 SP_UNBINDRULE 'CLASS.NAME'
-- 27.如何建立自訂類型?
/* 答:建立自訂類型:用系統預存程序:SP_ADDTYPE */
--程式碼範例:建立一個身份證的資料類型(18為字元)且不允許為空白 SP_ADDTYPE IdCard,'varchar(18)','NOT NULL'
-- 28.Select查詢執行順序?
/* 答:
1.執行FROM字句,根據FROM字句後面的一個或多個表建立工作表。
如果是多個表,將對錶進行交叉串連。
如果只有一個表,就直接作為工作表。
2.如果有WHERE字句,根據WHERE字句搜尋滿足條件的行。
3.如果有GROUP BY字句,會對第二步產生的結果集進行分組匯總。
4.如果有HAVING字句,會對第三步產生的結果集進行組篩選。
5.如果有DISTINCT、TOP關鍵字,將在第四步的基礎上進行過濾,去掉重複的行。
6.如果有ORDER BY字句,會在第五步的基礎上進行排序。
7.顯示查詢結果。 */
--29.資料庫中的表關係有哪幾種?分別是什嗎?
/* 答:分四種(一對一、一對多、多對一、多對多)
多對多:必須要分表,分解成兩個多對一 舉例:如學生和課程是多對多關係,新增一個學生選修課程表。
學生和學生選修課程表是一對多關聯性 課程和學生選修課程表是一對多關聯性 */
--30.串聯刪除、更新的關鍵字是什嗎?並寫出代碼?
/* 答:串聯刪除關鍵字:ON DELETE CASCADE
串聯更新關鍵字:ON UPDATE CASCADE
程式碼範例如下: */ --修改表添加串聯刪除、串聯更新外鍵約束 ALTER TABLE StudentClass ADD CONSTRAINT jlDelete FOREIGN KEY (Fk_S_ID) REFERENCES Student(S_ID) ON DELETE CASCADE ON UPDATE CASCADE
--31.表的串連有哪幾種?它們的含義分別是什嗎?
/* 答:共五種。
INNER JOIN :內串連(以兩個表中匹配的記錄為準)
LEFT JOIN/LEFT OUTER JOIN: (以左邊的表中有的記錄為準)
RIGHT JOIN/RIGHT OUTER JOIN: (以右邊的表中有的記錄為準)
FULL JOIN/FULL OUTER JOIN: (以兩邊的表只要有一個表有的記錄即可)
CROSS JOIN:(兩個表的記錄的笛卡爾積) */
--32.消除重複行的關鍵字是什嗎?
/* 答:DISTINCT(放在SELECT關鍵字後面) */
--33.分組時既能顯示明細記錄又能顯示匯總值的關鍵字是什嗎? --請寫一個範例程式碼?
/* 答:關鍵字:COMPUTE\COMPUTE BY */ SELECT S_GROUP,S_AGE AS '平均年齡' FROM Student WHERE S_GROUP = '二組' ORDER BY S_GROUP COMPUTE AVG(S_AGE) BY S_GROUP
--34.SQL中的萬用字元有幾種?每種的含義是什嗎?
/* 答: '_' 表示一個任一字元;
'%' 表示0-N個任一字元;
'[ABC]'表示A或B或C中的一個任一字元,常與'%'連用;
'[^ABC]'表示不是A且B且C中的一個任一字元,常與'%'連用; */
--35.Rollup和CUBE的相同點和異同點是什嗎?
/* 答:都是對分組(GROUP)中的匯總結果集的擴充。
CUBE的擴充要比Rollup多。 */ --只根據'組'分組 SELECT S_Group,AVG(S_age) FROM Student GROUP BY S_Group
SELECT S_Group,AVG(S_age) FROM Student GROUP BY S_Group WITH ROLLUP
SELECT S_Group,AVG(S_age) FROM Student GROUP BY S_Group WITH CUBE --根據'組'和'姓名'分組 SELECT S_Group,S_Name,AVG(S_age) FROM Student GROUP BY S_Group,S_Name
SELECT S_Group,S_Name, AVG(S_age) FROM Student GROUP BY S_Group,S_Name WITH ROLLUP
SELECT S_Group,S_Name,AVG(S_age) FROM Student GROUP BY S_Group,S_Name WITH CUBE
--36.子查詢的種類?它們的區別是什嗎?
/* 答:子查詢分標準子查詢(嵌套子查詢)和相互關聯的子查詢
區別:標準子查詢(嵌套子查詢)子查詢只執行一次;
相互關聯的子查詢:子查詢執行0-N次; */ --樣本: --尋找年齡在23歲以內的學生的資訊(用子查詢的方式) --標準子查詢 SELECT * FROM student WHERE S_NAME IN (SELECT S_NAME FROM student WHERE student.S_age <23)
--尋找學生資訊並統計班級每個學生與班級平均年齡的差值 --相互關聯的子查詢 SELECT *, (SELECT AVG(S_age) FROM student) AS '班級平均年齡', S_age - (SELECT AVG(S_age) FROM student) AS '差值' FROM student
--37.子查詢的意義和寫子查詢的注意事項?
/* 答:子查詢的意義:簡化複雜的查詢, 將一個複雜的查詢邏輯上分解成幾個簡單的查詢。
子查詢的注意事項:
1.帶有小括弧
2.可以在很多地方使用
a)使用別名時;
b)使用IN或NOT IN時;
c)使用UPDATE、INSERT、DELETE語句時;
e)使用比較子時;
f)使用ANY、SOME、ALL時;
g)使用EXIST或NOT EXIST時;
h)使用運算式的地方。 */
--38.關鍵字SOME、ALL的含義?請寫出程式碼範例?
/* 答:SOME、ALL都是和比較子(>、>=、<、<=、!=、<>、=)聯用, 用於比較SOME、ALL字查詢所返回的值。
*/ --樣本:尋找年長(年齡在平均年齡之上)的學生的資訊
SELECT * FROM u_student WHERE [AGE] > ALL(SELECT AVG(ISNULL([AGE],0)) FROM u_student)
--39.關鍵字IN的含義?請寫出程式碼範例?
/* 答:關鍵字IN表示在...裡
*/ --樣本:尋找姓名等於張三或李四的學生的記錄 SELECT * FROM u_student WHERE [NAME] in ('張三','李四')
--40.視圖分為哪三類?請寫出程式碼範例?
/* 答:單表視圖:資料只來源於一個表。
多表視圖:資料只來源於多個表。
嵌套視圖:資料只來源於視圖。
*/ --樣本:嵌套視圖 --建立學生資訊視圖(單表視圖) CREATE VIEW V_StudentInfo AS SELECT * FROM u_student us
--建立學生姓名資訊視圖(嵌套視圖) CREATE VIEW V_StudentNameInfo AS SELECT [NAME] FROM V_StudentInfo
--41.視圖的優缺點是什嗎?
/* 答:視圖優點:
1.簡化查詢操作
2.隱蔽敏感性資料,提高安全性
3.定製資料
4.資料的查詢和儲存分離
視圖缺點:
1.效能較低
2.更新受限:SELECT語句中使用了HAVING、GROUP BY、TOP、DISTINCT、
計算資料行、彙總函式關鍵字後就不能更新 */
--42.索引的作用是什嗎?索引分為哪兩類?它們的區別是什嗎?請寫出程式碼範例?
/* 答:索引的作用是用來最佳化查詢,提高查詢速度的。
索引分為叢集索引(簇索引)或非叢集索引(非簇索引)
區別:1.叢集索引的頁級頁存放的是實際的資料而
非叢集索引得頁級頁存放的是索引資訊,這些索引資訊存放在索引頁中。
2.非叢集索引可以建立在資料堆上也可以建立在叢集索引上。
3.唯一索引屬於非叢集索引,但比非叢集索引多了一個UNIQUE(唯一)約束。 建立索引的關鍵字CREATE INDEX */
--樣本:在u_STUDENT表的[NAME]列上建立叢集索引 CREATE CLUSTERED INDEX CLU_INDEX ON u_STUDENT([NAME])
--樣本:在u_STUDENT表的[NAME]列上建立非叢集索引 CREATE NONCLUSTERED INDEX CLU_INDEX ON u_STUDENT([NAME])
--樣本:在u_STUDENT表的[NAME]列上建立唯一叢集索引 CREATE UNIQUE INDEX CLU_INDEX ON u_STUDENT([NAME])
--43.查看錶的索引的SQL語句是什嗎?請寫出程式碼範例?
/* 答:查看錶的索引的SQL語句是 SP_HELPINDEX 表名 */ --程式碼範例 SP_HELPINDEX Class
--44.重新整理索引的SQL語句是什嗎?請寫出程式碼範例?
/* 答:重新整理索引的SQL語句是DBCC INDEXDEFRAG(資料庫名稱,表名,索引名) DBCC 是一個資料庫工具集 */ --程式碼範例 DBCC INDEXDEFRAG(Demo_20091230NEW,Class,PK__Class__49C3F6B7)
--45.SQL的盤區分為哪兩種,它們的區別是什嗎?
/* 答:SQL的盤區分:統一擴充盤區和混合擴充盤區。
統一擴充盤區:只存放一種類型資料頁。
混合擴充盤區:存放二種或兩種以上的資料頁。
--46.SQL的資料頁一共有幾種?分別是什嗎?
/* 答:SQL的資料頁一共有八種。資料頁、索引頁、文本\映像頁、可用空間頁、
全域分配映射表、輔助全域分配映射表、索引配置對應表、
大容量差異映射表\大容量差異更改映射表。
資料頁:存放真實的資料。
索引頁:存放索引資料,如非叢集索引的頁級頁。
文本\映像頁:存放大容量資料類型,如Image、text、ntext。
可用空間頁:資料庫中資料頁的使用方式,0表示沒有使用,1表示使用。 */
--47.E-R(Entity-Relationship)模型的三要素是什嗎?
/* 答:E-R(Entity-Relationship)模型的三要素是:實體、關係、屬性。
實體:真實存在的事物。(客戶為了完成自己的營運目標需要用到的人或事物)
關係:實體間的關係:有一對一、一對多、多對一、多對多(需要分表)
屬性:實體的特徵,可映射成資料庫中的列。
--48.資料庫設計的過程分為哪幾個步驟?
/* 答:資料庫的設計過程大致可分為4個步驟:
a)需求分析:調查和分析使用者的商務活動和資料的使用方式,弄清所用資料的種類、範圍、數量以及它們在商務活動中交流的情況,
確定使用者對資料庫系統的使用要求和各種約束條件;
b)概念設計:使用者要描述的現實世界的概念資料模型;
c)邏輯設計:主要工作是將現實世界的概念資料模型設計成資料庫;
d)實體設計:確定資料庫的儲存結構。 */
--49.關鍵字UNION /UNION ALL的含義?請寫出程式碼範例?
/* 答:關鍵字UNION /UNION ALL表示串連兩個表的內容進行查詢。
*/ --範例程式碼:串連查詢出‘語文’、‘數學’的課程資訊 SELECT * FROM Class WHERE Class_Name = '語文' UNION ALL SELECT * FROM Class WHERE Class_Name = '數學'
--50.關鍵字EXISTS的含義?請寫出程式碼範例?
/* 答:關鍵字EXISTS用來表示子查詢中是否存在滿足條件的記錄。
如果存在返回TRUE,否則返回FALSE。
*/ --範例程式碼:尋找‘數學’課的課程資訊 SELECT * FROM Class a WHERE EXISTS (SELECT * FROM Class b
WHERE b.Class_Name = '數學' AND a.ID = b.ID)
--範例程式碼:判斷CLASS表是否在,存在則刪除
IF EXISTS(SELECT name FROM sysobjects WHERE name = 'Class' AND type = 'U') DROP TABLE Class GO