Grunnleggende om T-SQL. DML. Transact-SQL - datainnsetting Database demoversjon

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 dekker INSERT-setningen, og de to andre setningene dekkes 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 kolonnene 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 NULL-verdier 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 ny linje. 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å deres rekkefølge 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 blir det bedt om å velge nummer og navn på avdelinger i Moskva, og det resulterende resultatsettet lastes inn i nytt bord, 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.

Hei alle sammen! Denne artikkelen vil diskutere hvordan du kan legge til data i tabellen hos Microsoft SQL Server Hvis du allerede er i det minste litt kjent med T-SQL-språket, så har du sannsynligvis skjønt 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 instruksen kan brukes både til å legge til en enkelt rad i en tabell og til å sette inn massedata. 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 å hente 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 den returnere data fra den nyopprettede TestTable-tabellen.

Merk!

Som du forstår, innebærer det å lese dette materialet å ha litt kunnskap om T-SQL språk, 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 SELECT-setning og atskilt dem av GO-teamet.

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 i dette eksemplet vi skrev VELG spørring, som returnerer data fra TestTable-tabellen, men ikke alle, men bare de med en identifikator 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


Håp, dette materialet hjalp deg med å forstå instruksjonene SETT INN I, og det er alt jeg har for nå!

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 av 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 hjelp av 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 denne linjen vil ikke bli lagt til.

3. Legge til valgte data

I forrige eksempel 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, Selger_navn, 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.

Sist oppdatert: 13.07.2017

For å legge til data, bruk INSERT-kommandoen, som har følgende formelle syntaks:

INSERT tabellnavn [(kolonne_liste)] VERDIER (verdi1, verdi2, ... verdiN)

Først kommer uttrykket INSERT INTO, deretter i parentes kan du angi en kommaseparert liste over kolonner som data skal legges til, og på slutten, etter ordet VALUES, er verdiene som skal legges til for kolonnene oppført i parenteser.

Anta for eksempel at følgende database tidligere ble opprettet:

LAG DATABASE produkterdb; GÅ BRUK produkterdb; LAG TABELL Produkter (ID INT IDENTITET PRIMÆR NØKKEL, Produktnavn NVARCHAR(30) NOT NULL, Produsent NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Pris PENGER IKKE NULL)

La oss legge til en linje ved å bruke INSERT-kommandoen:

INSERT PRODUKTVERDIER ("iPhone 7", "Apple", 5, 52000)

Etter vellykket kjøring i SQL Server Management Studio, skal meldingen "1 rad(er) berørt" vises i meldingsfeltet:

Det er verdt å vurdere at verdiene for kolonnene i parentes etter søkeord VERDIER sendes i den rekkefølgen de er deklarert. For eksempel, i CREATE TABLE-setningen ovenfor, kan du se at den første kolonnen er Id. Men siden IDENTITY-attributtet er spesifisert for det, genereres verdien av denne kolonnen automatisk og kan utelates. Den andre kolonnen representerer ProductName, så den første verdien, strengen "iPhone 7", vil bli sendt til den kolonnen. Den andre verdien - strengen "Apple" vil bli sendt til den tredje kolonnen Produsent og så videre. Det vil si at verdiene sendes til kolonnene som følger:

    Produktnavn: "iPhone 7"

    Produsent: "Apple"

Når du legger inn verdier, kan du også spesifisere de umiddelbare kolonnene som verdiene skal legges til:

INSERT INTO Products (produktnavn, pris, produsent) VERDIER ("iPhone 6S", 41000, "Apple")

Her er verdien spesifisert for kun tre kolonner. Dessuten overføres verdiene nå i rekkefølgen av kolonnene:

    Produktnavn: "iPhone 6S"

    Produsent: "Apple"

For uspesifiserte kolonner (i dette tilfellet ProductCount), vil en standardverdi legges til hvis DEFAULT-attributtet er spesifisert, eller en NULL-verdi. Uspesifiserte kolonner må imidlertid være nullbare eller ha et DEFAULT-attributt.

Vi kan også legge til flere linjer samtidig:

SETTE INN I PRODUKTVERDIER ("iPhone 6", "Apple", 3, 36000), ("Galaxy S8", "Samsung", 2, 46000), ("Galaxy S8 Plus", "Samsung", 1, 56000)

I dette tilfellet vil tre rader legges til i tabellen.

Når vi legger til, kan vi også spesifisere at kolonnen skal ha en standardverdi ved å bruke nøkkelordet DEFAULT, eller en NULL-verdi:

INSERT INTO Products (ProductName, Manufacturer, ProductCount, Price) VERDIER ("Mi6", "Xiaomi", DEFAULT, 28000)

I dette tilfellet vil standardverdien for ProductCount-kolonnen brukes (hvis den er satt, hvis den ikke er det, så NULL).

Hvis alle kolonner har et DEFAULT-attributt som spesifiserer en standardverdi, eller er nullbare, kan du sette inn standardverdier for alle kolonner:

SETT INN I produkter STANDARDVERDIER

Men hvis vi tar Produkttabellen, vil en slik kommando mislykkes med en feil, siden flere felt ikke har DEFAULT-attributtet og samtidig ikke tillater NULL-verdien.

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".