A SELECT
expression is a subquery within
parentheses. The SELECT
statement must return only one column. The value of the
expression becomes the value of the first row (and only the
first row). If no rows are returned, the expression is
NULL.
SQLite supports several
different types of subqueries, so you need to be careful about
which style you’re using. Several expressions, such as IN
, allow a direct subquery as
part of their syntax. Similarly, several SQL commands, such as
CREATE TABLE
, support a
subquery syntax. In these cases, the subquery is returning a set
of data, not a single value. When you use this form of a
subquery as a standalone expression, it will only return one
value.
This can sometimes have unexpected results. For example, consider these two expressions:
col IN ( SELECT c FROM t ); col IN ( ( SELECT c FROM t ) );
The only difference between
these two expressions is the extra set of parentheses around the
subquery in the second line. In the first case, the IN
expression sees the subquery
as a direct part of the IN
expression. This allows the IN
to test col
against each row returned by the
subquery.
In the second case, the extra
set of inner parentheses converts the subquery into an
expression. This conversion makes IN
see a single-value expression list, rather
than a subquery. As a result, the col
expression is only tested against the first
row returned by the subquery.
Care must be taken when using
parentheses around SELECT
expressions. Extraneous parentheses shouldn’t alter scalar
expressions, but if a subquery is part of a larger expression,
there can be a critical difference between a subquery and an
expression derived from a subquery.