SQL INSERT INTO SELECT-setning. SQL INSERT INTO SELECT-setning Legger til hele rader

I tillegg til SELECT-setningen diskutert tidligere, inneholder Data Manipulation Language (DML) tre andre setninger: INSERT, UPDATE og DELETE. I likhet med SELECT-setningen fungerer disse tre setningene på enten tabeller eller visninger. Denne artikkelen diskuterer INSERT-setningen, og de to andre setningene diskuteres i neste artikkel.

INSERT uttalelse setter inn rader (eller deler av rader) i en tabell. Det er to forskjellige former for denne instruksjonen:

INSERT tab_name [(col_list)] STANDARDVERDIER | VERDIER (( STANDARD | NULL | uttrykk ) [ ,...n]) INSERT INTO tab_name | view_name [(col_list)] (select_statement | execute_statement) Syntakskonvensjoner

Den første formen av instruksjonen lar deg sette inn en rad (eller en del av den) i tabellen. Og den andre formen av INSERT-setningen lar deg sette inn i en tabell resultatsettet til en SELECT-setning eller en lagret prosedyre utført av en EXECUTE-setning. Den lagrede prosedyren må returnere data som skal settes inn i tabellen. Når den brukes med en INSERT-setning, kan en SELECT-setning velge verdier fra en annen eller samme tabell som dataene settes inn i, så lenge datatypene til de tilsvarende kolonnene er kompatible.

For begge skjemaene må datatypen for hver innsatte verdi være kompatibel med datatypen til den tilsvarende tabellkolonnen. Alle strenger og midlertidige data må være omgitt av anførselstegn; Numeriske verdier trenger ikke være omgitt av anførselstegn.

Setter inn en enkelt rad

For begge former for INSERT-setningen er det valgfritt å spesifisere kolonnelisten eksplisitt. Å ikke liste opp kolonner er det samme som å spesifisere alle kolonner i tabellen.

DEFAULT VALUES parameter setter inn standardverdier for alle kolonner. Kolonner med TIMESTAMP-datatypen eller IDENTITY-egenskapen settes inn som standard med verdier som genereres automatisk av systemet. For kolonner med andre datatyper settes den tilsvarende ikke-null standardverdien inn hvis tilgjengelig, eller NULL ellers. Hvis en kolonne ikke tillater nullverdier og ikke har en standardverdi definert, mislykkes INSERT-setningen og en melding vises.

Eksemplet nedenfor setter inn rader i Employee-tabellen i SampleDb-databasen, og demonstrerer bruken av en INSERT-setning for å sette inn en liten mengde data i databasen:

BRUK SampleDb; INSERT INTO Employee VALUES (34990, "Andrey", "Batonov", "d1"); INSERT INTO Employee VALUES (38640, "Alexey", "Vasin", "d3");

Det er to forskjellige måter å sette inn verdier i en ny rad. INSERT-setningen i eksemplet nedenfor bruker eksplisitt nøkkelordet NULL og setter inn en NULL-verdi i den tilsvarende kolonnen:

BRUK SampleDb; INSERT INTO Employee VALUES (34991, "Andrey", "Batonov", NULL);

For å sette inn verdier i noen (men ikke alle) kolonner i en tabell, må du vanligvis spesifisere disse kolonnene eksplisitt. Uspesifiserte kolonner må enten tillate NULL-verdier eller ha en standardverdi definert.

BRUK SampleDb; INSERT INTO Employee(Id, FirstName, LastName) VERDIER (34992, "Andrey", "Batonov");

De to foregående eksemplene er likeverdige. I Employee-tabellen er den eneste kolonnen som tillater NULL-verdier DepartmentNumber-kolonnen, og alle andre kolonner ble deaktivert av NOT NULL-leddet i CREATE TABLE-setningen.

Rekkefølge av verdier i VALUES tilbud INSERT-setninger kan avvike fra rekkefølgen som er spesifisert i CREATE TABLE-setningen. I dette tilfellet må rekkefølgen deres samsvare med rekkefølgen som de tilsvarende kolonnene er oppført i kolonnelisten. Nedenfor er et eksempel på å sette inn data i en annen rekkefølge enn originalen:

BRUK SampleDb; INSERT INTO Employee(Departament Number, LastName, Id, FirstName) VERDIER ("d1", "Batonov", 34993, "Andrey");

Setter inn flere rader

Den andre formen av INSERT-setningen setter inn én eller flere rader valgt av en underspørring i tabellen. Eksemplet nedenfor viser hvordan du setter inn rader i en tabell ved å bruke den andre formen av INSERT-setningen. I dette tilfellet utføres en spørring for å velge numrene og navnene på avdelinger som ligger i Moskva, og det resulterende resultatsettet lastes inn i en ny tabell opprettet tidligere.

Den nye MoscowDepartment-tabellen opprettet i eksempelet ovenfor har de samme kolonnene som den eksisterende avdelingstabellen, bortsett fra den manglende plasseringskolonnen. Underspørringen i INSERT-setningen velger alle rader i avdelingstabellen der Location-kolonneverdien er "Moskva", som deretter settes inn i den nye tabellen som ble opprettet i begynnelsen av spørringen.

Eksemplet nedenfor viser en annen måte å sette inn rader i en tabell ved å bruke den andre formen av INSERT-setningen. I dette tilfellet utføres en spørring for å velge personnummer, prosjektnummer og prosjektstartdatoer for alle ansatte med stillingen "Leder" som jobber med prosjekt p2 og deretter laste det resulterende resultatsettet inn i en ny tabell opprettet i begynnelsen av spørringen:

BRUK 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";

Før du satte inn rader ved hjelp av INSERT-setningen, var tabellene for MoskvaDepartment og ManagerTeam (i eksemplene ovenfor) tomme. Hvis tabellen allerede eksisterte og inneholdt rader med data, vil nye rader bli lagt til den.

I tidligere avsnitt har vi sett på arbeidet med å hente data fra forhåndslagrede tabeller. Nå er det på tide å finne ut hvordan vi kan opprette/slette tabeller, legge til nye poster og slette gamle. For disse formålene i SQL Det er operatører som: SKAPE- lager en tabell, ENDRE- endrer tabellstrukturen, MISTE- sletter en tabell eller et felt, SETT INN- legger til data i tabellen. La oss begynne å bli kjent med denne gruppen operatører fra operatøren SETT INN.

1. Legge til hele linjer

Som navnet tilsier, operatøren SETT INN brukes til å sette inn (legge til) rader i en databasetabell. Legging kan gjøres på flere måter:

  • - legg til en hel linje
  • - legg til en del av en linje
  • - legg til søkeresultater.

Så for å legge til en ny rad i en tabell, må vi spesifisere tabellnavnet, liste opp kolonnenavnene og angi verdien for hver kolonne ved å bruke konstruksjonen SETT INN I tabellnavn (felt1, felt2 ...) VERDIER (verdi1, verdi2...). La oss se på et eksempel.

INSERT INTO Selgere (ID, Adresse, By, Selger_navn, Land) VERDIER("6", "1st Street", "Los Angeles", "Harry Monroe", "USA")

Du kan også endre rekkefølgen på kolonnenavn, men samtidig må du endre rekkefølgen på verdiene i parameteren VERDIER.

2. Legge til en del av linjene

I forrige eksempel, når du bruker operatøren SETT INN vi har eksplisitt merket tabellkolonnenavnene. Ved å bruke denne syntaksen kan vi hoppe over noen kolonner. Dette betyr at du legger inn verdier for noen kolonner, men ikke oppgir dem for andre. For eksempel:

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

I dette eksemplet spesifiserte vi ikke en verdi for to kolonner Adresse Og Land. Du kan ekskludere noen kolonner fra setningen SETT INN I, hvis dette tillater tabelldefinisjonen. I dette tilfellet må ett av betingelsene være oppfylt: denne kolonnen er definert som gyldig NULL(fravær av noen verdi) eller den angitte standardverdien i tabelldefinisjonen. Dette betyr at hvis ingen verdi er spesifisert, vil standardverdien bli brukt. Hvis du mangler en kolonne fra en tabell som ikke tillater at verdier vises i radene NULL og ikke har en standardverdi definert, vil DBMS generere en feilmelding og raden vil ikke bli lagt til.

3. Legge til valgte data

I de forrige eksemplene satte vi inn data i tabeller ved å legge dem inn manuelt i spørringen. Imidlertid operatøren SETT INN I lar oss automatisere denne prosessen hvis vi ønsker å sette inn data fra en annen tabell. For dette formålet i SQL er det en slik konstruksjon som SETTE INN I ... VELG .... Denne utformingen lar deg samtidig velge data fra en tabell og sette den inn i en annen. La oss anta at vi har et annet bord Selgere_EU med en liste over selgere av våre varer i Europa, og vi må legge dem til den generelle tabellen Selgere. Strukturen til disse tabellene er den samme (samme antall kolonner og samme navn), men dataene er forskjellige. For å gjøre dette kan vi skrive følgende spørring:

INSERT INTO Selgere (ID, Adresse, By, Selgernavn, Land) VELGID, adresse, by, selgernavn, land FRA selgere_EU

Du må være oppmerksom slik at verdiene til interne nøkler ikke gjentas (felt ID), ellers vil det oppstå en feil. Operatør PLUKKE UT kan også inneholde forslag HVOR for å filtrere data. Det skal også bemerkes at DBMS ikke tar hensyn til navnene på kolonnene i uttalelsen PLUKKE UT, bare rekkefølgen de er ordnet i er viktig for henne. Derfor er dataene i den første angitte kolonnen som ble valgt pga PLUKKE UT, vil uansett fylles ut i den første kolonnen i tabellen Selgere, spesifisert etter operatøren SETT INN I, uavhengig av feltnavnet.

4. Kopiere data fra en tabell til en annen

Når du arbeider med databaser, er det ofte behov for å lage kopier av alle tabeller for sikkerhetskopiering eller modifikasjon. For å lage en fullstendig kopi av en tabell, gir SQL en egen setning VELG I. For eksempel må vi lage en kopi av tabellen Selgere, må du skrive forespørselen som følger:

VELG * INTO Sellers_new FROM Sellers

I motsetning til tidligere design SETTE INN I ... VELG ... Når data legges til en eksisterende tabell, kopierer designet dataene til den nye tabellen. Du kan også si at den første konstruksjonen importerer data, og den andre eksporterer. Når du bruker designet VELG ... INTO ... FRA ... Følgende bør vurderes:

  • - du kan bruke alle setninger i operatoren PLUKKE UT, som for eksempel GRUPPE AV Og HA
  • - du kan bruke en sammenføyning for å legge til data fra flere tabeller
  • - data kan bare legges til en tabell, uansett hvor mange tabeller de ble hentet fra.

Denne setningen legger til én eller flere poster i en tabell (utfører en tilleggsspørring).

Syntaks

Forespørsel om å legge til flere poster:

SETT INN I endelig_objekt [(felt1[, felt2[, ...]])]
PLUKKE UT [ kilde.]felt1[, felt2[, ...]
FRA tabelluttrykk

Forespørsel om å legge til én post:

SETT INN I endelig_objekt [(felt1[, felt2[, ...]])]
VERDIER ( felt1[, felt2[, ...])

INSERT INTO-setningen består av følgende elementer:

Del

Beskrivelse

endelig_objekt

Navnet på tabellen eller spørringen der poster legges til.

felt1, felt2

Etter argumentasjonen endelig_objekt- navn på felt som data legges til; etter argumentasjonen kilde- navn på feltene som data hentes ut fra.

ekstern_database

Sti til ekstern database. For en beskrivelse av banen, se artikkelen om IN-klausulen.

kilde

Navnet på tabellen eller spørringen som poster kopieres fra.

tabelluttrykk

Ett eller flere tabellnavn du ønsker å hente poster fra. Dette argumentet kan være navnet på en individuell tabell, et resultatuttrykk konstruert ved hjelp av en INNER JOIN, LEFT JOIN eller RIGHT JOIN, eller en lagret spørring.

verdi1, verdi2

Verdier som vil bli lagt til spesifikke felt i den nye posten. Hver verdi settes inn i feltet som tilsvarer dens plassering i listen: verdi1 lagt til felt1 Ny inngang, verdi2- V felt2 osv. Du må skille verdier med komma og omslutte tekstfelt i anførselstegn (" ").

Notater

INSERT INTO-setningen kan legge til en enkelt post i en tabell ved å bruke syntaksen ovenfor. I dette tilfellet spesifiserer du navn og verdier for hvert felt i posten. Du må spesifisere alle feltene i posten som verdier er tilordnet og de tilsvarende verdiene. Hvis du ikke angir en feltverdi, vil den bli tildelt standardverdien eller NULL. Poster legges til på slutten av tabellen.

INSERT INTO-setningen kan også brukes til å legge til et sett med poster fra en annen tabell eller spørring ved å bruke SELECT... FROM-leddet som vist ovenfor (se Spørringssyntaks for å legge til flere poster). I dette tilfellet spesifiserer SELECT-leddet feltene som skal legges til det spesifiserte endelig_objekt.

Kilde eller endelig_objekt kan være en tabell eller et søk. Når en spørring er gitt, legger Microsoft Access-databasemotoren til poster i alle tabeller den returnerer.

Det er valgfritt å bruke INSERT INTO-setningen. Hvis spesifisert, må den gå foran SELECT-setningen.

Hvis måltabellen inneholder en primærnøkkel, sørg for at verdiene du legger til i ett eller flere av primærnøkkelfeltene er unike og forskjellige fra NULL; ellers vil ikke oppføringene bli lagt til.

Hvis poster legges til i en tabell med et tellerfelt, og du vil omnummerere dem, må du ikke inkludere tellerfeltet i spørringen. Ta med Counter-feltet i spørringen hvis du vil beholde de opprinnelige verdiene fra feltet.

Du kan legge til poster i en tabell i en annen database ved å bruke IN-leddet.

For å lage en tabell, bruk SELECT... INTO-setningen for å spørre om å opprette tabellen.

Før du kjører en add-spørring, bruk en utvalgsspørring med de samme utvalgskriteriene for å bruke resultatene til å bestemme hvilke poster som skal legges til.

En append-spørring kopierer poster fra én eller flere tabeller til en annen tabell. I dette tilfellet forblir tabellene som inneholder de tilføyde postene uendret.

I stedet for å legge til poster fra en annen tabell, kan du angi verdien for hvert felt i en separat ny post ved å bruke VALUES-leddet. Hvis en feltliste er utelatt, må VALUES-leddet inkludere de tilsvarende verdiene for hvert tabellfelt; ellers vil INSERT-operasjonen mislykkes. Bruk INSERT INTO-setningen sammen med VALUES-leddet for hver tilleggspost du vil opprette.

Ved å bruke SQL kan du kopiere informasjon fra en tabell til en annen.

INSERT INTO SELECT-setningen kopierer data fra én tabell og setter den inn i en eksisterende tabell.

SQL INSERT INTO SELECT-setning,

INSERT INTO SELECT-setningen velger data fra én tabell og setter den inn i en eksisterende tabell. Eventuelle eksisterende rader i måltabellen endres ikke.

SQL INSERT INTO SELECT, Syntaks

Vi kan kopiere alle kolonnene fra en tabell til en annen, eksisterende tabell:

SETT INN I tabell 2
VELG * FRA tabell1;

Eller vi kan kopiere bare kolonnene vi ønsker til en annen eksisterende tabell:

SETT INN I tabell 2
(kolonnenavn(e))
PLUKKE UT kolonnenavn(e)
FRA tabell1;

Demo-versjon av databasen

I denne opplæringen vil vi bruke den velkjente Northwind-databasen.

Nedenfor er et utvalg fra "Kunder"-tabellen:

bruker-IDKundens navnKontaktpersonenAdressebypostnummerEt land
1 Alfreds Futterkiste Maria Anders Obere Str. 57 Berlin 12209 Tyskland
2 Ana Trujillo Emparedados og helados Ana Trujillo Avda. de la Constitucion 2222 Mexico D.F. 05021 Mexico
3 Antonio Moreno Taqueria Antonio Moreno Mataderos 2312 Mexico D.F. 05023 Mexico

Og utvalget fra "Leverandører"-tabellen:

SQL INSERT INTO SELECT, eksempler

Kopierer bare noen få kolonner fra "Leverandører" til "Kunder":

Kopierer kun tyske leverandører til "Kunder".

Hei alle sammen! Denne artikkelen vil diskutere hvordan du kan legge til data i tabellen i Microsoft SQL Server, hvis du allerede er i det minste litt kjent med T-SQL-språket, så har du sannsynligvis innsett at nå skal vi snakke om INSERT-setningen, samt hvordan den kan brukes til å legge til data i en tabell.

La oss starte, som vanlig, med litt teori.

INSERT-setning i T-SQL

SETT INN er en T-SQL-instruksjon som er designet for å legge til data i en tabell, dvs. opprette nye rekorder. Denne instruksjonen kan brukes både til å legge til en enkelt rad i en tabell og til å sette inn data i bulk. INSERT-setningen krever tillatelse for å sette inn data ( SETT INN) til måltabellen.

Det er flere måter å bruke INSERT-setningen på datastykket som må settes inn:

  • Oppføring av spesifikke verdier å sette inn;
  • Spesifisere et datasett som en SELECT-spørring;
  • Spesifisere et datasett i form av et prosedyrekall som returnerer tabelldata.

Forenklet syntaks

SETT INN [tabell] ( liste over kolonner...) VERDIER ( liste over verdier...) Eller VELG prøveforespørsel Eller UTFØR fremgangsmåte

  • INSERT INTO er en kommando for å legge til data i en tabell;
  • Tabell er navnet på måltabellen du vil sette inn nye poster i;
  • Kolonnelisten er en liste over kolonnenavn på tabellen som dataene skal settes inn i, atskilt med komma;
  • VALUES er en tabellverdikonstruktør som vi spesifiserer verdiene som vi skal sette inn i tabellen;
  • Listen over verdier er verdiene som vil bli satt inn, atskilt med komma. De er oppført i den rekkefølgen kolonnene vises i kolonnelisten;
  • SELECT er en spørring for å velge data som skal settes inn i en tabell. Resultatsettet som spørringen returnerer må samsvare med listen over kolonner;
  • EXECUTE er et prosedyrekall for å skaffe data for innsetting i en tabell. Resultatsettet som den lagrede prosedyren returnerer, må samsvare med listen over kolonner.

Dette er omtrent slik den forenklede syntaksen til INSERT INTO-setningen ser ut i de fleste tilfeller, slik vil du legge til nye poster i tabeller.

Listen over kolonner du skal sette inn data i trenger ikke å skrives, i så fall vil rekkefølgen deres bli bestemt basert på den faktiske rekkefølgen av kolonnene i tabellen. Du må huske denne rekkefølgen når du angir verdier som skal settes inn eller skrive en spørring å velge. Personlig anbefaler jeg at du fortsatt angir en liste over kolonner der du planlegger å legge til data.

Du bør også huske at henholdsvis kolonnelisten og verdilisten må inneholde såkalte obligatoriske kolonner, dette er de som ikke kan inneholde NULL-verdien. Hvis du ikke spesifiserer dem, og kolonnen ikke har en standardverdi, vil det oppstå en feil.

Jeg vil også merke meg at datatypen til verdiene du skal sette inn må samsvare med datatypen til kolonnen som denne verdien skal settes inn i, eller i det minste støtte implisitt konvertering. Men jeg anbefaler deg å kontrollere datatypen ( format) verdier, både i listen over verdier og i SELECT-spørringen.

Nok teori, la oss gå videre til praksis.

Innledende data

For å legge til data i tabellen trenger vi selve tabellen, så la oss lage den og prøve å legge til poster i den.

Merk! Alle eksemplene kjøres i Microsoft SQL Server 2016 Express.

CREATE TABLE TestTable( IDENTITY(1,1) NOT NULL, (100) NOT NULL, NOT NULL)

Vår testtabell vil inneholde en liste over produkter med priser.

Også i eksemplene vil vi bruke en prosedyre som returnerer en tabellverdi for å legge til data til tabellen, så la oss lage det også.

OPPRETT PROSEDYRE Testprosedyre SOM BEGYNN VELG Produktnavn, Pris FRA TestTable END

For eksempel vil vi få den til å returnere data fra den nyopprettede TestTable-tabellen.

Merk!

Som du forstår, innebærer å lese dette materialet å ha litt kunnskap om T-SQL-språket, så hvis noe ikke er klart for deg, anbefaler jeg at du gjør deg kjent med følgende materialer:

Eksempel 1 – Legge til en ny post i en tabell ved å bruke tabellverdikonstruktøren

La oss først prøve å legge til én post og umiddelbart se på resultatet, dvs. La oss skrive en forespørsel om en prøve.

INSERT INTO TestTable(Produktnavn, Pris) VERDIER ("Datamaskin", 100) GÅ VELG * FRA TestTable

Du ser at etter tabellnavnet listet vi opp navnene på kolonnene som vi vil legge til data i, atskilt med kommaer, så indikerte vi nøkkelordet VERDIER og i parentes også, i samme rekkefølge, atskilt med kommaer, skrev vi verdiene vi ønsker å sette inn.

Etter INSERT-setningen skrev jeg en SELECT-setning og skilte dem med en GO-setning.

La oss nå forestille oss at vi må legge til noen få linjer. Vi vil skrive følgende forespørsel om dette.

INSERT INTO TestTable(Produktnavn, Pris) VERDIER ("Datamaskin", 100), ("Tastatur", 20), ("Monitor", 50) GÅ VELG * FRA testtabell


Eksempel 2 - Legge til nye rader i en tabell ved hjelp av en SELECT-spørring

Svært ofte er det behov for å legge til mye data i en tabell, for eksempel basert på en utvalgsspørring, dvs. PLUKKE UT. For å gjøre dette, i stedet for VERDIER, trenger vi bare å spesifisere forespørselen.

INSERT INTO TestTable(ProductName, Price) SELECT ProductName, Price FROM TestTable WHERE Id >


I dette eksemplet skrev vi en SELECT-spørring som returnerer data fra TestTable-tabellen, men ikke alt, men bare de med en ID større enn 2. Og resultatet ble satt inn i den samme TestTable-tabellen.

Som et eksempel på hvordan du kan legge til poster i en tabell uten å spesifisere en liste over kolonner, la oss skrive en annen datainnsettingsspørring som vil gjøre nøyaktig det samme som spørringen ovenfor, bare den vil ikke vise kolonnene som skal settes inn.

INSERT I TestTable VELG produktnavn, pris FRA testtabell HVOR ID > 2 GÅ VELG * FRA testtabell


I dette tilfellet er vi sikre på at i TestTable-tabellen er den første kolonnen Produktnavn, og den andre er Pris, så vi har råd til å skrive det på den måten. Men igjen, i praksis er det bedre å spesifisere en liste over kolonner.

Hvis du la merke til, i alle eksemplene spesifiserte jeg ikke Id-kolonnen, men vi har den, ingen feil oppstod, siden denne kolonnen har IDENTITY-egenskapen, genererer den automatisk identifikatorer, så å sette inn data i en slik kolonne kan ganske enkelt ikke gjøres.

Eksempel 3 - Legge til nye poster i en tabell ved hjelp av en lagret prosedyre

La oss nå sette inn dataene i tabellen som den lagrede prosedyren vil returnere til oss. Betydningen her er den samme, i stedet for VERDIER, og i stedet for en forespørsel angir vi et prosedyrekall. Men som du forstår, må rekkefølgen og antallet kolonner som returneres av prosedyren strengt tatt samsvare med listen over kolonner som skal settes inn ( selv om kolonnelisten ikke er spesifisert).

INSERT INTO TestTable(Produktnavn, Pris) EXEC-testprosedyre GO SELECT * FRA TestTable


Jeg håper dette materialet hjalp deg med å forstå instruksjonene. SETT INN I, og det er alt jeg har for nå!