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 } + + + +## Параметры {: #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