Оператор 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
. Обычный вариант использования обоих операторов — загрузка данных из долго выполняющегося запроса в таблицу без блокировки этой таблицы на время выполнения запроса. Вы создаете временную таблицу с помощью одной из приведенных выше команд, помещаете в нее долго выполняющиеся результаты запроса, а затем вставляете эти результаты в исходную таблицу.