1. 插入
INSERT 用來将行插入到資料庫表中。插入有幾種方式:
- 插入完整的行。
- 插入行的一部分。
- 插入某些查詢的結果。
INSERT 文法要求指定表名和插入到新表中的值。例如,我們将一個新顧客插入到 customers 表中。
插入前:
運作結果如下:
插入到新表中的值由 VALUES 子句給出,以這種方式插入資料時,我們必須為每一列提供一個值。而且各列必須以他們在表定義中出現的次序填充。雖然這種插入資料的文法很簡單,但并不安全,應該盡量避免使用。因為上面的 SQL 語句高度依賴于表中列的定義次序。比較安全的寫法,如下:
INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city,
cust_state, cust_zip, cust_country, cust_contact, cust_email)
VALUES( 'Toy Land', '123 Any Street', 'New York',
'NY', '11111', 'USA', 'Jordan', '[email protected]');
運作結果如下:
在上述寫法中,我們在表名後的括号裡明确指定了列名,VALUES 中的第一個值對應于第一個指定列名,第二個值對應于第二個列名,如此等等。因為提供了列名,隻要 VALUES 中的值和指定的列名能比對上就行,不一定按照各列出現在表中的實際次序。這樣做的好處是,即使表結構發生改變,這條 INSERT 語句仍然能正确工作。由于明确指定了列名,是以我們可以随意指定列的順序。
例如,我們也可以如下插入資料:
INSERT INTO Customers(cust_id, cust_contact, cust_email, cust_name,
cust_address, cust_city, cust_state, cust_zip, cust_country)
VALUES('1000000006', 'Jordan', '[email protected]', 'Toy Land',
'123 Any Street', 'New York', 'NY', '11111','USA');
運作結果如下:
注意事項:1.不要使用沒有明确給出列的 INSERT 語句。給出列能使 SQL 代碼繼續發揮作用,即使表結構發生了變化。2.不管使用哪種 INSERT 文法,VALUES 的數目都必須正确。如果不提供列名,則必須給每個表列提供一個值;如果提供列名,則必須給列出的每個列一個值。否則,就會産生一條錯誤消息,相應的行不能成功插入。
由于明确列出了列名,我們在進行插入資料時,可以省略某些列,這表示可以隻給某些列提供值,給其他列不提供值。例如,我們可以如下插入資料:
INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country)
VALUES('1000000006', 'Toy Land', '123 Any Street', 'New York', 'NY', '11111', 'USA');
運作結果如下:
在這個例子中,我們省略了 cust_contact 和 cust_email 這兩列。如果表的定義允許,則可以在 INSERT 操作中省略某些列。省略的列必須滿足以下某個條件:1.該列定義為允許 NULL 值。2.在表定義中給出預設值。這表示如果不給出值,将使用預設值。如果表中不允許有 NULL 值或者預設值,這時卻省略了表中的值, DBMS 就會産生錯誤消息,相應的行不能成功插入。
INSERT 還可以用來将查詢出的資料插入到表中。就是所謂的 INSERT SELECT。它由一條 INSERT 語句和一條 SELECT 語句組成。
例如,未進行操作前, customersnew 表中的内容是空的:
我們從 customers 表中查詢資料插入到 customersnew 表中。
INSERT INTO customersnew(cust_id,
cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country)
SELECT cust_id,
cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country
FROM customers;
運作結果如下:
可以發現已經執行完成。
然後我們打開 customersnew 表, 可以發現資料已經插入成功:
在這個例子中,INSERT 和 SELECT 語句中使用了相同的列名。但是,不一定要求列名比對。事實上,DBMS 一點兒也不關心 SELECT 傳回的列名。它使用的是列的位置,是以 SELECT 中的第一列(不管其列名)将用來填充表列中指定的第一列,第二列将用來填充表列中指定的第二列,如此等等。
INSERT SELECT 中 SELECT 語句可以包含 WHERE 子句,以過濾插入的資料。
另外,有時候,我們需要把一個表的内容複制到另外一張表。這時候我們可以使用:
CREATE TABLE custcopy AS
SELECT * FROM customers;
運作結果如下:
可以發現sql語句的執行與表内容的複制都已完成,其内容與 customers 中的内容一緻
2. 更新
下面我們來講下如何更新資料:更新表中的資料可以使用 UPDATE 語句,有兩種使用 UPDATE 的方式:1.更新表中的特定行。2.更新表中的所有行。
使用 UPDATE 語句非常容易,基本的 UPDATE 語句由三部分組成:1.要更新的表。2.列名和它們的新值。3.确定要更新哪些行的過濾條件。
舉個簡單的例子,例如我們要更新客戶 1000000005 的電子郵箱位址,語句如下:
UPDATE customers
SET cust_email = '[email protected]'
WHERE cust_id = '1000000005';
執行結果如下:
UPDATE 語句以 WHERE 子句結束,它告訴 DBMS 更新哪一行。沒有 WHERE 子句,DBMS 将會用這個電子郵件位址更新 Customers 表中的所有行, 這不是我們希望的。
更新多列的文法稍微不同,例如:
UPDATE Customers
SET cust_contact = 'Sam Roberts',
cust_email = '[email protected]'
執行結果如下:
在更新多個列時,隻需要使用一條 SET 指令,每個“列=值”對之間用逗号分隔(最後一列之後不用逗号)。在此例子中,更新顧客 1000000006 的 cust_contact 和 cust_email 列。
要删除某個列的值,可設定它為 NULL。例如:
UPDATE Customers
SET cust_email = NULL
WHERE cust_id = '1000000005';
執行結果如下:
在使用 UPDATE 語句時,不要省略 WHERE 子句,因為稍不注意,就會更新表中所有的行。
3. 删除
下面來講下如何删除資料:從一個表中删除資料,使用 DELETE 語句。有兩種使用 DELETE 的方式:1.從表中删除特定的行;2.從表中删除所有行。例如:從Customers 表中删除一行:
DELETE FROM Customers
WHERE cust_id = '1000000006';
執行結果如下:
DELETE 不需要列名或通配符。DELETE 删除整行而不是删除列。要删除指定的列,請使用 UPDATE 語句。
如果想從表中删除所有行,不要使用 DELETE。可使用 TRUNCATE TABLE 語句,它完成相同的工作,而速度更快(因為不記錄資料的變動)。