[ WITH [ RECURSIVE ] $with_query$ [ , ... ] ]
    SELECT [ ALL [ * | { $expression$ [ [ AS ] $output_name$ ] } [ , ... ] ] |
    DISTINCT [ ON ( $expression$ [ , ... ] ) ] { * | { $expression$ [ [ AS ] $output_name$ ] } [ , ... ] } ]
    [ FROM $from_item$ [ , ... ] ]
    [ WHERE $condition$ ]
    [ GROUP BY [ ALL | DISTINCT ] $grouping_element$ [ , ... ] ]
    [ HAVING $condition$ ]
    [ WINDOW { $window_name$ AS ( $window_definition$ ) } [ , ... ] ]
    [ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] $select$ ]
    [ ORDER BY { $expression$ [ ASC | DESC | USING $operator$ ] [ NULLS { FIRST | LAST } ] } [ , ... ] ]
    [ LIMIT { $count$ | ALL } | FETCH { FIRST | NEXT } [ $count$ ] { ROW | ROWS } { ONLY | WITH TIES } ]
    [ OFFSET $start$ [ ROW | ROWS ] ]
    [ { FOR { UPDATE | NO KEY UPDATE | SHARE | KEY SHARE } [ OF $table_name$ [ , ... ] ] [ NOWAIT | SKIP LOCKED ] } [ ... ] ]

TABLE { ONLY $table_name$ | $table_name$ [ * ] }

where $from_item$ is:

{ ONLY $table_name$ | $table_name$ [ * ] } [ [ AS ] $alias$ [ ( $column_alias$ [ , ... ] ) ] ]
    [ TABLESAMPLE $sampling_method$ ( $argument$ [ , ... ] ) [ REPEATABLE ( $seed$ ) ] ] |
    [ LATERAL ] ( $select$ ) [ AS ] $alias$ [ ( $column_alias$ [ , ... ] ) ] |
    $with_query_name$ [ [ AS ] $alias$ [ ( $column_alias$ [ , ... ] ) ] ] |
    [ LATERAL ] $function_name$ ( [ $argument$ [ , ... ] ] )
    [ WITH ORDINALITY ] [ [ AS ] $alias$ [ ( $column_alias$ [ , ... ] ) ] ] |
    [ LATERAL ] $function_name$ ( [ $argument$ [ , ... ] ] ) [ AS ] $alias$ ( $column_definition$ [ , ... ] ) |
    [ LATERAL ] $function_name$ ( [ $argument$ [ , ... ] ] ) AS ( $column_definition$ [ , ... ] ) |
    [ LATERAL ] ROWS FROM( { $function_name$ ( [ $argument$ [ , ... ] ] ) [ AS ( $column_definition$ [ , ... ] ) ] } [ , ... ] )
    [ WITH ORDINALITY ] [ [ AS ] $alias$ [ ( $column_alias$ [ , ... ] ) ] ] |
    $from_item_recursive$ $join_type$ $from_item_recursive$ { ON $join_condition$ | USING ( $join_column$ [ , ... ] ) [ AS $join_using_alias$ ] } |
    $from_item_recursive$ NATURAL $join_type$ $from_item_recursive$ |
    $from_item_recursive$ CROSS JOIN $from_item_recursive$

where $grouping_element$ is:

( ) |
    $expression$ |
    ( $expression$ [ , ... ] ) |
    ROLLUP ( { $expression$ | ( $expression$ [ , ... ] ) } [ , ... ] ) |
    CUBE ( { $expression$ | ( $expression$ [ , ... ] ) } [ , ... ] ) |
    GROUPING SETS ( $grouping_element_recursive$ [ , ... ] )

where $with_query$ is:

$with_query_name$ [ ( $column_name$ [ , ... ] ) ] AS [ [ NOT ] MATERIALIZED ] ( $select$ | $values$ | $insert$ | $update$ | $delete$ )
    [ 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$ ]
