diff --git a/docs/images/ebnf/dql.svg b/docs/images/ebnf/dql.svg
index 20ec24ceeb8b70237d0f6e5269f8230fa58c23a2..44bcea6078462607cf7c0e073871539438b711bb 100644
Binary files a/docs/images/ebnf/dql.svg and b/docs/images/ebnf/dql.svg differ
diff --git a/docs/images/ebnf/expression.svg b/docs/images/ebnf/expression.svg
index 4b03f78e7be001851e13cc124819ae51994cecbb..608b2c515860e42d59e0f1b1f0c9030d227fab94 100644
Binary files a/docs/images/ebnf/expression.svg and b/docs/images/ebnf/expression.svg differ
diff --git a/docs/images/ebnf/insert.svg b/docs/images/ebnf/insert.svg
index 5ddc1868a5ae1b130cc6426d9512960e4b98bb0f..5481437c4f33a9784a6e2b384f2f9af0af49132d 100644
Binary files a/docs/images/ebnf/insert.svg and b/docs/images/ebnf/insert.svg differ
diff --git a/docs/images/ebnf/scan.svg b/docs/images/ebnf/scan.svg
index c78a0489d01236884b13db41bd331eee1e585bdb..062f1207ad1bcc62150cca5e466fcc362bf5cb4a 100644
Binary files a/docs/images/ebnf/scan.svg and b/docs/images/ebnf/scan.svg differ
diff --git a/docs/images/ebnf/with.svg b/docs/images/ebnf/with.svg
new file mode 100644
index 0000000000000000000000000000000000000000..83d0fd7f03006adb13476195683099eac523ea80
Binary files /dev/null and b/docs/images/ebnf/with.svg differ
diff --git a/docs/reference/ansi_sql.md b/docs/reference/ansi_sql.md
index 2f6256ac5924928f02c81b5df39077420a814ac2..b91a2082e960c2fdc96748cd3809414b47d36f47 100644
--- a/docs/reference/ansi_sql.md
+++ b/docs/reference/ansi_sql.md
@@ -1173,7 +1173,7 @@ td.td3 ul {
         <tr>
             <td class="center"><span class="full">—</span></td>
             <td>CTE</td>
-            <td class="td3 center">CTE</td>
+            <td class="td3 center">[CTE](sql/with.md)</td>
             <td></td>
         </tr>
         <tr>
diff --git a/docs/reference/sql/with.md b/docs/reference/sql/with.md
new file mode 100644
index 0000000000000000000000000000000000000000..043b11690bdf5781d27aebe10b40cdb31166f621
--- /dev/null
+++ b/docs/reference/sql/with.md
@@ -0,0 +1,139 @@
+# Использование CTE
+
+Предложение `WITH` добавляется перед [DQL](dql.md)-командой
+[`SELECT`](select.md) и позволяет использовать в запросе временные
+таблицы.
+
+Такие временные таблицы называются *общими табличными выражениями*
+(англ. CTE — common table expressions) и существуют только в контексте
+выполнения запроса.
+
+Предложение `WITH` агрессивно материализует результаты в памяти и почти
+никогда не использует встраивание подзапроса в синтаксическое дерево
+команды `SELECT`.
+
+В область видимости общих табличных выражений и команды `SELECT` попадают
+результаты выражений, описанных ранее в запросе `WITH`. Например, есть
+запрос `WITH` с тремя общими табличными выражениями:
+
+```
+WITH
+    <cte1>,
+    <cte2>,
+    <cte3>
+SELECT <...>
+```
+
+В команде `SELECT` можно использовать результаты выражений `<cte1>`,
+`<cte2>`, `<cte3>`. В выражении `<cte3>` — результаты выражений `<cte1>`,
+`<cte2>`. В выражении `<cte2>` — результат выражения `<cte1>`. В выражении
+`<cte1>` должны использоваться запросы к уже существующим таблицам.
+
+## Синтаксис {: #syntax }
+
+![WITH](../../images/ebnf/with.svg)
+
+## Параметры {: #params }
+
+* **cte** — имя общего табличного выражения. Соответствует правилам
+  имен для всех [объектов](object.md) в кластере
+* **column** — имя колонки общего табличного выражения. Соответствует
+  правилам имен для всех [объектов](object.md) в кластере
+
+## Примеры {: #examples }
+
+??? example "Тестовые таблицы"
+    Примеры использования команд включают в себя запросы к [тестовым
+    таблицам](../legend.md).
+
+```sql title="Запрос WITH и CTE с предложением WHERE"
+WITH replenish (item, amount)
+    AS (SELECT item, amount FROM orders WHERE amount <= 1000)
+SELECT item, amount FROM replenish;
+```
+
+Результат:
+
+```bash
++-------------+--------+
+| item        | amount |
++======================+
+| "adhesives" | 350    |
+|-------------+--------|
+| "moldings"  | 900    |
+|-------------+--------|
+| "bars"      | 100    |
++-------------+--------+
+(3 rows)
+```
+
+```sql title="Запрос WITH и CTE с внутренним соединением"
+WITH leftovers (item, orders_data, deliveries_data) AS (
+    SELECT item, amount, deliveries.quantity
+    FROM orders
+    JOIN deliveries
+    ON item = deliveries.product
+    )
+SELECT item, orders_data - deliveries_data AS amount FROM leftovers;
+```
+
+Результат:
+
+```bash
++-------------+--------+
+| item        | amount |
++======================+
+| "metalware" | 3000   |
+|-------------+--------|
+| "adhesives" | 50     |
+|-------------+--------|
+| "moldings"  | 800    |
+|-------------+--------|
+| "bars"      | 95     |
+|-------------+--------|
+| "blocks"    | 5000   |
++-------------+--------+
+(5 rows)
+```
+
+```sql title="Запрос WITH с двумя независимыми CTE"
+WITH
+    c (total) AS (SELECT count(*) FROM orders),
+    m (earliest_date) AS (SELECT min(since) FROM orders)
+SELECT c.total, m.earliest_date FROM c LEFT JOIN m ON true;
+```
+
+Результат:
+
+```bash
++-------+------------------------+
+| total | earliest_date          |
++================================+
+| 5     | "2023-11-11T00:00:00Z" |
++-------+------------------------+
+(1 rows)
+```
+
+```sql title="Запрос WITH, в котором результат CTE <i>ordered_items</i> используется в CTE <i>total_stock</i>"
+WITH
+    ordered_items (id, name, stock) AS (
+        SELECT items.* FROM items
+        JOIN orders
+        ON items.name = orders.item
+    ),
+    total_stock (total) AS (
+        SELECT sum(stock) FROM ordered_items
+    )
+SELECT * FROM total_stock;
+```
+
+Результат:
+
+```bash
++-------+
+| total |
++=======+
+| 90227 |
++-------+
+(1 rows)
+```
diff --git a/docs/sql_index.md b/docs/sql_index.md
index a1c28bbdcd2feb4338bf1a27990208562fa9cfcc..8dc8638422acf4f936637b8be60c12d990595190 100644
--- a/docs/sql_index.md
+++ b/docs/sql_index.md
@@ -38,6 +38,7 @@
 
 ## Синтаксис {: #syntax }
 
+* [Использование CTE](reference/sql/with.md)
 * [Использование JOIN](reference/sql/join.md)
 
 ## Функции и выражения {: #functions_and_expressions }
diff --git a/mkdocs.yml b/mkdocs.yml
index 55f2b904fc2c50d5a96a78c2648ad15a08888a6e..3dbecba5546f30f478c24b0e7ac0e839e0067584 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -90,6 +90,7 @@ nav:
         - reference/sql/update.md
         - reference/sql/values.md
       - Синтаксис:
+        - reference/sql/with.md
         - reference/sql/join.md
       - Функции и выражения:
         - reference/sql/aggregate.md