跳轉到內容

結構化查詢語言/處理資料

來自華夏公益教科書


如上一頁所示,我們現在有一個名為 person 的空表。我們能用這樣的表格做什麼?就像使用一個袋子一樣!將東西存放在裡面,檢視裡面的東西是否存在,修改裡面的東西,或者將東西從裡面拿出來。這些是與表格中的資料相關的四個基本操作。

  • INSERT:將一些資料放入表中
  • SELECT:從表中檢索資料
  • UPDATE:修改表中存在的資料
  • DELETE:從表中刪除資料。

對於這四個操作中的每一個,都有一個 SQL 命令。它以一個關鍵字開頭,並以一個分號結束。此規則適用於所有 SQL 命令:它們以一個關鍵字開頭,並以一個分號結束。在中間,可能還有更多關鍵字,以及物件名稱和值。

使用 INSERT 命令儲存新資料

[編輯 | 編輯原始碼]

當將新資料儲存在表的行中時,我們必須命名所有受影響的物件和值:表名(資料庫中可能有很多表)、列名和值。所有這些都嵌入在一些關鍵字中,以便 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 命令,其通用語法如下

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 應該提供所有五行的 firstnamelastname 兩列。


新增搜尋條件

SELECT   id, firstname, lastname
FROM     person
WHERE    id > 2;

DBMS 應該提供三行的 idfirstnamelastname 三列。


新增排序說明

SELECT   id, firstname, lastname, date_of_birth
FROM     person
WHERE    id > 2
ORDER BY date_of_birth;

DBMS 應該按 date_of_birth 升序提供三行的 idfirstnamelastnamedate_of_birth 四列。

使用 UPDATE 命令修改資料

[編輯 | 編輯原始碼]

如果我們想更改某些行中某些列的值,可以使用 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 命令刪除資料

[編輯 | 編輯原始碼]

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> 的評估結果。


華夏公益教科書