906
技術社區[雲棲]
PostgreSQL SQL 語言:數據操縱
本文檔為PostgreSQL 9.6.0文檔,本轉載已得到原譯者彭煜瑋授權。
當一個表被創建後,它不包含數據。在數據庫可以有點用之前要做的第一件事就是向裏麵插入數據。數據在概念上是以每次一行地方式被插入的。你當然可以每次插入多行,但是卻沒有辦法一次插入少於一行的數據。即使你隻知道幾個列的值,那麼你也必須創建一個完整的行。
要創建一個新行,使用INSERT命令。這條命令要求提供表的名字和其中列的值。例如,考慮Chapter 5中的產品表:
CREATE TABLE products (
product_no integer,
name text,
price numeric
);
一個插入一行的命令將是:
INSERT INTO products VALUES (1, 'Cheese', 9.99);
數據的值是按照這些列在表中出現的順序列出的,並且用逗號分隔。通常,數據的值是文字(常量),但也允許使用標量表達式。
上麵的語法的缺點是你必須知道表中列的順序。要避免這個問題,你也可以顯式地列出列。例如,下麵的兩條命令都有和上文那條 命令一樣的效果:
INSERT INTO products (product_no, name, price) VALUES (1, 'Cheese', 9.99);
INSERT INTO products (name, price, product_no) VALUES ('Cheese', 9.99, 1);
許多用戶認為明確列出列的名字是個好習慣。
如果你沒有獲得所有列的值,那麼你可以省略其中的一些。在這種情況下,這些列將被填充為它們的缺省值。例如:
INSERT INTO products (product_no, name) VALUES (1, 'Cheese');
INSERT INTO products VALUES (1, 'Cheese');
第二種形式是PostgreSQL的一個擴展。它從使用給出的值從左開始填充列,有多少個給出的列值就填充多少個列,其他列的將使用缺省值。
為了保持清晰,你也可以顯式地要求缺省值,用於單個的列或者用於整個行:
INSERT INTO products (product_no, name, price) VALUES (1, 'Cheese', DEFAULT);
INSERT INTO products DEFAULT VALUES;
你可以在一個命令中插入多行:
INSERT INTO products (product_no, name, price) VALUES
(1, 'Cheese', 9.99),
(2, 'Bread', 1.99),
(3, 'Milk', 2.99);
Tip: 在一次性插入大量數據時,考慮使用COPY命令。它不如INSERT命令那麼靈活,但是更高效。
修改已經存儲在數據庫中的數據的行為叫做更新。你可以更新單個行,也可以更新表中所有的行,還可以更新其中的一部分行。 我們可以獨立地更新每個列,而其他的列則不受影響。
要更新現有的行,使用UPDATE命令。這需要提供三部分信息:
- 表的名字和要更新的列名
- 列的新值
- 要更新的是哪(些)行
我們在前麵的文章裏說過,SQL 通常並不為行提供唯一標識符。因此我們無法總是直接指定需要更新哪一行。但是,我們可以通過指定一個被更新的行必須滿足的條件。隻有在表裏麵存在主鍵的時候(不管你聲明它還是不聲明它),我們才能可靠地通過選擇一個匹配主鍵的條件來指定一個獨立的行。圖形化的數據庫訪問工具就靠這允許我們獨立地更新某些行。
例如,這條命令把所有價格為5的產品的價格更新為10:
UPDATE products SET price = 10 WHERE price = 5;
這樣做可能導致零行、一行或者更多行被更新。如果我們試圖做一個不匹配任何行的更新,那也不算錯誤。
讓我們仔細看看這個命令。首先是關鍵字UPDATE, 然後跟著表名字。和平常一樣,表名字也可以是用模式限定的, 否則會從路徑中查找它。然後是關鍵字SET, 後麵跟著列名、一個等號以及新的列值。新的列值可以是任意標量表達式, 而不僅僅是常量。例如,如果你想把所有產品的價格提高 10%,你可以用:
UPDATE products SET price = price * 1.10;
如你所見,用於新值的表達式也可以引用行中現有的值。我們還忽略了WHERE子句。如果我們忽略了這個子句, 那麼就意味著表中的所有行都要被更新。如果出現了WHERE子句, 那麼隻有匹配它後麵的條件的行被更新。請注意在SET子句中的等號是一個賦值, 而在WHERE子句中的等號是比較,不過這樣並不會導致任何歧義。當然WHERE條件不一定非得是等值測試。許多其他操作符也都可以使用。但是表達式必須得出一個布爾結果。
你還可以在一個UPDATE命令中更新更多的列, 方法是在SET子句中列出更多賦值。例如:
UPDATE mytable SET a = 5, b = 3, c = 1 WHERE a > 0;
到目前為止我們已經解釋了如何向表中增加數據以及如何改變數據。剩下的是討論如何刪除不再需要的數據。和前麵增加數據一樣,你也隻能從表中整行整行地刪除數據。在前麵的一節裏我們解釋了 SQL 不提供直接訪問單個行的方法。因此,刪除行隻能是通過指定被刪除行必須匹配的條件進行。如果你在表上有一個主鍵,那麼你可以指定準確的行。但是你也可以刪除匹配條件的一組行,或者你可以一次從表中刪除所有的行。
可以使用DELETE命令刪除行,它的語法和UPDATE命令非常類似。例如,要從產品表中刪除所有價格為 10 的產品,使用:
DELETE FROM products WHERE price = 10;
如果你隻是寫:
DELETE FROM products;
那麼表中所有行都會被刪除!程序員一定要注意。
最後更新:2017-08-16 18:02:22