SQL CHECK 約束
CHECK 約束用于限制列中的值的范圍岸蜗。
如果對(duì)單個(gè)列定義 CHECK 約束,那么該列只允許特定的值。
如果對(duì)一個(gè)表定義 CHECK 約束徒仓,那么此約束會(huì)在特定的列中對(duì)值進(jìn)行限制。
下面的 SQL 在 "Persons" 表創(chuàng)建時(shí)為 "Id_P" 列創(chuàng)建 CHECK 約束誊垢。CHECK 約束規(guī)定 "Id_P" 列必須只包含大于 0 的整數(shù)掉弛。
My SQL:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (Id_P>0)
)
如果需要命名 CHECK 約束,以及為多個(gè)列定義 CHECK 約束喂走,請(qǐng)使用下面的 SQL 語法:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
)
如果在表已存在的情況下為 "Id_P" 列創(chuàng)建 CHECK 約束殃饿,請(qǐng)使用下面的 SQL:
ALTER TABLE Persons ADD CHECK (Id_P>0)
如果需要命名 CHECK 約束,以及為多個(gè)列定義 CHECK 約束芋肠,請(qǐng)使用下面的 SQL 語法:
ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
撤銷 CHECK 約束
如需撤銷 CHECK 約束乎芳,請(qǐng)使用下面的 SQL:
MySQL:
ALTER TABLE Persons DROP CHECK chk_Person
SQL DEFAULT 約束
DEFAULT 約束用于向列中插入默認(rèn)值。
如果沒有規(guī)定其他的值帖池,那么會(huì)將默認(rèn)值添加到所有的新記錄奈惑。
下面的 SQL 在 "Persons" 表創(chuàng)建時(shí)為 "City" 列創(chuàng)建 DEFAULT 約束:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)
通過使用類似 GETDATE() 這樣的函數(shù),DEFAULT 約束也可以用于插入系統(tǒng)值:
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
OrderDate date DEFAULT GETDATE()
)
如果在表已存在的情況下為 "City" 列創(chuàng)建 DEFAULT 約束睡汹,請(qǐng)使用下面的 SQL:
MySQL:
ALTER TABLE Persons ALTER City SET DEFAULT 'SANDNES'
撤銷 DEFAULT 約束
如需撤銷 DEFAULT 約束肴甸,請(qǐng)使用下面的 SQL:
MySQL:
ALTER TABLE Persons ALTER City DROP DEFAULT
CREATE INDEX 語句用于在表中創(chuàng)建索引。
在不讀取整個(gè)表的情況下帮孔,索引使數(shù)據(jù)庫應(yīng)用程序可以更快地查找數(shù)據(jù)雷滋。
索引
您可以在表中創(chuàng)建索引不撑,以便更加快速高效地查詢數(shù)據(jù)。
用戶無法看到索引晤斩,它們只能被用來加速搜索/查詢焕檬。
注釋:更新一個(gè)包含索引的表需要比更新一個(gè)沒有索引的表更多的時(shí)間,這是由于索引本身也需要更新澳泵。因此实愚,理想的做法是僅僅在常常被搜索的列(以及表)上面創(chuàng)建索引。
SQL CREATE INDEX 語法
在表上創(chuàng)建一個(gè)簡(jiǎn)單的索引兔辅。允許使用重復(fù)的值:
CREATE INDEX index_name ON table_name (column_name)
注釋:"column_name" 規(guī)定需要索引的列腊敲。
在表上創(chuàng)建一個(gè)唯一的索引。唯一的索引意味著兩個(gè)行不能擁有相同的索引值维苔。
CREATE UNIQUE INDEX index_name ON table_name (column_name)
CREATE INDEX 實(shí)例
本例會(huì)創(chuàng)建一個(gè)簡(jiǎn)單的索引碰辅,名為 "PersonIndex",在 Person 表的 LastName 列:
CREATE INDEX PersonIndex ON Person (LastName)
如果您希望以降序索引某個(gè)列中的值介时,您可以在列名稱之后添加保留字 DESC:
CREATE INDEX PersonIndex ON Person (LastName DESC)
假如您希望索引不止一個(gè)列没宾,您可以在括號(hào)中列出這些列的名稱,用逗號(hào)隔開:
CREATE INDEX PersonIndex ON Person (LastName, FirstName)
通過使用 DROP 語句沸柔,可以輕松地刪除索引循衰、表和數(shù)據(jù)庫。
我們可以使用 DROP INDEX 命令刪除表格中的索引褐澎。
ALTER TABLE table_name DROP INDEX index_name
DROP TABLE 語句用于刪除表(表的結(jié)構(gòu)会钝、屬性以及索引也會(huì)被刪除):
DROP TABLE 表名稱
DROP DATABASE 語句用于刪除數(shù)據(jù)庫:
DROP DATABASE 數(shù)據(jù)庫名稱
如果我們僅僅需要除去表內(nèi)的數(shù)據(jù),但并不刪除表本身工三,那么我們?cè)撊绾巫瞿兀?br>
請(qǐng)使用 TRUNCATE TABLE 命令(僅僅刪除表格中的數(shù)據(jù)):
TRUNCATE TABLE 表名稱
ALTER TABLE 語句
ALTER TABLE 語句用于在已有的表中添加迁酸、修改或刪除列。
SQL ALTER TABLE 語法
如需在表中添加列俭正,請(qǐng)使用下列語法:
ALTER TABLE table_name ADD column_name datatype
要?jiǎng)h除表中的列胁出,請(qǐng)使用下列語法:
ALTER TABLE table_name DROP COLUMN column_name
注釋:某些數(shù)據(jù)庫系統(tǒng)不允許這種在數(shù)據(jù)庫表中刪除列的方式 (DROP COLUMN column_name)。
要改變表中列的數(shù)據(jù)類型段审,請(qǐng)使用下列語法:
ALTER TABLE table_nameALTER COLUMN column_name datatype
希望在表 "Persons" 中添加一個(gè)名為 "Birthday" 的新列全蝶。
ALTER TABLE Persons ADD Birthday date
請(qǐng)注意,新列 "Birthday" 的類型是 date寺枉,可以存放日期抑淫。數(shù)據(jù)類型規(guī)定列中可以存放的數(shù)據(jù)的類型。
希望改變 "Persons" 表中 "Birthday" 列的數(shù)據(jù)類型
ALTER TABLE Persons ALTER COLUMN Birthday year
請(qǐng)注意姥闪,"Birthday" 列的數(shù)據(jù)類型是 year始苇,可以存放 2 位或 4 位格式的年份。
刪除 "Person" 表中的 "Birthday" 列:
ALTER TABLE Person DROP COLUMN Birthday
Auto-increment 會(huì)在新記錄插入表中時(shí)生成一個(gè)唯一的數(shù)字筐喳。
我們通常希望在每次插入新記錄時(shí)催式,自動(dòng)地創(chuàng)建主鍵字段的值函喉。
我們可以在表中創(chuàng)建一個(gè) auto-increment 字段。
用于 MySQL 的語法
下列 SQL 語句把 "Persons" 表中的 "P_Id" 列定義為 auto-increment 主鍵:
CREATE TABLE Persons
(
P_Id int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
)
MySQL 使用 AUTO_INCREMENT 關(guān)鍵字來執(zhí)行 auto-increment 任務(wù)荣月。
默認(rèn)地管呵,AUTO_INCREMENT 的開始值是 1,每條新記錄遞增 1哺窄。
要讓 AUTO_INCREMENT 序列以其他的值起始捐下,請(qǐng)使用下列 SQL 語法:
ALTER TABLE Persons AUTO_INCREMENT=100
要在 "Persons" 表中插入新記錄,我們不必為 "P_Id" 列規(guī)定值(會(huì)自動(dòng)添加一個(gè)唯一的值):
INSERT INTO Persons (FirstName,LastName) VALUES ('Bill','Gates')
上面的 SQL 語句會(huì)在 "Persons" 表中插入一條新記錄萌业。"P_Id" 會(huì)被賦予一個(gè)唯一的值坷襟。"FirstName" 會(huì)被設(shè)置為 "Bill","LastName" 列會(huì)被設(shè)置為 "Gates"生年。
視圖是可視化的表婴程。
本章講解如何創(chuàng)建、更新和刪除視圖抱婉。
什么是視圖排抬?
在 SQL 中,視圖是基于 SQL 語句的結(jié)果集的可視化的表授段。
視圖包含行和列,就像一個(gè)真實(shí)的表番甩。視圖中的字段就是來自一個(gè)或多個(gè)數(shù)據(jù)庫中的真實(shí)的表中的字段侵贵。我們可以向視圖添加 SQL 函數(shù)、WHERE 以及 JOIN 語句缘薛,我們也可以提交數(shù)據(jù)窍育,就像這些來自于某個(gè)單一的表。
注釋:數(shù)據(jù)庫的設(shè)計(jì)和結(jié)構(gòu)不會(huì)受到視圖中的函數(shù)宴胧、where 或 join 語句的影響漱抓。
SQL CREATE VIEW 語法
CREATE VIEW view_name AS SELECT column_name(s)
FROM table_name WHERE condition
注釋:視圖總是顯示最近的數(shù)據(jù)。每當(dāng)用戶查詢視圖時(shí)恕齐,數(shù)據(jù)庫引擎通過使用 SQL 語句來重建數(shù)據(jù)乞娄。
可以從某個(gè)查詢內(nèi)部、某個(gè)存儲(chǔ)過程內(nèi)部显歧,或者從另一個(gè)視圖內(nèi)部來使用視圖仪或。通過向視圖添加函數(shù)、join 等等士骤,我們可以向用戶精確地提交我們希望提交的數(shù)據(jù)范删。
樣本數(shù)據(jù)庫 Northwind 擁有一些被默認(rèn)安裝的視圖。視圖 "Current Product List" 會(huì)從 Products 表列出所有正在使用的產(chǎn)品拷肌。這個(gè)視圖使用下列 SQL 創(chuàng)建:
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName
FROM Products WHERE Discontinued=No
可以查詢上面這個(gè)視圖:
SELECT * FROM [Current Product List]
Northwind 樣本數(shù)據(jù)庫的另一個(gè)視圖會(huì)選取 Products 表中所有單位價(jià)格高于平均單位價(jià)格的產(chǎn)品:
CREATE VIEW [Products Above Average Price] AS
SELECT ProductName,UnitPrice FROM Products
WHERE UnitPrice>(SELECT AVG(UnitPrice) FROM Products)
可以像這樣查詢上面這個(gè)視圖:
SELECT * FROM [Products Above Average Price]
另一個(gè)來自 Northwind 數(shù)據(jù)庫的視圖實(shí)例會(huì)計(jì)算在 1997 年每個(gè)種類的銷售總數(shù)到旦。請(qǐng)注意旨巷,這個(gè)視圖會(huì)從另一個(gè)名為 "Product Sales for 1997" 的視圖那里選取數(shù)據(jù):
CREATE VIEW [Category Sales For 1997] AS
SELECT DISTINCT CategoryName,Sum(ProductSales) AS CategorySales
FROM [Product Sales for 1997] GROUP BY CategoryName
可以像這樣查詢上面這個(gè)視圖:
SELECT * FROM [Category Sales For 1997]
也可以向查詢添加條件。現(xiàn)在添忘,我們僅僅需要查看 "Beverages" 類的全部銷量:
SELECT * FROM [Category Sales For 1997]
WHERE CategoryName='Beverages'
SQL 更新視圖
您可以使用下面的語法來更新視圖:
SQL CREATE OR REPLACE VIEW Syntax
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s) FROM table_name WHERE condition
希望向 "Current Product List" 視圖添加 "Category" 列采呐。我們將通過下列 SQL 更新視圖:
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName,Category FROM Products
WHERE Discontinued=No
SQL 撤銷視圖
您可以通過 DROP VIEW 命令來刪除視圖。
SQL DROP VIEW Syntax DROP VIEW view_name