diff options
author | pseudolukian <pseudolukian@yandex-team.com> | 2023-09-26 09:29:04 +0300 |
---|---|---|
committer | pseudolukian <pseudolukian@yandex-team.com> | 2023-09-26 09:55:59 +0300 |
commit | d101cf69457801d89fa57434f6257d8c1f1a1c6a (patch) | |
tree | 9ec8e53c989c666f8cab990b48069ca77fcaf605 | |
parent | 5363dc114f5e705104b320f2900b54e24bdfad8d (diff) | |
download | ydb-d101cf69457801d89fa57434f6257d8c1f1a1c6a.tar.gz |
Delete text with 'insert ... select'.
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 |