SQL INSERT INTO SELECT izraz. Transact-SQL - umetanje podataka Dodavanje dijela redova

Koristeći SQL, možete kopirati informacije iz jedne tablice u drugu.

Naredba INSERT INTO SELECT kopira podatke iz jedne tablice i umeće ih u postojeću tablicu.

SQL INSERT INTO SELECT izraz,

INSERT INTO SELECT izraz bira podatke iz jedne tabele i umeće ih u postojeću tabelu. Svi postojeći redovi u ciljnoj tablici se ne mijenjaju.

SQL INSERT INTO SELECT, Sintaksa

Možemo kopirati sve kolone iz jedne tabele u drugu, postojeću tabelu:

INSERT INTO tabela 2
SELECT * FROM table1;

Ili možemo kopirati samo kolone koje želimo u drugu, postojeću tablicu:

INSERT INTO tabela 2
(naziv_stupca)
SELECT naziv(i) kolone
OD table1;

Demo verzija baze podataka

U ovom vodiču ćemo koristiti dobro poznatu bazu podataka Northwind.

Ispod je izbor iz tabele "Kupci":

Korisnički brojIme klijentaOsoba za kontaktAdresagradPoštanski brojZemlja
1 Alfreds Futterkiste Maria Anders Obere Str. 57 Berlin 12209 Njemačka
2 Ana Trujillo Emparedados y helados Ana Trujillo Avda. de la Constitucion 2222 Meksiko D.F. 05021 Meksiko
3 Antonio Moreno Taqueria Antonio Moreno Mataderos 2312 Meksiko D.F. 05023 Meksiko

I izbor iz tabele "Dobavljači":

SQL INSERT INTO SELECT, Primjeri

Kopiranje samo nekoliko kolona iz "Dobavljači" u "Kupci":

Kopiranje samo njemačkih dobavljača na "Kupce".

Posljednje ažuriranje: 13.07.2017

Za dodavanje podataka koristite naredbu INSERT, koja ima sljedeću formalnu sintaksu:

INSERT table_name [(column_list)] VRIJEDNOSTI (vrijednost1, vrijednost2, ... vrijednostN)

Prvo dolazi izraz INSERT INTO, zatim u zagradama možete navesti listu kolona odvojenih zarezima u koje treba dodati podatke, a na kraju, nakon riječi VRIJEDNOSTI, vrijednosti koje treba dodati za stupce su navedene u zagrade.

Na primjer, pretpostavimo da je sljedeća baza podataka prethodno kreirana:

CREATE DATABASE productsdb; IDI KORISTI productsdb; CREATE TABLE Proizvodi (Id INT IDENTITET PRIMARY KEY, ProductName NVARCHAR(30) NOT NULL, Proizvođač NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Price MONEY NOT NULL)

Dodajmo mu jedan red pomoću naredbe INSERT:

UMETNI VRIJEDNOSTI proizvoda ("iPhone 7", "Apple", 5, 52000)

Nakon uspješnog izvršenja u SQL Server Management Studiju, u polju poruke bi se trebala pojaviti poruka "1 red(ovi) pogođeni":

Vrijedi uzeti u obzir da se vrijednosti za stupce u zagradama nakon ključne riječi VALUES prosljeđuju redoslijedom kojim su deklarirane. Na primjer, u naredbi CREATE TABLE iznad, možete vidjeti da je prvi stupac Id. Ali pošto je za njega specificiran atribut IDENTITY, vrijednost ove kolone se automatski generira i može se izostaviti. Druga kolona predstavlja Naziv proizvoda, tako da će prva vrijednost, string "iPhone 7", biti proslijeđena toj koloni. Druga vrijednost - string "Apple" će biti proslijeđena trećoj koloni Manufacturer i tako dalje. Odnosno, vrijednosti se prosljeđuju u stupce na sljedeći način:

    Naziv proizvoda: "iPhone 7"

    Proizvođač: "Apple"

Također, prilikom unosa vrijednosti, možete odrediti neposredne stupce u koje će vrijednosti biti dodane:

UMETNI U proizvode (naziv proizvoda, cijena, proizvođač) VRIJEDNOSTI ("iPhone 6S", 41000, "Apple")

Ovdje je vrijednost specificirana za samo tri kolone. Štaviše, sada se vrijednosti prenose redoslijedom stupaca:

    Naziv proizvoda: "iPhone 6S"

    Proizvođač: "Apple"

Za nespecificirane stupce (u ovom slučaju ProductCount), zadana vrijednost će biti dodana ako je specificiran atribut DEFAULT ili NULL vrijednost. Međutim, nespecificirani stupci moraju biti nullable ili imati DEFAULT atribut.

Također možemo dodati nekoliko redova odjednom:

UMETNI U proizvode VRIJEDNOSTI ("iPhone 6", "Apple", 3, 36000), ("Galaxy S8", "Samsung", 2, 46000), ("Galaxy S8 Plus", "Samsung", 1, 56000)

U ovom slučaju, tri reda će biti dodana u tabelu.

Također, prilikom dodavanja, možemo odrediti da kolona treba imati zadanu vrijednost koristeći DEFAULT ključnu riječ ili NULL vrijednost:

UMETNI U proizvode (Naziv proizvoda, Proizvođač, Broj proizvoda, Cijena) VRIJEDNOSTI ("Mi6", "Xiaomi", ZADANO, 28000)

U ovom slučaju će se koristiti zadana vrijednost za stupac ProductCount (ako je postavljena, ako nije, onda NULL).

Ako svi stupci imaju DEFAULT atribut koji specificira zadanu vrijednost ili su nullable, možete umetnuti zadane vrijednosti za sve stupce:

INSERT INTO Products ZADANE VRIJEDNOSTI

Ali ako uzmemo tablicu Products, tada će takva naredba propasti s greškom, jer nekoliko polja nemaju atribut DEFAULT i istovremeno ne dozvoljavaju vrijednost NULL.

Uz naredbu SELECT o kojoj smo ranije govorili, jezik za manipulaciju podacima (DML) sadrži još tri izraza: INSERT, UPDATE i DELETE. Poput naredbe SELECT, ova tri izraza rade na tablicama ili pogledima. Ovaj članak govori o naredbi INSERT, a o druge dvije izjave govori se u sljedećem članku.

INSERT izjava umeće redove (ili delove redova) u tabelu. Postoje dva različita oblika ove instrukcije:

INSERT tab_name [(col_list)] DEFAULT VRIJEDNOSTI | VRIJEDNOSTI (( DEFAULT | NULL | izraz ) [ ,...n]) INSERT INTO ime_kartice | view_name [(col_list)] (select_statement | execute_statement) Sintaksne konvencije

Prvi oblik instrukcije omogućava vam da ubacite jedan red (ili njegov dio) u tabelu. A drugi oblik INSERT naredbe omogućava vam da u tablicu umetnete skup rezultata SELECT naredbe ili pohranjene procedure koju izvršava naredba EXECUTE. Pohranjena procedura mora vratiti podatke koji će biti umetnuti u tablicu. Kada se koristi s naredbom INSERT, naredba SELECT može odabrati vrijednosti iz različite ili iste tablice u koju se podaci ubacuju, sve dok su tipovi podataka odgovarajućih stupaca kompatibilni.

Za oba oblika, tip podataka svake umetnute vrijednosti mora biti kompatibilan s tipom podataka odgovarajuće kolone tablice. Svi nizovi i privremeni podaci moraju biti stavljeni u navodnike; Numeričke vrijednosti ne moraju biti stavljene u navodnike.

Umetanje jednog reda

Za oba oblika INSERT izraza, eksplicitno navođenje liste stupaca nije obavezno. Ne navođenje kolona je isto kao i navođenje svih stupaca u tabeli.

DEFAULT VALUES parametar umeće podrazumevane vrednosti za sve kolone. Kolone sa tipom podataka TIMESTAMP ili svojstvom IDENTITY se ubacuju prema zadanim postavkama sa vrijednostima koje sistem automatski generiše. Za stupce drugih tipova podataka, odgovarajuća zadana vrijednost koja nije nula je umetnuta ako je dostupna, ili NULL u suprotnom. Ako kolona ne dozvoljava nulte vrijednosti i nema definiranu zadanu vrijednost, INSERT izraz ne uspijeva i prikazuje se poruka.

Primjer ispod umeće redove u tablicu Employee u bazi podataka SampleDb, demonstrirajući upotrebu INSERT izraza za umetanje male količine podataka u bazu podataka:

USE SampleDb; UMETNI U VRIJEDNOSTI Zaposlenih (34990, "Andrej", "Batonov", "d1"); UMETNI U VRIJEDNOSTI Zaposlenih (38640, "Aleksej", "Vasin", "d3");

Postoje dva različita načina za umetanje vrijednosti u novi red. Naredba INSERT u primjeru ispod eksplicitno koristi ključnu riječ NULL i umeće vrijednost NULL u odgovarajući stupac:

USE SampleDb; UMETNI U VRIJEDNOSTI zaposlenih (34991, "Andrey", "Batonov", NULL);

Da biste umetnuli vrijednosti u neke (ali ne sve) kolone tabele, obično morate eksplicitno navesti te kolone. Neodređene kolone moraju ili dozvoliti NULL vrijednosti ili imati definiranu zadanu vrijednost.

USE SampleDb; INSERT INTO Employee(Id, FirstName, LastName) VALUES (34992, "Andrey", "Batonov");

Prethodna dva primjera su ekvivalentna. U tabeli Employee, jedina kolona koja dozvoljava NULL vrijednosti je kolona DepartmentNumber, a sve ostale kolone su onemogućene klauzulom NOT NULL u naredbi CREATE TABLE.

Redoslijed vrijednosti u VALUES ponuda INSERT izrazi se mogu razlikovati od redoslijeda navedenog u izrazu CREATE TABLE. U ovom slučaju, njihov redoslijed mora odgovarati redoslijedu kojim su odgovarajuće kolone navedene u listi kolona. Ispod je primjer umetanja podataka drugačijim redoslijedom od originala:

USE SampleDb; INSERT INTO Employee(Broj odjeljenja, Prezime, Id, Ime) VRIJEDNOSTI ("d1", "Batonov", 34993, "Andrej");

Umetanje više redova

Drugi oblik INSERT izraza umeće jedan ili više redova odabranih podupitom u tabelu. Primjer ispod pokazuje kako umetnuti redove u tablicu koristeći drugi oblik INSERT izraza. U ovom slučaju, izvršava se upit za odabir brojeva i imena odjela koji se nalaze u Moskvi, a rezultirajući skup rezultata se učitava u novu tablicu kreiranu ranije.

Nova tabela MoscowDepartment kreirana u gornjem primjeru ima iste kolone kao i postojeća tabela odjela, osim kolone Lokacija koja nedostaje. Potupit u INSERT izrazu odabire sve redove u tabeli Departmenta za koje je vrijednost stupca Lokacija "Moskva", koji se zatim ubacuju u novu tablicu kreiranu na početku upita.

Primjer ispod pokazuje drugi način umetanja redova u tablicu koristeći drugi oblik INSERT izraza. U ovom slučaju, izvršava se upit za odabir kadrovskih brojeva, brojeva projekata i datuma početka projekta za sve zaposlenike na poziciji „Menadžer“ koji rade na projektu p2, a zatim se rezultujući skup rezultata učitava u novu tabelu kreiranu na početku upit:

USE 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 Posao = "Menadžer";

Prije umetanja redova pomoću INSERT naredbe, tabele MoscowDepartment i ManagerTeam (u primjerima iznad) bile su prazne. Ako je tablica već postojala i sadržavala je redove s podacima, tada bi joj se dodavali novi redovi.

U prethodnim odjeljcima, pogledali smo rad preuzimanja podataka iz unaprijed kreiranih tabela. Sada je vrijeme da shvatimo kako možemo kreirati/brisati tabele, dodati nove zapise i izbrisati stare. Za ove namjene u SQL Postoje operateri kao što su: STVORITI- kreira tabelu, ALTER- menja strukturu tabele, DROP- briše tabelu ili polje, INSERT- dodaje podatke u tabelu. Počnimo se upoznavati sa ovom grupom operatora od operatora INSERT.

1. Dodavanje cijelih linija

Kao što ime govori, operater INSERT koristi se za umetanje (dodavanje) redova u tabelu baze podataka. Dodavanje se može izvršiti na nekoliko načina:

  • - dodati jednu punu liniju
  • - dodati dio reda
  • - dodati rezultate upita.

Dakle, da bismo dodali novi red u tabelu, moramo da navedemo ime tabele, navedemo imena kolona i navedemo vrednost za svaku kolonu koristeći konstrukciju INSERT INTO table_name (polje1, polje2 ...) VRIJEDNOSTI (vrijednost1, vrijednost2...). Pogledajmo primjer.

INSERT INTO Sellers (ID, Adresa, Grad, Seller_name, Country) VRIJEDNOSTI("6", "1st Street", "Los Angeles", "Harry Monroe", "USA")

Također možete promijeniti redoslijed naziva kolona, ​​ali u isto vrijeme morate promijeniti redoslijed vrijednosti u parametru VRIJEDNOSTI.

2. Dodavanje dijela linija

U prethodnom primjeru, kada koristite operator INSERT eksplicitno smo označili nazive kolona tabele. Koristeći ovu sintaksu, možemo preskočiti neke kolone. To znači da unosite vrijednosti za neke stupce, ali ih ne dajete za druge. Na primjer:

INSERT INTO Sellers (ID, City, Seller_name) VRIJEDNOSTI("6", "Los Angeles", "Harry Monroe")

U ovom primjeru nismo naveli vrijednost za dvije kolone Adresa I Država. Neke kolone možete isključiti iz izjave INSERT INTO, ako to dozvoljava definiciju tabele. U tom slučaju mora biti ispunjen jedan od uslova: ova kolona je definirana kao važeća NULL(odsustvo bilo koje vrijednosti) ili specificirana zadana vrijednost u definiciji tablice. To znači da ako nije navedena vrijednost, koristit će se zadana vrijednost. Ako vam nedostaje kolona iz tabele koja ne dozvoljava da se vrednosti pojavljuju u svojim redovima NULL i nema definiranu zadanu vrijednost, DBMS će generirati poruku o grešci i red neće biti dodan.

3. Dodavanje odabranih podataka

U prethodnom primjeru umetnuli smo podatke u tabele tako što smo ih uneli ručno u upit. Međutim, operater INSERT INTO omogućava nam da automatizujemo ovaj proces ako želimo da ubacimo podatke iz druge tabele. U tu svrhu u SQL-u postoji takva konstrukcija kao INSERT IN... SELECT .... Ovaj dizajn vam omogućava da istovremeno odaberete podatke iz jedne tabele i ubacite ih u drugu. Pretpostavimo da imamo još jedan sto Sellers_EU sa listom prodavaca naše robe u Evropi i moramo ih dodati u opštu tabelu Prodavci. Struktura ovih tabela je ista (isti broj kolona i ista imena), ali su podaci različiti. Da bismo to uradili, možemo napisati sljedeći upit:

INSERT INTO Sellers (ID, Adresa, Grad, Seller_name, Country) SELECTID, Adresa, Grad, Ime_prodavca, Država FROM Sellers_EU

Morate obratiti pažnju da se vrijednosti internih ključeva ne ponavljaju (polje ID), inače će doći do greške. Operater SELECT može uključivati ​​i prijedloge GDJE za filtriranje podataka. Takođe treba napomenuti da DBMS ne obraća pažnju na nazive kolona sadržanih u naredbi SELECT, važan joj je samo redosled kojim su poređani. Dakle, podaci u prvoj navedenoj koloni koja je odabrana zbog SELECT, će se u svakom slučaju popuniti u prvoj koloni tabele Prodavci, naveden nakon operatora INSERT INTO, bez obzira na naziv polja.

4. Kopiranje podataka iz jedne tabele u drugu

Često kada radite sa bazama podataka, postoji potreba da se kreiraju kopije bilo koje tabele u svrhu pravljenja rezervne kopije ili modifikacije. Da biste napravili potpunu kopiju tablice, SQL daje poseban izraz SELECT INTO. Na primjer, trebamo napraviti kopiju tabele Prodavci, moraćete da napišete zahtev na sledeći način:

SELECT * INTO Sellers_new FROM Sellers

Za razliku od prethodnog dizajna INSERT IN... SELECT ... Kada se podaci dodaju postojećoj tabeli, dizajn kopira podatke u novu tabelu. Takođe možete reći da prva konstrukcija uvozi podatke, a druga izvozi. Kada koristite dizajn ODABIR ... U ... IZ ... Treba uzeti u obzir sljedeće:

  • - možete koristiti bilo koju rečenicu u operatoru SELECT, kao što je GROUP BY I HAVING
  • - možete koristiti spoj za dodavanje podataka iz više tabela
  • - podaci se mogu dodati samo jednoj tabeli, bez obzira iz koliko tabela su uzeti.

Ova izjava dodaje jedan ili više zapisa u tabelu (izvodi upit za dodavanje).

Sintaksa

Zahtjev za dodavanje više zapisa:

INSERT INTO konačni_objekat [(polje1[, polje2[, ...]])]
ODABIR [ izvor.]polje1[, polje2[, ...]
OD izraz_tablice

Zahtjev za dodavanje jednog zapisa:

INSERT INTO konačni_objekat [(polje1[, polje2[, ...]])]
VRIJEDNOSTI ( polje1[, polje2[, ...])

Naredba INSERT INTO se sastoji od sljedećih elemenata:

dio

Opis

konačni_objekat

Ime tabele ili upita u koji se dodaju zapisi.

polje1, polje2

Nakon svađe konačni_objekat- nazivi polja u koja se dodaju podaci; nakon svađe izvor- nazivi polja iz kojih se izvlače podaci.

vanjska_baza podataka

Put do eksterne baze podataka. Za opis putanje pogledajte članak o IN klauzuli.

izvor

Ime tabele ili upita iz koje se kopiraju zapisi.

izraz_tablice

Jedno ili više imena tablica iz kojih želite dohvatiti zapise. Ovaj argument može biti ime pojedinačne tablice, rezultatski izraz konstruiran korištenjem INNER JOIN, LEFT JOIN ili RIGHT JOIN ili pohranjeni upit.

vrijednost1, vrijednost2

Vrijednosti koje će se dodati određenim poljima novog zapisa. Svaka vrijednost se ubacuje u polje koje odgovara njenoj poziciji na listi: vrijednost1 dodano polje1 novi ulaz, vrijednost2- V polje2 itd. Morate odvojiti vrijednosti zarezom i staviti tekstualna polja u navodnike (" ").

Bilješke

Naredba INSERT INTO može dodati jedan zapis u tablicu koristeći gornju sintaksu. U tom slučaju navedete imena i vrijednosti za svako polje u zapisu. Morate navesti sva polja u zapisu kojima su dodijeljene vrijednosti i odgovarajuće vrijednosti. Ako ne navedete vrijednost polja, bit će joj dodijeljena zadana vrijednost ili NULL. Zapisi se dodaju na kraj tabele.

Naredba INSERT INTO se također može koristiti za dodavanje skupa zapisa iz druge tabele ili upita koristeći klauzulu SELECT... FROM kao što je prikazano iznad (pogledajte Sintaksu upita za dodavanje više zapisa). U ovom slučaju, SELECT klauzula specificira polja koja treba dodati navedenom konačni_objekat.

Izvor ili konačni_objekat može biti tabela ili upit. Kada se zada upit, mehanizam baze podataka Microsoft Access dodaje zapise svim tabelama koje vraća.

Upotreba naredbe INSERT INTO je opciona. Ako je navedeno, mora prethoditi SELECT izrazu.

Ako ciljna tabela sadrži primarni ključ, osigurajte da su vrijednosti koje dodate jednom ili više polja primarnog ključa jedinstvene i različite od NULL; inače unosi neće biti dodani.

Ako se zapisi dodaju u tabelu sa poljem Brojač i želite da ih prenumerirate, nemojte uključivati ​​polje Brojač u upit. Uključite polje Brojač u upit ako želite da sačuvate originalne vrijednosti iz polja.

Možete dodati zapise u tablicu u drugoj bazi podataka koristeći IN klauzulu.

Da kreirate tablicu, koristite naredbu SELECT... INTO za upit za kreiranje tablice.

Prije nego što pokrenete upit za dodavanje, upotrijebite upit za odabir sa istim kriterijima odabira da biste koristili rezultate da odredite koji će zapisi biti dodati.

Upit za dodavanje kopira zapise iz jedne ili više tabela u drugu tabelu. U ovom slučaju, tabele koje sadrže dodane zapise ostaju nepromijenjene.

Umjesto dodavanja zapisa iz druge tabele, možete postaviti vrijednost svakog polja u poseban novi zapis koristeći klauzulu VALUES. Ako je lista polja izostavljena, klauzula VALUES mora uključivati ​​odgovarajuće vrijednosti za svako polje tabele; u suprotnom, INSERT operacija neće uspjeti. Koristite izraz INSERT INTO zajedno sa klauzulom VALUES za svaki dodatni zapis koji želite da kreirate.