Оператор PostgreSQL SELECT INTO на практических примерах
Резюме : в этом руководстве вы узнаете, как использовать оператор PostgreSQL SELECT INTO для создания новой таблицы из набора результатов запроса.
Если вы ищете способ выбора данных в переменные, ознакомьтесь с оператором PL/pgSQL SELECT INTO .
Знакомство с оператором PostgreSQL SELECT INTO
Оператор PostgreSQL SELECT INTO создает новую таблицу и вставляет в нее данные, возвращенные запросом.
В новой таблице столбцы будут иметь те же имена, что и столбцы результирующего набора запроса. В отличие от обычного оператора SELECT , оператор SELECT INTO не возвращает результат клиенту.
Ниже показан синтаксис оператора PostgreSQL SELECT INTO :
SELECT
select_list
В [ВРЕМЕННО | ТЕМП | UNLOGGED ] [ TABLE ] новое_имя_таблицы
ОТ
имя_таблицы
ГДЕ
условие_поиска;
Язык кода: SQL (язык структурированных запросов) (sql) Чтобы создать новую таблицу со структурой и данными, полученными из набора результатов, вы указываете имя новой таблицы после ключевого слова INTO .
Ключевое слово TEMP или TEMPORARY является необязательным; вместо этого вы можете создать временную таблицу.
Ключевое слово UNLOGGED , если оно доступно, сделает новую таблицу незарегистрированной.
Предложение WHERE позволяет указать строки из исходных таблиц, которые должны быть вставлены в новую таблицу. Помимо WHERE , вы можете использовать другие предложения в операторе SELECT для оператора SELECT INTO , такие как INNER JOIN , LEFT JOIN , GROUP BY и 90. 005 ИМЕЮЩИЙ .
Обратите внимание, что вы не можете использовать оператор SELECT INTO в PL/pgSQL, поскольку он иначе интерпретирует предложение INTO . В этом случае вы можете использовать оператор CREATE TABLE AS , который предоставляет больше возможностей, чем оператор 9.0005 Оператор SELECT INTO .
PostgreSQL SELECT INTO examples
Для демонстрации мы будем использовать таблицу film из примера базы данных.
Следующий оператор создает новую таблицу с именем film_r , которая содержит фильмы с рейтингом R и сроком проката 5 дней из таблицы film .
ВЫБОР
фильм_идентификатор,
заголовок,
арендная плата
В СТОЛ film_r
ОТ
фильм
ГДЕ
рейтинг = 'R'
И rent_duration = 5
СОРТИРОВАТЬ ПО
заголовок;
Язык кода: SQL (язык структурированных запросов) (sql) Для проверки создания таблицы можно запросить данные из таблицы film_r :
SELECT * FROM film_r; Язык кода: SQL (язык структурированных запросов) (sql)
Следующий оператор создает временную таблицу с именем short_film , содержащую фильмы продолжительностью менее 60 минут.
ВЫБОР
фильм_идентификатор,
заголовок,
длина
INTO TEMP TABLE короткометражный фильм
ОТ
фильм
ГДЕ
длина < 60
СОРТИРОВАТЬ ПО
заголовок; Язык кода: SQL (язык структурированных запросов) (sql) Ниже показаны данные из таблицы short_film :
SELECT * FROM short_film; Язык кода: SQL (язык структурированных запросов) (sql)
В этом руководстве вы узнали, как использовать оператор PostgreSQL SELECT INTO для создания новой таблицы из набора результатов запроса.
Было ли это руководство полезным?
postgresql — СОЗДАТЬ ТАБЛИЦУ КАК против ВЫБРАТЬ В
спросил
Изменено 3 года, 9 месяцев назад
Просмотрено 18 тысяч раз
PostgreSQL поддерживает CREATE TABLE AS и SELECT INTO , когда использовать оба?
CREATE TABLE AS— определить новую таблицу по результатам запроса
CREATE TABLE ASсоздает таблицу и заполняет ее данными, вычисленными командойSELECT. Столбцы таблицы имеют имена и типы данных, связанные с выходными столбцамиSELECT(за исключением того, что вы можете переопределить имена столбцов, указав явный список имен новых столбцов).
CREATE TABLE ASимеет некоторое сходство с созданием представления, но на самом деле это совсем другое: он создает новую таблицу и вычисляет запрос только один раз, чтобы первоначально заполнить новую таблицу. Новая таблица не будет отслеживать последующие изменения в исходных таблицах запроса. Напротив, представление переоценивает свои определяющиепри каждом запросе.Оператор SELECT
А потом.
SELECT INTO— определить новую таблицу по результатам запроса
SELECT INTOсоздает новую таблицу и заполняет ее данными, вычисленными по запросу. Данные не возвращаются клиенту, как при обычномSELECT. Столбцы новой таблицы имеют имена и типы данных, связанные с выходными столбцамиSELECT 9.0006 .
- postgresql
- ctas
Без объяснения причин всегда используйте CREATE TABLE AS без исключения.
Внизу каждого под ПРИМЕЧАНИЯ это уточняется,
Примечания для ВЫБЕРИТЕ В
CREATE TABLE ASфункционально аналогиченSELECT INTO.CREATE TABLE ASявляется рекомендуемым синтаксисом, поскольку эта формаSELECT INTOнедоступна в ECPG или PL/pgSQL, поскольку они по-разному интерпретируют предложение INTO. Кроме того,CREATE TABLE ASпредлагает расширенный набор функций, предоставляемыхSELECT INTO.
Примечания к СОЗДАТЬ ТАБЛИЦУ КАК ,
Эта команда функционально аналогична
SELECT INTO, но она предпочтительнее, поскольку ее меньше путают с другими вариантами использования синтаксисаSELECT INTO. Кроме того,CREATE TABLE ASпредлагает расширенный набор функций, предлагаемыхВЫБЕРИТЕ.
Также в разделе Compatibility документов SELECT INTO идет еще дальше,
Стандарт SQL использует
SELECT INTOдля представления выбора значений в скалярных переменных основной программы, а не для создания новой таблицы. Именно такое использование можно найти в ECPG (см. главу 34) и PL/pgSQL (см. главу 41). Использование PostgreSQLSELECT INTOдля представления создания таблицы является историческим. Для этой цели в новом коде лучше всего использоватьCREATE TABLE AS.
Итак, у нас есть
- PostgreSQL считает, что это сбивает с толку, потому что
SELECT INTOделает другие вещи в контекстах, доступных только в PL/pgSQL и ECPG. -
CREATE TABLEподдерживает больше функций (я предполагаю, что они имеют в видуWITH OIDSиTABLESPACE,IF NOT EXISTS).
-
SELECT INTOдля создания таблицы "устарел".
В качестве примечания, синтаксис для CTAS с CTE может выглядеть немного странно, и SELECT INTO также может быть своего рода удержанием QUEL RETRIEVE INTO . QUEL был предшественником SQL, который использовался предшественником PostgreSQL (INGRES).
Я заметил еще одну вещь, которая отсутствует в принятом ответе. С использованием CREATE TABLE AS сохраняет атрибут nullable каждого столбца, который, кажется, игнорируется ВЫБЕРИТЕ .
Только на этом основании я бы рекомендовал CREATE TABLE AS . Обычный вариант использования обоих операторов — загрузка данных из долго выполняющегося запроса в таблицу без блокировки этой таблицы на время выполнения запроса. Вы создаете временную таблицу с помощью одной из приведенных выше команд, помещаете в нее долго выполняющиеся результаты запроса, а затем вставляете эти результаты в исходную таблицу.


