SQL 是用於訪問和處理數據庫的標准的計算機語言。
編者注:ANSI,美國國家標准化組織
SQL 是一門 ANSI 的標准計算機語言,用來訪問和操作數據庫系統。SQL 語句用於取回和更新數據庫中的數據。SQL 可與數據庫程序協同工作,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他數據庫系統。
不幸地是,存在著很多不同版本的 SQL 語言,但是為了與 ANSI 標准相兼容,它們必須以相似的方式共同地來支持一些主要的關鍵詞(比如 SELECT、UPDATE、DELETE、INSERT、WHERE 等等)。
注釋:除了 SQL 標准之外,大部分 SQL 數據庫程序都擁有它們自己的私有擴展!
要創建發布數據庫中數據的網站,您需要以下要素:
RDBMS 指的是關系型數據庫管理系統。
RDBMS 是 SQL 的基礎,同樣也是所有現代數據庫系統的基礎,比如 MS SQL Server, IBM DB2, Oracle, MySQL 以及 Microsoft Access。
RDBMS 中的數據存儲在被稱為表(tables)的數據庫對象中。
表是相關的數據項的集合,它由列和行組成。
一個數據庫通常包含一個或多個表。每個表由一個名字標識(例如“客戶”或者“訂單”)。表包含帶有數據的記錄(行)。
下面的例子是一個名為 "Persons" 的表:
上面的表包含三條記錄(每一條對應一個人)和五個列(Id、姓、名、地址和城市)。
您需要在數據庫上執行的大部分工作都由 SQL 語句完成。
下面的語句從表中選取 LastName 列的數據:
SELECT LastName FROM Persons
結果集類似這樣:
在本教程中,我們將為您講解各種不同的 SQL 語句。
一定要記住,SQL 對大小寫不敏感!
某些數據庫系統要求在每條 SQL 命令的末端使用分號。在我們的教程中不使用分號。
分號是在數據庫系統中分隔每條 SQL 語句的標准方法,這樣就可以在對服務器的相同請求中執行一條以上的語句。
如果您使用的是 MS Access 和 SQL Server 2000,則不必在每條 SQL 語句之後使用分號,不過某些數據庫軟件要求必須使用分號。
SQL (結構化查詢語言)是用於執行查詢的語法。但是 SQL 語言也包含用於更新、插入和刪除記錄的語法。
查詢和更新指令構成了 SQL 的 DML 部分:
SQL 的數據定義語言 (DDL) 部分使我們有能力創建或刪除表格。我們也可以定義索引(鍵),規定表之間的鏈接,以及施加表間的約束。
SQL 中最重要的 DDL 語句:
SELECT 語句用於從表中選取數據。
結果被存儲在一個結果表中(稱為結果集)。
SELECT 列名稱 FROM 表名稱
以及:
SELECT * FROM 表名稱
注釋:SQL 語句對大小寫不敏感。SELECT 等效於 select。
如需獲取名為 "LastName" 和 "FirstName" 的列的內容(從名為 "Persons" 的數據庫表),請使用類似這樣的 SELECT 語句:
SELECT LastName,FirstName FROM Persons
現在我們希望從 "Persons" 表中選取所有的列。
請使用符號 * 取代列的名稱,就像這樣:
SELECT *
FROM Persons
提示:星號(*)是選取所有列的快捷方式。
由 SQL 查詢程序獲得的結果被存放在一個結果集中。大多數數據庫軟件系統都允許使用編程函數在結果集中進行導航,比如:Move-To-First-Record、Get-Record-Content、Move-To-Next-Record 等等。
類似這些編程函數不在本教程講解之列。如需學習通過函數調用訪問數據的知識,請訪問我們的 ADO 教程 和 PHP 教程。
在表中,可能會包含重復值。這並不成問題,不過,有時您也許希望僅僅列出不同(distinct)的值。
關鍵詞 DISTINCT 用於返回唯一不同的值。
SELECT DISTINCT 列名稱 FROM 表名稱
如果要從 "Company" 列中選取所有的值,我們需要使用 SELECT 語句:
SELECT Company FROM Orders
請注意,在結果集中,W3School 被列出了兩次。
如需從 Company" 列中僅選取唯一不同的值,我們需要使用 SELECT DISTINCT 語句:
SELECT DISTINCT
Company FROM Orders
現在,在結果集中,"W3School" 僅被列出了一次。
WHERE 子句用於規定選擇的標准。
如需有條件地從表中選取數據,可將 WHERE 子句添加到 SELECT 語句。
SELECT 列名稱 FROM 表名稱 WHERE 列 運算符 值
下面的運算符可在 WHERE 子句中使用:
注釋:在某些版本的 SQL 中,操作符 <> 可以寫為 !=。
如果只希望選取居住在城市 "Beijing" 中的人,我們需要向 SELECT 語句添加 WHERE 子句:
SELECT * FROM Persons WHERE City='Beijing'
請注意,我們在例子中的條件值周圍使用的是單引號。
SQL 使用單引號來環繞文本值(大部分數據庫系統也接受雙引號)。如果是數值,請不要使用引號。
這是正確的: SELECT * FROM Persons WHEREFirstName='Bush'
這是錯誤的: SELECT * FROM Persons WHEREFirstName=Bush
這是正確的: SELECT * FROM Persons WHEREYear>1965
這是錯誤的: SELECT * FROM Persons WHEREYear>'1965'
AND 和 OR 運算符用於基於一個以上的條件對記錄進行過濾。
AND 和 OR 可在 WHERE 子語句中把兩個或多個條件結合起來。
如果第一個條件和第二個條件都成立,則 AND 運算符顯示一條記錄。
如果第一個條件和第二個條件中只要有一個成立,則 OR 運算符顯示一條記錄。
使用 AND 來顯示所有姓為 "Carter" 並且名為 "Thomas" 的人:
SELECT * FROM Persons WHERE FirstName='Thomas' AND
LastName='Carter'
使用 OR 來顯示所有姓為 "Carter" 或者名為 "Thomas" 的人:
SELECT * FROM Persons WHERE firstname='Thomas' OR
lastname='Carter'
我們也可以把 AND 和 OR 結合起來(使用圓括號來組成復雜的表達式):
SELECT * FROM Persons WHERE(
FirstName='Thomas'OR
FirstName='William')
AND
LastName='Carter'
ORDER BY 語句用於對結果集進行排序。
ORDER BY 語句用於根據指定的列對結果集進行排序。
ORDER BY 語句默認按照升序對記錄進行排序。
如果您希望按照降序對記錄進行排序,可以使用 DESC 關鍵字。
Orders 表:
以字母順序顯示公司名稱:
SELECT Company, OrderNumber FROM Orders ORDER BY Company
以字母順序顯示公司名稱(Company),並以數字順序顯示順序號(OrderNumber):
SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber
結果:
以逆字母順序顯示公司名稱:
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC
以逆字母順序顯示公司名稱,並以數字順序顯示順序號:
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC
注意:在以上的結果中有兩個相等的公司名稱 (W3School)。只有這一次,在第一列中有相同的值時,第二列是以升序排列的。如果第一列中有些值為 nulls 時,情況也是這樣的。
INSERT INTO 語句用於向表格中插入新的行。
INSERT INTO 表名稱 VALUES (值1, 值2,....)
我們也可以指定所要插入數據的列:
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')
INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')
Update 語句用於修改表中的數據。
UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值
我們為 lastname 是 "Wilson" 的人添加 firstname:
UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson'
我們會修改地址(address),並添加城市名稱(city):
UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing' WHERE LastName = 'Wilson'
DELETE 語句用於刪除表中的行。
DELETE FROM 表名稱 WHERE 列名稱 = 值
"Fred Wilson" 會被刪除:
DELETE FROM Person WHERE LastName = 'Wilson'
可以在不刪除表的情況下刪除所有的行。這意味著表的結構、屬性和索引都是完整的:
DELETE FROM table_name
或者:
DELETE * FROM table_name
TOP 子句用於規定要返回的記錄的數目。
對於擁有數千條記錄的大型表來說,TOP 子句是非常有用的。
注釋:並非所有的數據庫系統都支持 TOP 子句。
SELECT TOP number|percent column_name(s) FROM table_name
SELECT column_name(s) FROM table_name LIMIT number
SELECT * FROM Persons LIMIT 5
SELECT column_name(s) FROM table_name WHERE ROWNUM <= number
SELECT * FROM Persons WHERE ROWNUM <= 5
Persons 表:
現在,我們希望從上面的 "Persons" 表中選取頭兩條記錄。
我們可以使用下面的 SELECT 語句:
SELECT TOP 2
* FROM Persons
現在,我們希望從上面的 "Persons" 表中選取 50% 的記錄。
我們可以使用下面的 SELECT 語句:
SELECT TOP 50 PERCENT
* FROM Persons
結果:
LIKE 操作符用於在 WHERE 子句中搜索列中的指定模式。
LIKE 操作符用於在 WHERE 子句中搜索列中的指定模式。
SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern
Persons 表:
現在,我們希望從上面的 "Persons" 表中選取居住在以 "N" 開始的城市裡的人:
我們可以使用下面的 SELECT 語句:
SELECT * FROM Persons WHERE City LIKE 'N%'
提示:"%" 可用於定義通配符(模式中缺少的字母)。
接下來,我們希望從 "Persons" 表中選取居住在以 "g" 結尾的城市裡的人:
我們可以使用下面的 SELECT 語句:
SELECT * FROM Persons WHERE City LIKE '%g'
接下來,我們希望從 "Persons" 表中選取居住在包含 "lon" 的城市裡的人:
我們可以使用下面的 SELECT 語句:
SELECT * FROM Persons WHERE City LIKE '%lon%'
通過使用 NOT 關鍵字,我們可以從 "Persons" 表中選取居住在不包含 "lon" 的城市裡的人:
我們可以使用下面的 SELECT 語句:
SELECT * FROM Persons WHERE City NOT LIKE '%lon%'
在搜索數據庫中的數據時,SQL 通配符可以替代一個或多個字符。
SQL 通配符必須與 LIKE 運算符一起使用。
在 SQL 中,可使用以下通配符:
[^charlist]
或者
[!charlist]
不在字符列中的任何單一字符Persons 表:
現在,我們希望從上面的 "Persons" 表中選取居住在以 "Ne" 開始的城市裡的人:
我們可以使用下面的 SELECT 語句:
SELECT * FROM Persons WHERE City LIKE 'Ne%'
接下來,我們希望從 "Persons" 表中選取居住在包含 "lond" 的城市裡的人:
我們可以使用下面的 SELECT 語句:
SELECT * FROM Persons WHERE City LIKE '%lond%'
現在,我們希望從上面的 "Persons" 表中選取名字的第一個字符之後是 "eorge" 的人:
我們可以使用下面的 SELECT 語句:
SELECT * FROM Persons WHERE FirstName LIKE '_eorge'
接下來,我們希望從 "Persons" 表中選取的這條記錄的姓氏以 "C" 開頭,然後是一個任意字符,然後是 "r",然後是任意字符,然後是 "er":
我們可以使用下面的 SELECT 語句:
SELECT * FROM Persons WHERE LastName LIKE 'C_r_er'
現在,我們希望從上面的 "Persons" 表中選取居住的城市以 "A" 或 "L" 或 "N" 開頭的人:
我們可以使用下面的 SELECT 語句:
SELECT * FROM Persons WHERE City LIKE '[ALN]%'
現在,我們希望從上面的 "Persons" 表中選取居住的城市不以"A" 或 "L" 或 "N" 開頭的人:
我們可以使用下面的 SELECT 語句:
SELECT * FROM Persons WHERE City LIKE '[!ALN]%'
BETWEEN 操作符在 WHERE 子句中使用,作用是選取介於兩個值之間的數據范圍。
操作符 BETWEEN ... AND 會選取介於兩個值之間的數據范圍。這些值可以是數值、文本或者日期。
SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2
Persons 表:
如需以字母順序顯示介於 "Adams"(包括)和 "Carter"(不包括)之間的人,請使用下面的 SQL:
SELECT * FROM Persons WHERE LastNameBETWEEN
'Adams'AND
'Carter'
重要事項:不同的數據庫對 BETWEEN...AND 操作符的處理方式是有差異的。某些數據庫會列出介於 "Adams" 和 "Carter" 之間的人,但不包括 "Adams" 和 "Carter" ;某些數據庫會列出介於 "Adams" 和 "Carter" 之間並包括 "Adams" 和 "Carter" 的人;而另一些數據庫會列出介於 "Adams" 和 "Carter" 之間的人,包括 "Adams" ,但不包括 "Carter" 。
所以,請檢查你的數據庫是如何處理 BETWEEN....AND 操作符的!
如需使用上面的例子顯示范圍之外的人,請使用 NOT 操作符:
SELECT * FROM Persons
WHERE LastName
NOT
BETWEEN 'Adams' AND 'Carter'
SQL join 用於根據兩個或多個表中的列之間的關系,從這些表中查詢數據。
有時為了得到完整的結果,我們需要從兩個或更多的表中獲取結果。我們就需要執行 join。
數據庫中的表可通過鍵將彼此聯系起來。主鍵(Primary Key)是一個列,在這個列中的每一行的值都是唯一的。在表中,每個主鍵的值都是唯一的。這樣做的目的是在不重復每個表中的所有數據的情況下,把表間的數據交叉捆綁在一起。
請看 "Persons" 表:
請注意,"Id_P" 列是 Persons 表中的的主鍵。這意味著沒有兩行能夠擁有相同的 Id_P。即使兩個人的姓名完全相同,Id_P 也可以區分他們。
接下來請看 "Orders" 表:
請注意,"Id_O" 列是 Orders 表中的的主鍵,同時,"Orders" 表中的 "Id_P" 列用於引用 "Persons" 表中的人,而無需使用他們的確切姓名。
請留意,"Id_P" 列把上面的兩個表聯系了起來。
我們可以通過引用兩個表的方式,從兩個表中獲取數據:
誰訂購了產品,並且他們訂購了什麼產品?
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons, Orders WHERE Persons.Id_P = Orders.Id_P
結果集:
除了上面的方法,我們也可以使用關鍵詞 JOIN 來從兩個表中獲取數據。
如果我們希望列出所有人的定購,可以使用下面的 SELECT 語句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P = Orders.Id_P
ORDER BY Persons.LastName
結果集:
除了我們在上面的例子中使用的 INNER JOIN(內連接),我們還可以使用其他幾種連接。
下面列出了您可以使用的 JOIN 類型,以及它們之間的差異。
UNION 操作符用於合並兩個或多個 SELECT 語句的結果集。
請注意,UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每條 SELECT 語句中的列的順序必須相同。
SELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FROM table_name2
注釋:默認地,UNION 操作符選取不同的值。如果允許重復的值,請使用 UNION ALL。
SELECT column_name(s) FROM table_name1 UNION ALL SELECT column_name(s) FROM table_name2
另外,UNION 結果集中的列名總是等於 UNION 中第一個 SELECT 語句中的列名。
列出所有在中國和美國的不同的雇員名:
SELECT E_Name FROM Employees_China
UNION
SELECT E_Name FROM Employees_USA
注釋:這個命令無法列出在中國和美國的所有雇員。在上面的例子中,我們有兩個名字相同的雇員,他們當中只有一個人被列出來了。UNION 命令只會選取不同的值。
UNION ALL 命令和 UNION 命令幾乎是等效的,不過 UNION ALL 命令會列出所有的值。
SQL Statement 1 UNION ALL SQL Statement 2
列出在中國和美國的所有的雇員:
SELECT E_Name FROM Employees_China
UNION ALL
SELECT E_Name FROM Employees_USA
SQL SELECT INTO 語句可用於創建表的備份復件。
SELECT INTO 語句從一個表中選取數據,然後把數據插入另一個表中。
SELECT INTO 語句常用於創建表的備份復件或者用於對記錄進行存檔。
您可以把所有的列插入新表:
SELECT * INTO new_table_name [IN externaldatabase] FROM old_tablename
或者只把希望的列插入新表:
SELECT column_name(s) INTO new_table_name [IN externaldatabase] FROM old_tablename
下面的例子會制作 "Persons" 表的備份復件:
SELECT
*INTO
Persons_backup FROM Persons
IN 子句可用於向另一個數據庫中拷貝表:
SELECT
*INTO
PersonsIN
'Backup.mdb' FROM Persons
如果我們希望拷貝某些域,可以在 SELECT 語句後列出這些域:
SELECT
LastName,FirstNameINTO
Persons_backup FROM Persons
我們也可以添加 WHERE 子句。
下面的例子通過從 "Persons" 表中提取居住在 "Beijing" 的人的信息,創建了一個帶有兩個列的名為 "Persons_backup" 的表:
SELECT
LastName,FirstnameINTO
Persons_backup FROM PersonsWHERE
City='Beijing'
從一個以上的表中選取數據也是可以做到的。
下面的例子會創建一個名為 "Persons_Order_Backup" 的新表,其中包含了從 Persons 和 Orders 兩個表中取得的信息:
SELECT
Persons.LastName,Orders.OrderNoINTO
Persons_Order_BackupFROM
PersonsINNER JOIN
OrdersON
Persons.Id_P=Orders.Id_P
CREATE DATABASE 用於創建數據庫。
CREATE DATABASE database_name
現在我們希望創建一個名為 "my_db" 的數據庫。
我們使用下面的 CREATE DATABASE 語句:
CREATE DATABASE my_db
可以通過 CREATE TABLE 來添加數據庫表。
CREATE TABLE 語句用於創建數據庫中的表。
CREATE TABLE 表名稱 ( 列名稱1 數據類型, 列名稱2 數據類型, 列名稱3 數據類型, .... )
數據類型(data_type)規定了列可容納何種數據類型。下面的表格包含了SQL中最常用的數據類型:
容納帶有小數的數字。
"size" 規定數字的最大位數。"d" 規定小數點右側的最大位數。
char(size)容納固定長度的字符串(可容納字母、數字以及特殊字符)。
在括號中規定字符串的長度。
varchar(size)容納可變長度的字符串(可容納字母、數字以及特殊的字符)。
在括號中規定字符串的最大長度。
date(yyyymmdd) 容納日期。本例演示如何創建名為 "Person" 的表。
該表包含 5 個列,列名分別是:"Id_P"、"LastName"、"FirstName"、"Address" 以及 "City":
CREATE TABLE Persons ( Id_P int, LastName varchar(255), FirstName varchar(255), Address varchar(255), City varchar(255) )
Id_P 列的數據類型是 int,包含整數。其余 4 列的數據類型是 varchar,最大長度為 255 個字符。
空的 "Persons" 表類似這樣:
可使用 INSERT INTO 語句向空表寫入數據。
約束用於限制加入表的數據的類型。
可以在創建表時規定約束(通過 CREATE TABLE 語句),或者在表創建之後也可以(通過 ALTER TABLE 語句)。
我們將主要探討以下幾種約束:
注釋:在下面的章節,我們會詳細講解每一種約束。
NOT NULL 約束強制列不接受 NULL 值。
NOT NULL 約束強制字段始終包含值。這意味著,如果不向字段添加值,就無法插入新記錄或者更新記錄。
下面的 SQL 語句強制 "Id_P" 列和 "LastName" 列不接受 NULL 值:
CREATE TABLE Persons ( Id_P intNOT NULL
, LastName varchar(255)NOT NULL
, FirstName varchar(255), Address varchar(255), City varchar(255) )
UNIQUE 約束唯一標識數據庫表中的每條記錄。
UNIQUE 和 PRIMARY KEY 約束均為列或列集合提供了唯一性的保證。
PRIMARY KEY 擁有自動定義的 UNIQUE 約束。
請注意,每個表可以有多個 UNIQUE 約束,但是每個表只能有一個 PRIMARY KEY 約束。
下面的 SQL 在 "Persons" 表創建時在 "Id_P" 列創建 UNIQUE 約束:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (Id_P)
)
CREATE TABLE Persons
(
Id_P int NOT NULL UNIQUE
,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
如果需要命名 UNIQUE 約束,以及為多個列定義 UNIQUE 約束,請使用下面的 SQL 語法:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
)
當表已被創建時,如需在 "Id_P" 列創建 UNIQUE 約束,請使用下列 SQL:
ALTER TABLE Persons
ADD UNIQUE (Id_P)
如需命名 UNIQUE 約束,並定義多個列的 UNIQUE 約束,請使用下面的 SQL 語法:
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
如需撤銷 UNIQUE 約束,請使用下面的 SQL:
ALTER TABLE Persons
DROP INDEX uc_PersonID
ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID
PRIMARY KEY 約束唯一標識數據庫表中的每條記錄。
主鍵必須包含唯一的值。
主鍵列不能包含 NULL 值。
每個表都應該有一個主鍵,並且每個表只能有一個主鍵。
下面的 SQL 在 "Persons" 表創建時在 "Id_P" 列創建 PRIMARY KEY 約束:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (Id_P)
)
CREATE TABLE Persons
(
Id_P int NOT NULL PRIMARY KEY
,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
如果需要命名 PRIMARY KEY 約束,以及為多個列定義 PRIMARY KEY 約束,請使用下面的 SQL 語法:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
)
如果在表已存在的情況下為 "Id_P" 列創建 PRIMARY KEY 約束,請使用下面的 SQL:
ALTER TABLE Persons
ADD PRIMARY KEY (Id_P)
如果需要命名 PRIMARY KEY 約束,以及為多個列定義 PRIMARY KEY 約束,請使用下面的 SQL 語法:
ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
注釋:如果您使用 ALTER TABLE 語句添加主鍵,必須把主鍵列聲明為不包含 NULL 值(在表首次創建時)。
如需撤銷 PRIMARY KEY 約束,請使用下面的 SQL:
ALTER TABLE Persons
DROP PRIMARY KEY
ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID
CHECK 約束用於限制列中的值的范圍。
如果對單個列定義 CHECK 約束,那麼該列只允許特定的值。
如果對一個表定義 CHECK 約束,那麼此約束會在特定的列中對值進行限制。
下面的 SQL 在 "Persons" 表創建時為 "Id_P" 列創建 CHECK 約束。CHECK 約束規定 "Id_P" 列必須只包含大於 0 的整數。
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)
)
CREATE TABLE Persons
(
Id_P int NOT NULL CHECK (Id_P>0)
,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
如果需要命名 CHECK 約束,以及為多個列定義 CHECK 約束,請使用下面的 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" 列創建 CHECK 約束,請使用下面的 SQL:
ALTER TABLE Persons
ADD CHECK (Id_P>0)
如果需要命名 CHECK 約束,以及為多個列定義 CHECK 約束,請使用下面的 SQL 語法:
ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
如需撤銷 CHECK 約束,請使用下面的 SQL:
ALTER TABLE Persons
DROP CONSTRAINT chk_Person
ALTER TABLE Persons
DROP CHECK chk_Person