Senaste uppdateringen: 13.07.2017
För att lägga till data används kommandot INSERT, som har följande formella syntax:
INFOGA tabellnamn [(kolumnlista)] VÄRDEN (värde1, värde2, ... värdeN)
I början finns en INSERT INTO-sats, sedan inom parentes kan du ange en lista med kolumner, separerade med kommatecken, i vilka data ska läggas till, och i slutet, efter ordet VALUES, inom parentes, värdena som ska läggas till för kolumnerna är listade.
Låt oss till exempel säga att följande databas skapades tidigare:
SKAPA DATABAS productsdb; GÅ ANVÄND productsdb; SKAPA TABELL Produkter (Id INT IDENTITET PRIMÄRNYCKEL, Produktnamn NVARCHAR(30) NOT NULL, Tillverkare NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Pris PENGAR INTE NULL)
Låt oss lägga till en rad med kommandot INSERT:
INFOGA produkter VÄRDEN ("iPhone 7", "Apple", 5, 52000)
Efter framgångsrikt slutförande av SQL Server Management Studio bör visa "1 rad(er) påverkade" i meddelanderutan:
Observera att värdena för kolumnerna inom parentes efter nyckelordet VALUES skickas i den ordning som de deklareras. Till exempel, i CREATE TABLE-satsen ovan kan du se att den första kolumnen är Id. Men eftersom IDENTITY-attributet är inställt för det, genereras värdet för denna kolumn automatiskt och det kan utelämnas. Den andra kolumnen representerar ProductName, så det första värdet, strängen "iPhone 7", kommer att skickas till den kolumnen. Det andra värdet, strängen "Apple", kommer att skickas till den tredje kolumnen Tillverkare, och så vidare. Det vill säga värdena skickas till kolumnerna enligt följande:
Produktnamn: "iPhone 7"
Tillverkare: Apple
När du anger värden kan du också ange de omedelbara kolumnerna där värden kommer att läggas till:
INSERT INTO Products (produktnamn, pris, tillverkare) VÄRDEN ("iPhone 6S", 41000, "Apple")
Här anges värdet endast för tre kolumner. Och nu skickas värdena i kolumnernas ordning:
Produktnamn: "iPhone 6S"
Tillverkare: Apple
För ospecificerade kolumner (i det här fallet ProductCount) kommer att lägga till ett standardvärde om DEFAULT-attributet är inställt, eller NULL. Ospecificerade kolumner måste dock vara nullbara eller ha ett DEFAULT-attribut.
Vi kan också lägga till flera rader samtidigt:
INFOGA I PRODUKTS VÄRDEN ("iPhone 6", "Apple", 3, 36000), ("Galaxy S8", "Samsung", 2, 46000), ("Galaxy S8 Plus", "Samsung", 1, 56000)
I det här fallet kommer tre rader att läggas till i tabellen.
När vi lägger till kan vi också ange att standardvärdet används för kolumnen med nyckelordet DEFAULT eller NULL:
INFOGA I produkter (produktnamn, tillverkare, produktantal, pris) VÄRDEN ("Mi6", "Xiaomi", DEFAULT, 28000)
I det här fallet kommer standardvärdet att användas för kolumnen ProductCount (om det är inställt, om inte, då NULL).
Om alla kolumner har ett DEFAULT-attribut som definierar ett standardvärde, eller är nullbara, kan du infoga standardvärden för alla kolumner:
INFOGA I produkter STANDARDVÄRDEN
Men om du tar tabellen Produkter, kommer ett sådant kommando att misslyckas, eftersom flera fält inte har ett DEFAULT-attribut och samtidigt inte tillåter null-värden.
Ta bort poster
DELETE-satsen används för att ta bort poster från en tabell:
DELETE FROM tabellnamn WHERE-villkor;
Denna sats tar bort från de angivna tabellposterna (inte enskilda kolumnvärden) som uppfyller det angivna villkoret. Villkoret är booleskt uttryck, vars olika design diskuterades i tidigare labb.
Följande fråga tar bort poster från kundtabellen där värdet på kolumnen LName är "Ivanov":
RADERA FRÅN Kund
WHERE LName = "Ivanov"
Om tabellen innehåller information om flera klienter med efternamnet Ivanov, kommer alla att raderas.
WHERE-satsen kan innehålla en underfråga för att välja data (SELECT-satsen). Underfrågor i en DELETE-sats fungerar precis på samma sätt som de gör i en SELECT-sats. Följande fråga tar bort alla kunder från staden Moskva, med stadens unika identifierare returneras med hjälp av en underfråga.
RADERA FRÅN Kund
WHERE IdCity IN (VÄLJ IdCity FROM City WHERE CityName = "Moskva")
Transact-SQL utökar standard SQL genom att tillåta dig att använda en annan FROM-sats i en DELETE-sats. Denna tillägg, som anger en koppling, kan användas istället för en underfråga i WHERE-satsen för att ange raderna som ska tas bort. Det låter dig ställa in data från den andra FROM och ta bort motsvarande rader från tabellen i den första FROM-satsen. I synnerhet kunde den tidigare frågan skrivas om enligt följande
RADERA FRÅN Kund
FRÅN Kund k INNER JOIN
Operationen att ta bort poster från en tabell är farlig i den meningen att den är förknippad med risken för oåterkallelig dataförlust i händelse av semantiska (men inte syntaktiska) fel i formuleringen av SQL-satsen. För att undvika problem, innan du tar bort poster, rekommenderas det att du först kör lämplig urvalsfråga för att se vilka poster som kommer att raderas. Så, till exempel, innan exekvering av raderingsfrågan som diskuterades tidigare, skulle det inte skada att köra motsvarande urvalsfråga.
VÄLJ*
FRÅN Kund k INNER JOIN
Stad c PÅ k.IdCity = c.IdCity OCH c.CityName = "Moskva"
För att ta bort alla poster från en tabell, använd bara DELETE-satsen utan nyckelordet WHERE. Samtidigt sparas själva tabellen med alla kolumner definierade i den och är redo att infoga nya poster. Till exempel tar följande fråga bort poster för alla produkter.
RADERA FRÅN produkt
Uppgift för självständigt arbete: Formulera på SQL-språk en begäran om att radera alla beställningar som inte innehåller några varor (dvs alla tomma beställningar).
Ändringsbegäranden används för att lägga till (INSERT INTO), ta bort (DELETE) och uppdatera (UPDATE) poster i tabeller.
Kommandot INSERT INTO kan användas för att lägga till en eller flera poster i slutet av en tabell.
Syntaxen för kommandot INSERT INTO är följande:
INSERT INTO Table_Name [(Field_Name)] VÄRDEN (Data_Values);
Låt oss till exempel lägga in en post i tabellen "Grupper" som innehåller data (1, BF-16a, 1, 1) i motsvarande kolumner (Grupp-ID, Namn, Kurs, Semester).
För denna begäran i formatet:
INFOGA I grupper (Gruppkod, Namn, Kurs, Termin) VÄRDEN (1, BF-16a, 1, 1);
vi kommer att ange det på frågeformuläret genom att utföra kommandot "Frågebyggare" på fliken "Skapa", i läget "SQL-läge" från menyn Visa.
Vi sparar frågan med namnet "Add_1_records". Som ett resultat kommer ett icke-relaterat objekt att visas i "Navigation Area" - "Add_1_records" (Fig.1.).
Ris. 1.
När du har sparat frågan måste du utföra denna fråga genom att klicka på ikonen "Kör". Som ett resultat av att utföra kommandot "Add_1_records" kommer den första posten att visas i den tomma tabellen (Fig. 2.)
Ris. 2.
Kommandot UPDATE är avsett att modifiera redan befintliga poster i tabellens kolumner, vilket gör att du kan uppdatera värdena i tabellens givna kolumner.
Syntaxen för kommandot UPDATE är följande:
UPPDATERA Table_Name SET Column_Name = New_Value WHERE Filter_Condition;
SET-satsen specificerar namnen på de kolumner vars data behöver ändras. WHERE-satsen är valfri, men den kan bara peka på raderna i kolumnerna (tabellerna) som behöver uppdateras.
Låt oss skapa en fråga för att ändra en post i tabellen "Grupper" i databasen sql_training_st.mdb.
Låt oss till exempel ändra en redan befintlig post för det första nyckelfältets ID i kolumnen "Namn" i tabellen "Grupper".
Begäran i formatet:
UPPDATERA grupper SET Name="BF-16b" WHERE ID=1;
Vi sparar frågan med namnet "Change_record_1". Som ett resultat kommer ett objekt att dyka upp i "Navigation Area" - "Change_record_1" (Fig. 3.).
Ris. 3.
När du har sparat frågan måste du utföra denna fråga genom att klicka på ikonen "Kör". Som ett resultat av att utföra kommandot Change_Record_1 kommer en dialogruta att visas där du måste ange värdet på parametern ID=1 och klicka på OK. Efter dessa åtgärder i tabellen "Grupper" kommer inmatningen i fältet "Namn" att ändras från BF-16a till BF-16b (Fig. 4.).
Ris. 4.
Kommandot DELETE är utformat för att ta bort poster från en tabell.
Format för begäran om att radera poster:
DELETE FROM Table_Name WHERE Selection_Condition;
Låt oss skapa en fråga för att ändra en post i tabellen "Grupper" i databasen sql_training_st.mdb.
Låt oss till exempel ta bort den befintliga posten för det första nyckelfältets ID i alla kolumner (fält) i tabellen "Grupper".
För denna begäran i formatet:
DELETE FROM Groups WHERE ID=1;
skapa på frågeformuläret genom att utföra kommandot "Frågedesigner" på fliken "Skapa" i läget "SQL-läge" från menyn Visa.
Vi sparar frågan med namnet "Delete_record_1". Som ett resultat kommer ett objekt att dyka upp i "Navigation Area" - "Delete_record_1" (Fig. 5.).
Ris. 5.
När du har sparat frågan måste du utföra denna fråga genom att klicka på ikonen "Kör". Som ett resultat av att utföra kommandot "Delete_record_1" kommer en dialogruta att visas där du måste ange värdet för parametern ID=1 och klicka på OK. Efter dessa steg öppnas en dialogruta "Bekräfta borttagning av poster". Efter bekräftelse i tabellen "Grupper" kommer uppgifterna i alla fält att raderas, d.v.s. posten raderas (fig. 6.).
Ris. 6.
Det bör noteras att för att radera data i specifika fält i tabellen, är det lämpligt att använda kommandot UPDATE och ersätta värdena i de obligatoriska fälten med Null. Om det är nödvändigt att ta bort tabellen som helhet, ska DROP TABLE-satsen användas (syntaxen för satsen är: DROP TABLE TableName;).
Låt oss återställa den första posten i tabellen "Grupper" genom att utföra kommandot "Add_1_records", som ett resultat kommer vi att återställa den första posten (Fig. 7.).
Ris. 7.
Allmän syntax:
a) infoga en ny rad i tabellen:
FÖRA IN<таблица>[(kolumner)]
VÄRDEN
b) Infoga en eller flera rader från källan som anges i underfrågan i tabellen:
FÖRA IN<таблица>[(kolumner)]
Regler:
Antalet objekt i sektionen Kolumner måste matcha antalet artiklar i sektionen Värden; datatyper måste matcha eller tillåta implicit konvertering;
I fallet där avsnittet "Kolumner" saknas, måste avsnittet "Värden" innehålla lika många värden som det finns totala kolumner i den redigerade tabellen, dessutom måste värdena listas i samma ordning som tabellkolumnerna deklareras; därför rekommenderas att alltid explicit specificera listan över kolumner till vilka nya värden kommer att läggas till;
I fallet med syntax (b) kan SELECT-underfrågan adresseras antingen till samma tabell eller till en annan databastabell eller till en annan databas på servern;
Om ett standardvärde är inställt för någon kolumn i tabellen, och det krävs att detta värde används i den tillagda posten, måste du skriva i avsnittet "Värden" för denna kolumn nyckelord STANDARD.
Exempel :
INFOGA INTO detalj (detaljnamn)
VÄRDEN ("lager")
INSERT INTO supply (leverantörs-id, supply_quantity, supply_cost,
supply_date, detail_id)
VÄRDEN (4, 177, 453,45, "9/25/2009", 1)
INFOGA leverantör (leverantörstyp, leverantörsnamn)
VÄRDEN (STANDARD, "Smirnov S. S.")
Allmän syntax:
UPPDATERING<таблица>
UPPSÄTTNING<столбец> = <значение> [, <столбец> = <значение>]
Exempel :
SET vikt = 210
SET material_name = "Tin"
WHERE material_id = 2
SET department_id = NULL,
leveransdatum = leveransdatum + 1 /*öka leveransdatumet med en dag
WHERE delivery_id = 1 ELLER department_id > 3
SET detalj_namn = detalj_namn + "!!!"
WHERE detail_name SOM "_а%" OCH vikt MELLAN 6 OCH 10
Allmän syntax:
RADERA<таблица>
<условие>
Exempel :
WHERE detail_id IN (2, 5, 8)
DÄR vikten ÄR NULL
Träning:
Fyll i databasen med ManagementStudio. För att göra detta, använd kommandot "Öppna tabell" i snabbmenyn i tabellen i "Objektbläddraren" (Fig. 4.1).
VÄLJ<список столбцов>
FRÅN<таблица(-ы) источник>
SELECT- och FROM-satser måste finnas i varje fråga; andra avsnitt kan saknas eller delvis finns.
De enklaste frågorna:
1. Välj namn och vikt på delarna
Ris. 5.1. Resultat för fråga #1
2. Välj all information från materialtabellen
Ris. 5.2. Resultat av fråga #2
Det unika med DISTINCT
3. Välj unika leverantörskoder från leveranstabellen
Ris. 5.3. Resultat av fråga #3
VAR begränsning
4. Välj kvantitet och leveransdatum för delen med kod 1
Ris. 5.4. Resultat för fråga #4
5. Välj leverantörsnamn med koderna 1, 4 och 6
Ris. 5.5. Resultat av fråga #5
6. Välj all information om leveranser gjorda före 2009-10-1
Ris. 5.6. Resultat av fråga #6
7. Välj all delinformation som inte börjar med bokstaven "B" (i alla fall) och vars vikt är mindre än 50
Ris. 5.7. Resultat av fråga #7
8. Välj namn och kod för materialet för delar med en vikt på 5 till 10 g eller med bokstaven "n" i namnet i den tredje positionen
Ris. 5.8. Resultat av fråga #8
9. Välj leverantörsnamn som inte är längre än 15 tecken
Ris. 5.9. Resultat av fråga #9
10. Välj månader och år av reservdelar
Ris. 5.10. Resultat av fråga #10
Sorterar BESTÄLL EFTER
11. Beställ leveranser först efter leverantörskod och sedan efter leveransdatum
Ris. 5.11. Resultat av fråga #11
12. Välj namnen på leverantörer med koderna 4, 6, 8, 9, sorterade alfabetiskt i omvänd ordning
Ris. 5.12. Resultat av fråga #12
Aggregation och gruppering GRUPP EFTER
Ris. 5.13. Resultat av fråga #13
14. Bestäm medelvikten för delar gjorda av material med kod 2
Ris. 5.14. Resultat av fråga #2
15. Välj den största leveransen och den minsta av leveranserna före 10/1/2009
Ris. 5.15. Resultat av fråga #15
16. För leverantörer med koder i intervallet 5 - 8, beräkna det totala antalet delar som tillhandahålls av dem
Ris. 5.16. Resultat av fråga #16
Ris. 5.17. Resultat av fråga #17
HA grupperingsbegränsning
18. Välj material för vilka den totala vikten av delar gjorda av dem inte är mer än 20
Ris. 5.18. Resultat av fråga #18
19. Från leveranserna 2008, välj de delar som levererades mer än en gång
Ris. 5.19. Resultat av fråga #19
TypkonverteringKASTA
20. Få information om leveransdatum i textform
Ris. 5,20. Resultat av fråga #20
21. Få information från deltabellen som strängar "Del X har vikt Y"
Ris. 5.21. Resultat av fråga #21
AlternativFALL
22. Dela in delar i lätta (väger upp till 20), medium (mellan 20 och 50) och tunga
Ris. 5.22. Resultat av fråga #22
Hantera NULL-värden
23. Få information om detaljerna och deras vikter, och om vikten inte anges för delen, skriv -100 istället för NULL
Ris. 5.23. Resultat av fråga #23
Existensfunktion FINNS
24. Välj endast namn och materialkod för de delar som någonsin har levererats
Ris. 5.24. Resultat av fråga #24
25. Välj namnen på de material som inte en enda del är gjord av
Ris. 5,25. Resultat av fråga #25
Underfrågor
26. Få information om den senaste (efter datum) leverans
Ris. 5,26. Resultat av fråga #26
27. Få alla leveranser av delar från materialkod 2
Ris. 5,27. Resultat av fråga #27
28. För varje leverantör, få information om det allra första (efter datum) för dess leverans
Ris. 5,28. Resultat av fråga #28
29. För varje leverantör, få hans namn och datum för den senaste beställningen
Ris. 5,29. Resultat av fråga #29
GÅ MED tabeller
30. Få en tabell över vyn: namnet på delen, namnet på materialet som denna del är gjord av
Ris. 5.30. Resultat av fråga #30
31. Få en tabell över formuläret: leverantör, artikelnamn, kvantitet och leveransdatum för delar som har en specificerad vikt
Ris. 5,31. Resultat av fråga #31
32. Välj all information om de delar som någonsin har levererats
Ris. 5,32. Resultat av fråga #32
Ris. 5,33. Resultat av fråga #33
34. Välj namn på material och delar gjorda av dem
Ris. 5,34. Resultat av fråga #34
35. Få all data om leverantörer, leveranser och detaljer
Ris. 5,35. Resultat av fråga #35
Gå med i UNION-bord
36. Få en tabell med namn och vikter på delar, och den sista raden i tabellen bör innehålla totaler i form av den totala vikten av alla delar
Ris. 5,36. Resultat av fråga #36
37. Få en tabell med två fält, där det första fältet är namnet på delen, materialet, leverantören eller leveransdatum, och det andra fältet är längden på strängen från det första fältet
Ris. 5,37. Resultat av fråga #37
Den här artikeln ägnas åt att fylla databastabeller med data, det vill säga vi kommer att studera SQL-kommandon för att infoga nya poster. Det bör sägas att skriva till bordet kan göras på två sätt:
Metod nummer 1.
Låt oss försöka lägga till ett nytt land i tabellen över länder. Syntaxen för att lägga till skulle vara:
INSERT INTO table_name (field_1, field_2, ...) VALUES (Value_1, Value_2, ...); Baserat på vår tabellstruktur skulle SQL-frågan vara:
INSERT INTO länder (country_name, akronym_name) VALUES ("Ryssland", "RU"); Så här skrev vi in en post om landet "Ryssland" i vår tabell. Allt ska vara tydligt och enkelt här, det viktigaste är att noggrant titta på vilka fält du anger i de första parenteserna, och skriv värdena i den andra parentesen i samma ordning.
Metod nummer 2.
Det andra sättet, enligt mig, är lite lättare, eftersom du ser vilket och vilket fält du tilldelar. Tro mig, om tabellen har ett stort antal kolumner, är det mycket lätt att förvirra eller förbise ordningen på fälten i den första och ordningen på värdena i den andra parentesen. Syntaxen för den andra metoden är:
INSERT INTO tabellnamn SET field_1 = value_1, field_2 = value_2, ... ; Låt oss använda det här exemplet för att ange lite information på plattan personer, eftersom det finns fler fält, och fördelen med den andra metoden kommer omedelbart att märkas:
INSERT INTO persons SET first_name="Ivan", last_name="Dulin", registration_date="2012-06-14", country="1"; Nu har vår tabell följande data:
Du har säkert märkt att vi inte angav ett värde för ålder, men det visade sig vara ifyllt ... Allt stämmer - för givet fält vi sätter standard till 25. Så nu är vår Ivan Dulin listad i databasen som 25 år gammal. Det kanske inte är det bästa exemplet att göra ett standardvärde för åldersfältet, men du kan ställa in egenskaper på sådana fält som till exempel betyget för användaren av webbplatsen eller antalet sidvisningar. De är initialt inställda på 0.
Du bör också vara uppmärksam på datumformatet i MySQL: ÅÅÅÅ-MM-DD. Om du inte följer det, kommer dina poster helt enkelt inte att inkluderas i tabellen.
Som du kan se är yrkesfältet ifyllt som NULL, det här är tomt värde. För det här fältet anger vi egenskapen "inte krävs att fylla (NULL)".
Som ett tillägg, överväg följande kommando:
LADDA DATA LOKAL INFIL "D:\zapros.txt" I TABELL personer; Vad tror du att vi har gjort nu?! Och vi gjorde följande: vi lade till data i tabellen personer från en fil request.txt, som finns på enhet D. Informationen i filen måste ha följande struktur:
Yrkestabell:
personers bord:
förnamn | efternamn | ålder | Registrerings datum | Land | yrke |
Leonid | Bilak | 45 | 2012-06-20 | 2 | 1 |
Yuri | Nazarov | 22 | 2012-06-21 | 3 | 1 |
Alla | Savenko | 25 | 2012-06-22 | 2 | 3 |
Irina | Nikolaeva | 31 | 2012-06-22 | 1 | 3 |