結構化查詢語言/處理資料
如上一頁所示,我們現在有一個名為 person 的空表。我們能用這樣的表格做什麼?就像使用一個袋子一樣!將東西存放在裡面,檢視裡面的東西是否存在,修改裡面的東西,或者將東西從裡面拿出來。這些是與表格中的資料相關的四個基本操作。
- INSERT:將一些資料放入表中
- SELECT:從表中檢索資料
- UPDATE:修改表中存在的資料
- DELETE:從表中刪除資料。
對於這四個操作中的每一個,都有一個 SQL 命令。它以一個關鍵字開頭,並以一個分號結束。此規則適用於所有 SQL 命令:它們以一個關鍵字開頭,並以一個分號結束。在中間,可能還有更多關鍵字,以及物件名稱和值。
當將新資料儲存在表的行中時,我們必須命名所有受影響的物件和值:表名(資料庫中可能有很多表)、列名和值。所有這些都嵌入在一些關鍵字中,以便 SQL 編譯器可以識別標記及其含義。通常,簡單 INSERT 的語法如下:
INSERT INTO <tablename> (<list_of_columnnames>)
VALUES (<list_of_values>);
以下是一個示例
-- put one row
INSERT INTO person (id, firstname, lastname, date_of_birth, place_of_birth, ssn, weight)
VALUES (1, 'Larry', 'Goldstein', date'1970-11-20', 'Dallas', '078-05-1120', 95);
-- confirm the INSERT command
COMMIT;
當 DBMS 識別 INSERT INTO 和 VALUES 關鍵字時,它就知道該做什麼:它在表中建立一行,並將給定的值放入命名的列中。在上面的示例中,命令後跟第二個命令:COMMIT 確認 INSERT 操作以及其他寫入操作 UPDATE 和 DELETE。(我們將在後面的章節中詳細瞭解 COMMIT 及其對應命令 ROLLBACK。)
- 關於 date_of_birth 值格式的簡短說明:世界各地沒有通用的日期格式。人們根據自己的文化習慣使用不同的格式。為了我們的目的,我們決定使用 ISO 8601 中定義的分層格式來表示日期。可能您的本地資料庫安裝使用不同的格式,因此您被迫修改我們的示例或修改資料庫安裝的預設日期格式。
現在我們將更多行放入我們的表格中。為此,我們使用上述語法的變體。如果值列表與原始 CREATE TABLE 語句中使用的列數、順序和資料型別完全匹配,則可以省略列名列表。
- 提示:不建議在實際應用程式中省略列名列表!表結構會隨著時間的推移而發生變化,例如有人可能會向表中新增新列。在這種情況下,應用程式可能會出現意外的副作用。
-- put four rows
INSERT INTO person VALUES (2, 'Tom', 'Burton', date'1980-01-22', 'Birmingham', '078-05-1121', 75);
INSERT INTO person VALUES (3, 'Lisa', 'Hamilton', date'1975-12-30', 'Mumbai', '078-05-1122', 56);
INSERT INTO person VALUES (4, 'Debora', 'Patterson', date'2011-06-01', 'Shanghai', '078-05-1123', 11);
INSERT INTO person VALUES (5, 'James', 'de Winter', date'1975-12-23', 'San Francisco', '078-05-1124', 75);
COMMIT;
現在我們的表格應該包含五行。我們能確定嗎?如何檢查所有操作是否都正常進行,並且行和值確實存在?為此,我們需要一個命令來顯示錶格的實際內容。它是 SELECT 命令,其通用語法如下
SELECT <list_of_columnnames>
FROM <tablename>
WHERE <search_condition>
ORDER BY <order_by_clause>;
與 INSERT 命令一樣,您可以省略某些部分。最簡單的示例是
SELECT *
FROM person;
星號 '*' 表示“所有列”。在結果中,DBMS 應該提供所有五行,每行包含之前使用 INSERT 命令的七個值。
在以下示例中,我們將逐一新增通用語法中當前缺失的子句。
新增一些或所有列名的列表
SELECT firstname, lastname
FROM person;
DBMS 應該提供所有五行的 firstname 和 lastname 兩列。
新增搜尋條件
SELECT id, firstname, lastname
FROM person
WHERE id > 2;
DBMS 應該提供三行的 id、firstname 和 lastname 三列。
新增排序說明
SELECT id, firstname, lastname, date_of_birth
FROM person
WHERE id > 2
ORDER BY date_of_birth;
DBMS 應該按 date_of_birth 升序提供三行的 id、firstname、lastname 和 date_of_birth 四列。
如果我們想更改某些行中某些列的值,可以使用 UPDATE 命令。簡單 UPDATE 的通用語法如下
UPDATE <tablename>
SET <columnname> = <value>,
<columnname> = <value>,
...
WHERE <search_condition>;
值為命名的列賦值。未提及的列保持不變。search_condition 的作用與 SELECT 命令相同。它將命令的覆蓋範圍限制為滿足條件的行。如果省略 WHERE 關鍵字和 search_condition,則會影響表的所有行。可以指定不匹配任何行的 search_condition。在這種情況下,不會更新任何行,並且不會出現任何錯誤或異常。
更改一行的一列
UPDATE person
SET firstname = 'James Walker'
WHERE id = 5;
COMMIT;
Mr. de Winter 的名字更改為 James Walker,而他的所有其他值保持不變。此外,所有其他行保持不變。請使用 SELECT 命令驗證這一點。
更改多行的一列
UPDATE person
SET firstname = 'Unknown'
WHERE date_of_birth < date'2000-01-01';
COMMIT;
<search_condition> 不限於主鍵列。我們可以指定任何其他列。比較運算子也不限於等於號。我們可以使用不同的運算子,它們只需要與列的資料型別匹配。
在此示例中,我們使用單個命令更改了四行的 firstname。如果一個表有數百萬行,我們可以使用一個命令更改所有行。
更改一行兩列
-- Please note the additional comma
UPDATE person
SET firstname = 'Jimmy Walker',
lastname = 'de la Crux'
WHERE id = 5;
COMMIT;
兩個值使用一個命令更改。
DELETE 命令從表中刪除完整行。由於行是整體刪除的,因此無需指定任何列名。<search_condition> 的語義與 SELECT 和 UPDATE 相同。
DELETE
FROM <tablename>
WHERE <search_condition>;
刪除一行
DELETE
FROM person
WHERE id = 5;
COMMIT;
James de Winter 的行從表中刪除。
刪除多行
DELETE
FROM person;
COMMIT;
由於我們省略了 <search_condition>,因此所有剩餘的行都被刪除。該表為空,但仍然存在。
沒有受影響的行
DELETE
FROM person
WHERE id = 99;
COMMIT;
此命令將不會刪除任何行,因為沒有 id 等於 99 的行。但是,語法和 DBMS 中的執行仍然是完美的。不會丟擲異常。命令在沒有任何錯誤訊息或錯誤程式碼的情況下終止。
INSERT 和 DELETE 命令會影響整個行。INSERT 將一個完整的新行放入表中(未提及的列保持為空),DELETE 刪除整個行。相反,SELECT 和 UPDATE 隻影響命令中提到的列;未提及的列不受影響。
INSERT 命令(在此頁面的簡單版本中)沒有 <search_condition>,因此僅處理一行。其他三個命令可能會影響零行、一行或多行,具體取決於其 <search_condition> 的評估結果。