SQL第二章

一、創建數據庫
創建一個指定多個數據文件和日誌文件的數據庫。該數據庫名稱爲students,有1個10MB和1個20MB的數據文件和2個10MB的事務日誌文件。數據文件邏輯名稱爲student1和student2,物理文件名爲studentdata1.mdf和studentdata2.mdf。主文件是student1,由primary指定,兩個數據文件的最大尺寸分別爲無限大和100MB,增長速度分別爲10%和1MB。事務日誌文件的邏輯名爲studentlog1和studentlog2,物理文件名爲studentlog1.ldf和studentlog2.ldf,最大尺寸均爲50MB,文件增長速度爲1MB。
Create database students on primary (name=student1,filename=‘f:/data/studentdata1.mdf’,size=10,maxsize=unlimited,filegrowth=10%),(name=student2,filename=‘f:/data/studentdata2.mdf’,size=20,maxsize=100,filegrowth=1) log on (name=studentlog1,filename=‘f:/data/studentlog1.ldf’,size=10,maxsize=50,filegrowth=1),(name=studentlog2,filename=‘f:/data/studentlog2.ldf’,size=10,maxsize=50,filegrowth=1)
——create database命令一條可以創建多個數據文件和多個日誌文件,用逗號隔開。
二、修改數據庫
Alter database students add filegroup file2
Alter database students add file (name=‘student1’,filename=‘f:/data/studentdata1.mdf’),(name=‘student2’,filename=‘f:/data/studentdata2.mdf’) to filegroup file2
三、表的設計
   a 表包括的列
   b 每列的數據類型
   c 表間關係
四、主鍵是哪列或哪幾列組合
1、哪些列值可以爲空
2、哪些列是否要使用約束、規則
3、哪些操作牽涉索引,是否要建立索引

五、表的類型
     1、系統表  前綴爲sys,無論系統庫還是用戶庫
     2、用戶表 
     3、臨時表  存儲在tempdb系統數據庫中,當不再使用時會自動刪除。

六、數據類型
    A、系統數據類型
系統數據類型是SQL Server預先定義好的,可以直接使用。
1.整型數據類型
(1)bigint:8個字節
(2)int(integer):4個字節
(3)Smallint :2個字節(-32768~32767)
(4)Tinyint :1個字節 (0~255)
(5)bit:只能是0或1(0|1)數據爲2值的字段

2.浮點數據類型 :
用於存儲十進制小數 ,採用只入不捨的方式
(1)Real:4個字節的,最大7位精確位數。
(2)Float:可以精確到第15位小數,默認佔用8個字節的存儲空間。Float數據類型也可以寫爲float(n)的形式,n爲1~15之間的整數值。當n取1~7時,系統用4個字節存儲它;當n取8~15時,用8個字節存儲它。
(3)Decimal和numeric:可以提供小數所需要的實際存儲空間,可以用2~17個字節來存儲。也可以將其寫爲decimal(p,s)的形式。
注意:數值類型的總位數不包括小數。
例如:decimal(10,5),表示共有10位數,其中整數4位,小數5位。
——Real和Float類型是近似數據類型,不精確,不可作比較或主鍵
    如果強調數據的精確,則用Decimal和numeric

3.字符數據類型
用來存儲各種字母、數字符號和特殊符號。在使用時需要在其前後加上英文單引號或者雙引號。
(1)Char:一個字符佔用1個字節。
其定義形式爲:char(n)
n的取值爲1~8000。默認n的值爲1。
(2)Varchar:可以存儲長達8000個字符的可變長度字符串,和char類型不同varchar類型根據輸入數據的實際長度而變化。
其定義形式爲:varchar(n)
(3)Nchar:採用Unicode(統一字符編碼標準)字符集;每個Unicode字符佔2個字節
其定義形式爲:nchar(n)
(4)Nvarchar:使用Unicode字符集的Varchar數據類型。
其定義形式爲:nvarchar(n)

4.日期和時間數據類型
(1)Datetime:佔用8個字節。
用於存儲日期和時間的結合體,可以存儲從公元1753年1月1日零時起~公元9999年12月31日23時59分59秒之間的所有日期和時間,其精確度可達三百分之一秒,即3.33毫秒。
當存儲datetime數據類型時,默認的格式是:MM DD YYYY hh:mm A.M./P.M。當插入數據或者在其它地方使用datetime類型時,需要用單引號把它括起來。
默認January 1,1900 12:00 A.M。可以接受的輸入格式如下:Jan 4 1999、JAN 4 1999、January 4 1999、Jan 1999 4、1999 4 Jan和1999 Jan 4。datetime數據類型允許使用/、-和.作爲不同時間單位間的分隔符。
(2)Smalldatetime:存儲從1900年1月1日~2079年6月6日內的日期。4個字節。

5.文本和圖形數據類型
(1)Text:容量可以在1~231-1個字節。
在定義Text數據類型時,不需要指定數據長度,SQL Server會根據數據的長度自動爲其分配空間。
(2)Ntext:採用unicode標準字符集,用於存儲大容量文本數據。其理論上的容量爲230-1(1,073,741,823)個字節。
(3)Image:用於存儲照片、目錄圖片或者圖畫,其理論容量爲231-1(2,147,483,647)個字節。

6.貨幣數據類型
(1)Money:用於存儲貨幣值,數值以一個正數部分和一個小數部分存儲在兩個4字節的整型值中,存儲範圍爲-922337213685477.5808 ~922337213685477.5808,精度爲貨幣單位的萬分之一。
(2)Smallmoney:其存儲範圍爲-214748.3468~214748.3467。
一般,當爲money或smallmoney的表輸入數據時,必須在有效位置前面加一個貨幣單位符號(如$或其它貨幣單位的記號);有的和decimal類型相似。

8.二進制數據類型
(1)Binary:
其定義形式爲binary(n),數據的存儲長度是固定的,即n+4個字節。二進制數據類型的最大長度(即n的最大值)爲8000,常用於存儲圖像等數據。
(2)Varbinary:
其定義形式爲varbinary(n),數據的存儲長度是變化的,它爲實際所輸入數據的長度加上4字節。
在輸入二進制常量時,需在該常量前面加一個前綴0x。

9.特殊數據類型
(1)Timestamp:也稱作時間戳數據類型。是一種自動記錄時間的數據類型,主要用於在數據表中記錄其數據的修改時間。它提供數據庫範圍內的唯一值;可用來觀察數據是否有修改。
(2)Uniqueidentifier:也稱作唯一標識符數據類型。Uniqueidentifier用於存儲一個16字節長的二進制數據類型,它是SQL Server根據計算機網絡適配器地址和CPU時鐘產生的全局唯一標識符代碼(Globally Unique Identifier,簡寫爲GUID);使用系統函數newid()自動產生——RowGuid。

10.新增數據類型
(1)Bigint:佔用8個字節。
(2)sql_variant:用於存儲除文本、圖形數據和timestamp類型數據外的其它任何合法的SQL Server數據;用時要用類型轉換函數取出。
(3)table:用於存儲對錶或者視圖處理後的結果集。

選擇數據類型的指導原則
如果列的長度可變,就使用某個變長數據類型;
如果是一個不斷髮展的列,要按預估選擇大範圍的類型;
數值型,如果強調精度則選decimal;
如果存儲容量超過8000字節,使用text或image;如果存儲容量小於8000字節,binary或char;最好使用vchar;
貨幣數據使用money;
不要把float和real數據類型作爲主鍵

自定義數據類型
1.使用企業管理器創建
2.利用系統存儲過程創建
sp_addtype [@typename=] type,
[@phystype=] system_data_type
[, [@nulltype=] ‘null_type’]
[, [@owner=] ‘owner_name’]

type:指定用戶定義的數據類型的名稱。
system_data_type:指定相應的系統提供的數據類型的名稱及定義。注意,不能使用timestamp數據類型,當所使用的系統數據類型有額外說明時,需要用引號將其括起來。
null_type:指定用戶自定義數據類型的null屬性,其值可以爲‘null’、‘not null’或者‘nonull’。默認與系統默認的null屬性相同。
owner_name:指定用戶自定義數據類型的所有者。

刪除用戶自定義數據
1.使用企業管理器
2.利用系統存儲過程
sp_droptype [@typename=] ‘type’

創建表
表是包含數據庫中所有數據的數據庫對象,用來存儲各種各樣的信息。
在SQL Server 2000中,一個數據庫中最多可以創建200萬個表,用戶創建數據庫表時,最多可以定義1024列。在同一數據庫的不同表中,可以有相同的字段,但在同一個表中不允許有相同的字段,而且每個字段都要求數據類型相同。

利用企業管理器創建表
默認值:指定列的默認值。除定義爲timestamp或帶IDENTITY屬性的列以外的任何列。刪除表時,將刪除默認值定義。只有常量值(如字符串)、SQL Server內部函數(如SYSTEM_USER())或NULL值可以用作默認值。
精度和小數位數:精度是列的總長度,包括整數部分和小數部分的長度之和,但不包括小數點;小數位數指定小數點後面的長度。

標識:指定列是否是標識列。一個表只能創建一個標識列。不能對標識列使用綁定默認值和DEFAULT約束。必須同時指定種子和增量,或者兩者都不指定。默認值(1,1)。能夠成爲標識列的數據類型有int、smallint、tinyint、numeric和decimal等系統數據類型;如果其數據類型爲numeric和decimal,不允許出現小數位數。
標識種子:指定標識列的初始值。
標識遞增量:指定標識列的增量值。

RowGuid:指定列是否使用全局唯一標識符uniqueidentifier數據類型。
公式:用於指定計算列的列值表達式,可以是數學表達式,也可以是字段名間的計算式,不用引號;計算得到的字段不需要選擇數據類型。
排序規則:指定列的排序規則。
  說明:在數據庫中表名必須是唯一的,但是如果爲表指定了不同的用戶,就可以創建多個相同名稱的表。

例:設計一個水果商品數據表,記錄各種水果的單價、數量、金額和基本數據(水果序號是標識,ISBN爲RowGuid型,金額=單價*數量,基本數據=序號*2)。

利用SQL語句創建表
CREATE TABLE
[庫名.[所有者].|所有者.]
數據表名
({<列定義>|計算列 AS 計算表達式|<表約束>} [,…n])
[ ON { filegroup | DEFAULT } ]
[ TEXTIMAGE_ON { filegroup | DEFAULT } ]

<列定義> ::= {列名 列類型 [列寬度] }
[ COLLATE < collation_name > ]
[[DEFAULT 默認值]
|[IDENTITY [(標識種子 ,標識增量) [ NOT FOR REPLICATION ] ] ] ]
[ROWGUIDCOL]
[<列約束>] [ ...n ]

——數據類型可以參考對象瀏覽器的系統數據類型

<列約束> ::=[ CONSTRAINT 列約束名 ]
{ [ NULL | NOT NULL ]
| [ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[ WITH FILLFACTOR = fillfactor ]
[ON {filegroup | DEFAULT} ] ] }
|FOREIGN KEY [(column [,…n])]
REFERENCES ref_table [ ( ref_column [,…n]) ] [NOT FOR REPLICATION]
| CHECK [ NOT FOR REPLICATION ]
( logical_expression )}

<表約束> ::=[CONSTRAINT 表約束名]
[{ PRIMARY KEY 主鍵列名| UNIQUE 列名}
|FOREIGN KEY (列名)]
REFERENCES ref_table [ ( 參照列名 ] [NOT FOR REPLICATION]
| CHECK(約束表達式)}

—列約束用於單列,寫在該列名後
—表約束涉及多列,寫在所有列下面

Create table dbo.products
(produceID int IDENTITY(1,1) NOT NULL,
 productname nvarch(40) NOT NULL,
 supplierID int NULL,
 categoryID int NULL,
 quantityperunit nvarchar(20) NULL,
 unitprice money NULL constrain df_products_unitprice DEFAULT(0),
 unitsinstock smallint NULL constrain df_products_unitinstock DEFAULT(0),
Constraint pk_products PRIMARY KEY CLUSTERED(rpoductID),
Constraint fk_products_categories FOREIGN KEY(categoryID) REFERENCES categories(categoryID) on UPDATE CASCADE,
Constraint fk_products_suppliers FOREIGN KEY(supplierID) REFERENCES suppliers(supplierID) on DELETE CASCADE,
Constraint ck_products_unitprice CHECK(unitprice>=0),
Constraint ck_unitsinstock CHECK(unitsinstock>=0)
)


創建、刪除和修改約束
約束是SQL Server提供的自動保持數據庫完整性的一種方法 。
列級約束:列級約束是行定義的一部分,只能夠應用在一列上。
表級約束:表級約束的定義獨立於列的定義,可以應用在一個表中的多列上。

主鍵約束 Primary key (自動產生索引)
主鍵能夠唯一地確定表中的每一條記錄,主鍵不能取空值。主鍵約束可以保證實體的完整性。
1.通過企業管理器完成添加、刪除和修改主鍵的操作
2.使用Transact-SQL語句設置主鍵約束
建表時:CONSTRAINT pk_主鍵約束名 PRIMARY  KEY [CLUSTERED|NONCLUSTERED]( 列名[,…n])

建表完成後:alter table 表名 add [constraint 約束名]primary key(字段名)

——一表中只能有一個主鍵約束

唯一性約束(自動產生索引)unique
唯一性約束用於指定一個或多個列的組合值具有唯一性,以防止在列中輸入重複的值。
使用唯一性約束的字段允許爲空值;
可以把唯一性約束定義在多個字段上;
唯一性約束用於強制在指定字段上創建一個唯一性索引;
默認情況下,創建的索引類型爲非聚集索引(NONCLUSTERED)。 

——一表中可以設置多個唯一約束

1.通過企業管理器完成創建和修改唯一性約束的操作
2.使用Transact-SQL語句完成唯一性約束的操作
建表時:CONSTRAINT  constraint_name
  UNIQUE  [CLUSTERED|NONCLUSTERED]
(column_name[,…n])

建表完成後:alter table 表名 add [constraint 約束名] unique(字段名)

檢查約束 check
保證數據庫數據的完整性。
一個列級檢查約束只能與限制的字段有關;一個表級檢查約束只能與限制的表中字段有關;
一個表中可以定義多個檢查約束;
每個CREATE TABLE語句中每個字段只能定義一個檢查約束;
在多個字段上定義檢查約束,則必須將檢查約束定義爲表級約束;
當執行INSERT語句或者UPDATE語句時,檢查約束將驗證數據;
檢查約束中不能包含子查詢。

1.使用企業管理器創建檢查約束
2.用Transact-SQL語句創建檢查約束。
建表時:CONSTRAINT  constraint_name
  CHECK [NOT FOR REPLICATION]
   (logical_expression)
建表完成後:alter table 表名 add [constraint ck_表縮寫名] check(條件式)
alter table 表名 add 字段名 類型 check(條件式)
——複習條件表達式製作

約束中條件式的製作
數學函數
日期函數
字符串函數
比較符和邏輯符號
>、>=、<、<=、<>(!=)、not、and、or
特定單詞
Between A and B
Is [not] null
[not] in (值列表)
like

默認值約束 default
每個字段只能定義一個默認約束;
如果定義的默認值長於其對應字段的允許長度,那麼輸入到表中的默認值將被截斷;
不能加入到帶有IDENTITY屬性或者數據類型爲timestamp的字段上;
如果字段定義爲用戶定義的數據類型,而且有一個默認綁定到這個數據類型上,則不允許該字段有默認約束。

1.使用企業管理器創建默認約束
2.使用Transact-SQL語句創建默認約束

建表時:
Create table 表名
(字段名 類型 default ‘默認值’)

建表完成後:
alter table 表名 add [constraint df約束名] default ‘默認值’for 字段名

——exec sp_helpconstraint 表名

外鍵約束 foreign key
外鍵約束主要用來維護兩個表之間數據的一致性。
外鍵約束提供了字段參照完整性on update|on delete|on insert;
外鍵從句中的字段數目和每個字段指定的數據類型都必須和REFERENCES從句中的字段相匹配;
外鍵約束不能自動創建索引,需要用戶手動創建;
用戶想要修改外鍵約束的數據,必須有對外鍵約束所引用表的SELECT權限或者REFERENCES權限;
引用同一表中的字段時,可以只使用REFERENCES子句,不使用外鍵foreign key子句;

一個表中最多可以有31個外鍵約束;
在臨時表中,不能使用外鍵約束;
主鍵和外鍵的數據類型必須嚴格匹配。
1.在企業管理器中添加外鍵約束
2.使用Transact-SQL語句設置外鍵約束
建表時:
CONSTRAINT  fk_子表_主表
FOREIGN KEY (外鍵名[,…n])
REFERENCES  主表名[(主鍵名[,…n])] [on delete {cascade | no action}]

建表完成後:
alter table 子表名 add constraint fk_子表_主表 foreign key(外鍵名) references 主表(主鍵名)

No action指明,任何試圖刪除|更新由其他表的外鍵引用的關鍵字的操作都將產生錯誤並回滾更改。默認選項。
如果在父表中定義了cascade和更改了一行,則引用表中相應行也將隨着改變。

刪除約束
alter table 表名 drop constraint 約束名

禁用約束
Alter table 表名 nocheck  constraint [all|約束名]
啓動約束
Alter table 表名 check constraint [all|約束名]
—只能禁用check和foreign約束,其他約束只能刪除再重新添加

規則
規則是一個向後兼容的功能,用於執行一些與 CHECK 約束相同的功能。CHECK 約束是用來限制列值的首選標準方法。CHECK 約束比規則更簡明,一個列只能應用一個規則,但是卻可以應用多個 CHECK 約束。CHECK 約束作爲 CREATE TABLE 語句的一部分進行指定,而規則以單獨的對象創建,然後綁定到列上。

下例創建一個規則,執行與前面主題中的 CHECK 約束示例相同的功能。Microsoft® SQL Server™ 2000 首選的方法是 CHECK 約束。
CREATE RULE id_chk AS @id BETWEEN 0 and 10000
sp_bindrule id_chk, 'cust_sample.cust_id'
增加、刪除和修改字段
利用企業管理器增加、刪除和修改字段
利用Transact-SQL語言增加、刪除和修改字段
添加字段
alter table 表名 add 新字段名 數據類型
添加主鍵字段(主鍵表)
alter table 表名 add primary key(字段名)
刪除字段
alter table 表名 drop column 刪除字段名
增加、刪除和修改字段
修改字段數據類型|寬度
alter table 表名 alter column 字段名 類型(寬度)
添加默認值
alter table 表名 add default ‘默認值’for 字段名
創建約束|約束有效(子表中)
alter table 表名 check constraint 約束名
約束無效
alter table 表名 nocheck constraint 約束名

ALTER TABLE table {[ALTER COLUMN 字段名 {新數據類型 [( 寬度 [ , scale ] ) ] [ COLLATE < collation_name > ] [ NULL | NOT NULL ] |{ADD | DROP } ROWGUIDCOL } ] |{ADD | DROP } DEFAULE ‘默認值’
  |ADD

{[<column_definition>] | column_name AS computed_column_expression } [ ,...n ]    | [ WITH CHECK | WITH NOCHECK ] ADD      { < table_constraint > } [ ,...n ]    | DROP     { [ CONSTRAINT ] constraint_name    | COLUMN column } [ ,...n ]    | { CHECK | NOCHECK } CONSTRAINT      { ALL | constraint_name [ ,...n ] }    | { ENABLE | DISABLE } TRIGGER      { ALL | trigger_name [ ,...n ] } }
查看網格
查看網格的定義
查看網格中的數據
查看網格與其它數據庫對象的依賴關係
利用系統存儲過程Sp_help查看庫表信息
刪除表
利用企業管理器刪除表
利用Transact-SQL語言刪除表
    DROP TABLE table_name

更新表中數據
利用企業管理器刪除表
利用Transact-SQL語言
輸入記錄
修改記錄
刪除記錄
輸入和插入數據
INSERT [INTO]{表名|視圖名} {[(字段列表)] { VALUES
({DEFAULT|NULL|表達式}        [ ,...n] )| derived_table}

1.use 庫名
  insert into 表名 values (所有字段的值)
2.insert into 表名 default values
3.insert into 表名(指定字段名) values(指定字段值)
更新數據
UPDATE { 表名 | 視圖名}
[ FROM { < table_source > } [ ,...n ]
SET
字段名= {表達式 | DEFAULT | NULL }[ ,...n ]
 [ WHERE  條件式 > ] 
刪除數據
DELETE [FROM] { 表名WITH (< table_hint_limited > [ ...n ] )
| 視圖名}
[ WHERE  <條件式>   ]

Use 庫名      刪除符合條件的記錄
   delete from 表名 where 條件式
2. delete 表名    刪除所有記錄
刪除數據
TRUNCATE語句
其語句格式爲:
TRUNCATE  表名
創建表間關係
表設計器中創建表間關係
  關係建立,但不顯式
數據庫關係圖中創建表間關係
  關係建立,並得到保存
SQL語句
 create constrain fk_子表名_主表名 foreign key(外鍵名) references 主表名(主鍵名)
索引
索引的概念
數據庫中的索引是一個列表,在這個列表中包含了某個表中一列或者若干列值的集合,以及這些值的記錄在數據表中的存儲位置的物理地址。

 

索引的優點
可以大大加快數據檢索速度。
通過創建唯一索引,可以保證數據記錄的唯一性。
在使用ORDER BY和GROUP BY子句進行檢索數據時,可以顯著減少查詢中分組和排序的時間。
使用索引可以在檢索數據的過程中使用優化隱藏器,提高系統性能。
可以加速表與表之間的連接,這一點在實現數據的參照完整性方面有特別的意義。


索引的分類
    a聚集索引和非聚集索引
    b複合索引
    c唯一索引

    d創建索引
   1 使用企業管理器創建索引
在企業管理器中,展開指定的服務器和數據庫,選擇要創建索引的表,從彈出的快捷菜單中依次選擇“所有任務|管理索引”選項。

使用Transact-SQL語句創建索引
利用Transact-SQL語句中的CREATE INDEX命令可以創建索引,CREATE INDEX命令既可以創建一個可改變表的物理順序的聚集索引,也可以創建提高查詢性能的非聚集索引 。

    2使用嚮導創建視圖
       利用索引向導創建索引
      利用索引優化嚮導創建索引

查看、修改和刪除索引 
   使用企業管理器查看、修改和刪除索引及更改索引名
   使用企業管理器查看和修改索引
   使用企業管理器更改索引名
   使用企業管理器刪除索引
   使用系統存儲過程查看索引信息和更改索引名稱
   使用系統存儲過程查看索引信息
   使用系統存儲過程更改索引名稱

   使用Transact-SQL語句刪除索引
  當不再需要某個索引時,可以使用Transact-SQL語句中的DROP INDEX命令刪除索引。DROP INDEX命令可以刪除一個或者多個當前數據庫中的索引。

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