?
Dieses Dokument verwendet PHP-Handbuch für chinesische Websites Freigeben
VALUES ( expression [, ...] ) [, ...] [ ORDER BY sort_expression [ ASC | DESC | USING operator ] [, ...] ] [ LIMIT { count | ALL } ] [ OFFSET start [ ROW | ROWS ] ] [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]
VALUES根據(jù)給定的值表達(dá)式計(jì)算一個(gè)或一組行的值。 它通常用于在一個(gè)較大的命令內(nèi)生成一個(gè)"常數(shù)表",當(dāng)同時(shí)它也可以用于自身。
如果指定了多行,那么每一行都必須擁有相同的元素個(gè)數(shù)。 結(jié)果表字段的數(shù)據(jù)類型將根據(jù)表達(dá)式的明確或隱含的數(shù)據(jù)類型確定, 使用的規(guī)則與UNION(參閱Section 10.5)相同。
在大命令里面,VALUES允許出現(xiàn)在任何SELECT可以出現(xiàn)的地方。 因?yàn)樗谡Z(yǔ)法上非常類似于SELECT, 可以在VALUES命令中使用ORDER BY,LIMIT(或 等價(jià)于FETCH FIRST) 和OFFSET子句。
用于插入結(jié)果表指定地點(diǎn)的常量或者表達(dá)式。在一個(gè)出現(xiàn)在INSERT頂層的VALUES列表中, expression可以被DEFAULT替換以表示插入目的字段的缺省值。 除此以外,當(dāng)VALUES出現(xiàn)在其他場(chǎng)合的時(shí)候是不能使用DEFAULT的。
一個(gè)表示如何排序結(jié)果行的表達(dá)式或者整數(shù)常量。 這個(gè)表達(dá)式可以按照column1,column2等等引用VALUES的結(jié)果列。 更多細(xì)節(jié)參見ORDER BY子句子句。
一個(gè)排序操作符。更多細(xì)節(jié)參見ORDER BY子句子句。
返回的最大行數(shù)。更多細(xì)節(jié)參見LIMIT子句子句。
在開始返回行之前跳過的行數(shù)。更多細(xì)節(jié)參見 LIMIT子句子句。
應(yīng)當(dāng)避免使用VALUES返回?cái)?shù)量非常大的結(jié)果行, 否則可能會(huì)遭遇內(nèi)存耗盡或者性能低下。出現(xiàn)在INSERT中的VALUES是一個(gè)特殊情況, 因?yàn)槟繕?biāo)字段類型可以從INSERT的目標(biāo)表獲知, 并不需要通過掃描VALUES列表來(lái)推測(cè), 所以在此情況下可以處理非常大的結(jié)果行。
一個(gè)光禿禿的VALUES命令:
VALUES (1, 'one'), (2, 'two'), (3, 'three');
這將返回一個(gè)三行兩列的表,它在效果上相當(dāng)于:
SELECT 1 AS column1, 'one' AS column2 UNION ALL SELECT 2, 'two' UNION ALL SELECT 3, 'three';
通常,VALUES會(huì)用于一個(gè)大SQL命令中,最常見的是用于INSERT命令:
INSERT INTO films (code, title, did, date_prod, kind) VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');
在用于INSERT時(shí),VALUES列表中的項(xiàng)可以使用DEFAULT 來(lái)表示使用字段的缺省值:
INSERT INTO films VALUES ('UA502', 'Bananas', 105, DEFAULT, 'Comedy', '82 minutes'), ('T_601', 'Yojimbo', 106, DEFAULT, 'Drama', DEFAULT);
VALUES還可以用于子SELECT可以應(yīng)用的場(chǎng)合。 比如在一個(gè)FROM子句中:
SELECT f.* FROM films f, (VALUES('MGM', 'Horror'), ('UA', 'Sci-Fi')) AS t (studio, kind) WHERE f.studio = t.studio AND f.kind = t.kind; UPDATE employees SET salary = salary * v.increase FROM (VALUES(1, 200000, 1.2), (2, 400000, 1.4)) AS v (depno, target, increase) WHERE employees.depno = v.depno AND employees.sales >= v.target;
當(dāng)VALUES用于FROM子句中的時(shí)候,必須使用AS子句, 這與用于SELECT時(shí)一樣。并不要求AS子句為每個(gè)字段都指定一個(gè)別名, 但是這樣做是一個(gè)好習(xí)慣。PostgreSQL中VALUES缺省的字段名是 column1,column2等等,但這些缺省的名字并不一定與其他數(shù)據(jù)庫(kù)系統(tǒng)相同。
當(dāng)VALUES用于INSERT的時(shí)候,所有的值都將按照目標(biāo)字段自動(dòng)做類型轉(zhuǎn)換。 但是在其他場(chǎng)合就可能必須明確指定恰當(dāng)?shù)臄?shù)據(jù)類型。 如果所有的項(xiàng)都是引號(hào)包圍的字面常量,強(qiáng)制指定第一個(gè)類型就可以確定所有的類型:
SELECT * FROM machines WHERE ip_address IN (VALUES('192.168.0.1'::inet), ('192.168.0.10'), ('192.168.1.43'));
Tip: 對(duì)于簡(jiǎn)單的IN測(cè)試,更好的方法是依賴于IN的標(biāo)量列表形式, 而不是使用上述VALUES查詢。標(biāo)量列表的方法寫的更少,而且通常也更有效。
VALUES符合SQL標(biāo)準(zhǔn), 此外,LIMIT和OFFSET是PostgreSQL擴(kuò)展。 參閱下面的SELECT。