En illustrerad självstudieguide till SQL för nybörjare. Kategoriarkiv: Böcker om SQL sql-programmeringsspråket för dummies

Från författaren: Har du blivit kallad tekanna? Nåväl, det här går att fixa! Varje samovar var en gång en tekanna! Eller var varje proffs en gång en samovar? Nej, igen är något fel! Allt som allt är MySQL för nybörjare.

Varför dummies behöver MySQL

Om du på allvar ska koppla ihop ditt liv med Internet, kommer du vid de allra första stegen i "webben" att stöta på detta DBMS. MySQL kan säkert kallas "hela Internet" databashanteringssystem. Inte en enda mer eller mindre seriös resurs kan klara sig utan den, den finns i administratörspanelen för varje värd. Och mest av allt populära CMS och till och med egentillverkade motorer byggs med hennes deltagande.

I allmänhet kan du inte klara dig utan denna plattform. Men för att studera det behöver du också rätt tillvägagångssätt, rätt verktyg och viktigast av allt, lust och tålamod. Jag hoppas att du har gott om det sistnämnda. Och var beredd på det faktum att dina hjärnor kommer att koka och ånga kommer att ramla ut ur ditt huvud, som från en riktig tekanna

Men MySQL är så svårt för dummies bara om du börjar lära dig det fel. Vi kommer inte att göra ett sådant misstag, och vi kommer att börja vår bekantskap med denna teknik från första början.

Grundläggande koncept

Låt oss först gå igenom de grundläggande begreppen som vi kommer att nämna i det här inlägget:

Databas (DB) är den huvudsakliga ingående enheten i DBMS. Databasen innehåller tabeller som består av kolumner och poster (rader). Cellerna som bildas i skärningspunkten innehåller strukturerad data av en viss typ.

DBMS (databashanteringssystem) - en uppsättning av alla programvarumoduler för databasadministration.

SQL är ett strukturerat frågespråk, med hjälp av vilket utvecklaren "kommunicerar" med kärnan (servern) i DBMS. Som alla programmeringsspråk har SQL sin egen syntax, uppsättning kommandon och operatorer, datatyper som stöds.

Jag tror att vi har tillräckligt med teoretisk kunskap till att börja med. Vi kommer att "måla" de saknade luckorna i teorin med praktiken. Nu återstår bara att välja rätt mjukvaruverktyg.

Att hitta rätt verktyg

Efter att ha "rotsat" ganska mycket i hela utbudet av MySQL-skal för nybörjare, insåg jag att dessa helt enkelt inte existerar. Alla mjukvaruprodukter för DBMS-administration kräver en redan installerad databasserver. I allmänhet bestämde jag mig än en gång för att inte återuppfinna "skotern", och valde det inhemska Denwer-paketet. Du kan ladda ner den på den officiella webbplatsen.

Den innehåller redan alla komponenter i DBMS, vilket gör att en nybörjare kan börja praktiskt bekanta sig med MySQL direkt efter en enkel och begriplig installation. Dessutom innehåller Denwer flera andra verktyg som är nödvändiga för en nybörjare: lokal server, PHP.

Första stegen

Jag kommer inte att beskriva installationsprocessen för "herrarnas" set, eftersom allt sker automatiskt där. Efter att ha startat installationen har du bara tid att trycka på de nödvändiga tangenterna. Precis vad du behöver i dummyversionen av MySQL.

När installationsprocessen är över, starta den lokala servern, vänta ett par sekunder. Efter det skriver du localhost i adressfältet i din webbläsare.

På sidan "Hurra, det funkar!" följ en av länkarna på bilden. Därefter kommer du att tas till phpMyAdmin - ett skal för databasadministration.

Genom att klicka på länken http://downloads.mysql.com/docs/world.sql.zip laddar du ner en provdatabas från den officiella MySQL-webbplatsen. Gå till phpMyAdmin igen, i huvudmenyn högst upp gå till fliken "Importera". I fönstret "Importera till aktuell" i det första avsnittet ("Fil som ska importeras") ställer du in värdet "Bläddra i din dator".

I utforskarfönstret väljer du arkivet med den nedladdade exempeldatabasen. Glöm inte att klicka på "Ok" längst ner i huvudfönstret.

Jag råder dig att inte ändra de angivna parametervärdena för nu. Detta kan leda till felaktig visning av data från den importerade källan. Om phpMyAdmin ger ett felmeddelande att den inte kan känna igen databaskomprimeringsalgoritmen, packa upp den och upprepa hela importprocessen från början.

Om allt gick bra, kommer programmeddelandet att visas högst upp att importen lyckades, och till vänster i DB-listan finns ett annat (ord).

Låt oss titta på dess struktur från insidan så att du tydligare kan föreställa dig vad du kommer att behöva ta itu med.

Klicka på namnet på MySQL Database for Beginners. En lista över tabeller som den består av kommer att visas under den. Klicka på en av dem. Gå sedan till toppmenyn "Struktur". Huvudarbetsområdet visar tabellens struktur: alla kolumnnamn, datatyper och alla attribut.

Denna handledning är ungefär en "stämpel av mitt minne" för SQL-språket (DDL, DML), dvs. detta är information som har samlats på mig under min yrkesverksamhet och som ständigt lagras i mitt huvud. Detta är ett tillräckligt minimum för mig, vilket används oftast när man arbetar med databaser. Om det blir nödvändigt att använda mer kompletta SQL-konstruktioner, vänder jag mig vanligtvis till MSDN-biblioteket som finns på Internet för att få hjälp. Enligt mig är det väldigt svårt att hålla allt i huvudet, och det finns inget särskilt behov av detta. Men det är mycket användbart att känna till de grundläggande konstruktionerna, eftersom de är tillämpliga i nästan samma form i många relationsdatabaser som Oracle, MySQL, Firebird. Skillnaderna finns främst i datatyper, som kan skilja sig i detalj. Det finns inte så många grundläggande konstruktioner av SQL-språket, och med konstant övning kommer de snabbt ihåg. Till exempel, för att skapa objekt (tabeller, begränsningar, index, etc.) räcker det att ha en textredigerare för miljön (IDE) till hands för att arbeta med databasen, och det finns inget behov av att studera visuella verktyg som är vässade för arbetar med en specifik typ av databas (MS SQL, Oracle, MySQL, Firebird, ...). Det är också bekvämt eftersom all text ligger framför dina ögon och du behöver inte gå igenom flera flikar för att skapa till exempel ett index eller en begränsning. Med konstant arbete med en databas är det många gånger snabbare att skapa, ändra och speciellt återskapa ett objekt med hjälp av skript än om det görs i visuellt läge. Också i skriptläget (i enlighet därmed, med vederbörlig försiktighet) är det lättare att ställa in och kontrollera reglerna för namngivning av objekt (min subjektiva åsikt). Dessutom är skript bekväma att använda när ändringar som görs i en databas (till exempel en test) måste överföras i samma form till en annan (produktiv) databas.

SQL-språket är uppdelat i flera delar, här kommer jag att diskutera de 2 viktigaste delarna av det:
  • DML - Data Manipulation Language, som innehåller följande konstruktioner:
    • SELECT - dataval
    • INSERT - infogar ny data
    • UPPDATERING - datauppdatering
    • DELETE - raderar data
    • MERGE - datasammanfogning
Eftersom Jag är en praktiker, det kommer att finnas lite teori som sådan i denna handledning, och alla konstruktioner kommer att förklaras med praktiska exempel. Dessutom tror jag att ett programmeringsspråk, och speciellt SQL, bara kan bemästras i praktiken, genom att du själv känner på det och förstår vad som händer när du utför den eller den konstruktionen.

Denna handledning är baserad på steg för steg-principen, dvs. det är nödvändigt att läsa den sekventiellt och helst omedelbart efter exemplen. Men om du under vägen har ett behov av att lära dig mer om ett kommando mer detaljerat, använd då en specifik sökning på Internet, till exempel i MSDN-biblioteket.

När jag skrev denna handledning användes MS SQL Server-databasversionen 2014, för att exekvera skripten använde jag MS SQL Server Management Studio (SSMS).

Kort om MS SQL Server Management Studio (SSMS)

SQL Server Management Studio (SSMS) är ett verktyg för Microsoft SQL Server för att konfigurera, hantera och administrera databaskomponenter. Det här verktyget innehåller en skriptredigerare (som vi huvudsakligen kommer att använda) och ett grafiskt program som fungerar med serverobjekt och inställningar. Huvudverktyget i SQL Server Management Studio är Object Explorer, som låter användaren visa, hämta och manipulera serverobjekt. Denna text är delvis lånad från Wikipedia.

För att skapa en ny skriptredigerare, använd knappen Ny fråga:

För att ändra den aktuella databasen kan du använda rullgardinsmenyn:

För att utföra ett specifikt kommando (eller en grupp av kommandon), välj det och tryck på knappen Execute eller F5-tangenten. Om det bara finns ett kommando i editorn för tillfället, eller om du behöver utföra alla kommandon, behöver du inte välja någonting.

Efter att ha kört skript, särskilt de som skapar objekt (tabeller, kolumner, index), för att se ändringarna, använd uppdateringen från snabbmenyn genom att välja lämplig grupp (till exempel tabeller), själva tabellen eller kolumngruppen i den.

Egentligen är detta allt vi behöver veta för att utföra exemplen som ges här. Resten av SSMS-verktyget är lätt att lära sig på egen hand.

Lite teori

En relationsdatabas (RDB, eller vidare i sammanhanget enbart en databas) är en samling tabeller som är sammankopplade. Grovt sett är en databas en fil där data lagras i en strukturerad form.

DBMS - Management System för dessa databaser, dvs. det är en uppsättning verktyg för att arbeta med en specifik typ av databas (MS SQL, Oracle, MySQL, Firebird, ...).

Notera
Eftersom i livet, i vardagligt tal, säger vi mest: "Oracle DB", eller till och med bara "Oracle", som egentligen betyder "Oracle DBMS", då i samband med denna handledning kommer termen DB ibland att användas. Av sammanhanget tror jag att det kommer att framgå vad det handlar om.

En tabell är en samling kolumner. Kolumner kan också kallas fält eller kolumner, alla dessa ord kommer att användas synonymt för att uttrycka samma sak.

Tabellen är huvudobjektet för RDB, all RDB-data lagras rad för rad i tabellens kolumner. Strängar, poster är också synonymer.

För varje tabell, såväl som för dess kolumner, ges namn, genom vilka de sedan nås.
Ett objektnamn (tabellnamn, kolumnnamn, indexnamn, etc.) i MS SQL kan ha en maximal längd på 128 tecken.

Som referens- i ORACLE-databasen kan objektnamn ha en maximal längd på 30 tecken. Därför måste du för en specifik databas utveckla dina egna regler för namngivning av objekt för att hålla dig inom gränsen för antalet tecken.

SQL är ett språk som låter dig köra frågor i en databas med hjälp av ett DBMS. I ett specifikt DBMS kan SQL-språket ha en specifik implementering (sin egen dialekt).

DDL och DML är en delmängd av SQL-språket:

  • DDL-språket används för att skapa och modifiera databasstrukturen, d.v.s. för att skapa / ändra / ta bort tabeller och länkar.
  • DML-språk tillåter manipulering av tabelldata, d.v.s. med hennes repliker. Det låter dig välja data från tabeller, lägga till ny data i tabeller och uppdatera och radera befintliga data.

Det finns två typer av kommentarer som kan användas i SQL (enradig och flerradig):

En rad kommentar
och

/ * kommentar med flera rader * /

Egentligen kommer detta att räcka för teorin.

DDL - Data Definition Language

Tänk till exempel en tabell med data om anställda, i vanlig form för en person som inte är programmerare:

I detta fall har tabellens kolumner följande namn: Personalnummer, fullständigt namn, Födelsedatum, E-post, Befattning, Avdelning.

Var och en av dessa kolumner kan karakteriseras av den typ av data den innehåller:

  • Personalnummer - heltal
  • Fullständigt namn - sträng
  • Födelsedatum - datum
  • E-post - sträng
  • Position - sträng
  • Avdelning - sträng
Kolumntyp är en egenskap som indikerar vilken typ av data en given kolumn kan lagra.

Till att börja med kommer det att räcka att bara komma ihåg följande grundläggande datatyper som används i MS SQL:

Menande MS SQL notation Beskrivning
Snöre med variabel längd varchar (N)
och
nvarchar (N)
Med siffran N kan vi ange maximal radlängd för motsvarande kolumn. Om vi ​​till exempel vill säga att värdet på kolumnen "namn" kan innehålla maximalt 30 tecken, måste vi ställa in det på typen nvarchar (30).
Skillnaden mellan varchar och nvarchar är att varchar lagrar strängar i ASCII-format, där ett tecken är 1 byte, medan nvarchar lagrar strängar i Unicode-format, där varje tecken är 2 byte.
Varchar-typen bör endast användas om du är 100 % säker på att fältet inte behöver lagra Unicode-tecken. Till exempel kan varchar användas för att lagra e-postadresser eftersom de innehåller vanligtvis bara ASCII-tecken.
Snöre med fast längd röding (N)
och
nchar (N)
Denna typ skiljer sig från en sträng med variabel längd genom att om strängen är mindre än N tecken lång, så är den alltid utfylld till höger till längden av N med mellanslag och lagras i databasen i denna form, d.v.s. den upptar exakt N tecken i databasen (där ett tecken upptar 1 byte för char och 2 byte för nchar). I min praktik används denna typ väldigt sällan, och om den används så används den främst i char (1)-formatet, dvs. när fältet definieras av ett tecken.
Heltal int Denna typ tillåter oss att endast använda heltal i kolumnen, både positiva och negativa. För referens (nu är detta inte så relevant för oss) - intervallet av nummer som int-typen tillåter är från -2 147 483 648 till 2 147 483 647. Vanligtvis är detta huvudtypen som används för att ställa in identifierare.
Verkligt eller verkligt tal flyta Enkelt uttryckt är dessa tal där en decimalkomma (komma) kan förekomma.
datum datum Om du bara behöver lagra datum i kolumnen, som består av tre komponenter: Antal, Månad och År. Till exempel 2014-02-15 (15 februari 2014). Denna typ kan användas för kolumnen "Antagningsdatum", "Födelsedatum" osv. i de fall då det är viktigt för oss att bara fixa datumet, eller när tidskomponenten inte är viktig för oss och kan kasseras eller om den inte är känd.
Tid tid Denna typ kan användas om endast tidsdata behöver lagras i en kolumn, d.v.s. Timmar, minuter, sekunder och millisekunder. Till exempel 17:38: 31.3231603
Till exempel den dagliga "Flight Departure Time".
datum och tid datum Tid Denna typ låter dig spara både datum och tid samtidigt. Till exempel, 15.02.2014 17:38: 31.323
Detta kan till exempel vara datum och tid för en händelse.
Flagga bit Denna typ är bekväm för att lagra värden som "Ja" / "Nej", där "Ja" kommer att lagras som 1 och "Nej" kommer att lagras som 0.

Dessutom får fältvärdet, om det inte är förbjudet, inte anges, för detta ändamål används nyckelordet NULL.

För att köra exemplen, låt oss skapa en testbas som heter Test.

En enkel databas (utan att ange ytterligare parametrar) kan skapas genom att köra följande kommando:

SKAPA DATABAS Test
Du kan ta bort databasen med kommandot (du bör vara mycket försiktig med detta kommando):

DROP DATABASE Test
För att byta till vår databas kan du köra kommandot:

ANVÄNDNING Test
Alternativt kan du välja Testdatabasen från rullgardinsmenyn i SSMS-menyområdet. När jag arbetar använder jag ofta denna metod för att växla mellan baser.

Nu i vår databas kan vi skapa en tabell med beskrivningarna som de är, med mellanslag och kyrilliska tecken:

SKAPA TABELL [Anställda] ([Personalnummer] int, [Fullständigt namn] nvarchar (30), [Födelsedatum] datum, nvarchar (30), [Position] nvarchar (30), [Avdelning] nvarchar (30))
I det här fallet måste vi lägga namnen inom hakparenteser [...].

Men i databasen, för större bekvämlighet, är det bättre att ange alla namn på objekt i det latinska alfabetet och inte använda mellanslag i namnen. I MS SQL, vanligtvis i det här fallet, börjar varje ord med en stor bokstav, till exempel för fältet "Personnelnummer" skulle vi kunna ange namnet PersonalNumber. Du kan också använda nummer i namnet, till exempel Telefonnummer1.

På en lapp
I vissa DBMS kan följande namnformat "PHONE_NUMBER" vara mer att föredra, till exempel används detta format ofta i ORACLE DB. När man specificerar fältnamnet är det naturligtvis önskvärt att det inte sammanfaller med nyckelorden som används i DBMS.

Av denna anledning kan du glömma syntaxen för hakparenteser och ta bort tabellen [Anställda]:

SLÄPP TABELL [Anställda]
Till exempel kan en tabell med anställda heta "Anställda", och dess fält kan namnges enligt följande:

  • ID - Personalnummer (medarbetar-ID)
  • Namn - fullständigt namn
  • Födelsedag - Födelsedatum
  • E-post - E-post
  • Position - Position
  • Avdelning - Avdelning
Mycket ofta används ordet ID för att namnge identifierarfältet.

Låt oss nu skapa vår tabell:

SKAPA TABELL Anställda (ID int, Namn nvarchar (30), Födelsedag, E-post nvarchar (30), Position nvarchar (30), Department nvarchar (30))
Du kan använda alternativet INTE NULL för att ange obligatoriska kolumner.

För en befintlig tabell kan fälten omdefinieras med följande kommandon:

Uppdaterar ID-fältet ALTER TABLE Anställda ALTER COLUMN ID int NOT NULL - uppdaterar fältet Namn ALTER TABLE Anställda ALTER COLUMN Namn nvarchar (30) NOT NULL

På en lapp
Det allmänna konceptet för SQL-språket för de flesta DBMS förblir detsamma (åtminstone kan jag bedöma detta utifrån de DBMS som jag har arbetat med). Skillnaden mellan DDL i olika DBMS:er ligger huvudsakligen i datatyper (här kan inte bara deras namn skilja sig, utan även detaljerna i deras implementering), detaljerna för implementeringen av SQL-språket kan också skilja sig något (dvs. kärnan i kommandon är desamma, men det kan finnas små skillnader i dialekten, tyvärr, men det finns ingen standard). Genom att känna till grunderna i SQL kan du enkelt byta från ett DBMS till ett annat, eftersom i det här fallet behöver du bara förstå detaljerna i implementeringen av kommandon i det nya DBMS, dvs. i de flesta fall räcker det med en enkel analogi.

Skapa tabell SKAPA TABELL Anställda (ID int, - i ORACLE, int-typ är motsvarande (omslag) för nummer (38) Namn nvarchar2 (30), - nvarchar2 i ORACLE motsvarar nvarchar i MS SQL Födelsedatum, E-post nvarchar2 (30) ) , Position nvarchar2 (30), Department nvarchar2 (30)); - uppdatering av ID- och Name-fälten (här används MODIFY (...) istället för ALTER COLUMN) ALTER TABLE Anställda MODIFIERA (ID int NOT NULL, Namn nvarchar2 (30) NOT NULL); - lägga till PK (i det här fallet ser konstruktionen ut som i MS SQL, den kommer att visas nedan) ALTER TABLE Anställda ADD CONSTRAINT PK_Employees PRIMARY KEY (ID);
För ORACLE finns det skillnader när det gäller implementering av typen varchar2, dess kodning beror på databasinställningarna och texten kan sparas till exempel i UTF-8-kodning. Dessutom kan fältlängden i ORACLE ställas in både i byte och i tecken, för detta används ytterligare alternativ BYTE och CHAR, som anges efter fältlängden, till exempel:

NAME varchar2 (30 BYTE) - fältkapaciteten kommer att vara 30 byte NAME varchar2 (30 CHAR) - fältkapaciteten kommer att vara 30 tecken
Vilket alternativ som kommer att användas som standard BYTE eller CHAR, i fallet med en enkel indikation av typen varchar2 (30) i ORACLE, beror på databasinställningarna, det kan ibland också ställas in i IDE-inställningarna. I allmänhet kan du ibland lätt bli förvirrad, så i fallet med ORACLE, om varchar2-typen används (och detta är ibland motiverat här, till exempel när du använder UTF-8-kodningen), föredrar jag att uttryckligen skriva CHAR ( eftersom det vanligtvis är bekvämare att läsa längden på en sträng med tecken ).

Men i det här fallet, om tabellen redan innehåller vissa data, måste fälten ID och Namn i alla rader i tabellen fyllas i för att kommandona ska kunna utföras framgångsrikt. Låt oss demonstrera detta med ett exempel, infoga data i tabellen i fälten ID, Position och Avdelning, detta kan göras med följande skript:

INFOGA Anställda (ID, Befattning, Avdelning) VÄRDEN (1000, N "Direktor", N "Administration"), (1001, N "Programmerare", N "IT"), (1002, N "Revisor", N "Redovisning" ), (1003, N "Senior Programmer", N "IT")
I det här fallet kommer kommandot INSERT också att generera ett fel, eftersom När vi infogade angav vi inte värdet för det obligatoriska namnfältet.
Om vi ​​redan hade dessa data i den ursprungliga tabellen, skulle kommandot "ALTER TABLE Employees ALTER COLUMN ID int NOT NULL" ha slutförts framgångsrikt, och kommandot "ALTER TABLE Employees ALTER COLUMN Name int NOT NULL" skulle ha genererat ett felmeddelande , att det finns NULL (ospecificerade) värden i fältet Namn.

Lägg till värden för fältet Namn och fyll i uppgifterna igen:


Alternativet INTE NULL kan också användas direkt när du skapar en ny tabell, dvs. i samband med kommandot CREATE TABLE.

Låt oss först ta bort tabellen med kommandot:

DROP TABLE Anställda
Låt oss nu skapa en tabell med obligatoriska kolumner ID och Namn:

SKAPA TABELL Anställda (ID int NOT NULL, Namn nvarchar (30) NOT NULL, Födelsedag, E-post nvarchar (30), Position nvarchar (30), Department nvarchar (30))
Du kan också skriva NULL efter namnet på kolumnen, vilket innebär att NULL-värden (ej specificerade) kommer att tillåtas i den, men detta är inte nödvändigt, eftersom denna egenskap antas som standard.

Om det tvärtom krävs att göra den befintliga kolumnen valfri för fyllning, använder vi följande kommandosyntax:

ALTER TABLE Anställda ALTER KOLUMN Namn nvarchar (30) NULL
Eller bara:

ALTER TABELL Anställda ALTER KOLUMN Namn nvarchar (30)
Med det här kommandot kan vi också ändra typen av fältet till en annan kompatibel typ, eller ändra dess längd. Låt oss till exempel utöka fältet Namn till 50 tecken:

ALTER TABLE Anställda ALTER KOLUMN Namn nvarchar (50)

Primärnyckel

När du skapar en tabell är det önskvärt att den har en unik kolumn eller en uppsättning kolumner som är unik för var och en av dess rader - en post kan identifieras unikt med detta unika värde. Detta värde kallas den primära nyckeln i tabellen. För vår tabell Anställda kan ett sådant unikt värde vara ID-kolumnen (som innehåller "Anställdas personalnummer" - även om detta värde i vårt fall är unikt för varje anställd och inte kan upprepas).

Du kan skapa en primärnyckel till en befintlig tabell med kommandot:

ALTER TABLE Anställda ADD CONSTRAINT PK_Employees PRIMÄRNYCKEL (ID)
Där "PK_Employees" är namnet på den begränsning som är ansvarig för primärnyckeln. Vanligtvis används prefixet "PK_" för att namnge primärnyckeln, följt av tabellnamnet.

Om primärnyckeln består av flera fält, måste dessa fält listas inom parentes, separerade med kommatecken:

ALTER TABLE tabellnamn ADD CONSTRAINT constraint_name PRIMÄRNYCKEL (fält1, fält2, ...)
Det är värt att notera att i MS SQL måste alla fält som ingår i primärnyckeln vara INTE NULL.

Primärnyckeln kan också bestämmas direkt när tabellen skapas, dvs. i samband med kommandot CREATE TABLE. Låt oss ta bort tabellen:

DROP TABLE Anställda
Och låt oss sedan skapa den med följande syntax:

SKAPA TABELL Anställda (ID int NOT NULL, Namn nvarchar (30) NOT NULL, Födelsedag, E-post nvarchar (30), Position nvarchar (30), Department nvarchar (30), BEGRÄNSNING PK_Employees PRIMÄRNYCKEL (ID) - beskriv trots allt PK fält som en begränsning)
Efter skapandet fyller du i uppgifterna i tabellen:

INFOGA Anställda (ID, Befattning, Avdelning, Namn) VÄRDEN (1000, N "Direktor", N "Administration", N "Ivanov I.I."), (1001, N "Programmerare", N "IT", N " Petrov PP " ), (1002, N" Accountant ", N" Accounting ", N" Sidorov SS "), (1003, N" Senior programmerare ", N" IT ", N" Andreev A. A.")
Om primärnyckeln i tabellen endast består av värdena i en kolumn, kan följande syntax användas:

SKAPA TABELL Anställda (ID int NOT NULL CONSTRAINT PK_Employees PRIMARY KEY, - specificera som en egenskap för fältet Namn nvarchar (30) NOT NULL, Födelsedag, E-post nvarchar (30), Position nvarchar (30), Department nvarchar (30))
Faktum är att namnet på begränsningen kan utelämnas, i vilket fall den kommer att tilldelas ett systemnamn (som "PK__Employee__3214EC278DA42077"):

SKAPA TABELL Anställda (ID int NOT NULL, Namn nvarchar (30) NOT NULL, Födelsedag, E-post nvarchar (30), Position nvarchar (30), Department nvarchar (30), PRIMÄRNYCKEL (ID))
Eller:

SKAPA TABELL Anställda (ID int INTE NULL PRIMÄRNYCKEL, Namn nvarchar (30) INTE NULL, Födelsedag, E-post nvarchar (30), Position nvarchar (30), Department nvarchar (30))
Men jag skulle rekommendera att alltid explicit specificera begränsningsnamnet för beständiga tabeller, eftersom med ett uttryckligen angett och förståeligt namn blir det sedan lättare att manipulera det, till exempel kan du radera det:

ÄNDRA TABELL Anställda SLIP BEGRÄNSNING PK_Anställda
Men en så kort syntax, utan att ange namnen på begränsningarna, är bekväm att använda när du skapar temporära databastabeller (namnet på den temporära tabellen börjar med # eller ##), som kommer att raderas efter användning.

Låt oss sammanfatta

Hittills har vi täckt följande kommandon:
  • SKAPA BORD table_name (uppräkning av fält och deras typer, begränsningar) - används för att skapa en ny tabell i den aktuella databasen;
  • SLÄPP BORD table_name - tjänar till att ta bort en tabell från den aktuella databasen;
  • ÄNDRA TABELL tabellnamn ÄNDRA KOLUMN kolumnnamn... - används för att uppdatera typen av en kolumn eller för att ändra dess inställningar (till exempel för att ange NULL- eller NOT NULL-egenskapen);
  • ÄNDRA TABELL tabellnamn LÄGG TILL BEGRÄNSNING constraint_name PRIMÄRNYCKEL(fält1, fält2, ...) - lägga till en primärnyckel till en befintlig tabell;
  • ÄNDRA TABELL tabellnamn SLAPP BEGRÄNSNING constraint_name - tar bort restriktionen från tabellen.

Lite om tillfälliga bord

Utdrag från MSDN. Det finns två typer av temporära tabeller i MS SQL Server: lokal (#) och global (##). Lokala temporära tabeller är endast synliga för deras skapare tills anslutningen till SQL Server-instansen upphör, så snart de först skapas. Lokala temporära tabeller tas bort automatiskt efter att en användare kopplat från en instans av SQL Server. Globala temporära tabeller är synliga för alla användare under alla anslutningssessioner efter att dessa tabeller har skapats, och tas bort när alla användare som refererar till dessa tabeller kopplar från SQL Server-instansen.

Tillfälliga tabeller skapas i tempdb-systemdatabasen, d.v.s. genom att skapa dem skräpar vi inte ner huvudbasen, annars är de temporära tabellerna helt identiska med vanliga tabeller, de kan också släppas med kommandot DROP TABLE. Lokala (#) temporära tabeller används oftare.

Du kan använda kommandot CREATE TABLE för att skapa en tillfällig tabell:

SKAPA TABELL #Temp (ID int, Namn nvarchar (30))
Eftersom en temporär tabell i MS SQL liknar en vanlig tabell kan du även släppa den själv med kommandot DROP TABLE:

SLAPPTABELL #Temp

Dessutom kan en temporär tabell (som en vanlig tabell själv) skapas och omedelbart fyllas med data som returneras av en fråga med hjälp av syntaxen SELECT ... INTO:

VÄLJ ID, Namn INTO #Temp FRÅN anställda

På en lapp
Implementering av temporära tabeller kan skilja sig åt i olika DBMS. Till exempel, i ORACLE och Firebird DBMS måste strukturen för temporära tabeller definieras i förväg med kommandot CREATE GLOBAL TEMPORARY TABLE som indikerar detaljerna för att lagra data i den, sedan kan användaren se den bland huvudtabellerna och arbeta med den som med ett vanligt bord.

Databasnormalisering - dela upp i deltabeller (referensböcker) och definiera relationer

Vår nuvarande tabell för anställda har nackdelen att användaren i fälten Position och Avdelning kan skriva in vilken text som helst, som i första hand är fylld av fel, eftersom en anställd helt enkelt kan ange "IT" som en avdelning och en andra anställd t.ex. ange "IT-avdelning", vid den tredje "IT". Därmed blir det oklart vad användaren menade, d.v.s. Är dessa anställda anställda på samma avdelning, eller beskrivs användaren själv och det är 3 olika avdelningar? Dessutom kommer vi i det här fallet inte att kunna gruppera uppgifterna korrekt för någon rapport, där det kan krävas att visa antalet anställda i varje avdelnings sammanhang.

Den andra nackdelen är mängden lagring av denna information och dess dubblering, dvs. för varje anställd anges avdelningens fullständiga namn, vilket kräver utrymme i databasen för att lagra varje tecken från avdelningsnamnet.

Den tredje nackdelen är komplexiteten i att uppdatera dessa fält om titeln på en position ändras, till exempel om du behöver byta namn på positionen "Programmerare" till "Junior Programmerare". I det här fallet måste vi göra ändringar på varje rad i tabellen, där positionen är lika med "Programmerare".

För att undvika dessa brister tillämpas den så kallade normaliseringen av databasen - dela upp den i undertabeller, referenstabeller. Det är inte nödvändigt att gå in i teorins djungel och studera vad normala former är, det räcker för att förstå essensen av normalisering.

Låt oss skapa 2 tabeller "Positioner" och "Avdelningar", den första kommer att heta Positioner, och den andra, respektive, Avdelningar:

SKAPA TABELL Positioner (ID int IDENTITET (1,1) INTE NULL BEGRÄNSNING PK_Positions PRIMÄRNYCKEL, Namn nvarchar (30) INTE NULL) SKAPA TABELL Avdelningar (ID int IDENTITET (1,1) INTE NULL BEGRÄNSNING PK_Avdelningar PRIMÄRKEY, (30Namn NULL) ) INTE NULL)
Notera att vi här har använt det nya IDENTITY-alternativet som säger att uppgifterna i ID-kolumnen kommer att numreras automatiskt, med start från 1, med steget 1, d.v.s. när nya poster läggs till kommer de sekventiellt att tilldelas värdena 1, 2, 3, etc. Sådana fält kallas vanligen för automatisk inkrementering. Endast ett fält med egenskapen IDENTITY kan definieras i en tabell, och vanligtvis, men inte nödvändigtvis, är ett sådant fält primärnyckeln för den tabellen.

På en lapp
I olika DBMS kan implementeringen av fält med en räknare göras på sitt eget sätt. I MySQL, till exempel, definieras ett sådant fält med alternativet AUTO_INCREMENT. I ORACLE och Firebird tidigare kunde denna funktionalitet emuleras med SEQUENCE. Men så vitt jag vet har ORACLE nu lagt till alternativet GENERATED AS IDENTITY.

Låt oss fylla dessa tabeller automatiskt baserat på de aktuella data som registrerats i fälten Position och Avdelning i tabellen Anställda:

Fyll i fältet Namn i tabellen Positioner med unika värden från Position-fältet i tabellen Anställda INSERT Positions (Name) SELECT DISTINCT Position FROM Anställda WHERE Position IS NOT NULL - kasta poster vars position inte är specificerad
Låt oss göra samma sak för avdelningstabellen:

INFOGA Avdelningar (Namn) VÄLJ DISTINKT Avdelning FRÅN Anställda DÄR Avdelningen INTE ÄR NULL
Om vi ​​nu öppnar tabellerna för positioner och avdelningar kommer vi att se en numrerad uppsättning värden för ID-fältet:

VÄLJ * FRÅN Positioner

VÄLJ * FRÅN Avdelningar

Dessa tabeller kommer nu att spela rollen som referensböcker för tilldelning av befattningar och avdelningar. Vi kommer nu att hänvisa till jobb- och avdelnings-ID. Låt oss först och främst skapa nya fält i tabellen Anställda för att lagra identifieringsdata:

Lägg till ett fält för positions-ID ALTER TABLE Anställda ADD PositionID int - lägg till ett fält för ID för avdelningen ALTER TABLE Anställda ADD DepartmentID int
Typen av referensfält bör vara densamma som i referenserna, i detta fall är det int.

Du kan också lägga till flera fält i tabellen samtidigt med ett kommando, lista fälten separerade med kommatecken:

ÄNDRA TABELL Anställda ADD PositionID int, DepartmentID int
Nu kommer vi att skriva länkar (referensbegränsningar - FOREIGN KEY) för dessa fält så att användaren inte kan skriva i dessa fält de värden som saknas bland ID-värdena som finns i referensböckerna.

ÄNDRA TABELL Anställda ADD CONSTRAINT FK_Employees_PositionID UTLÄNDLIG KEY (PositionID) REFERENSER Positioner (ID)
Och vi kommer att göra samma sak för det andra fältet:

ÄNDRA TABELL Anställda ADD CONSTRAINT FK_Employees_DepartmentID UTLÄNDSK KEY (AvdelningsID) REFERENSER Avdelningar (ID)
Nu kommer användaren att kunna ange endast ID-värden från motsvarande katalog i dessa fält. Följaktligen, för att använda en ny avdelning eller befattning, måste han först lägga till en ny post i motsvarande katalog. Eftersom positioner och avdelningar lagras nu i kataloger i en enda kopia, för att ändra namnet räcker det att bara ändra det i katalogen.

Namnet på referensrestriktionen är vanligtvis en sammansatt sådan, den består av prefixet "FK_", sedan följer tabellens namn och efter understrecket finns namnet på fältet som refererar till referenstabellens identifierare.

Identifieraren (ID) är vanligtvis ett internt värde som endast används för länkar och vilket värde som lagras där är i de flesta fall absolut likgiltigt, så du behöver inte försöka bli av med hål i nummersekvensen som uppstår under arbetet med tabellen, till exempel efter att ha raderat poster från referensboken.

ALTER TABLE-tabell ADD CONSTRAINT constraint_name UTLÄNDLIG KEY (fält1, fält2, ...) REFERENSER referenstabell (fält1, fält2, ...)
I det här fallet, i tabellen "dir_table", representeras primärnyckeln av en kombination av flera fält (fält1, fält2, ...).

Nu ska vi faktiskt uppdatera fälten PositionID och DepartmentID med ID-värdena från katalogerna. Låt oss använda kommandot DML UPDATE för detta ändamål:

UPPDATERA e SET PositionID = (VÄLJ ID FRÅN Positioner WHERE Name = e.Position), DepartmentID = (VÄLJ ID FRÅN Departments WHERE Name = e.Department) FRÅN Anställda e
Låt oss se vad som hände genom att köra frågan:

VÄLJ * FRÅN Anställda

Det är allt, PositionID och DepartmentID-fälten är fyllda med motsvarande positioner och avdelningar med identifierare, det finns inget behov av Position och Department-fälten i tabellen Anställda, du kan ta bort dessa fält:

ÄNDRA TABELL Anställda SLUTA KOLUMN Befattning, Avdelning
Nu har tabellen fått följande form:

VÄLJ * FRÅN Anställda

ID namn Födelsedag E-post Positions-ID Avdelnings-ID
1000 Ivanov I.I. NULL NULL 2 1
1001 Petrov P.P. NULL NULL 3 3
1002 Sidorov S.S. NULL NULL 1 2
1003 Andreev A.A. NULL NULL 4 3

De där. som ett resultat blev vi av med lagringen av överflödig information. Nu, genom positions- och avdelningsnumren, kan vi unikt bestämma deras namn med hjälp av värdena i referenstabellerna:

VÄLJ e.ID, e.Name, p.Name PositionName, d.Name DepartmentName FRÅN Anställda e LEFT JOIN Avdelningar d ON d.ID = e.DepartmentID LEFT JOIN Positioner p ON p.ID = e.PositionID

I objektinspektören kan vi se alla objekt som skapats för denna tabell. Härifrån kan du utföra olika manipulationer med dessa objekt - till exempel byta namn på eller ta bort objekt.

Det är också värt att notera att tabellen kan hänvisa till sig själv, d.v.s. du kan skapa en rekursiv länk. Låt oss till exempel lägga till ett annat ManagerID-fält i vår tabell med anställda, vilket kommer att peka på den anställde som denna anställd är underordnad. Låt oss skapa ett fält:

ÄNDRA TABELL Anställda ADD ManagerID int
NULL är tillåtet i detta fält, fältet blir tomt om det till exempel inte finns några överordnade ovanför medarbetaren.

Låt oss nu skapa en UTLÄNDSKNYCKEL på tabellen Anställda:

ÄNDRA TABELL Anställda LÄGG TILL BEGRÄNSNING FK_Employees_ManagerID UTLÄNDLIG KEY (ManagerID) REFERENSER Anställda (ID)
Låt oss nu skapa ett diagram och se hur relationerna mellan våra tabeller ser ut på det:

Som ett resultat bör vi se följande bild (tabellen Anställda är länkad till tabellerna Positioner och Avdelningar och hänvisar också till sig själv):

Slutligen är det värt att nämna att referensnycklar kan innehålla ytterligare alternativ ON DELETE CASCADE och ON UPDATE CASCADE, som berättar hur du ska bete dig när du tar bort eller uppdaterar en post som refereras till i referenstabellen. Om dessa alternativ inte är specificerade kan vi inte ändra ID i referenstabellen för posten som det finns länkar till från en annan tabell, och vi kommer inte heller att kunna ta bort en sådan post från referensen förrän vi tar bort alla rader som refererar till denna post eller, vi kommer att uppdatera länkarna på dessa rader till ett annat värde.

Låt oss till exempel återskapa tabellen med alternativet ON DELETE CASCADE för FK_Employees_DepartmentID:

DROP TABLE Anställda SKAPA TABELL Anställda (ID int NOT NULL, Namn nvarchar (30), Födelsedag, E-post nvarchar (30), PositionID int, DepartmentID int, ManagerID int, BEGRÄNSNING PK_Employees PRIMÄRNYCKEL (ID), CONSTRAINT EIGN_Department KEYDELID (DEMEY) ) REFERENSER Avdelningar (ID) PÅ DELETE CASCADE, BEGRÄNSNING FK_Employees_PositionID FOREIGN KEY (PositionID) REFERENCES Positioner (ID), CONSTRAINT FK_Employees_ManagerID FOREIGN KEY (ManagerID) REFERENCES Positions-ID (IDS0), (N ANSTÄLLNINGS-ID (ID), (N 0,0 "19550219", 2,1, NULL), (1001, N "Petrov PP", "19831203", 3,3,1003), (1002 , N "Sidorov SS", "19760607", 1,2,1000) , (1003, N "Andreev AA", "19820417", 4,3,1000)
Låt oss ta bort avdelningen med ID 3 från avdelningstabellen:

DELETE Departments WHERE ID = 3
Låt oss titta på uppgifterna i tabellen Anställda:

VÄLJ * FRÅN Anställda

ID namn Födelsedag E-post Positions-ID Avdelnings-ID ManagerID
1000 Ivanov I.I. 1955-02-19 NULL 2 1 NULL
1002 Sidorov S.S. 1976-06-07 NULL 1 2 1000

Som du kan se har även uppgifterna för avdelning 3 raderats från tabellen Anställda.

Alternativet ON UPDATE CASCADE fungerar på liknande sätt, men det fungerar när ID-värdet i uppslagningen uppdateras. Om vi ​​till exempel ändrar positions-ID i jobbkatalogen, kommer avdelnings-ID i tabellen Anställda att uppdateras till det nya ID-värdet som vi angav i katalogen. Men i det här fallet kommer det helt enkelt inte att vara möjligt att visa detta, eftersom ID-kolumnen i tabellen Avdelningar har alternativet IDENTITY, vilket inte tillåter oss att utföra följande begäran (ändra avdelnings-ID 3 till 30):

UPPDATERA avdelningar SET ID = 30 WHERE ID = 3
Det viktigaste är att förstå essensen av dessa två alternativ PÅ DELETE CASCADE och PÅ UPPDATERA CASCADE. Jag använder dessa alternativ vid mycket sällsynta tillfällen, och jag rekommenderar att du tänker noga innan du använder dem i en referensrestriktion. om du av misstag raderar en post från uppslagstabellen kan detta leda till stora problem och skapa en kedjereaktion.

Låt oss återställa avdelning 3:

Ge tillåtelse att lägga till/ändra IDENTITY-värde SET IDENTITY_INSERT avdelningar ON INSERT avdelningar (ID, namn) VALUES (3, N "IT") - förbjud att lägga till/ändra IDENTITY-värde SET IDENTITY_INSERT avdelningar AV
Låt oss rensa upp tabellen Employees helt med kommandot TRUNCATE TABLE:

TRUNCATE TABLE Anställda
Och återigen, ladda om data i den med det föregående INSERT-kommandot:

INFOGA anställda (ID, namn, födelsedag, positions-ID, avdelnings-ID, chefs-ID) VÄRDEN (1000, N "Ivanov I.I.", "19550219", 2,1, NULL), (1001, N "Petrov P.P." , "19831203", 3 ,3,1003), (1002, N "Sidorov SS", "19760607", 1,2,1000), (1003, N "Andreev AA", "19820417" , 4,3,1000)

Låt oss sammanfatta

För tillfället har några fler DDL-kommandon lagts till för vår kunskap:
  • Lägga till IDENTITY-egenskapen i ett fält - låter dig göra detta fält automatiskt ifyllt (räknarfält) för tabellen;
  • ÄNDRA TABELL tabellnamn LÄGG TILL list_of_fields_with_characteristics - låter dig lägga till nya fält i tabellen;
  • ÄNDRA TABELL tabellnamn SLIPP KOLUMN list_of_field - låter dig ta bort fält från tabellen;
  • ÄNDRA TABELL tabellnamn LÄGG TILL BEGRÄNSNING constraint_name FRÄMMANDE NYCKEL(fält) REFERENSER referenstabell (fält) - låter dig definiera förhållandet mellan tabellen och referenstabellen.

Andra begränsningar - UNIK, DEFAULT, KONTROLL

Med UNIQUE-begränsningen kan du säga att värdena för varje rad i ett givet fält eller uppsättning fält måste vara unika. När det gäller tabellen Anställda kan vi införa en sådan begränsning i fältet E-post. Fyll bara i e-postmeddelandet med värden i förväg, om de inte redan är definierade:

UPPDATERA Anställda SET E-post = " [e-postskyddad]"WHERE ID = 1000 UPPDATERING Anställda SET E-post =" [e-postskyddad]"WHERE ID = 1001 UPPDATERING Anställda SET E-post =" [e-postskyddad]"WHERE ID = 1002 UPPDATERING Anställda SET E-post =" [e-postskyddad]"WHERE ID = 1003
Och nu kan du införa ett unikt krav på detta område:

ÄNDRA TABELL Anställda ADD CONSTRAINT UQ_Employees_Email UNIQUE (E-post)
Nu kommer användaren inte att kunna ange samma e-post för flera anställda.

Unikitetsbegränsningen heter vanligtvis enligt följande - först kommer prefixet "UQ_", sedan namnet på tabellen, och efter understrecket finns namnet på fältet som denna begränsning tillämpas på.

Följaktligen, om en kombination av fält ska vara unik i sammanhanget med tabellrader, listar vi dem separerade med kommatecken:

ALTER TABLE tabellnamn ADD CONSTRAINT constraint_name UNIQUE (fält1, fält2, ...)
Genom att lägga till en DEFAULT-begränsning i fältet kan vi ställa in ett standardvärde som kommer att ersättas om, när du infogar en ny post, detta fält inte finns med i listan över fält för kommandot INSERT. Denna begränsning kan ställas in direkt när du skapar en tabell.

Låt oss lägga till ett nytt fält för mötesdatum i tabellen Anställda och namnge det HireDate och säga att standardvärdet för detta fält är det aktuella datumet:

ÄNDRA TABELL Anställda ADD Anställningsdatum datum INTE NULL STANDARD SYSDATETIME ()
Eller om kolumnen HireDate redan finns kan följande syntax användas:

ÄNDRA TABELL Anställda LÄGG TILL STANDARD SYSDATETIME () FÖR HireDate
Här har jag inte angett namnet på begränsningen, eftersom i fallet med DEFAULT ansåg jag att detta inte är så kritiskt. Men om man gör det på ett vänskapligt sätt, då tycker jag att man inte ska vara lat och man ska ge ett vanligt namn. Detta görs på följande sätt:

ALTER TABLE Anställda ADD CONSTRAINT DF_Employees_HireDate DEFAULT SYSDATETIME () FÖR HireDate
Eftersom den här kolumnen inte fanns tidigare, när den läggs till i varje post, kommer det aktuella datumvärdet att infogas i fältet HireDate.

Vid tillägg av en ny post kommer även aktuellt datum att infogas automatiskt, naturligtvis, om vi inte uttryckligen ställer in det, d.v.s. kommer inte att anges i listan med kolumner. Låt oss visa detta med ett exempel utan att ange fältet HireDate i listan över mervärden:

INFOGA anställda (ID, namn, e-post) VÄRDEN (1004, N "Sergeev S.S.", " [e-postskyddad]")
Låt oss se vad som hände:

VÄLJ * FRÅN Anställda

ID namn Födelsedag E-post Positions-ID Avdelnings-ID ManagerID HireDate
1000 Ivanov I.I. 1955-02-19 [e-postskyddad] 2 1 NULL 2015-04-08
1001 Petrov P.P. 1983-12-03 [e-postskyddad] 3 4 1003 2015-04-08
1002 Sidorov S.S. 1976-06-07 [e-postskyddad] 1 2 1000 2015-04-08
1003 Andreev A.A. 1982-04-17 [e-postskyddad] 4 3 1000 2015-04-08
1004 Sergeev S.S. NULL [e-postskyddad] NULL NULL NULL 2015-04-08

CHECK-begränsningen används när det är nödvändigt att kontrollera de värden som infogats i fältet. Låt oss till exempel införa denna begränsning på personalnummerfältet, som är den anställdes identifierare (ID). Med hjälp av denna begränsning, låt oss säga att personalnummer bör ha ett värde mellan 1000 och 1999:

ÄNDRA TABELL Anställda ADD CONSTRAINT CK_Employees_ID CHECK (ID MELLAN 1000 OCH 1999)
Begränsningen heter vanligtvis samma, först kommer prefixet "CK_", sedan namnet på tabellen och namnet på fältet som denna begränsning är pålagd.

Låt oss försöka infoga en ogiltig post för att kontrollera att begränsningen fungerar (vi bör få motsvarande fel):

INFOGA anställda (ID, e-post) VÄRDEN (2000, " [e-postskyddad]")
Låt oss nu ändra det infogade värdet till 1500 och se till att posten infogas:

INFOGA anställda (ID, e-post) VÄRDEN (1500, " [e-postskyddad]")
Du kan också skapa UNIQUE och CHECK-begränsningar utan att ange ett namn:

ALTER TABLE Anställda LÄGG TILL UNIK (E-post) ÄNDRA TABELL Anställda LÄGG TILL KONTROLL (ID MELLAN 1000 OCH 1999)
Men detta är inte en bra praxis och det är bättre att ange namnet på begränsningen uttryckligen, eftersom för att ta reda på det senare, vilket kommer att bli svårare, måste du öppna objektet och se vad det är ansvarigt för.

Med ett bra namn kan mycket information om begränsningen kännas igen direkt på dess namn.

Och följaktligen kan alla dessa begränsningar skapas omedelbart när du skapar en tabell, om den inte redan finns. Låt oss ta bort tabellen:

DROP TABLE Anställda
Och vi kommer att återskapa det med alla skapade begränsningar med ett CREATE TABLE-kommando:

SKAPA TABELL Anställda (ID int NOT NULL, Namn nvarchar (30), Födelsedag, E-post nvarchar (30), PositionID int, DepartmentID int, Anställningsdatum INTE NULL STANDARD SYSDATETIME (), - för DEFAULT kommer jag att kasta CONSTRAINT PK_Employees undantag PRIMÄRT (ID), CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY (DepartmentID) REFERENCES Avdelningar (ID), CONSTRAINT FK_Employees_PositionID FOREIGN KEY (PositionID) REFERENCES Positioner (ID), CONSTRAINT UQ_Employees_Email) UNIQUE (Email)

INFOGA anställda (ID, namn, födelsedag, e-post, positions-ID, avdelnings-ID) VÄRDEN (1000, N "Ivanov I.I.", "19550219", " [e-postskyddad]", 2,1), (1001, N" Petrov P.P. "," 19831203 "," [e-postskyddad]", 3,3), (1002, N" Sidorov S.S. "," 19760607 "," [e-postskyddad]", 1,2), (1003, N" Andreev A.A. "," 19820417 "," [e-postskyddad]",4,3)

Lite om index som skapas när man skapar PRIMÄRKEY och UNIKA begränsningar

Som du kan se i skärmdumpen ovan skapades index med samma namn (PK_Employees och UQ_Employees_Email) automatiskt när du skapade PRIMÄRKEY och UNIQUE begränsningar. Som standard skapas indexet för primärnyckeln som CLUSTERED, och för alla andra index som ICKE CLUSTERED. Det ska sägas att inte alla DBMS har konceptet med ett klustrat index. En tabell kan bara ha ett CLUSTERED index. CLUSTERED - betyder att tabellposter kommer att sorteras efter detta index, man kan också säga att detta index har direkt tillgång till all tabelldata. Detta är så att säga tabellens huvudindex. Mer grovt är det ett index som är fastskruvat i bordet. Det klustrade indexet är ett mycket kraftfullt verktyg som kan hjälpa dig att optimera dina frågor, tänk bara på det för nu. Om vi ​​vill tala om för det klustrade indexet att det inte ska användas i primärnyckeln, utan för ett annat index, måste vi när vi skapar primärnyckeln ange alternativet NOCLUSTERED:

ALTER TABLE tabellnamn LÄGG TILL BEGRÄNSNING begränsningsnamn PRIMÄRNYCKEL ICKELUSTERAD (fält1, fält2, ...)
Låt oss till exempel göra PK_Employees-begränsningsindexet icke-klustrat och UQ_Employees_Email-begränsningsindexet klustrat. Först och främst tar vi bort dessa begränsningar:

ALTER TABLE Anställda SLÄPP BEGRÄNSNING PK_Anställda ÄNDRA TABELL Anställda SLÄPP KONSTRAINT UQ_Anställda_E-post
Låt oss nu skapa dem med alternativen CLUSTERED och NOCLUSTERED:

ÄNDRA TABELL Anställda LÄGG TILL BEGRÄNSNING PK_Anställda PRIMÄRNYCKEL EJ KLUSTERAD (ID) ÄNDRA TABELL Anställda LÄGG TILL BEGRÄNSNING UQ_Employees_Email UNIQUE CLUSTERED (E-post)
Nu, efter att ha hämtat från tabellen Employees, kan vi se att posterna är sorterade efter det klustrade UQ_Employees_Email-indexet:

VÄLJ * FRÅN Anställda

ID namn Födelsedag E-post Positions-ID Avdelnings-ID HireDate
1003 Andreev A.A. 1982-04-17 [e-postskyddad] 4 3 2015-04-08
1000 Ivanov I.I. 1955-02-19 [e-postskyddad] 2 1 2015-04-08
1001 Petrov P.P. 1983-12-03 [e-postskyddad] 3 3 2015-04-08
1002 Sidorov S.S. 1976-06-07 [e-postskyddad] 1 2 2015-04-08

Före detta, när PK_Employees-indexet var det klustrade indexet, sorterades poster efter ID som standard.

Men i det här fallet är detta bara ett exempel som visar essensen av det klustrade indexet, eftersom sannolikt kommer frågor att göras till tabellen Anställda av ID-fältet, och i vissa fall kan det i sig fungera som en referensbok.

För uppslagningar är det vanligtvis tillrådligt att det klustrade indexet byggs på primärnyckeln, eftersom i förfrågningar hänvisar vi ofta till en katalogidentifierare för att få till exempel namnet (Position, Department). Här minns vi vad jag skrev ovan, att det klustrade indexet har direkt tillgång till raderna i tabellen, och av detta följer att vi kan få värdet på vilken kolumn som helst utan extra overhead.

Det är fördelaktigt att tillämpa ett klustrat index på de fält som samplades oftast.

Ibland skapas en nyckel i tabeller av ett surrogatfält, i vilket fall det är användbart att spara alternativet CLUSTERED index för ett mer lämpligt index och ange alternativet ICKELUSTERED när du skapar en surrogat primärnyckel.

Låt oss sammanfatta

I detta skede har vi bekantat oss med alla typer av restriktioner, i deras enklaste form, som skapas av ett kommando av formen "ALTER TABLE table_name ADD CONSTRAINT constraint_name ...":
  • PRIMÄRNYCKEL- primärnyckel;
  • FRÄMMANDE NYCKEL- upprätta länkar och kontrollera datas referensintegritet;
  • UNIK- låter dig skapa unika;
  • KOLLA UPP- tillåter korrektheten av de inmatade uppgifterna;
  • STANDARD- låter dig ställa in standardvärdet;
  • Det är också värt att notera att alla begränsningar kan tas bort med kommandot " ÄNDRA TABELL tabellnamn SLAPP BEGRÄNSNING constraint_name ".
Vi berörde också delvis ämnet index och analyserade begreppet kluster ( KLUSTERAD) och icke-klustrade ( ICLUSTERAD) index.

Skapa fristående index

Självtillit syftar här på index som inte är skapade för en PRIMÄRNYCKEL eller UNIK begränsning.

Index efter fält eller fält kan skapas med följande kommando:

SKAPA INDEX IDX_Employees_Name ON Anställda (namn)
Även här kan du ange alternativen CLUSTERED, NOCLUSTERED, UNIQUE, och du kan också ange sorteringsriktningen för varje enskilt fält ASC (som standard) eller DESC:

SKAPA UNIKT INKLUSTERAT INDEX UQ_Employees_EmailDesc ON Anställda (E-post DESC)
När du skapar ett icke-klustrat index kan alternativet ICKELUSTERAD släppas eftersom det är standard och visas här helt enkelt för att indikera positionen för alternativet CLUSTERED eller NOCLUSTERED i kommandot.

Du kan ta bort indexet med följande kommando:

SLÄPP INDEX IDX_Employees_Name ON Anställda
Enkla index, som begränsningar, kan skapas i samband med kommandot CREATE TABLE.

Låt oss till exempel släppa tabellen igen:

DROP TABLE Anställda
Och vi kommer att återskapa det med alla skapade begränsningar och index med ett CREATE TABLE-kommando:

SKAPA TABELL Anställda (ID int NOT NULL, Namn nvarchar (30), Födelsedag, E-post nvarchar (30), PositionID int, DepartmentID int, HireDate date NOT NULL CONSTRAINT DF_Employees_HireDate DEFAULT SYSDATETIME (), AnställdsID int, CONSTRAINT), CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY (DepartmentID) REFERENCES Avdelningar (ID), CONSTRAINT FK_Employees_PositionID FOREIGN KEY (PositionID) REFERENCES Positioner (ID), BEGRÄNSNING FK_Employees_ManagerID TWEEEEN KEY (19m) KONTROLLERA (IDE 9m) (IDE_9m) KONTROLLERA 1_09M
Låt oss slutligen infoga våra anställda i tabellen:

INFOGA anställda (ID, namn, födelsedag, e-post, positions-ID, avdelnings-ID, chefs-ID) VÄRDEN (1000, N "Ivanov I.I.", "19550219", " [e-postskyddad]", 2,1, NULL), (1001, N" Petrov P.P. "," 19831203 "," [e-postskyddad]", 3,3,1003), (1002, N" Sidorov S.S. "," 19760607 "," [e-postskyddad]", 1,2,1000), (1003, N" Andreev A.A. "," 19820417 "," [e-postskyddad]",4,3,1000)
Dessutom är det värt att notera att du kan inkludera värden i ett icke-klustrat index genom att ange dem i INCLUDE. De där. i det här fallet kommer INCLUDE-indexet något att likna ett klustrat index, bara nu är indexet inte bultat till bordet, men de nödvändiga värdena är bultade till indexet. Följaktligen kan sådana index avsevärt förbättra prestandan för urvalsfrågor (SELECT), om alla de listade fälten finns i indexet kanske det inte är nödvändigt att komma åt tabellen alls. Men detta ökar naturligtvis storleken på indexet, sedan värdena för de listade fälten dupliceras i indexet.

Utdrag från MSDN. Allmän kommandosyntax för att skapa index

SKAPA [UNIKT] [KLUSTERAD | INKLUSTERAD] INDEX index_name PÅ (kolumn [ASC | DESC] [, ... n]) [INKLUDERA (kolumnnamn [, ... n])]

Låt oss sammanfatta

Index kan öka hastigheten för datahämtning (SELECT), men index saktar ner hastigheten för ändring av tabelldata, eftersom efter varje ändring kommer systemet att behöva bygga om alla index för en viss tabell.

Det är tillrådligt i varje enskilt fall att hitta den optimala lösningen, den gyllene medelvägen, så att både provtagningsprestanda och datamodifiering är på rätt nivå. Strategin för att skapa index och deras antal kan bero på många faktorer, till exempel hur ofta data i tabellen ändras.

DDL Slutsats

Som du kan se är DDL inte så komplicerat som det kan verka vid första anblicken. Här kunde jag visa nästan alla dess grundläggande konstruktioner, med bara tre tabeller.

Det viktigaste är att förstå essensen, och resten är en fråga om övning.

Lycka till med detta underbara språk som heter SQL.

Välkommen till min bloggsida. Idag ska vi prata om sql-frågor för nybörjare. Vissa webbansvariga kan ha en fråga. Varför lära sig sql? Kan du inte göra det?

Det visar sig att detta inte kommer att räcka för att skapa ett professionellt internetprojekt. Sql används för att arbeta med databaser och skapa applikationer för WordPress. Låt oss ta en närmare titt på hur man använder frågor.

Vad det är

SQL är ett strukturerat frågespråk. Designad för att definiera typen av data, ge tillgång till den och bearbeta information under korta tidsperioder. Den beskriver komponenterna eller något slags resultat som du vill se på Internetprojektet.

Enkelt uttryckt låter detta programmeringsspråk dig lägga till, ändra, söka och visa information i databasen. Populariteten för mysql beror på att den används för att skapa dynamiska internetprojekt baserade på en databas. Därför, för att utveckla en funktionell blogg, måste du lära dig detta språk.

Vad kan jag göra

SQL-språk tillåter:

  • skapa tabeller;
  • ändra ta emot och lagra olika data;
  • kombinera information till block;
  • skydda data;
  • skapa förfrågningar i åtkomst.

Viktig! Efter att ha arbetat med sql kan du skriva applikationer för WordPress av vilken komplexitet som helst.

Vilken struktur

Databasen består av tabeller som kan representeras som en Excel-fil.

Hon har ett namn, kolumner och en rad med lite information. Du kan skapa sådana tabeller med sql-frågor.

Vad du behöver veta


Höjdpunkter när du lär dig SQL

Som noterats ovan används frågor för att bearbeta och lägga in ny information i en databas som består av tabeller. Var och en av dess rader är en separat post. Så låt oss skapa en databas. För att göra detta, skriv kommandot:

Skapa databas "bazaname"

Skriv namnet på databasen på latin inom citattecken. Försök att komma på ett meningsfullt namn för henne. Skapa inte en bas som "111", "www" och liknande.

När du har skapat databasen installerar du:

SETNAMN "utf-8"

Detta är nödvändigt för att innehållet på sajten ska visas korrekt.

Nu skapar vi en tabell:

SKAPA TABELL 'bazaname'. 'Tabell' (

id INT (8) INTE NULL AUTO_INCREMENT PRIMÄRNYCKEL,

log VARCHAR (10),

passera VARCHAR (10),

datum DATUM

På den andra raden har vi skrivit tre attribut. Låt oss se vad de betyder:

  • NOT NULL-attributet betyder att cellen inte kommer att vara tom (det här fältet är obligatoriskt);
  • AUTO_INCREMENT värde - autoslutförande;
  • PRIMARY KEY är den primära nyckeln.

Hur man lägger till information

För att fylla fälten i den skapade tabellen med värden, använd INSERT-satsen. Vi skriver följande kodrader:

INFOGA I "tabell"

(inloggning, pass, datum) VÄRDEN

('Vasa', '87654321 ',' 2017-06-21 18:38:44 ');

Inom parentes anger vi namnen på kolumnerna, och i nästa - värdena.

Viktig! Observera sekvensen av kolumnnamn och betydelser.

Hur man uppdaterar information

För att göra detta, använd kommandot UPDATE. Låt oss se hur du ändrar lösenordet för en specifik användare. Vi skriver följande kodrader:

UPPDATERA 'table' SET pass = '12345678' WHERE id = '1'

Ändra nu lösenordet '12345678'. Ändringar görs på raden med "id" = 1. Om du inte skriver kommandot WHERE kommer alla rader att ändras, inte en specifik.

Jag rekommenderar att du köper boken" SQL för dummies ". Med dess hjälp kommer du att kunna arbeta professionellt med databasen steg för steg. All information är strukturerad från enkel till komplex och kommer att tas emot väl.

Hur man tar bort en post

Om du skrev något fel, korrigera det med kommandot DELETE. Fungerar på samma sätt som UPDATE. Vi skriver följande kod:

DELETE FRÅN 'tabell' WHERE id = '1'

Hämtar information

För att hämta värden från databasen, använd kommandot SELECT. Vi skriver följande kod:

VÄLJ * FRÅN 'tabell' DÄR id = '1'

I det här exemplet väljer vi alla tillgängliga fält i tabellen. Detta händer om du skriver en asterisk "*" i kommandot. Om du behöver välja något exempelvärde, skriver vi så här:

VÄLJ logg, skicka FRÅN tabellen WHERE id = '1'

Det bör noteras att förmågan att arbeta med databaser inte kommer att räcka. För att skapa ett professionellt internetprojekt måste du lära dig hur du lägger till data från databasen på sidorna. För att göra detta, bekanta dig med webbprogrammeringsspråket php. Detta kommer att hjälpa dig klassrumskurs av Mikhail Rusakov .


Släpp ett bord

Uppstår med en DROP-begäran. För att göra detta, skriv följande rader:

DROP TABLE tabell;

Mata ut en post från en tabell enligt ett specifikt villkor

Tänk på en kod som denna:

VÄLJ ID, land, stad FRÅN tabell VAR personer> 150000000

Det kommer att visa register över länder där befolkningen är över hundra och femtio miljoner.

En förening

Det är möjligt att länka flera tabeller tillsammans med Join. Hur det fungerar, se den här videon mer detaljerat:

PHP och MySQL

Återigen vill jag betona att det är vanligt att göra förfrågningar när man skapar ett internetprojekt. För att använda dem i php-dokument, följ följande procedur:

  • Vi ansluter till databasen med kommandot mysql_connect ();
  • Använd mysql_select_db () för att välja önskad databas;
  • Vi behandlar begäran med mysql_fetch_array ();
  • Vi stänger anslutningen med kommandot mysql_close ().

Viktig! Att arbeta med en databas är inte svårt. Det viktigaste är att skriva begäran korrekt.

Nybörjare webbansvariga kommer att tänka. Vad ska man läsa om detta ämne? Jag skulle vilja rekommendera boken av Martin Graber " SQL för enbart dödliga ". Det är skrivet på ett sådant sätt att allt blir klart för nybörjare. Använd den som uppslagsbok.

Men detta är teori. Hur är läget i praktiken? I verkligheten behöver ett internetprojekt inte bara skapas, utan också föras till TOPPEN av Google och Yandex. Videokursen " Skapande och marknadsföring av webbplatser ».


Videoinstruktion

Har du fortfarande frågor? Se onlinevideon mer detaljerat.

Slutsats

Så att hantera att skriva SQL-frågor är inte så svårt som det verkar, men alla webbansvariga måste göra det. Detta kommer att hjälpa videokurserna som beskrivs ovan. Prenumerera på min VKontakte-grupp att vara den första att veta om uppkomsten av ny intressant information.

De flesta moderna webbapplikationer interagerar med databaser, vanligtvis med ett språk som kallas SQL. Lyckligtvis för oss är detta språk väldigt lätt att lära sig. I den här artikeln kommer vi att titta på enkla SQL förfrågningar och lär dig hur du använder dem för att interagera med MySQL-databas.

Vad behöver du?

SQL (Structured Query Language) ett språk speciellt utformat för att interagera med databashanteringssystem som t.ex MySQL, Oracle, Sqlite och andra ... Att utföra SQL förfrågningar i den här artikeln rekommenderar jag dig att installera MySQL till den lokala datorn. Jag rekommenderar också att använda phpMyAdmin som ett visuellt gränssnitt.

Allt detta är tillgängligt i allas älskade Denver. Jag tycker att alla borde veta vad det är och var man kan få tag på det :). Burk annars använd WAMP eller MAMP.

Denver har en inbyggd MySQL trösta. Vi kommer att använda den.

SKAPA DATABAS:skapande av databas

Detta är vår första begäran. Vi kommer att skapa vår första databas för vidare arbete.

Öppna först MySQL konsol och logga in. För WAMP standardlösenordet är tomt. Det vill säga ingenting :). För MAMP är "root". För Denver behöver klargöras.

Efter inloggning anger du följande rad och klickar Stiga på:

SKAPA DATABAS my_first_db;

Observera att semikolon (;) läggs till i slutet av frågan, precis som på andra språk.

Se även kommandon i SQL skiftlägeskänsliga. Vi skriver dem med stora bokstäver.

Alternativ endast: Karaktärsuppsättningoch Samling

Om du vill installera teckenuppsättning och sortering kan vara skriv följande kommando:

SKAPA DATABAS my_first_db DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

Hittar en lista över teckenuppsättningar som stöds i MySQL.

VISA DATABASER:listar alla databaser

Detta kommando används för att visa alla tillgängliga databaser.

SLIP DATABAS:radera en databas

Du kan släppa en befintlig DB med den här frågan.

Var försiktig med det här kommandot eftersom det körs utan förvarning. Om din databas innehåller data kommer allt att raderas.

ANVÄNDA SIG AV:Databasval

Tekniskt sett är detta inte en fråga, utan en operatör och kräver inte ett semikolon i slutet.

Det berättar MySQL välj standarddatabasen för den aktuella sessionen. Nu är vi redo att skapa tabeller och göra andra saker med databasen.

Vad är en tabell i en databas?

Du kan representera tabellen i DB som Excel fil.

Precis som på bilden har tabeller kolumnnamn, rader och information. Via SQL frågor kan vi skapa sådana tabeller. Vi kan också lägga till, läsa, uppdatera och radera information.

SKAPA BORD: Skapa ett bord

C med den här frågan kan vi skapa tabeller i databasen. Förlåt, dokumentationen MySQL inte särskilt tydligt för nybörjare i denna fråga. Strukturen för denna typ av fråga kan vara mycket komplex, men vi börjar med en enkel.

Följande fråga kommer att skapa en tabell med 2 kolumner.

CREATE TABLE-användare (användarnamn VARCHAR (20), create_date DATE);

Observera att vi kan skriva våra frågor på flera rader och med flikar för indrag.

Den första raden är enkel. Vi skapar bara en tabell som heter "användare". Därefter, inom parentes, separerade med kommatecken, finns det en lista över alla kolumner. Efter varje kolumnnamn har vi informationstyper som VARCHAR eller DATE.

VARCHAR (20) betyder att kolumnen är av typen string och kan vara max 20 tecken lång. DATUM är också en typ av information som används för att lagra datum i detta format: "ÅÅÅÅ - MM-DD".

PRIMÄRNYCKEL ( primärnyckelh)

Innan vi kör nästa fråga måste vi också inkludera en kolumn för "user_id", som kommer att vara vår primära nyckel. Du kan tänka på en PRIMÄRNYCKEL som information som används för att identifiera varje rad i en tabell.

CREATE TABLE-användare (user_id INT AUTO_INCREMENT PRIMARY KEY, användarnamn VARCHAR (20), create_date DATE);

INT gör en 32-bitars heltalstyp (som siffror). AUTO_INCREMENT genererar automatiskt ett nytt värde ID varje gång vi lägger till nya rader med information. Detta är valfritt, men det gör hela processen enklare.

Den här kolumnen behöver inte vara ett heltalsvärde, men den används oftast. Närvaron av den primära nyckeln är också valfri, men den rekommenderas för databasens arkitektur och prestanda.

Låt oss köra frågan:

VISA TABELLER:visa alla tabeller

Den här frågan låter dig få en lista över tabeller som finns i databasen.

FÖRKLARA:Visa tabellstruktur

Du kan använda den här frågan för att visa strukturen för en befintlig tabell.

Kolumner visas med alla egenskaper.

SLÄPP BORD:ta bort tabell

Precis som DROP DATABASES, denna fråga tar bort tabellen och dess innehåll utan förvarning.

ÄNDRA TABELL: byta bord

Den här frågan kan också innehålla en komplex struktur på grund av de fler ändringar den kan göra i tabellen. Låt oss ta en titt på några exempel.

(om du tog bort tabellen i det sista steget, skapa den igen för tester)

LÄGG TILL EN KOLUMN

ALTER TABLE användare LÄGG TILL e-post VARCHAR (100) EFTER användarnamn;

På grund av den goda läsbarheten hos SQL tycker jag att det inte är någon idé att förklara det i detalj. Vi lägger till en ny kolumn "e-post" efter "användarnamn".

RADERA EN KOLUMN

Det var också väldigt lätt. Använd den här frågan med försiktighet, eftersom du kan radera data utan förvarning.

Återställ kolumnen du just tog bort för ytterligare experiment.

GÖR EN FÖRÄNDRING I EN KOLUMN

Ibland kanske du vill göra ändringar i egenskaperna för en kolumn, och du behöver inte ta bort den helt för detta.

Den här frågan döpte om användarkolumnen till "användarnamn" och ändrade dess typ från VARCHAR (20) till VARCHAR (30). En sådan förändring bör inte ändra uppgifterna i tabellen.

FÖRA IN: Lägga till information i en tabell

Låt oss lägga till lite information i tabellen med hjälp av följande fråga.

Som du kan se innehåller VÄRDEN () en kommaseparerad lista med värden. Alla värden finns i enstaka kolumner. Och värdena måste vara i ordningen för kolumnerna som definierades när tabellen skapades.

Observera att det första NULL-värdet för fältet PRIMARY KEY heter "user_id". Vi gör detta för att ID:t ska genereras automatiskt, eftersom kolumnen har egenskapen AUTO_INCREMENT. När informationen läggs till första gången blir ID 1. Nästa rad är 2, och så vidare ...

ALTERNATIVT ALTERNATIV

Det finns ett annat frågealternativ för att lägga till rader.

Den här gången använder vi nyckelordet SET istället för VALUES, och det har inga parenteser. Det finns flera nyanser:

Kolumnen kan hoppas över. Till exempel har vi inte tilldelat ett värde för "user_id", som som standard kommer att ha dess AUTO_INCREMENT-värde. Om du utelämnar en VARCHAR-kolumn kommer en tom rad att läggas till.

Varje kolumn måste hänvisas till med namn. På grund av detta kan de nämnas i valfri ordning, till skillnad från den tidigare versionen.

ALTERNATIVT ALTERNATIV 2

Här är ett annat alternativ.

Återigen, eftersom det finns referenser till kolumnnamnet, kan du ange värdena i valfri ordning.

LAST_INSERT_ID ()

Du kan använda denna begäran för att få ID:t som var AUTO_INCREMENT för den sista raden i den aktuella sessionen.

NU ()

Nu är det dags att visa hur du kan använda MySQL-funktionen i frågor.

Funktionen NU () visar det aktuella datumet. Så du kan använda den för att automatiskt ställa in kolumndatumet till det aktuella datumet när du infogar en ny rad.

Observera att vi fick 1 varning, men ignorera den. Anledningen till detta är att NOW () också används för att visa tillfällig information.

VÄLJ: Läser data från en tabell

Om vi ​​lägger till information i tabellen skulle det vara logiskt att lära sig hur man läser den därifrån. Det är här SELECT-frågan kommer att hjälpa oss.

Följande är den enklaste möjliga SELECT-frågan för att läsa en tabell.

I det här fallet betyder asterisken (*) att vi har begärt alla fält från tabellen. Om du bara vill ha specifika kolumner ser frågan ut så här.

SkickVAR

Oftast är vi inte intresserade av alla kolumner, utan bara av vissa. Låt oss till exempel anta att vi bara vill ha e-postadressen för användaren "nettuts".

WHERE låter dig ställa in villkor i frågan och göra detaljerade val.

Observera att ett likhetstecken (=) används för likhet, inte två som i programmering.

Du kan också använda jämförelser.

OCH eller ELLER kan användas för att kombinera villkor:

Observera att numeriska värden inte får citeras.

I ()

Detta är användbart för att sampla flera värden.

TYCKA OM

Låter dig göra "jokertecken"-förfrågningar

%-tecknet används som jokertecken. Det vill säga, allt kan vara på sin plats.

SkickSORTERA EFTER

Om du vill få resultatet sorterat efter vilket kriterium som helst

Standardordningen är ASC (från låg till hög). För motsatsen används DESC.

LIMIT ... OFFSET ...

Du kan begränsa antalet erhållna resultat.

LIMIT 2 tar bara de första 2 resultaten. LIMIT 1 OFFSET 2 får 1 resultat efter de första 2. LIMIT 2, 1 betyder detsamma (bara uppmärksamma först kommer offset och sedan limit).

UPPDATERING: Gör ändringar i informationen i tabellen

Denna fråga används för att ändra information i en tabell.

I de flesta fall används den i kombination med WHERE-satsen, eftersom du med största sannolikhet kommer att vilja modifiera vissa kolumner. Om det inte finns någon WHERE-sats kommer ändringarna att påverka alla rader.

Du kan också använda LIMIT för att begränsa antalet rader som behöver ändras.

RADERA: Ta bort information från en tabell

Precis som UPDATE används den här frågan med WHERE:

För att radera innehållet i en tabell kan du göra det helt enkelt så här:

TA BORT FRÅN användare;

Men det är bättre att använda STYMPA

Förutom att radera, återställer den här frågan också värdena AUTO_INCREMENT och när du lägger till rader igen, kommer räkningen att börja från noll. RADERA det gör det inte, och nedräkningen fortsätter.

Inaktivera lägre värden och speciella ord

Strängvärden

Vissa tecken måste inaktiveras ( fly ), eller så kan det uppstå problem.

För detta används ett snedstreck.(\).

Särskilda ord

Sedan i MySQL det finns många speciella ord ( VÄLJ eller UPPDATERA ), för att undvika fel när du använder dem, måste du använda citattecken. Men inte vanliga citat, utan dessa(`).

Det vill säga, du måste lägga till en kolumn med namnet " radera ", det måste göras så här:

Slutsats

Tack för att du läste till slutet. Jag hoppas att den här artikeln var användbar för dig. Det är inte över än! Fortsättning följer:).

Jag presenterar för din uppmärksamhet en gratis översättning av artikeln SQL för nybörjare

Fler och fler moderna webbapplikationer interagerar med databaser, vanligtvis med hjälp av språket SQL... Lyckligtvis för oss är detta språk ganska lätt att lära sig. I den här artikeln kommer vi att börja lära oss grunderna i SQL-frågor och hur de interagerar med databasen. MySQL.

Vad du behöver

SQL (Structured Query Language) är ett språk designat för att interagera med (DBMS) som t.ex. MySQL, Oracle, Sqlite och andra. För att utföra SQL-frågorna från den här artikeln antar jag att du har installerat MySQL... Jag rekommenderar också att använda phpMyAdmin som ett visuellt visningsverktyg för MySQL.

Följande applikationer gör det enkelt att installera MySQL och phpMyAdmin till din dator:

  • WAMP för Windows
  • MAMP för Mac

Låt oss börja köra frågor på kommandoraden. WAMP innehåller det redan i konsolen MySQL... För MAMP, du kanske behöver läsa detta.

SKAPA DATABAS: Skapa databas

Vår allra första förfrågan. Vi kommer att skapa en databas att arbeta med.

Öppna först konsolen MySQL och logga in. För WAMP, som standard används ett tomt lösenord. För MAMP lösenordet måste vara "root".

När du har loggat in, skriv in denna begäran och klicka Stiga på:

SKAPA DATABAS my_first_db;

Observera att ett semikolon (;) läggs till i slutet av frågan, precis som i slutet av en rad i din kod.

Även nyckelord SKAPA DATABAS skiftlägesokänslig som alla sökord i SQL... Men vi kommer att skriva dem med versaler för bättre läsbarhet.

Obs: teckenuppsättning och sortering

Om du vill ställa in standardteckenuppsättningen och sorteringsordningen, använd en liknande fråga:

SKAPA DATABAS my_first_db DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

Du hittar en lista över teckenuppsättningar och sorteringar som stöds på MySQL.

VISA DATABASER: Lista över alla databaser

Denna fråga används för att visa alla databaser.

SLUTA DATABAS: Släpps en databas

Med den här frågan kan du släppa en befintlig databas.

Var försiktig med den här frågan eftersom den inte visar några varningar. När du har tabeller och data i din databas kommer frågan att radera alla på ett ögonblick.

Tekniskt sett är detta inte en begäran. Det är en "operator" och kräver inget semikolon i slutet.

Han informerar MySQL att du måste välja standarddatabasen och arbeta med den till slutet av sessionen. Vi är nu redo att skapa tabeller och resten i denna databas.

Vad är en databastabell?

Du kan tänka på en tabell i en databas som en vanlig tabell eller som en csv-fil som har strukturerad data.

Som i det här exemplet har tabellen radnamn och datakolumner. Med hjälp av SQL-frågor kan vi skapa den här tabellen. Vi kan också lägga till, läsa, ändra och radera data.

SKAPA TABELL: Skapa tabell

Med denna fråga kan vi skapa en tabell i databasen. Tyvärr, dokumentationen för MySQL inte särskilt vänlig mot nya användare. Strukturen för den här frågan kan vara mycket komplex, men vi börjar med en enkel.

Följande fråga skapar en tabell med två kolumner.

CREATE TABLE-användare (användarnamn VARCHAR (20), create_date DATE);

Observera att vi kan skriva en fråga på flera rader och använda Flik för indragning.

Den första raden är enkel. Vi skapar en tabell som heter användare... Vidare, inom parentes, är tabellens kolumner listade, separerade med kommatecken. Varje kolumnnamn följs till exempel av en datatyp VARCHAR eller DATUM.

VARCHAR (20) betyder att kolumnen är av strängtyp och får inte vara mer än 20 tecken lång. DATUM- datatyp avsedd för lagring av datum i formatet: "ÅÅÅÅ-MM-DD".

Primärnyckel

Innan vi kör den här frågan måste vi infoga en kolumn användar ID, som kommer att vara den PRIMÄRA NYCKELN. Utan att gå in på för mycket detaljer kan du tänka på en primärnyckel som ett sätt att känna igen varje rad med data i en tabell.

Förfrågan blir så här:

CREATE TABLE-användare (user_id INT AUTO_INCREMENT PRIMARY KEY, användarnamn VARCHAR (20), create_date DATE);

INT- 32-bitars heltalstyp (numerisk). AUTO_INCREMENT skapar automatiskt ett nytt id-nummer varje gång en datarad läggs till. Det är inte nödvändigt, men det är bekvämare med det.

Den här kolumnen kanske inte är ett heltal, även om detta är den vanligaste datatypen. Den primära nyckelkolumnen är valfri, men det rekommenderas att använda den för att förbättra din databas prestanda och arkitektur.

Låt oss köra frågan:

VISA TABELLER: Lista över alla tabeller

Frågan låter dig få en lista över alla tabeller i den aktuella databasen.

FÖRKLARA: Visa tabellstruktur

Använd den här frågan för att se strukturen för en befintlig tabell.

Som ett resultat visas fälten (kolumnerna) och deras egenskaper.

SLÄPP TABELL: Släpps ett bord

Också SLUTA DATABASER, raderar denna fråga tabellen och dess innehåll utan någon varning.

ÄNDRA TABELL: Ändra en tabell

En sådan fråga kan vara komplex eftersom den kan göra flera ändringar i en tabell. Låt oss ta en titt på några enkla exempel.

Tack vare läsbarheten SQL, denna begäran är självförklarande.

Att ta bort är lika enkelt. Använd frågan med försiktighet, data raderas utan förvarning.

Låt oss lägga till fältet igen e-post, senare kommer det fortfarande att behövas:

ALTER TABLE användare LÄGG TILL e-post VARCHAR (100) EFTER användarnamn;

Ibland kan du behöva ändra egenskaperna för en kolumn, du behöver inte ta bort den och skapa den igen.

Denna begäran byter namn på fältet Användarnamn v Användarnamn och ändrar dess typ från VARCHAR (20)VARCHAR (30)... Sådana ändringar påverkar inte uppgifterna i tabellen.

INFOGA: Lägger till data i en tabell

Låt oss lägga till poster i tabellen med hjälp av frågor.

Som du kan se, VÄRDEN () innehåller en kommaseparerad lista med värden. Strängvärden omges av enkla citattecken. Värdena måste vara i den ordning som angavs när tabellen skapades.

Observera att det första värdet är NULL för primärnyckeln, vars fält vi namngav användar ID... Allt för att fältet är markerat som AUTO_INCREMENT och id genereras automatiskt. Den första raden med data kommer att ha ett id på 1. Nästa rad som ska läggas till är 2, och så vidare.

Alternativ syntax

Här är en annan syntax för att infoga strängar.

Den här gången använde vi nyckelordet UPPSÄTTNING istället för VÄRDEN... Låt oss notera några saker:

  • Kolumnen kan utelämnas. Vi tilldelade till exempel inget värde till fältet användar ID eftersom det är markerat som AUTO_INCREMENT... Om du inte tilldelar ett värde till ett fält med typen VARCHAR, då tar den som standard värdet av en tom sträng (såvida inte ett annat standardvärde angavs när tabellen skapades).
  • Varje kolumn kan refereras med namn. Därför kan fälten vara i valfri ordning, till skillnad från den tidigare syntaxen.

Alternativ syntax nummer 2

Här är ett annat exempel.

Som tidigare kan du referera till fälten med namn, de kan gå i valfri ordning.

Använd den här frågan för att få id för den senast infogade raden.

NU ()

Det är dags att visa dig hur du använder funktioner MySQL i förfrågningar.

Fungera NU () returnerar det aktuella datumet. Använd den för att automatiskt lägga till det aktuella datumet i ett typfält DATUM.

Observera att vi har fått en varning från MySQL men detta är inte så viktigt. Anledningen är att funktionen NU () returnerar faktiskt tidsinformation.

Vi skapade ett fält skapa datum som bara kan innehålla ett datum och inte en tid, så data har trunkerats. Istället för NU () vi skulle kunna använda CURDATE () som bara returnerar det aktuella datumet, men slutresultatet skulle bli detsamma.

SELECT: Hämtar data från en tabell

Uppenbarligen är den information vi har skrivit värdelös tills vi kan läsa den. En förfrågan kommer till undsättning VÄLJ.

Det enklaste exemplet på att använda en begäran VÄLJ för att läsa data från en tabell:

Asterisken (*) betyder att vi vill få alla kolumner i tabellen. Om du bara behöver få vissa kolumner, använd något sånt här:

Oftare än inte vill vi bara få vissa rader, inte alla. Låt oss till exempel få användarens e-postadress nettuts.

Det liknar ett IF-tillstånd. WHERE låter dig ställa in ett villkor i en fråga och få önskat resultat.

Det enkla tecknet (=) används för likhetsvillkoret, inte det dubbla (==), som du förmodligen använder i programmering.

Du kan också använda andra villkor:

OCH och ELLER används för att kombinera villkor:

Observera att numeriska värden inte behöver stå inom citattecken.

I ()

Används för att jämföra mot flera värden.

TYCKA OM

Låter dig ställa in en mall för sökningen.

Procenttecknet (%) används för att specificera mönstret.

ORDER BY klausul

Använd detta villkor om du vill att resultatet ska returneras sorterat:

Standardordningen är ASC(Stigande). Lägg till DESC att sortera i omvänd ordning.

LIMIT ... OFFSET ...

Du kan begränsa antalet rader som returneras.

GRÄNS 2 tar de två första raderna. LIMIT 1 OFFSET 2 tar en rad efter de två första. GRÄNS 2, 1 betyder samma sak, bara det första numret är offset, och det andra begränsar antalet rader.

UPPDATERING: Uppdaterar data i en tabell

Denna fråga används för att uppdatera data i en tabell.

I de flesta fallen används tillsammans med VAR för att uppdatera specifika rader. Om tillståndet VAR inte specificerat kommer ändringarna att tillämpas på alla rader.

För att begränsa föränderliga strängar kan du använda BEGRÄNSA.

DELETE: Raderar data från en tabell

Också , den här frågan används ofta tillsammans med villkoret VAR.

TRUNKERA BORD

För att ta bort innehåll från en tabell, använd en fråga så här:

TA BORT FRÅN användare;

För bättre prestanda användning .

Återställer även fälträknaren AUTO_INCREMENT, så nyligen tillagda rader kommer att ha id lika med 1. När du använder detta kommer inte att hända och räknaren kommer att fortsätta att växa.

Undvikande strängvärden och speciella ord

Strängvärden

Vissa karaktärer måste escapes annars kan det uppstå problem.

Omvänt snedstreck (\) används för att escape.

Detta är mycket viktigt av säkerhetsskäl. Alla användardata måste escapes innan de skrivs till databasen. V PHP använd funktionen mysql_real_escape_string () eller förberedda satser.

Särskilda ord

Sedan i MySQL många reserverade ord som VÄLJ eller För att undvika förvirring, bifoga kolumn- och tabellnamn inom citattecken. Dessutom behöver du inte använda vanliga citattecken, utan backticks (`).

Låt oss säga att du av någon anledning vill lägga till en kolumn med namnet :

Slutsats

Tack för att du läste artikeln. Jag hoppas att jag kunde visa dig det språket SQL mycket funktionell och lätt att lära sig.