{"Entry":{"collection":"sql","key":"select","name":"SELECT","aliases":["select"],"metadata":{"aliases":["select"],"changed_in":["6.5","7.0","7.1","7.2","7.3","7.4","8.1","8.2","8.3","8.4","9.0","9.1","9.2","9.3","9.4","9.5","11","12","13","14","16","17"],"changes":[{"from":"6.4","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["description","usage","compatibility"],"removed":[]},"status":"changed","synopsis":{"added":["[ INTO [TEMP] [TABLE] new_table ]","[ { UNION [ALL] | INTERSECT | EXCEPT } select ]","[ FOR UPDATE [OF class_name...]]","[ LIMIT count [OFFSET|, count]]"],"removed":[]},"to":"6.5"},{"from":"6.5","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["description","usage","compatibility"],"removed":[]},"status":"changed","synopsis":{"added":["SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]","[ INTO [ TEMPORARY | TEMP ] [ TABLE ] new_table ]","[ ORDER BY column [ ASC | DESC | USING operator ] [, ...] ]","[ FOR UPDATE [ OF class_name [, ...] ] ]","LIMIT { count | ALL } [ { OFFSET | , } start ]"],"removed":["SELECT [ALL|DISTINCT [ON column] ]","[ LIMIT count [OFFSET|, count]]"]},"to":"7.0"},{"from":"7.0","purpose_changed":true,"renamed":{"from_file":"sql-select.htm","to_file":"sql-select.html"},"sections":{"added":[],"changed":["description","compatibility"],"removed":[]},"status":"changed","synopsis":{"added":["* | expression [ AS output_name ] [, ...]","[ FROM from_item [, ...] ]","[ GROUP BY expression [, ...] ]","[ { UNION | INTERSECT | EXCEPT [ ALL ] } select ]","[ ORDER BY expression [ ASC | DESC | USING operator ] [, ...] ]","[ FOR UPDATE [ OF tablename [, ...] ] ]","[ LIMIT { count | ALL } [ { OFFSET | , } start ]]","where from_item can be:","[ ONLY ] table_name [ * ]","[ [ AS ] alias [ ( column_alias_list ) ] ]","|","( select )","[ AS ] alias [ ( column_alias_list ) ]","|","from_item [ NATURAL ] join_type from_item","[ ON join_condition | USING ( join_column_list ) ]"],"removed":["expression [ AS name ] [, ...]","[ INTO [ TEMPORARY | TEMP ] [ TABLE ] new_table ]","[ FROM table [ alias ] [, ...] ]","[ GROUP BY column [, ...] ]","[ { UNION [ ALL ] | INTERSECT | EXCEPT } select ]","[ ORDER BY column [ ASC | DESC | USING operator ] [, ...] ]","[ FOR UPDATE [ OF class_name [, ...] ] ]"]},"to":"7.1"},{"from":"7.1","purpose_changed":true,"renamed":null,"sections":{"added":[],"changed":["description","usage","compatibility"],"removed":[]},"status":"changed","synopsis":{"added":["[ { UNION | INTERSECT | EXCEPT } [ ALL ] select ]","[ LIMIT { count | ALL } ]"],"removed":["[ { UNION | INTERSECT | EXCEPT [ ALL ] } select ]","[ LIMIT { count | ALL } [ { OFFSET | , } start ]]"]},"to":"7.2"},{"from":"7.2","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["description","usage","compatibility"],"removed":[]},"status":"changed","synopsis":{"added":["[ LIMIT { count | ALL } ]","[ OFFSET start ]","[ FOR UPDATE [ OF tablename [, ...] ] ]","table_function_name ( [ argument [, ...] ] )","[ AS ] alias [ ( column_alias_list | column_definition_list ) ]","|","table_function_name ( [ argument [, ...] ] )","AS ( column_definition_list )","|"],"removed":["[ FOR UPDATE [ OF tablename [, ...] ] ]","[ LIMIT { count | ALL } ]","[ OFFSET start ]"]},"to":"7.3"},{"from":"7.3","purpose_changed":false,"renamed":null,"sections":{"added":["parameters","examples"],"changed":["description","compatibility"],"removed":["usage"]},"status":"changed","synopsis":{"added":["[ FOR UPDATE [ OF table_name [, ...] ] ]","where from_item can be one of:","[ ONLY ] table_name [ * ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]","( select ) [ AS ] alias [ ( column_alias [, ...] ) ]","function_name ( [ argument [, ...] ] ) [ AS ] alias [ ( column_alias [, ...] | column_definition [, ...] ) ]","function_name ( [ argument [, ...] ] ) AS ( column_definition [, ...] )","from_item [ NATURAL ] join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]"],"removed":["[ FOR UPDATE [ OF tablename [, ...] ] ]","[ [ AS ] alias [ ( column_alias_list ) ] ]","|","[ AS ] alias [ ( column_alias_list ) ]","|","table_function_name ( [ argument [, ...] ] )","[ AS ] alias [ ( column_alias_list | column_definition_list ) ]","|","table_function_name ( [ argument [, ...] ] )","AS ( column_definition_list )","|","[ ON join_condition | USING ( join_column_list ) ]"]},"to":"7.4"},{"from":"7.4","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["description","parameters","examples","compatibility"],"removed":[]},"status":"changed","synopsis":null,"to":"8.0"},{"from":"8.0","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["description","parameters","compatibility"],"removed":[]},"status":"changed","synopsis":{"added":["[ FOR { UPDATE | SHARE } [ OF table_name [, ...] ] [ NOWAIT ] ]"],"removed":[]},"to":"8.1"},{"from":"8.1","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["description","parameters"],"removed":[]},"status":"changed","synopsis":{"added":["[ FOR { UPDATE | SHARE } [ OF table_name [, ...] ] [ NOWAIT ] [...] ]"],"removed":[]},"to":"8.2"},{"from":"8.2","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters","compatibility"],"removed":[]},"status":"changed","synopsis":{"added":["[ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]"],"removed":[]},"to":"8.3"},{"from":"8.3","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["description","parameters","examples","compatibility"],"removed":[]},"status":"changed","synopsis":{"added":["[ WITH [ RECURSIVE ] with_query [, ...] ]","* | expression [ [ AS ] output_name ] [, ...]","[ HAVING condition [, ...] ]","[ WINDOW window_name AS ( window_definition ) [, ...] ]","[ OFFSET start [ ROW | ROWS ] ]","[ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]","( select ) [ AS ] alias [ ( column_alias [, ...] ) ]","with_query_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ]","and with_query is:","with_query_name [ ( column_name [, ...] ) ] AS ( select )","TABLE { [ ONLY ] table_name [ * ] | with_query_name }"],"removed":[]},"to":"8.4"},{"from":"8.4","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters","compatibility"],"removed":[]},"status":"changed","synopsis":{"added":[],"removed":["where from_item can be one of:","and with_query is:"]},"to":"9.0"},{"from":"9.0","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["description","parameters","compatibility"],"removed":[]},"status":"changed","synopsis":{"added":["[ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ]","with_query_name [ ( column_name [, ...] ) ] AS ( select | insert | update | delete )"],"removed":["TABLE { [ ONLY ] table_name [ * ] | with_query_name }"]},"to":"9.1"},{"from":"9.1","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters"],"removed":[]},"status":"changed","synopsis":{"added":["with_query_name [ ( column_name [, ...] ) ] AS ( select | values | insert | update | delete )"],"removed":[]},"to":"9.2"},{"from":"9.2","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["description","parameters","examples","compatibility"],"removed":[]},"status":"changed","synopsis":{"added":["[ FOR { UPDATE | NO KEY UPDATE | SHARE | KEY SHARE } [ OF table_name [, ...] ] [ NOWAIT ] [...] ]","[ LATERAL ] ( select ) [ AS ] alias [ ( column_alias [, ...] ) ]","[ LATERAL ] function_name ( [ argument [, ...] ] ) [ AS ] alias [ ( column_alias [, ...] | column_definition [, ...] ) ]","[ LATERAL ] function_name ( [ argument [, ...] ] ) AS ( column_definition [, ...] )"],"removed":[]},"to":"9.3"},{"from":"9.3","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["description","parameters","examples","compatibility"],"removed":[]},"status":"changed","synopsis":{"added":["[ * | expression [ [ AS ] output_name ] [, ...] ]","[ WITH ORDINALITY ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]","[ LATERAL ] function_name ( [ argument [, ...] ] ) [ AS ] alias ( column_definition [, ...] )","[ LATERAL ] ROWS FROM( function_name ( [ argument [, ...] ] ) [ AS ( column_definition [, ...] ) ] [, ...] )","[ WITH ORDINALITY ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]"],"removed":["[ LATERAL ] function_name ( [ argument [, ...] ] ) [ AS ] alias [ ( column_alias [, ...] | column_definition [, ...] ) ]"]},"to":"9.4"},{"from":"9.4","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters","compatibility"],"removed":[]},"status":"changed","synopsis":{"added":["[ GROUP BY grouping_element [, ...] ]","[ FOR { UPDATE | NO KEY UPDATE | SHARE | KEY SHARE } [ OF table_name [, ...] ] [ NOWAIT | SKIP LOCKED ] [...] ]","[ ONLY ] table_name [ * ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]","[ TABLESAMPLE sampling_method ( argument [, ...] ) [ REPEATABLE ( seed ) ] ]","( )","expression","( expression [, ...] )","ROLLUP ( { expression | ( expression [, ...] ) } [, ...] )","CUBE ( { expression | ( expression [, ...] ) } [, ...] )","GROUPING SETS ( grouping_element [, ...] )"],"removed":["[ GROUP BY expression [, ...] ]","[ HAVING condition [, ...] ]"]},"to":"9.5"},{"from":"9.5","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters"],"removed":[]},"status":"changed","synopsis":null,"to":"9.6"},{"from":"9.6","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters"],"removed":[]},"status":"changed","synopsis":null,"to":"10"},{"from":"10","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["description","parameters","examples","compatibility"],"removed":[]},"status":"changed","synopsis":{"added":["from_item join_type from_item { ON join_condition | USING ( join_column [, ...] ) }","from_item NATURAL join_type from_item","from_item CROSS JOIN from_item"],"removed":["from_item [ NATURAL ] join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]"]},"to":"11"},{"from":"11","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["description","parameters","examples","compatibility"],"removed":[]},"status":"changed","synopsis":{"added":["[ { * | expression [ [ AS ] output_name ] } [, ...] ]","with_query_name [ ( column_name [, ...] ) ] AS [ [ NOT ] MATERIALIZED ] ( select | values | insert | update | delete )"],"removed":[]},"to":"12"},{"from":"12","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters"],"removed":[]},"status":"changed","synopsis":{"added":["[ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } { ONLY | WITH TIES } ]"],"removed":[]},"to":"13"},{"from":"13","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters","compatibility"],"removed":[]},"status":"changed","synopsis":{"added":["[ GROUP BY [ ALL | DISTINCT ] grouping_element [, ...] ]","from_item join_type from_item { ON join_condition | USING ( join_column [, ...] ) [ AS join_using_alias ] }","[ SEARCH { BREADTH | DEPTH } FIRST BY column_name [, ...] SET search_seq_col_name ]","[ CYCLE column_name [, ...] SET cycle_mark_col_name [ TO cycle_mark_value DEFAULT cycle_mark_default ] USING cycle_path_col_name ]"],"removed":[]},"to":"14"},{"from":"14","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters"],"removed":[]},"status":"changed","synopsis":null,"to":"15"},{"from":"15","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters","compatibility"],"removed":[]},"status":"changed","synopsis":{"added":["[ LATERAL ] ( select ) [ [ AS ] alias [ ( column_alias [, ...] ) ] ]"],"removed":[]},"to":"16"},{"from":"16","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters","compatibility"],"removed":[]},"status":"changed","synopsis":{"added":["[ FOR { UPDATE | NO KEY UPDATE | SHARE | KEY SHARE } [ OF from_reference [, ...] ] [ NOWAIT | SKIP LOCKED ] [...] ]","with_query_name [ ( column_name [, ...] ) ] AS [ [ NOT ] MATERIALIZED ] ( select | values | insert | update | delete | merge )"],"removed":["[ FOR { UPDATE | NO KEY UPDATE | SHARE | KEY SHARE } [ OF table_name [, ...] ] [ NOWAIT | SKIP LOCKED ] [...] ]"]},"to":"17"},{"from":"18","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters","examples"],"removed":[]},"status":"changed","synopsis":null,"to":"19"},{"from":"19","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters"],"removed":[]},"status":"changed","synopsis":null,"to":"20"}],"content_hash":"df59f325b12f386465778854a71cc51b13a7a79f131a62fc01981fd01ad84712","editorial":{},"first_version":"6.4","group":"query","imported_at":"2026-09-27T17:57:27.106907+08:00","last_version":"20","name":"SELECT","object":"","position":11006,"present_in":["6.4","6.5","7.0","7.1","7.2","7.3","7.4","8.0","8.1","8.2","8.3","8.4","9.0","9.1","9.2","9.3","9.4","9.5","9.6","10","11","12","13","14","15","16","17","18","19","20"],"purpose":"retrieve rows from a table or view","purpose_zh":"","related":[],"slug":"select","source_rev":"b7bd9cda","synopsis":"[ WITH [ RECURSIVE ] with_query [, ...] ]\nSELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]\n[ { * | expression [ [ AS ] output_name ] } [, ...] ]\n[ FROM from_item [, ...] ]\n[ WHERE condition ]\n[ GROUP BY [ ALL | DISTINCT ] grouping_element [, ...] ]\n[ HAVING condition ]\n[ WINDOW window_name AS ( window_definition ) [, ...] ]\n[ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ]\n[ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]\n[ LIMIT { count | ALL } ]\n[ OFFSET start [ ROW | ROWS ] ]\n[ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } { ONLY | WITH TIES } ]\n[ FOR { UPDATE | NO KEY UPDATE | SHARE | KEY SHARE } [ OF from_reference [, ...] ] [ NOWAIT | SKIP LOCKED ] [...] ]\n\nwhere from_item can be one of:\n\n[ ONLY ] table_name [ * ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]\n[ TABLESAMPLE sampling_method ( argument [, ...] ) [ REPEATABLE ( seed ) ] ]\n[ LATERAL ] ( select ) [ [ AS ] alias [ ( column_alias [, ...] ) ] ]\nwith_query_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ]\n[ LATERAL ] function_name ( [ argument [, ...] ] )\n[ WITH ORDINALITY ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]\n[ LATERAL ] function_name ( [ argument [, ...] ] ) [ AS ] alias ( column_definition [, ...] )\n[ LATERAL ] function_name ( [ argument [, ...] ] ) AS ( column_definition [, ...] )\n[ LATERAL ] ROWS FROM( function_name ( [ argument [, ...] ] ) [ AS ( column_definition [, ...] ) ] [, ...] )\n[ WITH ORDINALITY ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]\nfrom_item join_type from_item { ON join_condition | USING ( join_column [, ...] ) [ AS join_using_alias ] }\nfrom_item NATURAL join_type from_item\nfrom_item CROSS JOIN from_item\nand grouping_element can be one of:\n\n( )\nexpression\n( expression [, ...] )\nROLLUP ( { expression | ( expression [, ...] ) } [, ...] )\nCUBE ( { expression | ( expression [, ...] ) } [, ...] )\nGROUPING SETS ( grouping_element [, ...] )\n\nand with_query is:\nwith_query_name [ ( column_name [, ...] ) ] AS [ [ NOT ] MATERIALIZED ] ( select | values | insert | update | delete | merge )\n[ SEARCH { BREADTH | DEPTH } FIRST BY column_name [, ...] SET search_seq_col_name ]\n[ CYCLE column_name [, ...] SET cycle_mark_col_name [ TO cycle_mark_value DEFAULT cycle_mark_default ] USING cycle_path_col_name ]\n\nTABLE [ ONLY ] table_name [ * ]","verb":"SELECT"}},"Definition":{"Collection":"sql","Key":"select","SourceDatabase":"center","Version":"18","SourceTable":"sqlcmd","SourceKey":"select","SourceRevision":"b7bd9cda","Facts":{"anchor":"SQL-SELECT","file":"sql-select.html","lang":"en","name":"SELECT","purpose":"retrieve rows from a table or view","purpose_zh":"","related":[],"sections":[{"html":"\u003cp\u003e\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e retrieves rows from zero or more tables. The general processing of \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e is as follows:\u003c/p\u003e\u003cdiv class=\"orderedlist\"\u003e\u003col class=\"orderedlist\"\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003eAll queries in the \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e list are computed. These effectively serve as temporary tables that can be referenced in the \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e list. A \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e query that is referenced more than once in \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e is computed only once, unless specified otherwise with \u003ccode class=\"literal\"\u003eNOT MATERIALIZED\u003c/code\u003e. (See \u003ca href=\"/docs/18/sql-select.html#SQL-WITH\" title=\"WITH Clause\"\u003eWITH Clause\u003c/a\u003e below.)\u003c/p\u003e\u003c/li\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003eAll elements in the \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e list are computed. (Each element in the \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e list is a real or virtual table.) If more than one element is specified in the \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e list, they are cross-joined together. (See \u003ca href=\"/docs/18/sql-select.html#SQL-FROM\" title=\"FROM Clause\"\u003eFROM Clause\u003c/a\u003e below.)\u003c/p\u003e\u003c/li\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003eIf the \u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e clause is specified, all rows that do not satisfy the condition are eliminated from the output. (See \u003ca href=\"/docs/18/sql-select.html#SQL-WHERE\" title=\"WHERE Clause\"\u003eWHERE Clause\u003c/a\u003e below.)\u003c/p\u003e\u003c/li\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003eIf the \u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e clause is specified, or if there are aggregate function calls, the output is combined into groups of rows that match on one or more values, and the results of aggregate functions are computed. If the \u003ccode class=\"literal\"\u003eHAVING\u003c/code\u003e clause is present, it eliminates groups that do not satisfy the given condition. (See \u003ca href=\"/docs/18/sql-select.html#SQL-GROUPBY\" title=\"GROUP BY Clause\"\u003eGROUP BY Clause\u003c/a\u003e and \u003ca href=\"/docs/18/sql-select.html#SQL-HAVING\" title=\"HAVING Clause\"\u003eHAVING Clause\u003c/a\u003e below.) Although query output columns are nominally computed in the next step, they can also be referenced (by name or ordinal number) in the \u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e clause.\u003c/p\u003e\u003c/li\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003eThe actual output rows are computed using the \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e output expressions for each selected row or row group. (See \u003ca href=\"/docs/18/sql-select.html#SQL-SELECT-LIST\" title=\"SELECT List\"\u003eSELECT List\u003c/a\u003e below.)\u003c/p\u003e\u003c/li\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eSELECT DISTINCT\u003c/code\u003e eliminates duplicate rows from the result. \u003ccode class=\"literal\"\u003eSELECT DISTINCT ON\u003c/code\u003e eliminates rows that match on all the specified expressions. \u003ccode class=\"literal\"\u003eSELECT ALL\u003c/code\u003e (the default) will return all candidate rows, including duplicates. (See \u003ca href=\"/docs/18/sql-select.html#SQL-DISTINCT\" title=\"DISTINCT Clause\"\u003eDISTINCT Clause\u003c/a\u003e below.)\u003c/p\u003e\u003c/li\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003eUsing the operators \u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e, \u003ccode class=\"literal\"\u003eINTERSECT\u003c/code\u003e, and \u003ccode class=\"literal\"\u003eEXCEPT\u003c/code\u003e, the output of more than one \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e statement can be combined to form a single result set. The \u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e operator returns all rows that are in one or both of the result sets. The \u003ccode class=\"literal\"\u003eINTERSECT\u003c/code\u003e operator returns all rows that are strictly in both result sets. The \u003ccode class=\"literal\"\u003eEXCEPT\u003c/code\u003e operator returns the rows that are in the first result set but not in the second. In all three cases, duplicate rows are eliminated unless \u003ccode class=\"literal\"\u003eALL\u003c/code\u003e is specified. The noise word \u003ccode class=\"literal\"\u003eDISTINCT\u003c/code\u003e can be added to explicitly specify eliminating duplicate rows. Notice that \u003ccode class=\"literal\"\u003eDISTINCT\u003c/code\u003e is the default behavior here, even though \u003ccode class=\"literal\"\u003eALL\u003c/code\u003e is the default for \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e itself. (See \u003ca href=\"/docs/18/sql-select.html#SQL-UNION\" title=\"UNION Clause\"\u003eUNION Clause\u003c/a\u003e, \u003ca href=\"/docs/18/sql-select.html#SQL-INTERSECT\" title=\"INTERSECT Clause\"\u003eINTERSECT Clause\u003c/a\u003e, and \u003ca href=\"/docs/18/sql-select.html#SQL-EXCEPT\" title=\"EXCEPT Clause\"\u003eEXCEPT Clause\u003c/a\u003e below.)\u003c/p\u003e\u003c/li\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003eIf the \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e clause is specified, the returned rows are sorted in the specified order. If \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e is not given, the rows are returned in whatever order the system finds fastest to produce. (See \u003ca href=\"/docs/18/sql-select.html#SQL-ORDERBY\" title=\"ORDER BY Clause\"\u003eORDER BY Clause\u003c/a\u003e below.)\u003c/p\u003e\u003c/li\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003eIf the \u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e (or \u003ccode class=\"literal\"\u003eFETCH FIRST\u003c/code\u003e) or \u003ccode class=\"literal\"\u003eOFFSET\u003c/code\u003e clause is specified, the \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e statement only returns a subset of the result rows. (See \u003ca href=\"/docs/18/sql-select.html#SQL-LIMIT\" title=\"LIMIT Clause\"\u003eLIMIT Clause\u003c/a\u003e below.)\u003c/p\u003e\u003c/li\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003eIf \u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e or \u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e is specified, the \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e statement locks the selected rows against concurrent updates. (See \u003ca href=\"/docs/18/sql-select.html#SQL-FOR-UPDATE-SHARE\" title=\"The Locking Clause\"\u003eThe Locking Clause\u003c/a\u003e below.)\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003cp\u003eYou must have \u003ccode class=\"literal\"\u003eSELECT\u003c/code\u003e privilege on each column used in a \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e command. The use of \u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e or \u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e requires \u003ccode class=\"literal\"\u003eUPDATE\u003c/code\u003e privilege as well (for at least one column of each table so selected).\u003c/p\u003e","key":"description","title":"Description"},{"html":"\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e Clause\u003c/h3\u003e\u003cp\u003eThe \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e clause allows you to specify one or more subqueries that can be referenced by name in the primary query. The subqueries effectively act as temporary tables or views for the duration of the primary query. Each subquery can be a \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e, \u003ccode class=\"command\"\u003eTABLE\u003c/code\u003e, \u003ccode class=\"command\"\u003eVALUES\u003c/code\u003e, \u003ccode class=\"command\"\u003eINSERT\u003c/code\u003e, \u003ccode class=\"command\"\u003eUPDATE\u003c/code\u003e, \u003ccode class=\"command\"\u003eDELETE\u003c/code\u003e, or \u003ccode class=\"command\"\u003eMERGE\u003c/code\u003e statement. When writing a data-modifying statement (\u003ccode class=\"command\"\u003eINSERT\u003c/code\u003e, \u003ccode class=\"command\"\u003eUPDATE\u003c/code\u003e, \u003ccode class=\"command\"\u003eDELETE\u003c/code\u003e, or \u003ccode class=\"command\"\u003eMERGE\u003c/code\u003e) in \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e, it is usual to include a \u003ccode class=\"literal\"\u003eRETURNING\u003c/code\u003e clause. It is the output of \u003ccode class=\"literal\"\u003eRETURNING\u003c/code\u003e, \u003cspan class=\"emphasis\"\u003e\u003cem\u003enot\u003c/em\u003e\u003c/span\u003e the underlying table that the statement modifies, that forms the temporary table that is read by the primary query. If \u003ccode class=\"literal\"\u003eRETURNING\u003c/code\u003e is omitted, the statement is still executed, but it produces no output so it cannot be referenced as a table by the primary query.\u003c/p\u003e\u003cp\u003eA name (without schema qualification) must be specified for each \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e query. Optionally, a list of column names can be specified; if this is omitted, the column names are inferred from the subquery.\u003c/p\u003e\u003cp\u003eIf \u003ccode class=\"literal\"\u003eRECURSIVE\u003c/code\u003e is specified, it allows a \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e subquery to reference itself by name. Such a subquery must have the form\u003c/p\u003e\u003cpre class=\"synopsis\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003enon_recursive_term\u003c/code\u003e\u003c/em\u003e UNION [ ALL | DISTINCT ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003erecursive_term\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003ewhere the recursive self-reference must appear on the right-hand side of the \u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e. Only one recursive self-reference is permitted per query. Recursive data-modifying statements are not supported, but you can use the results of a recursive \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e query in a data-modifying statement. See \u003ca href=\"/docs/18/queries-with.html\" title=\"7.8. WITH Queries (Common Table Expressions)\"\u003eSection 7.8\u003c/a\u003e for an example.\u003c/p\u003e\u003cp\u003eAnother effect of \u003ccode class=\"literal\"\u003eRECURSIVE\u003c/code\u003e is that \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e queries need not be ordered: a query can reference another one that is later in the list. (However, circular references, or mutual recursion, are not implemented.) Without \u003ccode class=\"literal\"\u003eRECURSIVE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e queries can only reference sibling \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e queries that are earlier in the \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e list.\u003c/p\u003e\u003cp\u003eWhen there are multiple queries in the \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e clause, \u003ccode class=\"literal\"\u003eRECURSIVE\u003c/code\u003e should be written only once, immediately after \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e. It applies to all queries in the \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e clause, though it has no effect on queries that do not use recursion or forward references.\u003c/p\u003e\u003cp\u003eThe optional \u003ccode class=\"literal\"\u003eSEARCH\u003c/code\u003e clause computes a \u003cem class=\"firstterm\"\u003esearch sequence column\u003c/em\u003e that can be used for ordering the results of a recursive query in either breadth-first or depth-first order. The supplied column name list specifies the row key that is to be used for keeping track of visited rows. A column named \u003cem class=\"replaceable\"\u003e\u003ccode\u003esearch_seq_col_name\u003c/code\u003e\u003c/em\u003e will be added to the result column list of the \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e query. This column can be ordered by in the outer query to achieve the respective ordering. See \u003ca href=\"/docs/18/queries-with.html#QUERIES-WITH-SEARCH\" title=\"7.8.2.1. Search Order\"\u003eSection 7.8.2.1\u003c/a\u003e for examples.\u003c/p\u003e\u003cp\u003eThe optional \u003ccode class=\"literal\"\u003eCYCLE\u003c/code\u003e clause is used to detect cycles in recursive queries. The supplied column name list specifies the row key that is to be used for keeping track of visited rows. A column named \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecycle_mark_col_name\u003c/code\u003e\u003c/em\u003e will be added to the result column list of the \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e query. This column will be set to \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecycle_mark_value\u003c/code\u003e\u003c/em\u003e when a cycle has been detected, else to \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecycle_mark_default\u003c/code\u003e\u003c/em\u003e. Furthermore, processing of the recursive union will stop when a cycle has been detected. \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecycle_mark_value\u003c/code\u003e\u003c/em\u003e and \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecycle_mark_default\u003c/code\u003e\u003c/em\u003e must be constants and they must be coercible to a common data type, and the data type must have an inequality operator. (The SQL standard requires that they be Boolean constants or character strings, but PostgreSQL does not require that.) By default, \u003ccode class=\"literal\"\u003eTRUE\u003c/code\u003e and \u003ccode class=\"literal\"\u003eFALSE\u003c/code\u003e (of type \u003ccode class=\"type\"\u003eboolean\u003c/code\u003e) are used. Furthermore, a column named \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecycle_path_col_name\u003c/code\u003e\u003c/em\u003e will be added to the result column list of the \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e query. This column is used internally for tracking visited rows. See \u003ca href=\"/docs/18/queries-with.html#QUERIES-WITH-CYCLE\" title=\"7.8.2.2. Cycle Detection\"\u003eSection 7.8.2.2\u003c/a\u003e for examples.\u003c/p\u003e\u003cp\u003eBoth the \u003ccode class=\"literal\"\u003eSEARCH\u003c/code\u003e and the \u003ccode class=\"literal\"\u003eCYCLE\u003c/code\u003e clause are only valid for recursive \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e queries. The \u003cem class=\"replaceable\"\u003e\u003ccode\u003ewith_query\u003c/code\u003e\u003c/em\u003e must be a \u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e (or \u003ccode class=\"literal\"\u003eUNION ALL\u003c/code\u003e) of two \u003ccode class=\"literal\"\u003eSELECT\u003c/code\u003e (or equivalent) commands (no nested \u003ccode class=\"literal\"\u003eUNION\u003c/code\u003es). If both clauses are used, the column added by the \u003ccode class=\"literal\"\u003eSEARCH\u003c/code\u003e clause appears before the columns added by the \u003ccode class=\"literal\"\u003eCYCLE\u003c/code\u003e clause.\u003c/p\u003e\u003cp\u003eThe primary query and the \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e queries are all (notionally) executed at the same time. This implies that the effects of a data-modifying statement in \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e cannot be seen from other parts of the query, other than by reading its \u003ccode class=\"literal\"\u003eRETURNING\u003c/code\u003e output. If two such data-modifying statements attempt to modify the same row, the results are unspecified.\u003c/p\u003e\u003cp\u003eA key property of \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e queries is that they are normally evaluated only once per execution of the primary query, even if the primary query refers to them more than once. In particular, data-modifying statements are guaranteed to be executed once and only once, regardless of whether the primary query reads all or any of their output.\u003c/p\u003e\u003cp\u003eHowever, a \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e query can be marked \u003ccode class=\"literal\"\u003eNOT MATERIALIZED\u003c/code\u003e to remove this guarantee. In that case, the \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e query can be folded into the primary query much as though it were a simple sub-\u003ccode class=\"literal\"\u003eSELECT\u003c/code\u003e in the primary query's \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e clause. This results in duplicate computations if the primary query refers to that \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e query more than once; but if each such use requires only a few rows of the \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e query's total output, \u003ccode class=\"literal\"\u003eNOT MATERIALIZED\u003c/code\u003e can provide a net savings by allowing the queries to be optimized jointly. \u003ccode class=\"literal\"\u003eNOT MATERIALIZED\u003c/code\u003e is ignored if it is attached to a \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e query that is recursive or is not side-effect-free (i.e., is not a plain \u003ccode class=\"literal\"\u003eSELECT\u003c/code\u003e containing no volatile functions).\u003c/p\u003e\u003cp\u003eBy default, a side-effect-free \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e query is folded into the primary query if it is used exactly once in the primary query's \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e clause. This allows joint optimization of the two query levels in situations where that should be semantically invisible. However, such folding can be prevented by marking the \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e query as \u003ccode class=\"literal\"\u003eMATERIALIZED\u003c/code\u003e. That might be useful, for example, if the \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e query is being used as an optimization fence to prevent the planner from choosing a bad plan. \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e versions before v12 never did such folding, so queries written for older versions might rely on \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e to act as an optimization fence.\u003c/p\u003e\u003cp\u003eSee \u003ca href=\"/docs/18/queries-with.html\" title=\"7.8. WITH Queries (Common Table Expressions)\"\u003eSection 7.8\u003c/a\u003e for additional information.\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e Clause\u003c/h3\u003e\u003cp\u003eThe \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e clause specifies one or more source tables for the \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e. If multiple sources are specified, the result is the Cartesian product (cross join) of all the sources. But usually qualification conditions are added (via \u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e) to restrict the returned rows to a small subset of the Cartesian product.\u003c/p\u003e\u003cp\u003eThe \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e clause can contain the following elements:\u003c/p\u003e\u003cdiv class=\"variablelist\"\u003e\u003cdl class=\"variablelist\"\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eThe name (optionally schema-qualified) of an existing table or view. If \u003ccode class=\"literal\"\u003eONLY\u003c/code\u003e is specified before the table name, only that table is scanned. If \u003ccode class=\"literal\"\u003eONLY\u003c/code\u003e is not specified, the table and all its descendant tables (if any) are scanned. Optionally, \u003ccode class=\"literal\"\u003e*\u003c/code\u003e can be specified after the table name to explicitly indicate that descendant tables are included.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eA substitute name for the \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e item containing the alias. An alias is used for brevity or to eliminate ambiguity for self-joins (where the same table is scanned multiple times). When an alias is provided, it completely hides the actual name of the table or function; for example given \u003ccode class=\"literal\"\u003eFROM foo AS f\u003c/code\u003e, the remainder of the \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e must refer to this \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e item as \u003ccode class=\"literal\"\u003ef\u003c/code\u003e not \u003ccode class=\"literal\"\u003efoo\u003c/code\u003e. If an alias is written, a column alias list can also be written to provide substitute names for one or more columns of the table.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eTABLESAMPLE \u003cem class=\"replaceable\"\u003e\u003ccode\u003esampling_method\u003c/code\u003e\u003c/em\u003e ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargument\u003c/code\u003e\u003c/em\u003e [, ...] ) [ REPEATABLE ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003eseed\u003c/code\u003e\u003c/em\u003e ) ]\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eA \u003ccode class=\"literal\"\u003eTABLESAMPLE\u003c/code\u003e clause after a \u003cem class=\"replaceable\"\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e indicates that the specified \u003cem class=\"replaceable\"\u003e\u003ccode\u003esampling_method\u003c/code\u003e\u003c/em\u003e should be used to retrieve a subset of the rows in that table. This sampling precedes the application of any other filters such as \u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e clauses. The standard \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e distribution includes two sampling methods, \u003ccode class=\"literal\"\u003eBERNOULLI\u003c/code\u003e and \u003ccode class=\"literal\"\u003eSYSTEM\u003c/code\u003e, and other sampling methods can be installed in the database via extensions.\u003c/p\u003e\u003cp\u003eThe \u003ccode class=\"literal\"\u003eBERNOULLI\u003c/code\u003e and \u003ccode class=\"literal\"\u003eSYSTEM\u003c/code\u003e sampling methods each accept a single \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargument\u003c/code\u003e\u003c/em\u003e which is the fraction of the table to sample, expressed as a percentage between 0 and 100. This argument can be any \u003ccode class=\"type\"\u003ereal\u003c/code\u003e-valued expression. (Other sampling methods might accept more or different arguments.) These two methods each return a randomly-chosen sample of the table that will contain approximately the specified percentage of the table's rows. The \u003ccode class=\"literal\"\u003eBERNOULLI\u003c/code\u003e method scans the whole table and selects or ignores individual rows independently with the specified probability. The \u003ccode class=\"literal\"\u003eSYSTEM\u003c/code\u003e method does block-level sampling with each block having the specified chance of being selected; all rows in each selected block are returned. The \u003ccode class=\"literal\"\u003eSYSTEM\u003c/code\u003e method is significantly faster than the \u003ccode class=\"literal\"\u003eBERNOULLI\u003c/code\u003e method when small sampling percentages are specified, but it may return a less-random sample of the table as a result of clustering effects.\u003c/p\u003e\u003cp\u003eThe optional \u003ccode class=\"literal\"\u003eREPEATABLE\u003c/code\u003e clause specifies a \u003cem class=\"replaceable\"\u003e\u003ccode\u003eseed\u003c/code\u003e\u003c/em\u003e number or expression to use for generating random numbers within the sampling method. The seed value can be any non-null floating-point value. Two queries that specify the same seed and \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargument\u003c/code\u003e\u003c/em\u003e values will select the same sample of the table, if the table has not been changed meanwhile. But different seed values will usually produce different samples. If \u003ccode class=\"literal\"\u003eREPEATABLE\u003c/code\u003e is not given then a new random sample is selected for each query, based upon a system-generated seed. Note that some add-on sampling methods do not accept \u003ccode class=\"literal\"\u003eREPEATABLE\u003c/code\u003e, and will always produce new samples on each use.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eselect\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eA sub-\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e can appear in the \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e clause. This acts as though its output were created as a temporary table for the duration of this single \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e command. Note that the sub-\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e must be surrounded by parentheses, and an alias can be provided in the same way as for a table. A \u003ca href=\"/docs/18/sql-values.html\" title=\"VALUES\"\u003e\u003ccode class=\"command\"\u003eVALUES\u003c/code\u003e\u003c/a\u003e command can also be used here.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003ewith_query_name\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eA \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e query is referenced by writing its name, just as though the query's name were a table name. (In fact, the \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e query hides any real table of the same name for the purposes of the primary query. If necessary, you can refer to a real table of the same name by schema-qualifying the table's name.) An alias can be provided in the same way as for a table.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003efunction_name\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eFunction calls can appear in the \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e clause. (This is especially useful for functions that return result sets, but any function can be used.) This acts as though the function's output were created as a temporary table for the duration of this single \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e command. If the function's result type is composite (including the case of a function with multiple \u003ccode class=\"literal\"\u003eOUT\u003c/code\u003e parameters), each attribute becomes a separate column in the implicit table.\u003c/p\u003e\u003cp\u003eWhen the optional \u003ccode class=\"command\"\u003eWITH ORDINALITY\u003c/code\u003e clause is added to the function call, an additional column of type \u003ccode class=\"type\"\u003ebigint\u003c/code\u003e will be appended to the function's result column(s). This column numbers the rows of the function's result set, starting from 1. By default, this column is named \u003ccode class=\"literal\"\u003eordinality\u003c/code\u003e.\u003c/p\u003e\u003cp\u003eAn alias can be provided in the same way as for a table. If an alias is written, a column alias list can also be written to provide substitute names for one or more attributes of the function's composite return type, including the ordinality column if present.\u003c/p\u003e\u003cp\u003eMultiple function calls can be combined into a single \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e-clause item by surrounding them with \u003ccode class=\"literal\"\u003eROWS FROM( ... )\u003c/code\u003e. The output of such an item is the concatenation of the first row from each function, then the second row from each function, etc. If some of the functions produce fewer rows than others, null values are substituted for the missing data, so that the total number of rows returned is always the same as for the function that produced the most rows.\u003c/p\u003e\u003cp\u003eIf the function has been defined as returning the \u003ccode class=\"type\"\u003erecord\u003c/code\u003e data type, then an alias or the key word \u003ccode class=\"literal\"\u003eAS\u003c/code\u003e must be present, followed by a column definition list in the form \u003ccode class=\"literal\"\u003e( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e \u003cem class=\"replaceable\"\u003e\u003ccode\u003edata_type\u003c/code\u003e\u003c/em\u003e [\u003cspan class=\"optional\"\u003e, ...\u003c/span\u003e ])\u003c/code\u003e. The column definition list must match the actual number and types of columns returned by the function.\u003c/p\u003e\u003cp\u003eWhen using the \u003ccode class=\"literal\"\u003eROWS FROM( ... )\u003c/code\u003e syntax, if one of the functions requires a column definition list, it's preferred to put the column definition list after the function call inside \u003ccode class=\"literal\"\u003eROWS FROM( ... )\u003c/code\u003e. A column definition list can be placed after the \u003ccode class=\"literal\"\u003eROWS FROM( ... )\u003c/code\u003e construct only if there's just a single function and no \u003ccode class=\"literal\"\u003eWITH ORDINALITY\u003c/code\u003e clause.\u003c/p\u003e\u003cp\u003eTo use \u003ccode class=\"literal\"\u003eORDINALITY\u003c/code\u003e together with a column definition list, you must use the \u003ccode class=\"literal\"\u003eROWS FROM( ... )\u003c/code\u003e syntax and put the column definition list inside \u003ccode class=\"literal\"\u003eROWS FROM( ... )\u003c/code\u003e.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003ejoin_type\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eOne of\u003c/p\u003e\u003cdiv class=\"itemizedlist\"\u003e\u003cul class=\"itemizedlist\"\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003e[ INNER ] JOIN\u003c/code\u003e\u003c/p\u003e\u003c/li\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eLEFT [ OUTER ] JOIN\u003c/code\u003e\u003c/p\u003e\u003c/li\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eRIGHT [ OUTER ] JOIN\u003c/code\u003e\u003c/p\u003e\u003c/li\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eFULL [ OUTER ] JOIN\u003c/code\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cp\u003eFor the \u003ccode class=\"literal\"\u003eINNER\u003c/code\u003e and \u003ccode class=\"literal\"\u003eOUTER\u003c/code\u003e join types, a join condition must be specified, namely exactly one of \u003ccode class=\"literal\"\u003eON \u003cem class=\"replaceable\"\u003e\u003ccode\u003ejoin_condition\u003c/code\u003e\u003c/em\u003e\u003c/code\u003e, \u003ccode class=\"literal\"\u003eUSING (\u003cem class=\"replaceable\"\u003e\u003ccode\u003ejoin_column\u003c/code\u003e\u003c/em\u003e [, ...])\u003c/code\u003e, or \u003ccode class=\"literal\"\u003eNATURAL\u003c/code\u003e. See below for the meaning.\u003c/p\u003e\u003cp\u003eA \u003ccode class=\"literal\"\u003eJOIN\u003c/code\u003e clause combines two \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e items, which for convenience we will refer to as \u003cspan class=\"quote\"\u003e“\u003cspan class=\"quote\"\u003etables\u003c/span\u003e”\u003c/span\u003e, though in reality they can be any type of \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e item. Use parentheses if necessary to determine the order of nesting. In the absence of parentheses, \u003ccode class=\"literal\"\u003eJOIN\u003c/code\u003es nest left-to-right. In any case \u003ccode class=\"literal\"\u003eJOIN\u003c/code\u003e binds more tightly than the commas separating \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e-list items. All the \u003ccode class=\"literal\"\u003eJOIN\u003c/code\u003e options are just a notational convenience, since they do nothing you couldn't do with plain \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e and \u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e.\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eLEFT OUTER JOIN\u003c/code\u003e returns all rows in the qualified Cartesian product (i.e., all combined rows that pass its join condition), plus one copy of each row in the left-hand table for which there was no right-hand row that passed the join condition. This left-hand row is extended to the full width of the joined table by inserting null values for the right-hand columns. Note that only the \u003ccode class=\"literal\"\u003eJOIN\u003c/code\u003e clause's own condition is considered while deciding which rows have matches. Outer conditions are applied afterwards.\u003c/p\u003e\u003cp\u003eConversely, \u003ccode class=\"literal\"\u003eRIGHT OUTER JOIN\u003c/code\u003e returns all the joined rows, plus one row for each unmatched right-hand row (extended with nulls on the left). This is just a notational convenience, since you could convert it to a \u003ccode class=\"literal\"\u003eLEFT OUTER JOIN\u003c/code\u003e by switching the left and right tables.\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eFULL OUTER JOIN\u003c/code\u003e returns all the joined rows, plus one row for each unmatched left-hand row (extended with nulls on the right), plus one row for each unmatched right-hand row (extended with nulls on the left).\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eON \u003cem class=\"replaceable\"\u003e\u003ccode\u003ejoin_condition\u003c/code\u003e\u003c/em\u003e\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003ejoin_condition\u003c/code\u003e\u003c/em\u003e is an expression resulting in a value of type \u003ccode class=\"type\"\u003eboolean\u003c/code\u003e (similar to a \u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e clause) that specifies which rows in a join are considered to match.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eUSING ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ejoin_column\u003c/code\u003e\u003c/em\u003e [, ...] ) [ AS \u003cem class=\"replaceable\"\u003e\u003ccode\u003ejoin_using_alias\u003c/code\u003e\u003c/em\u003e ]\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eA clause of the form \u003ccode class=\"literal\"\u003eUSING ( a, b, ... )\u003c/code\u003e is shorthand for \u003ccode class=\"literal\"\u003eON left_table.a = right_table.a AND left_table.b = right_table.b ...\u003c/code\u003e. Also, \u003ccode class=\"literal\"\u003eUSING\u003c/code\u003e implies that only one of each pair of equivalent columns will be included in the join output, not both.\u003c/p\u003e\u003cp\u003eIf a \u003cem class=\"replaceable\"\u003e\u003ccode\u003ejoin_using_alias\u003c/code\u003e\u003c/em\u003e name is specified, it provides a table alias for the join columns. Only the join columns listed in the \u003ccode class=\"literal\"\u003eUSING\u003c/code\u003e clause are addressable by this name. Unlike a regular \u003cem class=\"replaceable\"\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e, this does not hide the names of the joined tables from the rest of the query. Also unlike a regular \u003cem class=\"replaceable\"\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e, you cannot write a column alias list — the output names of the join columns are the same as they appear in the \u003ccode class=\"literal\"\u003eUSING\u003c/code\u003e list.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eNATURAL\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eNATURAL\u003c/code\u003e is shorthand for a \u003ccode class=\"literal\"\u003eUSING\u003c/code\u003e list that mentions all columns in the two tables that have matching names. If there are no common column names, \u003ccode class=\"literal\"\u003eNATURAL\u003c/code\u003e is equivalent to \u003ccode class=\"literal\"\u003eON TRUE\u003c/code\u003e.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eCROSS JOIN\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eCROSS JOIN\u003c/code\u003e is equivalent to \u003ccode class=\"literal\"\u003eINNER JOIN ON (TRUE)\u003c/code\u003e, that is, no rows are removed by qualification. They produce a simple Cartesian product, the same result as you get from listing the two tables at the top level of \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e, but restricted by the join condition (if any).\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eLATERAL\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eThe \u003ccode class=\"literal\"\u003eLATERAL\u003c/code\u003e key word can precede a sub-\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e item. This allows the sub-\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e to refer to columns of \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e items that appear before it in the \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e list. (Without \u003ccode class=\"literal\"\u003eLATERAL\u003c/code\u003e, each sub-\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e is evaluated independently and so cannot cross-reference any other \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e item.)\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eLATERAL\u003c/code\u003e can also precede a function-call \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e item, but in this case it is a noise word, because the function expression can refer to earlier \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e items in any case.\u003c/p\u003e\u003cp\u003eA \u003ccode class=\"literal\"\u003eLATERAL\u003c/code\u003e item can appear at top level in the \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e list, or within a \u003ccode class=\"literal\"\u003eJOIN\u003c/code\u003e tree. In the latter case it can also refer to any items that are on the left-hand side of a \u003ccode class=\"literal\"\u003eJOIN\u003c/code\u003e that it is on the right-hand side of.\u003c/p\u003e\u003cp\u003eWhen a \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e item contains \u003ccode class=\"literal\"\u003eLATERAL\u003c/code\u003e cross-references, evaluation proceeds as follows: for each row of the \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e item providing the cross-referenced column(s), or set of rows of multiple \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e items providing the columns, the \u003ccode class=\"literal\"\u003eLATERAL\u003c/code\u003e item is evaluated using that row or row set's values of the columns. The resulting row(s) are joined as usual with the rows they were computed from. This is repeated for each row or set of rows from the column source table(s).\u003c/p\u003e\u003cp\u003eThe column source table(s) must be \u003ccode class=\"literal\"\u003eINNER\u003c/code\u003e or \u003ccode class=\"literal\"\u003eLEFT\u003c/code\u003e joined to the \u003ccode class=\"literal\"\u003eLATERAL\u003c/code\u003e item, else there would not be a well-defined set of rows from which to compute each set of rows for the \u003ccode class=\"literal\"\u003eLATERAL\u003c/code\u003e item. Thus, although a construct such as \u003ccode class=\"literal\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eX\u003c/code\u003e\u003c/em\u003e RIGHT JOIN LATERAL \u003cem class=\"replaceable\"\u003e\u003ccode\u003eY\u003c/code\u003e\u003c/em\u003e\u003c/code\u003e is syntactically valid, it is not actually allowed for \u003cem class=\"replaceable\"\u003e\u003ccode\u003eY\u003c/code\u003e\u003c/em\u003e to reference \u003cem class=\"replaceable\"\u003e\u003ccode\u003eX\u003c/code\u003e\u003c/em\u003e.\u003c/p\u003e\u003c/dd\u003e\u003c/dl\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e Clause\u003c/h3\u003e\u003cp\u003eThe optional \u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e clause has the general form\u003c/p\u003e\u003cpre class=\"synopsis\"\u003eWHERE \u003cem class=\"replaceable\"\u003e\u003ccode\u003econdition\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003ewhere \u003cem class=\"replaceable\"\u003e\u003ccode\u003econdition\u003c/code\u003e\u003c/em\u003e is any expression that evaluates to a result of type \u003ccode class=\"type\"\u003eboolean\u003c/code\u003e. Any row that does not satisfy this condition will be eliminated from the output. A row satisfies the condition if it returns true when the actual row values are substituted for any variable references.\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e Clause\u003c/h3\u003e\u003cp\u003eThe optional \u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e clause has the general form\u003c/p\u003e\u003cpre class=\"synopsis\"\u003eGROUP BY [ ALL | DISTINCT ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003egrouping_element\u003c/code\u003e\u003c/em\u003e [, ...]\n\u003c/pre\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e will condense into a single row all selected rows that share the same values for the grouped expressions. An \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e used inside a \u003cem class=\"replaceable\"\u003e\u003ccode\u003egrouping_element\u003c/code\u003e\u003c/em\u003e can be an input column name, or the name or ordinal number of an output column (\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e list item), or an arbitrary expression formed from input-column values. In case of ambiguity, a \u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e name will be interpreted as an input-column name rather than an output column name.\u003c/p\u003e\u003cp\u003eIf any of \u003ccode class=\"literal\"\u003eGROUPING SETS\u003c/code\u003e, \u003ccode class=\"literal\"\u003eROLLUP\u003c/code\u003e or \u003ccode class=\"literal\"\u003eCUBE\u003c/code\u003e are present as grouping elements, then the \u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e clause as a whole defines some number of independent \u003cem class=\"replaceable\"\u003e\u003ccode\u003egrouping sets\u003c/code\u003e\u003c/em\u003e. The effect of this is equivalent to constructing a \u003ccode class=\"literal\"\u003eUNION ALL\u003c/code\u003e between subqueries with the individual grouping sets as their \u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e clauses. The optional \u003ccode class=\"literal\"\u003eDISTINCT\u003c/code\u003e clause removes duplicate sets before processing; it does \u003cspan class=\"emphasis\"\u003e\u003cem\u003enot\u003c/em\u003e\u003c/span\u003e transform the \u003ccode class=\"literal\"\u003eUNION ALL\u003c/code\u003e into a \u003ccode class=\"literal\"\u003eUNION DISTINCT\u003c/code\u003e. For further details on the handling of grouping sets see \u003ca href=\"/docs/18/queries-table-expressions.html#QUERIES-GROUPING-SETS\" title=\"7.2.4. GROUPING SETS, CUBE, and ROLLUP\"\u003eSection 7.2.4\u003c/a\u003e.\u003c/p\u003e\u003cp\u003eAggregate functions, if any are used, are computed across all rows making up each group, producing a separate value for each group. (If there are aggregate functions but no \u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e clause, the query is treated as having a single group comprising all the selected rows.) The set of rows fed to each aggregate function can be further filtered by attaching a \u003ccode class=\"literal\"\u003eFILTER\u003c/code\u003e clause to the aggregate function call; see \u003ca href=\"/docs/18/sql-expressions.html#SYNTAX-AGGREGATES\" title=\"4.2.7. Aggregate Expressions\"\u003eSection 4.2.7\u003c/a\u003e for more information. When a \u003ccode class=\"literal\"\u003eFILTER\u003c/code\u003e clause is present, only those rows matching it are included in the input to that aggregate function.\u003c/p\u003e\u003cp\u003eWhen \u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e is present, or any aggregate functions are present, it is not valid for the \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e list expressions to refer to ungrouped columns except within aggregate functions or when the ungrouped column is functionally dependent on the grouped columns, since there would otherwise be more than one possible value to return for an ungrouped column. A functional dependency exists if the grouped columns (or a subset thereof) are the primary key of the table containing the ungrouped column.\u003c/p\u003e\u003cp\u003eKeep in mind that all aggregate functions are evaluated before evaluating any \u003cspan class=\"quote\"\u003e“\u003cspan class=\"quote\"\u003escalar\u003c/span\u003e”\u003c/span\u003e expressions in the \u003ccode class=\"literal\"\u003eHAVING\u003c/code\u003e clause or \u003ccode class=\"literal\"\u003eSELECT\u003c/code\u003e list. This means that, for example, a \u003ccode class=\"literal\"\u003eCASE\u003c/code\u003e expression cannot be used to skip evaluation of an aggregate function; see \u003ca href=\"/docs/18/sql-expressions.html#SYNTAX-EXPRESS-EVAL\" title=\"4.2.14. Expression Evaluation Rules\"\u003eSection 4.2.14\u003c/a\u003e.\u003c/p\u003e\u003cp\u003eCurrently, \u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e and \u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e cannot be specified with \u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e.\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eHAVING\u003c/code\u003e Clause\u003c/h3\u003e\u003cp\u003eThe optional \u003ccode class=\"literal\"\u003eHAVING\u003c/code\u003e clause has the general form\u003c/p\u003e\u003cpre class=\"synopsis\"\u003eHAVING \u003cem class=\"replaceable\"\u003e\u003ccode\u003econdition\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003ewhere \u003cem class=\"replaceable\"\u003e\u003ccode\u003econdition\u003c/code\u003e\u003c/em\u003e is the same as specified for the \u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e clause.\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eHAVING\u003c/code\u003e eliminates group rows that do not satisfy the condition. \u003ccode class=\"literal\"\u003eHAVING\u003c/code\u003e is different from \u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e: \u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e filters individual rows before the application of \u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e, while \u003ccode class=\"literal\"\u003eHAVING\u003c/code\u003e filters group rows created by \u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e. Each column referenced in \u003cem class=\"replaceable\"\u003e\u003ccode\u003econdition\u003c/code\u003e\u003c/em\u003e must unambiguously reference a grouping column, unless the reference appears within an aggregate function or the ungrouped column is functionally dependent on the grouping columns.\u003c/p\u003e\u003cp\u003eThe presence of \u003ccode class=\"literal\"\u003eHAVING\u003c/code\u003e turns a query into a grouped query even if there is no \u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e clause. This is the same as what happens when the query contains aggregate functions but no \u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e clause. All the selected rows are considered to form a single group, and the \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e list and \u003ccode class=\"literal\"\u003eHAVING\u003c/code\u003e clause can only reference table columns from within aggregate functions. Such a query will emit a single row if the \u003ccode class=\"literal\"\u003eHAVING\u003c/code\u003e condition is true, zero rows if it is not true.\u003c/p\u003e\u003cp\u003eCurrently, \u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e and \u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e cannot be specified with \u003ccode class=\"literal\"\u003eHAVING\u003c/code\u003e.\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eWINDOW\u003c/code\u003e Clause\u003c/h3\u003e\u003cp\u003eThe optional \u003ccode class=\"literal\"\u003eWINDOW\u003c/code\u003e clause has the general form\u003c/p\u003e\u003cpre class=\"synopsis\"\u003eWINDOW \u003cem class=\"replaceable\"\u003e\u003ccode\u003ewindow_name\u003c/code\u003e\u003c/em\u003e AS ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ewindow_definition\u003c/code\u003e\u003c/em\u003e ) [, ...]\n\u003c/pre\u003e\u003cp\u003ewhere \u003cem class=\"replaceable\"\u003e\u003ccode\u003ewindow_name\u003c/code\u003e\u003c/em\u003e is a name that can be referenced from \u003ccode class=\"literal\"\u003eOVER\u003c/code\u003e clauses or subsequent window definitions, and \u003cem class=\"replaceable\"\u003e\u003ccode\u003ewindow_definition\u003c/code\u003e\u003c/em\u003e is\u003c/p\u003e\u003cpre class=\"synopsis\"\u003e[ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexisting_window_name\u003c/code\u003e\u003c/em\u003e ]\n[ PARTITION BY \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e [, ...] ]\n[ ORDER BY \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e [ ASC | DESC | USING \u003cem class=\"replaceable\"\u003e\u003ccode\u003eoperator\u003c/code\u003e\u003c/em\u003e ] [ NULLS { FIRST | LAST } ] [, ...] ]\n[ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_clause\u003c/code\u003e\u003c/em\u003e ]\n\u003c/pre\u003e\u003cp\u003eIf an \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexisting_window_name\u003c/code\u003e\u003c/em\u003e is specified it must refer to an earlier entry in the \u003ccode class=\"literal\"\u003eWINDOW\u003c/code\u003e list; the new window copies its partitioning clause from that entry, as well as its ordering clause if any. In this case the new window cannot specify its own \u003ccode class=\"literal\"\u003ePARTITION BY\u003c/code\u003e clause, and it can specify \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e only if the copied window does not have one. The new window always uses its own frame clause; the copied window must not specify a frame clause.\u003c/p\u003e\u003cp\u003eThe elements of the \u003ccode class=\"literal\"\u003ePARTITION BY\u003c/code\u003e list are interpreted in much the same fashion as elements of a \u003ca href=\"/docs/18/sql-select.html#SQL-GROUPBY\" title=\"GROUP BY Clause\"\u003e\u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e\u003c/a\u003e clause, except that they are always simple expressions and never the name or number of an output column. Another difference is that these expressions can contain aggregate function calls, which are not allowed in a regular \u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e clause. They are allowed here because windowing occurs after grouping and aggregation.\u003c/p\u003e\u003cp\u003eSimilarly, the elements of the \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e list are interpreted in much the same fashion as elements of a statement-level \u003ca href=\"/docs/18/sql-select.html#SQL-ORDERBY\" title=\"ORDER BY Clause\"\u003e\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e\u003c/a\u003e clause, except that the expressions are always taken as simple expressions and never the name or number of an output column.\u003c/p\u003e\u003cp\u003eThe optional \u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_clause\u003c/code\u003e\u003c/em\u003e defines the \u003cem class=\"firstterm\"\u003ewindow frame\u003c/em\u003e for window functions that depend on the frame (not all do). The window frame is a set of related rows for each row of the query (called the \u003cem class=\"firstterm\"\u003ecurrent row\u003c/em\u003e). The \u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_clause\u003c/code\u003e\u003c/em\u003e can be one of\u003c/p\u003e\u003cpre class=\"synopsis\"\u003e{ RANGE | ROWS | GROUPS } \u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_start\u003c/code\u003e\u003c/em\u003e [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_exclusion\u003c/code\u003e\u003c/em\u003e ]\n{ RANGE | ROWS | GROUPS } BETWEEN \u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_start\u003c/code\u003e\u003c/em\u003e AND \u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_end\u003c/code\u003e\u003c/em\u003e [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_exclusion\u003c/code\u003e\u003c/em\u003e ]\n\u003c/pre\u003e\u003cp\u003ewhere \u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_start\u003c/code\u003e\u003c/em\u003e and \u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_end\u003c/code\u003e\u003c/em\u003e can be one of\u003c/p\u003e\u003cpre class=\"synopsis\"\u003eUNBOUNDED PRECEDING\n\u003cem class=\"replaceable\"\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e PRECEDING\nCURRENT ROW\n\u003cem class=\"replaceable\"\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e FOLLOWING\nUNBOUNDED FOLLOWING\n\u003c/pre\u003e\u003cp\u003eand \u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_exclusion\u003c/code\u003e\u003c/em\u003e can be one of\u003c/p\u003e\u003cpre class=\"synopsis\"\u003eEXCLUDE CURRENT ROW\nEXCLUDE GROUP\nEXCLUDE TIES\nEXCLUDE NO OTHERS\n\u003c/pre\u003e\u003cp\u003eIf \u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_end\u003c/code\u003e\u003c/em\u003e is omitted it defaults to \u003ccode class=\"literal\"\u003eCURRENT ROW\u003c/code\u003e. Restrictions are that \u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_start\u003c/code\u003e\u003c/em\u003e cannot be \u003ccode class=\"literal\"\u003eUNBOUNDED FOLLOWING\u003c/code\u003e, \u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_end\u003c/code\u003e\u003c/em\u003e cannot be \u003ccode class=\"literal\"\u003eUNBOUNDED PRECEDING\u003c/code\u003e, and the \u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_end\u003c/code\u003e\u003c/em\u003e choice cannot appear earlier in the above list of \u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_start\u003c/code\u003e\u003c/em\u003e and \u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_end\u003c/code\u003e\u003c/em\u003e options than the \u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_start\u003c/code\u003e\u003c/em\u003e choice does — for example \u003ccode class=\"literal\"\u003eRANGE BETWEEN CURRENT ROW AND \u003cem class=\"replaceable\"\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e PRECEDING\u003c/code\u003e is not allowed.\u003c/p\u003e\u003cp\u003eThe default framing option is \u003ccode class=\"literal\"\u003eRANGE UNBOUNDED PRECEDING\u003c/code\u003e, which is the same as \u003ccode class=\"literal\"\u003eRANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW\u003c/code\u003e; it sets the frame to be all rows from the partition start up through the current row's last \u003cem class=\"firstterm\"\u003epeer\u003c/em\u003e (a row that the window's \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e clause considers equivalent to the current row; all rows are peers if there is no \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e). In general, \u003ccode class=\"literal\"\u003eUNBOUNDED PRECEDING\u003c/code\u003e means that the frame starts with the first row of the partition, and similarly \u003ccode class=\"literal\"\u003eUNBOUNDED FOLLOWING\u003c/code\u003e means that the frame ends with the last row of the partition, regardless of \u003ccode class=\"literal\"\u003eRANGE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eROWS\u003c/code\u003e or \u003ccode class=\"literal\"\u003eGROUPS\u003c/code\u003e mode. In \u003ccode class=\"literal\"\u003eROWS\u003c/code\u003e mode, \u003ccode class=\"literal\"\u003eCURRENT ROW\u003c/code\u003e means that the frame starts or ends with the current row; but in \u003ccode class=\"literal\"\u003eRANGE\u003c/code\u003e or \u003ccode class=\"literal\"\u003eGROUPS\u003c/code\u003e mode it means that the frame starts or ends with the current row's first or last peer in the \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e ordering. The \u003cem class=\"replaceable\"\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e \u003ccode class=\"literal\"\u003ePRECEDING\u003c/code\u003e and \u003cem class=\"replaceable\"\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e \u003ccode class=\"literal\"\u003eFOLLOWING\u003c/code\u003e options vary in meaning depending on the frame mode. In \u003ccode class=\"literal\"\u003eROWS\u003c/code\u003e mode, the \u003cem class=\"replaceable\"\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e is an integer indicating that the frame starts or ends that many rows before or after the current row. In \u003ccode class=\"literal\"\u003eGROUPS\u003c/code\u003e mode, the \u003cem class=\"replaceable\"\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e is an integer indicating that the frame starts or ends that many peer groups before or after the current row's peer group, where a \u003cem class=\"firstterm\"\u003epeer group\u003c/em\u003e is a group of rows that are equivalent according to the window's \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e clause. In \u003ccode class=\"literal\"\u003eRANGE\u003c/code\u003e mode, use of an \u003cem class=\"replaceable\"\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e option requires that there be exactly one \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e column in the window definition. Then the frame contains those rows whose ordering column value is no more than \u003cem class=\"replaceable\"\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e less than (for \u003ccode class=\"literal\"\u003ePRECEDING\u003c/code\u003e) or more than (for \u003ccode class=\"literal\"\u003eFOLLOWING\u003c/code\u003e) the current row's ordering column value. In these cases the data type of the \u003cem class=\"replaceable\"\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e expression depends on the data type of the ordering column. For numeric ordering columns it is typically of the same type as the ordering column, but for datetime ordering columns it is an \u003ccode class=\"type\"\u003einterval\u003c/code\u003e. In all these cases, the value of the \u003cem class=\"replaceable\"\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e must be non-null and non-negative. Also, while the \u003cem class=\"replaceable\"\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e does not have to be a simple constant, it cannot contain variables, aggregate functions, or window functions.\u003c/p\u003e\u003cp\u003eThe \u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_exclusion\u003c/code\u003e\u003c/em\u003e option allows rows around the current row to be excluded from the frame, even if they would be included according to the frame start and frame end options. \u003ccode class=\"literal\"\u003eEXCLUDE CURRENT ROW\u003c/code\u003e excludes the current row from the frame. \u003ccode class=\"literal\"\u003eEXCLUDE GROUP\u003c/code\u003e excludes the current row and its ordering peers from the frame. \u003ccode class=\"literal\"\u003eEXCLUDE TIES\u003c/code\u003e excludes any peers of the current row from the frame, but not the current row itself. \u003ccode class=\"literal\"\u003eEXCLUDE NO OTHERS\u003c/code\u003e simply specifies explicitly the default behavior of not excluding the current row or its peers.\u003c/p\u003e\u003cp\u003eBeware that the \u003ccode class=\"literal\"\u003eROWS\u003c/code\u003e mode can produce unpredictable results if the \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e ordering does not order the rows uniquely. The \u003ccode class=\"literal\"\u003eRANGE\u003c/code\u003e and \u003ccode class=\"literal\"\u003eGROUPS\u003c/code\u003e modes are designed to ensure that rows that are peers in the \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e ordering are treated alike: all rows of a given peer group will be in the frame or excluded from it.\u003c/p\u003e\u003cp\u003eThe purpose of a \u003ccode class=\"literal\"\u003eWINDOW\u003c/code\u003e clause is to specify the behavior of \u003cem class=\"firstterm\"\u003ewindow functions\u003c/em\u003e appearing in the query's \u003ca href=\"/docs/18/sql-select.html#SQL-SELECT-LIST\" title=\"SELECT List\"\u003e\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e list\u003c/a\u003e or \u003ca href=\"/docs/18/sql-select.html#SQL-ORDERBY\" title=\"ORDER BY Clause\"\u003e\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e\u003c/a\u003e clause. These functions can reference the \u003ccode class=\"literal\"\u003eWINDOW\u003c/code\u003e clause entries by name in their \u003ccode class=\"literal\"\u003eOVER\u003c/code\u003e clauses. A \u003ccode class=\"literal\"\u003eWINDOW\u003c/code\u003e clause entry does not have to be referenced anywhere, however; if it is not used in the query it is simply ignored. It is possible to use window functions without any \u003ccode class=\"literal\"\u003eWINDOW\u003c/code\u003e clause at all, since a window function call can specify its window definition directly in its \u003ccode class=\"literal\"\u003eOVER\u003c/code\u003e clause. However, the \u003ccode class=\"literal\"\u003eWINDOW\u003c/code\u003e clause saves typing when the same window definition is needed for more than one window function.\u003c/p\u003e\u003cp\u003eCurrently, \u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e and \u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e cannot be specified with \u003ccode class=\"literal\"\u003eWINDOW\u003c/code\u003e.\u003c/p\u003e\u003cp\u003eWindow functions are described in detail in \u003ca href=\"/docs/18/tutorial-window.html\" title=\"3.5. Window Functions\"\u003eSection 3.5\u003c/a\u003e, \u003ca href=\"/docs/18/sql-expressions.html#SYNTAX-WINDOW-FUNCTIONS\" title=\"4.2.8. Window Function Calls\"\u003eSection 4.2.8\u003c/a\u003e, and \u003ca href=\"/docs/18/queries-table-expressions.html#QUERIES-WINDOW\" title=\"7.2.5. Window Function Processing\"\u003eSection 7.2.5\u003c/a\u003e.\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e List\u003c/h3\u003e\u003cp\u003eThe \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e list (between the key words \u003ccode class=\"literal\"\u003eSELECT\u003c/code\u003e and \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e) specifies expressions that form the output rows of the \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e statement. The expressions can (and usually do) refer to columns computed in the \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e clause.\u003c/p\u003e\u003cp\u003eJust as in a table, every output column of a \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e has a name. In a simple \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e this name is just used to label the column for display, but when the \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e is a sub-query of a larger query, the name is seen by the larger query as the column name of the virtual table produced by the sub-query. To specify the name to use for an output column, write \u003ccode class=\"literal\"\u003eAS\u003c/code\u003e \u003cem class=\"replaceable\"\u003e\u003ccode\u003eoutput_name\u003c/code\u003e\u003c/em\u003e after the column's expression. (You can omit \u003ccode class=\"literal\"\u003eAS\u003c/code\u003e, but only if the desired output name does not match any \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e keyword (see \u003ca href=\"/docs/18/sql-keywords-appendix.html\" title=\"Appendix C. SQL Key Words\"\u003eAppendix C\u003c/a\u003e). For protection against possible future keyword additions, it is recommended that you always either write \u003ccode class=\"literal\"\u003eAS\u003c/code\u003e or double-quote the output name.) If you do not specify a column name, a name is chosen automatically by \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e. If the column's expression is a simple column reference then the chosen name is the same as that column's name. In more complex cases a function or type name may be used, or the system may fall back on a generated name such as \u003ccode class=\"literal\"\u003e?column?\u003c/code\u003e.\u003c/p\u003e\u003cp\u003eAn output column's name can be used to refer to the column's value in \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e and \u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e clauses, but not in the \u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e or \u003ccode class=\"literal\"\u003eHAVING\u003c/code\u003e clauses; there you must write out the expression instead.\u003c/p\u003e\u003cp\u003eInstead of an expression, \u003ccode class=\"literal\"\u003e*\u003c/code\u003e can be written in the output list as a shorthand for all the columns of the selected rows. Also, you can write \u003ccode class=\"literal\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e.*\u003c/code\u003e as a shorthand for the columns coming from just that table. In these cases it is not possible to specify new names with \u003ccode class=\"literal\"\u003eAS\u003c/code\u003e; the output column names will be the same as the table columns' names.\u003c/p\u003e\u003cp\u003eAccording to the SQL standard, the expressions in the output list should be computed before applying \u003ccode class=\"literal\"\u003eDISTINCT\u003c/code\u003e, \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e, or \u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e. This is obviously necessary when using \u003ccode class=\"literal\"\u003eDISTINCT\u003c/code\u003e, since otherwise it's not clear what values are being made distinct. However, in many cases it is convenient if output expressions are computed after \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e and \u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e; particularly if the output list contains any volatile or expensive functions. With that behavior, the order of function evaluations is more intuitive and there will not be evaluations corresponding to rows that never appear in the output. \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e will effectively evaluate output expressions after sorting and limiting, so long as those expressions are not referenced in \u003ccode class=\"literal\"\u003eDISTINCT\u003c/code\u003e, \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e or \u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e. (As a counterexample, \u003ccode class=\"literal\"\u003eSELECT f(x) FROM tab ORDER BY 1\u003c/code\u003e clearly must evaluate \u003ccode class=\"function\"\u003ef(x)\u003c/code\u003e before sorting.) Output expressions that contain set-returning functions are effectively evaluated after sorting and before limiting, so that \u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e will act to cut off the output from a set-returning function.\u003c/p\u003e\u003cdiv class=\"note\"\u003e\u003ch3\u003eNote\u003c/h3\u003e\u003cp\u003e\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e versions before 9.6 did not provide any guarantees about the timing of evaluation of output expressions versus sorting and limiting; it depended on the form of the chosen query plan.\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eDISTINCT\u003c/code\u003e Clause\u003c/h3\u003e\u003cp\u003eIf \u003ccode class=\"literal\"\u003eSELECT DISTINCT\u003c/code\u003e is specified, all duplicate rows are removed from the result set (one row is kept from each group of duplicates). \u003ccode class=\"literal\"\u003eSELECT ALL\u003c/code\u003e specifies the opposite: all rows are kept; that is the default.\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eSELECT DISTINCT ON ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e [, ...] )\u003c/code\u003e keeps only the first row of each set of rows where the given expressions evaluate to equal. The \u003ccode class=\"literal\"\u003eDISTINCT ON\u003c/code\u003e expressions are interpreted using the same rules as for \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e (see above). Note that the \u003cspan class=\"quote\"\u003e“\u003cspan class=\"quote\"\u003efirst row\u003c/span\u003e”\u003c/span\u003e of each set is unpredictable unless \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e is used to ensure that the desired row appears first. For example:\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eSELECT DISTINCT ON (location) location, time, report\n    FROM weather_reports\n    ORDER BY location, time DESC;\n\u003c/pre\u003e\u003cp\u003eretrieves the most recent weather report for each location. But if we had not used \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e to force descending order of time values for each location, we'd have gotten a report from an unpredictable time for each location.\u003c/p\u003e\u003cp\u003eThe \u003ccode class=\"literal\"\u003eDISTINCT ON\u003c/code\u003e expression(s) must match the leftmost \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e expression(s). The \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e clause will normally contain additional expression(s) that determine the desired precedence of rows within each \u003ccode class=\"literal\"\u003eDISTINCT ON\u003c/code\u003e group.\u003c/p\u003e\u003cp\u003eCurrently, \u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e and \u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e cannot be specified with \u003ccode class=\"literal\"\u003eDISTINCT\u003c/code\u003e.\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e Clause\u003c/h3\u003e\u003cp\u003eThe \u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e clause has this general form:\u003c/p\u003e\u003cpre class=\"synopsis\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eselect_statement\u003c/code\u003e\u003c/em\u003e UNION [ ALL | DISTINCT ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003eselect_statement\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eselect_statement\u003c/code\u003e\u003c/em\u003e is any \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e statement without an \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e, \u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e, or \u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e clause. (\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e and \u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e can be attached to a subexpression if it is enclosed in parentheses. Without parentheses, these clauses will be taken to apply to the result of the \u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e, not to its right-hand input expression.)\u003c/p\u003e\u003cp\u003eThe \u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e operator computes the set union of the rows returned by the involved \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e statements. A row is in the set union of two result sets if it appears in at least one of the result sets. The two \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e statements that represent the direct operands of the \u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e must produce the same number of columns, and corresponding columns must be of compatible data types.\u003c/p\u003e\u003cp\u003eThe result of \u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e does not contain any duplicate rows unless the \u003ccode class=\"literal\"\u003eALL\u003c/code\u003e option is specified. \u003ccode class=\"literal\"\u003eALL\u003c/code\u003e prevents elimination of duplicates. (Therefore, \u003ccode class=\"literal\"\u003eUNION ALL\u003c/code\u003e is usually significantly quicker than \u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e; use \u003ccode class=\"literal\"\u003eALL\u003c/code\u003e when you can.) \u003ccode class=\"literal\"\u003eDISTINCT\u003c/code\u003e can be written to explicitly specify the default behavior of eliminating duplicate rows.\u003c/p\u003e\u003cp\u003eMultiple \u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e operators in the same \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e statement are evaluated left to right, unless otherwise indicated by parentheses.\u003c/p\u003e\u003cp\u003eCurrently, \u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e and \u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e cannot be specified either for a \u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e result or for any input of a \u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e.\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eINTERSECT\u003c/code\u003e Clause\u003c/h3\u003e\u003cp\u003eThe \u003ccode class=\"literal\"\u003eINTERSECT\u003c/code\u003e clause has this general form:\u003c/p\u003e\u003cpre class=\"synopsis\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eselect_statement\u003c/code\u003e\u003c/em\u003e INTERSECT [ ALL | DISTINCT ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003eselect_statement\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eselect_statement\u003c/code\u003e\u003c/em\u003e is any \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e statement without an \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e, \u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e, or \u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e clause.\u003c/p\u003e\u003cp\u003eThe \u003ccode class=\"literal\"\u003eINTERSECT\u003c/code\u003e operator computes the set intersection of the rows returned by the involved \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e statements. A row is in the intersection of two result sets if it appears in both result sets.\u003c/p\u003e\u003cp\u003eThe result of \u003ccode class=\"literal\"\u003eINTERSECT\u003c/code\u003e does not contain any duplicate rows unless the \u003ccode class=\"literal\"\u003eALL\u003c/code\u003e option is specified. With \u003ccode class=\"literal\"\u003eALL\u003c/code\u003e, a row that has \u003cem class=\"replaceable\"\u003e\u003ccode\u003em\u003c/code\u003e\u003c/em\u003e duplicates in the left table and \u003cem class=\"replaceable\"\u003e\u003ccode\u003en\u003c/code\u003e\u003c/em\u003e duplicates in the right table will appear min(\u003cem class=\"replaceable\"\u003e\u003ccode\u003em\u003c/code\u003e\u003c/em\u003e,\u003cem class=\"replaceable\"\u003e\u003ccode\u003en\u003c/code\u003e\u003c/em\u003e) times in the result set. \u003ccode class=\"literal\"\u003eDISTINCT\u003c/code\u003e can be written to explicitly specify the default behavior of eliminating duplicate rows.\u003c/p\u003e\u003cp\u003eMultiple \u003ccode class=\"literal\"\u003eINTERSECT\u003c/code\u003e operators in the same \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e statement are evaluated left to right, unless parentheses dictate otherwise. \u003ccode class=\"literal\"\u003eINTERSECT\u003c/code\u003e binds more tightly than \u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e. That is, \u003ccode class=\"literal\"\u003eA UNION B INTERSECT C\u003c/code\u003e will be read as \u003ccode class=\"literal\"\u003eA UNION (B INTERSECT C)\u003c/code\u003e.\u003c/p\u003e\u003cp\u003eCurrently, \u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e and \u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e cannot be specified either for an \u003ccode class=\"literal\"\u003eINTERSECT\u003c/code\u003e result or for any input of an \u003ccode class=\"literal\"\u003eINTERSECT\u003c/code\u003e.\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eEXCEPT\u003c/code\u003e Clause\u003c/h3\u003e\u003cp\u003eThe \u003ccode class=\"literal\"\u003eEXCEPT\u003c/code\u003e clause has this general form:\u003c/p\u003e\u003cpre class=\"synopsis\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eselect_statement\u003c/code\u003e\u003c/em\u003e EXCEPT [ ALL | DISTINCT ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003eselect_statement\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eselect_statement\u003c/code\u003e\u003c/em\u003e is any \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e statement without an \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e, \u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e, or \u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e clause.\u003c/p\u003e\u003cp\u003eThe \u003ccode class=\"literal\"\u003eEXCEPT\u003c/code\u003e operator computes the set of rows that are in the result of the left \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e statement but not in the result of the right one.\u003c/p\u003e\u003cp\u003eThe result of \u003ccode class=\"literal\"\u003eEXCEPT\u003c/code\u003e does not contain any duplicate rows unless the \u003ccode class=\"literal\"\u003eALL\u003c/code\u003e option is specified. With \u003ccode class=\"literal\"\u003eALL\u003c/code\u003e, a row that has \u003cem class=\"replaceable\"\u003e\u003ccode\u003em\u003c/code\u003e\u003c/em\u003e duplicates in the left table and \u003cem class=\"replaceable\"\u003e\u003ccode\u003en\u003c/code\u003e\u003c/em\u003e duplicates in the right table will appear max(\u003cem class=\"replaceable\"\u003e\u003ccode\u003em\u003c/code\u003e\u003c/em\u003e-\u003cem class=\"replaceable\"\u003e\u003ccode\u003en\u003c/code\u003e\u003c/em\u003e,0) times in the result set. \u003ccode class=\"literal\"\u003eDISTINCT\u003c/code\u003e can be written to explicitly specify the default behavior of eliminating duplicate rows.\u003c/p\u003e\u003cp\u003eMultiple \u003ccode class=\"literal\"\u003eEXCEPT\u003c/code\u003e operators in the same \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e statement are evaluated left to right, unless parentheses dictate otherwise. \u003ccode class=\"literal\"\u003eEXCEPT\u003c/code\u003e binds at the same level as \u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e.\u003c/p\u003e\u003cp\u003eCurrently, \u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e and \u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e cannot be specified either for an \u003ccode class=\"literal\"\u003eEXCEPT\u003c/code\u003e result or for any input of an \u003ccode class=\"literal\"\u003eEXCEPT\u003c/code\u003e.\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e Clause\u003c/h3\u003e\u003cp\u003eThe optional \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e clause has this general form:\u003c/p\u003e\u003cpre class=\"synopsis\"\u003eORDER BY \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e [ ASC | DESC | USING \u003cem class=\"replaceable\"\u003e\u003ccode\u003eoperator\u003c/code\u003e\u003c/em\u003e ] [ NULLS { FIRST | LAST } ] [, ...]\n\u003c/pre\u003e\u003cp\u003eThe \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e clause causes the result rows to be sorted according to the specified expression(s). If two rows are equal according to the leftmost expression, they are compared according to the next expression and so on. If they are equal according to all specified expressions, they are returned in an implementation-dependent order.\u003c/p\u003e\u003cp\u003eEach \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e can be the name or ordinal number of an output column (\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e list item), or it can be an arbitrary expression formed from input-column values.\u003c/p\u003e\u003cp\u003eThe ordinal number refers to the ordinal (left-to-right) position of the output column. This feature makes it possible to define an ordering on the basis of a column that does not have a unique name. This is never absolutely necessary because it is always possible to assign a name to an output column using the \u003ccode class=\"literal\"\u003eAS\u003c/code\u003e clause.\u003c/p\u003e\u003cp\u003eIt is also possible to use arbitrary expressions in the \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e clause, including columns that do not appear in the \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e output list. Thus the following statement is valid:\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eSELECT name FROM distributors ORDER BY code;\n\u003c/pre\u003e\u003cp\u003eA limitation of this feature is that an \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e clause applying to the result of a \u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e, \u003ccode class=\"literal\"\u003eINTERSECT\u003c/code\u003e, or \u003ccode class=\"literal\"\u003eEXCEPT\u003c/code\u003e clause can only specify an output column name or number, not an expression.\u003c/p\u003e\u003cp\u003eIf an \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e expression is a simple name that matches both an output column name and an input column name, \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e will interpret it as the output column name. This is the opposite of the choice that \u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e will make in the same situation. This inconsistency is made to be compatible with the SQL standard.\u003c/p\u003e\u003cp\u003eOptionally one can add the key word \u003ccode class=\"literal\"\u003eASC\u003c/code\u003e (ascending) or \u003ccode class=\"literal\"\u003eDESC\u003c/code\u003e (descending) after any expression in the \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e clause. If not specified, \u003ccode class=\"literal\"\u003eASC\u003c/code\u003e is assumed by default. Alternatively, a specific ordering operator name can be specified in the \u003ccode class=\"literal\"\u003eUSING\u003c/code\u003e clause. An ordering operator must be a less-than or greater-than member of some B-tree operator family. \u003ccode class=\"literal\"\u003eASC\u003c/code\u003e is usually equivalent to \u003ccode class=\"literal\"\u003eUSING \u0026lt;\u003c/code\u003e and \u003ccode class=\"literal\"\u003eDESC\u003c/code\u003e is usually equivalent to \u003ccode class=\"literal\"\u003eUSING \u0026gt;\u003c/code\u003e. (But the creator of a user-defined data type can define exactly what the default sort ordering is, and it might correspond to operators with other names.)\u003c/p\u003e\u003cp\u003eIf \u003ccode class=\"literal\"\u003eNULLS LAST\u003c/code\u003e is specified, null values sort after all non-null values; if \u003ccode class=\"literal\"\u003eNULLS FIRST\u003c/code\u003e is specified, null values sort before all non-null values. If neither is specified, the default behavior is \u003ccode class=\"literal\"\u003eNULLS LAST\u003c/code\u003e when \u003ccode class=\"literal\"\u003eASC\u003c/code\u003e is specified or implied, and \u003ccode class=\"literal\"\u003eNULLS FIRST\u003c/code\u003e when \u003ccode class=\"literal\"\u003eDESC\u003c/code\u003e is specified (thus, the default is to act as though nulls are larger than non-nulls). When \u003ccode class=\"literal\"\u003eUSING\u003c/code\u003e is specified, the default nulls ordering depends on whether the operator is a less-than or greater-than operator.\u003c/p\u003e\u003cp\u003eNote that ordering options apply only to the expression they follow; for example \u003ccode class=\"literal\"\u003eORDER BY x, y DESC\u003c/code\u003e does not mean the same thing as \u003ccode class=\"literal\"\u003eORDER BY x DESC, y DESC\u003c/code\u003e.\u003c/p\u003e\u003cp\u003eCharacter-string data is sorted according to the collation that applies to the column being sorted. That can be overridden at need by including a \u003ccode class=\"literal\"\u003eCOLLATE\u003c/code\u003e clause in the \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e, for example \u003ccode class=\"literal\"\u003eORDER BY mycolumn COLLATE \"en_US\"\u003c/code\u003e. For more information see \u003ca href=\"/docs/18/sql-expressions.html#SQL-SYNTAX-COLLATE-EXPRS\" title=\"4.2.10. Collation Expressions\"\u003eSection 4.2.10\u003c/a\u003e and \u003ca href=\"/docs/18/collation.html\" title=\"23.2. Collation Support\"\u003eSection 23.2\u003c/a\u003e.\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e Clause\u003c/h3\u003e\u003cp\u003eThe \u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e clause consists of two independent sub-clauses:\u003c/p\u003e\u003cpre class=\"synopsis\"\u003eLIMIT { \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e | ALL }\nOFFSET \u003cem class=\"replaceable\"\u003e\u003ccode\u003estart\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003eThe parameter \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e specifies the maximum number of rows to return, while \u003cem class=\"replaceable\"\u003e\u003ccode\u003estart\u003c/code\u003e\u003c/em\u003e specifies the number of rows to skip before starting to return rows. When both are specified, \u003cem class=\"replaceable\"\u003e\u003ccode\u003estart\u003c/code\u003e\u003c/em\u003e rows are skipped before starting to count the \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e rows to be returned.\u003c/p\u003e\u003cp\u003eIf the \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e expression evaluates to NULL, it is treated as \u003ccode class=\"literal\"\u003eLIMIT ALL\u003c/code\u003e, i.e., no limit. If \u003cem class=\"replaceable\"\u003e\u003ccode\u003estart\u003c/code\u003e\u003c/em\u003e evaluates to NULL, it is treated the same as \u003ccode class=\"literal\"\u003eOFFSET 0\u003c/code\u003e.\u003c/p\u003e\u003cp\u003eSQL:2008 introduced a different syntax to achieve the same result, which \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e also supports. It is:\u003c/p\u003e\u003cpre class=\"synopsis\"\u003eOFFSET \u003cem class=\"replaceable\"\u003e\u003ccode\u003estart\u003c/code\u003e\u003c/em\u003e { ROW | ROWS }\nFETCH { FIRST | NEXT } [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e ] { ROW | ROWS } { ONLY | WITH TIES }\n\u003c/pre\u003e\u003cp\u003eIn this syntax, the \u003cem class=\"replaceable\"\u003e\u003ccode\u003estart\u003c/code\u003e\u003c/em\u003e or \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e value is required by the standard to be a literal constant, a parameter, or a variable name; as a \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e extension, other expressions are allowed, but will generally need to be enclosed in parentheses to avoid ambiguity. If \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e is omitted in a \u003ccode class=\"literal\"\u003eFETCH\u003c/code\u003e clause, it defaults to 1. The \u003ccode class=\"literal\"\u003eWITH TIES\u003c/code\u003e option is used to return any additional rows that tie for the last place in the result set according to the \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e clause; \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e is mandatory in this case, and \u003ccode class=\"literal\"\u003eSKIP LOCKED\u003c/code\u003e is not allowed. \u003ccode class=\"literal\"\u003eROW\u003c/code\u003e and \u003ccode class=\"literal\"\u003eROWS\u003c/code\u003e as well as \u003ccode class=\"literal\"\u003eFIRST\u003c/code\u003e and \u003ccode class=\"literal\"\u003eNEXT\u003c/code\u003e are noise words that don't influence the effects of these clauses. According to the standard, the \u003ccode class=\"literal\"\u003eOFFSET\u003c/code\u003e clause must come before the \u003ccode class=\"literal\"\u003eFETCH\u003c/code\u003e clause if both are present; but \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e is laxer and allows either order.\u003c/p\u003e\u003cp\u003eWhen using \u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e, it is a good idea to use an \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e clause that constrains the result rows into a unique order. Otherwise you will get an unpredictable subset of the query's rows — you might be asking for the tenth through twentieth rows, but tenth through twentieth in what ordering? You don't know what ordering unless you specify \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e.\u003c/p\u003e\u003cp\u003eThe query planner takes \u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e into account when generating a query plan, so you are very likely to get different plans (yielding different row orders) depending on what you use for \u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e and \u003ccode class=\"literal\"\u003eOFFSET\u003c/code\u003e. Thus, using different \u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e/\u003ccode class=\"literal\"\u003eOFFSET\u003c/code\u003e values to select different subsets of a query result \u003cspan class=\"emphasis\"\u003e\u003cem\u003ewill give inconsistent results\u003c/em\u003e\u003c/span\u003e unless you enforce a predictable result ordering with \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e. This is not a bug; it is an inherent consequence of the fact that SQL does not promise to deliver the results of a query in any particular order unless \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e is used to constrain the order.\u003c/p\u003e\u003cp\u003eIt is even possible for repeated executions of the same \u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e query to return different subsets of the rows of a table, if there is not an \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e to enforce selection of a deterministic subset. Again, this is not a bug; determinism of the results is simply not guaranteed in such a case.\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003eThe Locking Clause\u003c/h3\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e and \u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e are \u003cem class=\"firstterm\"\u003elocking clauses\u003c/em\u003e; they affect how \u003ccode class=\"literal\"\u003eSELECT\u003c/code\u003e locks rows as they are obtained from the table.\u003c/p\u003e\u003cp\u003eThe locking clause has the general form\u003c/p\u003e\u003cpre class=\"synopsis\"\u003eFOR \u003cem class=\"replaceable\"\u003e\u003ccode\u003elock_strength\u003c/code\u003e\u003c/em\u003e [ OF \u003cem class=\"replaceable\"\u003e\u003ccode\u003efrom_reference\u003c/code\u003e\u003c/em\u003e [, ...] ] [ NOWAIT | SKIP LOCKED ]\n\u003c/pre\u003e\u003cp\u003ewhere \u003cem class=\"replaceable\"\u003e\u003ccode\u003elock_strength\u003c/code\u003e\u003c/em\u003e can be one of\u003c/p\u003e\u003cpre class=\"synopsis\"\u003eUPDATE\nNO KEY UPDATE\nSHARE\nKEY SHARE\n\u003c/pre\u003e\u003cp\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003efrom_reference\u003c/code\u003e\u003c/em\u003e must be a table \u003cem class=\"replaceable\"\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e or non-hidden \u003cem class=\"replaceable\"\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e referenced in the \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e clause. For more information on each row-level lock mode, refer to \u003ca href=\"/docs/18/explicit-locking.html#LOCKING-ROWS\" title=\"13.3.2. Row-Level Locks\"\u003eSection 13.3.2\u003c/a\u003e.\u003c/p\u003e\u003cp\u003eTo prevent the operation from waiting for other transactions to commit, use either the \u003ccode class=\"literal\"\u003eNOWAIT\u003c/code\u003e or \u003ccode class=\"literal\"\u003eSKIP LOCKED\u003c/code\u003e option. With \u003ccode class=\"literal\"\u003eNOWAIT\u003c/code\u003e, the statement reports an error, rather than waiting, if a selected row cannot be locked immediately. With \u003ccode class=\"literal\"\u003eSKIP LOCKED\u003c/code\u003e, any selected rows that cannot be immediately locked are skipped. Skipping locked rows provides an inconsistent view of the data, so this is not suitable for general purpose work, but can be used to avoid lock contention with multiple consumers accessing a queue-like table. Note that \u003ccode class=\"literal\"\u003eNOWAIT\u003c/code\u003e and \u003ccode class=\"literal\"\u003eSKIP LOCKED\u003c/code\u003e apply only to the row-level lock(s) — the required \u003ccode class=\"literal\"\u003eROW SHARE\u003c/code\u003e table-level lock is still taken in the ordinary way (see \u003ca href=\"/docs/18/mvcc.html\" title=\"Chapter 13. Concurrency Control\"\u003eChapter 13\u003c/a\u003e). You can use \u003ca href=\"/docs/18/sql-lock.html\" title=\"LOCK\"\u003e\u003ccode class=\"command\"\u003eLOCK\u003c/code\u003e\u003c/a\u003e with the \u003ccode class=\"literal\"\u003eNOWAIT\u003c/code\u003e option first, if you need to acquire the table-level lock without waiting.\u003c/p\u003e\u003cp\u003eIf specific tables are named in a locking clause, then only rows coming from those tables are locked; any other tables used in the \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e are simply read as usual. A locking clause without a table list affects all tables used in the statement. If a locking clause is applied to a view or sub-query, it affects all tables used in the view or sub-query. However, these clauses do not apply to \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e queries referenced by the primary query. If you want row locking to occur within a \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e query, specify a locking clause within the \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e query.\u003c/p\u003e\u003cp\u003eMultiple locking clauses can be written if it is necessary to specify different locking behavior for different tables. If the same table is mentioned (or implicitly affected) by more than one locking clause, then it is processed as if it was only specified by the strongest one. Similarly, a table is processed as \u003ccode class=\"literal\"\u003eNOWAIT\u003c/code\u003e if that is specified in any of the clauses affecting it. Otherwise, it is processed as \u003ccode class=\"literal\"\u003eSKIP LOCKED\u003c/code\u003e if that is specified in any of the clauses affecting it.\u003c/p\u003e\u003cp\u003eThe locking clauses cannot be used in contexts where returned rows cannot be clearly identified with individual table rows; for example they cannot be used with aggregation.\u003c/p\u003e\u003cp\u003eWhen a locking clause appears at the top level of a \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e query, the rows that are locked are exactly those that are returned by the query; in the case of a join query, the rows locked are those that contribute to returned join rows. In addition, rows that satisfied the query conditions as of the query snapshot will be locked, although they will not be returned if they were updated after the snapshot and no longer satisfy the query conditions. If a \u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e is used, locking stops once enough rows have been returned to satisfy the limit (but note that rows skipped over by \u003ccode class=\"literal\"\u003eOFFSET\u003c/code\u003e will get locked). Similarly, if a locking clause is used in a cursor's query, only rows actually fetched or stepped past by the cursor will be locked.\u003c/p\u003e\u003cp\u003eWhen a locking clause appears in a sub-\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e, the rows locked are those returned to the outer query by the sub-query. This might involve fewer rows than inspection of the sub-query alone would suggest, since conditions from the outer query might be used to optimize execution of the sub-query. For example,\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eSELECT * FROM (SELECT * FROM mytable FOR UPDATE) ss WHERE col1 = 5;\n\u003c/pre\u003e\u003cp\u003ewill lock only rows having \u003ccode class=\"literal\"\u003ecol1 = 5\u003c/code\u003e, even though that condition is not textually within the sub-query.\u003c/p\u003e\u003cp\u003ePrevious releases failed to preserve a lock which is upgraded by a later savepoint. For example, this code:\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eBEGIN;\nSELECT * FROM mytable WHERE key = 1 FOR UPDATE;\nSAVEPOINT s;\nUPDATE mytable SET ... WHERE key = 1;\nROLLBACK TO s;\n\u003c/pre\u003e\u003cp\u003ewould fail to preserve the \u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e lock after the \u003ccode class=\"command\"\u003eROLLBACK TO\u003c/code\u003e. This has been fixed in release 9.3.\u003c/p\u003e\u003cdiv class=\"caution\"\u003e\u003ch3\u003eCaution\u003c/h3\u003e\u003cp\u003eIt is possible for a \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e command running at the \u003ccode class=\"literal\"\u003eREAD COMMITTED\u003c/code\u003e transaction isolation level and using \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e and a locking clause to return rows out of order. This is because \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e is applied first. The command sorts the result, but might then block trying to obtain a lock on one or more of the rows. Once the \u003ccode class=\"literal\"\u003eSELECT\u003c/code\u003e unblocks, some of the ordering column values might have been modified, leading to those rows appearing to be out of order (though they are in order in terms of the original column values). This can be worked around at need by placing the \u003ccode class=\"literal\"\u003eFOR UPDATE/SHARE\u003c/code\u003e clause in a sub-query, for example\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eSELECT * FROM (SELECT * FROM mytable FOR UPDATE) ss ORDER BY column1;\n\u003c/pre\u003e\u003cp\u003eNote that this will result in locking all rows of \u003ccode class=\"structname\"\u003emytable\u003c/code\u003e, whereas \u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e at the top level would lock only the actually returned rows. This can make for a significant performance difference, particularly if the \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e is combined with \u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e or other restrictions. So this technique is recommended only if concurrent updates of the ordering columns are expected and a strictly sorted result is required.\u003c/p\u003e\u003cp\u003eAt the \u003ccode class=\"literal\"\u003eREPEATABLE READ\u003c/code\u003e or \u003ccode class=\"literal\"\u003eSERIALIZABLE\u003c/code\u003e transaction isolation level this would cause a serialization failure (with an \u003ccode class=\"literal\"\u003eSQLSTATE\u003c/code\u003e of \u003ccode class=\"literal\"\u003e'40001'\u003c/code\u003e), so there is no possibility of receiving rows out of order under these isolation levels.\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eTABLE\u003c/code\u003e Command\u003c/h3\u003e\u003cp\u003eThe command\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eTABLE \u003cem class=\"replaceable\"\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003eis equivalent to\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eSELECT * FROM \u003cem class=\"replaceable\"\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003eIt can be used as a top-level command or as a space-saving syntax variant in parts of complex queries. Only the \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e, \u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e, \u003ccode class=\"literal\"\u003eINTERSECT\u003c/code\u003e, \u003ccode class=\"literal\"\u003eEXCEPT\u003c/code\u003e, \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e, \u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e, \u003ccode class=\"literal\"\u003eOFFSET\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFETCH\u003c/code\u003e and \u003ccode class=\"literal\"\u003eFOR\u003c/code\u003e locking clauses can be used with \u003ccode class=\"command\"\u003eTABLE\u003c/code\u003e; the \u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e clause and any form of aggregation cannot be used.\u003c/p\u003e\u003c/div\u003e","key":"parameters","title":"Parameters"},{"html":"\u003cp\u003eTo join the table \u003ccode class=\"literal\"\u003efilms\u003c/code\u003e with the table \u003ccode class=\"literal\"\u003edistributors\u003c/code\u003e:\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eSELECT f.title, f.did, d.name, f.date_prod, f.kind\n    FROM distributors d JOIN films f USING (did);\n\n       title       | did |     name     | date_prod  |   kind\n-------------------+-----+--------------+------------+----------\n The Third Man     | 101 | British Lion | 1949-12-23 | Drama\n The African Queen | 101 | British Lion | 1951-08-11 | Romantic\n ...\n\u003c/pre\u003e\u003cp\u003eTo sum the column \u003ccode class=\"literal\"\u003elen\u003c/code\u003e of all films and group the results by \u003ccode class=\"literal\"\u003ekind\u003c/code\u003e:\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eSELECT kind, sum(len) AS total FROM films GROUP BY kind;\n\n   kind   | total\n----------+-------\n Action   | 07:34\n Comedy   | 02:58\n Drama    | 14:28\n Musical  | 06:42\n Romantic | 04:38\n\u003c/pre\u003e\u003cp\u003eTo sum the column \u003ccode class=\"literal\"\u003elen\u003c/code\u003e of all films, group the results by \u003ccode class=\"literal\"\u003ekind\u003c/code\u003e and show those group totals that are less than 5 hours:\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eSELECT kind, sum(len) AS total\n    FROM films\n    GROUP BY kind\n    HAVING sum(len) \u0026lt; interval '5 hours';\n\n   kind   | total\n----------+-------\n Comedy   | 02:58\n Romantic | 04:38\n\u003c/pre\u003e\u003cp\u003eThe following two examples are identical ways of sorting the individual results according to the contents of the second column (\u003ccode class=\"literal\"\u003ename\u003c/code\u003e):\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eSELECT * FROM distributors ORDER BY name;\nSELECT * FROM distributors ORDER BY 2;\n\n did |       name\n-----+------------------\n 109 | 20th Century Fox\n 110 | Bavaria Atelier\n 101 | British Lion\n 107 | Columbia\n 102 | Jean Luc Godard\n 113 | Luso films\n 104 | Mosfilm\n 103 | Paramount\n 106 | Toho\n 105 | United Artists\n 111 | Walt Disney\n 112 | Warner Bros.\n 108 | Westward\n\u003c/pre\u003e\u003cp\u003eThe next example shows how to obtain the union of the tables \u003ccode class=\"literal\"\u003edistributors\u003c/code\u003e and \u003ccode class=\"literal\"\u003eactors\u003c/code\u003e, restricting the results to those that begin with the letter W in each table. Only distinct rows are wanted, so the key word \u003ccode class=\"literal\"\u003eALL\u003c/code\u003e is omitted.\u003c/p\u003e\u003cpre class=\"programlisting\"\u003edistributors:               actors:\n did |     name              id |     name\n-----+--------------        ----+----------------\n 108 | Westward               1 | Woody Allen\n 111 | Walt Disney            2 | Warren Beatty\n 112 | Warner Bros.           3 | Walter Matthau\n ...                         ...\n\nSELECT distributors.name\n    FROM distributors\n    WHERE distributors.name LIKE 'W%'\nUNION\nSELECT actors.name\n    FROM actors\n    WHERE actors.name LIKE 'W%';\n\n      name\n----------------\n Walt Disney\n Walter Matthau\n Warner Bros.\n Warren Beatty\n Westward\n Woody Allen\n\u003c/pre\u003e\u003cp\u003eThis example shows how to use a function in the \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e clause, both with and without a column definition list:\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eCREATE FUNCTION distributors(int) RETURNS SETOF distributors AS $$\n    SELECT * FROM distributors WHERE did = $1;\n$$ LANGUAGE SQL;\n\nSELECT * FROM distributors(111);\n did |    name\n-----+-------------\n 111 | Walt Disney\n\nCREATE FUNCTION distributors_2(int) RETURNS SETOF record AS $$\n    SELECT * FROM distributors WHERE did = $1;\n$$ LANGUAGE SQL;\n\nSELECT * FROM distributors_2(111) AS (f1 int, f2 text);\n f1  |     f2\n-----+-------------\n 111 | Walt Disney\n\u003c/pre\u003e\u003cp\u003eHere is an example of a function with an ordinality column added:\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eSELECT * FROM unnest(ARRAY['a','b','c','d','e','f']) WITH ORDINALITY;\n unnest | ordinality\n--------+----------\n a      |        1\n b      |        2\n c      |        3\n d      |        4\n e      |        5\n f      |        6\n(6 rows)\n\u003c/pre\u003e\u003cp\u003eThis example shows how to use a simple \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e clause:\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eWITH t AS (\n    SELECT random() as x FROM generate_series(1, 3)\n  )\nSELECT * FROM t\nUNION ALL\nSELECT * FROM t;\n         x\n--------------------\n  0.534150459803641\n  0.520092216785997\n 0.0735620250925422\n  0.534150459803641\n  0.520092216785997\n 0.0735620250925422\n\u003c/pre\u003e\u003cp\u003eNotice that the \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e query was evaluated only once, so that we got two sets of the same three random values.\u003c/p\u003e\u003cp\u003eThis example uses \u003ccode class=\"literal\"\u003eWITH RECURSIVE\u003c/code\u003e to find all subordinates (direct or indirect) of the employee Mary, and their level of indirectness, from a table that shows only direct subordinates:\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eWITH RECURSIVE employee_recursive(distance, employee_name, manager_name) AS (\n    SELECT 1, employee_name, manager_name\n    FROM employee\n    WHERE manager_name = 'Mary'\n  UNION ALL\n    SELECT er.distance + 1, e.employee_name, e.manager_name\n    FROM employee_recursive er, employee e\n    WHERE er.employee_name = e.manager_name\n  )\nSELECT distance, employee_name FROM employee_recursive;\n\u003c/pre\u003e\u003cp\u003eNotice the typical form of recursive queries: an initial condition, followed by \u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e, followed by the recursive part of the query. Be sure that the recursive part of the query will eventually return no tuples, or else the query will loop indefinitely. (See \u003ca href=\"/docs/18/queries-with.html\" title=\"7.8. WITH Queries (Common Table Expressions)\"\u003eSection 7.8\u003c/a\u003e for more examples.)\u003c/p\u003e\u003cp\u003eThis example uses \u003ccode class=\"literal\"\u003eLATERAL\u003c/code\u003e to apply a set-returning function \u003ccode class=\"function\"\u003eget_product_names()\u003c/code\u003e for each row of the \u003ccode class=\"structname\"\u003emanufacturers\u003c/code\u003e table:\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eSELECT m.name AS mname, pname\nFROM manufacturers m, LATERAL get_product_names(m.id) pname;\n\u003c/pre\u003e\u003cp\u003eManufacturers not currently having any products would not appear in the result, since it is an inner join. If we wished to include the names of such manufacturers in the result, we could do:\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eSELECT m.name AS mname, pname\nFROM manufacturers m LEFT JOIN LATERAL get_product_names(m.id) pname ON true;\n\u003c/pre\u003e","key":"examples","title":"Examples"},{"html":"\u003cp\u003eOf course, the \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e statement is compatible with the SQL standard. But there are some extensions and some missing features.\u003c/p\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003eOmitted \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e Clauses\u003c/h3\u003e\u003cp\u003e\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e allows one to omit the \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e clause. It has a straightforward use to compute the results of simple expressions:\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eSELECT 2+2;\n\n ?column?\n----------\n        4\n\u003c/pre\u003e\u003cp\u003eSome other \u003cacronym\u003eSQL\u003c/acronym\u003e databases cannot do this except by introducing a dummy one-row table from which to do the \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e.\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003eEmpty \u003ccode class=\"literal\"\u003eSELECT\u003c/code\u003e Lists\u003c/h3\u003e\u003cp\u003eThe list of output expressions after \u003ccode class=\"literal\"\u003eSELECT\u003c/code\u003e can be empty, producing a zero-column result table. This is not valid syntax according to the SQL standard. \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e allows it to be consistent with allowing zero-column tables. However, an empty list is not allowed when \u003ccode class=\"literal\"\u003eDISTINCT\u003c/code\u003e is used.\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003eOmitting the \u003ccode class=\"literal\"\u003eAS\u003c/code\u003e Key Word\u003c/h3\u003e\u003cp\u003eIn the SQL standard, the optional key word \u003ccode class=\"literal\"\u003eAS\u003c/code\u003e can be omitted before an output column name whenever the new column name is a valid column name (that is, not the same as any reserved keyword). \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e is slightly more restrictive: \u003ccode class=\"literal\"\u003eAS\u003c/code\u003e is required if the new column name matches any keyword at all, reserved or not. Recommended practice is to use \u003ccode class=\"literal\"\u003eAS\u003c/code\u003e or double-quote output column names, to prevent any possible conflict against future keyword additions.\u003c/p\u003e\u003cp\u003eIn \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e items, both the standard and \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e allow \u003ccode class=\"literal\"\u003eAS\u003c/code\u003e to be omitted before an alias that is an unreserved keyword. But this is impractical for output column names, because of syntactic ambiguities.\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003eOmitting Sub-\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e Aliases in \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e\u003c/h3\u003e\u003cp\u003eAccording to the SQL standard, a sub-\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e in the \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e list must have an alias. In \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e, this alias may be omitted.\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eONLY\u003c/code\u003e and Inheritance\u003c/h3\u003e\u003cp\u003eThe SQL standard requires parentheses around the table name when writing \u003ccode class=\"literal\"\u003eONLY\u003c/code\u003e, for example \u003ccode class=\"literal\"\u003eSELECT * FROM ONLY (tab1), ONLY (tab2) WHERE ...\u003c/code\u003e. \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e considers these parentheses to be optional.\u003c/p\u003e\u003cp\u003e\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e allows a trailing \u003ccode class=\"literal\"\u003e*\u003c/code\u003e to be written to explicitly specify the non-\u003ccode class=\"literal\"\u003eONLY\u003c/code\u003e behavior of including child tables. The standard does not allow this.\u003c/p\u003e\u003cp\u003e(These points apply equally to all SQL commands supporting the \u003ccode class=\"literal\"\u003eONLY\u003c/code\u003e option.)\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eTABLESAMPLE\u003c/code\u003e Clause Restrictions\u003c/h3\u003e\u003cp\u003eThe \u003ccode class=\"literal\"\u003eTABLESAMPLE\u003c/code\u003e clause is currently accepted only on regular tables and materialized views. According to the SQL standard it should be possible to apply it to any \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e item.\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003eFunction Calls in \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e\u003c/h3\u003e\u003cp\u003e\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e allows a function call to be written directly as a member of the \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e list. In the SQL standard it would be necessary to wrap such a function call in a sub-\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e; that is, the syntax \u003ccode class=\"literal\"\u003eFROM \u003cem class=\"replaceable\"\u003e\u003ccode\u003efunc\u003c/code\u003e\u003c/em\u003e(...) \u003cem class=\"replaceable\"\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e\u003c/code\u003e is approximately equivalent to \u003ccode class=\"literal\"\u003eFROM LATERAL (SELECT \u003cem class=\"replaceable\"\u003e\u003ccode\u003efunc\u003c/code\u003e\u003c/em\u003e(...)) \u003cem class=\"replaceable\"\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e\u003c/code\u003e. Note that \u003ccode class=\"literal\"\u003eLATERAL\u003c/code\u003e is considered to be implicit; this is because the standard requires \u003ccode class=\"literal\"\u003eLATERAL\u003c/code\u003e semantics for an \u003ccode class=\"literal\"\u003eUNNEST()\u003c/code\u003e item in \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e. \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e treats \u003ccode class=\"literal\"\u003eUNNEST()\u003c/code\u003e the same as other set-returning functions.\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003eNamespace Available to \u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e and \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e\u003c/h3\u003e\u003cp\u003eIn the SQL-92 standard, an \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e clause can only use output column names or numbers, while a \u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e clause can only use expressions based on input column names. \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e extends each of these clauses to allow the other choice as well (but it uses the standard's interpretation if there is ambiguity). \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e also allows both clauses to specify arbitrary expressions. Note that names appearing in an expression will always be taken as input-column names, not as output-column names.\u003c/p\u003e\u003cp\u003eSQL:1999 and later use a slightly different definition which is not entirely upward compatible with SQL-92. In most cases, however, \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e will interpret an \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e or \u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e expression the same way SQL:1999 does.\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003eFunctional Dependencies\u003c/h3\u003e\u003cp\u003e\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e recognizes functional dependency (allowing columns to be omitted from \u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e) only when a table's primary key is included in the \u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e list. The SQL standard specifies additional conditions that should be recognized.\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e and \u003ccode class=\"literal\"\u003eOFFSET\u003c/code\u003e\u003c/h3\u003e\u003cp\u003eThe clauses \u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e and \u003ccode class=\"literal\"\u003eOFFSET\u003c/code\u003e are \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e-specific syntax, also used by \u003cspan class=\"productname\"\u003eMySQL\u003c/span\u003e. The SQL:2008 standard has introduced the clauses \u003ccode class=\"literal\"\u003eOFFSET ... FETCH {FIRST|NEXT} ...\u003c/code\u003e for the same functionality, as shown above in \u003ca href=\"/docs/18/sql-select.html#SQL-LIMIT\" title=\"LIMIT Clause\"\u003eLIMIT Clause\u003c/a\u003e. This syntax is also used by \u003cspan class=\"productname\"\u003eIBM DB2\u003c/span\u003e. (Applications written for \u003cspan class=\"productname\"\u003eOracle\u003c/span\u003e frequently use a workaround involving the automatically generated \u003ccode class=\"literal\"\u003erownum\u003c/code\u003e column, which is not available in PostgreSQL, to implement the effects of these clauses.)\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e\u003c/h3\u003e\u003cp\u003eAlthough \u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e appears in the SQL standard, the standard allows it only as an option of \u003ccode class=\"command\"\u003eDECLARE CURSOR\u003c/code\u003e. \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e allows it in any \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e query as well as in sub-\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003es, but this is an extension. The \u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e, \u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e and \u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e variants, as well as the \u003ccode class=\"literal\"\u003eNOWAIT\u003c/code\u003e and \u003ccode class=\"literal\"\u003eSKIP LOCKED\u003c/code\u003e options, do not appear in the standard.\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003eData-Modifying Statements in \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e\u003c/h3\u003e\u003cp\u003e\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e allows \u003ccode class=\"command\"\u003eINSERT\u003c/code\u003e, \u003ccode class=\"command\"\u003eUPDATE\u003c/code\u003e, \u003ccode class=\"command\"\u003eDELETE\u003c/code\u003e, and \u003ccode class=\"command\"\u003eMERGE\u003c/code\u003e to be used as \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e queries. This is not found in the SQL standard.\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003eNonstandard Clauses\u003c/h3\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eDISTINCT ON ( ... )\u003c/code\u003e is an extension of the SQL standard.\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eROWS FROM( ... )\u003c/code\u003e is an extension of the SQL standard.\u003c/p\u003e\u003cp\u003eThe \u003ccode class=\"literal\"\u003eMATERIALIZED\u003c/code\u003e and \u003ccode class=\"literal\"\u003eNOT MATERIALIZED\u003c/code\u003e options of \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e are extensions of the SQL standard.\u003c/p\u003e\u003c/div\u003e","key":"compatibility","title":"Compatibility"}],"sections_same_as":"","slug":"18","synopsis_html":"[ WITH [ RECURSIVE ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003ewith_query\u003c/code\u003e\u003c/em\u003e [, ...] ]\nSELECT [ ALL | DISTINCT [ ON ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e [, ...] ) ] ]\n    [ { * | \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e [ [ AS ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003eoutput_name\u003c/code\u003e\u003c/em\u003e ] } [, ...] ]\n    [ FROM \u003cem class=\"replaceable\"\u003e\u003ccode\u003efrom_item\u003c/code\u003e\u003c/em\u003e [, ...] ]\n    [ WHERE \u003cem class=\"replaceable\"\u003e\u003ccode\u003econdition\u003c/code\u003e\u003c/em\u003e ]\n    [ GROUP BY [ ALL | DISTINCT ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003egrouping_element\u003c/code\u003e\u003c/em\u003e [, ...] ]\n    [ HAVING \u003cem class=\"replaceable\"\u003e\u003ccode\u003econdition\u003c/code\u003e\u003c/em\u003e ]\n    [ WINDOW \u003cem class=\"replaceable\"\u003e\u003ccode\u003ewindow_name\u003c/code\u003e\u003c/em\u003e AS ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ewindow_definition\u003c/code\u003e\u003c/em\u003e ) [, ...] ]\n    [ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003eselect\u003c/code\u003e\u003c/em\u003e ]\n    [ ORDER BY \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e [ ASC | DESC | USING \u003cem class=\"replaceable\"\u003e\u003ccode\u003eoperator\u003c/code\u003e\u003c/em\u003e ] [ NULLS { FIRST | LAST } ] [, ...] ]\n    [ LIMIT { \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e | ALL } ]\n    [ OFFSET \u003cem class=\"replaceable\"\u003e\u003ccode\u003estart\u003c/code\u003e\u003c/em\u003e [ ROW | ROWS ] ]\n    [ FETCH { FIRST | NEXT } [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e ] { ROW | ROWS } { ONLY | WITH TIES } ]\n    [ FOR { UPDATE | NO KEY UPDATE | SHARE | KEY SHARE } [ OF \u003cem class=\"replaceable\"\u003e\u003ccode\u003efrom_reference\u003c/code\u003e\u003c/em\u003e [, ...] ] [ NOWAIT | SKIP LOCKED ] [...] ]\n\n\u003cspan class=\"phrase\"\u003ewhere \u003cem class=\"replaceable\"\u003e\u003ccode\u003efrom_item\u003c/code\u003e\u003c/em\u003e can be one of:\u003c/span\u003e\n\n    [ ONLY ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e [ * ] [ [ AS ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e [ ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_alias\u003c/code\u003e\u003c/em\u003e [, ...] ) ] ]\n                [ TABLESAMPLE \u003cem class=\"replaceable\"\u003e\u003ccode\u003esampling_method\u003c/code\u003e\u003c/em\u003e ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargument\u003c/code\u003e\u003c/em\u003e [, ...] ) [ REPEATABLE ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003eseed\u003c/code\u003e\u003c/em\u003e ) ] ]\n    [ LATERAL ] ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003eselect\u003c/code\u003e\u003c/em\u003e ) [ [ AS ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e [ ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_alias\u003c/code\u003e\u003c/em\u003e [, ...] ) ] ]\n    \u003cem class=\"replaceable\"\u003e\u003ccode\u003ewith_query_name\u003c/code\u003e\u003c/em\u003e [ [ AS ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e [ ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_alias\u003c/code\u003e\u003c/em\u003e [, ...] ) ] ]\n    [ LATERAL ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003efunction_name\u003c/code\u003e\u003c/em\u003e ( [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargument\u003c/code\u003e\u003c/em\u003e [, ...] ] )\n                [ WITH ORDINALITY ] [ [ AS ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e [ ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_alias\u003c/code\u003e\u003c/em\u003e [, ...] ) ] ]\n    [ LATERAL ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003efunction_name\u003c/code\u003e\u003c/em\u003e ( [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargument\u003c/code\u003e\u003c/em\u003e [, ...] ] ) [ AS ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_definition\u003c/code\u003e\u003c/em\u003e [, ...] )\n    [ LATERAL ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003efunction_name\u003c/code\u003e\u003c/em\u003e ( [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargument\u003c/code\u003e\u003c/em\u003e [, ...] ] ) AS ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_definition\u003c/code\u003e\u003c/em\u003e [, ...] )\n    [ LATERAL ] ROWS FROM( \u003cem class=\"replaceable\"\u003e\u003ccode\u003efunction_name\u003c/code\u003e\u003c/em\u003e ( [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargument\u003c/code\u003e\u003c/em\u003e [, ...] ] ) [ AS ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_definition\u003c/code\u003e\u003c/em\u003e [, ...] ) ] [, ...] )\n                [ WITH ORDINALITY ] [ [ AS ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e [ ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_alias\u003c/code\u003e\u003c/em\u003e [, ...] ) ] ]\n    \u003cem class=\"replaceable\"\u003e\u003ccode\u003efrom_item\u003c/code\u003e\u003c/em\u003e \u003cem class=\"replaceable\"\u003e\u003ccode\u003ejoin_type\u003c/code\u003e\u003c/em\u003e \u003cem class=\"replaceable\"\u003e\u003ccode\u003efrom_item\u003c/code\u003e\u003c/em\u003e { ON \u003cem class=\"replaceable\"\u003e\u003ccode\u003ejoin_condition\u003c/code\u003e\u003c/em\u003e | USING ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ejoin_column\u003c/code\u003e\u003c/em\u003e [, ...] ) [ AS \u003cem class=\"replaceable\"\u003e\u003ccode\u003ejoin_using_alias\u003c/code\u003e\u003c/em\u003e ] }\n    \u003cem class=\"replaceable\"\u003e\u003ccode\u003efrom_item\u003c/code\u003e\u003c/em\u003e NATURAL \u003cem class=\"replaceable\"\u003e\u003ccode\u003ejoin_type\u003c/code\u003e\u003c/em\u003e \u003cem class=\"replaceable\"\u003e\u003ccode\u003efrom_item\u003c/code\u003e\u003c/em\u003e\n    \u003cem class=\"replaceable\"\u003e\u003ccode\u003efrom_item\u003c/code\u003e\u003c/em\u003e CROSS JOIN \u003cem class=\"replaceable\"\u003e\u003ccode\u003efrom_item\u003c/code\u003e\u003c/em\u003e\n\n\u003cspan class=\"phrase\"\u003eand \u003cem class=\"replaceable\"\u003e\u003ccode\u003egrouping_element\u003c/code\u003e\u003c/em\u003e can be one of:\u003c/span\u003e\n\n    ( )\n    \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e\n    ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e [, ...] )\n    ROLLUP ( { \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e | ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e [, ...] ) } [, ...] )\n    CUBE ( { \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e | ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e [, ...] ) } [, ...] )\n    GROUPING SETS ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003egrouping_element\u003c/code\u003e\u003c/em\u003e [, ...] )\n\n\u003cspan class=\"phrase\"\u003eand \u003cem class=\"replaceable\"\u003e\u003ccode\u003ewith_query\u003c/code\u003e\u003c/em\u003e is:\u003c/span\u003e\n\n    \u003cem class=\"replaceable\"\u003e\u003ccode\u003ewith_query_name\u003c/code\u003e\u003c/em\u003e [ ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e [, ...] ) ] AS [ [ NOT ] MATERIALIZED ] ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003eselect\u003c/code\u003e\u003c/em\u003e | \u003cem class=\"replaceable\"\u003e\u003ccode\u003evalues\u003c/code\u003e\u003c/em\u003e | \u003cem class=\"replaceable\"\u003e\u003ccode\u003einsert\u003c/code\u003e\u003c/em\u003e | \u003cem class=\"replaceable\"\u003e\u003ccode\u003eupdate\u003c/code\u003e\u003c/em\u003e | \u003cem class=\"replaceable\"\u003e\u003ccode\u003edelete\u003c/code\u003e\u003c/em\u003e | \u003cem class=\"replaceable\"\u003e\u003ccode\u003emerge\u003c/code\u003e\u003c/em\u003e )\n        [ SEARCH { BREADTH | DEPTH } FIRST BY \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e [, ...] SET \u003cem class=\"replaceable\"\u003e\u003ccode\u003esearch_seq_col_name\u003c/code\u003e\u003c/em\u003e ]\n        [ CYCLE \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e [, ...] SET \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecycle_mark_col_name\u003c/code\u003e\u003c/em\u003e [ TO \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecycle_mark_value\u003c/code\u003e\u003c/em\u003e DEFAULT \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecycle_mark_default\u003c/code\u003e\u003c/em\u003e ] USING \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecycle_path_col_name\u003c/code\u003e\u003c/em\u003e ]\n\nTABLE [ ONLY ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e [ * ]","synopsis_text":"[ WITH [ RECURSIVE ] with_query [, ...] ]\nSELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]\n[ { * | expression [ [ AS ] output_name ] } [, ...] ]\n[ FROM from_item [, ...] ]\n[ WHERE condition ]\n[ GROUP BY [ ALL | DISTINCT ] grouping_element [, ...] ]\n[ HAVING condition ]\n[ WINDOW window_name AS ( window_definition ) [, ...] ]\n[ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ]\n[ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]\n[ LIMIT { count | ALL } ]\n[ OFFSET start [ ROW | ROWS ] ]\n[ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } { ONLY | WITH TIES } ]\n[ FOR { UPDATE | NO KEY UPDATE | SHARE | KEY SHARE } [ OF from_reference [, ...] ] [ NOWAIT | SKIP LOCKED ] [...] ]\n\nwhere from_item can be one of:\n\n[ ONLY ] table_name [ * ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]\n[ TABLESAMPLE sampling_method ( argument [, ...] ) [ REPEATABLE ( seed ) ] ]\n[ LATERAL ] ( select ) [ [ AS ] alias [ ( column_alias [, ...] ) ] ]\nwith_query_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ]\n[ LATERAL ] function_name ( [ argument [, ...] ] )\n[ WITH ORDINALITY ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]\n[ LATERAL ] function_name ( [ argument [, ...] ] ) [ AS ] alias ( column_definition [, ...] )\n[ LATERAL ] function_name ( [ argument [, ...] ] ) AS ( column_definition [, ...] )\n[ LATERAL ] ROWS FROM( function_name ( [ argument [, ...] ] ) [ AS ( column_definition [, ...] ) ] [, ...] )\n[ WITH ORDINALITY ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]\nfrom_item join_type from_item { ON join_condition | USING ( join_column [, ...] ) [ AS join_using_alias ] }\nfrom_item NATURAL join_type from_item\nfrom_item CROSS JOIN from_item\nand grouping_element can be one of:\n\n( )\nexpression\n( expression [, ...] )\nROLLUP ( { expression | ( expression [, ...] ) } [, ...] )\nCUBE ( { expression | ( expression [, ...] ) } [, ...] )\nGROUPING SETS ( grouping_element [, ...] )\n\nand with_query is:\nwith_query_name [ ( column_name [, ...] ) ] AS [ [ NOT ] MATERIALIZED ] ( select | values | insert | update | delete | merge )\n[ SEARCH { BREADTH | DEPTH } FIRST BY column_name [, ...] SET search_seq_col_name ]\n[ CYCLE column_name [, ...] SET cycle_mark_col_name [ TO cycle_mark_value DEFAULT cycle_mark_default ] USING cycle_path_col_name ]\n\nTABLE [ ONLY ] table_name [ * ]"},"ManualEvidence":{},"MeasuredEvidence":{}},"Text":{"Collection":"sql","Key":"select","SourceDatabase":"pgweb","Version":"18","Locale":"zh-Hans","Title":"SELECT","Summary":"从表或视图中检索行","BodyHTML":"\u003cpre\u003e[ WITH [ RECURSIVE ] with_query [, ...] ]\nSELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]\n[ { * | expression [ [ AS ] output_name ] } [, ...] ]\n[ FROM from_item [, ...] ]\n[ WHERE condition ]\n[ GROUP BY [ ALL | DISTINCT ] grouping_element [, ...] ]\n[ HAVING condition ]\n[ WINDOW window_name AS ( window_definition ) [, ...] ]\n[ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ]\n[ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]\n[ LIMIT { count | ALL } ]\n[ OFFSET start [ ROW | ROWS ] ]\n[ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } { ONLY | WITH TIES } ]\n[ FOR { UPDATE | NO KEY UPDATE | SHARE | KEY SHARE } [ OF from_reference [, ...] ] [ NOWAIT | SKIP LOCKED ] [...] ]\n\nfrom_item可以是下列之一：\n\n[ ONLY ] table_name [ * ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]\n[ TABLESAMPLE sampling_method ( argument [, ...] ) [ REPEATABLE ( seed ) ] ]\n[ LATERAL ] ( select ) [ [ AS ] alias [ ( column_alias [, ...] ) ] ]\nwith_query_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ]\n[ LATERAL ] function_name ( [ argument [, ...] ] )\n[ WITH ORDINALITY ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]\n[ LATERAL ] function_name ( [ argument [, ...] ] ) [ AS ] alias ( column_definition [, ...] )\n[ LATERAL ] function_name ( [ argument [, ...] ] ) AS ( column_definition [, ...] )\n[ LATERAL ] ROWS FROM( function_name ( [ argument [, ...] ] ) [ AS ( column_definition [, ...] ) ] [, ...] )\n[ WITH ORDINALITY ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]\nfrom_item join_type from_item { ON join_condition | USING ( join_column [, ...] ) [ AS join_using_alias ] }\nfrom_item NATURAL join_type from_item\nfrom_item CROSS JOIN from_item\ngrouping_element可以是下列之一：\n\n( )\nexpression\n( expression [, ...] )\nROLLUP ( { expression | ( expression [, ...] ) } [, ...] )\nCUBE ( { expression | ( expression [, ...] ) } [, ...] )\nGROUPING SETS ( grouping_element [, ...] )\n\nwith_query为：\nwith_query_name [ ( column_name [, ...] ) ] AS [ [ NOT ] MATERIALIZED ] ( select | values | insert | update | delete | merge )\n[ SEARCH { BREADTH | DEPTH } FIRST BY column_name [, ...] SET search_seq_col_name ]\n[ CYCLE column_name [, ...] SET cycle_mark_col_name [ TO cycle_mark_value DEFAULT cycle_mark_default ] USING cycle_path_col_name ]\n\nTABLE [ ONLY ] table_name [ * ]\u003c/pre\u003e\u003csection\u003e\u003ch2\u003e描述\u003c/h2\u003e\u003cp\u003e\u003ccode\u003eSELECT\u003c/code\u003e 从零个或多个表中检索行。\u003ccode\u003eSELECT\u003c/code\u003e 的一般处理流程如下：\u003c/p\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003e\u003cp\u003e\u003ccode\u003eWITH\u003c/code\u003e列表中的所有查询都会被计算。这些实际上充当临时表，可以在\u003ccode\u003eFROM\u003c/code\u003e列表中引用。在\u003ccode\u003eFROM\u003c/code\u003e列表中多次引用的\u003ccode\u003eWITH\u003c/code\u003e查询只会计算一次，除非使用\u003ccode\u003eNOT MATERIALIZED\u003c/code\u003e进行其他指定。（参见下面的\u003ca href=\"/docs/18/sql-select.html#SQL-WITH\" title=\"WITH 子句\" rel=\"nofollow\"\u003eWITH Clause\u003c/a\u003e。）\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e所有\u003ccode\u003eFROM\u003c/code\u003e列表中的元素都会被计算。（\u003ccode\u003eFROM\u003c/code\u003e列表中的每个元素都是一个真实或虚拟表。）如果在\u003ccode\u003eFROM\u003c/code\u003e列表中指定了多个元素，则它们会被交叉连接在一起。（参见下面的\u003ca href=\"/docs/18/sql-select.html#SQL-FROM\" title=\"FROM 子句\" rel=\"nofollow\"\u003eFROM Clause\u003c/a\u003e。）\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e如果指定了\u003ccode\u003eWHERE\u003c/code\u003e子句，则不满足条件的所有行将从输出中删除。（请参见下面的\u003ca href=\"/docs/18/sql-select.html#SQL-WHERE\" title=\"WHERE 子句\" rel=\"nofollow\"\u003eWHERE Clause\u003c/a\u003e。）\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e如果指定了\u003ccode\u003eGROUP BY\u003c/code\u003e子句，或者存在聚合函数调用，输出将被组合成在一个或多个值上匹配的行组，并计算聚合函数的结果。如果存在\u003ccode\u003eHAVING\u003c/code\u003e子句，它将消除不满足给定条件的组。（参见\u003ca href=\"/docs/18/sql-select.html#SQL-GROUPBY\" title=\"GROUP BY 子句\" rel=\"nofollow\"\u003eGROUP BY Clause\u003c/a\u003e和\u003ca href=\"/docs/18/sql-select.html#SQL-HAVING\" title=\"HAVING 子句\" rel=\"nofollow\"\u003eHAVING Clause\u003c/a\u003e。）虽然查询输出列名义上是在下一步计算的，但它们也可以在\u003ccode\u003eGROUP BY\u003c/code\u003e子句中被引用（按名称或序号）。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e实际输出行是使用每个选定行或行组的\u003ccode\u003eSELECT\u003c/code\u003e输出表达式计算的。（参见下面的\u003ca href=\"/docs/18/sql-select.html#SQL-SELECT-LIST\" title=\"SELECT 列表\" rel=\"nofollow\"\u003eSELECT List\u003c/a\u003e。）\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e\u003ccode\u003eSELECT DISTINCT\u003c/code\u003e消除结果中的重复行。\u003ccode\u003eSELECT DISTINCT ON\u003c/code\u003e会消除在所有指定表达式上匹配的行，只保留每组中的第一行。\u003ccode\u003eSELECT ALL\u003c/code\u003e（默认）将返回所有候选行，包括重复行。（参见下面的\u003ca href=\"/docs/18/sql-select.html#SQL-DISTINCT\" title=\"DISTINCT 子句\" rel=\"nofollow\"\u003eDISTINCT Clause\u003c/a\u003e。）\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e使用操作符\u003ccode\u003eUNION\u003c/code\u003e、\u003ccode\u003eINTERSECT\u003c/code\u003e和\u003ccode\u003eEXCEPT\u003c/code\u003e，可以将多个\u003ccode\u003eSELECT\u003c/code\u003e语句的输出合并成一个结果集。\u003ccode\u003eUNION\u003c/code\u003e操作符返回在一个或两个结果集中的所有行。\u003ccode\u003eINTERSECT\u003c/code\u003e操作符返回同时出现在两个结果集中的所有行。\u003ccode\u003eEXCEPT\u003c/code\u003e操作符返回在第一个结果集中但不在第二个结果集中的行。在这三种情况下，除非指定\u003ccode\u003eALL\u003c/code\u003e，否则将消除重复行。还可以添加噪声词\u003ccode\u003eDISTINCT\u003c/code\u003e，以明确指定去重。请注意，这里的默认行为是\u003ccode\u003eDISTINCT\u003c/code\u003e，即使\u003ccode\u003eSELECT\u003c/code\u003e本身的默认行为是\u003ccode\u003eALL\u003c/code\u003e。（请参见下面的\u003ca href=\"/docs/18/sql-select.html#SQL-UNION\" title=\"UNION 子句\" rel=\"nofollow\"\u003eUNION Clause\u003c/a\u003e、\u003ca href=\"/docs/18/sql-select.html#SQL-INTERSECT\" title=\"INTERSECT 子句\" rel=\"nofollow\"\u003eINTERSECT Clause\u003c/a\u003e和\u003ca href=\"/docs/18/sql-select.html#SQL-EXCEPT\" title=\"EXCEPT 子句\" rel=\"nofollow\"\u003eEXCEPT Clause\u003c/a\u003e。）\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e如果指定了\u003ccode\u003eORDER BY\u003c/code\u003e子句，则返回的行按指定顺序排序。如果没有给出\u003ccode\u003eORDER BY\u003c/code\u003e，则按系统认为最快的顺序返回行。（参见下面的\u003ca href=\"/docs/18/sql-select.html#SQL-ORDERBY\" title=\"ORDER BY 子句\" rel=\"nofollow\"\u003eORDER BY Clause\u003c/a\u003e。）\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e如果指定了\u003ccode\u003eLIMIT\u003c/code\u003e（或\u003ccode\u003eFETCH FIRST\u003c/code\u003e）或\u003ccode\u003eOFFSET\u003c/code\u003e子句，\u003ccode\u003eSELECT\u003c/code\u003e语句只返回结果行的子集。（参见下面的\u003ca href=\"/docs/18/sql-select.html#SQL-LIMIT\" title=\"LIMIT 子句\" rel=\"nofollow\"\u003eLIMIT Clause\u003c/a\u003e。）\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e如果指定了\u003ccode\u003eFOR UPDATE\u003c/code\u003e、\u003ccode\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode\u003eFOR SHARE\u003c/code\u003e 或\u003ccode\u003eFOR KEY SHARE\u003c/code\u003e，\u003ccode\u003eSELECT\u003c/code\u003e语句将选定的行锁定，防止并发更新。（参见下面的\u003ca href=\"/docs/18/sql-select.html#SQL-FOR-UPDATE-SHARE\" title=\"锁定子句\" rel=\"nofollow\"\u003eThe Locking Clause\u003c/a\u003e。）\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003cp\u003e你必须拥有\u003ccode\u003eSELECT\u003c/code\u003e命令中使用到的每一列上的 \u003ccode\u003eSELECT\u003c/code\u003e权限。\u003ccode\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode\u003eFOR UPDATE\u003c/code\u003e、\u003ccode\u003eFOR SHARE\u003c/code\u003e或者\u003ccode\u003eFOR KEY SHARE\u003c/code\u003e 还要求具备\u003ccode\u003eUPDATE\u003c/code\u003e权限（对这样选中的每个表至少一列）。\u003c/p\u003e\u003c/section\u003e\u003csection\u003e\u003ch2\u003e参数\u003c/h2\u003e\u003cdiv\u003e\u003ch3\u003e\u003ccode\u003eWITH\u003c/code\u003e 子句\u003c/h3\u003e\u003cp\u003e\u003ccode\u003eWITH\u003c/code\u003e子句允许你指定一个或多个可在主查询中按名称引用的子查询。这些子查询在主查询执行期间实际上充当临时表或视图。每个子查询都可以是\u003ccode\u003eSELECT\u003c/code\u003e、\u003ccode\u003eTABLE\u003c/code\u003e、\u003ccode\u003eVALUES\u003c/code\u003e、\u003ccode\u003eINSERT\u003c/code\u003e、\u003ccode\u003eUPDATE\u003c/code\u003e、\u003ccode\u003eDELETE\u003c/code\u003e或者 \u003ccode\u003eMERGE\u003c/code\u003e语句。在\u003ccode\u003eWITH\u003c/code\u003e中编写数据修改语句（\u003ccode\u003eINSERT\u003c/code\u003e、\u003ccode\u003eUPDATE\u003c/code\u003e、\u003ccode\u003eDELETE\u003c/code\u003e或者 \u003ccode\u003eMERGE\u003c/code\u003e）时，通常要包括一个 \u003ccode\u003eRETURNING\u003c/code\u003e子句。被主查询读取并构成临时表的是 \u003ccode\u003eRETURNING\u003c/code\u003e的输出，而\u003cspan\u003e\u003cem\u003e不是\u003c/em\u003e\u003c/span\u003e该语句所修改的底层表。如果省略\u003ccode\u003eRETURNING\u003c/code\u003e，该语句仍会执行，但不会产生输出，因此主查询无法把它当作表来引用。\u003c/p\u003e\u003cp\u003e对于每个\u003ccode\u003eWITH\u003c/code\u003e查询，都必须指定一个名称（不带模式限定）。还可以指定一个列名列表；如果省略，则列名将从子查询中推导出来。\u003c/p\u003e\u003cp\u003e如果指定了\u003ccode\u003eRECURSIVE\u003c/code\u003e，则允许一个 \u003ccode\u003eSELECT\u003c/code\u003e子查询使用名称引用自身。这样一个子查询的形式必须是\u003c/p\u003e\u003cpre\u003e\u003cem\u003e\u003ccode\u003enon_recursive_term\u003c/code\u003e\u003c/em\u003e UNION [ ALL | DISTINCT ] \u003cem\u003e\u003ccode\u003erecursive_term\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003e其中递归自引用必须出现在\u003ccode\u003eUNION\u003c/code\u003e的右手边。每个查询中只允许一个递归自引用。不支持递归数据修改语句，但是可以在一个数据修改语句中使用一个递归 \u003ccode\u003eSELECT\u003c/code\u003e查询的结果。示例可见\u003ca href=\"/docs/18/queries-with.html\" rel=\"nofollow\"\u003e第 7.8 节\u003c/a\u003e。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eRECURSIVE\u003c/code\u003e的另一个效果是 \u003ccode\u003eWITH\u003c/code\u003e查询不需要被排序：一个查询可以引用另一个在列表中比它靠后的查询（不过，循环引用或者互递归没有实现）。如果没有\u003ccode\u003eRECURSIVE\u003c/code\u003e，\u003ccode\u003eWITH\u003c/code\u003e 查询只能引用在\u003ccode\u003eWITH\u003c/code\u003e列表中位置更前面的兄弟 \u003ccode\u003eWITH\u003c/code\u003e查询。\u003c/p\u003e\u003cp\u003e当\u003ccode\u003eWITH\u003c/code\u003e子句中有多个查询时，\u003ccode\u003eRECURSIVE\u003c/code\u003e应只编写一次，紧跟在\u003ccode\u003eWITH\u003c/code\u003e之后。它适用于\u003ccode\u003eWITH\u003c/code\u003e子句中的所有查询，尽管它对不使用递归或前向引用的查询没有影响。\u003c/p\u003e\u003cp\u003e可选的\u003ccode\u003eSEARCH\u003c/code\u003e子句会计算一个\u003cem\u003e搜索序列列（search sequence column）\u003c/em\u003e，可用于按广度优先或深度优先顺序对递归查询结果进行排序。给出的列名列表指定了用于跟踪已访问行的行键。名为\u003cem\u003e\u003ccode\u003esearch_seq_col_name\u003c/code\u003e\u003c/em\u003e的列会被添加到\u003ccode\u003eWITH\u003c/code\u003e查询的结果列列表中。可以在外层查询中按该列排序，以获得相应的顺序。示例请见\u003ca href=\"/docs/18/queries-with.html#QUERIES-WITH-SEARCH\" rel=\"nofollow\"\u003e第 7.8.2.1 节\u003c/a\u003e。\u003c/p\u003e\u003cp\u003e可选的\u003ccode\u003eCYCLE\u003c/code\u003e子句用于检测递归查询中的环路。给出的列名列表指定了用于跟踪已访问行的行键。名为 \u003cem\u003e\u003ccode\u003ecycle_mark_col_name\u003c/code\u003e\u003c/em\u003e的列会被添加到 \u003ccode\u003eWITH\u003c/code\u003e查询的结果列列表中。检测到环路时，该列会被设为 \u003cem\u003e\u003ccode\u003ecycle_mark_value\u003c/code\u003e\u003c/em\u003e，否则设为 \u003cem\u003e\u003ccode\u003ecycle_mark_default\u003c/code\u003e\u003c/em\u003e。此外，一旦检测到环路，递归联合的处理就会停止。\u003cem\u003e\u003ccode\u003ecycle_mark_value\u003c/code\u003e\u003c/em\u003e和 \u003cem\u003e\u003ccode\u003ecycle_mark_default\u003c/code\u003e\u003c/em\u003e必须是常量，并且必须能够强制转换为某个公共数据类型，而且该数据类型必须具有不等操作符。（SQL 标准要求它们是布尔常量或字符串，但 PostgreSQL 不作此要求。）默认使用\u003ccode\u003eTRUE\u003c/code\u003e和\u003ccode\u003eFALSE\u003c/code\u003e（类型为 \u003ccode\u003eboolean\u003c/code\u003e）。此外，名为 \u003cem\u003e\u003ccode\u003ecycle_path_col_name\u003c/code\u003e\u003c/em\u003e的列也会被添加到 \u003ccode\u003eWITH\u003c/code\u003e查询的结果列列表中。该列在内部用于跟踪已访问的行。示例请见\u003ca href=\"/docs/18/queries-with.html#QUERIES-WITH-CYCLE\" rel=\"nofollow\"\u003e第 7.8.2.2 节\u003c/a\u003e。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eSEARCH\u003c/code\u003e和\u003ccode\u003eCYCLE\u003c/code\u003e子句只对递归 \u003ccode\u003eWITH\u003c/code\u003e查询有效。\u003cem\u003e\u003ccode\u003ewith_query\u003c/code\u003e\u003c/em\u003e 必须是两个\u003ccode\u003eSELECT\u003c/code\u003e（或等效）命令的 \u003ccode\u003eUNION\u003c/code\u003e（或\u003ccode\u003eUNION ALL\u003c/code\u003e），且不允许嵌套 \u003ccode\u003eUNION\u003c/code\u003e。如果同时使用这两个子句，\u003ccode\u003eSEARCH\u003c/code\u003e子句添加的列会出现在\u003ccode\u003eCYCLE\u003c/code\u003e 子句添加的列之前。\u003c/p\u003e\u003cp\u003e主查询和\u003ccode\u003eWITH\u003c/code\u003e查询（概念上）都在同一时间执行。这意味着，除了读取其\u003ccode\u003eRETURNING\u003c/code\u003e输出之外，查询的其他部分都看不到\u003ccode\u003eWITH\u003c/code\u003e中数据修改语句的效果。如果两个这样的数据修改语句试图修改同一行，结果并无规定。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eWITH\u003c/code\u003e查询的一个关键属性是，即使主查询多次引用它们，它们通常在主查询的每次执行中也只会计算一次。特别是，数据修改语句保证执行一次且仅执行一次，而不管主查询是否读取了它们的全部输出或其中任何部分。\u003c/p\u003e\u003cp\u003e不过，可以将\u003ccode\u003eWITH\u003c/code\u003e查询标记为 \u003ccode\u003eNOT MATERIALIZED\u003c/code\u003e，从而取消这一保证。在这种情况下，\u003ccode\u003eWITH\u003c/code\u003e查询可以折叠进主查询，就像它是主查询 \u003ccode\u003eFROM\u003c/code\u003e子句中的一个简单子\u003ccode\u003eSELECT\u003c/code\u003e一样。如果主查询多次引用该\u003ccode\u003eWITH\u003c/code\u003e查询，这会导致重复计算；但如果每次使用只需要\u003ccode\u003eWITH\u003c/code\u003e查询总输出中的少量行，\u003ccode\u003eNOT MATERIALIZED\u003c/code\u003e仍可能因为允许联合优化而带来净收益。如果\u003ccode\u003eNOT MATERIALIZED\u003c/code\u003e附加在递归的\u003ccode\u003eWITH\u003c/code\u003e查询上，或该查询并非无副作用（也就是说，不是不包含可变函数的普通\u003ccode\u003eSELECT\u003c/code\u003e），则会被忽略。\u003c/p\u003e\u003cp\u003e默认情况下，如果某个无副作用的\u003ccode\u003eWITH\u003c/code\u003e查询在主查询的 \u003ccode\u003eFROM\u003c/code\u003e子句中恰好只使用一次，它就会被折叠进主查询。这使得在语义上应当没有可见影响的情况下，查询的两个层级可以联合优化。不过，也可以把\u003ccode\u003eWITH\u003c/code\u003e查询标记为\u003ccode\u003eMATERIALIZED\u003c/code\u003e，以阻止这种折叠。例如，当\u003ccode\u003eWITH\u003c/code\u003e查询被用作优化围栏，以防止规划器选择糟糕的计划时，这么做可能有用。\u003cspan\u003ePostgreSQL\u003c/span\u003e 在 v12 之前从不进行这种折叠，因此为旧版本编写的查询可能依赖\u003ccode\u003eWITH\u003c/code\u003e来充当优化围栏。\u003c/p\u003e\u003cp\u003e更多信息请见\u003ca href=\"/docs/18/queries-with.html\" rel=\"nofollow\"\u003e第 7.8 节\u003c/a\u003e。\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ccode\u003eFROM\u003c/code\u003e 子句\u003c/h3\u003e\u003cp\u003e\u003ccode\u003eFROM\u003c/code\u003e子句为\u003ccode\u003eSELECT\u003c/code\u003e 指定一个或者更多源表。如果指定了多个源表，结果将是所有源表的笛卡尔积（交叉连接）。但是通常会增加限定条件（通过 \u003ccode\u003eWHERE\u003c/code\u003e）来把返回的行限制为该笛卡尔积的一个小子集。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eFROM\u003c/code\u003e子句可以包含以下元素：\u003c/p\u003e\u003cdiv\u003e\u003cdl\u003e\u003cdt\u003e\u003cspan\u003e\u003cem\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e要扫描的现有表或视图的名称（可选模式限定符）。如果在表名之前指定\u003ccode\u003eONLY\u003c/code\u003e，则仅扫描该表。如果未指定\u003ccode\u003eONLY\u003c/code\u003e，则扫描该表及其所有后代表（如果有）。可选地，可以在表名后指定\u003ccode\u003e*\u003c/code\u003e，以明确指示包括后代表。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003cem\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e包含该别名的\u003ccode\u003eFROM\u003c/code\u003e项的替代名称。别名可用于简写，或者消除自连接（同一张表被扫描多次）中的歧义。提供别名后，它会完全隐藏表或函数的实际名称；例如给定\u003ccode\u003eFROM foo AS f\u003c/code\u003e，\u003ccode\u003eSELECT\u003c/code\u003e的其余部分必须把这个\u003ccode\u003eFROM\u003c/code\u003e 项写成\u003ccode\u003ef\u003c/code\u003e而不是\u003ccode\u003efoo\u003c/code\u003e。如果写了别名，还可以写列别名列表，为该表的一个或多个列提供替代名称。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eTABLESAMPLE \u003cem\u003e\u003ccode\u003esampling_method\u003c/code\u003e\u003c/em\u003e ( \u003cem\u003e\u003ccode\u003eargument\u003c/code\u003e\u003c/em\u003e [, ...] ) [ REPEATABLE ( \u003cem\u003e\u003ccode\u003eseed\u003c/code\u003e\u003c/em\u003e ) ]\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e跟在\u003cem\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e之后的 \u003ccode\u003eTABLESAMPLE\u003c/code\u003e子句表示，应使用指定的 \u003cem\u003e\u003ccode\u003esampling_method\u003c/code\u003e\u003c/em\u003e从该表中取回行的一个子集。这种抽样先于任何其他过滤条件（例如 \u003ccode\u003eWHERE\u003c/code\u003e子句）的应用。标准 \u003cspan\u003ePostgreSQL\u003c/span\u003e发行版包含两种抽样方法，即\u003ccode\u003eBERNOULLI\u003c/code\u003e和\u003ccode\u003eSYSTEM\u003c/code\u003e；其他抽样方法可以通过扩展安装到数据库中。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eBERNOULLI\u003c/code\u003e和\u003ccode\u003eSYSTEM\u003c/code\u003e抽样方法各接受一个\u003cem\u003e\u003ccode\u003eargument\u003c/code\u003e\u003c/em\u003e，表示要抽样的表的比例，以 0 到 100 之间的百分比表示。该参数可以是任何返回\u003ccode\u003ereal\u003c/code\u003e的表达式。（其他抽样方法可能接受更多或不同的参数。）这两种方法都会返回表的一个随机样本，其中大约包含表中指定百分比的行。\u003ccode\u003eBERNOULLI\u003c/code\u003e方法扫描整个表，并以指定概率独立选择或忽略单个行。\u003ccode\u003eSYSTEM\u003c/code\u003e方法进行块级抽样，每个块有指定的选择机会；返回每个选定块中的所有行。当指定小的抽样百分比时，\u003ccode\u003eSYSTEM\u003c/code\u003e方法比 \u003ccode\u003eBERNOULLI\u003c/code\u003e方法快得多，但由于聚类效应，它返回的表样本随机性可能稍差一些。\u003c/p\u003e\u003cp\u003e可选的\u003ccode\u003eREPEATABLE\u003c/code\u003e子句指定一个 \u003cem\u003e\u003ccode\u003eseed\u003c/code\u003e\u003c/em\u003e数字或表达式，用于在抽样方法内部生成随机数。种子值可以是任意非空浮点值。如果两个查询指定了相同的种子和\u003cem\u003e\u003ccode\u003eargument\u003c/code\u003e\u003c/em\u003e值，且该表在此期间未被修改，它们会选出相同的表样本；但不同的种子值通常会产生不同的样本。如果未给出\u003ccode\u003eREPEATABLE\u003c/code\u003e，则每次查询都会基于系统生成的种子选取新的随机样本。注意，某些附加抽样方法并不接受\u003ccode\u003eREPEATABLE\u003c/code\u003e，因此每次使用时都会生成新的样本。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003cem\u003e\u003ccode\u003eselect\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e子\u003ccode\u003eSELECT\u003c/code\u003e可以出现在\u003ccode\u003eFROM\u003c/code\u003e子句中，它的作用就像在这个\u003ccode\u003eSELECT\u003c/code\u003e命令的执行期间创建了一个临时表。注意，子\u003ccode\u003eSELECT\u003c/code\u003e必须用圆括号括起来，并且可以像对待表那样为其提供别名。这里也可以使用 \u003ca href=\"/docs/18/sql-values.html\" title=\"VALUES\" rel=\"nofollow\"\u003e\u003ccode\u003eVALUES\u003c/code\u003e\u003c/a\u003e命令。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003cem\u003e\u003ccode\u003ewith_query_name\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e\u003ccode\u003eWITH\u003c/code\u003e查询通过写出它的名称来引用，就像该查询名是表名一样。（事实上，对于主查询而言，\u003ccode\u003eWITH\u003c/code\u003e查询会遮蔽任何同名的真实表；如有必要，可以通过模式限定表名来引用该同名真实表。）也可以像对待表一样为它提供别名。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003cem\u003e\u003ccode\u003efunction_name\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e函数调用可以出现在\u003ccode\u003eFROM\u003c/code\u003e子句中。（这对于返回结果集的函数尤其有用，但任何函数都可以使用。）其效果就像在这个单个\u003ccode\u003eSELECT\u003c/code\u003e命令的执行期间，把函数的输出创建成一个临时表一样。如果函数的结果类型是复合的（包括具有多个\u003ccode\u003eOUT\u003c/code\u003e参数的情况），每个属性都成为隐式表中的一个单独列。\u003c/p\u003e\u003cp\u003e当在函数调用中添加可选的\u003ccode\u003eWITH ORDINALITY\u003c/code\u003e子句时，将会在函数的结果列后附加一个\u003ccode\u003ebigint\u003c/code\u003e类型的额外列。该列对函数结果集的行进行编号，从1开始。默认情况下，该列名为\u003ccode\u003eordinality\u003c/code\u003e。\u003c/p\u003e\u003cp\u003e也可以像对待表一样为其提供别名。如果写了别名，还可以编写列别名列表，为函数的复合返回类型的一个或多个属性提供替代名称，包括存在的序号列。\u003c/p\u003e\u003cp\u003e多个函数调用可以通过用\u003ccode\u003eROWS FROM( ... )\u003c/code\u003e括起来，合并成单个\u003ccode\u003eFROM\u003c/code\u003e子句项。这样一个项的输出会先拼接每个函数的第一行，再拼接每个函数的第二行，依此类推。如果某些函数产生的行数少于其他函数，则会用空值替代缺失的数据，以确保返回的总行数始终与产生最多行的那个函数相同。\u003c/p\u003e\u003cp\u003e如果函数被定义为返回\u003ccode\u003erecord\u003c/code\u003e数据类型，则必须给出别名或关键字\u003ccode\u003eAS\u003c/code\u003e，后面跟一个如下形式的列定义列表：\u003ccode\u003e( \u003cem\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e \u003cem\u003e\u003ccode\u003edata_type\u003c/code\u003e\u003c/em\u003e [\u003cspan\u003e, ...\u003c/span\u003e ])\u003c/code\u003e。列定义列表必须与该函数实际返回的列数和列类型相匹配。\u003c/p\u003e\u003cp\u003e当使用\u003ccode\u003eROWS FROM( ... )\u003c/code\u003e语法时，如果其中某个函数需要列定义列表，最好将该列定义列表放在\u003ccode\u003eROWS FROM( ... )\u003c/code\u003e 内部、紧跟在函数调用之后。只有在只有一个函数且没有 \u003ccode\u003eWITH ORDINALITY\u003c/code\u003e子句时，才能把列定义列表放在 \u003ccode\u003eROWS FROM( ... )\u003c/code\u003e结构之后。\u003c/p\u003e\u003cp\u003e要将\u003ccode\u003eORDINALITY\u003c/code\u003e与列定义列表一起使用，必须使用\u003ccode\u003eROWS FROM( ... )\u003c/code\u003e语法，并将列定义列表放在\u003ccode\u003eROWS FROM( ... )\u003c/code\u003e内部。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003cem\u003e\u003ccode\u003ejoin_type\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e以下之一：\u003c/p\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e\u003ccode\u003e[ INNER ] JOIN\u003c/code\u003e\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e\u003ccode\u003eLEFT [ OUTER ] JOIN\u003c/code\u003e\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e\u003ccode\u003eRIGHT [ OUTER ] JOIN\u003c/code\u003e\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e\u003ccode\u003eFULL [ OUTER ] JOIN\u003c/code\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cp\u003e对于\u003ccode\u003eINNER\u003c/code\u003e和\u003ccode\u003eOUTER\u003c/code\u003e连接类型，必须指定连接条件，即下列三者之一：\u003ccode\u003eON \u003cem\u003e\u003ccode\u003ejoin_condition\u003c/code\u003e\u003c/em\u003e\u003c/code\u003e、\u003ccode\u003eUSING (\u003cem\u003e\u003ccode\u003ejoin_column\u003c/code\u003e\u003c/em\u003e [, ...])\u003c/code\u003e，或者\u003ccode\u003eNATURAL\u003c/code\u003e。其含义见下文。\u003c/p\u003e\u003cp\u003e一个\u003ccode\u003eJOIN\u003c/code\u003e子句会把两个\u003ccode\u003eFROM\u003c/code\u003e项组合起来，为方便起见，我们把它们称为\u003cspan\u003e“\u003cspan\u003e表\u003c/span\u003e”\u003c/span\u003e，尽管实际上它们可以是任何类型的\u003ccode\u003eFROM\u003c/code\u003e项。如有必要，可以使用括号来确定嵌套顺序。在没有括号时，\u003ccode\u003eJOIN\u003c/code\u003e按从左到右的顺序嵌套。无论如何，\u003ccode\u003eJOIN\u003c/code\u003e的结合都比分隔\u003ccode\u003eFROM\u003c/code\u003e列表项的逗号更紧密。所有\u003ccode\u003eJOIN\u003c/code\u003e选项都只是记法上的便利，因为它们并没有提供任何无法用普通\u003ccode\u003eFROM\u003c/code\u003e和\u003ccode\u003eWHERE\u003c/code\u003e做到的能力。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eLEFT OUTER JOIN\u003c/code\u003e返回已限定笛卡尔积中的所有行（即，通过其连接条件的所有组合行），外加左侧表中没有任何右侧行通过连接条件的每一行的一个副本。这样的左侧行会通过在右侧列中插入空值而扩展到连接表的完整宽度。注意，在决定哪些行有匹配项时，只考虑\u003ccode\u003eJOIN\u003c/code\u003e子句自身的条件；外层条件是在之后应用的。\u003c/p\u003e\u003cp\u003e相反，\u003ccode\u003eRIGHT OUTER JOIN\u003c/code\u003e返回所有连接后的行，再加上每个未匹配右侧行对应的一行（左侧用空值扩展）。这只是一种记法上的便利，因为你可以通过交换左右表将其改写成\u003ccode\u003eLEFT OUTER JOIN\u003c/code\u003e。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eFULL OUTER JOIN\u003c/code\u003e返回所有连接后的行，再加上每个未匹配的左侧行（右侧用空值扩展），以及每个未匹配的右侧行（左侧用空值扩展）。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eON \u003cem\u003e\u003ccode\u003ejoin_condition\u003c/code\u003e\u003c/em\u003e\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e\u003cem\u003e\u003ccode\u003ejoin_condition\u003c/code\u003e\u003c/em\u003e是一个表达式，其结果为\u003ccode\u003eboolean\u003c/code\u003e类型的值（类似于\u003ccode\u003eWHERE\u003c/code\u003e子句），指定连接中的哪些行被认为是匹配的。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eUSING ( \u003cem\u003e\u003ccode\u003ejoin_column\u003c/code\u003e\u003c/em\u003e [, ...] ) [ AS \u003cem\u003e\u003ccode\u003ejoin_using_alias\u003c/code\u003e\u003c/em\u003e ]\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e一个形如\u003ccode\u003eUSING ( a, b, ... )\u003c/code\u003e的子句是\u003ccode\u003eON left_table.a = right_table.a AND left_table.b = right_table.b ...\u003c/code\u003e的简写。此外，\u003ccode\u003eUSING\u003c/code\u003e意味着只有每对等价列中的一个会包含在连接输出中，而不是两者都包含。\u003c/p\u003e\u003cp\u003e如果指定了\u003cem\u003e\u003ccode\u003ejoin_using_alias\u003c/code\u003e\u003c/em\u003e 名称，它会为连接列提供一个表别名。只有\u003ccode\u003eUSING\u003c/code\u003e子句中列出的连接列才能通过这个名称访问。与普通的 \u003cem\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e不同，它不会向查询其余部分隐藏已连接表的名称。并且与普通的 \u003cem\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e不同，你不能编写列别名列表，连接列的输出名称与它们在\u003ccode\u003eUSING\u003c/code\u003e列表中出现时相同。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eNATURAL\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e\u003ccode\u003eNATURAL\u003c/code\u003e是一个简写，表示一个包含两个表中所有具有相同名称的列的\u003ccode\u003eUSING\u003c/code\u003e列表。如果没有共同的列名，\u003ccode\u003eNATURAL\u003c/code\u003e等同于\u003ccode\u003eON TRUE\u003c/code\u003e。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eCROSS JOIN\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e\u003ccode\u003eCROSS JOIN\u003c/code\u003e等同于\u003ccode\u003eINNER JOIN ON (TRUE)\u003c/code\u003e，也就是说，没有任何行被条件限制删除。它们产生一个简单的笛卡尔积，与在\u003ccode\u003eFROM\u003c/code\u003e的顶层列出两个表时得到的结果相同，但受连接条件（如果有）的限制。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eLATERAL\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e\u003ccode\u003eLATERAL\u003c/code\u003e关键字可以在子\u003ccode\u003eSELECT\u003c/code\u003e \u003ccode\u003eFROM\u003c/code\u003e项之前出现。这允许子\u003ccode\u003eSELECT\u003c/code\u003e引用在\u003ccode\u003eFROM\u003c/code\u003e列表中出现在其前面的\u003ccode\u003eFROM\u003c/code\u003e项的列。（没有\u003ccode\u003eLATERAL\u003c/code\u003e，每个子\u003ccode\u003eSELECT\u003c/code\u003e都是独立求值的，因此不能交叉引用任何其他\u003ccode\u003eFROM\u003c/code\u003e项。）\u003c/p\u003e\u003cp\u003e\u003ccode\u003eLATERAL\u003c/code\u003e也可以放在函数调用形式的\u003ccode\u003eFROM\u003c/code\u003e项之前，但在这种情况下它只是一个噪声词，因为函数表达式无论如何都可以引用更早出现的\u003ccode\u003eFROM\u003c/code\u003e项。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eLATERAL\u003c/code\u003e项既可以出现在\u003ccode\u003eFROM\u003c/code\u003e列表的顶层，也可以出现在\u003ccode\u003eJOIN\u003c/code\u003e树中。在后一种情况下，如果它位于某个 \u003ccode\u003eJOIN\u003c/code\u003e的右侧，也可以引用该连接左侧的任何项。\u003c/p\u003e\u003cp\u003e当\u003ccode\u003eFROM\u003c/code\u003e项包含\u003ccode\u003eLATERAL\u003c/code\u003e交叉引用时，求值过程如下：对于提供被交叉引用列的\u003ccode\u003eFROM\u003c/code\u003e项的每一行，或者对于提供这些列的多个\u003ccode\u003eFROM\u003c/code\u003e项的一组行，都会使用该行或行集中的列值来计算\u003ccode\u003eLATERAL\u003c/code\u003e项。得到的行随后照常与生成它们的那些行连接。这个过程会针对列源表中的每一行或每一组行重复执行。\u003c/p\u003e\u003cp\u003e列源表必须通过\u003ccode\u003eINNER\u003c/code\u003e或\u003ccode\u003eLEFT\u003c/code\u003e连接到 \u003ccode\u003eLATERAL\u003c/code\u003e项，否则就无法得到一个定义良好的行集合，用来计算该\u003ccode\u003eLATERAL\u003c/code\u003e项的每一组结果行。因此，尽管像 \u003ccode\u003e\u003cem\u003e\u003ccode\u003eX\u003c/code\u003e\u003c/em\u003e RIGHT JOIN LATERAL \u003cem\u003e\u003ccode\u003eY\u003c/code\u003e\u003c/em\u003e\u003c/code\u003e 这样的结构在语法上有效，但实际上并不允许\u003cem\u003e\u003ccode\u003eY\u003c/code\u003e\u003c/em\u003e 引用\u003cem\u003e\u003ccode\u003eX\u003c/code\u003e\u003c/em\u003e。\u003c/p\u003e\u003c/dd\u003e\u003c/dl\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ccode\u003eWHERE\u003c/code\u003e 子句\u003c/h3\u003e\u003cp\u003e可选的\u003ccode\u003eWHERE\u003c/code\u003e子句的形式\u003c/p\u003e\u003cpre\u003eWHERE \u003cem\u003e\u003ccode\u003econdition\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003e其中\u003cem\u003e\u003ccode\u003econdition\u003c/code\u003e\u003c/em\u003e 是任一计算得到\u003ccode\u003eboolean\u003c/code\u003e类型结果的表达式。任何不满足这个条件的行都会从输出中被消除。如果用一行的实际值替换其中的变量引用后，该表达式返回真，则该行符合条件。\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ccode\u003eGROUP BY\u003c/code\u003e 子句\u003c/h3\u003e\u003cp\u003e可选的\u003ccode\u003eGROUP BY\u003c/code\u003e子句的一般形式为\u003c/p\u003e\u003cpre\u003eGROUP BY [ ALL | DISTINCT ] \u003cem\u003e\u003ccode\u003egrouping_element\u003c/code\u003e\u003c/em\u003e [, ...]\n\u003c/pre\u003e\u003cp\u003e\u003ccode\u003eGROUP BY\u003c/code\u003e会把所有在分组表达式上具有相同值的已选中行压缩成单独一行。用于 \u003cem\u003e\u003ccode\u003egrouping_element\u003c/code\u003e\u003c/em\u003e中的 \u003cem\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e可以是输入列名、输出列（\u003ccode\u003eSELECT\u003c/code\u003e列表项）的名称或序号或者由输入列值构成的任意表达式。在出现歧义时，\u003ccode\u003eGROUP BY\u003c/code\u003e名称将被解释为输入列名而不是输出列名。\u003c/p\u003e\u003cp\u003e如果\u003ccode\u003eGROUPING SETS\u003c/code\u003e、\u003ccode\u003eROLLUP\u003c/code\u003e或 \u003ccode\u003eCUBE\u003c/code\u003e中的任何一个作为分组元素出现，那么整个 \u003ccode\u003eGROUP BY\u003c/code\u003e子句就定义了若干个相互独立的\u003cem\u003e\u003ccode\u003e分组集\u003c/code\u003e\u003c/em\u003e。其效果等价于在多个子查询之间构造一个\u003ccode\u003eUNION ALL\u003c/code\u003e，各个子查询分别以各自的分组集作为它们的\u003ccode\u003eGROUP BY\u003c/code\u003e子句。可选的\u003ccode\u003eDISTINCT\u003c/code\u003e 子句会在处理前移除重复的集合；它\u003cspan\u003e\u003cem\u003e不会\u003c/em\u003e\u003c/span\u003e把 \u003ccode\u003eUNION ALL\u003c/code\u003e转换为\u003ccode\u003eUNION DISTINCT\u003c/code\u003e。关于分组集处理的更多细节，见\u003ca href=\"/docs/18/queries-table-expressions.html#QUERIES-GROUPING-SETS\" rel=\"nofollow\"\u003e第 7.2.4 节\u003c/a\u003e。\u003c/p\u003e\u003cp\u003e聚合函数（如果使用）会在组成每一个分组的所有行上进行计算，从而为每一个分组产生一个单独的值（如果有聚合函数但是没有 \u003ccode\u003eGROUP BY\u003c/code\u003e子句，则查询会被当成是由所有选中行构成的一个单一分组）。传递给每一个聚合函数的行集合可以通过在聚合函数调用上附加一个\u003ccode\u003eFILTER\u003c/code\u003e子句来进一步过滤，详见\u003ca href=\"/docs/18/sql-expressions.html#SYNTAX-AGGREGATES\" rel=\"nofollow\"\u003e第 4.2.7 节\u003c/a\u003e。当存在一个 \u003ccode\u003eFILTER\u003c/code\u003e子句时，只有那些匹配它的行才会被包括在该聚合函数的输入中。\u003c/p\u003e\u003cp\u003e当存在\u003ccode\u003eGROUP BY\u003c/code\u003e子句或者任何聚合函数时，\u003ccode\u003eSELECT\u003c/code\u003e列表表达式不能引用非分组列，除非它出现在聚合函数中，或者该非分组列函数依赖于分组列，否则，一个非分组列可能有多个可返回的值。如果分组列（或其子集）构成包含该非分组列的表的主键，则存在函数依赖。\u003c/p\u003e\u003cp\u003e记住所有的聚合函数都是在\u003ccode\u003eHAVING\u003c/code\u003e子句或者 \u003ccode\u003eSELECT\u003c/code\u003e列表中的任何\u003cspan\u003e“\u003cspan\u003e标量\u003c/span\u003e”\u003c/span\u003e表达式之前被计算。这意味着\u003ccode\u003eCASE\u003c/code\u003e表达式不能被用来跳过聚合函数的计算，见\u003ca href=\"/docs/18/sql-expressions.html#SYNTAX-EXPRESS-EVAL\" rel=\"nofollow\"\u003e第 4.2.14 节\u003c/a\u003e。\u003c/p\u003e\u003cp\u003e当前，\u003ccode\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode\u003eFOR UPDATE\u003c/code\u003e、\u003ccode\u003eFOR SHARE\u003c/code\u003e和\u003ccode\u003eFOR KEY SHARE\u003c/code\u003e不能和 \u003ccode\u003eGROUP BY\u003c/code\u003e一起指定。\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ccode\u003eHAVING\u003c/code\u003e 子句\u003c/h3\u003e\u003cp\u003e可选的\u003ccode\u003eHAVING\u003c/code\u003e子句的形式\u003c/p\u003e\u003cpre\u003eHAVING \u003cem\u003e\u003ccode\u003econdition\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003e其中\u003cem\u003e\u003ccode\u003econdition\u003c/code\u003e\u003c/em\u003e与 \u003ccode\u003eWHERE\u003c/code\u003e子句中指定的条件相同。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eHAVING\u003c/code\u003e消除不满足该条件的分组行。\u003ccode\u003eHAVING\u003c/code\u003e与\u003ccode\u003eWHERE\u003c/code\u003e不同：\u003ccode\u003eWHERE\u003c/code\u003e会在应用\u003ccode\u003eGROUP BY\u003c/code\u003e之前过滤个体行，而\u003ccode\u003eHAVING\u003c/code\u003e过滤由 \u003ccode\u003eGROUP BY\u003c/code\u003e创建的分组行。\u003cem\u003e\u003ccode\u003econdition\u003c/code\u003e\u003c/em\u003e中引用的每一列都必须无歧义地引用某个分组列，除非该引用出现在聚合函数中，或者该非分组列函数依赖于分组列。\u003c/p\u003e\u003cp\u003e即使没有\u003ccode\u003eGROUP BY\u003c/code\u003e子句，\u003ccode\u003eHAVING\u003c/code\u003e 的存在也会把一个查询转变成一个分组查询。这和查询中包含聚合函数但没有 \u003ccode\u003eGROUP BY\u003c/code\u003e子句时的情况相同。所有被选择的行都被认为是一个单一分组，并且\u003ccode\u003eSELECT\u003c/code\u003e列表和 \u003ccode\u003eHAVING\u003c/code\u003e子句只能从聚合函数内部引用表列。如果该 \u003ccode\u003eHAVING\u003c/code\u003e条件为真，这样的查询将输出单独一行；否则不返回行。\u003c/p\u003e\u003cp\u003e当前，\u003ccode\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode\u003eFOR UPDATE\u003c/code\u003e、\u003ccode\u003eFOR SHARE\u003c/code\u003e和\u003ccode\u003eFOR KEY SHARE\u003c/code\u003e不能与 \u003ccode\u003eHAVING\u003c/code\u003e一起指定。\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ccode\u003eWINDOW\u003c/code\u003e 子句\u003c/h3\u003e\u003cp\u003e可选的 \u003ccode\u003eWINDOW\u003c/code\u003e 子句的一般形式为：\u003c/p\u003e\u003cpre\u003eWINDOW \u003cem\u003e\u003ccode\u003ewindow_name\u003c/code\u003e\u003c/em\u003e AS ( \u003cem\u003e\u003ccode\u003ewindow_definition\u003c/code\u003e\u003c/em\u003e ) [, ...]\n\u003c/pre\u003e\u003cp\u003e其中，\u003cem\u003e\u003ccode\u003ewindow_name\u003c/code\u003e\u003c/em\u003e 是一个名称，可从 \u003ccode\u003eOVER\u003c/code\u003e 子句或后续窗口定义中引用，而 \u003cem\u003e\u003ccode\u003ewindow_definition\u003c/code\u003e\u003c/em\u003e 的定义为：\u003c/p\u003e\u003cpre\u003e[ \u003cem\u003e\u003ccode\u003eexisting_window_name\u003c/code\u003e\u003c/em\u003e ]\n[ PARTITION BY \u003cem\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e [, ...] ]\n[ ORDER BY \u003cem\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e [ ASC | DESC | USING \u003cem\u003e\u003ccode\u003eoperator\u003c/code\u003e\u003c/em\u003e ] [ NULLS { FIRST | LAST } ] [, ...] ]\n[ \u003cem\u003e\u003ccode\u003eframe_clause\u003c/code\u003e\u003c/em\u003e ]\n\u003c/pre\u003e\u003cp\u003e如果指定了一个\u003cem\u003e\u003ccode\u003eexisting_window_name\u003c/code\u003e\u003c/em\u003e，它必须引用\u003ccode\u003eWINDOW\u003c/code\u003e列表中一个更早出现的项。新窗口将从该项中复制它的分区子句，以及排序子句（如果有）。在这种情况下，新窗口不能指定它自己的\u003ccode\u003ePARTITION BY\u003c/code\u003e子句，并且只有在被复制的窗口没有\u003ccode\u003eORDER BY\u003c/code\u003e子句时，才可以指定 \u003ccode\u003eORDER BY\u003c/code\u003e。新窗口总是使用自己的帧子句，而被复制的窗口不得指定帧子句。\u003c/p\u003e\u003cp\u003e\u003ccode\u003ePARTITION BY\u003c/code\u003e列表元素的解释以 \u003ca href=\"/docs/18/sql-select.html#SQL-GROUPBY\" title=\"GROUP BY 子句\" rel=\"nofollow\"\u003e\u003ccode\u003eGROUP BY\u003c/code\u003e\u003c/a\u003e子句元素的方式进行，不过它们总是简单表达式并且绝不能是输出列的名称或编号。另一个区别是这些表达式可以包含聚合函数调用，而这在常规\u003ccode\u003eGROUP BY\u003c/code\u003e 子句中是不被允许的。它们被允许的原因是窗口是出现在分组和聚合之后的。\u003c/p\u003e\u003cp\u003e类似地，\u003ccode\u003eORDER BY\u003c/code\u003e列表元素的解释也以语句级 \u003ca href=\"/docs/18/sql-select.html#SQL-ORDERBY\" title=\"ORDER BY 子句\" rel=\"nofollow\"\u003e\u003ccode\u003eORDER BY\u003c/code\u003e\u003c/a\u003e子句元素的方式进行，不过该表达式总是被当做简单表达式并且绝不会是输出列的名称或编号。\u003c/p\u003e\u003cp\u003e可选的\u003cem\u003e\u003ccode\u003eframe_clause\u003c/code\u003e\u003c/em\u003e为依赖于帧的窗口函数定义\u003cem\u003e窗口帧\u003c/em\u003e（并非所有窗口函数都依赖于帧）。对于查询中的每一行（称为\u003cem\u003e当前行\u003c/em\u003e），窗口帧都是一组相关行。\u003cem\u003e\u003ccode\u003eframe_clause\u003c/code\u003e\u003c/em\u003e可以是\u003c/p\u003e\u003cpre\u003e{ RANGE | ROWS | GROUPS } \u003cem\u003e\u003ccode\u003eframe_start\u003c/code\u003e\u003c/em\u003e [ \u003cem\u003e\u003ccode\u003eframe_exclusion\u003c/code\u003e\u003c/em\u003e ]\n{ RANGE | ROWS | GROUPS } BETWEEN \u003cem\u003e\u003ccode\u003eframe_start\u003c/code\u003e\u003c/em\u003e AND \u003cem\u003e\u003ccode\u003eframe_end\u003c/code\u003e\u003c/em\u003e [ \u003cem\u003e\u003ccode\u003eframe_exclusion\u003c/code\u003e\u003c/em\u003e ]\n\u003c/pre\u003e\u003cp\u003e之一，其中\u003cem\u003e\u003ccode\u003eframe_start\u003c/code\u003e\u003c/em\u003e和\u003cem\u003e\u003ccode\u003eframe_end\u003c/code\u003e\u003c/em\u003e可以是\u003c/p\u003e\u003cpre\u003eUNBOUNDED PRECEDING\n\u003cem\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e PRECEDING\nCURRENT ROW\n\u003cem\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e FOLLOWING\nUNBOUNDED FOLLOWING\n\u003c/pre\u003e\u003cp\u003e之一，并且\u003cem\u003e\u003ccode\u003eframe_exclusion\u003c/code\u003e\u003c/em\u003e可以是\u003c/p\u003e\u003cpre\u003eEXCLUDE CURRENT ROW\nEXCLUDE GROUP\nEXCLUDE TIES\nEXCLUDE NO OTHERS\n\u003c/pre\u003e\u003cp\u003e之一。如果省略\u003cem\u003e\u003ccode\u003eframe_end\u003c/code\u003e\u003c/em\u003e，则默认值为 \u003ccode\u003eCURRENT ROW\u003c/code\u003e。限制条件是：\u003cem\u003e\u003ccode\u003eframe_start\u003c/code\u003e\u003c/em\u003e不能是\u003ccode\u003eUNBOUNDED FOLLOWING\u003c/code\u003e，\u003cem\u003e\u003ccode\u003eframe_end\u003c/code\u003e\u003c/em\u003e不能是\u003ccode\u003eUNBOUNDED PRECEDING\u003c/code\u003e，并且在上述\u003cem\u003e\u003ccode\u003eframe_start\u003c/code\u003e\u003c/em\u003e和 \u003cem\u003e\u003ccode\u003eframe_end\u003c/code\u003e\u003c/em\u003e选项列表中，\u003cem\u003e\u003ccode\u003eframe_end\u003c/code\u003e\u003c/em\u003e的选择不能早于 \u003cem\u003e\u003ccode\u003eframe_start\u003c/code\u003e\u003c/em\u003e的选择；例如 \u003ccode\u003eRANGE BETWEEN CURRENT ROW AND \u003cem\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e PRECEDING\u003c/code\u003e是不被允许的。\u003c/p\u003e\u003cp\u003e默认的帧选项是\u003ccode\u003eRANGE UNBOUNDED PRECEDING\u003c/code\u003e，它等同于 \u003ccode\u003eRANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW\u003c/code\u003e；它将帧设置为从分区起始处一直到当前行最后一个\u003cem\u003e同等\u003c/em\u003e行的所有行（所谓同等行，是指在该窗口的\u003ccode\u003eORDER BY\u003c/code\u003e子句看来与当前行等价的行；如果没有\u003ccode\u003eORDER BY\u003c/code\u003e，则所有行都互为同等行）。一般来说，\u003ccode\u003eUNBOUNDED PRECEDING\u003c/code\u003e表示帧从分区的第一行开始，类似地，\u003ccode\u003eUNBOUNDED FOLLOWING\u003c/code\u003e表示帧到分区的最后一行结束，与使用\u003ccode\u003eRANGE\u003c/code\u003e、\u003ccode\u003eROWS\u003c/code\u003e还是\u003ccode\u003eGROUPS\u003c/code\u003e 模式无关。在\u003ccode\u003eROWS\u003c/code\u003e模式中，\u003ccode\u003eCURRENT ROW\u003c/code\u003e表示帧从当前行开始或在当前行结束；而在\u003ccode\u003eRANGE\u003c/code\u003e或 \u003ccode\u003eGROUPS\u003c/code\u003e模式中，它表示帧从当前行在 \u003ccode\u003eORDER BY\u003c/code\u003e排序中的第一个同等行开始，或在最后一个同等行结束。\u003cem\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e \u003ccode\u003ePRECEDING\u003c/code\u003e和 \u003cem\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e \u003ccode\u003eFOLLOWING\u003c/code\u003e选项的含义会随帧模式而变化。在\u003ccode\u003eROWS\u003c/code\u003e模式中，\u003cem\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e是一个整数，表示帧从当前行之前或之后多少行开始或结束。在\u003ccode\u003eGROUPS\u003c/code\u003e模式中，\u003cem\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e是一个整数，表示帧从当前行所在同等行组之前或之后多少个同等行组开始或结束，其中\u003cem\u003e同等行组\u003c/em\u003e是按窗口 \u003ccode\u003eORDER BY\u003c/code\u003e子句判断等价的一组行。在\u003ccode\u003eRANGE\u003c/code\u003e 模式中，使用\u003cem\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e选项要求窗口定义中恰好有一个 \u003ccode\u003eORDER BY\u003c/code\u003e列。此时，帧包含的行满足：其排序列值与当前行的排序列值相比，向小的方向（对于 \u003ccode\u003ePRECEDING\u003c/code\u003e）或向大的方向（对于\u003ccode\u003eFOLLOWING\u003c/code\u003e）的差距不超过\u003cem\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e。在这些情况下，\u003cem\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e表达式的数据类型取决于排序列的数据类型。对于数值排序列，它通常与排序列类型相同；对于日期/时间排序列，则为 \u003ccode\u003einterval\u003c/code\u003e。在上述所有情况下，\u003cem\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e的值都必须非空且非负。此外，虽然 \u003cem\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e不必是简单常量，但它不能包含变量、聚合函数或窗口函数。\u003c/p\u003e\u003cp\u003e\u003cem\u003e\u003ccode\u003eframe_exclusion\u003c/code\u003e\u003c/em\u003e选项允许当前行周围的行被排除在帧之外，即便根据帧的开始和结束选项应该把它们包括在帧中。\u003ccode\u003eEXCLUDE CURRENT ROW\u003c/code\u003e会把当前行排除在帧之外。\u003ccode\u003eEXCLUDE GROUP\u003c/code\u003e会把当前行以及它在顺序上的同等行都排除在帧之外。\u003ccode\u003eEXCLUDE TIES\u003c/code\u003e把当前行的任何同等行都从帧中排除，但不排除当前行本身。\u003ccode\u003eEXCLUDE NO OTHERS\u003c/code\u003e只是明确地指定不排除当前行或其同等行的这种默认行为。\u003c/p\u003e\u003cp\u003e注意，如果\u003ccode\u003eORDER BY\u003c/code\u003e排序无法把行唯一地排序，则\u003ccode\u003eROWS\u003c/code\u003e模式可能产生不可预测的结果。\u003ccode\u003eRANGE\u003c/code\u003e以及\u003ccode\u003eGROUPS\u003c/code\u003e模式的目的是确保在\u003ccode\u003eORDER BY\u003c/code\u003e顺序中同等行被同样对待：一个给定同等行组中的所有行将在一个帧中或者被从帧中排除。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eWINDOW\u003c/code\u003e子句的目的是指定出现在查询的 \u003ca href=\"/docs/18/sql-select.html#SQL-SELECT-LIST\" title=\"SELECT 列表\" rel=\"nofollow\"\u003e\u003ccode\u003eSELECT\u003c/code\u003e列表\u003c/a\u003e或 \u003ca href=\"/docs/18/sql-select.html#SQL-ORDERBY\" title=\"ORDER BY 子句\" rel=\"nofollow\"\u003e\u003ccode\u003eORDER BY\u003c/code\u003e\u003c/a\u003e子句中的\u003cem\u003e窗口函数\u003c/em\u003e的行为。这些函数可以在它们的 \u003ccode\u003eOVER\u003c/code\u003e子句中用名称引用\u003ccode\u003eWINDOW\u003c/code\u003e 子句项。不过，\u003ccode\u003eWINDOW\u003c/code\u003e子句项不是必须被引用。如果在查询中没有用到它，它会被简单地忽略。可以使用根本没有任何 \u003ccode\u003eWINDOW\u003c/code\u003e子句的窗口函数，因为窗口函数调用可以直接在其\u003ccode\u003eOVER\u003c/code\u003e子句中指定它的窗口定义。不过，当多个窗口函数都需要相同的窗口定义时，\u003ccode\u003eWINDOW\u003c/code\u003e子句能够减少输入量。\u003c/p\u003e\u003cp\u003e当前，\u003ccode\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode\u003eFOR UPDATE\u003c/code\u003e、\u003ccode\u003eFOR SHARE\u003c/code\u003e和\u003ccode\u003eFOR KEY SHARE\u003c/code\u003e不能和 \u003ccode\u003eWINDOW\u003c/code\u003e一起被指定。\u003c/p\u003e\u003cp\u003e窗口函数的详细描述在\u003ca href=\"/docs/18/tutorial-window.html\" rel=\"nofollow\"\u003e第 3.5 节\u003c/a\u003e、\u003ca href=\"/docs/18/sql-expressions.html#SYNTAX-WINDOW-FUNCTIONS\" rel=\"nofollow\"\u003e第 4.2.8 节\u003c/a\u003e以及\u003ca href=\"/docs/18/queries-table-expressions.html#QUERIES-WINDOW\" rel=\"nofollow\"\u003e第 7.2.5 节\u003c/a\u003e中。\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ccode\u003eSELECT\u003c/code\u003e 列表\u003c/h3\u003e\u003cp\u003e\u003ccode\u003eSELECT\u003c/code\u003e列表（位于关键词 \u003ccode\u003eSELECT\u003c/code\u003e和\u003ccode\u003eFROM\u003c/code\u003e之间）指定构成 \u003ccode\u003eSELECT\u003c/code\u003e语句输出行的表达式。这些表达式可以（并且通常确实会）引用\u003ccode\u003eFROM\u003c/code\u003e子句中计算得到的列。\u003c/p\u003e\u003cp\u003e正如在表中一样，\u003ccode\u003eSELECT\u003c/code\u003e的每一个输出列都有一个名称。在一个简单的\u003ccode\u003eSELECT\u003c/code\u003e中，这个名称只是被用来标记要显示的列，但是当\u003ccode\u003eSELECT\u003c/code\u003e是一个大型查询的一个子查询时，大型查询会把该名称看做子查询产生的虚表的列名。要指定用于输出列的名称，在该列的表达式后面写上 \u003ccode\u003eAS\u003c/code\u003e \u003cem\u003e\u003ccode\u003eoutput_name\u003c/code\u003e\u003c/em\u003e（你可以省略\u003ccode\u003eAS\u003c/code\u003e，但只能在期望的输出名称不匹配任何 \u003cspan\u003ePostgreSQL\u003c/span\u003e关键词（见\u003ca href=\"/docs/18/sql-keywords-appendix.html\" rel=\"nofollow\"\u003e附录 C\u003c/a\u003e）时省略。为了避免和未来增加的关键词冲突，推荐总是写上\u003ccode\u003eAS\u003c/code\u003e或者用双引号引用输出名称）。如果你不指定列名，\u003cspan\u003ePostgreSQL\u003c/span\u003e会自动选择一个名称。如果列的表达式是一个简单的列引用，那么被选择的名称就和该列的名称相同。在更复杂的情况下，可能使用函数名或类型名，系统也可能退而使用自动生成的名称，例如\u003ccode\u003e?column?\u003c/code\u003e。\u003c/p\u003e\u003cp\u003e一个输出列的名称可以被用来在\u003ccode\u003eORDER BY\u003c/code\u003e以及 \u003ccode\u003eGROUP BY\u003c/code\u003e子句中引用该列的值，但是不能用于 \u003ccode\u003eWHERE\u003c/code\u003e和\u003ccode\u003eHAVING\u003c/code\u003e子句（在其中必须写出表达式）。\u003c/p\u003e\u003cp\u003e可以在输出列表中写\u003ccode\u003e*\u003c/code\u003e来取代表达式，它是被选中行的所有列的一种简写方式。还可以写 \u003ccode\u003e\u003cem\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e.*\u003c/code\u003e，它是只来自那个表的所有列的简写形式。在这些情况中无法用 \u003ccode\u003eAS\u003c/code\u003e指定新的名称，输出列的名称将和表列的名称相同。\u003c/p\u003e\u003cp\u003e按照 SQL 标准，输出列表中的表达式应当在应用\u003ccode\u003eDISTINCT\u003c/code\u003e、\u003ccode\u003eORDER BY\u003c/code\u003e或\u003ccode\u003eLIMIT\u003c/code\u003e之前计算。对于 \u003ccode\u003eDISTINCT\u003c/code\u003e来说，这显然是必要的，否则就不清楚究竟要对哪些值去重。不过，在很多情况下，如果先执行\u003ccode\u003eORDER BY\u003c/code\u003e和 \u003ccode\u003eLIMIT\u003c/code\u003e再计算输出表达式会更方便，特别是当输出列表中包含可变函数或代价高昂的函数时。那样一来，函数求值的顺序更符合直觉，也不会去计算那些根本不会出现在输出中的行。只要输出表达式没有被 \u003ccode\u003eDISTINCT\u003c/code\u003e、\u003ccode\u003eORDER BY\u003c/code\u003e或 \u003ccode\u003eGROUP BY\u003c/code\u003e引用，\u003cspan\u003ePostgreSQL\u003c/span\u003e 实际上就会在排序和限制行数之后再计算它们。（反例是 \u003ccode\u003eSELECT f(x) FROM tab ORDER BY 1\u003c/code\u003e，它显然必须在排序前计算\u003ccode\u003ef(x)\u003c/code\u003e。）包含集合返回函数的输出表达式则实际上会在排序之后、限制之前计算，这样\u003ccode\u003eLIMIT\u003c/code\u003e才能截断该集合返回函数产生的输出。\u003c/p\u003e\u003cdiv\u003e\u003ch3\u003e注意\u003c/h3\u003e\u003cp\u003e9.6 版本之前的\u003cspan\u003ePostgreSQL\u003c/span\u003e不对执行输出表达式、排序、限制行数的时间顺序做任何保证，那将取决于被选中的查询计划的形式。\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ccode\u003eDISTINCT\u003c/code\u003e 子句\u003c/h3\u003e\u003cp\u003e如果指定了\u003ccode\u003eSELECT DISTINCT\u003c/code\u003e，所有重复的行会被从结果集中移除（为每一组重复的行保留一行）。\u003ccode\u003eSELECT ALL\u003c/code\u003e则指定相反的行为：所有行都会被保留，这也是默认情况。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eSELECT DISTINCT ON ( \u003cem\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e [, ...] )\u003c/code\u003e 只保留在给定表达式上计算相等的行集合中的第一行。\u003ccode\u003eDISTINCT ON\u003c/code\u003e表达式使用和 \u003ccode\u003eORDER BY\u003c/code\u003e相同的规则（见上文）解释。注意，除非用 \u003ccode\u003eORDER BY\u003c/code\u003e来确保所期望的行出现在第一位，每一个集合的\u003cspan\u003e“\u003cspan\u003e第一行\u003c/span\u003e”\u003c/span\u003e是不可预测的。例如：\u003c/p\u003e\u003cpre\u003eSELECT DISTINCT ON (location) location, time, report\n    FROM weather_reports\n    ORDER BY location, time DESC;\n\u003c/pre\u003e\u003cp\u003e为每个地点检索最近的天气报告。但是如果我们不使用 \u003ccode\u003eORDER BY\u003c/code\u003e来强制对每个地点的时间值进行降序排序，我们为每个地点得到的报告的时间可能是无法预测的。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eDISTINCT ON\u003c/code\u003e表达式必须匹配最左边的 \u003ccode\u003eORDER BY\u003c/code\u003e表达式。\u003ccode\u003eORDER BY\u003c/code\u003e子句通常将包含额外的表达式，这些额外的表达式用于决定在每一个 \u003ccode\u003eDISTINCT ON\u003c/code\u003e分组内行的优先级。\u003c/p\u003e\u003cp\u003e当前，\u003ccode\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode\u003eFOR UPDATE\u003c/code\u003e、\u003ccode\u003eFOR SHARE\u003c/code\u003e和\u003ccode\u003eFOR KEY SHARE\u003c/code\u003e不能和 \u003ccode\u003eDISTINCT\u003c/code\u003e一起使用。\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ccode\u003eUNION\u003c/code\u003e 子句\u003c/h3\u003e\u003cp\u003e\u003ccode\u003eUNION\u003c/code\u003e子句的一般形式如下：\u003c/p\u003e\u003cpre\u003e\u003cem\u003e\u003ccode\u003eselect_statement\u003c/code\u003e\u003c/em\u003e UNION [ ALL | DISTINCT ] \u003cem\u003e\u003ccode\u003eselect_statement\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003e\u003cem\u003e\u003ccode\u003eselect_statement\u003c/code\u003e\u003c/em\u003e 是任何没有\u003ccode\u003eORDER BY\u003c/code\u003e、\u003ccode\u003eLIMIT\u003c/code\u003e、\u003ccode\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode\u003eFOR UPDATE\u003c/code\u003e、\u003ccode\u003eFOR SHARE\u003c/code\u003e和\u003ccode\u003eFOR KEY SHARE\u003c/code\u003e子句的 \u003ccode\u003eSELECT\u003c/code\u003e语句。（如果某个子表达式被圆括号括起来，\u003ccode\u003eORDER BY\u003c/code\u003e和\u003ccode\u003eLIMIT\u003c/code\u003e可以附加在它上面。如果没有圆括号，这些子句会被视为作用于\u003ccode\u003eUNION\u003c/code\u003e的结果，而不是作用于其右侧输入表达式。）\u003c/p\u003e\u003cp\u003e\u003ccode\u003eUNION\u003c/code\u003e操作符计算相关 \u003ccode\u003eSELECT\u003c/code\u003e语句所返回的行的并集。如果一行至少出现在两个结果集中的一个内，它就会在并集中。作为 \u003ccode\u003eUNION\u003c/code\u003e两个操作数的 \u003ccode\u003eSELECT\u003c/code\u003e语句必须产生相同数量的列并且对应位置上的列必须具有兼容的数据类型。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eUNION\u003c/code\u003e的结果不会包含重复行，除非指定了 \u003ccode\u003eALL\u003c/code\u003e选项。\u003ccode\u003eALL\u003c/code\u003e会阻止消除重复（因此，\u003ccode\u003eUNION ALL\u003c/code\u003e通常显著地快于\u003ccode\u003eUNION\u003c/code\u003e，尽量使用\u003ccode\u003eALL\u003c/code\u003e）。也可以写上\u003ccode\u003eDISTINCT\u003c/code\u003e，以显式指定默认的去重行为。\u003c/p\u003e\u003cp\u003e除非用圆括号指定计算顺序，同一个\u003ccode\u003eSELECT\u003c/code\u003e语句中的多个 \u003ccode\u003eUNION\u003c/code\u003e操作符会从左至右计算。\u003c/p\u003e\u003cp\u003e当前，\u003ccode\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode\u003eFOR UPDATE\u003c/code\u003e、\u003ccode\u003eFOR SHARE\u003c/code\u003e和 \u003ccode\u003eFOR KEY SHARE\u003c/code\u003e不能用于\u003ccode\u003eUNION\u003c/code\u003e结果或者 \u003ccode\u003eUNION\u003c/code\u003e的任何输入。\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ccode\u003eINTERSECT\u003c/code\u003e 子句\u003c/h3\u003e\u003cp\u003e\u003ccode\u003eINTERSECT\u003c/code\u003e子句的一般形式如下：\u003c/p\u003e\u003cpre\u003e\u003cem\u003e\u003ccode\u003eselect_statement\u003c/code\u003e\u003c/em\u003e INTERSECT [ ALL | DISTINCT ] \u003cem\u003e\u003ccode\u003eselect_statement\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003e\u003cem\u003e\u003ccode\u003eselect_statement\u003c/code\u003e\u003c/em\u003e 是任何没有\u003ccode\u003eORDER BY\u003c/code\u003e、\u003ccode\u003eLIMIT\u003c/code\u003e、\u003ccode\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode\u003eFOR UPDATE\u003c/code\u003e、\u003ccode\u003eFOR SHARE\u003c/code\u003e以及\u003ccode\u003eFOR KEY SHARE\u003c/code\u003e子句的 \u003ccode\u003eSELECT\u003c/code\u003e语句。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eINTERSECT\u003c/code\u003e操作符计算相关 \u003ccode\u003eSELECT\u003c/code\u003e语句返回的行的交集。如果一行同时出现在两个结果集中，它就在交集中。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eINTERSECT\u003c/code\u003e的结果不会包含重复行，除非指定了 \u003ccode\u003eALL\u003c/code\u003e选项。如果有\u003ccode\u003eALL\u003c/code\u003e，一个在左表中有 \u003cem\u003e\u003ccode\u003em\u003c/code\u003e\u003c/em\u003e次重复并且在右表中有\u003cem\u003e\u003ccode\u003en\u003c/code\u003e\u003c/em\u003e 次重复的行将会在结果中出现 min(\u003cem\u003e\u003ccode\u003em\u003c/code\u003e\u003c/em\u003e,\u003cem\u003e\u003ccode\u003en\u003c/code\u003e\u003c/em\u003e) 次。也可以写上\u003ccode\u003eDISTINCT\u003c/code\u003e，以显式指定默认的去重行为。\u003c/p\u003e\u003cp\u003e除非用圆括号指定计算顺序，同一个\u003ccode\u003eSELECT\u003c/code\u003e语句中的多个 \u003ccode\u003eINTERSECT\u003c/code\u003e操作符会从左至右计算。\u003ccode\u003eINTERSECT\u003c/code\u003e的优先级比 \u003ccode\u003eUNION\u003c/code\u003e更高。也就是说，\u003ccode\u003eA UNION B INTERSECT C\u003c/code\u003e将被读成\u003ccode\u003eA UNION (B INTERSECT C)\u003c/code\u003e。\u003c/p\u003e\u003cp\u003e当前，\u003ccode\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode\u003eFOR UPDATE\u003c/code\u003e、\u003ccode\u003eFOR SHARE\u003c/code\u003e和 \u003ccode\u003eFOR KEY SHARE\u003c/code\u003e不能用于\u003ccode\u003eINTERSECT\u003c/code\u003e结果或者 \u003ccode\u003eINTERSECT\u003c/code\u003e的任何输入。\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ccode\u003eEXCEPT\u003c/code\u003e 子句\u003c/h3\u003e\u003cp\u003e\u003ccode\u003eEXCEPT\u003c/code\u003e子句的一般形式如下：\u003c/p\u003e\u003cpre\u003e\u003cem\u003e\u003ccode\u003eselect_statement\u003c/code\u003e\u003c/em\u003e EXCEPT [ ALL | DISTINCT ] \u003cem\u003e\u003ccode\u003eselect_statement\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003e\u003cem\u003e\u003ccode\u003eselect_statement\u003c/code\u003e\u003c/em\u003e 是任何没有\u003ccode\u003eORDER BY\u003c/code\u003e、\u003ccode\u003eLIMIT\u003c/code\u003e、\u003ccode\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode\u003eFOR UPDATE\u003c/code\u003e、\u003ccode\u003eFOR SHARE\u003c/code\u003e以及\u003ccode\u003eFOR KEY SHARE\u003c/code\u003e子句的 \u003ccode\u003eSELECT\u003c/code\u003e语句。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eEXCEPT\u003c/code\u003e操作符计算位于左侧 \u003ccode\u003eSELECT\u003c/code\u003e语句的结果中但不在右 \u003ccode\u003eSELECT\u003c/code\u003e语句结果中的行集合。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eEXCEPT\u003c/code\u003e的结果不会包含重复行，除非指定了 \u003ccode\u003eALL\u003c/code\u003e选项。如果有\u003ccode\u003eALL\u003c/code\u003e，一个在左表中有 \u003cem\u003e\u003ccode\u003em\u003c/code\u003e\u003c/em\u003e次重复并且在右表中有 \u003cem\u003e\u003ccode\u003en\u003c/code\u003e\u003c/em\u003e次重复的行将会在结果集中出现 max(\u003cem\u003e\u003ccode\u003em\u003c/code\u003e\u003c/em\u003e-\u003cem\u003e\u003ccode\u003en\u003c/code\u003e\u003c/em\u003e,0) 次。也可以写上\u003ccode\u003eDISTINCT\u003c/code\u003e，以显式指定默认的去重行为。\u003c/p\u003e\u003cp\u003e除非用圆括号指定计算顺序，同一个\u003ccode\u003eSELECT\u003c/code\u003e语句中的多个 \u003ccode\u003eEXCEPT\u003c/code\u003e操作符会从左至右计算。\u003ccode\u003eEXCEPT\u003c/code\u003e的优先级与 \u003ccode\u003eUNION\u003c/code\u003e相同。\u003c/p\u003e\u003cp\u003e当前，\u003ccode\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode\u003eFOR UPDATE\u003c/code\u003e、\u003ccode\u003eFOR SHARE\u003c/code\u003e和 \u003ccode\u003eFOR KEY SHARE\u003c/code\u003e不能用于\u003ccode\u003eEXCEPT\u003c/code\u003e结果或者 \u003ccode\u003eEXCEPT\u003c/code\u003e的任何输入。\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ccode\u003eORDER BY\u003c/code\u003e 子句\u003c/h3\u003e\u003cp\u003e可选的\u003ccode\u003eORDER BY\u003c/code\u003e子句的形式如下：\u003c/p\u003e\u003cpre\u003eORDER BY \u003cem\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e [ ASC | DESC | USING \u003cem\u003e\u003ccode\u003eoperator\u003c/code\u003e\u003c/em\u003e ] [ NULLS { FIRST | LAST } ] [, ...]\n\u003c/pre\u003e\u003cp\u003e\u003ccode\u003eORDER BY\u003c/code\u003e子句导致结果行被按照指定的表达式排序。如果两行按照最左边的表达式是相等的，则会根据下一个表达式比较它们，依次类推。如果按照所有指定的表达式它们都是相等的，则它们被返回的顺序取决于实现。\u003c/p\u003e\u003cp\u003e每一个\u003cem\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e 可以是输出列（\u003ccode\u003eSELECT\u003c/code\u003e列表项）的名称或者序号，它也可以是由输入列值构成的任意表达式。\u003c/p\u003e\u003cp\u003e序号指的是输出列的顺序（从左至右）位置。这种特性可以为不具有唯一名称的列定义一个顺序。这不是绝对必要的，因为总是可以使用 \u003ccode\u003eAS\u003c/code\u003e子句为输出列赋予一个名称。\u003c/p\u003e\u003cp\u003e也可以在\u003ccode\u003eORDER BY\u003c/code\u003e子句中使用任意表达式，包括没有出现在\u003ccode\u003eSELECT\u003c/code\u003e输出列表中的列。因此，下面的语句是合法的：\u003c/p\u003e\u003cpre\u003eSELECT name FROM distributors ORDER BY code;\n\u003c/pre\u003e\u003cp\u003e这种特性的一个限制是一个应用在\u003ccode\u003eUNION\u003c/code\u003e、\u003ccode\u003eINTERSECT\u003c/code\u003e或\u003ccode\u003eEXCEPT\u003c/code\u003e子句结果上的 \u003ccode\u003eORDER BY\u003c/code\u003e只能指定输出列名称或序号，但不能指定表达式。\u003c/p\u003e\u003cp\u003e如果一个\u003ccode\u003eORDER BY\u003c/code\u003e表达式是一个既匹配输出列名称又匹配输入列名称的简单名称，\u003ccode\u003eORDER BY\u003c/code\u003e将把它解读成输出列名称。这与在同样情况下\u003ccode\u003eGROUP BY\u003c/code\u003e会做出的选择相反。这种不一致是为了与 SQL 标准兼容。\u003c/p\u003e\u003cp\u003e可以在\u003ccode\u003eORDER BY\u003c/code\u003e子句中任一表达式之后附加关键字 \u003ccode\u003eASC\u003c/code\u003e（升序）或\u003ccode\u003eDESC\u003c/code\u003e（降序）。如果没有指定，\u003ccode\u003eASC\u003c/code\u003e被假定为默认值。或者，可以在\u003ccode\u003eUSING\u003c/code\u003e 子句中指定一个特定的排序操作符名称。一个排序操作符必须是某个 B-树操作符族的小于或者大于成员。\u003ccode\u003eASC\u003c/code\u003e通常等价于 \u003ccode\u003eUSING \u0026lt;\u003c/code\u003e而\u003ccode\u003eDESC\u003c/code\u003e通常等价于 \u003ccode\u003eUSING \u0026gt;\u003c/code\u003e（但是一种用户定义数据类型的创建者可以准确地定义默认排序顺序是什么，并且它可能会对应于其他名称的操作符）。\u003c/p\u003e\u003cp\u003e如果指定\u003ccode\u003eNULLS LAST\u003c/code\u003e，空值会排在非空值之后；如果指定 \u003ccode\u003eNULLS FIRST\u003c/code\u003e，空值会排在非空值之前。如果都没有指定，在指定或者隐含\u003ccode\u003eASC\u003c/code\u003e时的默认行为是\u003ccode\u003eNULLS LAST\u003c/code\u003e，而指定\u003ccode\u003eDESC\u003c/code\u003e时的默认行为是 \u003ccode\u003eNULLS FIRST\u003c/code\u003e（因此，默认行为是空值大于非空值）。当指定\u003ccode\u003eUSING\u003c/code\u003e时，默认的空值顺序取决于该操作符是否为小于或者大于操作符。\u003c/p\u003e\u003cp\u003e注意顺序选项只应用到它们所跟随的表达式上。例如 \u003ccode\u003eORDER BY x, y DESC\u003c/code\u003e和 \u003ccode\u003eORDER BY x DESC, y DESC\u003c/code\u003e是不同的。\u003c/p\u003e\u003cp\u003e字符串数据会按适用于被排序列的排序规则来排序。根据需要可以通过在 \u003cem\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e中包括一个 \u003ccode\u003eCOLLATE\u003c/code\u003e子句来覆盖，例如 \u003ccode\u003eORDER BY mycolumn COLLATE \u0026#34;en_US\u0026#34;\u003c/code\u003e。更多信息请见\u003ca href=\"/docs/18/sql-expressions.html#SQL-SYNTAX-COLLATE-EXPRS\" rel=\"nofollow\"\u003e第 4.2.10 节\u003c/a\u003e和\u003ca href=\"/docs/18/collation.html\" rel=\"nofollow\"\u003e第 23.2 节\u003c/a\u003e。\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ccode\u003eLIMIT\u003c/code\u003e 子句\u003c/h3\u003e\u003cp\u003e该 \u003ccode\u003eLIMIT\u003c/code\u003e 子句由两个独立的子句组成：\u003c/p\u003e\u003cpre\u003eLIMIT { \u003cem\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e | ALL }\nOFFSET \u003cem\u003e\u003ccode\u003estart\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003e参数 \u003cem\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e 指定最多返回多少行，而 \u003cem\u003e\u003ccode\u003estart\u003c/code\u003e\u003c/em\u003e 指定开始返回行之前要跳过的行数。如果两者都指定，则先跳过 \u003cem\u003e\u003ccode\u003estart\u003c/code\u003e\u003c/em\u003e 行，然后开始计数并返回 \u003cem\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e 行。\u003c/p\u003e\u003cp\u003e如果 \u003cem\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e 表达式计算结果为 NULL，则视为 \u003ccode\u003eLIMIT ALL\u003c/code\u003e，即不限制。如果 \u003cem\u003e\u003ccode\u003estart\u003c/code\u003e\u003c/em\u003e 计算结果为 NULL，则等同于 \u003ccode\u003eOFFSET 0\u003c/code\u003e。\u003c/p\u003e\u003cp\u003eSQL:2008 引入了另一种实现相同结果的语法，\u003cspan\u003ePostgreSQL\u003c/span\u003e 也支持它。其形式如下：\u003c/p\u003e\u003cpre\u003eOFFSET \u003cem\u003e\u003ccode\u003estart\u003c/code\u003e\u003c/em\u003e { ROW | ROWS }\nFETCH { FIRST | NEXT } [ \u003cem\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e ] { ROW | ROWS } { ONLY | WITH TIES }\n\u003c/pre\u003e\u003cp\u003e在这种语法中，标准要求 \u003cem\u003e\u003ccode\u003estart\u003c/code\u003e\u003c/em\u003e 或 \u003cem\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e 的值必须是字面常量、参数或变量名；作为 \u003cspan\u003ePostgreSQL\u003c/span\u003e 的扩展，也允许其他表达式，但通常需要用圆括号将其括起以避免歧义。如果 \u003cem\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e 在 \u003ccode\u003eFETCH\u003c/code\u003e 子句中省略，则默认值为 1。\u003ccode\u003eWITH TIES\u003c/code\u003e 选项用于返回那些按照 \u003ccode\u003eORDER BY\u003c/code\u003e 子句排序后与结果集最后一位并列的其他行；\u003ccode\u003eORDER BY\u003c/code\u003e 在这种情况下是必需的，而且 \u003ccode\u003eSKIP LOCKED\u003c/code\u003e 不允许使用。\u003ccode\u003eROW\u003c/code\u003e 和 \u003ccode\u003eROWS\u003c/code\u003e 以及 \u003ccode\u003eFIRST\u003c/code\u003e 和 \u003ccode\u003eNEXT\u003c/code\u003e 都是噪声词，不会影响这些子句的效果。按照标准，\u003ccode\u003eOFFSET\u003c/code\u003e 子句必须出现在 \u003ccode\u003eFETCH\u003c/code\u003e 子句之前（如果两者都存在）；而 \u003cspan\u003ePostgreSQL\u003c/span\u003e 更宽松，允许任意顺序。\u003c/p\u003e\u003cp\u003e在使用\u003ccode\u003eLIMIT\u003c/code\u003e时，用一个\u003ccode\u003eORDER BY\u003c/code\u003e子句把结果行约束到一个唯一顺序是个好办法。否则你将得到该查询结果行的一个不可预测的子集 — 你可能要求从第 10 到第 20 行，但是在什么顺序下的第 10 到第 20 呢？除非指定\u003ccode\u003eORDER BY\u003c/code\u003e，你是不知道顺序的。\u003c/p\u003e\u003cp\u003e查询规划器在生成一个查询计划时会考虑\u003ccode\u003eLIMIT\u003c/code\u003e，因此根据你使用的\u003ccode\u003eLIMIT\u003c/code\u003e和\u003ccode\u003eOFFSET\u003c/code\u003e，你很可能得到不同的计划（得到不同的行序）。所以，使用不同的 \u003ccode\u003eLIMIT\u003c/code\u003e/\u003ccode\u003eOFFSET\u003c/code\u003e值来选择一个查询结果的不同子集\u003cspan\u003e\u003cem\u003e将会给出不一致的结果\u003c/em\u003e\u003c/span\u003e，除非你用\u003ccode\u003eORDER BY\u003c/code\u003e强制一种可预测的结果顺序。这不是一个缺陷，它是 SQL 不承诺以任何特定顺序（除非使用 \u003ccode\u003eORDER BY\u003c/code\u003e来约束顺序）给出一个查询结果这一事实造成的必然后果。\u003c/p\u003e\u003cp\u003e如果没有一个\u003ccode\u003eORDER BY\u003c/code\u003e来强制选择一个确定的子集，重复执行同样的\u003ccode\u003eLIMIT\u003c/code\u003e查询甚至可能会返回一个表中行的不同子集。同样，这也不是一种缺陷，在这种情况下也无法保证结果的确定性。\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e锁定子句\u003c/h3\u003e\u003cp\u003e\u003ccode\u003eFOR UPDATE\u003c/code\u003e、\u003ccode\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode\u003eFOR SHARE\u003c/code\u003e和\u003ccode\u003eFOR KEY SHARE\u003c/code\u003e 是\u003cem\u003e锁定子句\u003c/em\u003e，它们影响\u003ccode\u003eSELECT\u003c/code\u003e 把行从表中取得时如何对它们加锁。\u003c/p\u003e\u003cp\u003e锁定子句的一般形式为：\u003c/p\u003e\u003cpre\u003eFOR \u003cem\u003e\u003ccode\u003elock_strength\u003c/code\u003e\u003c/em\u003e [ OF \u003cem\u003e\u003ccode\u003efrom_reference\u003c/code\u003e\u003c/em\u003e [, ...] ] [ NOWAIT | SKIP LOCKED ]\n\u003c/pre\u003e\u003cp\u003e其中，\u003cem\u003e\u003ccode\u003elock_strength\u003c/code\u003e\u003c/em\u003e可以是以下值之一：\u003c/p\u003e\u003cpre\u003eUPDATE\nNO KEY UPDATE\nSHARE\nKEY SHARE\n\u003c/pre\u003e\u003cp\u003e\u003cem\u003e\u003ccode\u003efrom_reference\u003c/code\u003e\u003c/em\u003e必须是 \u003ccode\u003eFROM\u003c/code\u003e 子句中被引用的表\u003cem\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e 或非隐藏的\u003cem\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e。更多关于每一种行级锁模式的信息可见\u003ca href=\"/docs/18/explicit-locking.html#LOCKING-ROWS\" rel=\"nofollow\"\u003e第 13.3.2 节\u003c/a\u003e。\u003c/p\u003e\u003cp\u003e为了防止该操作等待其他事务提交，可使用\u003ccode\u003eNOWAIT\u003c/code\u003e或 \u003ccode\u003eSKIP LOCKED\u003c/code\u003e选项。使用\u003ccode\u003eNOWAIT\u003c/code\u003e时，如果选中的行不能被立即锁定，该语句会直接报错而不是等待。使用 \u003ccode\u003eSKIP LOCKED\u003c/code\u003e时，任何无法立即锁定的已选中行都会被跳过。跳过已锁定行会提供数据的不一致视图，因此不适合一般用途的工作，但可用于避免多个消费者访问类似队列表时的锁竞争。注意，\u003ccode\u003eNOWAIT\u003c/code\u003e和\u003ccode\u003eSKIP LOCKED\u003c/code\u003e只适用于行级锁；所需的\u003ccode\u003eROW SHARE\u003c/code\u003e表级锁仍会按常规方式取得（见\u003ca href=\"/docs/18/mvcc.html\" rel=\"nofollow\"\u003e第 13 章\u003c/a\u003e）。如果想要不等待的表级锁，你可以先使用带\u003ccode\u003eNOWAIT\u003c/code\u003e的\u003ca href=\"/docs/18/sql-lock.html\" title=\"LOCK\" rel=\"nofollow\"\u003e\u003ccode\u003eLOCK\u003c/code\u003e\u003c/a\u003e。\u003c/p\u003e\u003cp\u003e如果在一个锁定子句中提到了特定的表，则只有来自于那些表的行会被锁定，任何\u003ccode\u003eSELECT\u003c/code\u003e中用到的其他表还是被简单地照常读取。一个没有表列表的锁定子句会影响该语句中用到的所有表。如果一个锁定子句被应用到一个视图或者子查询，它会影响在该视图或子查询中用到的所有表。不过，这些子句不适用于主查询引用的\u003ccode\u003eWITH\u003c/code\u003e查询。如果你希望在一个\u003ccode\u003eWITH\u003c/code\u003e查询中发生行锁定，应该在该 \u003ccode\u003eWITH\u003c/code\u003e查询内指定一个锁定子句。\u003c/p\u003e\u003cp\u003e如果有必要对不同的表指定不同的锁定行为，可以写多个锁定子句。如果同一个表在多于一个锁定子句中被提到（或者被隐式地影响到），那么会按照所指定的最强的锁定行为来处理它。类似地，如果在任何影响一个表的子句中指定了\u003ccode\u003eNOWAIT\u003c/code\u003e，就会按照 \u003ccode\u003eNOWAIT\u003c/code\u003e的行为来处理该表。否则如果 \u003ccode\u003eSKIP LOCKED\u003c/code\u003e在任何影响该表的子句中被指定，该表就会被按照\u003ccode\u003eSKIP LOCKED\u003c/code\u003e来处理。\u003c/p\u003e\u003cp\u003e如果返回的行无法清楚地与表中的各个行对应起来，就不能使用锁定子句。例如，锁定子句不能与聚合一起使用。\u003c/p\u003e\u003cp\u003e当一个锁定子句出现在一个\u003ccode\u003eSELECT\u003c/code\u003e查询的顶层时，被锁定的行正好就是该查询返回的行。在连接查询的情况下，被锁定的行是那些对返回的连接行有贡献的行。此外，在该查询的快照时满足查询条件的行将被锁定，如果它们在该快照后被更新并且不再满足查询条件，它们将不会被返回。如果使用了\u003ccode\u003eLIMIT\u003c/code\u003e，只要已经返回的行数满足了限制，锁定就会停止（但注意被 \u003ccode\u003eOFFSET\u003c/code\u003e跳过的行将被锁定）。类似地，如果在一个游标的查询中使用锁定子句，只有被该游标实际取出或者跳过的行才将被锁定。\u003c/p\u003e\u003cp\u003e当锁定子句出现在一个子\u003ccode\u003eSELECT\u003c/code\u003e中时，被锁定行是那些该子查询返回给外层查询的行。这些被锁定的行的数量可能比从子查询自身的角度看到的要少，因为来自外层查询的条件可能会被用来优化子查询的执行。例如：\u003c/p\u003e\u003cpre\u003eSELECT * FROM (SELECT * FROM mytable FOR UPDATE) ss WHERE col1 = 5;\n\u003c/pre\u003e\u003cp\u003e将只锁定具有\u003ccode\u003ecol1 = 5\u003c/code\u003e的行（虽然在子查询中并没有写上该条件）。\u003c/p\u003e\u003cp\u003e较早的版本无法保持一个随后在保存点中被升级的锁。例如，下面这段代码：\u003c/p\u003e\u003cpre\u003eBEGIN;\nSELECT * FROM mytable WHERE key = 1 FOR UPDATE;\nSAVEPOINT s;\nUPDATE mytable SET ... WHERE key = 1;\nROLLBACK TO s;\n\u003c/pre\u003e\u003cp\u003e在执行\u003ccode\u003eROLLBACK TO\u003c/code\u003e之后将无法保持 \u003ccode\u003eFOR UPDATE\u003c/code\u003e锁。这个问题已在 9.3 版本中修复。\u003c/p\u003e\u003cdiv\u003e\u003ch3\u003e小心\u003c/h3\u003e\u003cp\u003e一个运行在\u003ccode\u003eREAD COMMITTED\u003c/code\u003e事务隔离级别并且使用\u003ccode\u003eORDER BY\u003c/code\u003e和锁定子句的\u003ccode\u003eSELECT\u003c/code\u003e命令有可能返回无序的行。这是因为\u003ccode\u003eORDER BY\u003c/code\u003e会被首先应用。该命令对结果排序，但是可能接着在尝试获得一行或多行上的锁时阻塞。一旦\u003ccode\u003eSELECT\u003c/code\u003e解除阻塞，某些排序列值可能已经被修改，从而导致那些行变成无序的（尽管它们根据原始列值是有序的）。根据需要，可以通过在子查询中放置 \u003ccode\u003eFOR UPDATE/SHARE\u003c/code\u003e来解决这一问题，例如\u003c/p\u003e\u003cpre\u003eSELECT * FROM (SELECT * FROM mytable FOR UPDATE) ss ORDER BY column1;\n\u003c/pre\u003e\u003cp\u003e注意这将导致锁定\u003ccode\u003emytable\u003c/code\u003e的所有行，而顶层的 \u003ccode\u003eFOR UPDATE\u003c/code\u003e只会锁定实际被返回的行。这可能会导致显著的性能差异，特别是把\u003ccode\u003eORDER BY\u003c/code\u003e与\u003ccode\u003eLIMIT\u003c/code\u003e或者其他限制组合使用时。因此只有在预计会并发更新排序列并且要求严格的排序结果时才推荐使用这种技术。\u003c/p\u003e\u003cp\u003e在\u003ccode\u003eREPEATABLE READ\u003c/code\u003e或\u003ccode\u003eSERIALIZABLE\u003c/code\u003e事务隔离级别下，这将导致串行化失败（\u003ccode\u003eSQLSTATE\u003c/code\u003e为\u003ccode\u003e\u0026#39;40001\u0026#39;\u003c/code\u003e），因此在这些隔离级别下不可能接收到无序的行。\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ccode\u003eTABLE\u003c/code\u003e 命令\u003c/h3\u003e\u003cp\u003e命令\u003c/p\u003e\u003cpre\u003eTABLE \u003cem\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003e等价于\u003c/p\u003e\u003cpre\u003eSELECT * FROM \u003cem\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003e它可以作为顶层命令使用，也可以作为复杂查询中一种节省空间的语法变体。只有 \u003ccode\u003eWITH\u003c/code\u003e、\u003ccode\u003eUNION\u003c/code\u003e、\u003ccode\u003eINTERSECT\u003c/code\u003e、\u003ccode\u003eEXCEPT\u003c/code\u003e、\u003ccode\u003eORDER BY\u003c/code\u003e、\u003ccode\u003eLIMIT\u003c/code\u003e、\u003ccode\u003eOFFSET\u003c/code\u003e、\u003ccode\u003eFETCH\u003c/code\u003e以及\u003ccode\u003eFOR\u003c/code\u003e锁定子句可以用于 \u003ccode\u003eTABLE\u003c/code\u003e。不能使用\u003ccode\u003eWHERE\u003c/code\u003e子句和任何形式的聚合。\u003c/p\u003e\u003c/div\u003e\u003c/section\u003e\u003csection\u003e\u003ch2\u003e示例\u003c/h2\u003e\u003cp\u003e要将表\u003ccode\u003efilms\u003c/code\u003e与表\u003ccode\u003edistributors\u003c/code\u003e连接：\u003c/p\u003e\u003cpre\u003eSELECT f.title, f.did, d.name, f.date_prod, f.kind\n    FROM distributors d JOIN films f USING (did);\n\n       title       | did |     name     | date_prod  |   kind\n-------------------+-----+--------------+------------+----------\n The Third Man     | 101 | British Lion | 1949-12-23 | Drama\n The African Queen | 101 | British Lion | 1951-08-11 | Romantic\n ...\n\u003c/pre\u003e\u003cp\u003e要对所有电影的\u003ccode\u003elen\u003c/code\u003e列求和并且用 \u003ccode\u003ekind\u003c/code\u003e对结果分组：\u003c/p\u003e\u003cpre\u003eSELECT kind, sum(len) AS total FROM films GROUP BY kind;\n\n   kind   | total\n----------+-------\n Action   | 07:34\n Comedy   | 02:58\n Drama    | 14:28\n Musical  | 06:42\n Romantic | 04:38\n\u003c/pre\u003e\u003cp\u003e要对所有电影的\u003ccode\u003elen\u003c/code\u003e列求和、对结果按照 \u003ccode\u003ekind\u003c/code\u003e分组并且显示总长小于 5 小时的分组：\u003c/p\u003e\u003cpre\u003eSELECT kind, sum(len) AS total\n    FROM films\n    GROUP BY kind\n    HAVING sum(len) \u0026lt; interval \u0026#39;5 hours\u0026#39;;\n\n   kind   | total\n----------+-------\n Comedy   | 02:58\n Romantic | 04:38\n\u003c/pre\u003e\u003cp\u003e下面两个示例都是根据第二列（\u003ccode\u003ename\u003c/code\u003e）的内容来排序结果：\u003c/p\u003e\u003cpre\u003eSELECT * FROM distributors ORDER BY name;\nSELECT * FROM distributors ORDER BY 2;\n\n did |       name\n-----+------------------\n 109 | 20th Century Fox\n 110 | Bavaria Atelier\n 101 | British Lion\n 107 | Columbia\n 102 | Jean Luc Godard\n 113 | Luso films\n 104 | Mosfilm\n 103 | Paramount\n 106 | Toho\n 105 | United Artists\n 111 | Walt Disney\n 112 | Warner Bros.\n 108 | Westward\n\u003c/pre\u003e\u003cp\u003e接下来的示例展示了如何得到表\u003ccode\u003edistributors\u003c/code\u003e和 \u003ccode\u003eactors\u003c/code\u003e的并集，把结果限制为那些在每个表中以字母 W 开始的行。这里只需要不重复的行，因此省略了关键词 \u003ccode\u003eALL\u003c/code\u003e。\u003c/p\u003e\u003cpre\u003edistributors:               actors:\n did |     name              id |     name\n-----+--------------        ----+----------------\n 108 | Westward               1 | Woody Allen\n 111 | Walt Disney            2 | Warren Beatty\n 112 | Warner Bros.           3 | Walter Matthau\n ...                         ...\n\nSELECT distributors.name\n    FROM distributors\n    WHERE distributors.name LIKE \u0026#39;W%\u0026#39;\nUNION\nSELECT actors.name\n    FROM actors\n    WHERE actors.name LIKE \u0026#39;W%\u0026#39;;\n\n      name\n----------------\n Walt Disney\n Walter Matthau\n Warner Bros.\n Warren Beatty\n Westward\n Woody Allen\n\u003c/pre\u003e\u003cp\u003e这个示例展示了如何在\u003ccode\u003eFROM\u003c/code\u003e子句中使用函数，分别使用和不使用列定义列表：\u003c/p\u003e\u003cpre\u003eCREATE FUNCTION distributors(int) RETURNS SETOF distributors AS $$\n    SELECT * FROM distributors WHERE did = $1;\n$$ LANGUAGE SQL;\n\nSELECT * FROM distributors(111);\n did |    name\n-----+-------------\n 111 | Walt Disney\n\nCREATE FUNCTION distributors_2(int) RETURNS SETOF record AS $$\n    SELECT * FROM distributors WHERE did = $1;\n$$ LANGUAGE SQL;\n\nSELECT * FROM distributors_2(111) AS (f1 int, f2 text);\n f1  |     f2\n-----+-------------\n 111 | Walt Disney\n\u003c/pre\u003e\u003cp\u003e下面是为函数结果增加序号列的示例：\u003c/p\u003e\u003cpre\u003eSELECT * FROM unnest(ARRAY[\u0026#39;a\u0026#39;,\u0026#39;b\u0026#39;,\u0026#39;c\u0026#39;,\u0026#39;d\u0026#39;,\u0026#39;e\u0026#39;,\u0026#39;f\u0026#39;]) WITH ORDINALITY;\n unnest | ordinality\n--------+----------\n a      |        1\n b      |        2\n c      |        3\n d      |        4\n e      |        5\n f      |        6\n(6 rows)\n\u003c/pre\u003e\u003cp\u003e这个例子展示了如何使用一个简单的 \u003ccode\u003eWITH\u003c/code\u003e 子句：\u003c/p\u003e\u003cpre\u003eWITH t AS (\n    SELECT random() as x FROM generate_series(1, 3)\n  )\nSELECT * FROM t\nUNION ALL\nSELECT * FROM t;\n         x\n--------------------\n  0.534150459803641\n  0.520092216785997\n 0.0735620250925422\n  0.534150459803641\n  0.520092216785997\n 0.0735620250925422\n\u003c/pre\u003e\u003cp\u003e请注意，\u003ccode\u003eWITH\u003c/code\u003e 查询只被求值了一次，因此我们得到了两组相同的三个随机值。\u003c/p\u003e\u003cp\u003e这个示例使用\u003ccode\u003eWITH RECURSIVE\u003c/code\u003e从一个只显示直接下属的表中寻找雇员 Mary 的所有下属（直接的或者间接的）以及他们的间接层数：\u003c/p\u003e\u003cpre\u003eWITH RECURSIVE employee_recursive(distance, employee_name, manager_name) AS (\n    SELECT 1, employee_name, manager_name\n    FROM employee\n    WHERE manager_name = \u0026#39;Mary\u0026#39;\n  UNION ALL\n    SELECT er.distance + 1, e.employee_name, e.manager_name\n    FROM employee_recursive er, employee e\n    WHERE er.employee_name = e.manager_name\n  )\nSELECT distance, employee_name FROM employee_recursive;\n\u003c/pre\u003e\u003cp\u003e注意这种递归查询的典型形式：一个初始条件，后面跟着 \u003ccode\u003eUNION\u003c/code\u003e，然后是查询的递归部分。要确保查询的递归部分最终将不返回任何行，否则该查询将无限循环（更多示例见\u003ca href=\"/docs/18/queries-with.html\" rel=\"nofollow\"\u003e第 7.8 节\u003c/a\u003e）。\u003c/p\u003e\u003cp\u003e这个示例使用\u003ccode\u003eLATERAL\u003c/code\u003e为\u003ccode\u003emanufacturers\u003c/code\u003e 表的每一行应用一个集合返回函数\u003ccode\u003eget_product_names()\u003c/code\u003e：\u003c/p\u003e\u003cpre\u003eSELECT m.name AS mname, pname\nFROM manufacturers m, LATERAL get_product_names(m.id) pname;\n\u003c/pre\u003e\u003cp\u003e当前没有任何产品的制造商不会出现在结果中，因为这是一个内连接。如果我们希望把这类制造商的名称包括在结果中，我们可以：\u003c/p\u003e\u003cpre\u003eSELECT m.name AS mname, pname\nFROM manufacturers m LEFT JOIN LATERAL get_product_names(m.id) pname ON true;\n\u003c/pre\u003e\u003c/section\u003e\u003csection\u003e\u003ch2\u003e兼容性\u003c/h2\u003e\u003cp\u003e当然，\u003ccode\u003eSELECT\u003c/code\u003e语句与 SQL 标准兼容。但它也有一些扩展和缺失的特性。\u003c/p\u003e\u003cdiv\u003e\u003ch3\u003e省略的\u003ccode\u003eFROM\u003c/code\u003e子句\u003c/h3\u003e\u003cp\u003e\u003cspan\u003ePostgreSQL\u003c/span\u003e 允许省略 \u003ccode\u003eFROM\u003c/code\u003e 子句。它可以直接用于计算简单表达式的结果：\u003c/p\u003e\u003cpre\u003eSELECT 2+2;\n\n ?column?\n----------\n        4\n\u003c/pre\u003e\u003cp\u003e其他一些 \u003cacronym\u003eSQL\u003c/acronym\u003e 数据库必须引入一个只有一行的虚拟表，才能从该表执行 \u003ccode\u003eSELECT\u003c/code\u003e。\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e空\u003ccode\u003eSELECT\u003c/code\u003e列表\u003c/h3\u003e\u003cp\u003e\u003ccode\u003eSELECT\u003c/code\u003e之后的输出表达式列表可以为空，这会产生一个零列的结果表。按照 SQL 标准，这不是合法的语法。\u003cspan\u003ePostgreSQL\u003c/span\u003e允许这样做，是为了与允许零列的表保持一致。不过在使用 \u003ccode\u003eDISTINCT\u003c/code\u003e时不允许空列表。\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e省略\u003ccode\u003eAS\u003c/code\u003e关键词\u003c/h3\u003e\u003cp\u003e在 SQL 标准中，只要新列名是一个合法的列名（就是说与任何保留关键词不同），就可以省略输出列名之前的可选关键词\u003ccode\u003eAS\u003c/code\u003e。\u003cspan\u003ePostgreSQL\u003c/span\u003e要稍微严格些：只要新列名匹配任何关键词（保留或者非保留）就需要\u003ccode\u003eAS\u003c/code\u003e。推荐的习惯是使用 \u003ccode\u003eAS\u003c/code\u003e或者带双引号的输出列名来防止与未来增加的关键词可能的冲突。\u003c/p\u003e\u003cp\u003e在\u003ccode\u003eFROM\u003c/code\u003e项中，标准和 \u003cspan\u003ePostgreSQL\u003c/span\u003e都允许在非保留关键字别名前省略\u003ccode\u003eAS\u003c/code\u003e。但是由于语法歧义，这种写法无法用于输出列名。\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e在 \u003ccode\u003eFROM\u003c/code\u003e 中省略子 \u003ccode\u003eSELECT\u003c/code\u003e 别名\u003c/h3\u003e\u003cp\u003e根据 SQL 标准，\u003ccode\u003eFROM\u003c/code\u003e 列表中的子 \u003ccode\u003eSELECT\u003c/code\u003e 必须有别名。在 \u003cspan\u003ePostgreSQL\u003c/span\u003e 中，这个别名可以省略。\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ccode\u003eONLY\u003c/code\u003e与继承\u003c/h3\u003e\u003cp\u003eSQL 标准要求在使用\u003ccode\u003eONLY\u003c/code\u003e时用圆括号括起表名，例如\u003ccode\u003eSELECT * FROM ONLY (tab1), ONLY (tab2) WHERE ...\u003c/code\u003e。\u003cspan\u003ePostgreSQL\u003c/span\u003e认为这些圆括号是可选的。\u003c/p\u003e\u003cp\u003e\u003cspan\u003ePostgreSQL\u003c/span\u003e允许在末尾写上\u003ccode\u003e*\u003c/code\u003e，显式指定包含子表的非\u003ccode\u003eONLY\u003c/code\u003e行为。标准不允许这种写法。\u003c/p\u003e\u003cp\u003e（这些要点同样适用于所有支持\u003ccode\u003eONLY\u003c/code\u003e选项的 SQL 命令。）\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ccode\u003eTABLESAMPLE\u003c/code\u003e子句的限制\u003c/h3\u003e\u003cp\u003e目前只有普通表和物化视图可以使用\u003ccode\u003eTABLESAMPLE\u003c/code\u003e子句。按照 SQL 标准，它应当能够应用于任何\u003ccode\u003eFROM\u003c/code\u003e项。\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ccode\u003eFROM\u003c/code\u003e中的函数调用\u003c/h3\u003e\u003cp\u003e\u003cspan\u003ePostgreSQL\u003c/span\u003e允许把函数调用直接写成 \u003ccode\u003eFROM\u003c/code\u003e列表中的一个成员。在 SQL 标准中，必须把这样的函数调用包装在一个子\u003ccode\u003eSELECT\u003c/code\u003e中。也就是说，语法 \u003ccode\u003eFROM \u003cem\u003e\u003ccode\u003efunc\u003c/code\u003e\u003c/em\u003e(...) \u003cem\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e\u003c/code\u003e 近似等价于 \u003ccode\u003eFROM LATERAL (SELECT \u003cem\u003e\u003ccode\u003efunc\u003c/code\u003e\u003c/em\u003e(...)) \u003cem\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e\u003c/code\u003e。注意该\u003ccode\u003eLATERAL\u003c/code\u003e被认为是隐式的，这是因为标准对于 \u003ccode\u003eFROM\u003c/code\u003e中的一个\u003ccode\u003eUNNEST()\u003c/code\u003e项要求 \u003ccode\u003eLATERAL\u003c/code\u003e语义。\u003cspan\u003ePostgreSQL\u003c/span\u003e会把 \u003ccode\u003eUNNEST()\u003c/code\u003e和其他集合返回函数同样对待。\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ccode\u003eGROUP BY\u003c/code\u003e和\u003ccode\u003eORDER BY\u003c/code\u003e可用的名字空间\u003c/h3\u003e\u003cp\u003e在 SQL-92 标准中，一个\u003ccode\u003eORDER BY\u003c/code\u003e子句只能使用输出列名或者序号，而一个\u003ccode\u003eGROUP BY\u003c/code\u003e子句只能使用基于输入列名的表达式。\u003cspan\u003ePostgreSQL\u003c/span\u003e扩展了这两种子句以允许它们使用其他的选择（但如果有歧义时还是使用标准的解释）。\u003cspan\u003ePostgreSQL\u003c/span\u003e也允许两种子句指定任意表达式。注意出现在一个表达式中的名称将总是被当做输入列名而不是输出列名。\u003c/p\u003e\u003cp\u003eSQL:1999 及其后的标准使用了一种略微不同的定义，它并不完全向后兼容 SQL-92。不过，在大部分的情况下，\u003cspan\u003ePostgreSQL\u003c/span\u003e会以与 SQL:1999 相同的方式解释\u003ccode\u003eORDER BY\u003c/code\u003e或\u003ccode\u003eGROUP BY\u003c/code\u003e表达式。\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e函数依赖\u003c/h3\u003e\u003cp\u003e只有当一个表的主键被包括在\u003ccode\u003eGROUP BY\u003c/code\u003e列表中时，\u003cspan\u003ePostgreSQL\u003c/span\u003e才识别函数依赖（允许从\u003ccode\u003eGROUP BY\u003c/code\u003e中省略列）。SQL 标准指定了应该要识别的额外情况。\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ccode\u003eLIMIT\u003c/code\u003e和\u003ccode\u003eOFFSET\u003c/code\u003e\u003c/h3\u003e\u003cp\u003e\u003ccode\u003eLIMIT\u003c/code\u003e和\u003ccode\u003eOFFSET\u003c/code\u003e子句是 \u003cspan\u003ePostgreSQL\u003c/span\u003e特有的语法，在 \u003cspan\u003eMySQL\u003c/span\u003e中也被使用。SQL:2008 标准已经引入了具有相同功能的子句\u003ccode\u003eOFFSET ... FETCH {FIRST|NEXT} ...\u003c/code\u003e（如上文\u003ca href=\"/docs/18/sql-select.html#SQL-LIMIT\" title=\"LIMIT 子句\" rel=\"nofollow\"\u003eLIMIT Clause\u003c/a\u003e中所示）。这种语法也被\u003cspan\u003eIBM DB2\u003c/span\u003e使用（为\u003cspan\u003eOracle\u003c/span\u003e编写的应用常常使用自动生成的 \u003ccode\u003erownum\u003c/code\u003e列来实现这些子句的效果，这在 PostgreSQL 中是没有的）。\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ccode\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode\u003eFOR UPDATE\u003c/code\u003e、\u003ccode\u003eFOR SHARE\u003c/code\u003e、\u003ccode\u003eFOR KEY SHARE\u003c/code\u003e\u003c/h3\u003e\u003cp\u003e尽管 SQL 标准中出现了\u003ccode\u003eFOR UPDATE\u003c/code\u003e，但标准只允许它作为 \u003ccode\u003eDECLARE CURSOR\u003c/code\u003e的一个选项。\u003cspan\u003ePostgreSQL\u003c/span\u003e允许它出现在任何 \u003ccode\u003eSELECT\u003c/code\u003e查询以及子\u003ccode\u003eSELECT\u003c/code\u003e中，但这是一种扩展。\u003ccode\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode\u003eFOR SHARE\u003c/code\u003e 以及\u003ccode\u003eFOR KEY SHARE\u003c/code\u003e变体以及\u003ccode\u003eNOWAIT\u003c/code\u003e 和\u003ccode\u003eSKIP LOCKED\u003c/code\u003e选项没有在标准中出现。\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ccode\u003eWITH\u003c/code\u003e中的数据修改语句\u003c/h3\u003e\u003cp\u003e\u003cspan\u003ePostgreSQL\u003c/span\u003e允许将\u003ccode\u003eINSERT\u003c/code\u003e、\u003ccode\u003eUPDATE\u003c/code\u003e、\u003ccode\u003eDELETE\u003c/code\u003e以及\u003ccode\u003eMERGE\u003c/code\u003e用作\u003ccode\u003eWITH\u003c/code\u003e 查询。这在 SQL 标准中是找不到的。\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e非标准子句\u003c/h3\u003e\u003cp\u003e\u003ccode\u003eDISTINCT ON ( ... )\u003c/code\u003e是 SQL 标准的扩展。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eROWS FROM( ... )\u003c/code\u003e是 SQL 标准的扩展。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eWITH\u003c/code\u003e的\u003ccode\u003eMATERIALIZED\u003c/code\u003e和\u003ccode\u003eNOT MATERIALIZED\u003c/code\u003e选项是 SQL 标准的扩展。\u003c/p\u003e\u003c/div\u003e\u003c/section\u003e","SourceRevision":"ca936764","ContentHash":"bd5e01d2c7ecf4a521e318f4a88d1305cb187f07be491cb40f9d24b5202b8d5c","Payload":{"purpose_zh":"从表或视图中检索行","sections":[{"html":"\u003cp\u003e\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e 从零个或多个表中检索行。\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e 的一般处理流程如下：\u003c/p\u003e\u003cdiv class=\"orderedlist\"\u003e\u003col class=\"orderedlist\"\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e列表中的所有查询都会被计算。这些实际上充当临时表，可以在\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e列表中引用。在\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e列表中多次引用的\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e查询只会计算一次，除非使用\u003ccode class=\"literal\"\u003eNOT MATERIALIZED\u003c/code\u003e进行其他指定。（参见下面的\u003ca href=\"/docs/18/sql-select.html#SQL-WITH\" title=\"WITH 子句\"\u003eWITH Clause\u003c/a\u003e。）\u003c/p\u003e\u003c/li\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003e所有\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e列表中的元素都会被计算。（\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e列表中的每个元素都是一个真实或虚拟表。）如果在\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e列表中指定了多个元素，则它们会被交叉连接在一起。（参见下面的\u003ca href=\"/docs/18/sql-select.html#SQL-FROM\" title=\"FROM 子句\"\u003eFROM Clause\u003c/a\u003e。）\u003c/p\u003e\u003c/li\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003e如果指定了\u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e子句，则不满足条件的所有行将从输出中删除。（请参见下面的\u003ca href=\"/docs/18/sql-select.html#SQL-WHERE\" title=\"WHERE 子句\"\u003eWHERE Clause\u003c/a\u003e。）\u003c/p\u003e\u003c/li\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003e如果指定了\u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e子句，或者存在聚合函数调用，输出将被组合成在一个或多个值上匹配的行组，并计算聚合函数的结果。如果存在\u003ccode class=\"literal\"\u003eHAVING\u003c/code\u003e子句，它将消除不满足给定条件的组。（参见\u003ca href=\"/docs/18/sql-select.html#SQL-GROUPBY\" title=\"GROUP BY 子句\"\u003eGROUP BY Clause\u003c/a\u003e和\u003ca href=\"/docs/18/sql-select.html#SQL-HAVING\" title=\"HAVING 子句\"\u003eHAVING Clause\u003c/a\u003e。）虽然查询输出列名义上是在下一步计算的，但它们也可以在\u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e子句中被引用（按名称或序号）。\u003c/p\u003e\u003c/li\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003e实际输出行是使用每个选定行或行组的\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e输出表达式计算的。（参见下面的\u003ca href=\"/docs/18/sql-select.html#SQL-SELECT-LIST\" title=\"SELECT 列表\"\u003eSELECT List\u003c/a\u003e。）\u003c/p\u003e\u003c/li\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eSELECT DISTINCT\u003c/code\u003e消除结果中的重复行。\u003ccode class=\"literal\"\u003eSELECT DISTINCT ON\u003c/code\u003e会消除在所有指定表达式上匹配的行，只保留每组中的第一行。\u003ccode class=\"literal\"\u003eSELECT ALL\u003c/code\u003e（默认）将返回所有候选行，包括重复行。（参见下面的\u003ca href=\"/docs/18/sql-select.html#SQL-DISTINCT\" title=\"DISTINCT 子句\"\u003eDISTINCT Clause\u003c/a\u003e。）\u003c/p\u003e\u003c/li\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003e使用操作符\u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e、\u003ccode class=\"literal\"\u003eINTERSECT\u003c/code\u003e和\u003ccode class=\"literal\"\u003eEXCEPT\u003c/code\u003e，可以将多个\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e语句的输出合并成一个结果集。\u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e操作符返回在一个或两个结果集中的所有行。\u003ccode class=\"literal\"\u003eINTERSECT\u003c/code\u003e操作符返回同时出现在两个结果集中的所有行。\u003ccode class=\"literal\"\u003eEXCEPT\u003c/code\u003e操作符返回在第一个结果集中但不在第二个结果集中的行。在这三种情况下，除非指定\u003ccode class=\"literal\"\u003eALL\u003c/code\u003e，否则将消除重复行。还可以添加噪声词\u003ccode class=\"literal\"\u003eDISTINCT\u003c/code\u003e，以明确指定去重。请注意，这里的默认行为是\u003ccode class=\"literal\"\u003eDISTINCT\u003c/code\u003e，即使\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e本身的默认行为是\u003ccode class=\"literal\"\u003eALL\u003c/code\u003e。（请参见下面的\u003ca href=\"/docs/18/sql-select.html#SQL-UNION\" title=\"UNION 子句\"\u003eUNION Clause\u003c/a\u003e、\u003ca href=\"/docs/18/sql-select.html#SQL-INTERSECT\" title=\"INTERSECT 子句\"\u003eINTERSECT Clause\u003c/a\u003e和\u003ca href=\"/docs/18/sql-select.html#SQL-EXCEPT\" title=\"EXCEPT 子句\"\u003eEXCEPT Clause\u003c/a\u003e。）\u003c/p\u003e\u003c/li\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003e如果指定了\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e子句，则返回的行按指定顺序排序。如果没有给出\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e，则按系统认为最快的顺序返回行。（参见下面的\u003ca href=\"/docs/18/sql-select.html#SQL-ORDERBY\" title=\"ORDER BY 子句\"\u003eORDER BY Clause\u003c/a\u003e。）\u003c/p\u003e\u003c/li\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003e如果指定了\u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e（或\u003ccode class=\"literal\"\u003eFETCH FIRST\u003c/code\u003e）或\u003ccode class=\"literal\"\u003eOFFSET\u003c/code\u003e子句，\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e语句只返回结果行的子集。（参见下面的\u003ca href=\"/docs/18/sql-select.html#SQL-LIMIT\" title=\"LIMIT 子句\"\u003eLIMIT Clause\u003c/a\u003e。）\u003c/p\u003e\u003c/li\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003e如果指定了\u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e 或\u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e，\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e语句将选定的行锁定，防止并发更新。（参见下面的\u003ca href=\"/docs/18/sql-select.html#SQL-FOR-UPDATE-SHARE\" title=\"锁定子句\"\u003eThe Locking Clause\u003c/a\u003e。）\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003cp\u003e你必须拥有\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e命令中使用到的每一列上的 \u003ccode class=\"literal\"\u003eSELECT\u003c/code\u003e权限。\u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e或者\u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e 还要求具备\u003ccode class=\"literal\"\u003eUPDATE\u003c/code\u003e权限（对这样选中的每个表至少一列）。\u003c/p\u003e","key":"description","title":"描述"},{"html":"\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e 子句\u003c/h3\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e子句允许你指定一个或多个可在主查询中按名称引用的子查询。这些子查询在主查询执行期间实际上充当临时表或视图。每个子查询都可以是\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e、\u003ccode class=\"command\"\u003eTABLE\u003c/code\u003e、\u003ccode class=\"command\"\u003eVALUES\u003c/code\u003e、\u003ccode class=\"command\"\u003eINSERT\u003c/code\u003e、\u003ccode class=\"command\"\u003eUPDATE\u003c/code\u003e、\u003ccode class=\"command\"\u003eDELETE\u003c/code\u003e或者 \u003ccode class=\"command\"\u003eMERGE\u003c/code\u003e语句。在\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e中编写数据修改语句（\u003ccode class=\"command\"\u003eINSERT\u003c/code\u003e、\u003ccode class=\"command\"\u003eUPDATE\u003c/code\u003e、\u003ccode class=\"command\"\u003eDELETE\u003c/code\u003e或者 \u003ccode class=\"command\"\u003eMERGE\u003c/code\u003e）时，通常要包括一个 \u003ccode class=\"literal\"\u003eRETURNING\u003c/code\u003e子句。被主查询读取并构成临时表的是 \u003ccode class=\"literal\"\u003eRETURNING\u003c/code\u003e的输出，而\u003cspan class=\"emphasis\"\u003e\u003cem\u003e不是\u003c/em\u003e\u003c/span\u003e该语句所修改的底层表。如果省略\u003ccode class=\"literal\"\u003eRETURNING\u003c/code\u003e，该语句仍会执行，但不会产生输出，因此主查询无法把它当作表来引用。\u003c/p\u003e\u003cp\u003e对于每个\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e查询，都必须指定一个名称（不带模式限定）。还可以指定一个列名列表；如果省略，则列名将从子查询中推导出来。\u003c/p\u003e\u003cp\u003e如果指定了\u003ccode class=\"literal\"\u003eRECURSIVE\u003c/code\u003e，则允许一个 \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e子查询使用名称引用自身。这样一个子查询的形式必须是\u003c/p\u003e\u003cpre class=\"synopsis\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003enon_recursive_term\u003c/code\u003e\u003c/em\u003e UNION [ ALL | DISTINCT ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003erecursive_term\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003e其中递归自引用必须出现在\u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e的右手边。每个查询中只允许一个递归自引用。不支持递归数据修改语句，但是可以在一个数据修改语句中使用一个递归 \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e查询的结果。示例可见\u003ca href=\"/docs/18/queries-with.html\" title=\"7.8. WITH查询（公共表表达式）\"\u003e第 7.8 节\u003c/a\u003e。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eRECURSIVE\u003c/code\u003e的另一个效果是 \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e查询不需要被排序：一个查询可以引用另一个在列表中比它靠后的查询（不过，循环引用或者互递归没有实现）。如果没有\u003ccode class=\"literal\"\u003eRECURSIVE\u003c/code\u003e，\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e 查询只能引用在\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e列表中位置更前面的兄弟 \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e查询。\u003c/p\u003e\u003cp\u003e当\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e子句中有多个查询时，\u003ccode class=\"literal\"\u003eRECURSIVE\u003c/code\u003e应只编写一次，紧跟在\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e之后。它适用于\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e子句中的所有查询，尽管它对不使用递归或前向引用的查询没有影响。\u003c/p\u003e\u003cp\u003e可选的\u003ccode class=\"literal\"\u003eSEARCH\u003c/code\u003e子句会计算一个\u003cem class=\"firstterm\"\u003e搜索序列列（search sequence column）\u003c/em\u003e，可用于按广度优先或深度优先顺序对递归查询结果进行排序。给出的列名列表指定了用于跟踪已访问行的行键。名为\u003cem class=\"replaceable\"\u003e\u003ccode\u003esearch_seq_col_name\u003c/code\u003e\u003c/em\u003e的列会被添加到\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e查询的结果列列表中。可以在外层查询中按该列排序，以获得相应的顺序。示例请见\u003ca href=\"/docs/18/queries-with.html#QUERIES-WITH-SEARCH\" title=\"7.8.2.1. 搜索顺序\"\u003e第 7.8.2.1 节\u003c/a\u003e。\u003c/p\u003e\u003cp\u003e可选的\u003ccode class=\"literal\"\u003eCYCLE\u003c/code\u003e子句用于检测递归查询中的环路。给出的列名列表指定了用于跟踪已访问行的行键。名为 \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecycle_mark_col_name\u003c/code\u003e\u003c/em\u003e的列会被添加到 \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e查询的结果列列表中。检测到环路时，该列会被设为 \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecycle_mark_value\u003c/code\u003e\u003c/em\u003e，否则设为 \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecycle_mark_default\u003c/code\u003e\u003c/em\u003e。此外，一旦检测到环路，递归联合的处理就会停止。\u003cem class=\"replaceable\"\u003e\u003ccode\u003ecycle_mark_value\u003c/code\u003e\u003c/em\u003e和 \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecycle_mark_default\u003c/code\u003e\u003c/em\u003e必须是常量，并且必须能够强制转换为某个公共数据类型，而且该数据类型必须具有不等操作符。（SQL 标准要求它们是布尔常量或字符串，但 PostgreSQL 不作此要求。）默认使用\u003ccode class=\"literal\"\u003eTRUE\u003c/code\u003e和\u003ccode class=\"literal\"\u003eFALSE\u003c/code\u003e（类型为 \u003ccode class=\"type\"\u003eboolean\u003c/code\u003e）。此外，名为 \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecycle_path_col_name\u003c/code\u003e\u003c/em\u003e的列也会被添加到 \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e查询的结果列列表中。该列在内部用于跟踪已访问的行。示例请见\u003ca href=\"/docs/18/queries-with.html#QUERIES-WITH-CYCLE\" title=\"7.8.2.2. 环检测\"\u003e第 7.8.2.2 节\u003c/a\u003e。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eSEARCH\u003c/code\u003e和\u003ccode class=\"literal\"\u003eCYCLE\u003c/code\u003e子句只对递归 \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e查询有效。\u003cem class=\"replaceable\"\u003e\u003ccode\u003ewith_query\u003c/code\u003e\u003c/em\u003e 必须是两个\u003ccode class=\"literal\"\u003eSELECT\u003c/code\u003e（或等效）命令的 \u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e（或\u003ccode class=\"literal\"\u003eUNION ALL\u003c/code\u003e），且不允许嵌套 \u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e。如果同时使用这两个子句，\u003ccode class=\"literal\"\u003eSEARCH\u003c/code\u003e子句添加的列会出现在\u003ccode class=\"literal\"\u003eCYCLE\u003c/code\u003e 子句添加的列之前。\u003c/p\u003e\u003cp\u003e主查询和\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e查询（概念上）都在同一时间执行。这意味着，除了读取其\u003ccode class=\"literal\"\u003eRETURNING\u003c/code\u003e输出之外，查询的其他部分都看不到\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e中数据修改语句的效果。如果两个这样的数据修改语句试图修改同一行，结果并无规定。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e查询的一个关键属性是，即使主查询多次引用它们，它们通常在主查询的每次执行中也只会计算一次。特别是，数据修改语句保证执行一次且仅执行一次，而不管主查询是否读取了它们的全部输出或其中任何部分。\u003c/p\u003e\u003cp\u003e不过，可以将\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e查询标记为 \u003ccode class=\"literal\"\u003eNOT MATERIALIZED\u003c/code\u003e，从而取消这一保证。在这种情况下，\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e查询可以折叠进主查询，就像它是主查询 \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e子句中的一个简单子\u003ccode class=\"literal\"\u003eSELECT\u003c/code\u003e一样。如果主查询多次引用该\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e查询，这会导致重复计算；但如果每次使用只需要\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e查询总输出中的少量行，\u003ccode class=\"literal\"\u003eNOT MATERIALIZED\u003c/code\u003e仍可能因为允许联合优化而带来净收益。如果\u003ccode class=\"literal\"\u003eNOT MATERIALIZED\u003c/code\u003e附加在递归的\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e查询上，或该查询并非无副作用（也就是说，不是不包含可变函数的普通\u003ccode class=\"literal\"\u003eSELECT\u003c/code\u003e），则会被忽略。\u003c/p\u003e\u003cp\u003e默认情况下，如果某个无副作用的\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e查询在主查询的 \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e子句中恰好只使用一次，它就会被折叠进主查询。这使得在语义上应当没有可见影响的情况下，查询的两个层级可以联合优化。不过，也可以把\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e查询标记为\u003ccode class=\"literal\"\u003eMATERIALIZED\u003c/code\u003e，以阻止这种折叠。例如，当\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e查询被用作优化围栏，以防止规划器选择糟糕的计划时，这么做可能有用。\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e 在 v12 之前从不进行这种折叠，因此为旧版本编写的查询可能依赖\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e来充当优化围栏。\u003c/p\u003e\u003cp\u003e更多信息请见\u003ca href=\"/docs/18/queries-with.html\" title=\"7.8. WITH查询（公共表表达式）\"\u003e第 7.8 节\u003c/a\u003e。\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e 子句\u003c/h3\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e子句为\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e 指定一个或者更多源表。如果指定了多个源表，结果将是所有源表的笛卡尔积（交叉连接）。但是通常会增加限定条件（通过 \u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e）来把返回的行限制为该笛卡尔积的一个小子集。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e子句可以包含以下元素：\u003c/p\u003e\u003cdiv class=\"variablelist\"\u003e\u003cdl class=\"variablelist\"\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e要扫描的现有表或视图的名称（可选模式限定符）。如果在表名之前指定\u003ccode class=\"literal\"\u003eONLY\u003c/code\u003e，则仅扫描该表。如果未指定\u003ccode class=\"literal\"\u003eONLY\u003c/code\u003e，则扫描该表及其所有后代表（如果有）。可选地，可以在表名后指定\u003ccode class=\"literal\"\u003e*\u003c/code\u003e，以明确指示包括后代表。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e包含该别名的\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e项的替代名称。别名可用于简写，或者消除自连接（同一张表被扫描多次）中的歧义。提供别名后，它会完全隐藏表或函数的实际名称；例如给定\u003ccode class=\"literal\"\u003eFROM foo AS f\u003c/code\u003e，\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e的其余部分必须把这个\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e 项写成\u003ccode class=\"literal\"\u003ef\u003c/code\u003e而不是\u003ccode class=\"literal\"\u003efoo\u003c/code\u003e。如果写了别名，还可以写列别名列表，为该表的一个或多个列提供替代名称。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eTABLESAMPLE \u003cem class=\"replaceable\"\u003e\u003ccode\u003esampling_method\u003c/code\u003e\u003c/em\u003e ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargument\u003c/code\u003e\u003c/em\u003e [, ...] ) [ REPEATABLE ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003eseed\u003c/code\u003e\u003c/em\u003e ) ]\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e跟在\u003cem class=\"replaceable\"\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e之后的 \u003ccode class=\"literal\"\u003eTABLESAMPLE\u003c/code\u003e子句表示，应使用指定的 \u003cem class=\"replaceable\"\u003e\u003ccode\u003esampling_method\u003c/code\u003e\u003c/em\u003e从该表中取回行的一个子集。这种抽样先于任何其他过滤条件（例如 \u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e子句）的应用。标准 \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e发行版包含两种抽样方法，即\u003ccode class=\"literal\"\u003eBERNOULLI\u003c/code\u003e和\u003ccode class=\"literal\"\u003eSYSTEM\u003c/code\u003e；其他抽样方法可以通过扩展安装到数据库中。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eBERNOULLI\u003c/code\u003e和\u003ccode class=\"literal\"\u003eSYSTEM\u003c/code\u003e抽样方法各接受一个\u003cem class=\"replaceable\"\u003e\u003ccode\u003eargument\u003c/code\u003e\u003c/em\u003e，表示要抽样的表的比例，以 0 到 100 之间的百分比表示。该参数可以是任何返回\u003ccode class=\"type\"\u003ereal\u003c/code\u003e的表达式。（其他抽样方法可能接受更多或不同的参数。）这两种方法都会返回表的一个随机样本，其中大约包含表中指定百分比的行。\u003ccode class=\"literal\"\u003eBERNOULLI\u003c/code\u003e方法扫描整个表，并以指定概率独立选择或忽略单个行。\u003ccode class=\"literal\"\u003eSYSTEM\u003c/code\u003e方法进行块级抽样，每个块有指定的选择机会；返回每个选定块中的所有行。当指定小的抽样百分比时，\u003ccode class=\"literal\"\u003eSYSTEM\u003c/code\u003e方法比 \u003ccode class=\"literal\"\u003eBERNOULLI\u003c/code\u003e方法快得多，但由于聚类效应，它返回的表样本随机性可能稍差一些。\u003c/p\u003e\u003cp\u003e可选的\u003ccode class=\"literal\"\u003eREPEATABLE\u003c/code\u003e子句指定一个 \u003cem class=\"replaceable\"\u003e\u003ccode\u003eseed\u003c/code\u003e\u003c/em\u003e数字或表达式，用于在抽样方法内部生成随机数。种子值可以是任意非空浮点值。如果两个查询指定了相同的种子和\u003cem class=\"replaceable\"\u003e\u003ccode\u003eargument\u003c/code\u003e\u003c/em\u003e值，且该表在此期间未被修改，它们会选出相同的表样本；但不同的种子值通常会产生不同的样本。如果未给出\u003ccode class=\"literal\"\u003eREPEATABLE\u003c/code\u003e，则每次查询都会基于系统生成的种子选取新的随机样本。注意，某些附加抽样方法并不接受\u003ccode class=\"literal\"\u003eREPEATABLE\u003c/code\u003e，因此每次使用时都会生成新的样本。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eselect\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e子\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e可以出现在\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e子句中，它的作用就像在这个\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e命令的执行期间创建了一个临时表。注意，子\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e必须用圆括号括起来，并且可以像对待表那样为其提供别名。这里也可以使用 \u003ca href=\"/docs/18/sql-values.html\" title=\"VALUES\"\u003e\u003ccode class=\"command\"\u003eVALUES\u003c/code\u003e\u003c/a\u003e命令。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003ewith_query_name\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e查询通过写出它的名称来引用，就像该查询名是表名一样。（事实上，对于主查询而言，\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e查询会遮蔽任何同名的真实表；如有必要，可以通过模式限定表名来引用该同名真实表。）也可以像对待表一样为它提供别名。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003efunction_name\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e函数调用可以出现在\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e子句中。（这对于返回结果集的函数尤其有用，但任何函数都可以使用。）其效果就像在这个单个\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e命令的执行期间，把函数的输出创建成一个临时表一样。如果函数的结果类型是复合的（包括具有多个\u003ccode class=\"literal\"\u003eOUT\u003c/code\u003e参数的情况），每个属性都成为隐式表中的一个单独列。\u003c/p\u003e\u003cp\u003e当在函数调用中添加可选的\u003ccode class=\"command\"\u003eWITH ORDINALITY\u003c/code\u003e子句时，将会在函数的结果列后附加一个\u003ccode class=\"type\"\u003ebigint\u003c/code\u003e类型的额外列。该列对函数结果集的行进行编号，从1开始。默认情况下，该列名为\u003ccode class=\"literal\"\u003eordinality\u003c/code\u003e。\u003c/p\u003e\u003cp\u003e也可以像对待表一样为其提供别名。如果写了别名，还可以编写列别名列表，为函数的复合返回类型的一个或多个属性提供替代名称，包括存在的序号列。\u003c/p\u003e\u003cp\u003e多个函数调用可以通过用\u003ccode class=\"literal\"\u003eROWS FROM( ... )\u003c/code\u003e括起来，合并成单个\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e子句项。这样一个项的输出会先拼接每个函数的第一行，再拼接每个函数的第二行，依此类推。如果某些函数产生的行数少于其他函数，则会用空值替代缺失的数据，以确保返回的总行数始终与产生最多行的那个函数相同。\u003c/p\u003e\u003cp\u003e如果函数被定义为返回\u003ccode class=\"type\"\u003erecord\u003c/code\u003e数据类型，则必须给出别名或关键字\u003ccode class=\"literal\"\u003eAS\u003c/code\u003e，后面跟一个如下形式的列定义列表：\u003ccode class=\"literal\"\u003e( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e \u003cem class=\"replaceable\"\u003e\u003ccode\u003edata_type\u003c/code\u003e\u003c/em\u003e [\u003cspan class=\"optional\"\u003e, ...\u003c/span\u003e ])\u003c/code\u003e。列定义列表必须与该函数实际返回的列数和列类型相匹配。\u003c/p\u003e\u003cp\u003e当使用\u003ccode class=\"literal\"\u003eROWS FROM( ... )\u003c/code\u003e语法时，如果其中某个函数需要列定义列表，最好将该列定义列表放在\u003ccode class=\"literal\"\u003eROWS FROM( ... )\u003c/code\u003e 内部、紧跟在函数调用之后。只有在只有一个函数且没有 \u003ccode class=\"literal\"\u003eWITH ORDINALITY\u003c/code\u003e子句时，才能把列定义列表放在 \u003ccode class=\"literal\"\u003eROWS FROM( ... )\u003c/code\u003e结构之后。\u003c/p\u003e\u003cp\u003e要将\u003ccode class=\"literal\"\u003eORDINALITY\u003c/code\u003e与列定义列表一起使用，必须使用\u003ccode class=\"literal\"\u003eROWS FROM( ... )\u003c/code\u003e语法，并将列定义列表放在\u003ccode class=\"literal\"\u003eROWS FROM( ... )\u003c/code\u003e内部。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003ejoin_type\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e以下之一：\u003c/p\u003e\u003cdiv class=\"itemizedlist\"\u003e\u003cul class=\"itemizedlist\"\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003e[ INNER ] JOIN\u003c/code\u003e\u003c/p\u003e\u003c/li\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eLEFT [ OUTER ] JOIN\u003c/code\u003e\u003c/p\u003e\u003c/li\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eRIGHT [ OUTER ] JOIN\u003c/code\u003e\u003c/p\u003e\u003c/li\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eFULL [ OUTER ] JOIN\u003c/code\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cp\u003e对于\u003ccode class=\"literal\"\u003eINNER\u003c/code\u003e和\u003ccode class=\"literal\"\u003eOUTER\u003c/code\u003e连接类型，必须指定连接条件，即下列三者之一：\u003ccode class=\"literal\"\u003eON \u003cem class=\"replaceable\"\u003e\u003ccode\u003ejoin_condition\u003c/code\u003e\u003c/em\u003e\u003c/code\u003e、\u003ccode class=\"literal\"\u003eUSING (\u003cem class=\"replaceable\"\u003e\u003ccode\u003ejoin_column\u003c/code\u003e\u003c/em\u003e [, ...])\u003c/code\u003e，或者\u003ccode class=\"literal\"\u003eNATURAL\u003c/code\u003e。其含义见下文。\u003c/p\u003e\u003cp\u003e一个\u003ccode class=\"literal\"\u003eJOIN\u003c/code\u003e子句会把两个\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e项组合起来，为方便起见，我们把它们称为\u003cspan class=\"quote\"\u003e“\u003cspan class=\"quote\"\u003e表\u003c/span\u003e”\u003c/span\u003e，尽管实际上它们可以是任何类型的\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e项。如有必要，可以使用括号来确定嵌套顺序。在没有括号时，\u003ccode class=\"literal\"\u003eJOIN\u003c/code\u003e按从左到右的顺序嵌套。无论如何，\u003ccode class=\"literal\"\u003eJOIN\u003c/code\u003e的结合都比分隔\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e列表项的逗号更紧密。所有\u003ccode class=\"literal\"\u003eJOIN\u003c/code\u003e选项都只是记法上的便利，因为它们并没有提供任何无法用普通\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e和\u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e做到的能力。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eLEFT OUTER JOIN\u003c/code\u003e返回已限定笛卡尔积中的所有行（即，通过其连接条件的所有组合行），外加左侧表中没有任何右侧行通过连接条件的每一行的一个副本。这样的左侧行会通过在右侧列中插入空值而扩展到连接表的完整宽度。注意，在决定哪些行有匹配项时，只考虑\u003ccode class=\"literal\"\u003eJOIN\u003c/code\u003e子句自身的条件；外层条件是在之后应用的。\u003c/p\u003e\u003cp\u003e相反，\u003ccode class=\"literal\"\u003eRIGHT OUTER JOIN\u003c/code\u003e返回所有连接后的行，再加上每个未匹配右侧行对应的一行（左侧用空值扩展）。这只是一种记法上的便利，因为你可以通过交换左右表将其改写成\u003ccode class=\"literal\"\u003eLEFT OUTER JOIN\u003c/code\u003e。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eFULL OUTER JOIN\u003c/code\u003e返回所有连接后的行，再加上每个未匹配的左侧行（右侧用空值扩展），以及每个未匹配的右侧行（左侧用空值扩展）。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eON \u003cem class=\"replaceable\"\u003e\u003ccode\u003ejoin_condition\u003c/code\u003e\u003c/em\u003e\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003ejoin_condition\u003c/code\u003e\u003c/em\u003e是一个表达式，其结果为\u003ccode class=\"type\"\u003eboolean\u003c/code\u003e类型的值（类似于\u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e子句），指定连接中的哪些行被认为是匹配的。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eUSING ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ejoin_column\u003c/code\u003e\u003c/em\u003e [, ...] ) [ AS \u003cem class=\"replaceable\"\u003e\u003ccode\u003ejoin_using_alias\u003c/code\u003e\u003c/em\u003e ]\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e一个形如\u003ccode class=\"literal\"\u003eUSING ( a, b, ... )\u003c/code\u003e的子句是\u003ccode class=\"literal\"\u003eON left_table.a = right_table.a AND left_table.b = right_table.b ...\u003c/code\u003e的简写。此外，\u003ccode class=\"literal\"\u003eUSING\u003c/code\u003e意味着只有每对等价列中的一个会包含在连接输出中，而不是两者都包含。\u003c/p\u003e\u003cp\u003e如果指定了\u003cem class=\"replaceable\"\u003e\u003ccode\u003ejoin_using_alias\u003c/code\u003e\u003c/em\u003e 名称，它会为连接列提供一个表别名。只有\u003ccode class=\"literal\"\u003eUSING\u003c/code\u003e子句中列出的连接列才能通过这个名称访问。与普通的 \u003cem class=\"replaceable\"\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e不同，它不会向查询其余部分隐藏已连接表的名称。并且与普通的 \u003cem class=\"replaceable\"\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e不同，你不能编写列别名列表，连接列的输出名称与它们在\u003ccode class=\"literal\"\u003eUSING\u003c/code\u003e列表中出现时相同。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eNATURAL\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eNATURAL\u003c/code\u003e是一个简写，表示一个包含两个表中所有具有相同名称的列的\u003ccode class=\"literal\"\u003eUSING\u003c/code\u003e列表。如果没有共同的列名，\u003ccode class=\"literal\"\u003eNATURAL\u003c/code\u003e等同于\u003ccode class=\"literal\"\u003eON TRUE\u003c/code\u003e。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eCROSS JOIN\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eCROSS JOIN\u003c/code\u003e等同于\u003ccode class=\"literal\"\u003eINNER JOIN ON (TRUE)\u003c/code\u003e，也就是说，没有任何行被条件限制删除。它们产生一个简单的笛卡尔积，与在\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e的顶层列出两个表时得到的结果相同，但受连接条件（如果有）的限制。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eLATERAL\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eLATERAL\u003c/code\u003e关键字可以在子\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e项之前出现。这允许子\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e引用在\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e列表中出现在其前面的\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e项的列。（没有\u003ccode class=\"literal\"\u003eLATERAL\u003c/code\u003e，每个子\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e都是独立求值的，因此不能交叉引用任何其他\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e项。）\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eLATERAL\u003c/code\u003e也可以放在函数调用形式的\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e项之前，但在这种情况下它只是一个噪声词，因为函数表达式无论如何都可以引用更早出现的\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e项。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eLATERAL\u003c/code\u003e项既可以出现在\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e列表的顶层，也可以出现在\u003ccode class=\"literal\"\u003eJOIN\u003c/code\u003e树中。在后一种情况下，如果它位于某个 \u003ccode class=\"literal\"\u003eJOIN\u003c/code\u003e的右侧，也可以引用该连接左侧的任何项。\u003c/p\u003e\u003cp\u003e当\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e项包含\u003ccode class=\"literal\"\u003eLATERAL\u003c/code\u003e交叉引用时，求值过程如下：对于提供被交叉引用列的\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e项的每一行，或者对于提供这些列的多个\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e项的一组行，都会使用该行或行集中的列值来计算\u003ccode class=\"literal\"\u003eLATERAL\u003c/code\u003e项。得到的行随后照常与生成它们的那些行连接。这个过程会针对列源表中的每一行或每一组行重复执行。\u003c/p\u003e\u003cp\u003e列源表必须通过\u003ccode class=\"literal\"\u003eINNER\u003c/code\u003e或\u003ccode class=\"literal\"\u003eLEFT\u003c/code\u003e连接到 \u003ccode class=\"literal\"\u003eLATERAL\u003c/code\u003e项，否则就无法得到一个定义良好的行集合，用来计算该\u003ccode class=\"literal\"\u003eLATERAL\u003c/code\u003e项的每一组结果行。因此，尽管像 \u003ccode class=\"literal\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eX\u003c/code\u003e\u003c/em\u003e RIGHT JOIN LATERAL \u003cem class=\"replaceable\"\u003e\u003ccode\u003eY\u003c/code\u003e\u003c/em\u003e\u003c/code\u003e 这样的结构在语法上有效，但实际上并不允许\u003cem class=\"replaceable\"\u003e\u003ccode\u003eY\u003c/code\u003e\u003c/em\u003e 引用\u003cem class=\"replaceable\"\u003e\u003ccode\u003eX\u003c/code\u003e\u003c/em\u003e。\u003c/p\u003e\u003c/dd\u003e\u003c/dl\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e 子句\u003c/h3\u003e\u003cp\u003e可选的\u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e子句的形式\u003c/p\u003e\u003cpre class=\"synopsis\"\u003eWHERE \u003cem class=\"replaceable\"\u003e\u003ccode\u003econdition\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003e其中\u003cem class=\"replaceable\"\u003e\u003ccode\u003econdition\u003c/code\u003e\u003c/em\u003e 是任一计算得到\u003ccode class=\"type\"\u003eboolean\u003c/code\u003e类型结果的表达式。任何不满足这个条件的行都会从输出中被消除。如果用一行的实际值替换其中的变量引用后，该表达式返回真，则该行符合条件。\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e 子句\u003c/h3\u003e\u003cp\u003e可选的\u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e子句的一般形式为\u003c/p\u003e\u003cpre class=\"synopsis\"\u003eGROUP BY [ ALL | DISTINCT ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003egrouping_element\u003c/code\u003e\u003c/em\u003e [, ...]\n\u003c/pre\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e会把所有在分组表达式上具有相同值的已选中行压缩成单独一行。用于 \u003cem class=\"replaceable\"\u003e\u003ccode\u003egrouping_element\u003c/code\u003e\u003c/em\u003e中的 \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e可以是输入列名、输出列（\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e列表项）的名称或序号或者由输入列值构成的任意表达式。在出现歧义时，\u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e名称将被解释为输入列名而不是输出列名。\u003c/p\u003e\u003cp\u003e如果\u003ccode class=\"literal\"\u003eGROUPING SETS\u003c/code\u003e、\u003ccode class=\"literal\"\u003eROLLUP\u003c/code\u003e或 \u003ccode class=\"literal\"\u003eCUBE\u003c/code\u003e中的任何一个作为分组元素出现，那么整个 \u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e子句就定义了若干个相互独立的\u003cem class=\"replaceable\"\u003e\u003ccode\u003e分组集\u003c/code\u003e\u003c/em\u003e。其效果等价于在多个子查询之间构造一个\u003ccode class=\"literal\"\u003eUNION ALL\u003c/code\u003e，各个子查询分别以各自的分组集作为它们的\u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e子句。可选的\u003ccode class=\"literal\"\u003eDISTINCT\u003c/code\u003e 子句会在处理前移除重复的集合；它\u003cspan class=\"emphasis\"\u003e\u003cem\u003e不会\u003c/em\u003e\u003c/span\u003e把 \u003ccode class=\"literal\"\u003eUNION ALL\u003c/code\u003e转换为\u003ccode class=\"literal\"\u003eUNION DISTINCT\u003c/code\u003e。关于分组集处理的更多细节，见\u003ca href=\"/docs/18/queries-table-expressions.html#QUERIES-GROUPING-SETS\" title=\"7.2.4. GROUPING SETS、CUBE和ROLLUP\"\u003e第 7.2.4 节\u003c/a\u003e。\u003c/p\u003e\u003cp\u003e聚合函数（如果使用）会在组成每一个分组的所有行上进行计算，从而为每一个分组产生一个单独的值（如果有聚合函数但是没有 \u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e子句，则查询会被当成是由所有选中行构成的一个单一分组）。传递给每一个聚合函数的行集合可以通过在聚合函数调用上附加一个\u003ccode class=\"literal\"\u003eFILTER\u003c/code\u003e子句来进一步过滤，详见\u003ca href=\"/docs/18/sql-expressions.html#SYNTAX-AGGREGATES\" title=\"4.2.7. 聚合表达式\"\u003e第 4.2.7 节\u003c/a\u003e。当存在一个 \u003ccode class=\"literal\"\u003eFILTER\u003c/code\u003e子句时，只有那些匹配它的行才会被包括在该聚合函数的输入中。\u003c/p\u003e\u003cp\u003e当存在\u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e子句或者任何聚合函数时，\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e列表表达式不能引用非分组列，除非它出现在聚合函数中，或者该非分组列函数依赖于分组列，否则，一个非分组列可能有多个可返回的值。如果分组列（或其子集）构成包含该非分组列的表的主键，则存在函数依赖。\u003c/p\u003e\u003cp\u003e记住所有的聚合函数都是在\u003ccode class=\"literal\"\u003eHAVING\u003c/code\u003e子句或者 \u003ccode class=\"literal\"\u003eSELECT\u003c/code\u003e列表中的任何\u003cspan class=\"quote\"\u003e“\u003cspan class=\"quote\"\u003e标量\u003c/span\u003e”\u003c/span\u003e表达式之前被计算。这意味着\u003ccode class=\"literal\"\u003eCASE\u003c/code\u003e表达式不能被用来跳过聚合函数的计算，见\u003ca href=\"/docs/18/sql-expressions.html#SYNTAX-EXPRESS-EVAL\" title=\"4.2.14. 表达式计算规则\"\u003e第 4.2.14 节\u003c/a\u003e。\u003c/p\u003e\u003cp\u003e当前，\u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e和\u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e不能和 \u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e一起指定。\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eHAVING\u003c/code\u003e 子句\u003c/h3\u003e\u003cp\u003e可选的\u003ccode class=\"literal\"\u003eHAVING\u003c/code\u003e子句的形式\u003c/p\u003e\u003cpre class=\"synopsis\"\u003eHAVING \u003cem class=\"replaceable\"\u003e\u003ccode\u003econdition\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003e其中\u003cem class=\"replaceable\"\u003e\u003ccode\u003econdition\u003c/code\u003e\u003c/em\u003e与 \u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e子句中指定的条件相同。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eHAVING\u003c/code\u003e消除不满足该条件的分组行。\u003ccode class=\"literal\"\u003eHAVING\u003c/code\u003e与\u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e不同：\u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e会在应用\u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e之前过滤个体行，而\u003ccode class=\"literal\"\u003eHAVING\u003c/code\u003e过滤由 \u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e创建的分组行。\u003cem class=\"replaceable\"\u003e\u003ccode\u003econdition\u003c/code\u003e\u003c/em\u003e中引用的每一列都必须无歧义地引用某个分组列，除非该引用出现在聚合函数中，或者该非分组列函数依赖于分组列。\u003c/p\u003e\u003cp\u003e即使没有\u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e子句，\u003ccode class=\"literal\"\u003eHAVING\u003c/code\u003e 的存在也会把一个查询转变成一个分组查询。这和查询中包含聚合函数但没有 \u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e子句时的情况相同。所有被选择的行都被认为是一个单一分组，并且\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e列表和 \u003ccode class=\"literal\"\u003eHAVING\u003c/code\u003e子句只能从聚合函数内部引用表列。如果该 \u003ccode class=\"literal\"\u003eHAVING\u003c/code\u003e条件为真，这样的查询将输出单独一行；否则不返回行。\u003c/p\u003e\u003cp\u003e当前，\u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e和\u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e不能与 \u003ccode class=\"literal\"\u003eHAVING\u003c/code\u003e一起指定。\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eWINDOW\u003c/code\u003e 子句\u003c/h3\u003e\u003cp\u003e可选的 \u003ccode class=\"literal\"\u003eWINDOW\u003c/code\u003e 子句的一般形式为：\u003c/p\u003e\u003cpre class=\"synopsis\"\u003eWINDOW \u003cem class=\"replaceable\"\u003e\u003ccode\u003ewindow_name\u003c/code\u003e\u003c/em\u003e AS ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ewindow_definition\u003c/code\u003e\u003c/em\u003e ) [, ...]\n\u003c/pre\u003e\u003cp\u003e其中，\u003cem class=\"replaceable\"\u003e\u003ccode\u003ewindow_name\u003c/code\u003e\u003c/em\u003e 是一个名称，可从 \u003ccode class=\"literal\"\u003eOVER\u003c/code\u003e 子句或后续窗口定义中引用，而 \u003cem class=\"replaceable\"\u003e\u003ccode\u003ewindow_definition\u003c/code\u003e\u003c/em\u003e 的定义为：\u003c/p\u003e\u003cpre class=\"synopsis\"\u003e[ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexisting_window_name\u003c/code\u003e\u003c/em\u003e ]\n[ PARTITION BY \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e [, ...] ]\n[ ORDER BY \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e [ ASC | DESC | USING \u003cem class=\"replaceable\"\u003e\u003ccode\u003eoperator\u003c/code\u003e\u003c/em\u003e ] [ NULLS { FIRST | LAST } ] [, ...] ]\n[ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_clause\u003c/code\u003e\u003c/em\u003e ]\n\u003c/pre\u003e\u003cp\u003e如果指定了一个\u003cem class=\"replaceable\"\u003e\u003ccode\u003eexisting_window_name\u003c/code\u003e\u003c/em\u003e，它必须引用\u003ccode class=\"literal\"\u003eWINDOW\u003c/code\u003e列表中一个更早出现的项。新窗口将从该项中复制它的分区子句，以及排序子句（如果有）。在这种情况下，新窗口不能指定它自己的\u003ccode class=\"literal\"\u003ePARTITION BY\u003c/code\u003e子句，并且只有在被复制的窗口没有\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e子句时，才可以指定 \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e。新窗口总是使用自己的帧子句，而被复制的窗口不得指定帧子句。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003ePARTITION BY\u003c/code\u003e列表元素的解释以 \u003ca href=\"/docs/18/sql-select.html#SQL-GROUPBY\" title=\"GROUP BY 子句\"\u003e\u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e\u003c/a\u003e子句元素的方式进行，不过它们总是简单表达式并且绝不能是输出列的名称或编号。另一个区别是这些表达式可以包含聚合函数调用，而这在常规\u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e 子句中是不被允许的。它们被允许的原因是窗口是出现在分组和聚合之后的。\u003c/p\u003e\u003cp\u003e类似地，\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e列表元素的解释也以语句级 \u003ca href=\"/docs/18/sql-select.html#SQL-ORDERBY\" title=\"ORDER BY 子句\"\u003e\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e\u003c/a\u003e子句元素的方式进行，不过该表达式总是被当做简单表达式并且绝不会是输出列的名称或编号。\u003c/p\u003e\u003cp\u003e可选的\u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_clause\u003c/code\u003e\u003c/em\u003e为依赖于帧的窗口函数定义\u003cem class=\"firstterm\"\u003e窗口帧\u003c/em\u003e（并非所有窗口函数都依赖于帧）。对于查询中的每一行（称为\u003cem class=\"firstterm\"\u003e当前行\u003c/em\u003e），窗口帧都是一组相关行。\u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_clause\u003c/code\u003e\u003c/em\u003e可以是\u003c/p\u003e\u003cpre class=\"synopsis\"\u003e{ RANGE | ROWS | GROUPS } \u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_start\u003c/code\u003e\u003c/em\u003e [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_exclusion\u003c/code\u003e\u003c/em\u003e ]\n{ RANGE | ROWS | GROUPS } BETWEEN \u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_start\u003c/code\u003e\u003c/em\u003e AND \u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_end\u003c/code\u003e\u003c/em\u003e [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_exclusion\u003c/code\u003e\u003c/em\u003e ]\n\u003c/pre\u003e\u003cp\u003e之一，其中\u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_start\u003c/code\u003e\u003c/em\u003e和\u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_end\u003c/code\u003e\u003c/em\u003e可以是\u003c/p\u003e\u003cpre class=\"synopsis\"\u003eUNBOUNDED PRECEDING\n\u003cem class=\"replaceable\"\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e PRECEDING\nCURRENT ROW\n\u003cem class=\"replaceable\"\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e FOLLOWING\nUNBOUNDED FOLLOWING\n\u003c/pre\u003e\u003cp\u003e之一，并且\u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_exclusion\u003c/code\u003e\u003c/em\u003e可以是\u003c/p\u003e\u003cpre class=\"synopsis\"\u003eEXCLUDE CURRENT ROW\nEXCLUDE GROUP\nEXCLUDE TIES\nEXCLUDE NO OTHERS\n\u003c/pre\u003e\u003cp\u003e之一。如果省略\u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_end\u003c/code\u003e\u003c/em\u003e，则默认值为 \u003ccode class=\"literal\"\u003eCURRENT ROW\u003c/code\u003e。限制条件是：\u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_start\u003c/code\u003e\u003c/em\u003e不能是\u003ccode class=\"literal\"\u003eUNBOUNDED FOLLOWING\u003c/code\u003e，\u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_end\u003c/code\u003e\u003c/em\u003e不能是\u003ccode class=\"literal\"\u003eUNBOUNDED PRECEDING\u003c/code\u003e，并且在上述\u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_start\u003c/code\u003e\u003c/em\u003e和 \u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_end\u003c/code\u003e\u003c/em\u003e选项列表中，\u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_end\u003c/code\u003e\u003c/em\u003e的选择不能早于 \u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_start\u003c/code\u003e\u003c/em\u003e的选择；例如 \u003ccode class=\"literal\"\u003eRANGE BETWEEN CURRENT ROW AND \u003cem class=\"replaceable\"\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e PRECEDING\u003c/code\u003e是不被允许的。\u003c/p\u003e\u003cp\u003e默认的帧选项是\u003ccode class=\"literal\"\u003eRANGE UNBOUNDED PRECEDING\u003c/code\u003e，它等同于 \u003ccode class=\"literal\"\u003eRANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW\u003c/code\u003e；它将帧设置为从分区起始处一直到当前行最后一个\u003cem class=\"firstterm\"\u003e同等\u003c/em\u003e行的所有行（所谓同等行，是指在该窗口的\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e子句看来与当前行等价的行；如果没有\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e，则所有行都互为同等行）。一般来说，\u003ccode class=\"literal\"\u003eUNBOUNDED PRECEDING\u003c/code\u003e表示帧从分区的第一行开始，类似地，\u003ccode class=\"literal\"\u003eUNBOUNDED FOLLOWING\u003c/code\u003e表示帧到分区的最后一行结束，与使用\u003ccode class=\"literal\"\u003eRANGE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eROWS\u003c/code\u003e还是\u003ccode class=\"literal\"\u003eGROUPS\u003c/code\u003e 模式无关。在\u003ccode class=\"literal\"\u003eROWS\u003c/code\u003e模式中，\u003ccode class=\"literal\"\u003eCURRENT ROW\u003c/code\u003e表示帧从当前行开始或在当前行结束；而在\u003ccode class=\"literal\"\u003eRANGE\u003c/code\u003e或 \u003ccode class=\"literal\"\u003eGROUPS\u003c/code\u003e模式中，它表示帧从当前行在 \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e排序中的第一个同等行开始，或在最后一个同等行结束。\u003cem class=\"replaceable\"\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e \u003ccode class=\"literal\"\u003ePRECEDING\u003c/code\u003e和 \u003cem class=\"replaceable\"\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e \u003ccode class=\"literal\"\u003eFOLLOWING\u003c/code\u003e选项的含义会随帧模式而变化。在\u003ccode class=\"literal\"\u003eROWS\u003c/code\u003e模式中，\u003cem class=\"replaceable\"\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e是一个整数，表示帧从当前行之前或之后多少行开始或结束。在\u003ccode class=\"literal\"\u003eGROUPS\u003c/code\u003e模式中，\u003cem class=\"replaceable\"\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e是一个整数，表示帧从当前行所在同等行组之前或之后多少个同等行组开始或结束，其中\u003cem class=\"firstterm\"\u003e同等行组\u003c/em\u003e是按窗口 \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e子句判断等价的一组行。在\u003ccode class=\"literal\"\u003eRANGE\u003c/code\u003e 模式中，使用\u003cem class=\"replaceable\"\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e选项要求窗口定义中恰好有一个 \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e列。此时，帧包含的行满足：其排序列值与当前行的排序列值相比，向小的方向（对于 \u003ccode class=\"literal\"\u003ePRECEDING\u003c/code\u003e）或向大的方向（对于\u003ccode class=\"literal\"\u003eFOLLOWING\u003c/code\u003e）的差距不超过\u003cem class=\"replaceable\"\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e。在这些情况下，\u003cem class=\"replaceable\"\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e表达式的数据类型取决于排序列的数据类型。对于数值排序列，它通常与排序列类型相同；对于日期/时间排序列，则为 \u003ccode class=\"type\"\u003einterval\u003c/code\u003e。在上述所有情况下，\u003cem class=\"replaceable\"\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e的值都必须非空且非负。此外，虽然 \u003cem class=\"replaceable\"\u003e\u003ccode\u003eoffset\u003c/code\u003e\u003c/em\u003e不必是简单常量，但它不能包含变量、聚合函数或窗口函数。\u003c/p\u003e\u003cp\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eframe_exclusion\u003c/code\u003e\u003c/em\u003e选项允许当前行周围的行被排除在帧之外，即便根据帧的开始和结束选项应该把它们包括在帧中。\u003ccode class=\"literal\"\u003eEXCLUDE CURRENT ROW\u003c/code\u003e会把当前行排除在帧之外。\u003ccode class=\"literal\"\u003eEXCLUDE GROUP\u003c/code\u003e会把当前行以及它在顺序上的同等行都排除在帧之外。\u003ccode class=\"literal\"\u003eEXCLUDE TIES\u003c/code\u003e把当前行的任何同等行都从帧中排除，但不排除当前行本身。\u003ccode class=\"literal\"\u003eEXCLUDE NO OTHERS\u003c/code\u003e只是明确地指定不排除当前行或其同等行的这种默认行为。\u003c/p\u003e\u003cp\u003e注意，如果\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e排序无法把行唯一地排序，则\u003ccode class=\"literal\"\u003eROWS\u003c/code\u003e模式可能产生不可预测的结果。\u003ccode class=\"literal\"\u003eRANGE\u003c/code\u003e以及\u003ccode class=\"literal\"\u003eGROUPS\u003c/code\u003e模式的目的是确保在\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e顺序中同等行被同样对待：一个给定同等行组中的所有行将在一个帧中或者被从帧中排除。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eWINDOW\u003c/code\u003e子句的目的是指定出现在查询的 \u003ca href=\"/docs/18/sql-select.html#SQL-SELECT-LIST\" title=\"SELECT 列表\"\u003e\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e列表\u003c/a\u003e或 \u003ca href=\"/docs/18/sql-select.html#SQL-ORDERBY\" title=\"ORDER BY 子句\"\u003e\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e\u003c/a\u003e子句中的\u003cem class=\"firstterm\"\u003e窗口函数\u003c/em\u003e的行为。这些函数可以在它们的 \u003ccode class=\"literal\"\u003eOVER\u003c/code\u003e子句中用名称引用\u003ccode class=\"literal\"\u003eWINDOW\u003c/code\u003e 子句项。不过，\u003ccode class=\"literal\"\u003eWINDOW\u003c/code\u003e子句项不是必须被引用。如果在查询中没有用到它，它会被简单地忽略。可以使用根本没有任何 \u003ccode class=\"literal\"\u003eWINDOW\u003c/code\u003e子句的窗口函数，因为窗口函数调用可以直接在其\u003ccode class=\"literal\"\u003eOVER\u003c/code\u003e子句中指定它的窗口定义。不过，当多个窗口函数都需要相同的窗口定义时，\u003ccode class=\"literal\"\u003eWINDOW\u003c/code\u003e子句能够减少输入量。\u003c/p\u003e\u003cp\u003e当前，\u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e和\u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e不能和 \u003ccode class=\"literal\"\u003eWINDOW\u003c/code\u003e一起被指定。\u003c/p\u003e\u003cp\u003e窗口函数的详细描述在\u003ca href=\"/docs/18/tutorial-window.html\" title=\"3.5. 窗口函数\"\u003e第 3.5 节\u003c/a\u003e、\u003ca href=\"/docs/18/sql-expressions.html#SYNTAX-WINDOW-FUNCTIONS\" title=\"4.2.8. 窗口函数调用\"\u003e第 4.2.8 节\u003c/a\u003e以及\u003ca href=\"/docs/18/queries-table-expressions.html#QUERIES-WINDOW\" title=\"7.2.5. 窗口函数处理\"\u003e第 7.2.5 节\u003c/a\u003e中。\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e 列表\u003c/h3\u003e\u003cp\u003e\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e列表（位于关键词 \u003ccode class=\"literal\"\u003eSELECT\u003c/code\u003e和\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e之间）指定构成 \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e语句输出行的表达式。这些表达式可以（并且通常确实会）引用\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e子句中计算得到的列。\u003c/p\u003e\u003cp\u003e正如在表中一样，\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e的每一个输出列都有一个名称。在一个简单的\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e中，这个名称只是被用来标记要显示的列，但是当\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e是一个大型查询的一个子查询时，大型查询会把该名称看做子查询产生的虚表的列名。要指定用于输出列的名称，在该列的表达式后面写上 \u003ccode class=\"literal\"\u003eAS\u003c/code\u003e \u003cem class=\"replaceable\"\u003e\u003ccode\u003eoutput_name\u003c/code\u003e\u003c/em\u003e（你可以省略\u003ccode class=\"literal\"\u003eAS\u003c/code\u003e，但只能在期望的输出名称不匹配任何 \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e关键词（见\u003ca href=\"/docs/18/sql-keywords-appendix.html\" title=\"附录 C. SQL 关键字\"\u003e附录 C\u003c/a\u003e）时省略。为了避免和未来增加的关键词冲突，推荐总是写上\u003ccode class=\"literal\"\u003eAS\u003c/code\u003e或者用双引号引用输出名称）。如果你不指定列名，\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e会自动选择一个名称。如果列的表达式是一个简单的列引用，那么被选择的名称就和该列的名称相同。在更复杂的情况下，可能使用函数名或类型名，系统也可能退而使用自动生成的名称，例如\u003ccode class=\"literal\"\u003e?column?\u003c/code\u003e。\u003c/p\u003e\u003cp\u003e一个输出列的名称可以被用来在\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e以及 \u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e子句中引用该列的值，但是不能用于 \u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e和\u003ccode class=\"literal\"\u003eHAVING\u003c/code\u003e子句（在其中必须写出表达式）。\u003c/p\u003e\u003cp\u003e可以在输出列表中写\u003ccode class=\"literal\"\u003e*\u003c/code\u003e来取代表达式，它是被选中行的所有列的一种简写方式。还可以写 \u003ccode class=\"literal\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e.*\u003c/code\u003e，它是只来自那个表的所有列的简写形式。在这些情况中无法用 \u003ccode class=\"literal\"\u003eAS\u003c/code\u003e指定新的名称，输出列的名称将和表列的名称相同。\u003c/p\u003e\u003cp\u003e按照 SQL 标准，输出列表中的表达式应当在应用\u003ccode class=\"literal\"\u003eDISTINCT\u003c/code\u003e、\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e或\u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e之前计算。对于 \u003ccode class=\"literal\"\u003eDISTINCT\u003c/code\u003e来说，这显然是必要的，否则就不清楚究竟要对哪些值去重。不过，在很多情况下，如果先执行\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e和 \u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e再计算输出表达式会更方便，特别是当输出列表中包含可变函数或代价高昂的函数时。那样一来，函数求值的顺序更符合直觉，也不会去计算那些根本不会出现在输出中的行。只要输出表达式没有被 \u003ccode class=\"literal\"\u003eDISTINCT\u003c/code\u003e、\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e或 \u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e引用，\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e 实际上就会在排序和限制行数之后再计算它们。（反例是 \u003ccode class=\"literal\"\u003eSELECT f(x) FROM tab ORDER BY 1\u003c/code\u003e，它显然必须在排序前计算\u003ccode class=\"function\"\u003ef(x)\u003c/code\u003e。）包含集合返回函数的输出表达式则实际上会在排序之后、限制之前计算，这样\u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e才能截断该集合返回函数产生的输出。\u003c/p\u003e\u003cdiv class=\"note\"\u003e\u003ch3\u003e注意\u003c/h3\u003e\u003cp\u003e9.6 版本之前的\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e不对执行输出表达式、排序、限制行数的时间顺序做任何保证，那将取决于被选中的查询计划的形式。\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eDISTINCT\u003c/code\u003e 子句\u003c/h3\u003e\u003cp\u003e如果指定了\u003ccode class=\"literal\"\u003eSELECT DISTINCT\u003c/code\u003e，所有重复的行会被从结果集中移除（为每一组重复的行保留一行）。\u003ccode class=\"literal\"\u003eSELECT ALL\u003c/code\u003e则指定相反的行为：所有行都会被保留，这也是默认情况。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eSELECT DISTINCT ON ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e [, ...] )\u003c/code\u003e 只保留在给定表达式上计算相等的行集合中的第一行。\u003ccode class=\"literal\"\u003eDISTINCT ON\u003c/code\u003e表达式使用和 \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e相同的规则（见上文）解释。注意，除非用 \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e来确保所期望的行出现在第一位，每一个集合的\u003cspan class=\"quote\"\u003e“\u003cspan class=\"quote\"\u003e第一行\u003c/span\u003e”\u003c/span\u003e是不可预测的。例如：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eSELECT DISTINCT ON (location) location, time, report\n    FROM weather_reports\n    ORDER BY location, time DESC;\n\u003c/pre\u003e\u003cp\u003e为每个地点检索最近的天气报告。但是如果我们不使用 \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e来强制对每个地点的时间值进行降序排序，我们为每个地点得到的报告的时间可能是无法预测的。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eDISTINCT ON\u003c/code\u003e表达式必须匹配最左边的 \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e表达式。\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e子句通常将包含额外的表达式，这些额外的表达式用于决定在每一个 \u003ccode class=\"literal\"\u003eDISTINCT ON\u003c/code\u003e分组内行的优先级。\u003c/p\u003e\u003cp\u003e当前，\u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e和\u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e不能和 \u003ccode class=\"literal\"\u003eDISTINCT\u003c/code\u003e一起使用。\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e 子句\u003c/h3\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e子句的一般形式如下：\u003c/p\u003e\u003cpre class=\"synopsis\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eselect_statement\u003c/code\u003e\u003c/em\u003e UNION [ ALL | DISTINCT ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003eselect_statement\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eselect_statement\u003c/code\u003e\u003c/em\u003e 是任何没有\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e、\u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e和\u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e子句的 \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e语句。（如果某个子表达式被圆括号括起来，\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e和\u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e可以附加在它上面。如果没有圆括号，这些子句会被视为作用于\u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e的结果，而不是作用于其右侧输入表达式。）\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e操作符计算相关 \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e语句所返回的行的并集。如果一行至少出现在两个结果集中的一个内，它就会在并集中。作为 \u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e两个操作数的 \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e语句必须产生相同数量的列并且对应位置上的列必须具有兼容的数据类型。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e的结果不会包含重复行，除非指定了 \u003ccode class=\"literal\"\u003eALL\u003c/code\u003e选项。\u003ccode class=\"literal\"\u003eALL\u003c/code\u003e会阻止消除重复（因此，\u003ccode class=\"literal\"\u003eUNION ALL\u003c/code\u003e通常显著地快于\u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e，尽量使用\u003ccode class=\"literal\"\u003eALL\u003c/code\u003e）。也可以写上\u003ccode class=\"literal\"\u003eDISTINCT\u003c/code\u003e，以显式指定默认的去重行为。\u003c/p\u003e\u003cp\u003e除非用圆括号指定计算顺序，同一个\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e语句中的多个 \u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e操作符会从左至右计算。\u003c/p\u003e\u003cp\u003e当前，\u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e和 \u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e不能用于\u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e结果或者 \u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e的任何输入。\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eINTERSECT\u003c/code\u003e 子句\u003c/h3\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eINTERSECT\u003c/code\u003e子句的一般形式如下：\u003c/p\u003e\u003cpre class=\"synopsis\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eselect_statement\u003c/code\u003e\u003c/em\u003e INTERSECT [ ALL | DISTINCT ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003eselect_statement\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eselect_statement\u003c/code\u003e\u003c/em\u003e 是任何没有\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e、\u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e以及\u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e子句的 \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e语句。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eINTERSECT\u003c/code\u003e操作符计算相关 \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e语句返回的行的交集。如果一行同时出现在两个结果集中，它就在交集中。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eINTERSECT\u003c/code\u003e的结果不会包含重复行，除非指定了 \u003ccode class=\"literal\"\u003eALL\u003c/code\u003e选项。如果有\u003ccode class=\"literal\"\u003eALL\u003c/code\u003e，一个在左表中有 \u003cem class=\"replaceable\"\u003e\u003ccode\u003em\u003c/code\u003e\u003c/em\u003e次重复并且在右表中有\u003cem class=\"replaceable\"\u003e\u003ccode\u003en\u003c/code\u003e\u003c/em\u003e 次重复的行将会在结果中出现 min(\u003cem class=\"replaceable\"\u003e\u003ccode\u003em\u003c/code\u003e\u003c/em\u003e,\u003cem class=\"replaceable\"\u003e\u003ccode\u003en\u003c/code\u003e\u003c/em\u003e) 次。也可以写上\u003ccode class=\"literal\"\u003eDISTINCT\u003c/code\u003e，以显式指定默认的去重行为。\u003c/p\u003e\u003cp\u003e除非用圆括号指定计算顺序，同一个\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e语句中的多个 \u003ccode class=\"literal\"\u003eINTERSECT\u003c/code\u003e操作符会从左至右计算。\u003ccode class=\"literal\"\u003eINTERSECT\u003c/code\u003e的优先级比 \u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e更高。也就是说，\u003ccode class=\"literal\"\u003eA UNION B INTERSECT C\u003c/code\u003e将被读成\u003ccode class=\"literal\"\u003eA UNION (B INTERSECT C)\u003c/code\u003e。\u003c/p\u003e\u003cp\u003e当前，\u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e和 \u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e不能用于\u003ccode class=\"literal\"\u003eINTERSECT\u003c/code\u003e结果或者 \u003ccode class=\"literal\"\u003eINTERSECT\u003c/code\u003e的任何输入。\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eEXCEPT\u003c/code\u003e 子句\u003c/h3\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eEXCEPT\u003c/code\u003e子句的一般形式如下：\u003c/p\u003e\u003cpre class=\"synopsis\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eselect_statement\u003c/code\u003e\u003c/em\u003e EXCEPT [ ALL | DISTINCT ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003eselect_statement\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eselect_statement\u003c/code\u003e\u003c/em\u003e 是任何没有\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e、\u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e以及\u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e子句的 \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e语句。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eEXCEPT\u003c/code\u003e操作符计算位于左侧 \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e语句的结果中但不在右 \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e语句结果中的行集合。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eEXCEPT\u003c/code\u003e的结果不会包含重复行，除非指定了 \u003ccode class=\"literal\"\u003eALL\u003c/code\u003e选项。如果有\u003ccode class=\"literal\"\u003eALL\u003c/code\u003e，一个在左表中有 \u003cem class=\"replaceable\"\u003e\u003ccode\u003em\u003c/code\u003e\u003c/em\u003e次重复并且在右表中有 \u003cem class=\"replaceable\"\u003e\u003ccode\u003en\u003c/code\u003e\u003c/em\u003e次重复的行将会在结果集中出现 max(\u003cem class=\"replaceable\"\u003e\u003ccode\u003em\u003c/code\u003e\u003c/em\u003e-\u003cem class=\"replaceable\"\u003e\u003ccode\u003en\u003c/code\u003e\u003c/em\u003e,0) 次。也可以写上\u003ccode class=\"literal\"\u003eDISTINCT\u003c/code\u003e，以显式指定默认的去重行为。\u003c/p\u003e\u003cp\u003e除非用圆括号指定计算顺序，同一个\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e语句中的多个 \u003ccode class=\"literal\"\u003eEXCEPT\u003c/code\u003e操作符会从左至右计算。\u003ccode class=\"literal\"\u003eEXCEPT\u003c/code\u003e的优先级与 \u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e相同。\u003c/p\u003e\u003cp\u003e当前，\u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e和 \u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e不能用于\u003ccode class=\"literal\"\u003eEXCEPT\u003c/code\u003e结果或者 \u003ccode class=\"literal\"\u003eEXCEPT\u003c/code\u003e的任何输入。\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e 子句\u003c/h3\u003e\u003cp\u003e可选的\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e子句的形式如下：\u003c/p\u003e\u003cpre class=\"synopsis\"\u003eORDER BY \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e [ ASC | DESC | USING \u003cem class=\"replaceable\"\u003e\u003ccode\u003eoperator\u003c/code\u003e\u003c/em\u003e ] [ NULLS { FIRST | LAST } ] [, ...]\n\u003c/pre\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e子句导致结果行被按照指定的表达式排序。如果两行按照最左边的表达式是相等的，则会根据下一个表达式比较它们，依次类推。如果按照所有指定的表达式它们都是相等的，则它们被返回的顺序取决于实现。\u003c/p\u003e\u003cp\u003e每一个\u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e 可以是输出列（\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e列表项）的名称或者序号，它也可以是由输入列值构成的任意表达式。\u003c/p\u003e\u003cp\u003e序号指的是输出列的顺序（从左至右）位置。这种特性可以为不具有唯一名称的列定义一个顺序。这不是绝对必要的，因为总是可以使用 \u003ccode class=\"literal\"\u003eAS\u003c/code\u003e子句为输出列赋予一个名称。\u003c/p\u003e\u003cp\u003e也可以在\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e子句中使用任意表达式，包括没有出现在\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e输出列表中的列。因此，下面的语句是合法的：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eSELECT name FROM distributors ORDER BY code;\n\u003c/pre\u003e\u003cp\u003e这种特性的一个限制是一个应用在\u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e、\u003ccode class=\"literal\"\u003eINTERSECT\u003c/code\u003e或\u003ccode class=\"literal\"\u003eEXCEPT\u003c/code\u003e子句结果上的 \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e只能指定输出列名称或序号，但不能指定表达式。\u003c/p\u003e\u003cp\u003e如果一个\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e表达式是一个既匹配输出列名称又匹配输入列名称的简单名称，\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e将把它解读成输出列名称。这与在同样情况下\u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e会做出的选择相反。这种不一致是为了与 SQL 标准兼容。\u003c/p\u003e\u003cp\u003e可以在\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e子句中任一表达式之后附加关键字 \u003ccode class=\"literal\"\u003eASC\u003c/code\u003e（升序）或\u003ccode class=\"literal\"\u003eDESC\u003c/code\u003e（降序）。如果没有指定，\u003ccode class=\"literal\"\u003eASC\u003c/code\u003e被假定为默认值。或者，可以在\u003ccode class=\"literal\"\u003eUSING\u003c/code\u003e 子句中指定一个特定的排序操作符名称。一个排序操作符必须是某个 B-树操作符族的小于或者大于成员。\u003ccode class=\"literal\"\u003eASC\u003c/code\u003e通常等价于 \u003ccode class=\"literal\"\u003eUSING \u0026lt;\u003c/code\u003e而\u003ccode class=\"literal\"\u003eDESC\u003c/code\u003e通常等价于 \u003ccode class=\"literal\"\u003eUSING \u0026gt;\u003c/code\u003e（但是一种用户定义数据类型的创建者可以准确地定义默认排序顺序是什么，并且它可能会对应于其他名称的操作符）。\u003c/p\u003e\u003cp\u003e如果指定\u003ccode class=\"literal\"\u003eNULLS LAST\u003c/code\u003e，空值会排在非空值之后；如果指定 \u003ccode class=\"literal\"\u003eNULLS FIRST\u003c/code\u003e，空值会排在非空值之前。如果都没有指定，在指定或者隐含\u003ccode class=\"literal\"\u003eASC\u003c/code\u003e时的默认行为是\u003ccode class=\"literal\"\u003eNULLS LAST\u003c/code\u003e，而指定\u003ccode class=\"literal\"\u003eDESC\u003c/code\u003e时的默认行为是 \u003ccode class=\"literal\"\u003eNULLS FIRST\u003c/code\u003e（因此，默认行为是空值大于非空值）。当指定\u003ccode class=\"literal\"\u003eUSING\u003c/code\u003e时，默认的空值顺序取决于该操作符是否为小于或者大于操作符。\u003c/p\u003e\u003cp\u003e注意顺序选项只应用到它们所跟随的表达式上。例如 \u003ccode class=\"literal\"\u003eORDER BY x, y DESC\u003c/code\u003e和 \u003ccode class=\"literal\"\u003eORDER BY x DESC, y DESC\u003c/code\u003e是不同的。\u003c/p\u003e\u003cp\u003e字符串数据会按适用于被排序列的排序规则来排序。根据需要可以通过在 \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e中包括一个 \u003ccode class=\"literal\"\u003eCOLLATE\u003c/code\u003e子句来覆盖，例如 \u003ccode class=\"literal\"\u003eORDER BY mycolumn COLLATE \"en_US\"\u003c/code\u003e。更多信息请见\u003ca href=\"/docs/18/sql-expressions.html#SQL-SYNTAX-COLLATE-EXPRS\" title=\"4.2.10. 排序规则表达式\"\u003e第 4.2.10 节\u003c/a\u003e和\u003ca href=\"/docs/18/collation.html\" title=\"23.2. 排序规则支持\"\u003e第 23.2 节\u003c/a\u003e。\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e 子句\u003c/h3\u003e\u003cp\u003e该 \u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e 子句由两个独立的子句组成：\u003c/p\u003e\u003cpre class=\"synopsis\"\u003eLIMIT { \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e | ALL }\nOFFSET \u003cem class=\"replaceable\"\u003e\u003ccode\u003estart\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003e参数 \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e 指定最多返回多少行，而 \u003cem class=\"replaceable\"\u003e\u003ccode\u003estart\u003c/code\u003e\u003c/em\u003e 指定开始返回行之前要跳过的行数。如果两者都指定，则先跳过 \u003cem class=\"replaceable\"\u003e\u003ccode\u003estart\u003c/code\u003e\u003c/em\u003e 行，然后开始计数并返回 \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e 行。\u003c/p\u003e\u003cp\u003e如果 \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e 表达式计算结果为 NULL，则视为 \u003ccode class=\"literal\"\u003eLIMIT ALL\u003c/code\u003e，即不限制。如果 \u003cem class=\"replaceable\"\u003e\u003ccode\u003estart\u003c/code\u003e\u003c/em\u003e 计算结果为 NULL，则等同于 \u003ccode class=\"literal\"\u003eOFFSET 0\u003c/code\u003e。\u003c/p\u003e\u003cp\u003eSQL:2008 引入了另一种实现相同结果的语法，\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e 也支持它。其形式如下：\u003c/p\u003e\u003cpre class=\"synopsis\"\u003eOFFSET \u003cem class=\"replaceable\"\u003e\u003ccode\u003estart\u003c/code\u003e\u003c/em\u003e { ROW | ROWS }\nFETCH { FIRST | NEXT } [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e ] { ROW | ROWS } { ONLY | WITH TIES }\n\u003c/pre\u003e\u003cp\u003e在这种语法中，标准要求 \u003cem class=\"replaceable\"\u003e\u003ccode\u003estart\u003c/code\u003e\u003c/em\u003e 或 \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e 的值必须是字面常量、参数或变量名；作为 \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e 的扩展，也允许其他表达式，但通常需要用圆括号将其括起以避免歧义。如果 \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e 在 \u003ccode class=\"literal\"\u003eFETCH\u003c/code\u003e 子句中省略，则默认值为 1。\u003ccode class=\"literal\"\u003eWITH TIES\u003c/code\u003e 选项用于返回那些按照 \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e 子句排序后与结果集最后一位并列的其他行；\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e 在这种情况下是必需的，而且 \u003ccode class=\"literal\"\u003eSKIP LOCKED\u003c/code\u003e 不允许使用。\u003ccode class=\"literal\"\u003eROW\u003c/code\u003e 和 \u003ccode class=\"literal\"\u003eROWS\u003c/code\u003e 以及 \u003ccode class=\"literal\"\u003eFIRST\u003c/code\u003e 和 \u003ccode class=\"literal\"\u003eNEXT\u003c/code\u003e 都是噪声词，不会影响这些子句的效果。按照标准，\u003ccode class=\"literal\"\u003eOFFSET\u003c/code\u003e 子句必须出现在 \u003ccode class=\"literal\"\u003eFETCH\u003c/code\u003e 子句之前（如果两者都存在）；而 \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e 更宽松，允许任意顺序。\u003c/p\u003e\u003cp\u003e在使用\u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e时，用一个\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e子句把结果行约束到一个唯一顺序是个好办法。否则你将得到该查询结果行的一个不可预测的子集 — 你可能要求从第 10 到第 20 行，但是在什么顺序下的第 10 到第 20 呢？除非指定\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e，你是不知道顺序的。\u003c/p\u003e\u003cp\u003e查询规划器在生成一个查询计划时会考虑\u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e，因此根据你使用的\u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e和\u003ccode class=\"literal\"\u003eOFFSET\u003c/code\u003e，你很可能得到不同的计划（得到不同的行序）。所以，使用不同的 \u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e/\u003ccode class=\"literal\"\u003eOFFSET\u003c/code\u003e值来选择一个查询结果的不同子集\u003cspan class=\"emphasis\"\u003e\u003cem\u003e将会给出不一致的结果\u003c/em\u003e\u003c/span\u003e，除非你用\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e强制一种可预测的结果顺序。这不是一个缺陷，它是 SQL 不承诺以任何特定顺序（除非使用 \u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e来约束顺序）给出一个查询结果这一事实造成的必然后果。\u003c/p\u003e\u003cp\u003e如果没有一个\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e来强制选择一个确定的子集，重复执行同样的\u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e查询甚至可能会返回一个表中行的不同子集。同样，这也不是一种缺陷，在这种情况下也无法保证结果的确定性。\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e锁定子句\u003c/h3\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e和\u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e 是\u003cem class=\"firstterm\"\u003e锁定子句\u003c/em\u003e，它们影响\u003ccode class=\"literal\"\u003eSELECT\u003c/code\u003e 把行从表中取得时如何对它们加锁。\u003c/p\u003e\u003cp\u003e锁定子句的一般形式为：\u003c/p\u003e\u003cpre class=\"synopsis\"\u003eFOR \u003cem class=\"replaceable\"\u003e\u003ccode\u003elock_strength\u003c/code\u003e\u003c/em\u003e [ OF \u003cem class=\"replaceable\"\u003e\u003ccode\u003efrom_reference\u003c/code\u003e\u003c/em\u003e [, ...] ] [ NOWAIT | SKIP LOCKED ]\n\u003c/pre\u003e\u003cp\u003e其中，\u003cem class=\"replaceable\"\u003e\u003ccode\u003elock_strength\u003c/code\u003e\u003c/em\u003e可以是以下值之一：\u003c/p\u003e\u003cpre class=\"synopsis\"\u003eUPDATE\nNO KEY UPDATE\nSHARE\nKEY SHARE\n\u003c/pre\u003e\u003cp\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003efrom_reference\u003c/code\u003e\u003c/em\u003e必须是 \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e 子句中被引用的表\u003cem class=\"replaceable\"\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e 或非隐藏的\u003cem class=\"replaceable\"\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e。更多关于每一种行级锁模式的信息可见\u003ca href=\"/docs/18/explicit-locking.html#LOCKING-ROWS\" title=\"13.3.2. 行级锁\"\u003e第 13.3.2 节\u003c/a\u003e。\u003c/p\u003e\u003cp\u003e为了防止该操作等待其他事务提交，可使用\u003ccode class=\"literal\"\u003eNOWAIT\u003c/code\u003e或 \u003ccode class=\"literal\"\u003eSKIP LOCKED\u003c/code\u003e选项。使用\u003ccode class=\"literal\"\u003eNOWAIT\u003c/code\u003e时，如果选中的行不能被立即锁定，该语句会直接报错而不是等待。使用 \u003ccode class=\"literal\"\u003eSKIP LOCKED\u003c/code\u003e时，任何无法立即锁定的已选中行都会被跳过。跳过已锁定行会提供数据的不一致视图，因此不适合一般用途的工作，但可用于避免多个消费者访问类似队列表时的锁竞争。注意，\u003ccode class=\"literal\"\u003eNOWAIT\u003c/code\u003e和\u003ccode class=\"literal\"\u003eSKIP LOCKED\u003c/code\u003e只适用于行级锁；所需的\u003ccode class=\"literal\"\u003eROW SHARE\u003c/code\u003e表级锁仍会按常规方式取得（见\u003ca href=\"/docs/18/mvcc.html\" title=\"第 13 章 并发控制\"\u003e第 13 章\u003c/a\u003e）。如果想要不等待的表级锁，你可以先使用带\u003ccode class=\"literal\"\u003eNOWAIT\u003c/code\u003e的\u003ca href=\"/docs/18/sql-lock.html\" title=\"LOCK\"\u003e\u003ccode class=\"command\"\u003eLOCK\u003c/code\u003e\u003c/a\u003e。\u003c/p\u003e\u003cp\u003e如果在一个锁定子句中提到了特定的表，则只有来自于那些表的行会被锁定，任何\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e中用到的其他表还是被简单地照常读取。一个没有表列表的锁定子句会影响该语句中用到的所有表。如果一个锁定子句被应用到一个视图或者子查询，它会影响在该视图或子查询中用到的所有表。不过，这些子句不适用于主查询引用的\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e查询。如果你希望在一个\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e查询中发生行锁定，应该在该 \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e查询内指定一个锁定子句。\u003c/p\u003e\u003cp\u003e如果有必要对不同的表指定不同的锁定行为，可以写多个锁定子句。如果同一个表在多于一个锁定子句中被提到（或者被隐式地影响到），那么会按照所指定的最强的锁定行为来处理它。类似地，如果在任何影响一个表的子句中指定了\u003ccode class=\"literal\"\u003eNOWAIT\u003c/code\u003e，就会按照 \u003ccode class=\"literal\"\u003eNOWAIT\u003c/code\u003e的行为来处理该表。否则如果 \u003ccode class=\"literal\"\u003eSKIP LOCKED\u003c/code\u003e在任何影响该表的子句中被指定，该表就会被按照\u003ccode class=\"literal\"\u003eSKIP LOCKED\u003c/code\u003e来处理。\u003c/p\u003e\u003cp\u003e如果返回的行无法清楚地与表中的各个行对应起来，就不能使用锁定子句。例如，锁定子句不能与聚合一起使用。\u003c/p\u003e\u003cp\u003e当一个锁定子句出现在一个\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e查询的顶层时，被锁定的行正好就是该查询返回的行。在连接查询的情况下，被锁定的行是那些对返回的连接行有贡献的行。此外，在该查询的快照时满足查询条件的行将被锁定，如果它们在该快照后被更新并且不再满足查询条件，它们将不会被返回。如果使用了\u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e，只要已经返回的行数满足了限制，锁定就会停止（但注意被 \u003ccode class=\"literal\"\u003eOFFSET\u003c/code\u003e跳过的行将被锁定）。类似地，如果在一个游标的查询中使用锁定子句，只有被该游标实际取出或者跳过的行才将被锁定。\u003c/p\u003e\u003cp\u003e当锁定子句出现在一个子\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e中时，被锁定行是那些该子查询返回给外层查询的行。这些被锁定的行的数量可能比从子查询自身的角度看到的要少，因为来自外层查询的条件可能会被用来优化子查询的执行。例如：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eSELECT * FROM (SELECT * FROM mytable FOR UPDATE) ss WHERE col1 = 5;\n\u003c/pre\u003e\u003cp\u003e将只锁定具有\u003ccode class=\"literal\"\u003ecol1 = 5\u003c/code\u003e的行（虽然在子查询中并没有写上该条件）。\u003c/p\u003e\u003cp\u003e较早的版本无法保持一个随后在保存点中被升级的锁。例如，下面这段代码：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eBEGIN;\nSELECT * FROM mytable WHERE key = 1 FOR UPDATE;\nSAVEPOINT s;\nUPDATE mytable SET ... WHERE key = 1;\nROLLBACK TO s;\n\u003c/pre\u003e\u003cp\u003e在执行\u003ccode class=\"command\"\u003eROLLBACK TO\u003c/code\u003e之后将无法保持 \u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e锁。这个问题已在 9.3 版本中修复。\u003c/p\u003e\u003cdiv class=\"caution\"\u003e\u003ch3\u003e小心\u003c/h3\u003e\u003cp\u003e一个运行在\u003ccode class=\"literal\"\u003eREAD COMMITTED\u003c/code\u003e事务隔离级别并且使用\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e和锁定子句的\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e命令有可能返回无序的行。这是因为\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e会被首先应用。该命令对结果排序，但是可能接着在尝试获得一行或多行上的锁时阻塞。一旦\u003ccode class=\"literal\"\u003eSELECT\u003c/code\u003e解除阻塞，某些排序列值可能已经被修改，从而导致那些行变成无序的（尽管它们根据原始列值是有序的）。根据需要，可以通过在子查询中放置 \u003ccode class=\"literal\"\u003eFOR UPDATE/SHARE\u003c/code\u003e来解决这一问题，例如\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eSELECT * FROM (SELECT * FROM mytable FOR UPDATE) ss ORDER BY column1;\n\u003c/pre\u003e\u003cp\u003e注意这将导致锁定\u003ccode class=\"structname\"\u003emytable\u003c/code\u003e的所有行，而顶层的 \u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e只会锁定实际被返回的行。这可能会导致显著的性能差异，特别是把\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e与\u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e或者其他限制组合使用时。因此只有在预计会并发更新排序列并且要求严格的排序结果时才推荐使用这种技术。\u003c/p\u003e\u003cp\u003e在\u003ccode class=\"literal\"\u003eREPEATABLE READ\u003c/code\u003e或\u003ccode class=\"literal\"\u003eSERIALIZABLE\u003c/code\u003e事务隔离级别下，这将导致串行化失败（\u003ccode class=\"literal\"\u003eSQLSTATE\u003c/code\u003e为\u003ccode class=\"literal\"\u003e'40001'\u003c/code\u003e），因此在这些隔离级别下不可能接收到无序的行。\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eTABLE\u003c/code\u003e 命令\u003c/h3\u003e\u003cp\u003e命令\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eTABLE \u003cem class=\"replaceable\"\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003e等价于\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eSELECT * FROM \u003cem class=\"replaceable\"\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/em\u003e\n\u003c/pre\u003e\u003cp\u003e它可以作为顶层命令使用，也可以作为复杂查询中一种节省空间的语法变体。只有 \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e、\u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e、\u003ccode class=\"literal\"\u003eINTERSECT\u003c/code\u003e、\u003ccode class=\"literal\"\u003eEXCEPT\u003c/code\u003e、\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e、\u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e、\u003ccode class=\"literal\"\u003eOFFSET\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFETCH\u003c/code\u003e以及\u003ccode class=\"literal\"\u003eFOR\u003c/code\u003e锁定子句可以用于 \u003ccode class=\"command\"\u003eTABLE\u003c/code\u003e。不能使用\u003ccode class=\"literal\"\u003eWHERE\u003c/code\u003e子句和任何形式的聚合。\u003c/p\u003e\u003c/div\u003e","key":"parameters","title":"参数"},{"html":"\u003cp\u003e要将表\u003ccode class=\"literal\"\u003efilms\u003c/code\u003e与表\u003ccode class=\"literal\"\u003edistributors\u003c/code\u003e连接：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eSELECT f.title, f.did, d.name, f.date_prod, f.kind\n    FROM distributors d JOIN films f USING (did);\n\n       title       | did |     name     | date_prod  |   kind\n-------------------+-----+--------------+------------+----------\n The Third Man     | 101 | British Lion | 1949-12-23 | Drama\n The African Queen | 101 | British Lion | 1951-08-11 | Romantic\n ...\n\u003c/pre\u003e\u003cp\u003e要对所有电影的\u003ccode class=\"literal\"\u003elen\u003c/code\u003e列求和并且用 \u003ccode class=\"literal\"\u003ekind\u003c/code\u003e对结果分组：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eSELECT kind, sum(len) AS total FROM films GROUP BY kind;\n\n   kind   | total\n----------+-------\n Action   | 07:34\n Comedy   | 02:58\n Drama    | 14:28\n Musical  | 06:42\n Romantic | 04:38\n\u003c/pre\u003e\u003cp\u003e要对所有电影的\u003ccode class=\"literal\"\u003elen\u003c/code\u003e列求和、对结果按照 \u003ccode class=\"literal\"\u003ekind\u003c/code\u003e分组并且显示总长小于 5 小时的分组：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eSELECT kind, sum(len) AS total\n    FROM films\n    GROUP BY kind\n    HAVING sum(len) \u0026lt; interval '5 hours';\n\n   kind   | total\n----------+-------\n Comedy   | 02:58\n Romantic | 04:38\n\u003c/pre\u003e\u003cp\u003e下面两个示例都是根据第二列（\u003ccode class=\"literal\"\u003ename\u003c/code\u003e）的内容来排序结果：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eSELECT * FROM distributors ORDER BY name;\nSELECT * FROM distributors ORDER BY 2;\n\n did |       name\n-----+------------------\n 109 | 20th Century Fox\n 110 | Bavaria Atelier\n 101 | British Lion\n 107 | Columbia\n 102 | Jean Luc Godard\n 113 | Luso films\n 104 | Mosfilm\n 103 | Paramount\n 106 | Toho\n 105 | United Artists\n 111 | Walt Disney\n 112 | Warner Bros.\n 108 | Westward\n\u003c/pre\u003e\u003cp\u003e接下来的示例展示了如何得到表\u003ccode class=\"literal\"\u003edistributors\u003c/code\u003e和 \u003ccode class=\"literal\"\u003eactors\u003c/code\u003e的并集，把结果限制为那些在每个表中以字母 W 开始的行。这里只需要不重复的行，因此省略了关键词 \u003ccode class=\"literal\"\u003eALL\u003c/code\u003e。\u003c/p\u003e\u003cpre class=\"programlisting\"\u003edistributors:               actors:\n did |     name              id |     name\n-----+--------------        ----+----------------\n 108 | Westward               1 | Woody Allen\n 111 | Walt Disney            2 | Warren Beatty\n 112 | Warner Bros.           3 | Walter Matthau\n ...                         ...\n\nSELECT distributors.name\n    FROM distributors\n    WHERE distributors.name LIKE 'W%'\nUNION\nSELECT actors.name\n    FROM actors\n    WHERE actors.name LIKE 'W%';\n\n      name\n----------------\n Walt Disney\n Walter Matthau\n Warner Bros.\n Warren Beatty\n Westward\n Woody Allen\n\u003c/pre\u003e\u003cp\u003e这个示例展示了如何在\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e子句中使用函数，分别使用和不使用列定义列表：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eCREATE FUNCTION distributors(int) RETURNS SETOF distributors AS $$\n    SELECT * FROM distributors WHERE did = $1;\n$$ LANGUAGE SQL;\n\nSELECT * FROM distributors(111);\n did |    name\n-----+-------------\n 111 | Walt Disney\n\nCREATE FUNCTION distributors_2(int) RETURNS SETOF record AS $$\n    SELECT * FROM distributors WHERE did = $1;\n$$ LANGUAGE SQL;\n\nSELECT * FROM distributors_2(111) AS (f1 int, f2 text);\n f1  |     f2\n-----+-------------\n 111 | Walt Disney\n\u003c/pre\u003e\u003cp\u003e下面是为函数结果增加序号列的示例：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eSELECT * FROM unnest(ARRAY['a','b','c','d','e','f']) WITH ORDINALITY;\n unnest | ordinality\n--------+----------\n a      |        1\n b      |        2\n c      |        3\n d      |        4\n e      |        5\n f      |        6\n(6 rows)\n\u003c/pre\u003e\u003cp\u003e这个例子展示了如何使用一个简单的 \u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e 子句：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eWITH t AS (\n    SELECT random() as x FROM generate_series(1, 3)\n  )\nSELECT * FROM t\nUNION ALL\nSELECT * FROM t;\n         x\n--------------------\n  0.534150459803641\n  0.520092216785997\n 0.0735620250925422\n  0.534150459803641\n  0.520092216785997\n 0.0735620250925422\n\u003c/pre\u003e\u003cp\u003e请注意，\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e 查询只被求值了一次，因此我们得到了两组相同的三个随机值。\u003c/p\u003e\u003cp\u003e这个示例使用\u003ccode class=\"literal\"\u003eWITH RECURSIVE\u003c/code\u003e从一个只显示直接下属的表中寻找雇员 Mary 的所有下属（直接的或者间接的）以及他们的间接层数：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eWITH RECURSIVE employee_recursive(distance, employee_name, manager_name) AS (\n    SELECT 1, employee_name, manager_name\n    FROM employee\n    WHERE manager_name = 'Mary'\n  UNION ALL\n    SELECT er.distance + 1, e.employee_name, e.manager_name\n    FROM employee_recursive er, employee e\n    WHERE er.employee_name = e.manager_name\n  )\nSELECT distance, employee_name FROM employee_recursive;\n\u003c/pre\u003e\u003cp\u003e注意这种递归查询的典型形式：一个初始条件，后面跟着 \u003ccode class=\"literal\"\u003eUNION\u003c/code\u003e，然后是查询的递归部分。要确保查询的递归部分最终将不返回任何行，否则该查询将无限循环（更多示例见\u003ca href=\"/docs/18/queries-with.html\" title=\"7.8. WITH查询（公共表表达式）\"\u003e第 7.8 节\u003c/a\u003e）。\u003c/p\u003e\u003cp\u003e这个示例使用\u003ccode class=\"literal\"\u003eLATERAL\u003c/code\u003e为\u003ccode class=\"structname\"\u003emanufacturers\u003c/code\u003e 表的每一行应用一个集合返回函数\u003ccode class=\"function\"\u003eget_product_names()\u003c/code\u003e：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eSELECT m.name AS mname, pname\nFROM manufacturers m, LATERAL get_product_names(m.id) pname;\n\u003c/pre\u003e\u003cp\u003e当前没有任何产品的制造商不会出现在结果中，因为这是一个内连接。如果我们希望把这类制造商的名称包括在结果中，我们可以：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eSELECT m.name AS mname, pname\nFROM manufacturers m LEFT JOIN LATERAL get_product_names(m.id) pname ON true;\n\u003c/pre\u003e","key":"examples","title":"示例"},{"html":"\u003cp\u003e当然，\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e语句与 SQL 标准兼容。但它也有一些扩展和缺失的特性。\u003c/p\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e省略的\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e子句\u003c/h3\u003e\u003cp\u003e\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e 允许省略 \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e 子句。它可以直接用于计算简单表达式的结果：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eSELECT 2+2;\n\n ?column?\n----------\n        4\n\u003c/pre\u003e\u003cp\u003e其他一些 \u003cacronym\u003eSQL\u003c/acronym\u003e 数据库必须引入一个只有一行的虚拟表，才能从该表执行 \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e。\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e空\u003ccode class=\"literal\"\u003eSELECT\u003c/code\u003e列表\u003c/h3\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eSELECT\u003c/code\u003e之后的输出表达式列表可以为空，这会产生一个零列的结果表。按照 SQL 标准，这不是合法的语法。\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e允许这样做，是为了与允许零列的表保持一致。不过在使用 \u003ccode class=\"literal\"\u003eDISTINCT\u003c/code\u003e时不允许空列表。\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e省略\u003ccode class=\"literal\"\u003eAS\u003c/code\u003e关键词\u003c/h3\u003e\u003cp\u003e在 SQL 标准中，只要新列名是一个合法的列名（就是说与任何保留关键词不同），就可以省略输出列名之前的可选关键词\u003ccode class=\"literal\"\u003eAS\u003c/code\u003e。\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e要稍微严格些：只要新列名匹配任何关键词（保留或者非保留）就需要\u003ccode class=\"literal\"\u003eAS\u003c/code\u003e。推荐的习惯是使用 \u003ccode class=\"literal\"\u003eAS\u003c/code\u003e或者带双引号的输出列名来防止与未来增加的关键词可能的冲突。\u003c/p\u003e\u003cp\u003e在\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e项中，标准和 \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e都允许在非保留关键字别名前省略\u003ccode class=\"literal\"\u003eAS\u003c/code\u003e。但是由于语法歧义，这种写法无法用于输出列名。\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e在 \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e 中省略子 \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e 别名\u003c/h3\u003e\u003cp\u003e根据 SQL 标准，\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e 列表中的子 \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e 必须有别名。在 \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e 中，这个别名可以省略。\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eONLY\u003c/code\u003e与继承\u003c/h3\u003e\u003cp\u003eSQL 标准要求在使用\u003ccode class=\"literal\"\u003eONLY\u003c/code\u003e时用圆括号括起表名，例如\u003ccode class=\"literal\"\u003eSELECT * FROM ONLY (tab1), ONLY (tab2) WHERE ...\u003c/code\u003e。\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e认为这些圆括号是可选的。\u003c/p\u003e\u003cp\u003e\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e允许在末尾写上\u003ccode class=\"literal\"\u003e*\u003c/code\u003e，显式指定包含子表的非\u003ccode class=\"literal\"\u003eONLY\u003c/code\u003e行为。标准不允许这种写法。\u003c/p\u003e\u003cp\u003e（这些要点同样适用于所有支持\u003ccode class=\"literal\"\u003eONLY\u003c/code\u003e选项的 SQL 命令。）\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eTABLESAMPLE\u003c/code\u003e子句的限制\u003c/h3\u003e\u003cp\u003e目前只有普通表和物化视图可以使用\u003ccode class=\"literal\"\u003eTABLESAMPLE\u003c/code\u003e子句。按照 SQL 标准，它应当能够应用于任何\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e项。\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e中的函数调用\u003c/h3\u003e\u003cp\u003e\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e允许把函数调用直接写成 \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e列表中的一个成员。在 SQL 标准中，必须把这样的函数调用包装在一个子\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e中。也就是说，语法 \u003ccode class=\"literal\"\u003eFROM \u003cem class=\"replaceable\"\u003e\u003ccode\u003efunc\u003c/code\u003e\u003c/em\u003e(...) \u003cem class=\"replaceable\"\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e\u003c/code\u003e 近似等价于 \u003ccode class=\"literal\"\u003eFROM LATERAL (SELECT \u003cem class=\"replaceable\"\u003e\u003ccode\u003efunc\u003c/code\u003e\u003c/em\u003e(...)) \u003cem class=\"replaceable\"\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e\u003c/code\u003e。注意该\u003ccode class=\"literal\"\u003eLATERAL\u003c/code\u003e被认为是隐式的，这是因为标准对于 \u003ccode class=\"literal\"\u003eFROM\u003c/code\u003e中的一个\u003ccode class=\"literal\"\u003eUNNEST()\u003c/code\u003e项要求 \u003ccode class=\"literal\"\u003eLATERAL\u003c/code\u003e语义。\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e会把 \u003ccode class=\"literal\"\u003eUNNEST()\u003c/code\u003e和其他集合返回函数同样对待。\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e和\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e可用的名字空间\u003c/h3\u003e\u003cp\u003e在 SQL-92 标准中，一个\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e子句只能使用输出列名或者序号，而一个\u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e子句只能使用基于输入列名的表达式。\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e扩展了这两种子句以允许它们使用其他的选择（但如果有歧义时还是使用标准的解释）。\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e也允许两种子句指定任意表达式。注意出现在一个表达式中的名称将总是被当做输入列名而不是输出列名。\u003c/p\u003e\u003cp\u003eSQL:1999 及其后的标准使用了一种略微不同的定义，它并不完全向后兼容 SQL-92。不过，在大部分的情况下，\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e会以与 SQL:1999 相同的方式解释\u003ccode class=\"literal\"\u003eORDER BY\u003c/code\u003e或\u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e表达式。\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e函数依赖\u003c/h3\u003e\u003cp\u003e只有当一个表的主键被包括在\u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e列表中时，\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e才识别函数依赖（允许从\u003ccode class=\"literal\"\u003eGROUP BY\u003c/code\u003e中省略列）。SQL 标准指定了应该要识别的额外情况。\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e和\u003ccode class=\"literal\"\u003eOFFSET\u003c/code\u003e\u003c/h3\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eLIMIT\u003c/code\u003e和\u003ccode class=\"literal\"\u003eOFFSET\u003c/code\u003e子句是 \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e特有的语法，在 \u003cspan class=\"productname\"\u003eMySQL\u003c/span\u003e中也被使用。SQL:2008 标准已经引入了具有相同功能的子句\u003ccode class=\"literal\"\u003eOFFSET ... FETCH {FIRST|NEXT} ...\u003c/code\u003e（如上文\u003ca href=\"/docs/18/sql-select.html#SQL-LIMIT\" title=\"LIMIT 子句\"\u003eLIMIT Clause\u003c/a\u003e中所示）。这种语法也被\u003cspan class=\"productname\"\u003eIBM DB2\u003c/span\u003e使用（为\u003cspan class=\"productname\"\u003eOracle\u003c/span\u003e编写的应用常常使用自动生成的 \u003ccode class=\"literal\"\u003erownum\u003c/code\u003e列来实现这些子句的效果，这在 PostgreSQL 中是没有的）。\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e\u003c/h3\u003e\u003cp\u003e尽管 SQL 标准中出现了\u003ccode class=\"literal\"\u003eFOR UPDATE\u003c/code\u003e，但标准只允许它作为 \u003ccode class=\"command\"\u003eDECLARE CURSOR\u003c/code\u003e的一个选项。\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e允许它出现在任何 \u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e查询以及子\u003ccode class=\"command\"\u003eSELECT\u003c/code\u003e中，但这是一种扩展。\u003ccode class=\"literal\"\u003eFOR NO KEY UPDATE\u003c/code\u003e、\u003ccode class=\"literal\"\u003eFOR SHARE\u003c/code\u003e 以及\u003ccode class=\"literal\"\u003eFOR KEY SHARE\u003c/code\u003e变体以及\u003ccode class=\"literal\"\u003eNOWAIT\u003c/code\u003e 和\u003ccode class=\"literal\"\u003eSKIP LOCKED\u003c/code\u003e选项没有在标准中出现。\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e中的数据修改语句\u003c/h3\u003e\u003cp\u003e\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e允许将\u003ccode class=\"command\"\u003eINSERT\u003c/code\u003e、\u003ccode class=\"command\"\u003eUPDATE\u003c/code\u003e、\u003ccode class=\"command\"\u003eDELETE\u003c/code\u003e以及\u003ccode class=\"command\"\u003eMERGE\u003c/code\u003e用作\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e 查询。这在 SQL 标准中是找不到的。\u003c/p\u003e\u003c/div\u003e\u003cdiv class=\"refsect2\"\u003e\u003ch3\u003e非标准子句\u003c/h3\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eDISTINCT ON ( ... )\u003c/code\u003e是 SQL 标准的扩展。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eROWS FROM( ... )\u003c/code\u003e是 SQL 标准的扩展。\u003c/p\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eWITH\u003c/code\u003e的\u003ccode class=\"literal\"\u003eMATERIALIZED\u003c/code\u003e和\u003ccode class=\"literal\"\u003eNOT MATERIALIZED\u003c/code\u003e选项是 SQL 标准的扩展。\u003c/p\u003e\u003c/div\u003e","key":"compatibility","title":"兼容性"}],"sections_same_as":"","synopsis_html":"[ WITH [ RECURSIVE ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003ewith_query\u003c/code\u003e\u003c/em\u003e [, ...] ]\nSELECT [ ALL | DISTINCT [ ON ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e [, ...] ) ] ]\n    [ { * | \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e [ [ AS ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003eoutput_name\u003c/code\u003e\u003c/em\u003e ] } [, ...] ]\n    [ FROM \u003cem class=\"replaceable\"\u003e\u003ccode\u003efrom_item\u003c/code\u003e\u003c/em\u003e [, ...] ]\n    [ WHERE \u003cem class=\"replaceable\"\u003e\u003ccode\u003econdition\u003c/code\u003e\u003c/em\u003e ]\n    [ GROUP BY [ ALL | DISTINCT ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003egrouping_element\u003c/code\u003e\u003c/em\u003e [, ...] ]\n    [ HAVING \u003cem class=\"replaceable\"\u003e\u003ccode\u003econdition\u003c/code\u003e\u003c/em\u003e ]\n    [ WINDOW \u003cem class=\"replaceable\"\u003e\u003ccode\u003ewindow_name\u003c/code\u003e\u003c/em\u003e AS ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ewindow_definition\u003c/code\u003e\u003c/em\u003e ) [, ...] ]\n    [ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003eselect\u003c/code\u003e\u003c/em\u003e ]\n    [ ORDER BY \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e [ ASC | DESC | USING \u003cem class=\"replaceable\"\u003e\u003ccode\u003eoperator\u003c/code\u003e\u003c/em\u003e ] [ NULLS { FIRST | LAST } ] [, ...] ]\n    [ LIMIT { \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e | ALL } ]\n    [ OFFSET \u003cem class=\"replaceable\"\u003e\u003ccode\u003estart\u003c/code\u003e\u003c/em\u003e [ ROW | ROWS ] ]\n    [ FETCH { FIRST | NEXT } [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecount\u003c/code\u003e\u003c/em\u003e ] { ROW | ROWS } { ONLY | WITH TIES } ]\n    [ FOR { UPDATE | NO KEY UPDATE | SHARE | KEY SHARE } [ OF \u003cem class=\"replaceable\"\u003e\u003ccode\u003efrom_reference\u003c/code\u003e\u003c/em\u003e [, ...] ] [ NOWAIT | SKIP LOCKED ] [...] ]\n\n\u003cspan class=\"phrase\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003efrom_item\u003c/code\u003e\u003c/em\u003e可以是下列之一：\u003c/span\u003e\n\n    [ ONLY ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e [ * ] [ [ AS ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e [ ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_alias\u003c/code\u003e\u003c/em\u003e [, ...] ) ] ]\n                [ TABLESAMPLE \u003cem class=\"replaceable\"\u003e\u003ccode\u003esampling_method\u003c/code\u003e\u003c/em\u003e ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargument\u003c/code\u003e\u003c/em\u003e [, ...] ) [ REPEATABLE ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003eseed\u003c/code\u003e\u003c/em\u003e ) ] ]\n    [ LATERAL ] ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003eselect\u003c/code\u003e\u003c/em\u003e ) [ [ AS ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e [ ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_alias\u003c/code\u003e\u003c/em\u003e [, ...] ) ] ]\n    \u003cem class=\"replaceable\"\u003e\u003ccode\u003ewith_query_name\u003c/code\u003e\u003c/em\u003e [ [ AS ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e [ ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_alias\u003c/code\u003e\u003c/em\u003e [, ...] ) ] ]\n    [ LATERAL ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003efunction_name\u003c/code\u003e\u003c/em\u003e ( [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargument\u003c/code\u003e\u003c/em\u003e [, ...] ] )\n                [ WITH ORDINALITY ] [ [ AS ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e [ ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_alias\u003c/code\u003e\u003c/em\u003e [, ...] ) ] ]\n    [ LATERAL ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003efunction_name\u003c/code\u003e\u003c/em\u003e ( [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargument\u003c/code\u003e\u003c/em\u003e [, ...] ] ) [ AS ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_definition\u003c/code\u003e\u003c/em\u003e [, ...] )\n    [ LATERAL ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003efunction_name\u003c/code\u003e\u003c/em\u003e ( [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargument\u003c/code\u003e\u003c/em\u003e [, ...] ] ) AS ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_definition\u003c/code\u003e\u003c/em\u003e [, ...] )\n    [ LATERAL ] ROWS FROM( \u003cem class=\"replaceable\"\u003e\u003ccode\u003efunction_name\u003c/code\u003e\u003c/em\u003e ( [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargument\u003c/code\u003e\u003c/em\u003e [, ...] ] ) [ AS ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_definition\u003c/code\u003e\u003c/em\u003e [, ...] ) ] [, ...] )\n                [ WITH ORDINALITY ] [ [ AS ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003ealias\u003c/code\u003e\u003c/em\u003e [ ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_alias\u003c/code\u003e\u003c/em\u003e [, ...] ) ] ]\n    \u003cem class=\"replaceable\"\u003e\u003ccode\u003efrom_item\u003c/code\u003e\u003c/em\u003e \u003cem class=\"replaceable\"\u003e\u003ccode\u003ejoin_type\u003c/code\u003e\u003c/em\u003e \u003cem class=\"replaceable\"\u003e\u003ccode\u003efrom_item\u003c/code\u003e\u003c/em\u003e { ON \u003cem class=\"replaceable\"\u003e\u003ccode\u003ejoin_condition\u003c/code\u003e\u003c/em\u003e | USING ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ejoin_column\u003c/code\u003e\u003c/em\u003e [, ...] ) [ AS \u003cem class=\"replaceable\"\u003e\u003ccode\u003ejoin_using_alias\u003c/code\u003e\u003c/em\u003e ] }\n    \u003cem class=\"replaceable\"\u003e\u003ccode\u003efrom_item\u003c/code\u003e\u003c/em\u003e NATURAL \u003cem class=\"replaceable\"\u003e\u003ccode\u003ejoin_type\u003c/code\u003e\u003c/em\u003e \u003cem class=\"replaceable\"\u003e\u003ccode\u003efrom_item\u003c/code\u003e\u003c/em\u003e\n    \u003cem class=\"replaceable\"\u003e\u003ccode\u003efrom_item\u003c/code\u003e\u003c/em\u003e CROSS JOIN \u003cem class=\"replaceable\"\u003e\u003ccode\u003efrom_item\u003c/code\u003e\u003c/em\u003e\n\n\u003cspan class=\"phrase\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003egrouping_element\u003c/code\u003e\u003c/em\u003e可以是下列之一：\u003c/span\u003e\n\n    ( )\n    \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e\n    ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e [, ...] )\n    ROLLUP ( { \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e | ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e [, ...] ) } [, ...] )\n    CUBE ( { \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e | ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/em\u003e [, ...] ) } [, ...] )\n    GROUPING SETS ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003egrouping_element\u003c/code\u003e\u003c/em\u003e [, ...] )\n\n\u003cspan class=\"phrase\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003ewith_query\u003c/code\u003e\u003c/em\u003e为：\u003c/span\u003e\n\n    \u003cem class=\"replaceable\"\u003e\u003ccode\u003ewith_query_name\u003c/code\u003e\u003c/em\u003e [ ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e [, ...] ) ] AS [ [ NOT ] MATERIALIZED ] ( \u003cem class=\"replaceable\"\u003e\u003ccode\u003eselect\u003c/code\u003e\u003c/em\u003e | \u003cem class=\"replaceable\"\u003e\u003ccode\u003evalues\u003c/code\u003e\u003c/em\u003e | \u003cem class=\"replaceable\"\u003e\u003ccode\u003einsert\u003c/code\u003e\u003c/em\u003e | \u003cem class=\"replaceable\"\u003e\u003ccode\u003eupdate\u003c/code\u003e\u003c/em\u003e | \u003cem class=\"replaceable\"\u003e\u003ccode\u003edelete\u003c/code\u003e\u003c/em\u003e | \u003cem class=\"replaceable\"\u003e\u003ccode\u003emerge\u003c/code\u003e\u003c/em\u003e )\n        [ SEARCH { BREADTH | DEPTH } FIRST BY \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e [, ...] SET \u003cem class=\"replaceable\"\u003e\u003ccode\u003esearch_seq_col_name\u003c/code\u003e\u003c/em\u003e ]\n        [ CYCLE \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecolumn_name\u003c/code\u003e\u003c/em\u003e [, ...] SET \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecycle_mark_col_name\u003c/code\u003e\u003c/em\u003e [ TO \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecycle_mark_value\u003c/code\u003e\u003c/em\u003e DEFAULT \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecycle_mark_default\u003c/code\u003e\u003c/em\u003e ] USING \u003cem class=\"replaceable\"\u003e\u003ccode\u003ecycle_path_col_name\u003c/code\u003e\u003c/em\u003e ]\n\nTABLE [ ONLY ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003etable_name\u003c/code\u003e\u003c/em\u003e [ * ]","synopsis_text":"[ WITH [ RECURSIVE ] with_query [, ...] ]\nSELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]\n[ { * | expression [ [ AS ] output_name ] } [, ...] ]\n[ FROM from_item [, ...] ]\n[ WHERE condition ]\n[ GROUP BY [ ALL | DISTINCT ] grouping_element [, ...] ]\n[ HAVING condition ]\n[ WINDOW window_name AS ( window_definition ) [, ...] ]\n[ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ]\n[ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]\n[ LIMIT { count | ALL } ]\n[ OFFSET start [ ROW | ROWS ] ]\n[ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } { ONLY | WITH TIES } ]\n[ FOR { UPDATE | NO KEY UPDATE | SHARE | KEY SHARE } [ OF from_reference [, ...] ] [ NOWAIT | SKIP LOCKED ] [...] ]\n\nfrom_item可以是下列之一：\n\n[ ONLY ] table_name [ * ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]\n[ TABLESAMPLE sampling_method ( argument [, ...] ) [ REPEATABLE ( seed ) ] ]\n[ LATERAL ] ( select ) [ [ AS ] alias [ ( column_alias [, ...] ) ] ]\nwith_query_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ]\n[ LATERAL ] function_name ( [ argument [, ...] ] )\n[ WITH ORDINALITY ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]\n[ LATERAL ] function_name ( [ argument [, ...] ] ) [ AS ] alias ( column_definition [, ...] )\n[ LATERAL ] function_name ( [ argument [, ...] ] ) AS ( column_definition [, ...] )\n[ LATERAL ] ROWS FROM( function_name ( [ argument [, ...] ] ) [ AS ( column_definition [, ...] ) ] [, ...] )\n[ WITH ORDINALITY ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]\nfrom_item join_type from_item { ON join_condition | USING ( join_column [, ...] ) [ AS join_using_alias ] }\nfrom_item NATURAL join_type from_item\nfrom_item CROSS JOIN from_item\ngrouping_element可以是下列之一：\n\n( )\nexpression\n( expression [, ...] )\nROLLUP ( { expression | ( expression [, ...] ) } [, ...] )\nCUBE ( { expression | ( expression [, ...] ) } [, ...] )\nGROUPING SETS ( grouping_element [, ...] )\n\nwith_query为：\nwith_query_name [ ( column_name [, ...] ) ] AS [ [ NOT ] MATERIALIZED ] ( select | values | insert | update | delete | merge )\n[ SEARCH { BREADTH | DEPTH } FIRST BY column_name [, ...] SET search_seq_col_name ]\n[ CYCLE column_name [, ...] SET cycle_mark_col_name [ TO cycle_mark_value DEFAULT cycle_mark_default ] USING cycle_path_col_name ]\n\nTABLE [ ONLY ] table_name [ * ]"}},"RequestedLocale":"zh-Hans","Fallback":false,"Versions":["10","11","12","13","14","15","16","17","18","19","20","6.4","6.5","7.0","7.1","7.2","7.3","7.4","8.0","8.1","8.2","8.3","8.4","9.0","9.1","9.2","9.3","9.4","9.5","9.6"],"Locales":["en","zh-Hans"],"Signatures":null,"Spellings":null,"SQLState":null,"Evidence":null}
