SELECT INTO SQL Server
Оператор SELECT INTO SQL Server (Transact-SQL) используется для создания таблицы из существующей таблицы путем копирования столбцов существующей таблицы.
Важно отметить, что при создании таблицы таким образом новая таблица будет заполнена записями из существующей таблицы (на основании результирующего набора оператора SELECT).
Синтаксис
Синтаксис оператора SELECT INTO в SQL Server (Transact-SQL):
SELECT expressions
INTO new_table
FROM tables
[WHERE conditions];
Параметры или аргументы
expressions — столбцы или вычисления, которые вы хотите получить.
new_table — создаваемая новая таблица с выбранными выражениями и связанными с ними определениями ( new_table не должна существовать на момент выполнения).
tables — таблицы, из которых вы хотите получить записи. Должна быть хотя бы одна таблица, перечисленная в предложении FROM.
WHERE conditions — необязательный. Условия, которые должны быть выполнены для выбранных записей.
Примечание
- При использовании оператора SELECT INTO в SQL Server, new_table еще не существует. Если new_table уже существует, то оператор SELECT INTO вызовет ошибку.
Пример
Рассмотрим пример использования оператора SELECT INTO в SQL Server (Transact-SQL).
Например:
Sql into что это
SELECT INTO — создать таблицу из результатов запроса
Синтаксис
[ WITH [ RECURSIVE ]запрос_WITH
[, . ] ] SELECT [ ALL | DISTINCT [ ON (выражение
[, . ] ) ] ] * |выражение
[ [ AS ]имя_результата
] [, . ] INTO [ TEMPORARY | TEMP | UNLOGGED ] [ TABLE ]новая_таблица
[ FROMэлемент_FROM
[, . ] ] [ WHEREусловие
] [ GROUP BYвыражение
[, . ] ] [ HAVINGусловие
] [ WINDOWимя_окна
AS (определение_окна
) [, . ] ] [ < UNION | INTERSECT | EXCEPT >[ ALL | DISTINCT ]выборка
] [ ORDER BYвыражение
[ ASC | DESC | USINGоператор
] [ NULLS < FIRST | LAST >] [, . ] ] [ LIMIT <число
| ALL > ] [ OFFSETначало
[ ROW | ROWS ] ] [ FETCH < FIRST | NEXT >[число
] < ROW | ROWS >ONLY ] [ FOR < UPDATE | SHARE >[ OFимя_таблицы
[, . ] ] [ NOWAIT ] [. ] ]
Описание
SELECT INTO создаёт новую таблицу и заполняет её данными, полученными из запроса. Данные не передаются клиенту, как с обычной командой SELECT . Столбцы новой таблицы получают имена и типы данных, связанные с выходными столбцами SELECT .
Параметры
TEMPORARY или TEMP
Если указано, создаваемая таблица будет временной. За подробностями обратитесь к CREATE TABLE . UNLOGGED
Если указано, создаваемая таблица будет нежурналируемой. За подробностями обратитесь к CREATE TABLE . новая_таблица
Имя создаваемой таблицы (возможно, дополненное схемой).
Все другие параметры подробно описываются в SELECT .
Замечания
Команда SELECT INTO действует подобно CREATE TABLE AS , но рекомендуется использовать CREATE TABLE AS , так как SELECT INTO не поддерживается в ECPG и PL/pgSQL , вследствие того, что они воспринимают предложение INTO по-своему. К тому же, CREATE TABLE AS предоставляет больший набор возможностей, чем SELECT INTO .
Чтобы добавить столбец OID в таблицу, создаваемую командой SELECT INTO , необходимо установить конфигурационную переменную default_with_oids. С другой стороны, можно использовать CREATE TABLE AS с предложением WITH OIDS .
Примеры
Создание таблицы films_recent , содержащей только последние записи из таблицы films :
SELECT * INTO films_recent FROM films WHERE date_prod >= '2002-01-01';
Совместимость
В стандарте SQL команда SELECT INTO применяется для передачи скалярных значений клиентской программе, но не для создания новой таблицы. Именно это применение имеет место в ECPG (см. Главу 34) и в PL/pgSQL (см. Главу 41). В PostgreSQL команда SELECT INTO связана с созданием таблицы по историческим причинам. В новом коде для этих целей лучше использовать CREATE TABLE AS .
См. также
Пред. | Наверх | След. |
SELECT | Начало | SET |
SQL INSERT INTO
Команда INSERT добавляет строки в таблицу или представление основной таблицы.
Синтаксис команды Sql INSERT INTO
Основные ключевые слова и параметры команды INSERT
- schema — идентификатор полномочий, обычно совпадающий с именем некоторого пользователя
- table view — имя таблицы, в которую строки должны быть вставлены; если указано представление, то строки вставляются в основную таблицу представления
- subquery_1 — подзапрос, который сервер обрабатывает тем же самым способом как представление
- column — столбец таблицы или представления, в который для каждой вставленной строки вводится значение из фразы VALUES или подзапроса; если один из столбцов таблицы опускается из этого списка, значением столбца для вставленной строки является значение по умолчанию столбца, определенное при создании таблицы. Если полностью опускается список столбца, предложение VALUES или запрос должен определить значения для всех столбцов в таблице
- VALUES — определяет строку значений, которые будут вставлены в таблицу или представление; значение должно быть определено в предложении VALUES для каждого столбца в списке столбцов
- subquery_2 — подзапрос, который возвращает строки, вставляемые в таблицу; выборочный список этого подзапроса должен иметь такое же количество столбцов, как в списке столбцов утверждения INSERT
Утверждение INSERT с фразой VALUES добавляет одиночную строку к таблице. Эта строка содержит значения, определенные фразой VALUES. Утверждение INSERT с подзапросом вместо фразы VALUES добавляет к таблице все строки, возвращенные подзапросом. Сервер обрабатывает подзапрос и вставляет каждую возвращенную строку в таблицу. Если подзапрос не выбирает никакие строки, сервер не вставляет никакие строки в таблицу.
Подзапрос может обратиться к любой таблице или представлению, включая целевую таблицу утверждения INSERT. Сервер назначает значения полям в новых строках, основанных на внутренней позиции столбцов в таблице и порядке значений фразы VALUES или в списке выбора запроса. Если какие-либо столбцы пропущены в списке столбцов, сервер назначает им значения по умолчанию, определенные при создании таблицы.
Если любой из этих столбцов имеет NOT NULL ограничение то сервер возвращает ошибку, указывающую, что ограничение было нарушено и отменяет утверждение INSERT. При выдаче утверждения INSERT включается любой INSERT — триггер, определенный на таблице.
INSERT INTO
INSERT INTO. Пример 1
INSERT INTO dept VALUES (50, «ПРОДУКЦИЯ», «САН-ФРАНЦИСКО»);
INSERT INTO Customers (city, cname, cnum) VALUES (‘London’, ‘Hoffman’, 2001);
INSERT INTO. Пример 2
Нижеприведенная команда копирует данные сотрудников фирмы, комиссионные которых превышают 25% от дохода в таблицу bonus:
INSERT INTO bonus SELECT ename, job, sal, comm FROM emp WHERE comm > 0.25 * sal;
INSERT INTO. Пример 3
Если нужно вставить NULL-значение, необходимо указать его как обычное значение следующим образом:
INSERT INTO Salespeople VALUES (1001,’Peel’,NULL,12);
INSERT INTO. Пример 4
Команду INSERT можно применить для того, чтобы извлечь значения из одной таблицы и разместить их в другой, воспользовавшись для этого запросом. Для этого достаточно заменить предложение VALUES на соответствующий запрос:
INSERT INTO Londonstaff SELECT * FROM Salespeople WHERE city = ‘London’;
MySQL INSERT
Для вставки новых строк в базу данных MySQL используется команда INSERT, примеры команды INSERT приведены ниже:
MySQL INSERT INTO. Пример 1
Вставка новой строки в таблицу table_name.
INSERT INTO table_name VALUES (‘1’, ‘165’, ‘0’, ‘name’);
MySQL INSERT INTO. Пример 2
Вставка новой строки в таблицу table_name с указанием вставки данных в нужные нам колонки.
INSERT INTO table_name VALUES (‘1’, ‘165’, ‘0’, ‘name’);
В базе данных MySQL имеется возможность вставлять множество новых строк, используя одну команду INSERT.
MySQL INSERT INTO Пример 3
Вставка несколько строк в таблицу table_name.
INSERT INTO table_name (tbl_id, chislo, chislotwo, name) VALUES (‘1’, ‘159’, ’34’, ‘name1’), (‘2′, ’14’, ’61’, ‘name2’), (‘3’, ‘356’, ‘8’, ‘name3’);
SQL-Ex blog
Мы можем использовать SELECT. INTO в SQL Server для создания новой таблицы из табличного источника данных. SQL Server использует атрибуты выражений в списке SELECT для определения структуры новой таблицы.
До версии SQL Server 2005 использование SELECT. INTO в рабочем коде считалось плохим стилем (code smell), влияющим на производительность, поскольку при этом запрашивались блокировки схемы, накладываемые на системные таблицы. В результате SQL Server оказывался недоступным в течение выполнения этого запроса, поскольку DDL-оператор включается в неявную транзакцию, которая может занимать продолжительное время пока данные вставляются в рамках того же оператора. Однако это поведение пофиксили в SQL Server 2005, когда изменилась модель блокировок.
Оператор SELECT. INTO стал популярным, поскольку это был более быстрый способ вставки данных по сравнению с использованием INSERT INTO . SELECT. Это было обусловлено, главным образом, тем, что операция SELECT. INTO использовала, где это возможно, режим неполного протоколирования (bulk-logged). Хотя INSERT INTO теперь тоже может использовать этот режим, вы все еще можете увидеть лучшую производительность в SQL Server 2012 и 2014, поскольку SELECT. INTO может быть распараллелен в этих версиях, тогда как параллельное выполнение INSERT INTO появилось только в версии SQL Server 2016. Однако при SELECT. INTO вы по-прежнему должны определять все необходимые индексы, ограничения и т.д. на новой таблице.
Как правило, SELECT. INTO остается полезным инструментом для разработки, но теперь он не имеет очевидных преимуществ в производительности, и имеет сомнительное значение для рабочих баз данных. Этот оператор не является частью стандарта SQL. Обычно легче работать с таблицами, созданными оператором CREATE TABLE, поскольку при этом вы получаете преимущество в предварительном задании ограничений и типов данных, что дополнительно уменьшает вероятность несогласованности данных.
Рекомендуется избегать использования SELECT. INTO в рабочем коде.
Создание таблиц с помощью оператора SELECT INTO
Назначением SELECT. INTO в SQL Server было сохранение табличного источника в рамках процесса. Вот простой пример:
При этом табличным источником может быть не только обычная таблица, а также пользовательская функция, OpenQuery, OpenDataSource, предложение OPENXML, производная таблица, соединяемая таблица, пивот-таблица, удаленный источник данных, табличная переменная или переменная функция. С этими более экзотичными табличными источниками синтаксис SELECT. INTO становится более полезным.
Является ли SELECT INTO частью стандарта ANSI?
ANSI стандарт поддерживает конструкцию SELECT. INTO во встроенном SQL; она называется единичным select и загружает то, что возвращает единственная строка, в переменные базового языка.
Люди часто используют SELECT. INTO ошибочно полагая, что это быстрый способ сделать копию таблицы, а потому удивляются, что никакие индексы, ограничения, вычисляемые столбцы или триггеры, определенные для исходной таблицы, не были перенесены в новую. Они не могут быть специфицированы в операторе SELECT. INTO в принципе. Это также относится к допустимости NULL значений или сохранению вычисляемых столбцов. Все эти задачи должны выполняться уже после того, как созданная таблица будет заполнена данными, что неизбежно занимает время.
Хотя вы можете использовать функцию IDENTITY (тип данных, начальное значение, шаг) для установки поля счетчика и, когда источником является одна таблица, получить столбец в результирующей таблицы со свойством identity. Вероятно, этот факт и приводит разработчиков к мысли, что переносятся и другие атрибуты столбцов.
Помимо этого, данный оператор не может создавать секционированные (фрагментированные) таблицы, разреженные столбцы или другие атрибуты, наследуемые из исходной таблицы. Как это могло бы быть сделано, если табличный источник представляет собой запрос с множеством соединений или полученный из экзотических внешних источников данных?
Начиная с SQL 2012 SP1 CU10, SELECT. INTO может выполняться параллельно. Однако, начиная с SQL Server 2016, допускается параллельное выполнение обычного оператора INSERT INTO…SELECT с определенными ограничениями. Поэтому некоторое преимущество в производительности при использовании SELECT. INTO становится весьма призрачным. Процесс INSERT INTO также может быть ускорен, если он может использовать режим неполного протоколирования, а не режим полного восстановления (fully-recovered), вставкой пустой таблицы или таблицы без кластеризованного индекса, и установкой хинта TABLOCK для таблицы.
- Свойство INDENTITY для столбца переносится, но если не:
Оператор SELECT содержит соединенные таблицы (при использовании JOIN или UNION), предложения GROUP BY или агрегатные функции. Если вы хотите избежать переноса свойства IDENTITY в новую таблицу, но хотите сохранить значения в столбце, можно добавить заведомо ложное условие соединения или UNION, который не добавит строк.
Столбец IDENTITY указывается в списке SELECT более одного раза.
Столбец IDENTITY входит в выражение.
Столбец IDENTITY берется из удаленного источника данных.
- Вы не SELECT. INTO в табличнозначный параметр или табличную переменную, хотя можете использовать их в предложении FROM.
- Даже если исходная таблица является секционированной, новая таблица создается в файловой группе по умолчанию. Однако в SQL Server 2017 возможно указать файловую группу, в которой создается новая таблица с помощью предложения ON.
- Вы можете задать предложение ORDER BY, но оно будет игнорироваться. Поэтому порядок IDENTITY_INSERT не гарантируется.
- Когда вычисляемый столбец включается в список SELECT, соответствующий столбец в новой таблице не является вычисляемым столбцом. Значения в новом столбце являются результатом вычисления при выполнении оператора SELECT. INTO.
- Как и в случае CREATE TABLE, если оператор SELECT. INTO содержится в явной транзакции, на соответствующие строки в задействованных системных таблицах накладывается блокировка без взаимного доступа, пока транзакция не завершится. В процессе выполнения транзакции другие процессы, которые используют эти системные таблицы, будут находиться в состоянии ожидания.
Заключение
Подводя итоги, можно сказать, что SELECT. INTO является хорошим способом создания табличного источника, временно сохраняемого как часть процесса, если вам не приходится
беспокоиться об ограничениях, индексах и специальных столбцах. Это не лучший способ копирования таблицы, поскольку только основные элементы схемы могут быть скопированы. За прошедшие годы возникали факторы, которые увеличивали или принижали привлекательность SELECT. INTO, но в целом следует избегать их применения где попало. Лучше создавать таблицу явно со всеми её характеристиками, чтобы гарантировать согласованность данных.
Обратные ссылки
Нет обратных ссылок
Комментарии
Показывать комментарии Как список | Древовидной структурой
Автор не разрешил комментировать эту запись