Subqueries in PostgreSQL

About subqueries

A subquery is a query that appears inside another query statement. Subqueries are also referred to as sub-selects or nested selects. The full SELECT syntax is valid in subqueries.

The WITH clause is not supported on a subquery. The following query returns an error:

  SELECT 
  
 username 
 FROM 
  
 ( 
  
 WITH 
  
 result 
  
 AS 
  
 ( 
 SELECT 
  
 * 
  
 FROM 
  
 Players 
 ) 
  
 SELECT 
  
 * 
  
 FROM 
  
 result 
 ); 
 

Common tables used in examples

The following are tables that are used in the sample queries on this page:

  Players 
 + 
 -----------------------------+ 
 | 
  
 username 
  
 | 
  
 level 
  
 | 
  
 team 
  
 | 
 + 
 -----------------------------+ 
 | 
  
 gorbie 
  
 | 
  
 29 
  
 | 
  
 red 
  
 | 
 | 
  
 junelyn 
  
 | 
  
 2 
  
 | 
  
 blue 
  
 | 
 | 
  
 corba 
  
 | 
  
 43 
  
 | 
  
 green 
  
 | 
 + 
 -----------------------------+ 
 
  Mascots 
 + 
 -------------------+ 
 | 
  
 mascot 
  
 | 
  
 team 
  
 | 
 + 
 -------------------+ 
 | 
  
 cardinal 
  
 | 
  
 red 
  
 | 
 | 
  
 parrot 
  
 | 
  
 green 
  
 | 
 | 
  
 finch 
  
 | 
  
 blue 
  
 | 
 | 
  
 sparrow 
  
 | 
  
 yellow 
  
 | 
 + 
 -------------------+ 
 

Expression subqueries

Expression subqueries are used in a query wherever expressions are valid. They return a single value, as opposed to a column or table. Expression subqueries can be correlated .

Scalar subqueries

SELECT ( subquery ) FROM  table 
 

Description

A subquery inside an expression is interpreted as a scalar subquery. Scalar subqueries are often used in the SELECT list or WHERE clause.

A scalar subquery is an ordinary SELECT query in parentheses that returns exactly one row with one column. The SELECT query is executed and the single returned value is used in the surrounding value expression. It is an error to use a query that returns more than one row or more than one column as a scalar subquery. (But if, during a particular execution, the subquery returns no rows, there is no error; the scalar result is taken to be null.) The subquery can refer to variables from the surrounding query, which will act as constants during any one evaluation of the subquery.

Examples

In this example, a correlated scalar subquery returns the mascots for a list of players, using the Players and Mascots tables:

  SELECT 
  
 username 
 , 
  
 ( 
 SELECT 
  
 mascot 
  
 FROM 
  
 Mascots 
  
 WHERE 
  
 Players 
 . 
 team 
  
 = 
  
 Mascots 
 . 
 team 
 ) 
  
 AS 
  
 player_mascot 
 FROM 
  
 Players 
 ; 
 + 
 ---------------------------+ 
 | 
  
 username 
  
 | 
  
 player_mascot 
  
 | 
 + 
 ---------------------------+ 
 | 
  
 gorbie 
  
 | 
  
 cardinal 
  
 | 
 | 
  
 junelyn 
  
 | 
  
 finch 
  
 | 
 | 
  
 corba 
  
 | 
  
 parrot 
  
 | 
 + 
 ---------------------------+ 
 

In this example, an aggregate scalar subquery calculates avg_level , the average level of a user in the Players table.

  SELECT 
  
 username 
 , 
  
 level 
 , 
  
 ( 
 SELECT 
  
 AVG 
 ( 
 level 
 ) 
  
 FROM 
  
 Players 
 ) 
  
 AS 
  
 avg_level 
 FROM 
  
 Players 
 ; 
 + 
 ---------------------------------------+ 
 | 
  
 username 
  
 | 
  
 level 
  
 | 
  
 avg_level 
  
 | 
 + 
 ---------------------------------------+ 
 | 
  
 gorbie 
  
 | 
  
 29 
  
 | 
  
 24 
 . 
 66 
  
 | 
 | 
  
 junelyn 
  
 | 
  
 2 
  
 | 
  
 24 
 . 
 66 
  
 | 
 | 
  
 corba 
  
 | 
  
 43 
  
 | 
  
 24 
 . 
 66 
  
 | 
 + 
 ---------------------------------------+ 
 

IN subqueries

SELECT  value 
 
IN ( subquery )

Description

Returns TRUE if value matches the select-list column value in any of the returned rows.

Returns FALSE if no equal row is found or the subquery returns zero rows.

Returns NULL if value is NULL or if no equal row is found and the subquery returns at least one NULL row.

The subquery's SELECT list must have a single column of any type and its type must be comparable to the type for value . If not, an error is returned.

If you prefer to use ANY/SOME syntax, these are equivalent:

  value 
 
IN ( subquery )  value 
 
= ANY ( subquery )  value 
 
= SOME ( subquery )

Operators other than = are not supported for ANY/SOME expressions.

Examples

In this example, the IN operator that checks to see if a username called corba exists within the Players table:

  SELECT 
  
 'corba' 
  
 IN 
  
 ( 
 SELECT 
  
 username 
  
 FROM 
  
 Players 
 ) 
  
 AS 
  
 result 
 ; 
 + 
 --------+ 
 | 
  
 result 
  
 | 
 + 
 --------+ 
 | 
  
 TRUE 
  
 | 
 + 
 --------+ 
 

NOT IN subqueries

SELECT  value 
 
NOT IN ( subquery )

Description

Returns FALSE if value does not match the select-list column value in any of the returned rows.

Returns TRUE if no equal row is found or the subquery returns zero rows.

Returns NULL if value is NULL or if no equal row is found and the subquery returns at least one NULL row.

The subquery's SELECT list must have a single column of any type and its type must be comparable to the type for value . If not, an error is returned.

If you prefer to use ALL syntax, these are equivalent:

  value 
 
NOT IN ( subquery )  value 
 
!= ALL ( subquery )

Operators other than != are not supported for ALL expressions.

EXISTS subqueries

SELECT EXISTS( subquery )

Description

Returns TRUE if the subquery produces one or more rows. Returns FALSE if the subquery produces zero rows. Never returns NULL . Unlike all other expression subqueries, there are no rules about the column list. Any number of columns may be selected and it will not affect the query result.

Examples

In this example, the EXISTS operator checks to see if any rows are produced, using the Players table:

  SELECT 
  
 EXISTS 
 ( 
 SELECT 
  
 username 
  
 FROM 
  
 Players 
  
 WHERE 
  
 team 
  
 = 
  
 'yellow' 
 ) 
  
 AS 
  
 result 
 ; 
 + 
 --------+ 
 | 
  
 result 
  
 | 
 + 
 --------+ 
 | 
  
 FALSE 
  
 | 
 + 
 --------+ 
 

Table subqueries

SELECT  select-list 
 
FROM ( subquery ) [ [ AS ] alias ]

Description

With table subqueries, the outer query treats the result of the subquery as a table. You can only use these in the FROM clause.

Examples

In this example, a subquery returns a table of usernames from the Players table:

  SELECT 
  
 results 
 . 
 username 
 FROM 
  
 ( 
 SELECT 
  
 * 
  
 FROM 
  
 Players 
 ) 
  
 AS 
  
 results 
 ; 
 + 
 -----------+ 
 | 
  
 username 
  
 | 
 + 
 -----------+ 
 | 
  
 gorbie 
  
 | 
 | 
  
 junelyn 
  
 | 
 | 
  
 corba 
  
 | 
 + 
 -----------+ 
 

Correlated subqueries

A correlated subquery is a subquery that references a column from outside that subquery. Correlation prevents reusing of the subquery result.

Examples

In this example, a list of mascots that don't have any players assigned to them is returned. The Mascots and Players tables are referenced.

  SELECT 
  
 mascot 
 FROM 
  
 Mascots 
 WHERE 
  
 NOT 
  
 EXISTS 
 ( 
 SELECT 
  
 username 
  
 FROM 
  
 Players 
  
 WHERE 
  
 Mascots 
 . 
 team 
  
 = 
  
 Players 
 . 
 team 
 ); 
 + 
 ----------+ 
 | 
  
 mascot 
  
 | 
 + 
 ----------+ 
 | 
  
 sparrow 
  
 | 
 + 
 ----------+ 
 

In this example, a correlated scalar subquery returns the mascots for a list of players, using the Players and Mascots tables:

  SELECT 
  
 username 
 , 
  
 ( 
 SELECT 
  
 mascot 
  
 FROM 
  
 Mascots 
  
 WHERE 
  
 Players 
 . 
 team 
  
 = 
  
 Mascots 
 . 
 team 
 ) 
  
 AS 
  
 player_mascot 
 FROM 
  
 Players 
 ; 
 + 
 ---------------------------+ 
 | 
  
 username 
  
 | 
  
 player_mascot 
  
 | 
 + 
 ---------------------------+ 
 | 
  
 gorbie 
  
 | 
  
 cardinal 
  
 | 
 | 
  
 junelyn 
  
 | 
  
 finch 
  
 | 
 | 
  
 corba 
  
 | 
  
 parrot 
  
 | 
 + 
 ---------------------------+ 
 
Design a Mobile Site
View Site in Mobile | Classic
Share by: