SQLShack (Română)

Acest articol acoperă instrucțiunea SQL INSERT INTO SELECT împreună cu sintaxa sa, exemple și cazuri de utilizare.

În articolul meu anterior Instrucțiunea SQL SELECT INTO, am explorat următoarele sarcini.

  • Creați un tabel SQL în timp ce introduceți înregistrări cu tipuri de date adecvate
  • Utilizați SQL SELECT INTO pentru a insera înregistrări într-un anumit grup de fișiere
  • Nu îl putem folosi pentru a insera date într-un tabel existent

Instrucțiunea INSERT INTO SELECT

Vrem să inserăm înregistrări ca activitate regulată a bazei de date. Putem insera date direct folosind instrumente client precum SSMS, Azure Data Studio sau direct dintr-o aplicație. În SQL, folosim instrucțiunea SQL INSERT INTO pentru a insera înregistrări.

Sintaxa INSERT INTO

Odată ce introducem date în tabel, putem folosi următoarea sintaxă pentru Instrucțiune SQL INSERT INTO.

1
2

INSERT INTO table_name (Coloana1, Coloana 2 ….)
VALORI (valoare1, valoare2, …);

Dacă am specificat toate valorile coloanei conform coloanei tabelului comenzi, nu trebuie să specificăm numele coloanelor. Putem insera direct înregistrări în tabel.

1
2

INSERT INTO table_name
VALORI (valoare1, valoare2, …);

Permiteți-ne să creăm un tabel eșantion și să inserăm date în acesta .

1
2
3
4

CREAȚI TABLA Angajați
(ID INT,
Nume VARCHAR (20)
);

Putem insera date folosind următoarele interogări. Ambele interogări sunt valabile pentru inserarea datelor.

1
2

Inserați în valorile angajaților (ID, nume) (1, „raj”)
Inserați în valorile angajaților (2, „raj”)

Nu putem insera date fără a specifica numele coloanelor dacă există un nepotrivirea dintre inserarea datelor și ordinea valorilor coloanei este diferită. Putem primi următorul mesaj de eroare.

  • Msg 213, Nivelul 16, Starea 1, Linia 6

    Numele coloanei sau numărul de valori furnizate nu definirea tabelului de potrivire.

  • Msg 245, nivel 16, stare 1, linie 6

    Conversia a eșuat la conversia valorii varchar „raj” la tipul de date int.

În acest exemplu, vom folosi instrucțiunea SQL INSERT INTO cu furnizarea valorilor direct într-o instrucțiune. Să presupunem că vrem să inserăm date dintr-un alt tabel. Putem folosi în continuare instrucțiunea SQL INSERT INTO cu o instrucțiune select. Să explorăm acest lucru în secțiunea următoare.

INSERT INTO SELECT Declarația sintaxă

Putem insera date din alte tabele SQL într-un tabel cu următoarea instrucțiune INSERT INTO SELECT.

1
2
3

INSERT INTO table1 (col1, col2, col3, …)
SELECT col1, col2, col3, …
FROM table2

Această interogare efectuează următoarele sarcini:

  • Selectează mai întâi înregistrările dintr-un tabel (instrucțiune Select)
  • Apoi, se introduce într-un tabel specificat cu INSERT INTO
  • Notă: Structura coloanei trebuie să se potrivească între coloana returnată de instrucțiunea SELECT și tabelul de destinație.

INSERT INTO SELECT examples

Exemplul 1: introduceți date din toate coloanele tabelului sursă în tabelul de destinație

Avem următoarele înregistrări într-un tabelul existent al angajaților.

Permiteți-ne să creăm un alt tabel Clienți cu următoarea interogare.

1
2
3
4

CREAȚI TABLE Clienți
(ID INT,
Nume VARCHAR (20)
);

Dorim să inserăm toate înregistrările din tabelul Angajați în tabelul Clienți. Putem folosi instrucțiunea SQL INSERT INTO SELECT pentru a face acest lucru.

1
2
3

INSERAȚI ÎN CLIENTI
SELECT *
DIN Angajați;

Inserează toate înregistrările în tabelul Clienți. Putem verifica dacă înregistrările din tabelul Clienți sunt similare cu tabelul Angajaților.

În acest exemplu, am inserat înregistrări pentru toate coloane în tabelul Clienți.

Exemplul 2: Inserați rânduri de la sursă la tabela de destinație specificând numele coloanelor

Să renunțăm la tabelul Clienți existent înainte de a merge mai departe. Acum, dorim să creăm un tabel cu o coloană IDENTITATE suplimentară. Coloana IDENTITATE introduce automat valori de identitate într-un tabel. De asemenea, am adăugat o coloană Oraș care permite valori NULL

1
2
3
4
5
6

CREATE TABLE Clienți
(ID INT IDENTITY (1, 1),
Emp_ID INT,
Nume VARCHAR (20),
Oraș VARCHAR (20) NULL,
);

Nu putem folosi instrucțiunea INSERT INTO SELECT similară cu exemplul de mai sus. Dacă încercăm să rulăm acest cod, vom primi un mesaj de eroare.

1
2
3

INSERAȚI ÎN CLIENTI
SELECT *
DIN Angajați ;

În acest caz, trebuie să specificăm numele coloanei cu instrucțiunea INSERT INTO.

1
2
3

INSERAȚI ÎN CLIENTI (Emp_ID, Nume)
SELECT *
DIN Angajați;

În tabelul Clienți, avem o coloană suplimentară cu permite valori NULL. Să rulăm un tabel Selectați pe clienți. În următoarea captură de ecran, putem vedea valori NULL în coloana Oraș.

Să presupunem că aveți o coloană diferită în tabelul sursă. Puteți încă să inserați înregistrări în tabelul de destinație cu specificarea numelor de coloane în instrucțiunea INSERT INTO SELECT. Ar trebui să avem un tip de date adecvat pentru a insera date. Nu puteți insera datele unei coloane varchar într-o coloană INT.

Adăugați o nouă coloană în tabelul Angajați utilizând instrucțiunea ALTER TABLE.

1
2

ALTER TABLE Angajați
ADAUGĂ Țara varchar (50);

Actualizați înregistrările tabelului cu valoarea țării India.

1

Actualizați setul de angajați Country = „India”

Acum, executați din nou INSERT INTO Instrucțiunea SELECT. Puteți observa că folosim SELECT * în loc să specificăm numele coloanelor.

1
2
3

INSERAȚI ÎN CLIENTI (Emp_ID, Nume)
SELECT *
DIN Angajați;

Primim următorul mesaj de eroare. Această eroare apare din cauza nepotrivirii coloanei dintre tabelul sursă și tabelul de destinație.

Putem mapa coloana între tabela sursă și destinație utilizând următoarea interogare.

1
2
3
4
5
6

INSERAȚI ÎN CLIENTI
(Emp_ID,
Nume
)
SELECT ID, Nume
DIN Angajați;

Exemplul 3: Inserați rândurile de sus folosind INSERT INTO SELECT statement

Să presupunem că dorim să inserăm N rânduri de sus din tabelul sursă în tabelul destinație. Putem folosi clauza Top în instrucțiunea INSERT INTO SELECT. În următoarea interogare, inserează primul rând din tabelul Angajați în tabelul Clienți.

1
2
3
4
5
6

INSERT TOP (1) INTO Clienți
(Emp_ID,
Nume
)
SELECT ID, Nume
FROM Angajați;

Exemplul 4: Inserați folosind ambele coloane și valorile definite în Instrucțiunea SQL INSERT INTO SELECT

În exemplele anterioare, fie am specificat valori specifice în instrucțiunea INSERT INTO, fie am folosit INSERT INTO SELECT pentru a obține înregistrări din tabelul sursă și a le insera în tabelul de destinație. >

Putem combina ambele coloane și valorile definite în instrucțiunea SQL INSERT INTO SELECT.

Avem următoarele coloane în tabelul Clienți și angajați. Anterior, nu am inserat nicio valoare pentru coloana Oraș. Nu avem valorile necesare și în tabelul Angajaților. Trebuie să specificăm o valoare explicită pentru coloana Oraș.

În următoarea interogare, am specificat o valoare pentru Oraș coloana în timp ce restul valorilor le-am inserat din tabelul Angajați.

1
2

INSERT TOP (1) INTO Clienți (Emp_ID, Nume, Oraș)
SELECT ID, Nume, „Delhi” DIN angajați;

În următoarea interogare, o putem vedea inserând una rând (datorită clauzei Top (1)) împreună cu valoarea pentru coloana Oraș.

Exemplul 5: INSERT INTO SELECT declarație cu clauză Join pentru a obține date de la mai multe tabele

Putem folosi o clauză JOIN pentru a obține date de la mai multe tabele. Aceste tabele sunt alăturate condițiilor specificate cu clauza ON. Să presupunem că dorim să obținem date din mai multe tabele și să le inserăm într-un tabel.

În acest exemplu, folosesc baza de date AdventureWorks2017. Mai întâi, creați un nou tabel cu tipuri de date adecvate.

Acest tabel ar trebui să conțină înregistrări din rezultatul unei interogări de îmbinare cu mai multe tabele. Executați următoarea interogare pentru a insera date în tabelul HumanResources.EmployeeData.

Exemplul 6: Instrucțiunea INSERT INTO SELECT cu expresie tabelă comună

Folosim Common Table Expressions (CTE) pentru a simplifica îmbinarea complexă din mai multe coloane. În exemplul anterior, am folosit JOINS într-o instrucțiune Select pentru a insera date într-un tabel SQL. În această parte, vom rescrie interogarea cu CTE.

Într-un CTE, putem împărți codul în două părți.

  1. Definim CTE printr-o clauză WITH înainte de instrucțiunea SELECT, INSERT, UPDATE, DELETE
  2. Odată ce definim CTE, putem lua referință CTE similar cu un tabel SQL relațional

Executați următorul cod pentru a insera date folosind un CTE.

Exemplul 7 : Instrucțiunea INSERT INTO SELECT cu o variabilă Table

Folosim variabilele Table similar cu o tabelă temporară. Le putem declara folosind tipul de date al tabelului. Acest tabel poate fi utilizat pentru a efectua activități în SQL Server în care nu avem nevoie de un tabel permanent. Puteți împărți următoarea interogare în trei părți.

  1. Creați o variabilă SQL Table cu tipuri de date de coloană adecvate. Trebuie să folosim tipul de date TABLE pentru variabila de tabel
  2. Executați o instrucțiune INSERT INTO SELECT pentru a insera date într-o variabilă de tabel
  3. Vizualizați setul de rezultate ale variabilei de tabel

Concluzie

În acest articol, explorăm cazurile de utilizare ale instrucțiunii INSERT INTO SELECT. Sper că ți s-a părut util acest articol. Simțiți-vă liber să oferiți feedback în comentariile de mai jos.

  • Autor
  • Postări recente
Ca certificat MCSA și Microsoft Certified Trainer în Gurgaon, India, cu o experiență de 13 ani, Rajendra lucrează pentru o varietate de companii mari, concentrându-se pe optimizarea performanței, monitorizarea, disponibilitatea ridicată și strategiile și implementarea recuperării în caz de dezastru. Este autorul a sute de articole de autoritate despre SQL Server, Azure, MySQL, Linux, Power BI, Tuning de performanță, AWS / Amazon RDS, Git și tehnologii conexe care au fost vizualizate de peste 10 milioane de cititori până în prezent.
El este creatorul uneia dintre cele mai mari colecții online gratuite de articole pe un singur subiect, cu seria sa de 50 de părți despre SQL Server Always On Availability Groups. Pe baza contribuției sale la comunitatea SQL Server, a fost recunoscut cu diverse premii, inclusiv prestigiosul „Cel mai bun autor al anului” continuu în 2020 și 2021 la SQLShack.
Raj este mereu interesat de noi provocări, deci dacă aveți nevoie de consultanță ajutor cu privire la orice subiect acoperit în scrierile sale, poate fi contactat la [email protected]
Vezi toate mesajele lui Rajendra Gupta

Ultimele postări ale lui Rajendra Gupta (vezi toate)
  • Efectuarea actualizărilor versiunilor minore și majore pentru AWS RDS SQL Server – 29 ianuarie 2021
  • Implementarea instanțelor AWS RDS PostgreSQL – 27 ianuarie 2021
  • Migrarea bazelor de date SQL locale la AWS RDS SQL Server utilizând AWS DMS – 25 ianuarie , 2021

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *