Vložte syntaxi SQL. Příkaz SQL INSERT INTO SELECT. SQL INSERT DO SELECT, příklady

Tento příkaz přidá jeden nebo více záznamů do tabulky (provede připojovací dotaz).

Syntax

Žádost o přidání více záznamů:

VLOŽ DO konečný_objekt [(pole1[, pole2[, ...]])]
VYBERTE [ zdroj.]pole1[, pole2[, ...]
Z tabulkový_výraz

Žádost o přidání jednoho záznamu:

VLOŽ DO konečný_objekt [(pole1[, pole2[, ...]])]
HODNOTY ( pole1[, pole2[, ...])

Příkaz INSERT INTO se skládá z následujících prvků:

Část

Popis

konečný_objekt

Název tabulky nebo dotazu, kam se přidávají záznamy.

pole1, pole2

Po hádce konečný_objekt- názvy polí, do kterých se přidávají data; po hádce zdroj- názvy polí, ze kterých jsou data extrahována.

externí_databáze

Cesta k externí databázi. Popis cesty naleznete v článku o klauzuli IN.

zdroj

Název tabulky nebo dotazu, ze kterého se kopírují záznamy.

tabulkový_výraz

Jeden nebo více názvů tabulek, ze kterých chcete načíst záznamy. Tento argument může být název jednotlivé tabulky, výsledný výraz vytvořený pomocí INNER JOIN, LEFT JOIN nebo RIGHT JOIN nebo uložený dotaz.

hodnota1, hodnota2

Hodnoty, které budou přidány do konkrétních polí nového záznamu. Každá hodnota se vloží do pole odpovídající její pozici v seznamu: hodnota1 přidáno k pole1 nový záznam, hodnota2- V pole2 atd. Hodnoty musíte oddělit čárkou a textová pole uzavřít do uvozovek (" ").

Poznámky

Příkaz INSERT INTO může přidat jeden záznam do tabulky pomocí výše uvedené syntaxe. V tomto případě zadáte názvy a hodnoty pro každé pole v záznamu. Musíte zadat všechna pole v záznamu, ke kterým jsou přiřazeny hodnoty, a odpovídající hodnoty. Pokud nezadáte hodnotu pole, bude jí přiřazena výchozí hodnota nebo NULL. Záznamy se přidávají na konec tabulky.

Příkaz INSERT INTO lze také použít k přidání sady záznamů z jiné tabulky nebo dotazu pomocí klauzule SELECT... FROM, jak je uvedeno výše (viz Syntaxe dotazu pro přidávání více záznamů). V tomto případě klauzule SELECT určuje pole, která se mají přidat k zadanému konečný_objekt.

Zdroj nebo konečný_objekt může být tabulka nebo dotaz. Když je zadán dotaz, databázový stroj Microsoft Access přidá záznamy do všech tabulek, které vrátí.

Použití příkazu INSERT INTO je volitelné. Pokud je zadán, musí předcházet příkazu SELECT.

Pokud cílová tabulka obsahuje primární klíč, zajistěte, aby hodnoty, které přidáte do jednoho nebo více polí primárního klíče, byly jedinečné a odlišné od NULA; jinak nebudou položky přidány.

Pokud jsou záznamy přidány do tabulky s polem Čítač a chcete je přečíslovat, nezahrnujte pole Čítač do dotazu. Pokud chcete zachovat původní hodnoty z pole, zahrňte do dotazu pole Počítadlo.

Záznamy můžete přidat do tabulky v jiné databázi pomocí klauzule IN.

Chcete-li vytvořit tabulku, použijte příkaz SELECT... INTO k vytvoření tabulky.

Před spuštěním dotazu pro přidání použijte výběrový dotaz se stejnými kritérii výběru, abyste pomocí výsledků určili, které záznamy budou přidány.

Připojovací dotaz zkopíruje záznamy z jedné nebo více tabulek do jiné tabulky. V tomto případě zůstanou tabulky obsahující přidané záznamy nezměněny.

Místo přidávání záznamů z jiné tabulky můžete nastavit hodnotu každého pole v samostatném novém záznamu pomocí klauzule VALUES. Pokud je seznam polí vynechán, musí klauzule VALUES obsahovat odpovídající hodnoty pro každé pole tabulky; jinak se operace INSERT nezdaří. Pro každý další záznam, který chcete vytvořit, použijte příkaz INSERT INTO spolu s klauzulí VALUES.

Kromě výše popsaného příkazu SELECT obsahuje jazyk DML (Data Manipulation Language) tři další příkazy: INSERT, UPDATE a DELETE. Stejně jako příkaz SELECT fungují tyto tři příkazy buď s tabulkami, nebo s pohledy. Tento článek popisuje příkaz INSERT a další dva příkazy jsou popsány v dalším článku.

příkaz INSERT vloží řádky (nebo části řádků) do tabulky. Existují dvě různé formy tohoto pokynu:

INSERT název_tabulky [(sloupec_seznam)] VÝCHOZÍ HODNOTY | HODNOTY (( DEFAULT | NULL | výraz ) [ ,...n]) INSERT INTO název_tabulky | jméno_zobrazení [(seznam_sloupec)] (výpis_výběr | příkaz_provedení) Konvence syntaxe

První forma instrukce umožňuje vložit do tabulky jeden řádek (nebo jeho část). A druhá forma příkazu INSERT umožňuje vložit do tabulky sadu výsledků příkazu SELECT nebo uloženou proceduru provedenou příkazem EXECUTE. Uložená procedura musí vrátit data, která mají být vložena do tabulky. Při použití s ​​příkazem INSERT může příkaz SELECT vybrat hodnoty z jiné nebo stejné tabulky, do které se data vkládají, pokud jsou datové typy odpovídajících sloupců kompatibilní.

U obou formulářů musí být datový typ každé vložené hodnoty kompatibilní s datovým typem odpovídajícího sloupce tabulky. Všechny řetězce a dočasná data musí být uzavřena v uvozovkách; Číselné hodnoty není nutné uzavírat do uvozovek.

Vložení jednoho řádku

U obou forem příkazu INSERT je explicitní uvedení seznamu sloupců volitelné. Neuvedení sloupců je stejné jako zadání všech sloupců v tabulce.

parametr DEFAULT VALUES vloží výchozí hodnoty pro všechny sloupce. Sloupce s datovým typem TIMESTAMP nebo vlastností IDENTITY jsou standardně vloženy s hodnotami, které jsou automaticky generovány systémem. Pro sloupce jiných datových typů se vloží odpovídající výchozí hodnota, která není null, pokud je k dispozici, nebo v opačném případě NULL. Pokud sloupec nepovoluje hodnoty null a nemá definovanou výchozí hodnotu, příkaz INSERT selže a zobrazí se zpráva.

Níže uvedený příklad vkládá řádky do tabulky Zaměstnanec v databázi SampleDb, což ukazuje použití příkazu INSERT k vložení malého množství dat do databáze:

POUŽÍVEJTE SampleDb; INSERT INTO Employee VALUES (34990, "Andrey", "Batonov", "d1"); INSERT INTO Employee VALUES (38640, "Alexey", "Vasin", "d3");

Existují dva různé způsoby, jak vložit hodnoty do nového řádku. Příkaz INSERT v níže uvedeném příkladu explicitně používá klíčové slovo NULL a vkládá hodnotu NULL do odpovídajícího sloupce:

POUŽÍVEJTE SampleDb; INSERT INTO Employee VALUES (34991, "Andrey", "Batonov", NULL);

Chcete-li vložit hodnoty do některých (ale ne všech) sloupců tabulky, musíte tyto sloupce obvykle explicitně určit. Nespecifikované sloupce musí povolovat hodnoty NULL nebo mít definovanou výchozí hodnotu.

POUŽÍVEJTE SampleDb; INSERT INTO Employee(Id, First Name, LastName) VALUES (34992, "Andrey", "Batonov");

Předchozí dva příklady jsou ekvivalentní. V tabulce Employee je jediným sloupcem, který umožňuje hodnoty NULL, sloupec DepartmentNumber a všechny ostatní sloupce byly zakázány klauzuli NOT NULL v příkazu CREATE TABLE.

Pořadí hodnot v Nabídka VALUES Příkazy INSERT se mohou lišit od pořadí určeného v příkazu CREATE TABLE. V tomto případě se jejich pořadí musí shodovat s pořadím, ve kterém jsou odpovídající sloupce uvedeny v seznamu sloupců. Níže je uveden příklad vkládání dat v jiném pořadí, než bylo původní:

POUŽÍVEJTE SampleDb; INSERT INTO Employee(DepartamentNumber, LastName, Id, First Name) VALUES ("d1", "Batonov", 34993, "Andrey");

Vkládání více řádků

Druhá forma příkazu INSERT vloží do tabulky jeden nebo více řádků vybraných poddotazem. Níže uvedený příklad ukazuje, jak vložit řádky do tabulky pomocí druhého formuláře příkazu INSERT. V tomto případě se provede dotaz na výběr čísel a jmen oddělení umístěných v Moskvě a výsledná sada výsledků se načte do nové tabulky vytvořené dříve.

Nová tabulka MoscowDepartment vytvořená ve výše uvedeném příkladu má stejné sloupce jako existující tabulka Department, s výjimkou chybějícího sloupce Location. Poddotaz v příkazu INSERT vybere všechny řádky v tabulce oddělení, pro které je hodnota sloupce Umístění "Moskva", které se pak vloží do nové tabulky vytvořené na začátku dotazu.

Níže uvedený příklad ukazuje další způsob, jak vložit řádky do tabulky pomocí druhého formuláře příkazu INSERT. V tomto případě se provede dotaz na výběr personálních čísel, čísel projektů a data zahájení projektu pro všechny zaměstnance na pozici „Manažer“, kteří pracují na projektu p2, a poté načte výslednou sadu výsledků do nové tabulky vytvořené na začátku roku dotaz:

POUŽÍVEJTE SampleDb; CREATE TABLE ManagerTeam (EmpId INT NOT NULL, ProjectNumber CHAR (4) NOT NULL, EnterDate DATE); INSERT INTO ManagerTeam (EmpId, ProjectNumber, EnterDate) SELECT EmpId, ProjectNumber, EnterDate FROM Works_on WHERE Job = "Manager";

Před vložením řádků pomocí příkazu INSERT byly tabulky MoscowDepartment a ManagerTeam (ve výše uvedených příkladech) prázdné. Pokud by tabulka již existovala a obsahovala řádky s daty, byly by do ní přidány nové řádky.

Příkazy SQL INSERT INTO a INSERT SELECT se používají k vložení nových řádků do tabulky. Pokyny lze použít dvěma způsoby:

  1. Pouze hodnoty: První metoda zahrnuje zadání pouze datových hodnot, které mají být vloženy bez názvů sloupců.

Syntax:

INSERT INTO název_tabulky VALUES (hodnota1, hodnota2, hodnota3,...); název_tabulky: název tabulky. hodnota1, hodnota2,.. : hodnoty prvního sloupce, druhého sloupce,... pro nový záznam

  1. Názvy a hodnoty sloupců: Druhá metoda určuje názvy sloupců a hodnoty řádků, které se mají vložit:

Syntax:

INSERT INTO název_tabulky (sloupec1, sloupec2, sloupec3,..) VALUES (hodnota1, hodnota2, hodnota3,...); název_tabulky: název tabulky. sloupec1: název prvního sloupce, druhý sloupec... hodnota1, hodnota2,.. : hodnoty prvního sloupce, druhého sloupce,... pro nový záznam

požadavky:

Metoda 1 ( vkládání pouze hodnot):

INSERT INTO Student VALUES ("5","HARSH","WEST BENGAL","8759770477","19");

Výsledek :

Po použití INSERT INTO SELECT bude tabulka Student nyní vypadat takto:

ROLL_NO NÁZEV ADRESA TELEFON Stáří
1 RAM Dillí 9455123451 18
2 RAMESH GURGAON 9562431543 18
3 SUJIT ROHTAK 9156253131 20
4 SURESH Dillí 9156768971 18
3 SUJIT ROHTAK 9156253131 20
2 RAMESH GURGAON 9562431543 18
5 DRSNÝ ZÁPADNÍ BENGÁLSKO 8759770477 19

Metoda 2 ( vkládání hodnot pouze do určených sloupců):

INSERT INTO Student (ROLL_NO, NAME, Age) VALUES ("5","PRATIK","19");

Výsledek :

Tabulka Student nyní bude vypadat takto:

ROLL_NO NÁZEV ADRESA TELEFON Stáří
1 RAM Dillí 9455123451 18
2 RAMESH GURGAON 9562431543 18
3 SUJIT ROHTAK 9156253131 20
4 SURESH Dillí 9156768971 18
3 SUJIT ROHTAK 9156253131 20
2 RAMESH GURGAON 9562431543 18
5 PRATIK nula nula 19

Všimněte si, že sloupce, pro které nejsou zadány žádné hodnoty, jsou nastaveny na hodnotu null .

Použití SELECT v příkazu INSERT INTO

Pomocí příkazu INSERT SELECT MySQL můžete zkopírovat řádky z jedné tabulky a vložit je do jiné.

Použití tohoto příkazu je podobné jako použití INSERT INTO. Rozdíl je v tom, že příkaz SELECT slouží k výběru dat z jiné tabulky. Níže jsou uvedeny různé způsoby použití INSERT INTO SELECT:

  • Vložte všechny sloupce tabulky: Můžete zkopírovat všechna data v tabulce a vložit je do jiné tabulky.

Syntax:

INSERT INTO první_tabulka SELECT * FROM druhá_tabulka; first_table: název první tabulky. druhá_tabulka: název druhé tabulky.

Pro zkopírování dat z jedné tabulky jsme použili příkaz SELECT a pro vložení do jiné příkaz INSERT INTO.

  • Vkládání jednotlivých sloupců tabulky. Můžete zkopírovat pouze ty sloupce tabulky, které chcete vložit do jiné tabulky.

Syntax:

INSERT INTO první_tabulka(názvy_sloupců1) SELECT názvy_sloupců2 FROM druhá_tabulka; first_table: název první tabulky. druhá_tabulka: název druhé tabulky. názvy_sloupců1: názvy sloupců oddělené čárkou pro tabulku 1. názvy_sloupců2: názvy sloupců oddělené čárkou(,) pro tabulku 2.

Pro zkopírování dat pouze z vybraných sloupců druhé tabulky jsme použili příkaz SELECT a pro vložení do první tabulky příkaz MySQL INSERT INTO SELECT.

  • Kopírování konkrétních řádků z tabulky. Konkrétní řádky z tabulky můžete zkopírovat a později je vložit do jiné tabulky pomocí klauzule WHERE s klauzulí SELECT. V tomto případě musíte použít příslušnou podmínku v WHERE.

Syntax:

Tabulka 2: LateralStudent

ROLL_NO NÁZEV ADRESA TELEFON Stáří
7 SOUVIK DUMDUM 9876543210 18
8 NIRAJ NOIDA 9786543210 19
9 NĚKTERÝ ROHTAK 9687543210 20

požadavky:

Metoda 1 ( vložte všechny řádky a sloupce):

INSERT INTO Student SELECT * FROM LateralStudent;

Výsledek :

Tento dotaz vloží všechna data z tabulky LateralStudent do tabulky Student. Po použití SQL INSERT INTO SELECT bude tabulka Student vypadat takto:

ROLL_NO NÁZEV ADRESA TELEFON Stáří
1 RAM Dillí 9455123451 18
2 RAMESH GURGAON 9562431543 18
3 SUJIT ROHTAK 9156253131 20
4 SURESH Dillí 9156768971 18
3 SUJIT ROHTAK 9156253131 20
2 RAMESH GURGAON 9562431543 18
7 SOUVIK DUMDUM 9876543210 18
8 NIRAJ NOIDA 9786543210 19
9 NĚKTERÝ ROHTAK 9687543210 20

Metoda 2 ( vkládání jednotlivých sloupců):

INSERT INTO Student(ROLL_NO,NAME,Věk) SELECT ROLL_NO, NAME, Age FROM LateralStudent;

Výsledek :

Tento dotaz vloží data ze sloupců ROLL_NO, NAME a Age tabulky LateralStudent do tabulky Student. Zbývající sloupce tabulky Student budou nastaveny na hodnotu null . Po použití SQL INSERT SELECT bude tabulka vypadat takto:

ROLL_NO NÁZEV ADRESA TELEFON Stáří
1 RAM Dillí 9455123451 18
2 RAMESH GURGAON 9562431543 18
3 SUJIT ROHTAK 9156253131 20
4 SURESH Dillí 9156768971 18
3 SUJIT ROHTAK 9156253131 20
2 RAMESH GURGAON 9562431543 18
7 SOUVIK Nula nula 18
8 NIRAJ Nula nula 19
9 NĚKTERÝ Nula nula 20
  • Výběr konkrétních řádků k vložení:

Výsledek :

Tento dotaz vybere pouze první řádek z tabulky LateralStudent pro vložení do tabulky Student. Po použití INSERT SELECT bude tabulka vypadat takto.

Příkaz INSERT vloží do tabulky nové záznamy. V tomto případě mohou být hodnoty sloupců doslovné konstanty nebo mohou být výsledkem provedení dílčího dotazu. V prvním případě se pro vložení každého řádku používá samostatný příkaz INSERT; ve druhém případě bude vložen tolik řádků, kolik jich vrátí poddotaz.

Syntaxe operátoru je následující:

    VLOŽ DO [ (,...) ]

    (HODNOTY(,…))

  1. | (VÝCHOZÍ HODNOTY)

Jak můžete vidět z prezentované syntaxe, seznam sloupců je volitelný (toto naznačují hranaté závorky v popisu syntaxe). Pokud chybí, seznam vložených hodnot musí být úplný, to znamená poskytnout hodnoty pro všechny sloupce tabulky. V tomto případě musí pořadí hodnot odpovídat pořadí určenému příkazem CREATE TABLE pro tabulku, do které jsou řádky vloženy. Kromě toho musí být tyto hodnoty stejného datového typu jako sloupce, do kterých jsou zadány. Jako příklad zvažte vložení řádku do tabulky Produkt vytvořené následujícím příkazem CREATE TABLE:

    CREATE TABLE produkt

    maker char (1) NOT NULL,

    model varchar(4) NOT NULL,

    zadejte varchar(7) NOT NULL

Předpokládejme, že chcete do této tabulky přidat PC model 1157 od výrobce B. To lze provést následujícím prohlášením:

    VLOŽTE DO produktu

    HODNOTY ("B" , 1157 , "PC" ) ;

Pokud zadáte seznam sloupců, můžete změnit jejich „přirozené“ pořadí:

    INSERT INTO Product (typ, model, výrobce)

    HODNOTY ("PC" , 1157 , "B" ) ;

Zdálo by se, že jde o zcela zbytečnou vlastnost, která design jen ztěžuje. Vyhraje však, pokud mají sloupce výchozí hodnoty. Zvažte následující strukturu tabulky:

    CREATE TABLE product_D

    maker char (1) NULL,

    model varchar(4) NULL,

    typ varchar (7) NOT NULL DEFAULT "PC"

Všimněte si, že zde mají hodnoty všech sloupců výchozí hodnoty (první dva jsou NULL a poslední sloupec je typ - PC). Nyní bychom mohli napsat:

    INSERT INTO Product_D (model, výrobce)

    VALUES(1157; "B");

V tomto případě bude chybějící hodnota při vkládání řádku nahrazena výchozí hodnotou - PC. Všimněte si, že pokud sloupci není v příkazu CREATE TABLE zadána výchozí hodnota a je zadáno omezení NOT NULL, které zakazuje použití hodnoty NULL v tomto sloupci tabulky, předpokládá se výchozí hodnota NULL.

Nabízí se otázka: je možné nespecifikovat seznam sloupců a přesto použít výchozí hodnoty? Odpověď je ano. Chcete-li to provést, místo explicitního zadání hodnoty použijte vyhrazené slovo DEFAULT :

    INSERT INTO Product_D

    HODNOTY ("B" , 1158 , VÝCHOZÍ ) ;

Protože všechny sloupce mají výchozí hodnoty, pro vložení řádku s výchozími hodnotami můžete napsat:

    INSERT INTO Product_D

    HODNOTY(VÝCHOZÍ, VÝCHOZÍ, VÝCHOZÍ);

Pro tento případ však existuje speciální konstrukce DEFAULT VALUES (viz syntaxe operátoru), pomocí které lze výše uvedený operátor přepsat do tvaru

    INSERT INTO Product_D DEFAULT VALUES ;

Všimněte si, že při vkládání řádku do tabulky jsou zaškrtnuta všechna omezení uvalená na tuto tabulku. Mohou to být omezení primárního klíče nebo jedinečného indexu, omezení CHECK nebo omezení referenční integrity. Pokud dojde k porušení jakéhokoli omezení, vložení řádku bude odmítnuto. Podívejme se nyní na případ použití poddotazu. Předpokládejme, že potřebujeme vložit do tabulky Product_D všechny řádky z tabulky Product týkající se modelů osobních počítačů (typ = 'PC'). Vzhledem k tomu, že hodnoty, které potřebujeme, jsou již v nějaké tabulce, ruční generování vložených řádků je za prvé neefektivní a za druhé může způsobit chyby ve vstupu. Použití poddotazu řeší tyto problémy:

Použití symbolu „*“ v poddotazu je v tomto případě oprávněné, protože pořadí sloupců je pro obě tabulky stejné. Pokud by tomu tak nebylo, musel by být použit seznam sloupců buď v příkazu INSERT, v poddotazu nebo v obou, což by odpovídalo pořadí sloupců:

Zde, stejně jako dříve, můžete zadat ne všechny sloupce, pokud chcete použít stávající výchozí hodnoty, například:

V tomto případě bude sloupec typu tabulky Product_D nahrazen výchozí hodnotou PC pro všechny vložené řádky.

Všimněte si, že při použití poddotazu obsahujícího predikát budou vloženy pouze ty řádky, pro které je hodnota predikátu PRAVDA (nikoli UNKNOWN!). Jinými slovy, pokud by sloupec typu v tabulce Produkt mohl mít hodnotu NULL a tato hodnota byla přítomna v několika řádcích, pak by tyto řádky nebyly vloženy do tabulky Product_D.

Umělá technika použití poddotazu, který tvoří řádek s klauzulí UNION ALL, umožňuje překonat omezení vkládání jednoho řádku do příkazu INSERT při použití konstruktoru řádku v klauzuli VALUES. Pokud tedy potřebujeme vložit několik řádků pomocí jednoho příkazu INSERT, můžeme napsat:

    INSERT INTO Product_D

    SELECT "B" výrobce AS, model 1158 AS, typ "PC" AS

    UNION VŠECHNY

    SELECT "C", 2190, "Laptop"

    UNION VŠECHNY

    SELECT "D" , 3219 , "Tiskárna" ;

Použití UNION ALL je vhodnější než UNION, i když je zaručena absence duplicitních řádků, protože v tomto případě nebude provedena žádná kontrola k odstranění duplicit.

Je třeba poznamenat, že vkládání více n-tic pomocí konstruktoru řádků je již implementováno v Systém správy relačních databází (DBMS), vyvinutý společností Microsoft Corporation.Structured Query Language) je univerzální počítačový jazyk používaný k vytváření, úpravě a manipulaci s daty v relačních databázích. SQL Server 2008. Vzhledem k této možnosti lze poslední dotaz přepsat jako:

    INSERT INTO Product_D VALUES

    ("B", 1158, "PC"),

    ("C", 2190, "Laptop"),