aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpseudolukian <pseudolukian@yandex-team.com>2023-09-26 09:29:04 +0300
committerpseudolukian <pseudolukian@yandex-team.com>2023-09-26 09:55:59 +0300
commitd101cf69457801d89fa57434f6257d8c1f1a1c6a (patch)
tree9ec8e53c989c666f8cab990b48069ca77fcaf605
parent5363dc114f5e705104b320f2900b54e24bdfad8d (diff)
downloadydb-d101cf69457801d89fa57434f6257d8c1f1a1c6a.tar.gz
Delete text with 'insert ... select'.
-rw-r--r--ydb/docs/ru/core/postgresql/_includes/statements/drop_table.md4
-rw-r--r--ydb/docs/ru/core/postgresql/_includes/statements/insert_into.md19
-rw-r--r--ydb/docs/ru/core/postgresql/_includes/statements/select.md26
-rw-r--r--ydb/docs/ru/core/postgresql/_includes/statements/update.md10
4 files changed, 21 insertions, 38 deletions
diff --git a/ydb/docs/ru/core/postgresql/_includes/statements/drop_table.md b/ydb/docs/ru/core/postgresql/_includes/statements/drop_table.md
index 4c9b6920731..503fc23174f 100644
--- a/ydb/docs/ru/core/postgresql/_includes/statements/drop_table.md
+++ b/ydb/docs/ru/core/postgresql/_includes/statements/drop_table.md
@@ -1,6 +1,6 @@
## DROP TABLE, DELETE FROM (удаление таблиц и строк){#delete}
-Для удаления таблиц целиком используется инструкция `DROP TABLE <название_таблицы>;`, а для удаления строки из таблицы по конкретному значению столбца используется конструкция `DELETE FROM <название_таблицы> WHERE <название_столбца>=<значение или диапозон_значений>`.
+Для удаления таблиц целиком используется инструкция `DROP TABLE <название_таблицы>;`, а для удаления строки из таблицы по конкретному значению столбца используется конструкция `DELETE FROM <название_таблицы> WHERE <название_столбца>=<значение или диапозон_значений>`.
{% note warning %}
@@ -8,4 +8,4 @@
{% endnote %}
-Например, для удаления фильма с названием "American Graffiti" из таблицы `movies` нужно выполнить следующую команду: `DELETE FROM movies WHERE title='American Graffiti';`. Можно удалить все фильмы Джорджа Лукоса из таблицы `movies` снятые раньше 1980 года: `DELETE FROM movies WHERE director = 'George Lucas' AND date_prod < '1980-01-01';`. \ No newline at end of file
+Например, для удаления фильма с названием "USA Wall Art" из таблицы `movies` нужно выполнить следующую команду: `DELETE FROM movies WHERE title='USA Wall Art';`. Можно удалить все фильмы Джорджа Лукоса из таблицы `movies` снятые раньше 1980 года: `DELETE FROM movies WHERE director = 'George Lucas' AND production_date < '1980-01-01';`. \ No newline at end of file
diff --git a/ydb/docs/ru/core/postgresql/_includes/statements/insert_into.md b/ydb/docs/ru/core/postgresql/_includes/statements/insert_into.md
index 8f65d7e8cd6..6f8545e4e9b 100644
--- a/ydb/docs/ru/core/postgresql/_includes/statements/insert_into.md
+++ b/ydb/docs/ru/core/postgresql/_includes/statements/insert_into.md
@@ -38,22 +38,5 @@ VALUES
```sql
INSERT INTO movies (title, director, production_date, star, length)
VALUES
-('Indiana Johns and the Final Quest', 'Steven Spielberg', '1989-05-24'::date, 'Harrison Ford', INTERVAL '2 hours 7 minutes');
-```
-
-Помимо конструкции `INSERT INTO`, которая вставляет строки в таблицу, существует и её расширенная версия для выборки данных из другой таблицы и вставки их в новую (указанную) таблицу – `INSERT INTO ... SELECT ... FROM ...`. Последовательность столбцов и типы данных должны совпадать в конструкциях `INSERT INTO` и `SELECT`.
-
-Пример вставки нескольких фильмов из таблицы "movies" в таблицу "movies_2" (копия таблицы "movies"):
-```sql
-INSERT INTO movies_2 (title, director, production_date, star, length)
-SELECT title, director, production_date, star, length
-FROM movies
-WHERE production_date < '1980-01-01'::date;
-```
-В этом примере из таблицы "movies" делается выборка фильмов произведенных до 1980 года и данные вставляются в таблицу "movies_2". В данном примере в обеих таблицах используются все столбцы, но выборка может быть сделана и по меньшему количеству столбцов. При вставки данных, можно не указывать перечень столбцов у `INSERT INTO`:
-```sql
-INSERT INTO movies_2
-SELECT title, director, production_date, star
-FROM movies
-WHERE production_date < '1980-01-01'::date;
+('Indiana Johns and the Next Quest', 'Steven Spielberg', '1990-05-24'::date, 'Harrison Ford', INTERVAL '2 hours 7 minutes');
``` \ No newline at end of file
diff --git a/ydb/docs/ru/core/postgresql/_includes/statements/select.md b/ydb/docs/ru/core/postgresql/_includes/statements/select.md
index 7c50a749254..b3cb64b572c 100644
--- a/ydb/docs/ru/core/postgresql/_includes/statements/select.md
+++ b/ydb/docs/ru/core/postgresql/_includes/statements/select.md
@@ -9,25 +9,25 @@ SELECT LENGTH('Hello'); -- Возвращает длину строки 'Hello'
SELECT CAST('123' AS INTEGER); -- Преобразует строки в числа
```
-Такое применение `SELECT` бывает полезно при тестировании, отладки выражений или SQL-функций без обращения к реальной таблице, но чаще `SELECT` используется для получения строк из одной или множества таблиц. В самом простом представлении `SELECT` можно записать так: `SELECT <название столбца/столбцов> FROM <название таблицы>` или `SELECT <название_функции(< название столбца>)> FROM <название таблицы>;`. Чтобы прочитать все данные из таблицы, например, таблицы `movies` – нужно выполнить команду `SELECT * FROM movies;`, где `*` – это оператор выбора данных по всем столбцам. При такой записи будут возвращены все строки из таблицы с данными по всем столбцам. Получить выборку строк таблицы по определенным столбцам можно перечислением названий столбцов после ключевого слова `SELECT`: `SELECT <название столбца>, <название столбца> FROM <название таблицы>;`.
+Такое применение `SELECT` бывает полезно при тестировании, отладки выражений или SQL-функций без обращения к реальной таблице, но чаще `SELECT` используется для получения строк из одной или множества таблиц. В самом простом представлении `SELECT` можно записать так: `SELECT <название столбца/столбцов> FROM <название таблицы>` или `SELECT <название_функции(< название столбца>)> FROM <название таблицы>;`. Чтобы прочитать все данные из таблицы, например, таблицы `movies` – нужно выполнить команду `SELECT * FROM movies;`, где `*` – это оператор выбора данных по всем столбцам. При такой записи будут возвращены все строки из таблицы с данными по всем столбцам. Получить выборку строк таблицы по определенным столбцам можно перечислением названий столбцов после ключевого слова `SELECT`: `SELECT <название столбца>, <название столбца> FROM <название таблицы>;`.
Вывести столбцы "title" и "director" для всех строк [таблицы](#create_table) "movies" можно так: `SELECT title, director FROM movies;`. Если в таблице много строк и нужно ограничить количество выводимых строк на печать – используется `LIMIT` с заданным количеством выводимых строк, который добавляется в конец инструкции `SELECT`.
Например, можно вывести только 5 строк таблицы `movies`:
```sql
SELECT title,director FROM movies LIMIT 5;
-```
+```
Для выборки только части строк - используется оператор `WHERE` с условиями выборки: `SELECT <название столбца> FROM <название таблицы> WHERE <название столбца> <оператор условного сравнения> <значение столбца выборки>;` Например, можно выбрать все фильмы Джорджа Лукоса из нашей таблицы, созданные им после 1980 года:
```sql
-SELECT * FROM movies WHERE director = 'George Lucas' AND date_prod > '1980-01-01';
-```
+SELECT * FROM movies WHERE director = 'George Lucas' AND production_date > '1980-01-01';
+```
Можно добавить еще одно условие выборки, предположим по времени длительности фильма менее 2 часов. Сделать это можно добавлением оператора `AND` с указанием второго условия выборки. Такая запись может выглядеть так:
```sql
SELECT * FROM movies
-WHERE length < INTERVAL '2 hours' AND date_prod < '1973-01-01';
-```
+WHERE length < INTERVAL '2 hours' AND production_date < '1973-01-01';
+```
По умолчанию база данных не гарантирует порядок возврата строк, и он может отличаться от запроса к запросу. Если требуется сохранить определенный порядок строк – используется инструкция `ORDER BY <название столбца для сортировки> <направление сортировки>`. Сортировка происходит по результатам, которые возвращает (`SELECT`), а не по исходным столбцам таблицы (`FROM`). Сортировать можно в прямом порядке – ASC (от меньшего к большему - вариант по умолчанию, можно не указывать) и в обратном – DESC (от большего к меньшему). Как сортировка будет выполняться, зависит от типа данных столбца. Например, строки хранятся в utf-8 и сравниваются по "unicode collate" (по кодам символов).
@@ -35,8 +35,8 @@ WHERE length < INTERVAL '2 hours' AND date_prod < '1973-01-01';
Отсортировать фильмы по убыванию даты производства от более новых, до более старых можно так:
```sql
-SELECT title, director,date_prod FROM movies
-ORDER BY date_prod DESC;
+SELECT title, director,production_date FROM movies
+ORDER BY production_date DESC;
```
`SELECT` можно применять к нескольким таблицам с указанием типа соединения таблиц. Объединение таблиц задается через оператор `JOIN`, который бывает следующих типов:
@@ -46,11 +46,11 @@ ORDER BY date_prod DESC;
4. `FULL JOIN` (или FULL OUTER JOIN) – возвращает как совпавшие, так и не совпавшие строки в обеих таблицах, при этом возвращает `NULL` в колонках из таблицы, для которой не найдено совпадение.
5. `CROSS JOIN` – возвращает комбинированный результат каждой строки левой таблицы с каждой строкой правой таблицы. Обычно используется, когда необходимо получить все возможные комбинации строк из двух таблиц.
-Когда выполняется `JOIN` по определенному условию, например, по ключу, и в одной из таблиц есть несколько строк с одинаковым значением этого ключа, получается [декартово произведение](https://ru.wikipedia.org/wiki/Прямое_произведение). Это означает, что каждая строка из одной таблицы будет соединена с каждой соответствующей строкой из другой таблицы. На данный момент в PostgreSQL совместимости реализованы `INNER JOIN` и `CROSS JOIN`. `CROSS JOIN` просто комбинирует каждую строку одной таблицы с каждой строкой другой. `INNER JOIN` работает похожим образом, но добавляет фильтрацию. Этот фильтр определяется в части `ON` запроса. Таким образом, из всего декартова произведения выбираются только строки, соответствующие заданному условию.
+Когда выполняется `JOIN` по определенному условию, например, по ключу, и в одной из таблиц есть несколько строк с одинаковым значением этого ключа, получается [декартово произведение](https://ru.wikipedia.org/wiki/Прямое_произведение). Это означает, что каждая строка из одной таблицы будет соединена с каждой соответствующей строкой из другой таблицы. Опишем работу `INNER JOIN` и `CROSS JOIN`. `CROSS JOIN` просто комбинирует каждую строку одной таблицы с каждой строкой другой. `INNER JOIN` работает похожим образом, но добавляет фильтрацию. Этот фильтр определяется в части `ON` запроса. Таким образом, из всего декартова произведения выбираются только строки, соответствующие заданному условию.
Можно сказать, что `INNER JOIN` - это `CROSS JOIN`, но с дополнительной фильтрацией, или наоборот `CROSS JOIN` — это частный случай `INNER JOIN`, когда строки в обеих таблицах совпали. Если одна из таблиц пуста, результат объединения тоже будет пуст. `INNER JOIN` часто дает меньше строк на выходе, чем `CROSS JOIN`. `CROSS JOIN` объединяет строки без какого-либо условия, и поэтому в его синтаксисе отсутствуют ключевые слова `ON` или `USING`: `CROSS JOIN <название_таблицы> AS <алиас_таблицы>;`. В примере далее мы будем использовать `INNER JOIN`, синтаксис которого выглядит так: `INNER JOIN <название_таблицы> AS <алиас_таблицы> ON <алиас_первой_таблицы>.<имя_столбца> = <алиас_таблицы>.<соответствующее_имя_столбца>;`.
-Вместо ключевого слова `ON` в `INNER JOIN` может использоваться `USING`. Использовать `USING` удобно, когда имена столбцов, по которым происходит соединение, в обеих таблицах совпадают. Синтаксис становится короче и чище: `INNER JOIN <название_таблицы> AS <алиас_таблицы> USING (<имя_столбца>);`. В одном SQL-запросе может быть N количество `JOIN` разных типов. Последовательность выполнения `JOIN` определяется их порядком в запросе и логикой выполнения запроса оптимизатором базы данных.
+Вместо ключевого слова `ON` в `INNER JOIN` может использоваться `USING`. Использовать `USING` удобно, когда имена столбцов, по которым происходит соединение, в обеих таблицах совпадают. Синтаксис становится короче и чище: `INNER JOIN <название_таблицы> AS <алиас_таблицы> USING (<имя_столбца>);`. В одном SQL-запросе может быть N количество `JOIN` разных типов. Последовательность выполнения `JOIN` определяется их порядком в запросе и логикой выполнения запроса оптимизатором базы данных.
Мы уже до этого создали [таблицу](#create_table) "movies", создадим ещё одну таблицу "lucas_actors":
```sql
@@ -58,7 +58,7 @@ CREATE TABLE lucas_actors (
id SERIAL PRIMARY KEY,
full_name TEXT NOT NULL,
film TEXT NOT NULL,
- date_prod DATE NOT NULL,
+ production_date DATE NOT NULL,
date_of_birth DATE,
achievements TEXT
);
@@ -66,7 +66,7 @@ CREATE TABLE lucas_actors (
Заполним таблицу "lucas_actors" данными:
```sql
-INSERT INTO lucas_actors (full_name, film, date_prod, date_of_birth, achievements)
+INSERT INTO lucas_actors (full_name, film, production_date, date_of_birth, achievements)
VALUES
('Harrison Ford', 'Indiana Jones and the Last Crusade', CAST('1989-05-24' AS DATE), CAST('1942-07-13' AS DATE), 'Oscar Nominee'),
('Richard Dreyfuss', 'American Graffiti', CAST('1973-08-01' AS DATE), CAST('1947-10-29' AS DATE), 'Oscar Winner'),
@@ -76,7 +76,7 @@ VALUES
('Hayden Christensen', 'Star Wars: Episode III - Revenge of the Sith', CAST('2005-05-19' AS DATE), CAST('1981-04-19' AS DATE), NULL);
```
-Теперь применим оператор `INNER JOIN` для вывода в терминал полного имени актера (`full_name`), дня его рождения (`date_of_birth`), названия фильма (`title`) и даты производства фильма (`production_date`):
+Теперь применим оператор `INNER JOIN` для вывода в терминал полного имени актера (`full_name`), дня его рождения (`date_of_birth`), названия фильма (`title`) и даты производства фильма (`production_date`)(таблицы "movies" и "lucas_actors" должны быть заполнены данными):
```sql
SELECT
la.full_name,
diff --git a/ydb/docs/ru/core/postgresql/_includes/statements/update.md b/ydb/docs/ru/core/postgresql/_includes/statements/update.md
index b2cbde3e7b3..c4b0bb1ff59 100644
--- a/ydb/docs/ru/core/postgresql/_includes/statements/update.md
+++ b/ydb/docs/ru/core/postgresql/_includes/statements/update.md
@@ -4,11 +4,11 @@
UPDATE <название_таблицы> SET <название_столбца> = <новое_значение> WHERE <название_столбца_для_поиска> = <искомое_значение>;
```
-`UPDATE` работает так: сначала задаётся название таблицы, в которой будет произведена замена данных в строке (строках), затем указывается название столбца, где следует произвести замену данных, задаются новые данные, далее указывается оператор `WHERE` и после задаются условия поиска строки. Например, чтобы скорректировать длительность фильма "Star Wars: Episode I - The Phantom Menace" нужно применить следующую запись:
+`UPDATE` работает так: сначала задаётся название таблицы, в которой будет произведено обновление данных. Затем указываются названия столбцов для обновления и их новые значения. Далее указывается оператор `WHERE` и после задаются условия поиска строки. Например, чтобы скорректировать длительность фильма "Space Battles: Episode One - The Ghostly Threat" нужно применить следующую запись:
```sql
-UPDATE movies
-SET length = INTERVAL '02:11:00'
-WHERE title = 'Star Wars: Episode I - The Phantom Menace';
+UPDATE movies
+SET length = INTERVAL '02:11:00'
+WHERE title = 'Space Battles: Episode One - The Ghostly Threat';
```
Для одновременного обновления разных значений в разных строках можно использовать инструкция `CASE ... END`, с вложенными условиями выборки данных `WHEN <название столбца> <оператор сравнения> THEN <новое значение>`. Далее следует конструкция `WHERE <название колонки> IN (<значение колонки>)`, которая позволяет задать список значений, по которым будет выполнено условие.
@@ -17,7 +17,7 @@ WHERE title = 'Star Wars: Episode I - The Phantom Menace';
```sql
UPDATE movies
-SET length = CASE
+SET length = CASE
WHEN title = 'Indiana Johns and the Final Quest' THEN INTERVAL '2 hours 10 minutes'
WHEN title = 'Space Battles: Episode One - The Ghostly Threat' THEN INTERVAL '2 hours 19 minutes'
END