This is an automated email from the ASF dual-hosted git repository.

github-bot pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/datafusion.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 2061141996 Publish built docs triggered by 
0681004613c3ca893deab4c331d6783166899206
2061141996 is described below

commit 20611419963435c20aba51ecc1cb7fc034886e37
Author: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
AuthorDate: Tue May 7 17:17:23 2024 +0000

    Publish built docs triggered by 0681004613c3ca893deab4c331d6783166899206
---
 _sources/user-guide/sql/subqueries.md.txt | 371 +++++++++++++++++++--
 searchindex.js                            |   2 +-
 user-guide/sql/index.html                 |  11 +-
 user-guide/sql/subqueries.html            | 520 +++++++++++++++++++++++++++---
 4 files changed, 823 insertions(+), 81 deletions(-)

diff --git a/_sources/user-guide/sql/subqueries.md.txt 
b/_sources/user-guide/sql/subqueries.md.txt
index 6055b0fc5b..ee75a6a157 100644
--- a/_sources/user-guide/sql/subqueries.md.txt
+++ b/_sources/user-guide/sql/subqueries.md.txt
@@ -19,80 +19,391 @@
 
 # Subqueries
 
-DataFusion supports `EXISTS`, `NOT EXISTS`, `IN`, `NOT IN` and Scalar 
Subqueries.
+Subqueries (also known as inner queries or nested queries) are queries within
+a query.
+Subqueries can be used in `SELECT`, `FROM`, `WHERE`, and `HAVING` clauses.
 
-The examples below are based on the following table.
+The examples below are based on the following tables.
 
 ```sql
-select * from x;
+SELECT * FROM x;
+
 +----------+----------+
 | column_1 | column_2 |
 +----------+----------+
 | 1        | 2        |
 +----------+----------+
+| 2        | 4        |
++----------+----------+
+```
+
+```sql
+SELECT * FROM y;
+
++--------+--------+
+| number | string |
++--------+--------+
+| 1      | one    |
++--------+--------+
+| 2      | two    |
++--------+--------+
+| 3      | three  |
++--------+--------+
+| 4      | four   |
++--------+--------+
 ```
 
-## EXISTS
+## Subquery operators
 
-The `EXISTS` syntax can be used to find all rows in a relation where a 
correlated subquery produces one or more matches
-for that row. Only correlated subqueries are supported.
+- [[ NOT ] EXISTS](#-not--exists)
+- [[ NOT ] IN](#-not--in)
+
+### [ NOT ] EXISTS
+
+The `EXISTS` operator returns all rows where a
+_[correlated subquery](#correlated-subqueries)_ produces one or more matches 
for
+that row. `NOT EXISTS` returns all rows where a _correlated subquery_ produces
+zero matches for that row. Only _correlated subqueries_ are supported.
 
 ```sql
-select * from x y where exists (select * from x where x.column_1 = y.column_1);
+[NOT] EXISTS (subquery)
+```
+
+### [ NOT ] IN
+
+The `IN` operator returns all rows where a given expression’s value can be 
found
+in the results of a _[correlated subquery](#correlated-subqueries)_.
+`NOT IN` returns all rows where a given expression’s value cannot be found in
+the results of a subquery or list of values.
+
+```sql
+expression [NOT] IN (subquery|list-literal)
+```
+
+#### Examples
+
+```sql
+SELECT * FROM x WHERE column_1 IN (1,3);
+
 +----------+----------+
 | column_1 | column_2 |
 +----------+----------+
 | 1        | 2        |
 +----------+----------+
-1 row in set.
 ```
 
-## NOT EXISTS
+```sql
+SELECT * FROM x WHERE column_1 NOT IN (1,3);
+
++----------+----------+
+| column_1 | column_2 |
++----------+----------+
+| 2        | 4        |
++----------+----------+
+```
+
+## SELECT clause subqueries
+
+`SELECT` clause subqueries use values returned from the inner query as part
+of the outer query's `SELECT` list.
+The `SELECT` clause only supports [scalar subqueries](#scalar-subqueries) that
+return a single value per execution of the inner query.
+The returned value can be unique per row.
+
+```sql
+SELECT [expression1[, expression2, ..., expressionN],] (<subquery>)
+```
+
+**Note**: `SELECT` clause subqueries can be used as an alternative to `JOIN`
+operations.
 
-The `NOT EXISTS` syntax can be used to find all rows in a relation where a 
correlated subquery produces zero matches
-for that row. Only correlated subqueries are supported.
+### Example
 
 ```sql
-select * from x y where not exists (select * from x where x.column_1 = 
y.column_1);
-0 rows in set.
+SELECT
+  column_1,
+  (
+    SELECT
+      first_value(string)
+    FROM
+      y
+    WHERE
+      number = x.column_1
+  ) AS "numeric string"
+FROM
+  x;
+
++----------+----------------+
+| column_1 | numeric string |
++----------+----------------+
+|        1 | one            |
+|        2 | two            |
++----------+----------------+
 ```
 
-## IN
+## FROM clause subqueries
 
-The `IN` syntax can be used to find all rows in a relation where a given 
expression's value can be found in the
-results of a correlated subquery.
+`FROM` clause subqueries return a set of results that is then queried and
+operated on by the outer query.
 
 ```sql
-select * from x where column_1 in (select column_1 from x);
+SELECT expression1[, expression2, ..., expressionN] FROM (<subquery>)
+```
+
+### Example
+
+The following query returns the average of maximum values per room.
+The inner query returns the maximum value for each field from each room.
+The outer query uses the results of the inner query and returns the average
+maximum value for each field.
+
+```sql
+SELECT
+  column_2
+FROM
+  (
+    SELECT
+      *
+    FROM
+      x
+    WHERE
+      column_1 > 1
+  );
+
++----------+
+| column_2 |
++----------+
+|        4 |
++----------+
+```
+
+## WHERE clause subqueries
+
+`WHERE` clause subqueries compare an expression to the result of the subquery
+and return _true_ or _false_.
+Rows that evaluate to _false_ or NULL are filtered from results.
+The `WHERE` clause supports correlated and non-correlated subqueries
+as well as scalar and non-scalar subqueries (depending on the the operator used
+in the predicate expression).
+
+```sql
+SELECT
+  expression1[, expression2, ..., expressionN]
+FROM
+  <measurement>
+WHERE
+  expression operator (<subquery>)
+```
+
+**Note:** `WHERE` clause subqueries can be used as an alternative to `JOIN`
+operations.
+
+### Examples
+
+#### `WHERE` clause with scalar subquery
+
+The following query returns all rows with `column_2` values above the average
+of all `number` values in `y`.
+
+```sql
+SELECT
+  *
+FROM
+  x
+WHERE
+  column_2 > (
+    SELECT
+      AVG(number)
+    FROM
+      y
+  );
+
 +----------+----------+
 | column_1 | column_2 |
 +----------+----------+
-| 1        | 2        |
+|        2 |        4 |
 +----------+----------+
-1 row in set.
 ```
 
-## NOT IN
+#### `WHERE` clause with non-scalar subquery
 
-The `NOT IN` syntax can be used to find all rows in a relation where a given 
expression's value can not be found in the
-results of a correlated subquery.
+Non-scalar subqueries must use the `[NOT] IN` or `[NOT] EXISTS` operators and
+can only return a single column.
+The values in the returned column are evaluated as a list.
+
+The following query returns all rows with `column_2` values in table `x` that
+are in the list of numbers with string lengths greater than three from table
+`y`.
 
 ```sql
-select * from x where column_1 not in (select column_1 from x);
-0 rows in set.
+SELECT
+  *
+FROM
+  x
+WHERE
+  column_2 IN (
+    SELECT
+      number
+    FROM
+      y
+    WHERE
+      length(string) > 3
+  );
+
++----------+----------+
+| column_1 | column_2 |
++----------+----------+
+|        2 |        4 |
++----------+----------+
 ```
 
-## Scalar Subquery
+### `WHERE` clause with correlated subquery
 
-A scalar subquery can be used to produce a single value that can be used in 
many different contexts in a query. Here
-is an example of a filter using a scalar subquery. Only correlated subqueries 
are supported.
+The following query returns rows with `column_2` values from table `x` greater
+than the average `string` value length from table `y`.
+The subquery in the `WHERE` clause uses the `column_1` value from the outer
+query to return the average `string` value length for that specific value.
 
 ```sql
-select * from x y where column_1 < (select sum(column_2) from x where 
x.column_1 = y.column_1);
+SELECT
+  *
+FROM
+  x
+WHERE
+  column_2 > (
+    SELECT
+      AVG(length(string))
+    FROM
+      y
+    WHERE
+      number = x.column_1
+  );
+
 +----------+----------+
 | column_1 | column_2 |
 +----------+----------+
-| 1        | 2        |
+|        2 |        4 |
 +----------+----------+
-1 row in set.
 ```
+
+## HAVING clause subqueries
+
+`HAVING` clause subqueries compare an expression that uses aggregate values
+returned by aggregate functions in the `SELECT` clause to the result of the
+subquery and return _true_ or _false_.
+Rows that evaluate to _false_ are filtered from results.
+The `HAVING` clause supports correlated and non-correlated subqueries
+as well as scalar and non-scalar subqueries (depending on the the operator used
+in the predicate expression).
+
+```sql
+SELECT
+  aggregate_expression1[, aggregate_expression2, ..., aggregate_expressionN]
+FROM
+  <measurement>
+WHERE
+  <conditional_expression>
+GROUP BY
+  column_expression1[, column_expression2, ..., column_expressionN]
+HAVING
+  expression operator (<subquery>)
+```
+
+### Examples
+
+The following query calculates the averages of even and odd numbers in table 
`y`
+and returns the averages that are equal to the maximum value of `column_1`
+in table `x`.
+
+#### `HAVING` clause with a scalar subquery
+
+```sql
+SELECT
+  AVG(number) AS avg,
+  (number % 2 = 0) AS even
+FROM
+  y
+GROUP BY
+  even
+HAVING
+  avg = (
+    SELECT
+      MAX(column_1)
+    FROM
+      x
+  );
+
++-------+--------+
+|   avg | even   |
++-------+--------+
+|     2 | false  |
++-------+--------+
+```
+
+#### `HAVING` clause with a non-scalar subquery
+
+Non-scalar subqueries must use the `[NOT] IN` or `[NOT] EXISTS` operators and
+can only return a single column.
+The values in the returned column are evaluated as a list.
+
+The following query calculates the averages of even and odd numbers in table 
`y`
+and returns the averages that are in `column_1` of table `x`.
+
+```sql
+SELECT
+  AVG(number) AS avg,
+  (number % 2 = 0) AS even
+FROM
+  y
+GROUP BY
+  even
+HAVING
+  avg IN (
+    SELECT
+      column_1
+    FROM
+      x
+  );
+
++-------+--------+
+|   avg | even   |
++-------+--------+
+|     2 | false  |
++-------+--------+
+```
+
+## Subquery categories
+
+Subqueries can be categorized as one or more of the following based on the
+behavior of the subquery:
+
+- [correlated](#correlated-subqueries) or
+  [non-correlated](#non-correlated-subqueries)
+- [scalar](#scalar-subqueries) or [non-scalar](#non-scalar-subqueries)
+
+### Correlated subqueries
+
+In a **correlated** subquery, the inner query depends on the values of the
+current row being processed.
+
+**Note:** DataFusion internally rewrites correlated subqueries into JOINs to
+improve performance. In general correlated subqueries are **less performant**
+than non-correlated subqueries.
+
+### Non-correlated subqueries
+
+In a **non-correlated** subquery, the inner query _doesn't_ depend on the outer
+query and executes independently.
+The inner query executes first, and then passes the results to the outer query.
+
+### Scalar subqueries
+
+A **scalar** subquery returns a single value (one column of one row).
+If no rows are returned, the subquery returns NULL.
+
+### Non-scalar subqueries
+
+A **non-scalar** subquery returns 0, 1, or multiple rows, each of which may
+contain 1 or multiple columns. For each column, if there is no value to return,
+the subquery returns NULL. If no rows qualify to be returned, the subquery
+returns 0 rows.
diff --git a/searchindex.js b/searchindex.js
index ba279651cc..a932e4a080 100644
--- a/searchindex.js
+++ b/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"alltitles": {"!=": [[39, "op-neq"]], "!~": [[39, 
"op-re-not-match"]], "!~*": [[39, "op-re-not-match-i"]], "!~~": [[39, "id18"]], 
"!~~*": [[39, "id19"]], "#": [[39, "op-bit-xor"]], "%": [[39, "op-modulo"]], 
"&": [[39, "op-bit-and"]], "(relation, name) tuples in logical fields and 
logical columns are unique": [[7, 
"relation-name-tuples-in-logical-fields-and-logical-columns-are-unique"]], "*": 
[[39, "op-multiply"]], "+": [[39, "op-plus"]], "-": [[39, "op-minus"]], "/": 
[[3 [...]
\ No newline at end of file
+Search.setIndex({"alltitles": {"!=": [[39, "op-neq"]], "!~": [[39, 
"op-re-not-match"]], "!~*": [[39, "op-re-not-match-i"]], "!~~": [[39, "id18"]], 
"!~~*": [[39, "id19"]], "#": [[39, "op-bit-xor"]], "%": [[39, "op-modulo"]], 
"&": [[39, "op-bit-and"]], "(relation, name) tuples in logical fields and 
logical columns are unique": [[7, 
"relation-name-tuples-in-logical-fields-and-logical-columns-are-unique"]], "*": 
[[39, "op-multiply"]], "+": [[39, "op-plus"]], "-": [[39, "op-minus"]], "/": 
[[3 [...]
\ No newline at end of file
diff --git a/user-guide/sql/index.html b/user-guide/sql/index.html
index 8521fe1460..9c5af914e4 100644
--- a/user-guide/sql/index.html
+++ b/user-guide/sql/index.html
@@ -500,11 +500,12 @@
 </ul>
 </li>
 <li class="toctree-l1"><a class="reference internal" 
href="subqueries.html">Subqueries</a><ul>
-<li class="toctree-l2"><a class="reference internal" 
href="subqueries.html#exists">EXISTS</a></li>
-<li class="toctree-l2"><a class="reference internal" 
href="subqueries.html#not-exists">NOT EXISTS</a></li>
-<li class="toctree-l2"><a class="reference internal" 
href="subqueries.html#in">IN</a></li>
-<li class="toctree-l2"><a class="reference internal" 
href="subqueries.html#not-in">NOT IN</a></li>
-<li class="toctree-l2"><a class="reference internal" 
href="subqueries.html#scalar-subquery">Scalar Subquery</a></li>
+<li class="toctree-l2"><a class="reference internal" 
href="subqueries.html#subquery-operators">Subquery operators</a></li>
+<li class="toctree-l2"><a class="reference internal" 
href="subqueries.html#select-clause-subqueries">SELECT clause 
subqueries</a></li>
+<li class="toctree-l2"><a class="reference internal" 
href="subqueries.html#from-clause-subqueries">FROM clause subqueries</a></li>
+<li class="toctree-l2"><a class="reference internal" 
href="subqueries.html#where-clause-subqueries">WHERE clause subqueries</a></li>
+<li class="toctree-l2"><a class="reference internal" 
href="subqueries.html#having-clause-subqueries">HAVING clause 
subqueries</a></li>
+<li class="toctree-l2"><a class="reference internal" 
href="subqueries.html#subquery-categories">Subquery categories</a></li>
 </ul>
 </li>
 <li class="toctree-l1"><a class="reference internal" 
href="ddl.html">DDL</a><ul>
diff --git a/user-guide/sql/subqueries.html b/user-guide/sql/subqueries.html
index aac89bd524..e865297c68 100644
--- a/user-guide/sql/subqueries.html
+++ b/user-guide/sql/subqueries.html
@@ -449,29 +449,157 @@
 <nav id="bd-toc-nav">
     <ul class="visible nav section-nav flex-column">
  <li class="toc-h2 nav-item toc-entry">
-  <a class="reference internal nav-link" href="#exists">
-   EXISTS
+  <a class="reference internal nav-link" href="#subquery-operators">
+   Subquery operators
   </a>
+  <ul class="nav section-nav flex-column">
+   <li class="toc-h3 nav-item toc-entry">
+    <a class="reference internal nav-link" href="#not-exists">
+     [ NOT ] EXISTS
+    </a>
+   </li>
+   <li class="toc-h3 nav-item toc-entry">
+    <a class="reference internal nav-link" href="#not-in">
+     [ NOT ] IN
+    </a>
+    <ul class="nav section-nav flex-column">
+     <li class="toc-h4 nav-item toc-entry">
+      <a class="reference internal nav-link" href="#examples">
+       Examples
+      </a>
+     </li>
+    </ul>
+   </li>
+  </ul>
  </li>
  <li class="toc-h2 nav-item toc-entry">
-  <a class="reference internal nav-link" href="#not-exists">
-   NOT EXISTS
+  <a class="reference internal nav-link" href="#select-clause-subqueries">
+   SELECT clause subqueries
   </a>
+  <ul class="nav section-nav flex-column">
+   <li class="toc-h3 nav-item toc-entry">
+    <a class="reference internal nav-link" href="#example">
+     Example
+    </a>
+   </li>
+  </ul>
  </li>
  <li class="toc-h2 nav-item toc-entry">
-  <a class="reference internal nav-link" href="#in">
-   IN
+  <a class="reference internal nav-link" href="#from-clause-subqueries">
+   FROM clause subqueries
   </a>
+  <ul class="nav section-nav flex-column">
+   <li class="toc-h3 nav-item toc-entry">
+    <a class="reference internal nav-link" href="#id1">
+     Example
+    </a>
+   </li>
+  </ul>
  </li>
  <li class="toc-h2 nav-item toc-entry">
-  <a class="reference internal nav-link" href="#not-in">
-   NOT IN
+  <a class="reference internal nav-link" href="#where-clause-subqueries">
+   WHERE clause subqueries
   </a>
+  <ul class="nav section-nav flex-column">
+   <li class="toc-h3 nav-item toc-entry">
+    <a class="reference internal nav-link" href="#id2">
+     Examples
+    </a>
+    <ul class="nav section-nav flex-column">
+     <li class="toc-h4 nav-item toc-entry">
+      <a class="reference internal nav-link" 
href="#where-clause-with-scalar-subquery">
+       <code class="docutils literal notranslate">
+        <span class="pre">
+         WHERE
+        </span>
+       </code>
+       clause with scalar subquery
+      </a>
+     </li>
+     <li class="toc-h4 nav-item toc-entry">
+      <a class="reference internal nav-link" 
href="#where-clause-with-non-scalar-subquery">
+       <code class="docutils literal notranslate">
+        <span class="pre">
+         WHERE
+        </span>
+       </code>
+       clause with non-scalar subquery
+      </a>
+     </li>
+    </ul>
+   </li>
+   <li class="toc-h3 nav-item toc-entry">
+    <a class="reference internal nav-link" 
href="#where-clause-with-correlated-subquery">
+     <code class="docutils literal notranslate">
+      <span class="pre">
+       WHERE
+      </span>
+     </code>
+     clause with correlated subquery
+    </a>
+   </li>
+  </ul>
  </li>
  <li class="toc-h2 nav-item toc-entry">
-  <a class="reference internal nav-link" href="#scalar-subquery">
-   Scalar Subquery
+  <a class="reference internal nav-link" href="#having-clause-subqueries">
+   HAVING clause subqueries
   </a>
+  <ul class="nav section-nav flex-column">
+   <li class="toc-h3 nav-item toc-entry">
+    <a class="reference internal nav-link" href="#id3">
+     Examples
+    </a>
+    <ul class="nav section-nav flex-column">
+     <li class="toc-h4 nav-item toc-entry">
+      <a class="reference internal nav-link" 
href="#having-clause-with-a-scalar-subquery">
+       <code class="docutils literal notranslate">
+        <span class="pre">
+         HAVING
+        </span>
+       </code>
+       clause with a scalar subquery
+      </a>
+     </li>
+     <li class="toc-h4 nav-item toc-entry">
+      <a class="reference internal nav-link" 
href="#having-clause-with-a-non-scalar-subquery">
+       <code class="docutils literal notranslate">
+        <span class="pre">
+         HAVING
+        </span>
+       </code>
+       clause with a non-scalar subquery
+      </a>
+     </li>
+    </ul>
+   </li>
+  </ul>
+ </li>
+ <li class="toc-h2 nav-item toc-entry">
+  <a class="reference internal nav-link" href="#subquery-categories">
+   Subquery categories
+  </a>
+  <ul class="nav section-nav flex-column">
+   <li class="toc-h3 nav-item toc-entry">
+    <a class="reference internal nav-link" href="#correlated-subqueries">
+     Correlated subqueries
+    </a>
+   </li>
+   <li class="toc-h3 nav-item toc-entry">
+    <a class="reference internal nav-link" href="#non-correlated-subqueries">
+     Non-correlated subqueries
+    </a>
+   </li>
+   <li class="toc-h3 nav-item toc-entry">
+    <a class="reference internal nav-link" href="#scalar-subqueries">
+     Scalar subqueries
+    </a>
+   </li>
+   <li class="toc-h3 nav-item toc-entry">
+    <a class="reference internal nav-link" href="#non-scalar-subqueries">
+     Non-scalar subqueries
+    </a>
+   </li>
+  </ul>
  </li>
 </ul>
 
@@ -521,76 +649,378 @@
 -->
 <section id="subqueries">
 <h1>Subqueries<a class="headerlink" href="#subqueries" title="Link to this 
heading">¶</a></h1>
-<p>DataFusion supports <code class="docutils literal notranslate"><span 
class="pre">EXISTS</span></code>, <code class="docutils literal 
notranslate"><span class="pre">NOT</span> <span 
class="pre">EXISTS</span></code>, <code class="docutils literal 
notranslate"><span class="pre">IN</span></code>, <code class="docutils literal 
notranslate"><span class="pre">NOT</span> <span class="pre">IN</span></code> 
and Scalar Subqueries.</p>
-<p>The examples below are based on the following table.</p>
-<div class="highlight-sql notranslate"><div 
class="highlight"><pre><span></span><span class="k">select</span><span 
class="w"> </span><span class="o">*</span><span class="w"> </span><span 
class="k">from</span><span class="w"> </span><span class="n">x</span><span 
class="p">;</span>
+<p>Subqueries (also known as inner queries or nested queries) are queries 
within
+a query.
+Subqueries can be used in <code class="docutils literal notranslate"><span 
class="pre">SELECT</span></code>, <code class="docutils literal 
notranslate"><span class="pre">FROM</span></code>, <code class="docutils 
literal notranslate"><span class="pre">WHERE</span></code>, and <code 
class="docutils literal notranslate"><span class="pre">HAVING</span></code> 
clauses.</p>
+<p>The examples below are based on the following tables.</p>
+<div class="highlight-sql notranslate"><div 
class="highlight"><pre><span></span><span class="k">SELECT</span><span 
class="w"> </span><span class="o">*</span><span class="w"> </span><span 
class="k">FROM</span><span class="w"> </span><span class="n">x</span><span 
class="p">;</span>
+
 <span class="o">+</span><span class="c1">----------+----------+</span>
 <span class="o">|</span><span class="w"> </span><span 
class="n">column_1</span><span class="w"> </span><span class="o">|</span><span 
class="w"> </span><span class="n">column_2</span><span class="w"> </span><span 
class="o">|</span>
 <span class="o">+</span><span class="c1">----------+----------+</span>
 <span class="o">|</span><span class="w"> </span><span class="mi">1</span><span 
class="w">        </span><span class="o">|</span><span class="w"> </span><span 
class="mi">2</span><span class="w">        </span><span class="o">|</span>
 <span class="o">+</span><span class="c1">----------+----------+</span>
+<span class="o">|</span><span class="w"> </span><span class="mi">2</span><span 
class="w">        </span><span class="o">|</span><span class="w"> </span><span 
class="mi">4</span><span class="w">        </span><span class="o">|</span>
+<span class="o">+</span><span class="c1">----------+----------+</span>
+</pre></div>
+</div>
+<div class="highlight-sql notranslate"><div 
class="highlight"><pre><span></span><span class="k">SELECT</span><span 
class="w"> </span><span class="o">*</span><span class="w"> </span><span 
class="k">FROM</span><span class="w"> </span><span class="n">y</span><span 
class="p">;</span>
+
+<span class="o">+</span><span class="c1">--------+--------+</span>
+<span class="o">|</span><span class="w"> </span><span 
class="nb">number</span><span class="w"> </span><span class="o">|</span><span 
class="w"> </span><span class="n">string</span><span class="w"> </span><span 
class="o">|</span>
+<span class="o">+</span><span class="c1">--------+--------+</span>
+<span class="o">|</span><span class="w"> </span><span class="mi">1</span><span 
class="w">      </span><span class="o">|</span><span class="w"> </span><span 
class="n">one</span><span class="w">    </span><span class="o">|</span>
+<span class="o">+</span><span class="c1">--------+--------+</span>
+<span class="o">|</span><span class="w"> </span><span class="mi">2</span><span 
class="w">      </span><span class="o">|</span><span class="w"> </span><span 
class="n">two</span><span class="w">    </span><span class="o">|</span>
+<span class="o">+</span><span class="c1">--------+--------+</span>
+<span class="o">|</span><span class="w"> </span><span class="mi">3</span><span 
class="w">      </span><span class="o">|</span><span class="w"> </span><span 
class="n">three</span><span class="w">  </span><span class="o">|</span>
+<span class="o">+</span><span class="c1">--------+--------+</span>
+<span class="o">|</span><span class="w"> </span><span class="mi">4</span><span 
class="w">      </span><span class="o">|</span><span class="w"> </span><span 
class="n">four</span><span class="w">   </span><span class="o">|</span>
+<span class="o">+</span><span class="c1">--------+--------+</span>
+</pre></div>
+</div>
+<section id="subquery-operators">
+<h2>Subquery operators<a class="headerlink" href="#subquery-operators" 
title="Link to this heading">¶</a></h2>
+<ul class="simple">
+<li><p><a class="reference internal" href="#not-exists">[ NOT ] 
EXISTS</a></p></li>
+<li><p><a class="reference internal" href="#not-in">[ NOT ] IN</a></p></li>
+</ul>
+<section id="not-exists">
+<h3>[ NOT ] EXISTS<a class="headerlink" href="#not-exists" title="Link to this 
heading">¶</a></h3>
+<p>The <code class="docutils literal notranslate"><span 
class="pre">EXISTS</span></code> operator returns all rows where a
+<em><a class="reference internal" href="#correlated-subqueries">correlated 
subquery</a></em> produces one or more matches for
+that row. <code class="docutils literal notranslate"><span 
class="pre">NOT</span> <span class="pre">EXISTS</span></code> returns all rows 
where a <em>correlated subquery</em> produces
+zero matches for that row. Only <em>correlated subqueries</em> are 
supported.</p>
+<div class="highlight-sql notranslate"><div 
class="highlight"><pre><span></span><span class="p">[</span><span 
class="k">NOT</span><span class="p">]</span><span class="w"> </span><span 
class="k">EXISTS</span><span class="w"> </span><span class="p">(</span><span 
class="n">subquery</span><span class="p">)</span>
+</pre></div>
+</div>
+</section>
+<section id="not-in">
+<h3>[ NOT ] IN<a class="headerlink" href="#not-in" title="Link to this 
heading">¶</a></h3>
+<p>The <code class="docutils literal notranslate"><span 
class="pre">IN</span></code> operator returns all rows where a given 
expression’s value can be found
+in the results of a <em><a class="reference internal" 
href="#correlated-subqueries">correlated subquery</a></em>.
+<code class="docutils literal notranslate"><span class="pre">NOT</span> <span 
class="pre">IN</span></code> returns all rows where a given expression’s value 
cannot be found in
+the results of a subquery or list of values.</p>
+<div class="highlight-sql notranslate"><div 
class="highlight"><pre><span></span><span class="n">expression</span><span 
class="w"> </span><span class="p">[</span><span class="k">NOT</span><span 
class="p">]</span><span class="w"> </span><span class="k">IN</span><span 
class="w"> </span><span class="p">(</span><span class="n">subquery</span><span 
class="o">|</span><span class="n">list</span><span class="o">-</span><span 
class="n">literal</span><span class="p">)</span>
 </pre></div>
 </div>
-<section id="exists">
-<h2>EXISTS<a class="headerlink" href="#exists" title="Link to this 
heading">¶</a></h2>
-<p>The <code class="docutils literal notranslate"><span 
class="pre">EXISTS</span></code> syntax can be used to find all rows in a 
relation where a correlated subquery produces one or more matches
-for that row. Only correlated subqueries are supported.</p>
-<div class="highlight-sql notranslate"><div 
class="highlight"><pre><span></span><span class="k">select</span><span 
class="w"> </span><span class="o">*</span><span class="w"> </span><span 
class="k">from</span><span class="w"> </span><span class="n">x</span><span 
class="w"> </span><span class="n">y</span><span class="w"> </span><span 
class="k">where</span><span class="w"> </span><span 
class="k">exists</span><span class="w"> </span><span class="p">(</span><span 
class="k">select</span><span  [...]
+<section id="examples">
+<h4>Examples<a class="headerlink" href="#examples" title="Link to this 
heading">¶</a></h4>
+<div class="highlight-sql notranslate"><div 
class="highlight"><pre><span></span><span class="k">SELECT</span><span 
class="w"> </span><span class="o">*</span><span class="w"> </span><span 
class="k">FROM</span><span class="w"> </span><span class="n">x</span><span 
class="w"> </span><span class="k">WHERE</span><span class="w"> </span><span 
class="n">column_1</span><span class="w"> </span><span class="k">IN</span><span 
class="w"> </span><span class="p">(</span><span class="mi">1</span><span c [...]
+
 <span class="o">+</span><span class="c1">----------+----------+</span>
 <span class="o">|</span><span class="w"> </span><span 
class="n">column_1</span><span class="w"> </span><span class="o">|</span><span 
class="w"> </span><span class="n">column_2</span><span class="w"> </span><span 
class="o">|</span>
 <span class="o">+</span><span class="c1">----------+----------+</span>
 <span class="o">|</span><span class="w"> </span><span class="mi">1</span><span 
class="w">        </span><span class="o">|</span><span class="w"> </span><span 
class="mi">2</span><span class="w">        </span><span class="o">|</span>
 <span class="o">+</span><span class="c1">----------+----------+</span>
-<span class="mi">1</span><span class="w"> </span><span 
class="k">row</span><span class="w"> </span><span class="k">in</span><span 
class="w"> </span><span class="k">set</span><span class="p">.</span>
+</pre></div>
+</div>
+<div class="highlight-sql notranslate"><div 
class="highlight"><pre><span></span><span class="k">SELECT</span><span 
class="w"> </span><span class="o">*</span><span class="w"> </span><span 
class="k">FROM</span><span class="w"> </span><span class="n">x</span><span 
class="w"> </span><span class="k">WHERE</span><span class="w"> </span><span 
class="n">column_1</span><span class="w"> </span><span 
class="k">NOT</span><span class="w"> </span><span class="k">IN</span><span 
class="w"> </span><span  [...]
+
+<span class="o">+</span><span class="c1">----------+----------+</span>
+<span class="o">|</span><span class="w"> </span><span 
class="n">column_1</span><span class="w"> </span><span class="o">|</span><span 
class="w"> </span><span class="n">column_2</span><span class="w"> </span><span 
class="o">|</span>
+<span class="o">+</span><span class="c1">----------+----------+</span>
+<span class="o">|</span><span class="w"> </span><span class="mi">2</span><span 
class="w">        </span><span class="o">|</span><span class="w"> </span><span 
class="mi">4</span><span class="w">        </span><span class="o">|</span>
+<span class="o">+</span><span class="c1">----------+----------+</span>
 </pre></div>
 </div>
 </section>
-<section id="not-exists">
-<h2>NOT EXISTS<a class="headerlink" href="#not-exists" title="Link to this 
heading">¶</a></h2>
-<p>The <code class="docutils literal notranslate"><span class="pre">NOT</span> 
<span class="pre">EXISTS</span></code> syntax can be used to find all rows in a 
relation where a correlated subquery produces zero matches
-for that row. Only correlated subqueries are supported.</p>
-<div class="highlight-sql notranslate"><div 
class="highlight"><pre><span></span><span class="k">select</span><span 
class="w"> </span><span class="o">*</span><span class="w"> </span><span 
class="k">from</span><span class="w"> </span><span class="n">x</span><span 
class="w"> </span><span class="n">y</span><span class="w"> </span><span 
class="k">where</span><span class="w"> </span><span class="k">not</span><span 
class="w"> </span><span class="k">exists</span><span class="w"> </span><span 
cla [...]
-<span class="mi">0</span><span class="w"> </span><span 
class="k">rows</span><span class="w"> </span><span class="k">in</span><span 
class="w"> </span><span class="k">set</span><span class="p">.</span>
+</section>
+</section>
+<section id="select-clause-subqueries">
+<h2>SELECT clause subqueries<a class="headerlink" 
href="#select-clause-subqueries" title="Link to this heading">¶</a></h2>
+<p><code class="docutils literal notranslate"><span 
class="pre">SELECT</span></code> clause subqueries use values returned from the 
inner query as part
+of the outer query’s <code class="docutils literal notranslate"><span 
class="pre">SELECT</span></code> list.
+The <code class="docutils literal notranslate"><span 
class="pre">SELECT</span></code> clause only supports <a class="reference 
internal" href="#scalar-subqueries">scalar subqueries</a> that
+return a single value per execution of the inner query.
+The returned value can be unique per row.</p>
+<div class="highlight-sql notranslate"><div 
class="highlight"><pre><span></span><span class="k">SELECT</span><span 
class="w"> </span><span class="p">[</span><span 
class="n">expression1</span><span class="p">[,</span><span class="w"> 
</span><span class="n">expression2</span><span class="p">,</span><span 
class="w"> </span><span class="p">...,</span><span class="w"> </span><span 
class="n">expressionN</span><span class="p">],]</span><span class="w"> 
</span><span class="p">(</span><span class [...]
 </pre></div>
 </div>
+<p><strong>Note</strong>: <code class="docutils literal notranslate"><span 
class="pre">SELECT</span></code> clause subqueries can be used as an 
alternative to <code class="docutils literal notranslate"><span 
class="pre">JOIN</span></code>
+operations.</p>
+<section id="example">
+<h3>Example<a class="headerlink" href="#example" title="Link to this 
heading">¶</a></h3>
+<div class="highlight-sql notranslate"><div 
class="highlight"><pre><span></span><span class="k">SELECT</span>
+<span class="w">  </span><span class="n">column_1</span><span 
class="p">,</span>
+<span class="w">  </span><span class="p">(</span>
+<span class="w">    </span><span class="k">SELECT</span>
+<span class="w">      </span><span class="n">first_value</span><span 
class="p">(</span><span class="n">string</span><span class="p">)</span>
+<span class="w">    </span><span class="k">FROM</span>
+<span class="w">      </span><span class="n">y</span>
+<span class="w">    </span><span class="k">WHERE</span>
+<span class="w">      </span><span class="nb">number</span><span class="w"> 
</span><span class="o">=</span><span class="w"> </span><span 
class="n">x</span><span class="p">.</span><span class="n">column_1</span>
+<span class="w">  </span><span class="p">)</span><span class="w"> </span><span 
class="k">AS</span><span class="w"> </span><span class="ss">&quot;numeric 
string&quot;</span>
+<span class="k">FROM</span>
+<span class="w">  </span><span class="n">x</span><span class="p">;</span>
+
+<span class="o">+</span><span class="c1">----------+----------------+</span>
+<span class="o">|</span><span class="w"> </span><span 
class="n">column_1</span><span class="w"> </span><span class="o">|</span><span 
class="w"> </span><span class="nb">numeric</span><span class="w"> </span><span 
class="n">string</span><span class="w"> </span><span class="o">|</span>
+<span class="o">+</span><span class="c1">----------+----------------+</span>
+<span class="o">|</span><span class="w">        </span><span 
class="mi">1</span><span class="w"> </span><span class="o">|</span><span 
class="w"> </span><span class="n">one</span><span class="w">            
</span><span class="o">|</span>
+<span class="o">|</span><span class="w">        </span><span 
class="mi">2</span><span class="w"> </span><span class="o">|</span><span 
class="w"> </span><span class="n">two</span><span class="w">            
</span><span class="o">|</span>
+<span class="o">+</span><span class="c1">----------+----------------+</span>
+</pre></div>
+</div>
+</section>
 </section>
-<section id="in">
-<h2>IN<a class="headerlink" href="#in" title="Link to this heading">¶</a></h2>
-<p>The <code class="docutils literal notranslate"><span 
class="pre">IN</span></code> syntax can be used to find all rows in a relation 
where a given expression’s value can be found in the
-results of a correlated subquery.</p>
-<div class="highlight-sql notranslate"><div 
class="highlight"><pre><span></span><span class="k">select</span><span 
class="w"> </span><span class="o">*</span><span class="w"> </span><span 
class="k">from</span><span class="w"> </span><span class="n">x</span><span 
class="w"> </span><span class="k">where</span><span class="w"> </span><span 
class="n">column_1</span><span class="w"> </span><span class="k">in</span><span 
class="w"> </span><span class="p">(</span><span class="k">select</span><sp [...]
+<section id="from-clause-subqueries">
+<h2>FROM clause subqueries<a class="headerlink" href="#from-clause-subqueries" 
title="Link to this heading">¶</a></h2>
+<p><code class="docutils literal notranslate"><span 
class="pre">FROM</span></code> clause subqueries return a set of results that 
is then queried and
+operated on by the outer query.</p>
+<div class="highlight-sql notranslate"><div 
class="highlight"><pre><span></span><span class="k">SELECT</span><span 
class="w"> </span><span class="n">expression1</span><span 
class="p">[,</span><span class="w"> </span><span 
class="n">expression2</span><span class="p">,</span><span class="w"> 
</span><span class="p">...,</span><span class="w"> </span><span 
class="n">expressionN</span><span class="p">]</span><span class="w"> 
</span><span class="k">FROM</span><span class="w"> </span><span clas [...]
+</pre></div>
+</div>
+<section id="id1">
+<h3>Example<a class="headerlink" href="#id1" title="Link to this 
heading">¶</a></h3>
+<p>The following query returns the average of maximum values per room.
+The inner query returns the maximum value for each field from each room.
+The outer query uses the results of the inner query and returns the average
+maximum value for each field.</p>
+<div class="highlight-sql notranslate"><div 
class="highlight"><pre><span></span><span class="k">SELECT</span>
+<span class="w">  </span><span class="n">column_2</span>
+<span class="k">FROM</span>
+<span class="w">  </span><span class="p">(</span>
+<span class="w">    </span><span class="k">SELECT</span>
+<span class="w">      </span><span class="o">*</span>
+<span class="w">    </span><span class="k">FROM</span>
+<span class="w">      </span><span class="n">x</span>
+<span class="w">    </span><span class="k">WHERE</span>
+<span class="w">      </span><span class="n">column_1</span><span class="w"> 
</span><span class="o">&gt;</span><span class="w"> </span><span 
class="mi">1</span>
+<span class="w">  </span><span class="p">);</span>
+
+<span class="o">+</span><span class="c1">----------+</span>
+<span class="o">|</span><span class="w"> </span><span 
class="n">column_2</span><span class="w"> </span><span class="o">|</span>
+<span class="o">+</span><span class="c1">----------+</span>
+<span class="o">|</span><span class="w">        </span><span 
class="mi">4</span><span class="w"> </span><span class="o">|</span>
+<span class="o">+</span><span class="c1">----------+</span>
+</pre></div>
+</div>
+</section>
+</section>
+<section id="where-clause-subqueries">
+<h2>WHERE clause subqueries<a class="headerlink" 
href="#where-clause-subqueries" title="Link to this heading">¶</a></h2>
+<p><code class="docutils literal notranslate"><span 
class="pre">WHERE</span></code> clause subqueries compare an expression to the 
result of the subquery
+and return <em>true</em> or <em>false</em>.
+Rows that evaluate to <em>false</em> or NULL are filtered from results.
+The <code class="docutils literal notranslate"><span 
class="pre">WHERE</span></code> clause supports correlated and non-correlated 
subqueries
+as well as scalar and non-scalar subqueries (depending on the the operator used
+in the predicate expression).</p>
+<div class="highlight-sql notranslate"><div 
class="highlight"><pre><span></span><span class="k">SELECT</span>
+<span class="w">  </span><span class="n">expression1</span><span 
class="p">[,</span><span class="w"> </span><span 
class="n">expression2</span><span class="p">,</span><span class="w"> 
</span><span class="p">...,</span><span class="w"> </span><span 
class="n">expressionN</span><span class="p">]</span>
+<span class="k">FROM</span>
+<span class="w">  </span><span class="o">&lt;</span><span 
class="n">measurement</span><span class="o">&gt;</span>
+<span class="k">WHERE</span>
+<span class="w">  </span><span class="n">expression</span><span class="w"> 
</span><span class="k">operator</span><span class="w"> </span><span 
class="p">(</span><span class="o">&lt;</span><span 
class="n">subquery</span><span class="o">&gt;</span><span class="p">)</span>
+</pre></div>
+</div>
+<p><strong>Note:</strong> <code class="docutils literal notranslate"><span 
class="pre">WHERE</span></code> clause subqueries can be used as an alternative 
to <code class="docutils literal notranslate"><span 
class="pre">JOIN</span></code>
+operations.</p>
+<section id="id2">
+<h3>Examples<a class="headerlink" href="#id2" title="Link to this 
heading">¶</a></h3>
+<section id="where-clause-with-scalar-subquery">
+<h4><code class="docutils literal notranslate"><span 
class="pre">WHERE</span></code> clause with scalar subquery<a 
class="headerlink" href="#where-clause-with-scalar-subquery" title="Link to 
this heading">¶</a></h4>
+<p>The following query returns all rows with <code class="docutils literal 
notranslate"><span class="pre">column_2</span></code> values above the average
+of all <code class="docutils literal notranslate"><span 
class="pre">number</span></code> values in <code class="docutils literal 
notranslate"><span class="pre">y</span></code>.</p>
+<div class="highlight-sql notranslate"><div 
class="highlight"><pre><span></span><span class="k">SELECT</span>
+<span class="w">  </span><span class="o">*</span>
+<span class="k">FROM</span>
+<span class="w">  </span><span class="n">x</span>
+<span class="k">WHERE</span>
+<span class="w">  </span><span class="n">column_2</span><span class="w"> 
</span><span class="o">&gt;</span><span class="w"> </span><span 
class="p">(</span>
+<span class="w">    </span><span class="k">SELECT</span>
+<span class="w">      </span><span class="k">AVG</span><span 
class="p">(</span><span class="nb">number</span><span class="p">)</span>
+<span class="w">    </span><span class="k">FROM</span>
+<span class="w">      </span><span class="n">y</span>
+<span class="w">  </span><span class="p">);</span>
+
 <span class="o">+</span><span class="c1">----------+----------+</span>
 <span class="o">|</span><span class="w"> </span><span 
class="n">column_1</span><span class="w"> </span><span class="o">|</span><span 
class="w"> </span><span class="n">column_2</span><span class="w"> </span><span 
class="o">|</span>
 <span class="o">+</span><span class="c1">----------+----------+</span>
-<span class="o">|</span><span class="w"> </span><span class="mi">1</span><span 
class="w">        </span><span class="o">|</span><span class="w"> </span><span 
class="mi">2</span><span class="w">        </span><span class="o">|</span>
+<span class="o">|</span><span class="w">        </span><span 
class="mi">2</span><span class="w"> </span><span class="o">|</span><span 
class="w">        </span><span class="mi">4</span><span class="w"> </span><span 
class="o">|</span>
 <span class="o">+</span><span class="c1">----------+----------+</span>
-<span class="mi">1</span><span class="w"> </span><span 
class="k">row</span><span class="w"> </span><span class="k">in</span><span 
class="w"> </span><span class="k">set</span><span class="p">.</span>
 </pre></div>
 </div>
 </section>
-<section id="not-in">
-<h2>NOT IN<a class="headerlink" href="#not-in" title="Link to this 
heading">¶</a></h2>
-<p>The <code class="docutils literal notranslate"><span class="pre">NOT</span> 
<span class="pre">IN</span></code> syntax can be used to find all rows in a 
relation where a given expression’s value can not be found in the
-results of a correlated subquery.</p>
-<div class="highlight-sql notranslate"><div 
class="highlight"><pre><span></span><span class="k">select</span><span 
class="w"> </span><span class="o">*</span><span class="w"> </span><span 
class="k">from</span><span class="w"> </span><span class="n">x</span><span 
class="w"> </span><span class="k">where</span><span class="w"> </span><span 
class="n">column_1</span><span class="w"> </span><span 
class="k">not</span><span class="w"> </span><span class="k">in</span><span 
class="w"> </span><span  [...]
-<span class="mi">0</span><span class="w"> </span><span 
class="k">rows</span><span class="w"> </span><span class="k">in</span><span 
class="w"> </span><span class="k">set</span><span class="p">.</span>
+<section id="where-clause-with-non-scalar-subquery">
+<h4><code class="docutils literal notranslate"><span 
class="pre">WHERE</span></code> clause with non-scalar subquery<a 
class="headerlink" href="#where-clause-with-non-scalar-subquery" title="Link to 
this heading">¶</a></h4>
+<p>Non-scalar subqueries must use the <code class="docutils literal 
notranslate"><span class="pre">[NOT]</span> <span class="pre">IN</span></code> 
or <code class="docutils literal notranslate"><span class="pre">[NOT]</span> 
<span class="pre">EXISTS</span></code> operators and
+can only return a single column.
+The values in the returned column are evaluated as a list.</p>
+<p>The following query returns all rows with <code class="docutils literal 
notranslate"><span class="pre">column_2</span></code> values in table <code 
class="docutils literal notranslate"><span class="pre">x</span></code> that
+are in the list of numbers with string lengths greater than three from table
+<code class="docutils literal notranslate"><span 
class="pre">y</span></code>.</p>
+<div class="highlight-sql notranslate"><div 
class="highlight"><pre><span></span><span class="k">SELECT</span>
+<span class="w">  </span><span class="o">*</span>
+<span class="k">FROM</span>
+<span class="w">  </span><span class="n">x</span>
+<span class="k">WHERE</span>
+<span class="w">  </span><span class="n">column_2</span><span class="w"> 
</span><span class="k">IN</span><span class="w"> </span><span class="p">(</span>
+<span class="w">    </span><span class="k">SELECT</span>
+<span class="w">      </span><span class="nb">number</span>
+<span class="w">    </span><span class="k">FROM</span>
+<span class="w">      </span><span class="n">y</span>
+<span class="w">    </span><span class="k">WHERE</span>
+<span class="w">      </span><span class="k">length</span><span 
class="p">(</span><span class="n">string</span><span class="p">)</span><span 
class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span 
class="mi">3</span>
+<span class="w">  </span><span class="p">);</span>
+
+<span class="o">+</span><span class="c1">----------+----------+</span>
+<span class="o">|</span><span class="w"> </span><span 
class="n">column_1</span><span class="w"> </span><span class="o">|</span><span 
class="w"> </span><span class="n">column_2</span><span class="w"> </span><span 
class="o">|</span>
+<span class="o">+</span><span class="c1">----------+----------+</span>
+<span class="o">|</span><span class="w">        </span><span 
class="mi">2</span><span class="w"> </span><span class="o">|</span><span 
class="w">        </span><span class="mi">4</span><span class="w"> </span><span 
class="o">|</span>
+<span class="o">+</span><span class="c1">----------+----------+</span>
 </pre></div>
 </div>
 </section>
-<section id="scalar-subquery">
-<h2>Scalar Subquery<a class="headerlink" href="#scalar-subquery" title="Link 
to this heading">¶</a></h2>
-<p>A scalar subquery can be used to produce a single value that can be used in 
many different contexts in a query. Here
-is an example of a filter using a scalar subquery. Only correlated subqueries 
are supported.</p>
-<div class="highlight-sql notranslate"><div 
class="highlight"><pre><span></span><span class="k">select</span><span 
class="w"> </span><span class="o">*</span><span class="w"> </span><span 
class="k">from</span><span class="w"> </span><span class="n">x</span><span 
class="w"> </span><span class="n">y</span><span class="w"> </span><span 
class="k">where</span><span class="w"> </span><span 
class="n">column_1</span><span class="w"> </span><span 
class="o">&lt;</span><span class="w"> </span><span  [...]
+</section>
+<section id="where-clause-with-correlated-subquery">
+<h3><code class="docutils literal notranslate"><span 
class="pre">WHERE</span></code> clause with correlated subquery<a 
class="headerlink" href="#where-clause-with-correlated-subquery" title="Link to 
this heading">¶</a></h3>
+<p>The following query returns rows with <code class="docutils literal 
notranslate"><span class="pre">column_2</span></code> values from table <code 
class="docutils literal notranslate"><span class="pre">x</span></code> greater
+than the average <code class="docutils literal notranslate"><span 
class="pre">string</span></code> value length from table <code class="docutils 
literal notranslate"><span class="pre">y</span></code>.
+The subquery in the <code class="docutils literal notranslate"><span 
class="pre">WHERE</span></code> clause uses the <code class="docutils literal 
notranslate"><span class="pre">column_1</span></code> value from the outer
+query to return the average <code class="docutils literal notranslate"><span 
class="pre">string</span></code> value length for that specific value.</p>
+<div class="highlight-sql notranslate"><div 
class="highlight"><pre><span></span><span class="k">SELECT</span>
+<span class="w">  </span><span class="o">*</span>
+<span class="k">FROM</span>
+<span class="w">  </span><span class="n">x</span>
+<span class="k">WHERE</span>
+<span class="w">  </span><span class="n">column_2</span><span class="w"> 
</span><span class="o">&gt;</span><span class="w"> </span><span 
class="p">(</span>
+<span class="w">    </span><span class="k">SELECT</span>
+<span class="w">      </span><span class="k">AVG</span><span 
class="p">(</span><span class="k">length</span><span class="p">(</span><span 
class="n">string</span><span class="p">))</span>
+<span class="w">    </span><span class="k">FROM</span>
+<span class="w">      </span><span class="n">y</span>
+<span class="w">    </span><span class="k">WHERE</span>
+<span class="w">      </span><span class="nb">number</span><span class="w"> 
</span><span class="o">=</span><span class="w"> </span><span 
class="n">x</span><span class="p">.</span><span class="n">column_1</span>
+<span class="w">  </span><span class="p">);</span>
+
 <span class="o">+</span><span class="c1">----------+----------+</span>
 <span class="o">|</span><span class="w"> </span><span 
class="n">column_1</span><span class="w"> </span><span class="o">|</span><span 
class="w"> </span><span class="n">column_2</span><span class="w"> </span><span 
class="o">|</span>
 <span class="o">+</span><span class="c1">----------+----------+</span>
-<span class="o">|</span><span class="w"> </span><span class="mi">1</span><span 
class="w">        </span><span class="o">|</span><span class="w"> </span><span 
class="mi">2</span><span class="w">        </span><span class="o">|</span>
+<span class="o">|</span><span class="w">        </span><span 
class="mi">2</span><span class="w"> </span><span class="o">|</span><span 
class="w">        </span><span class="mi">4</span><span class="w"> </span><span 
class="o">|</span>
 <span class="o">+</span><span class="c1">----------+----------+</span>
-<span class="mi">1</span><span class="w"> </span><span 
class="k">row</span><span class="w"> </span><span class="k">in</span><span 
class="w"> </span><span class="k">set</span><span class="p">.</span>
 </pre></div>
 </div>
 </section>
+</section>
+<section id="having-clause-subqueries">
+<h2>HAVING clause subqueries<a class="headerlink" 
href="#having-clause-subqueries" title="Link to this heading">¶</a></h2>
+<p><code class="docutils literal notranslate"><span 
class="pre">HAVING</span></code> clause subqueries compare an expression that 
uses aggregate values
+returned by aggregate functions in the <code class="docutils literal 
notranslate"><span class="pre">SELECT</span></code> clause to the result of the
+subquery and return <em>true</em> or <em>false</em>.
+Rows that evaluate to <em>false</em> are filtered from results.
+The <code class="docutils literal notranslate"><span 
class="pre">HAVING</span></code> clause supports correlated and non-correlated 
subqueries
+as well as scalar and non-scalar subqueries (depending on the the operator used
+in the predicate expression).</p>
+<div class="highlight-sql notranslate"><div 
class="highlight"><pre><span></span><span class="k">SELECT</span>
+<span class="w">  </span><span class="n">aggregate_expression1</span><span 
class="p">[,</span><span class="w"> </span><span 
class="n">aggregate_expression2</span><span class="p">,</span><span class="w"> 
</span><span class="p">...,</span><span class="w"> </span><span 
class="n">aggregate_expressionN</span><span class="p">]</span>
+<span class="k">FROM</span>
+<span class="w">  </span><span class="o">&lt;</span><span 
class="n">measurement</span><span class="o">&gt;</span>
+<span class="k">WHERE</span>
+<span class="w">  </span><span class="o">&lt;</span><span 
class="n">conditional_expression</span><span class="o">&gt;</span>
+<span class="k">GROUP</span><span class="w"> </span><span class="k">BY</span>
+<span class="w">  </span><span class="n">column_expression1</span><span 
class="p">[,</span><span class="w"> </span><span 
class="n">column_expression2</span><span class="p">,</span><span class="w"> 
</span><span class="p">...,</span><span class="w"> </span><span 
class="n">column_expressionN</span><span class="p">]</span>
+<span class="k">HAVING</span>
+<span class="w">  </span><span class="n">expression</span><span class="w"> 
</span><span class="k">operator</span><span class="w"> </span><span 
class="p">(</span><span class="o">&lt;</span><span 
class="n">subquery</span><span class="o">&gt;</span><span class="p">)</span>
+</pre></div>
+</div>
+<section id="id3">
+<h3>Examples<a class="headerlink" href="#id3" title="Link to this 
heading">¶</a></h3>
+<p>The following query calculates the averages of even and odd numbers in 
table <code class="docutils literal notranslate"><span 
class="pre">y</span></code>
+and returns the averages that are equal to the maximum value of <code 
class="docutils literal notranslate"><span class="pre">column_1</span></code>
+in table <code class="docutils literal notranslate"><span 
class="pre">x</span></code>.</p>
+<section id="having-clause-with-a-scalar-subquery">
+<h4><code class="docutils literal notranslate"><span 
class="pre">HAVING</span></code> clause with a scalar subquery<a 
class="headerlink" href="#having-clause-with-a-scalar-subquery" title="Link to 
this heading">¶</a></h4>
+<div class="highlight-sql notranslate"><div 
class="highlight"><pre><span></span><span class="k">SELECT</span>
+<span class="w">  </span><span class="k">AVG</span><span 
class="p">(</span><span class="nb">number</span><span class="p">)</span><span 
class="w"> </span><span class="k">AS</span><span class="w"> </span><span 
class="k">avg</span><span class="p">,</span>
+<span class="w">  </span><span class="p">(</span><span 
class="nb">number</span><span class="w"> </span><span class="o">%</span><span 
class="w"> </span><span class="mi">2</span><span class="w"> </span><span 
class="o">=</span><span class="w"> </span><span class="mi">0</span><span 
class="p">)</span><span class="w"> </span><span class="k">AS</span><span 
class="w"> </span><span class="n">even</span>
+<span class="k">FROM</span>
+<span class="w">  </span><span class="n">y</span>
+<span class="k">GROUP</span><span class="w"> </span><span class="k">BY</span>
+<span class="w">  </span><span class="n">even</span>
+<span class="k">HAVING</span>
+<span class="w">  </span><span class="k">avg</span><span class="w"> 
</span><span class="o">=</span><span class="w"> </span><span class="p">(</span>
+<span class="w">    </span><span class="k">SELECT</span>
+<span class="w">      </span><span class="k">MAX</span><span 
class="p">(</span><span class="n">column_1</span><span class="p">)</span>
+<span class="w">    </span><span class="k">FROM</span>
+<span class="w">      </span><span class="n">x</span>
+<span class="w">  </span><span class="p">);</span>
+
+<span class="o">+</span><span class="c1">-------+--------+</span>
+<span class="o">|</span><span class="w">   </span><span 
class="k">avg</span><span class="w"> </span><span class="o">|</span><span 
class="w"> </span><span class="n">even</span><span class="w">   </span><span 
class="o">|</span>
+<span class="o">+</span><span class="c1">-------+--------+</span>
+<span class="o">|</span><span class="w">     </span><span 
class="mi">2</span><span class="w"> </span><span class="o">|</span><span 
class="w"> </span><span class="k">false</span><span class="w">  </span><span 
class="o">|</span>
+<span class="o">+</span><span class="c1">-------+--------+</span>
+</pre></div>
+</div>
+</section>
+<section id="having-clause-with-a-non-scalar-subquery">
+<h4><code class="docutils literal notranslate"><span 
class="pre">HAVING</span></code> clause with a non-scalar subquery<a 
class="headerlink" href="#having-clause-with-a-non-scalar-subquery" title="Link 
to this heading">¶</a></h4>
+<p>Non-scalar subqueries must use the <code class="docutils literal 
notranslate"><span class="pre">[NOT]</span> <span class="pre">IN</span></code> 
or <code class="docutils literal notranslate"><span class="pre">[NOT]</span> 
<span class="pre">EXISTS</span></code> operators and
+can only return a single column.
+The values in the returned column are evaluated as a list.</p>
+<p>The following query calculates the averages of even and odd numbers in 
table <code class="docutils literal notranslate"><span 
class="pre">y</span></code>
+and returns the averages that are in <code class="docutils literal 
notranslate"><span class="pre">column_1</span></code> of table <code 
class="docutils literal notranslate"><span class="pre">x</span></code>.</p>
+<div class="highlight-sql notranslate"><div 
class="highlight"><pre><span></span><span class="k">SELECT</span>
+<span class="w">  </span><span class="k">AVG</span><span 
class="p">(</span><span class="nb">number</span><span class="p">)</span><span 
class="w"> </span><span class="k">AS</span><span class="w"> </span><span 
class="k">avg</span><span class="p">,</span>
+<span class="w">  </span><span class="p">(</span><span 
class="nb">number</span><span class="w"> </span><span class="o">%</span><span 
class="w"> </span><span class="mi">2</span><span class="w"> </span><span 
class="o">=</span><span class="w"> </span><span class="mi">0</span><span 
class="p">)</span><span class="w"> </span><span class="k">AS</span><span 
class="w"> </span><span class="n">even</span>
+<span class="k">FROM</span>
+<span class="w">  </span><span class="n">y</span>
+<span class="k">GROUP</span><span class="w"> </span><span class="k">BY</span>
+<span class="w">  </span><span class="n">even</span>
+<span class="k">HAVING</span>
+<span class="w">  </span><span class="k">avg</span><span class="w"> 
</span><span class="k">IN</span><span class="w"> </span><span class="p">(</span>
+<span class="w">    </span><span class="k">SELECT</span>
+<span class="w">      </span><span class="n">column_1</span>
+<span class="w">    </span><span class="k">FROM</span>
+<span class="w">      </span><span class="n">x</span>
+<span class="w">  </span><span class="p">);</span>
+
+<span class="o">+</span><span class="c1">-------+--------+</span>
+<span class="o">|</span><span class="w">   </span><span 
class="k">avg</span><span class="w"> </span><span class="o">|</span><span 
class="w"> </span><span class="n">even</span><span class="w">   </span><span 
class="o">|</span>
+<span class="o">+</span><span class="c1">-------+--------+</span>
+<span class="o">|</span><span class="w">     </span><span 
class="mi">2</span><span class="w"> </span><span class="o">|</span><span 
class="w"> </span><span class="k">false</span><span class="w">  </span><span 
class="o">|</span>
+<span class="o">+</span><span class="c1">-------+--------+</span>
+</pre></div>
+</div>
+</section>
+</section>
+</section>
+<section id="subquery-categories">
+<h2>Subquery categories<a class="headerlink" href="#subquery-categories" 
title="Link to this heading">¶</a></h2>
+<p>Subqueries can be categorized as one or more of the following based on the
+behavior of the subquery:</p>
+<ul class="simple">
+<li><p><a class="reference internal" 
href="#correlated-subqueries">correlated</a> or
+<a class="reference internal" 
href="#non-correlated-subqueries">non-correlated</a></p></li>
+<li><p><a class="reference internal" href="#scalar-subqueries">scalar</a> or 
<a class="reference internal" 
href="#non-scalar-subqueries">non-scalar</a></p></li>
+</ul>
+<section id="correlated-subqueries">
+<h3>Correlated subqueries<a class="headerlink" href="#correlated-subqueries" 
title="Link to this heading">¶</a></h3>
+<p>In a <strong>correlated</strong> subquery, the inner query depends on the 
values of the
+current row being processed.</p>
+<p><strong>Note:</strong> DataFusion internally rewrites correlated subqueries 
into JOINs to
+improve performance. In general correlated subqueries are <strong>less 
performant</strong>
+than non-correlated subqueries.</p>
+</section>
+<section id="non-correlated-subqueries">
+<h3>Non-correlated subqueries<a class="headerlink" 
href="#non-correlated-subqueries" title="Link to this heading">¶</a></h3>
+<p>In a <strong>non-correlated</strong> subquery, the inner query 
<em>doesn’t</em> depend on the outer
+query and executes independently.
+The inner query executes first, and then passes the results to the outer 
query.</p>
+</section>
+<section id="scalar-subqueries">
+<h3>Scalar subqueries<a class="headerlink" href="#scalar-subqueries" 
title="Link to this heading">¶</a></h3>
+<p>A <strong>scalar</strong> subquery returns a single value (one column of 
one row).
+If no rows are returned, the subquery returns NULL.</p>
+</section>
+<section id="non-scalar-subqueries">
+<h3>Non-scalar subqueries<a class="headerlink" href="#non-scalar-subqueries" 
title="Link to this heading">¶</a></h3>
+<p>A <strong>non-scalar</strong> subquery returns 0, 1, or multiple rows, each 
of which may
+contain 1 or multiple columns. For each column, if there is no value to return,
+the subquery returns NULL. If no rows qualify to be returned, the subquery
+returns 0 rows.</p>
+</section>
+</section>
 </section>
 
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to