Illustrert selvstudieguide til SQL for nybegynnere. Kategoriarkiver: Bøker om SQL sql-programmeringsspråket for dummies

Fra forfatteren: Har du blitt kalt en tekanne? Vel, dette kan fikses! Hver samovar var en gang en tekanne! Eller var alle profesjonelle en gang en samovar? Nei, igjen er det noe galt! Alt i alt er MySQL for nybegynnere.

Hvorfor dummies trenger MySQL

Hvis du seriøst skal koble livet ditt med Internett, vil du ved de aller første trinnene i "nettet" komme over denne DBMS. MySQL kan trygt kalles "all Internet" databasebehandlingssystemet. Ikke en eneste mer eller mindre seriøs ressurs kan klare seg uten den, den finnes i adminpanelet til hver hosting. Og mest av alt er populære CMS og til og med selvlagde motorer bygget med hennes deltakelse.

Generelt kan du ikke klare deg uten denne plattformen. Men for å studere det trenger du også den riktige tilnærmingen, de riktige verktøyene, og viktigst av alt, lyst og tålmodighet. Jeg håper du har nok av det siste. Og vær forberedt på at hjernen din vil koke, og dampen faller ut av hodet ditt, som fra en ekte tekanne

Men MySQL er så vanskelig for dummies bare hvis du begynner å lære det feil. Vi vil ikke gjøre en slik feil, og vi vil begynne å bli kjent med denne teknologien helt fra begynnelsen.

Enkle konsepter

Først, la oss gå gjennom de grunnleggende konseptene som vi vil nevne i dette innlegget:

Database (DB) er den viktigste konstituerende enheten i DBMS. Databasen inneholder tabeller som består av kolonner og poster (rader). Cellene som dannes i krysset inneholder strukturerte data av en bestemt type.

DBMS (database management system) - et sett med alle programvaremoduler for databaseadministrasjon.

SQL er et strukturert spørrespråk, ved hjelp av hvilket utvikleren "kommuniserer" med kjernen (serveren) i DBMS. Som alle programmeringsspråk har SQL sin egen syntaks, sett med kommandoer og operatører, støttede datatyper.

Jeg tror vi har nok teoretisk kunnskap til å begynne med. Vi vil "male" de manglende hullene i teori med praksis. Nå gjenstår det bare å velge riktig programvareverktøy.

Finne riktig verktøy

Etter å ha "rotet" ganske mye i hele utvalget av MySQL-skall for nybegynnere, innså jeg at disse rett og slett ikke eksisterer. Alle programvareprodukter for DBMS-administrasjon krever en allerede installert databaseserver. Generelt bestemte jeg meg nok en gang for ikke å finne opp "scooteren", og valgte den innenlandske Denwer-pakken. Du kan laste den ned på den offisielle nettsiden.

Den inkluderer allerede alle komponentene i DBMS, slik at en nybegynner kan begynne praktisk bekjentskap med MySQL rett etter en enkel og forståelig installasjon. I tillegg inkluderer Denwer flere andre verktøy som er nødvendige for en nybegynner: lokal server, PHP.

Første steg

Jeg vil ikke beskrive installasjonsprosessen til "gentlemen's"-settet, siden alt skjer automatisk der. Etter å ha startet installasjonen, har du bare tid til å trykke på de nødvendige tastene. Akkurat det du trenger i dummy-versjonen av MySQL.

Når installasjonsprosessen er over, start den lokale serveren, vent et par sekunder. Etter det skriver du localhost i adressefeltet i nettleseren din.

På siden "Hurra, det funker!" følg en av lenkene på bildet. Deretter vil du bli tatt til phpMyAdmin - et skall for databaseadministrasjon.

Ved å klikke på lenken http://downloads.mysql.com/docs/world.sql.zip, vil du laste ned en prøvedatabase fra det offisielle MySQL-nettstedet. Gå til phpMyAdmin igjen, i hovedmenyen øverst gå til fanen "Importer". I vinduet "Importer til gjeldende" i den første delen ("Fil som skal importeres"), sett verdien "Bla gjennom datamaskinen".

I utforskervinduet velger du arkivet med den nedlastede eksempeldatabasen. Ikke glem å klikke "Ok" nederst i hovedvinduet.

Jeg anbefaler deg å ikke endre de angitte parameterverdiene for nå. Dette kan føre til feil visning av dataene til den importerte kilden. Hvis phpMyAdmin gir en feilmelding om at den ikke kan gjenkjenne databasekomprimeringsalgoritmen, pakk den ut og gjenta hele importprosessen fra begynnelsen.

Hvis alt gikk bra, vil programmeldingen vises øverst om at importen var vellykket, og til venstre i DB-listen er det et annet (ord).

La oss se på strukturen fra innsiden slik at du klarere kan forestille deg hva du må forholde deg til.

Klikk på navnet til MySQL Database for Beginners. En liste over tabeller den består av vil vises under den. Klikk på en av dem. Gå deretter til toppmenyen "Struktur". Hovedarbeidsområdet viser strukturen til tabellen: alle kolonnenavn, datatyper og alle attributter.

Denne opplæringen er noe sånt som et "stempel av minnet mitt" for SQL-språket (DDL, DML), dvs. dette er informasjon som har akkumulert i løpet av min yrkesaktivitet og som stadig er lagret i hodet mitt. Dette er et tilstrekkelig minimum for meg, som brukes oftest når jeg jobber med databaser. Hvis det blir nødvendig å bruke mer komplette SQL-konstruksjoner, henvender jeg meg vanligvis til MSDN-biblioteket på Internett for å få hjelp. Etter min mening er det veldig vanskelig å holde alt i hodet, og det er ikke noe særlig behov for dette. Men det er veldig nyttig å kjenne til de grunnleggende konstruksjonene, fordi de kan brukes i nesten samme form i mange relasjonsdatabaser som Oracle, MySQL, Firebird. Forskjellene er hovedsakelig i datatyper, som kan variere i detalj. Det er ikke så mange grunnleggende konstruksjoner av SQL-språket, og med konstant øvelse huskes de raskt. For å lage objekter (tabeller, begrensninger, indekser osv.), er det for eksempel nok å ha en tekstredigerer for miljøet (IDE) for hånden for å jobbe med databasen, og det er ikke nødvendig å studere visuelle verktøy som er skjerpet for arbeider med en bestemt type database (MS SQL, Oracle, MySQL, Firebird, ...). Det er også praktisk fordi all teksten er foran øynene dine, og du trenger ikke å gå gjennom mange faner for å lage for eksempel en indeks eller en begrensning. Med konstant arbeid med en database er det mange ganger raskere å lage, endre og spesielt gjenskape et objekt ved hjelp av skript enn om det gjøres i visuell modus. Også i skriptmodus (følgelig, med tilbørlig forsiktighet) er det lettere å sette og kontrollere reglene for navngivning av objekter (min subjektive mening). I tillegg er skript praktiske å bruke når endringer gjort i en database (for eksempel en test) må overføres i samme form til en annen (produktiv) database.

SQL-språket er delt inn i flere deler, her vil jeg diskutere de 2 viktigste delene av det:
  • DML - Data Manipulation Language, som inneholder følgende konstruksjoner:
    • SELECT - datavalg
    • INSERT - setter inn nye data
    • OPPDATERING - dataoppdatering
    • SLETT - sletter data
    • SLUTNING - datasammenslåing
Fordi Jeg er en praktiker, det vil være lite teori som sådan i denne opplæringen, og alle konstruksjoner vil bli forklart med praktiske eksempler. I tillegg tror jeg at et programmeringsspråk, og spesielt SQL, kun kan mestres i praksis, ved at du selv føler det og forstår hva som skjer når du utfører den eller den konstruksjonen.

Denne opplæringen er basert på Step by Step-prinsippet, dvs. det er nødvendig å lese den sekvensielt og helst umiddelbart etter eksemplene. Men hvis du underveis har behov for å lære mer om en kommando mer detaljert, så bruk et spesifikt søk på Internett, for eksempel i MSDN-biblioteket.

Når jeg skrev denne opplæringen, ble MS SQL Server-databaseversjonen 2014 brukt, for å utføre skriptene jeg brukte MS SQL Server Management Studio (SSMS).

Kort om MS SQL Server Management Studio (SSMS)

SQL Server Management Studio (SSMS) er et verktøy for Microsoft SQL Server for å konfigurere, administrere og administrere databasekomponenter. Dette verktøyet inneholder en script editor (som vi hovedsakelig skal bruke) og et grafisk program som fungerer med serverobjekter og innstillinger. Hovedverktøyet i SQL Server Management Studio er Object Explorer, som lar brukeren se, hente og manipulere serverobjekter. Denne teksten er delvis lånt fra Wikipedia.

For å opprette et nytt skriptredigeringsprogram, bruk Ny spørring-knappen:

For å endre gjeldende database kan du bruke nedtrekkslisten:

For å utføre en spesifikk kommando (eller en gruppe kommandoer), velg den og trykk på Utfør-knappen eller F5-tasten. Hvis det bare er én kommando i editoren for øyeblikket, eller du trenger å utføre alle kommandoer, trenger du ikke velge noe.

Etter å ha utført skript, spesielt de som oppretter objekter (tabeller, kolonner, indekser), for å se endringene, bruk oppdateringen fra kontekstmenyen ved å velge riktig gruppe (for eksempel tabeller), selve tabellen eller kolonnegruppen i den.

Faktisk er dette alt vi trenger å vite for å utføre eksemplene gitt her. Resten av SSMS-verktøyet er enkelt å lære på egen hånd.

Litt teori

En relasjonsdatabase (RDB, eller videre i sammenheng med bare en database) er en samling tabeller som er sammenkoblet. Grovt sett er en database en fil der data lagres i en strukturert form.

DBMS er et styringssystem for disse databasene, dvs. det er et sett med verktøy for å jobbe med en bestemt type database (MS SQL, Oracle, MySQL, Firebird, ...).

Merk
Fordi i livet, i dagligtale, sier vi for det meste: "Oracle DB", eller til og med bare "Oracle", som faktisk betyr "Oracle DBMS", så i sammenheng med denne opplæringen vil begrepet DB noen ganger bli brukt. Ut fra konteksten tror jeg det vil fremgå hva det dreier seg om.

En tabell er en samling av kolonner. Kolonner kan også kalles felt eller kolonner, alle disse ordene vil bli brukt synonymt for å uttrykke det samme.

Tabellen er hovedobjektet til RDB, alle RDB-data lagres linje for linje i kolonnene i tabellen. Strenger, poster er også synonymer.

For hver tabell, så vel som for dens kolonner, er det gitt navn, som de deretter får tilgang til.
Et objektnavn (tabellnavn, kolonnenavn, indeksnavn osv.) i MS SQL kan ha en maksimal lengde på 128 tegn.

For referanse- i ORACLE-databasen kan objektnavn ha en maksimal lengde på 30 tegn. Derfor, for en spesifikk database, må du utvikle dine egne regler for navngivning av objekter for å holde deg innenfor grensen for antall tegn.

SQL er et språk som lar deg utføre spørringer i en database ved hjelp av en DBMS. I et spesifikt DBMS kan SQL-språket ha en spesifikk implementering (sin egen dialekt).

DDL og DML er en undergruppe av SQL-språket:

  • DDL-språket brukes til å lage og endre databasestrukturen, dvs. for å opprette / endre / slette tabeller og lenker.
  • DML-språk tillater manipulering av tabelldata, dvs. med replikkene hennes. Den lar deg velge data fra tabeller, legge til nye data i tabeller og oppdatere og slette eksisterende data.

Det er 2 typer kommentarer som kan brukes i SQL (enkeltlinje og flerlinje):

Enkeltlinjekommentar
og

/ * kommentar med flere linjer * /

Egentlig vil dette være nok for teorien.

DDL - Data Definition Language

Tenk for eksempel på en tabell med data om ansatte, i vanlig form for en person som ikke er programmerer:

I dette tilfellet har kolonnene i tabellen følgende navn: Personalnummer, fullt navn, Fødselsdato, E-post, Stilling, Avdeling.

Hver av disse kolonnene kan karakteriseres av typen data den inneholder:

  • Personalnummer - heltall
  • Fullt navn - streng
  • Fødselsdato - dato
  • E-post - streng
  • Posisjon - streng
  • Avdeling - streng
Kolonnetype er en egenskap som indikerer hva slags data en gitt kolonne kan lagre.

Til å begynne med vil det være nok å huske bare følgende grunnleggende datatyper som brukes i MS SQL:

Betydning MS SQL notasjon Beskrivelse
Variabel lengde streng varchar (N)
og
nvarchar (N)
Med tallet N kan vi spesifisere maksimal mulig radlengde for den tilsvarende kolonnen. For eksempel, hvis vi vil si at verdien av "navn"-kolonnen kan inneholde maksimalt 30 tegn, må vi sette den til typen nvarchar (30).
Forskjellen mellom varchar og nvarchar er at varchar lagrer strenger i ASCII-format, hvor ett tegn er 1 byte, mens nvarchar lagrer strenger i Unicode-format, hvor hvert tegn er 2 byte.
Varchar-typen skal kun brukes hvis du er 100 % sikker på at feltet ikke trenger å lagre Unicode-tegn. For eksempel kan varchar brukes til å lagre e-postadresser fordi de inneholder vanligvis bare ASCII-tegn.
Fast lengde streng røye (N)
og
nchar (N)
Denne typen skiller seg fra en streng med variabel lengde ved at hvis strengen er mindre enn N tegn lang, så er den alltid polstret til høyre til lengden på N med mellomrom og lagret i databasen i denne formen, dvs. den opptar nøyaktig N tegn i databasen (hvor ett tegn opptar 1 byte for char og 2 byte for nchar). I min praksis brukes denne typen svært sjelden, og hvis den brukes, så brukes den hovedsakelig i char (1)-formatet, dvs. når feltet er definert av ett tegn.
Heltall int Denne typen lar oss bruke bare heltall i kolonnen, både positive og negative. For referanse (nå er dette ikke så relevant for oss) - rekkevidden av tall som int-typen tillater er fra -2 147 483 648 til 2 147 483 647. Vanligvis er dette hovedtypen som brukes til å sette identifikatorer.
Reelt eller reelt tall flyte Enkelt sagt er dette tall der et desimaltegn (komma) kan være til stede.
Dato Dato Hvis du bare trenger å lagre Dato i kolonnen, som består av tre komponenter: Antall, Måned og År. For eksempel 15.02.2014 (15. februar 2014). Denne typen kan brukes for kolonnen "Opptaksdato", "Fødselsdato" osv. i tilfeller der det er viktig for oss å fikse kun datoen, eller når tidskomponenten ikke er viktig for oss og kan forkastes eller hvis den ikke er kjent.
Tid tid Denne typen kan brukes hvis kun tidsdata skal lagres i en kolonne, dvs. Timer, minutter, sekunder og millisekunder. For eksempel 17:38: 31.3231603
For eksempel den daglige "Flight Departure Time".
dato og tid dato tid Denne typen lar deg lagre både dato og klokkeslett samtidig. For eksempel, 15.02.2014 17:38: 31.323
Dette kan for eksempel være dato og klokkeslett for en hendelse.
Flagg bit Denne typen er praktisk for å lagre verdier som "Ja" / "Nei", der "Ja" vil bli lagret som 1, og "Nei" vil bli lagret som 0.

Feltverdien, hvis den ikke er forbudt, kan heller ikke spesifiseres, for dette formålet brukes nøkkelordet NULL.

For å kjøre eksemplene, la oss lage en testbase kalt Test.

En enkel database (uten å spesifisere flere parametere) kan opprettes ved å kjøre følgende kommando:

LAG DATABASE Test
Du kan slette databasen med kommandoen (du bør være veldig forsiktig med denne kommandoen):

DROP DATABASE Test
For å bytte til databasen vår kan du kjøre kommandoen:

BRUK Test
Alternativt kan du velge Testdatabasen fra rullegardinlisten i SSMS-menyområdet. Når jeg jobber bruker jeg ofte denne metoden for å bytte mellom baser.

Nå i databasen vår kan vi lage en tabell ved å bruke beskrivelsene slik de er, med mellomrom og kyrilliske tegn:

LAG TABELL [Ansatte] ([Personalnummer] int, [Fullt navn] nvarchar (30), [Fødselsdato] dato, nvarchar (30), [Posisjon] nvarchar (30), [Avdeling] nvarchar (30))
I dette tilfellet må vi sette navnene i hakeparenteser [...].

Men i databasen, for større bekvemmelighet, er det bedre å spesifisere alle navn på objekter i det latinske alfabetet og ikke bruke mellomrom i navnene. I MS SQL, vanligvis i dette tilfellet, begynner hvert ord med stor bokstav, for eksempel for feltet "Personnelnummer" kan vi angi navnet PersonnelNumber. Du kan også bruke numre i navnet, for eksempel PhoneNumber1.

På en lapp
I noen DBMS kan følgende navneformat "PHONE_NUMBER" være mer å foretrekke, for eksempel brukes dette formatet ofte i ORACLE DB. Når du spesifiserer feltnavnet, er det naturligvis ønskelig at det ikke sammenfaller med nøkkelordene som brukes i DBMS.

Av denne grunn kan du glemme syntaksen for hakeparenteser og slette tabellen [Ansatte]:

DROP TABELL [Ansatte]
For eksempel kan en tabell med ansatte hete "Ansatte", og feltene kan navngis som følger:

  • ID – Personalnummer (medarbeider-ID)
  • Navn - fullt navn
  • Fødselsdag - fødselsdato
  • E-post - E-post
  • Posisjon – Posisjon
  • Avdeling - Avdeling
Svært ofte brukes ordet ID for å navngi identifikasjonsfeltet.

La oss nå lage tabellen vår:

LAG TABELL Ansatte (ID int, Navn nvarchar (30), Bursdagsdato, E-post nvarchar (30), Stilling nvarchar (30), Avdeling nvarchar (30))
Du kan bruke NOT NULL-alternativet for å spesifisere nødvendige kolonner.

For en eksisterende tabell kan feltene omdefineres ved hjelp av følgende kommandoer:

Oppdatering av ID-feltet ALTER TABLE Ansatte ALTER COLUMN ID int NOT NULL - oppdatering av Name-feltet ALTER TABLE Ansatte ALTER COLUMN Navn nvarchar (30) NOT NULL

På en lapp
Det generelle konseptet for SQL-språket for de fleste DBMS-er forblir det samme (i det minste kan jeg bedømme dette ut fra DBMS-ene jeg har jobbet med). Forskjellen mellom DDL i forskjellige DBMS-er ligger hovedsakelig i datatyper (her kan ikke bare navnene deres variere, men også detaljene i implementeringen), spesifikasjonene for implementeringen av SQL-språket kan også avvike litt (dvs. essensen av kommandoene er de samme, men det kan være små forskjeller i dialekten, dessverre, men det er ingen standard). Når du kjenner til det grunnleggende om SQL, kan du enkelt bytte fra ett DBMS til et annet, fordi i dette tilfellet trenger du bare å forstå detaljene i implementeringen av kommandoer i det nye DBMS, dvs. i de fleste tilfeller vil en enkel analogi være tilstrekkelig.

Opprett tabell LAG TABELL Ansatte (ID int, - i ORACLE, int type er ekvivalenten (wrapper) for nummer (38) Navn nvarchar2 (30), - nvarchar2 i ORACLE tilsvarer nvarchar i MS SQL Bursdagsdato, E-post nvarchar2 (30) ) , Stilling nvarchar2 (30), Avdeling nvarchar2 (30)); - oppdatering av ID- og Name-feltene (her MODIFY (...) brukes i stedet for ALTER COLUMN) ALTER TABLE Ansatte MODIFY (ID int NOT NULL, Name nvarchar2 (30) NOT NULL); - legge til PK (i dette tilfellet ser konstruksjonen ut som i MS SQL, den vil bli vist nedenfor) ALTER TABLE Ansatte ADD CONSTRAINT PK_Employees PRIMARY KEY (ID);
For ORACLE er det forskjeller når det gjelder implementering av varchar2-typen, kodingen avhenger av databaseinnstillingene og teksten kan lagres, for eksempel i UTF-8-koding. I tillegg kan feltlengden i ORACLE settes både i byte og i tegn, for dette brukes tilleggsalternativer BYTE og CHAR, som er spesifisert etter feltlengden, for eksempel:

NAME varchar2 (30 BYTE) - feltkapasiteten vil være 30 byte NAME varchar2 (30 CHAR) - feltkapasiteten vil være 30 tegn
Hvilket alternativ som vil bli brukt som standard BYTE eller CHAR, i tilfelle av en enkel indikasjon av typen varchar2 (30) i ORACLE, avhenger av databaseinnstillingene, det kan også noen ganger settes i IDE-innstillingene. Generelt kan det noen ganger være lett å bli forvirret, derfor, når det gjelder ORACLE, hvis varchar2-typen brukes (og dette er noen ganger begrunnet her, for eksempel når du bruker UTF-8-koding), foretrekker jeg å eksplisitt skrive CHAR (siden det vanligvis er mer praktisk å lese strenglengden i tegn ).

Men i dette tilfellet, hvis tabellen allerede inneholder noen data, er det nødvendig å fylle ut ID- og Navn-feltene i alle rader i tabellen for vellykket utførelse av kommandoene. La oss demonstrere dette med et eksempel, sett inn data i tabellen i ID, Posisjon og Avdeling-feltene, dette kan gjøres med følgende script:

INSERT Ansatte (ID, Stilling, Avdeling) VERDIER (1000, N "Direktor", N "Administrasjon"), (1001, N "Programmer", N "IT"), (1002, N "Regnskapsfører", N "Regnskap" ), (1003, N "Senior Programmer", N "IT")
I dette tilfellet vil INSERT-kommandoen også generere en feil, siden da vi satte inn, spesifiserte vi ikke verdien til det nødvendige Navn-feltet.
Hvis vi allerede hadde disse dataene i den opprinnelige tabellen, ville kommandoen "ALTER TABLE Employees ALTER COLUMN ID int NOT NULL" ha fullført vellykket, og kommandoen "ALTER TABLE Employees ALTER COLUMN Name int NOT NULL" ville ha generert en feilmelding , at det er NULL (uspesifisert) verdier i Navn-feltet.

Legg til verdier for Navn-feltet og fyll ut dataene på nytt:


Alternativet IKKE NULL kan også brukes direkte når du oppretter en ny tabell, dvs. i sammenheng med CREATE TABLE-kommandoen.

Først, la oss slette tabellen ved å bruke kommandoen:

DROP TABLE Ansatte
La oss nå lage en tabell med obligatoriske kolonner ID og Navn:

LAG TABELL Ansatte (ID int NOT NULL, Navn nvarchar (30) NOT NULL, Bursdagsdato, E-post nvarchar (30), Stilling nvarchar (30), Department nvarchar (30))
Du kan også skrive NULL etter navnet på kolonnen, noe som betyr at NULL-verdier (ikke spesifisert) vil være tillatt i den, men dette er ikke nødvendig, siden denne egenskapen antas som standard.

Hvis det tvert imot er nødvendig å gjøre den eksisterende kolonnen valgfri for fylling, bruker vi følgende kommandosyntaks:

ENDRINGSTABELL Ansatte ENDRE KOLONNE Navn nvarchar (30) NULL
Eller ganske enkelt:

ENDRINGSTABELL Ansatte ENDRE KOLONNE Navn nvarchar (30)
Med denne kommandoen kan vi også endre feltets type til en annen kompatibel type, eller endre lengden. La oss for eksempel utvide feltet Navn til 50 tegn:

ENDRE TABELL Ansatte ENDRE KOLONNE Navn nvarchar (50)

Primærnøkkel

Når du oppretter en tabell, er det ønskelig at den har en unik kolonne eller et sett med kolonner som er unikt for hver av dens rader - en post kan identifiseres unikt med denne unike verdien. Denne verdien kalles primærnøkkelen til tabellen. For vår Ansatte-tabell kan en slik unik verdi være ID-kolonnen (som inneholder "Ansattes personellnummer" - selv om denne verdien i vårt tilfelle er unik for hver ansatt og ikke kan gjentas).

Du kan opprette en primærnøkkel til en eksisterende tabell ved å bruke kommandoen:

ENDRINGSTABELL Ansatte ADD CONSTRAINT PK_Employees PRIMÆR NØKKEL (ID)
Hvor "PK_Employees" er navnet på begrensningen som er ansvarlig for primærnøkkelen. Vanligvis brukes "PK_"-prefikset til å navngi primærnøkkelen, etterfulgt av tabellnavnet.

Hvis primærnøkkelen består av flere felt, må disse feltene være oppført i parentes, atskilt med komma:

ALTER TABLE tabellnavn LEGG TIL BEGRENSNING begrensningsnavn PRIMÆR NØKKEL (felt1, felt2, ...)
Det er verdt å merke seg at i MS SQL må alle felt som er inkludert i primærnøkkelen IKKE være NULL.

Primærnøkkelen kan også defineres direkte når du oppretter tabellen, dvs. i sammenheng med CREATE TABLE-kommandoen. La oss slette tabellen:

DROP TABLE Ansatte
Og la oss lage den ved å bruke følgende syntaks:

LAG TABELL Ansatte (ID int NOT NULL, Navn nvarchar (30) NOT NULL, Bursdagsdato, E-post nvarchar (30), Stilling nvarchar (30), Avdeling nvarchar (30), BEGRENSNING PK_Employees PRIMÆR NØKKEL (ID) - beskriv tross alt PK felt som en begrensning)
Etter opprettelsen fyller du inn dataene i tabellen:

INSERT Ansatte (ID, Stilling, Avdeling, Navn) VERDIER (1000, N "Direktor", N "Administrasjon", N "Ivanov I.I."), (1001, N "Programmer", N "IT", N " Petrov PP " ), (1002, N" Regnskapsfører ", N" Regnskap ", N" Sidorov SS "), (1003, N" Senior programmerer ", N" IT ", N" Andreev A. A.")
Hvis primærnøkkelen i tabellen kun består av verdiene til én kolonne, kan følgende syntaks brukes:

LAG TABELL Ansatte (ID int NOT NULL CONSTRAINT PK_Employees PRIMARY KEY, - spesifiser som en egenskap for feltet Navn nvarchar (30) NOT NULL, Fødselsdato, E-post nvarchar (30), Stilling nvarchar (30), Avdeling nvarchar (30))
Faktisk trenger ikke navnet på begrensningen å angis, i så fall vil den bli tildelt et systemnavn (som "PK__Employee__3214EC278DA42077"):

LAG TABELL Ansatte (ID int NOT NULL, Navn nvarchar (30) NOT NULL, Bursdagsdato, E-post nvarchar (30), Stilling nvarchar (30), Department nvarchar (30), PRIMÆR NØKKEL (ID))
Eller:

LAG TABELL Ansatte (ID int NOT NULL PRIMÆR NØKKEL, Navn nvarchar (30) NOT NULL, Bursdagsdato, E-post nvarchar (30), Stilling nvarchar (30), Avdeling nvarchar (30))
Men jeg vil anbefale å alltid spesifisere begrensningsnavnet for vedvarende tabeller, siden med et eksplisitt gitt og forståelig navn, vil det senere være lettere å manipulere det, for eksempel kan du slette det:

ENDRINGSTABELL Ansatte SLIP BEGRENSNING PK_Ansatte
Men en så kort syntaks, uten å spesifisere navn på restriksjoner, er praktisk å bruke når du oppretter midlertidige databasetabeller (navnet på den midlertidige tabellen begynner med # eller ##), som vil bli slettet etter bruk.

La oss oppsummere

Så langt har vi dekket følgende kommandoer:
  • LAG BORD tabellnavn (oppregning av felt og deres typer, begrensninger) - brukes til å lage en ny tabell i gjeldende database;
  • DROPPE BORD tabellnavn - tjener til å slette en tabell fra gjeldende database;
  • ENDRE TABELL tabellnavn ENDRE KOLONNE kolonnenavn... - brukes til å oppdatere typen til en kolonne eller endre dens innstillinger (for eksempel for å spesifisere NULL eller NOT NULL-karakteristikken);
  • ENDRE TABELL tabellnavn LEGG TIL BEGRENSNING constraint_name PRIMÆRNØKKEL(felt1, felt2, ...) - legge til en primærnøkkel til en eksisterende tabell;
  • ENDRE TABELL tabellnavn DROPPSBEGRENSNING constraint_name - fjerner begrensningen fra tabellen.

Litt om midlertidige bord

Utdrag fra MSDN. Det er to typer midlertidige tabeller i MS SQL Server: lokal (#) og global (##). Lokale midlertidige tabeller er kun synlige for skaperne til tilkoblingen til SQL Server-forekomsten avsluttes, så snart de først er opprettet. Lokale midlertidige tabeller blir automatisk slettet etter at en bruker kobler fra en forekomst av SQL Server. Globale midlertidige tabeller er synlige for alle brukere under alle tilkoblingsøkter etter at disse tabellene er opprettet, og slettes når alle brukere som refererer til disse tabellene kobler fra SQL Server-forekomsten.

Midlertidige tabeller opprettes i tempdb-systemdatabasen, dvs. ved å lage dem, forsøpler vi ikke hovedbasen, ellers er de midlertidige tabellene helt identiske med vanlige tabeller, de kan også droppes ved å bruke DROP TABLE-kommandoen. Lokale (#) midlertidige tabeller er mer vanlig å bruke.

Du kan bruke CREATE TABLE-kommandoen til å lage en midlertidig tabell:

LAG TABELL #Temp (ID int, Navn nvarchar (30))
Siden en midlertidig tabell i MS SQL ligner på en vanlig tabell, kan du også slippe den selv med kommandoen DROP TABLE:

SLIPP TABELL #Temp

Dessuten kan en midlertidig tabell (som en vanlig tabell selv) opprettes og umiddelbart fylles med data som returneres av en spørring ved å bruke SELECT ... INTO-syntaksen:

VELG ID, Navn INTO #Temp FRA ansatte

På en lapp
Implementering av midlertidige tabeller kan variere i forskjellige DBMS-er. For eksempel, i ORACLE og Firebird DBMS, må strukturen til midlertidige tabeller defineres på forhånd med CREATE GLOBAL TEMPORARY TABLE-kommandoen som indikerer spesifikasjonene for lagring av data i den, deretter ser brukeren den blant hovedtabellene og arbeider med den som med et vanlig bord.

Databasenormalisering - oppdeling i undertabeller (referansebøker) og definere relasjoner

Vår nåværende Ansatte-tabell har den ulempen at brukeren kan skrive inn hvilken som helst tekst i Stillings- og Avdelingsfeltene, noe som i utgangspunktet er beheftet med feil, siden en ansatt ganske enkelt kan spesifisere "IT" som avdeling, og en annen ansatt, for for eksempel, skriv inn "IT-avdeling", ved den tredje "IT". Som følge av dette vil det være uklart hva brukeren mente, d.v.s. Er disse ansatte ansatte ved samme avdeling, eller er brukeren beskrevet selv og dette er 3 forskjellige avdelinger? Dessuten vil vi i dette tilfellet ikke være i stand til å gruppere dataene riktig for en rapport, der det kan være nødvendig å vise antall ansatte i sammenheng med hver avdeling.

Den andre ulempen er mengden lagring av denne informasjonen og dens duplisering, dvs. for hver ansatt angis fullt navn på avdelingen, noe som krever plass i databasen for å lagre hvert tegn fra avdelingsnavnet.

Den tredje ulempen er kompleksiteten ved å oppdatere disse feltene hvis navnet på en stilling endres, for eksempel hvis du trenger å gi nytt navn til stillingen "Programmer" til "Junior Programmer". I dette tilfellet må vi gjøre endringer på hver linje i tabellen, der posisjonen er lik "Programmer".

For å unngå disse manglene, brukes den såkalte normaliseringen av databasen - deler den opp i undertabeller, referansetabeller. Det er ikke nødvendig å gå inn i teorijungelen og studere hva normale former er, det er nok å forstå essensen av normalisering.

La oss lage 2 tabeller "Posisjoner" og "Avdelinger", den første vil hete stillinger, og den andre, henholdsvis avdelinger:

CREATE TABLE Posisjoner (ID int IDENTITY (1,1) IKKE NULL BEGRENSNING PK_Positions PRIMARY KEY, Name nvarchar (30) NOT NULL) CREATE TABLE Avdelinger (ID int IDENTITY (1,1) IKKE NULL BEGRENSNING PK_Departments PRIMARY KEY, (30Navn NULL) ) IKKE NULL)
Merk at vi her har brukt det nye IDENTITY-alternativet, som sier at dataene i ID-kolonnen vil nummereres automatisk, fra 1, med et trinn på 1, dvs. når du legger til nye poster, vil de sekvensielt bli tildelt verdiene 1, 2, 3, etc. Slike felt blir ofte referert til som auto-inkrementering. Bare ett felt med IDENTITY-egenskapen kan defineres i en tabell, og vanligvis, men ikke nødvendigvis, er et slikt felt primærnøkkelen for den tabellen.

På en lapp
I ulike DBMS-er kan implementering av felt med teller gjøres på hver sin måte. I MySQL, for eksempel, er et slikt felt definert ved å bruke AUTO_INCREMENT-alternativet. I ORACLE og Firebird tidligere kunne denne funksjonaliteten emuleres ved å bruke SEQUENCE. Men så vidt jeg vet har ORACLE nå lagt til alternativet GENERERT SOM IDENTITET.

La oss fylle disse tabellene automatisk basert på gjeldende data registrert i Stillings- og Avdeling-feltene i tabellen Ansatte:

Fyll ut Navn-feltet i Stillingstabellen med unike verdier fra Stillingsfeltet i Ansatte-tabellen SETT INN stillinger (Navn) VELG DISTINKT posisjon FRA ansatte HVOR stillingen IKKE ER NULL - forkast poster hvis posisjon ikke er spesifisert
La oss gjøre det samme for avdelingstabellen:

SETT INN avdelinger (navn) VELG DISTINKT avdeling FRA ansatte HVOR avdeling IKKE ER NULL
Hvis vi nå åpner tabellene for stillinger og avdelinger, vil vi se et nummerert sett med verdier for ID-feltet:

VELG * FRA posisjoner

VELG * FRA avdelinger

Disse tabellene vil nå spille rollen som oppslagsverk for tildeling av stillinger og avdelinger. Vi vil nå referere til jobb- og avdelings-ID. Først av alt, la oss lage nye felt i tabellen Ansatte for å lagre identifikasjonsdataene:

Legg til et felt for stillingen ID ALTER TABLE Ansatte ADD PositionID int - legg til et felt for IDen til avdelingen ALTER TABLE Ansatte ADD DepartmentID int
Type referansefelt skal være den samme som i referansene, i dette tilfellet er det int.

Du kan også legge til flere felt i tabellen samtidig med én kommando, og liste opp feltene atskilt med kommaer:

ENDRINGSTABELL Ansatte ADD PositionID int, DepartmentID int
Nå vil vi skrive lenker (referansebegrensninger - FOREIGN KEY) for disse feltene slik at brukeren ikke kan skrive i disse feltene verdiene som er fraværende blant ID-verdiene som finnes i oppslagsbøkene.

ALTER TABLE Ansatte ADD CONSTRAINT FK_Employees_PositionID UTENLANDSKE NØKKEL (PosisjonsID) REFERANSER Stillinger (ID)
Og vi vil gjøre det samme for det andre feltet:

ALTER TABLE Ansatte ADD CONSTRAINT FK_Employees_DepartmentID UTENLANDSKE NØKKEL (DepartmentID) REFERANSER Avdelinger (ID)
Nå vil brukeren kun kunne legge inn ID-verdier fra den tilsvarende katalogen i disse feltene. Følgelig, for å bruke en ny avdeling eller stilling, må han først legge til en ny post i den tilsvarende katalogen. Fordi stillinger og avdelinger er nå lagret i kataloger i én enkelt kopi, så for å endre navnet er det nok å endre det bare i katalogen.

Navnet på referansebegrensningen er vanligvis en sammensatt, den består av prefikset "FK_", deretter følger navnet på tabellen, og etter understreken er det navnet på feltet som refererer til identifikatoren til referansetabellen.

Identifikatoren (ID) er vanligvis en intern verdi som kun brukes for lenker og hvilken verdi som er lagret der er i de fleste tilfeller helt likegyldig, så du trenger ikke å prøve å bli kvitt hull i tallrekkefølgen som oppstår under arbeidet med tabellen, for eksempel etter sletting av poster fra oppslagsboken.

ALTER TABLE-tabell ADD CONSTRAINT constraint_name UTENLANDSKE NØKKEL (felt1, felt2, ...) REFERANSER referansetabell (felt1, felt2, ...)
I dette tilfellet, i tabellen "dir_table", er primærnøkkelen representert av en kombinasjon av flere felt (felt1, felt2, ...).

La oss faktisk oppdatere PositionID og DepartmentID-feltene med ID-verdiene fra katalogene. La oss bruke DML UPDATE-kommandoen til dette formålet:

OPPDATERING e SET PositionID = (VELG ID FRA Stillinger WHERE Name = e.Position), AvdelingsID = (VELG ID FRA Avdelinger WHERE Name = e.Department) FRA Ansatte e
La oss se hva som skjedde ved å kjøre spørringen:

VELG * FRA Ansatte

Det er det, StillingsID- og Avdelings-ID-feltene fylles ut tilsvarende stillingene og avdelingene med identifikatorer, det er ikke behov for Stillings- og Avdelingsfeltene i tabellen Ansatte, du kan slette disse feltene:

ENDRINGSTABELL Ansatte SLIPPER KOLONNE Stilling, avdeling
Nå har tabellen fått følgende form:

VELG * FRA Ansatte

ID Navn Fødselsdag E-post Posisjons-ID Avdelings-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. som et resultat ble vi kvitt lagringen av overflødig informasjon. Nå, ved posisjon og avdelingsnummer, kan vi unikt bestemme navnene deres ved å bruke verdiene i referansetabellene:

VELG e.ID, e.Name, p.Name Stillingsnavn, d.Name Avdelingsnavn FRA Ansatte e LEFT JOIN Avdelinger d ON d.ID = e.DepartmentID LEFT JOIN Stillinger p ON p.ID = e.PositionID

I objektinspektøren kan vi se alle objektene som er opprettet for denne tabellen. Herfra kan du utføre ulike manipulasjoner med disse objektene - for eksempel endre navn på eller slette objekter.

Det er også verdt å merke seg at tabellen kan referere til seg selv, dvs. du kan lage en rekursiv lenke. La oss for eksempel legge til et annet ManagerID-felt i tabellen vår med ansatte, som vil peke på den ansatte som denne ansatte er underordnet. La oss lage et felt:

ENDRINGSTABELL Ansatte ADD ManagerID int
NULL er tillatt i dette feltet, feltet vil være tomt dersom det for eksempel ikke er overordnede over den ansatte.

La oss nå lage en UTENLANDSKE NØKKEL på Employees-tabellen:

ENDRINGSTABELL Ansatte ADD CONSTRAINT FK_Employees_ManagerID UTENLANDSKE NØKKEL (ManagerID) REFERANSER Ansatte (ID)
La oss nå lage et diagram og se hvordan relasjonene mellom tabellene våre ser ut på den:

Som et resultat bør vi se følgende bilde (tabellen Ansatte er koblet til tabellene Stillinger og Avdelinger, og refererer også til seg selv):

Til slutt skal det sies at referansenøkler kan inkludere flere alternativer ON DELETE CASCADE og ON UPDATE CASCADE, som forteller hvordan man skal oppføre seg når man sletter eller oppdaterer en post som er referert til i referansetabellen. Hvis disse alternativene ikke er spesifisert, kan vi ikke endre ID i referansetabellen for posten som det er lenker til fra en annen tabell, også vil vi ikke kunne slette en slik post fra referansen før vi sletter alle linjer som refererer til denne posten, eller vi vil oppdatere koblingene i disse linjene til en annen verdi.

La oss for eksempel gjenskape tabellen med ON DELETE CASCADE-alternativet for FK_Employees_DepartmentID:

DROP TABLE Ansatte OPPRETT TABELL Ansatte (ID int NOT NULL, Navn nvarchar (30), bursdagsdato, e-post nvarchar (30), PositionID int, DepartmentID int, ManagerID int, BEGRENSNING PK_Employees PRIMARY KEY (ID), CONSTRAINT EIGN_Department (CONSTRAINT EIGNDepartment) ) REFERANSER Avdelinger (ID) PÅ SLETT CASCADE, BEGRENSNING FK_Employees_PositionID FOREIGN KEY (PositionID) REFERANSER Stillinger (ID), CONSTRAINT FK_Employees_ManagerID FOREIGN KEY (ManagerID) REFERENCES Stillinger ID (IDS0), (N Ansettelses-ID, 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)
La oss slette avdelingen med ID 3 fra avdelingstabellen:

SLETT avdelinger WHERE ID = 3
La oss se på dataene i tabellen Ansatte:

VELG * FRA Ansatte

ID Navn Fødselsdag E-post Posisjons-ID Avdelings-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 ser er også dataene for avdeling 3 slettet fra tabellen Ansatte.

Alternativet ON UPDATE CASCADE oppfører seg på samme måte, men det fungerer når ID-verdien i oppslaget er oppdatert. For eksempel, hvis vi endrer stillings-ID i stillingskatalogen, vil avdelings-ID i tabellen Ansatte bli oppdatert til den nye ID-verdien som vi spesifiserte i katalogen. Men i dette tilfellet vil det rett og slett ikke være mulig å demonstrere dette, siden ID-kolonnen i avdelingstabellen har IDENTITY-alternativet, som ikke vil tillate oss å utføre følgende forespørsel (endre avdelings-ID 3 til 30):

OPPDATERING AV avdelinger SET ID = 30 WHERE ID = 3
Det viktigste er å forstå essensen av disse 2 alternativene PÅ SLETT CASCADE og PÅ OPPDATERING AV CASCADE. Jeg bruker disse alternativene i svært sjeldne tilfeller, og jeg anbefaler at du tenker deg nøye om før du bruker dem i en referansebegrensning. hvis du ved et uhell sletter en post fra oppslagstabellen, kan dette føre til store problemer og skape en kjedereaksjon.

La oss gjenopprette avdeling 3:

Gi tillatelse til å legge til / endre IDENTITY-verdi SET IDENTITY_INSERT Avdelinger ON INSERT Avdelinger (ID, navn) VALUES (3, N "IT") - forby å legge til / endre IDENTITY-verdi SET IDENTITY_INSERT Avdelinger AV
La oss rydde opp i Employees-tabellen fullstendig ved å bruke TRUNCATE TABLE-kommandoen:

TRUNCATE TABLE Ansatte
Og igjen, last inn dataene på nytt ved å bruke den forrige INSERT-kommandoen:

INSERT Ansatte (ID, navn, fødselsdag, stillings-ID, avdelings-ID, leder-ID) VERDIER (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)

La oss oppsummere

For øyeblikket er noen flere DDL-kommandoer lagt til vår kunnskap:
  • Legge til IDENTITY-egenskapen til et felt - lar deg gjøre dette feltet automatisk fylt (tellerfelt) for tabellen;
  • ENDRE TABELL tabellnavn LEGG TIL list_of_fields_with_characteristics - lar deg legge til nye felt i tabellen;
  • ENDRE TABELL tabellnavn DROPPE KOLONNE list_of_field - lar deg slette felt fra tabellen;
  • ENDRE TABELL tabellnavn LEGG TIL BEGRENSNING constraint_name UTENLANDSKE NØKKEL(Enger) REFERANSER reference_table (felt) - lar deg definere forholdet mellom tabellen og referansetabellen.

Andre restriksjoner - UNIK, STANDARD, KONTROLL

Med UNIQUE-begrensningen kan du si at verdiene for hver rad i et gitt felt eller sett med felt må være unike. Når det gjelder tabellen Ansatte, kan vi pålegge en slik begrensning i feltet E-post. Bare forhåndsfyll e-post med verdier, hvis de ikke allerede er definert:

OPPDATERING Ansatte SET E-post = " [e-postbeskyttet]"WHERE ID = 1000 OPPDATERING Ansatte SET E-post =" [e-postbeskyttet]"WHERE ID = 1001 OPPDATERING Ansatte SET E-post =" [e-postbeskyttet]"WHERE ID = 1002 OPPDATERING Ansatte SET E-post =" [e-postbeskyttet]"HVOR ID = 1003
Og nå kan du legge en unikhetsbegrensning på dette feltet:

ENDRINGSTABELL Ansatte ADD CONSTRAINT UQ_Employees_Email UNIQUE (E-post)
Nå vil ikke brukeren kunne legge inn samme e-post for flere ansatte.

Unikitetsbegrensningen heter vanligvis som følger - først kommer prefikset "UQ_", deretter navnet på tabellen, og etter understreken er det navnet på feltet som denne begrensningen brukes på.

Følgelig, hvis en kombinasjon av felt skal være unik i sammenheng med tabellrader, viser vi dem atskilt med komma:

ALTER TABLE tabellnavn LEGG TIL BEGRENSNING begrensningsnavn UNIK (felt1, felt2, ...)
Ved å legge til en DEFAULT-begrensning i feltet, kan vi angi en standardverdi som vil bli erstattet hvis, når du setter inn en ny post, dette feltet ikke er oppført i listen over felt til INSERT-kommandoen. Denne begrensningen kan settes direkte når du oppretter en tabell.

La oss legge til et nytt Avtaledato-felt i Ansatte-tabellen og gi det navnet HireDate og si at standardverdien for dette feltet er gjeldende dato:

ENDRINGSTABELL Ansatte LEGG TIL Ansett dato IKKE NULL STANDARD SYSDATETIME ()
Eller hvis HireDate-kolonnen allerede eksisterer, kan følgende syntaks brukes:

ENDRINGSTABELL Ansatte LEGG TIL STANDARD SYSDATETIME () FOR HireDate
Her spesifiserte jeg ikke navnet på begrensningen, siden i tilfellet DEFAULT var jeg av den oppfatning at dette ikke er så kritisk. Men hvis du gjør det på en vennskapelig måte, så synes jeg, du skal ikke være lat, og du bør gi et normalt navn. Dette gjøres som følger:

ALTER TABLE Ansatte ADD CONSTRAINT DF_Employees_HireDate STANDARD SYSDATETIME () FOR HireDate
Siden denne kolonnen ikke eksisterte før, når den legges til hver post, vil gjeldende datoverdi settes inn i HireDate-feltet.

Når du legger til en ny post, vil gjeldende dato også settes inn automatisk, selvfølgelig, hvis vi ikke eksplisitt setter den, dvs. vil ikke spesifiseres i listen over kolonner. La oss vise dette med et eksempel uten å spesifisere HireDate-feltet i listen over tilleggsverdier:

INSERT Ansatte (ID, navn, e-post) VERDIER (1004, N "Sergeev S.S.", " [e-postbeskyttet]")
La oss se hva som skjedde:

VELG * FRA Ansatte

ID Navn Fødselsdag E-post Posisjons-ID Avdelings-ID ManagerID LeieDato
1000 Ivanov I.I. 1955-02-19 [e-postbeskyttet] 2 1 NULL 2015-04-08
1001 Petrov P.P. 1983-12-03 [e-postbeskyttet] 3 4 1003 2015-04-08
1002 Sidorov S.S. 1976-06-07 [e-postbeskyttet] 1 2 1000 2015-04-08
1003 Andreev A.A. 1982-04-17 [e-postbeskyttet] 4 3 1000 2015-04-08
1004 Sergeev S.S. NULL [e-postbeskyttet] NULL NULL NULL 2015-04-08

CHECK-begrensningen brukes når det er nødvendig å kontrollere verdiene som er satt inn i feltet. La oss for eksempel pålegge denne begrensningen på personellnummerfeltet, som er den ansattes identifikator (ID). Ved å bruke denne begrensningen, la oss si at personelltall skal ha en verdi mellom 1000 og 1999:

ENDRINGSTABELL Ansatte ADD BEGRENSNING CK_Employees_ID CHECK (ID MELLOM 1000 OG 1999)
Begrensningen heter vanligvis det samme, først kommer prefikset "CK_", deretter navnet på tabellen og navnet på feltet som denne begrensningen er pålagt.

La oss prøve å sette inn en ugyldig oppføring for å sjekke at begrensningen fungerer (vi bør få den tilsvarende feilen):

INSERT ansatte (ID, e-post) VERDIER (2000, " [e-postbeskyttet]")
La oss nå endre den innsatte verdien til 1500 og sørge for at posten er satt inn:

INSERT ansatte (ID, e-post) VERDIER (1500, " [e-postbeskyttet]")
Du kan også opprette UNIQUE og CHECK-begrensninger uten å spesifisere et navn:

ENDRING TABELL Ansatte LEGG TIL UNIK (E-post) ENDRING TABELL Ansatte LEGG TIL KONTROLL (ID MELLOM 1000 OG 1999)
Men dette er ikke en god praksis, og det er bedre å spesifisere navnet på begrensningen eksplisitt, siden for å finne ut av det senere, som vil være vanskeligere, må du åpne objektet og se hva det er ansvarlig for.

Med et godt navn kan mye informasjon om begrensningen gjenkjennes direkte på navnet.

Og følgelig kan alle disse begrensningene opprettes umiddelbart når du oppretter en tabell, hvis den ikke allerede eksisterer. La oss slette tabellen:

DROP TABLE Ansatte
Og vi vil gjenskape den med alle opprettede restriksjoner med én CREATE TABLE-kommando:

LAG TABELL Ansatte (ID int NOT NULL, Navn nvarchar (30), bursdagsdato, e-post nvarchar (30), PositionID int, DepartmentID int, HireDate dato IKKE NULL STANDARD SYSDATETIME (), - for STANDARD vil jeg kaste CONSTRAINT PK_Employees unntak PRIMÆR (ID), CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY (DepartmentID) REFERENCES Avdelinger (ID), CONSTRAINT FK_Employees_PositionID FOREIGN KEY (PositionID) REFERENCES Posisjoner (ID), CONSTRAINT UQ_Employees_Email) UNIQUE (Email)

INSERT ansatte (ID, navn, bursdag, e-post, stillings-ID, avdelings-ID) VERDIER (1000, N "Ivanov I.I.", "19550219", " [e-postbeskyttet]", 2,1), (1001, N" Petrov P.P. "," 19831203 "," [e-postbeskyttet]", 3,3), (1002, N" Sidorov S.S. "," 19760607 "," [e-postbeskyttet]", 1,2), (1003, N" Andreev A.A. "," 19820417 "," [e-postbeskyttet]",4,3)

Litt om indekser opprettet når du oppretter PRIMÆR NØKKEL og UNIKE begrensninger

Som du kan se i skjermbildet ovenfor, ble det automatisk opprettet indekser med samme navn (PK_Employees og UQ_Employees_Email) når du oppretter PRIMÆRKØKKEL og UNIKE begrensninger. Som standard er indeksen for primærnøkkelen opprettet som KLUSTERET, og for alle andre indekser som IKKE KLUSTERET. Det skal sies at ikke alle DBMS har konseptet med en klynget indeks. En tabell kan bare ha én KLUSTERET indeks. CLUSTERED - betyr at tabellposter vil bli sortert etter denne indeksen, man kan også si at denne indeksen har direkte tilgang til alle tabelldata. Dette er tabellens hovedindeks, for å si det sånn. Mer grovt sett er det en indeks boltet til bordet. Den grupperte indeksen er et veldig kraftig verktøy som kan hjelpe deg med å optimalisere søkene dine, bare ha det i bakhodet for nå. Hvis vi vil fortelle at den grupperte indeksen ikke skal brukes i primærnøkkelen, men for en annen indeks, må vi spesifisere alternativet IKKE CLUSTERED når vi oppretter primærnøkkelen:

ALTER TABLE tabellnavn LEGG TIL BEGRENSNING begrensningsnavn PRIMÆR NØKKEL IKKE KLUSTERET (felt1, felt2, ...)
La oss for eksempel gjøre PK_Employees-begrensningsindeksen ikke-klynget og UQ_Employees_Email-begrensningsindeksen klynget. Først av alt fjerner vi disse begrensningene:

ENDRE TABELL Ansatte SLIPPER BEGRENSNING PK_Ansatte ENDRING TABELL Ansatte SLIPPER BEGRENSNING UQ_Employees_Email
La oss nå lage dem med alternativene CLUSTERED og IKKE-CLUSTERED:

ENDRE TABELL Ansatte ADD CONSTRAINT PK_Employees PRIMÆR NØKKEL IKKE KLUSTERET (ID) ENDRING TABELL Ansatte ADD CONSTRAINT UQ_Employees_Email UNIQUE CLUSTERED (E-post)
Nå, etter å ha hentet fra tabellen Employees, kan vi se at postene er sortert etter den grupperte UQ_Employees_Email-indeksen:

VELG * FRA Ansatte

ID Navn Fødselsdag E-post Posisjons-ID Avdelings-ID LeieDato
1003 Andreev A.A. 1982-04-17 [e-postbeskyttet] 4 3 2015-04-08
1000 Ivanov I.I. 1955-02-19 [e-postbeskyttet] 2 1 2015-04-08
1001 Petrov P.P. 1983-12-03 [e-postbeskyttet] 3 3 2015-04-08
1002 Sidorov S.S. 1976-06-07 [e-postbeskyttet] 1 2 2015-04-08

Før dette, når PK_Employees-indeksen var den grupperte indeksen, ble postene sortert etter ID som standard.

Men i dette tilfellet er dette bare et eksempel som viser essensen av den grupperte indeksen, siden mest sannsynlig vil forespørsler bli gjort til tabellen Ansatte ved ID-feltet, og i noen tilfeller kan det i seg selv fungere som en oppslagsbok.

For oppslag er det vanligvis tilrådelig at den grupperte indeksen bygges på primærnøkkelen, siden i forespørsler refererer vi ofte til en katalogidentifikator for å få for eksempel navnet (Posisjon, Avdeling). Her husker vi det jeg skrev ovenfor, at den grupperte indeksen har direkte tilgang til radene i tabellen, og av dette følger det at vi kan få verdien av en hvilken som helst kolonne uten ekstra overhead.

Det er fordelaktig å bruke en gruppert indeks på de feltene som oftest samples.

Noen ganger opprettes en nøkkel i tabeller av et surrogatfelt, i så fall er det nyttig å lagre CLUSTERED indeksalternativet for en mer passende indeks og spesifisere IKKE CLUSTERED når du oppretter en surrogat primærnøkkel.

La oss oppsummere

På dette stadiet ble vi kjent med alle typer begrensninger, i deres enkleste form, som er opprettet av en kommando av formen "ENDRE TABELL tabellnavn ADD CONSTRAINT constraint_name ...":
  • PRIMÆRNØKKEL- primærnøkkel;
  • UTENLANDSKE NØKKEL- sette opp lenker og kontrollere referanseintegriteten til data;
  • UNIK- lar deg skape unikhet;
  • KRYSS AV- tillater riktigheten av de angitte dataene;
  • MISLIGHOLDE- lar deg angi standardverdien;
  • Det er også verdt å merke seg at alle restriksjoner kan fjernes ved å bruke kommandoen " ENDRE TABELL tabellnavn DROPPSBEGRENSNING constraint_name ".
Vi berørte også delvis temaet indekser og analyserte begrepet klynge ( KLUSTERET) og ikke-gruppert ( IKKE-KLUSTERET) indeks.

Lag frittstående indekser

Selvtillit refererer her til indekser som ikke er opprettet for en PRIMÆRKØKKEL eller UNIK begrensning.

Indekser etter felt eller felt kan opprettes med følgende kommando:

CREATE INDEX IDX_Employees_Name ON Employees (Name)
Også her kan du spesifisere alternativene CLUSTERED, IKKE-KLUSTERET, UNIQUE, og du kan også spesifisere sorteringsretningen for hvert enkelt felt ASC (som standard) eller DESC:

LAG UNIK IKKE-KLUSTERET INDEKS UQ_Employees_EmailDesc ON Ansatte (E-post DESC)
Når du oppretter en ikke-klynget indeks, kan alternativet IKKE-KLUSTERET frigis fordi det er standard, og vises her ganske enkelt for å indikere posisjonen til CLUSTERED eller IKKE-CLUSTERED-alternativet i kommandoen.

Du kan slette indeksen med følgende kommando:

DROP INDEX IDX_Employees_Name ON Ansatte
Enkle indekser, som begrensninger, kan opprettes i konteksten av CREATE TABLE-kommandoen.

La oss for eksempel droppe tabellen igjen:

DROP TABLE Ansatte
Og vi vil gjenskape den med alle opprettede begrensninger og indekser med én CREATE TABLE-kommando:

OPPRETT TABELL Ansatte (ID int NOT NULL, Navn nvarchar (30), bursdagsdato, e-post nvarchar (30), PositionID int, DepartmentID int, HireDate date NOT NULL CONSTRAINT DF_Employees_HireDate DEFAULT SYSDATETIME (),AnsettelsesID int, CONSTRAINT), CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY (DepartmentID) REFERENCES Avdelinger (ID), CONSTRAINT FK_Employees_PositionID FOREIGN KEY (PositionID) REFERENCES Posisjoner (ID), CONSTRAINT FK_Employees_ManagerID FOREIGN NØKKEL (10m) (EXTRAINT 1_0m) CHECK (1E9m) (EXP400)
Til slutt, la oss sette inn våre ansatte i tabellen:

INSERT ansatte (ID, navn, bursdag, e-post, stillings-ID, avdelings-ID, leder-ID) VERDIER (1000, N "Ivanov I.I.", "19550219", " [e-postbeskyttet]", 2,1, NULL), (1001, N" Petrov P.P. "," 19831203 "," [e-postbeskyttet]", 3,3,1003), (1002, N" Sidorov S.S. "," 19760607 "," [e-postbeskyttet]", 1,2,1000), (1003, N" Andreev A.A. "," 19820417 "," [e-postbeskyttet]",4,3,1000)
I tillegg er det verdt å merke seg at du kan inkludere verdier i en ikke-klynget indeks ved å spesifisere dem i INCLUDE. De. i dette tilfellet vil INCLUDE-indeksen ligne noe på en klynget indeks, bare nå er ikke indeksen boltet til bordet, men de nødvendige verdiene er boltet til indeksen. Følgelig kan slike indekser forbedre ytelsen til utvalgte spørringer (SELECT), hvis alle de oppførte feltene er til stede i indeksen, kan det hende at det ikke er nødvendig å få tilgang til tabellen i det hele tatt. Men dette øker naturligvis størrelsen på indeksen, siden verdiene til de oppførte feltene dupliseres i indeksen.

Utdrag fra MSDN. Generell kommandosyntaks for å lage indekser

LAG [UNIKK] [KLUSTERET | IKKE KLUSTERET] INDEX index_name PÅ (kolonne [ASC | DESC] [, ... n]) [INCLUDE (column_name [, ... n])]

La oss oppsummere

Indekser kan øke hastigheten på datainnhenting (SELECT), men indekser reduserer hastigheten på endring av tabelldata, fordi etter hver endring, vil systemet måtte gjenoppbygge alle indekser for en bestemt tabell.

Det er tilrådelig i hvert enkelt tilfelle å finne den optimale løsningen, den gyldne middelvei, slik at både prøvetakingsytelse og datamodifikasjon er på riktig nivå. Strategien for å lage indekser og antallet kan avhenge av mange faktorer, for eksempel hvor ofte dataene i tabellen endres.

DDL-konklusjon

Som du kan se, er ikke DDL så komplisert som det kan virke ved første øyekast. Her var jeg i stand til å vise nesten alle de grunnleggende konstruksjonene, ved å bruke bare tre tabeller.

Det viktigste er å forstå essensen, og resten er et spørsmål om praksis.

Lykke til med dette fantastiske språket som heter SQL.

Velkommen til bloggsiden min. I dag skal vi snakke om sql-spørringer for nybegynnere. Noen webansvarlige kan ha et spørsmål. Hvorfor lære sql? Kan du ikke gjøre det?

Det viser seg at dette ikke vil være nok til å lage et profesjonelt internettprosjekt. Sql brukes til å jobbe med databaser og lage applikasjoner for WordPress. La oss se nærmere på hvordan du bruker spørringer.

Hva det er

SQL er et strukturert spørrespråk. Designet for å definere typen data, gi tilgang til dem og behandle informasjon i løpet av korte tidsrom. Den beskriver komponentene eller en slags resultater du ønsker å se på Internett-prosjektet.

Enkelt sagt lar dette programmeringsspråket deg legge til, endre, søke og vise informasjon i databasen. Populariteten til mysql skyldes det faktum at den brukes til å lage dynamiske Internett-prosjekter basert på en database. Derfor, for å utvikle en funksjonell blogg, må du lære dette språket.

Hva kan gjøre

SQL-språket tillater:

  • lage tabeller;
  • endre motta og lagre forskjellige data;
  • kombinere informasjon i blokker;
  • beskytte data;
  • opprette forespørsler i tilgang.

Viktig! Etter å ha behandlet sql, kan du skrive applikasjoner for WordPress uansett kompleksitet.

Hvilken struktur

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

Hun har et navn, kolonner og en rad med litt informasjon. Du kan lage slike tabeller ved å bruke sql-spørringer.

Hva du trenger å vite


Høydepunkter når du lærer SQL

Som nevnt ovenfor, brukes spørringer til å behandle og legge inn ny informasjon i en database som består av tabeller. Hver av linjene er en egen oppføring. Så la oss lage en database. For å gjøre dette, skriv kommandoen:

Opprett database "bazaname"

I anførselstegn skriver du navnet på databasen på latin. Prøv å finne et meningsfullt navn for henne. Ikke lag en base som "111", "www" og lignende.

Etter å ha opprettet databasen, installer:

SET NAME "utf-8"

Dette er nødvendig for at innholdet på siden skal vises riktig.

Nå lager vi en tabell:

LAG TABELL 'bazaname'. 'Tabell' (

id INT (8) IKKE NULL AUTO_INCREMENT PRIMÆR NØKKEL,

logg VARCHAR (10),

passerer VARCHAR (10),

dato DATO

På den andre linjen har vi skrevet tre attributter. La oss se hva de betyr:

  • NOT NULL-attributtet betyr at cellen ikke vil være tom (dette feltet er obligatorisk);
  • AUTO_INCREMENT verdi - autofullføring;
  • PRIMARY KEY er primærnøkkelen.

Hvordan legge til informasjon

For å fylle feltene i den opprettede tabellen med verdier, bruk INSERT-setningen. Vi skriver følgende kodelinjer:

SETTE INN I "tabell"

(pålogging, pass, dato) VERDIER

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

I parentes angir vi navnene på kolonnene, og i neste - verdiene.

Viktig! Observer rekkefølgen av kolonnenavn og betydninger.

Hvordan oppdatere informasjon

For å gjøre dette, bruk UPDATE-kommandoen. La oss se hvordan du endrer passordet for en bestemt bruker. Vi skriver følgende kodelinjer:

OPPDATER 'tabell' SET pass = '12345678' WHERE id = '1'

Endre nå passordet '12345678'. Endringer gjøres på linjen med "id" = 1. Hvis du ikke skriver WHERE-kommandoen, vil alle linjer endres, ikke en spesifikk.

Jeg anbefaler at du kjøper boken" SQL for Dummies ". Med dens hjelp vil du kunne jobbe profesjonelt med databasen trinn for trinn. All informasjon er strukturert fra enkel til kompleks og vil bli godt mottatt.

Slik sletter du en oppføring

Hvis du skrev noe feil, korriger det med DELETE-kommandoen. Fungerer på samme måte som UPDATE. Vi skriver følgende kode:

SLETT FRA 'tabell' HVOR id = '1'

Henter informasjon

For å hente verdier fra databasen, bruk SELECT-kommandoen. Vi skriver følgende kode:

VELG * FRA 'tabell' HVOR id = '1'

I dette eksemplet velger vi alle tilgjengelige felt i tabellen. Dette skjer hvis du skriver en stjerne "*" i kommandoen. Hvis du trenger å velge en prøveverdi, skriver vi slik:

SELECT-logg, pass FROM-tabell WHERE id = '1'

Det skal bemerkes at evnen til å jobbe med databaser ikke vil være nok. For å lage et profesjonelt Internett-prosjekt, må du lære hvordan du legger til data fra databasen på sidene. For å gjøre dette, gjør deg kjent med php-nettprogrammeringsspråket. Dette vil hjelpe deg klasseromskurs av Mikhail Rusakov .


Å slippe et bord

Oppstår med en DROP-forespørsel. For å gjøre dette, skriv følgende linjer:

DROP TABELL tabell;

Utgang av en post fra en tabell i henhold til en spesifikk tilstand

Tenk på en kode som denne:

VELG ID, land, by FRA tabell HVOR personer> 150000000

Den vil vise registreringer av land der befolkningen er over hundre og femti millioner.

En forening

Det er mulig å koble sammen flere tabeller ved å bruke Join. Hvordan det fungerer, se denne videoen mer detaljert:

PHP og MySQL

Nok en gang vil jeg understreke at det er vanlig å stille spørsmål når man lager et internettprosjekt. For å bruke dem i php-dokumenter, følg denne prosedyren:

  • Vi kobler til databasen ved å bruke kommandoen mysql_connect ();
  • Bruk mysql_select_db () for å velge den nødvendige databasen;
  • Vi behandler forespørselen ved å bruke mysql_fetch_array ();
  • Vi lukker forbindelsen med kommandoen mysql_close ().

Viktig! Å jobbe med en database er ikke vanskelig. Det viktigste er å skrive forespørselen riktig.

Nybegynnere webansvarlige vil tenke. Hva skal du lese om dette emnet? Jeg vil gjerne anbefale boken til Martin Graber " SQL for rene dødelige ". Det er skrevet på en slik måte at alt vil være klart for nybegynnere. Bruk den som oppslagsbok.

Men dette er teori. Hva er situasjonen i praksis? I virkeligheten må et Internett-prosjekt ikke bare opprettes, men også bringes til TOPPEN av Google og Yandex. Videokurset " Oppretting og markedsføring av nettsider ».


Videoinstruksjon

Har du fortsatt spørsmål? Se nettvideoen mer detaljert.

Konklusjon

Så å håndtere å skrive sql-spørringer er ikke så vanskelig som det ser ut til, men enhver webmaster må gjøre det. Dette vil hjelpe videokursene beskrevet ovenfor. Abonner på min VKontakte-gruppe å være den første som får vite om fremveksten av ny interessant informasjon.

De fleste moderne webapplikasjoner samhandler med databaser, vanligvis ved å bruke et språk som kalles SQL. Heldigvis for oss er dette språket veldig enkelt å lære. I denne artikkelen vil vi se på enkle SQL forespørsler og lær hvordan du bruker dem til å samhandle med MySQL-database.

Hva trenger du?

SQL (Structured Query Language) et språk spesielt utviklet for å samhandle med databasestyringssystemer som f.eks MySQL, Oracle, Sqlite og andre ... Å utføre SQL forespørsler i denne artikkelen, anbefaler jeg deg å installere MySQL til den lokale datamaskinen. Jeg anbefaler også å bruke phpMyAdmin som et visuelt grensesnitt.

Alt dette er tilgjengelig i alles elskede Denver. Jeg synes alle burde vite hva det er og hvor man får tak i det :). Kan ellers bruk WAMP eller MAMP.

Denver har en innebygd MySQL konsoll. Vi vil bruke den.

LAG DATABASE:opprettelse av database

Dette er vår første forespørsel. Vi vil lage vår første database for videre arbeid.

Først, åpne MySQL konsoll og pålogging. Til WAMP standardpassordet er tomt. Altså ingenting :). Til MAMP er "root". For Denver må avklares.

Etter pålogging, skriv inn følgende linje og klikk Tast inn:

LAG DATABASE my_first_db;

Merk at semikolon (;) legges til på slutten av spørringen, akkurat som på andre språk.

Se også kommandoer i SQL skiller mellom store og små bokstaver. Vi skriver dem med store bokstaver.

Alternativ bare: Karaktersettog Samling

Hvis du ønsker å installere tegnsett og sortering kan være skriv følgende kommando:

LAG DATABASE my_first_db STANDARD TEGNSETT utf8 SAMLER utf8_general_ci;

Finner en liste over tegnsett som støttes i MySQL.

VIS DATABASER:viser alle databaser

Denne kommandoen brukes til å vise alle tilgjengelige databaser.

DROP DATABASE:sletting av en database

Du kan slette en eksisterende DB ved å bruke denne spørringen.

Vær forsiktig med denne kommandoen da den kjører uten forvarsel. Hvis databasen din inneholder data, vil alt bli slettet.

BRUK:Databasevalg

Teknisk sett er dette ikke en spørring, men en operatør og krever ikke et semikolon på slutten.

Det forteller MySQL velg standarddatabasen for gjeldende økt. Nå er vi klare til å lage tabeller og gjøre andre ting med databasen.

Hva er en tabell i en database?

Du kan representere tabellen i DB som Excel-fil.

Akkurat som på bildet har tabeller kolonnenavn, rader og informasjon. Via SQL spørringer, kan vi lage slike tabeller. Vi kan også legge til, lese, oppdatere og slette informasjon.

LAG TABELL: Opprette en tabell

C ved å bruke denne spørringen kan vi lage tabeller i databasen. Beklager, dokumentasjonen MySQL ikke veldig klart for nybegynnere i denne saken. Strukturen til denne typen søk kan være svært kompleks, men vi starter med en enkel.

Følgende spørring vil lage en tabell med 2 kolonner.

CREATE TABLE-brukere (brukernavn VARCHAR (20), create_date DATE);

Vær oppmerksom på at vi kan skrive spørsmålene våre på flere linjer og med faner for innrykk.

Den første linjen er enkel. Vi lager bare en tabell som heter "brukere". Deretter, i parentes, atskilt med komma, er det en liste over alle kolonnene. Etter hvert kolonnenavn har vi informasjonstyper som VARCHAR eller DATE.

VARCHAR (20) betyr at kolonnen er av typen streng og kan maksimalt være på 20 tegn. DATO er også en type informasjon som brukes til å lagre datoer i dette formatet: "ÅÅÅÅ - MM-DD".

PRIMÆRNØKKEL ( primærnøkkelh)

Før vi utfører neste spørring, må vi også inkludere en kolonne for "user_id", som vil være vår primærnøkkel. Du kan tenke på en PRIMÆR NØKKEL som informasjon som brukes til å identifisere hver rad i en tabell.

CREATE TABLE-brukere (user_id INT AUTO_INCREMENT PRIMARY KEY, brukernavn VARCHAR (20), create_date DATE);

INT lager en 32-bits heltallstype (som tall). AUTO_INCREMENT genererer automatisk en ny verdi ID hver gang vi legger til nye rader med informasjon. Dette er valgfritt, men det gjør hele prosessen enklere.

Denne kolonnen trenger ikke å være en heltallsverdi, men den er mest brukt. Tilstedeværelsen av primærnøkkelen er også valgfri, men den anbefales for arkitekturen og ytelsen til databasen.

La oss kjøre spørringen:

VIS TABELLER:vis alle tabeller

Denne spørringen lar deg få en liste over tabeller som er i databasen.

FORKLARE:Vis tabellstruktur

Du kan bruke denne spørringen til å vise strukturen til en eksisterende tabell.

Kolonner vises med alle egenskaper.

DROPPTABELL:slett tabellen

Akkurat som DROP DATABASER, denne spørringen sletter tabellen og dens innhold uten forvarsel.

ENDRINGSTABELL: endre bord

Denne spørringen kan også inneholde en kompleks struktur på grunn av jo flere endringer den kan gjøre i tabellen. La oss ta en titt på noen eksempler.

(hvis du slettet tabellen i det siste trinnet, lag den på nytt for tester)

LEGG TIL EN KOLONNE

ALTER TABLE-brukere ADD email VARCHAR (100) ETTER brukernavn;

På grunn av den gode lesbarheten til SQL, tror jeg det ikke er noen vits i å forklare det i detalj. Vi legger til en ny kolonne "e-post" etter "brukernavn".

SLETTER EN KOLONNE

Det var også veldig enkelt. Bruk denne spørringen med forsiktighet, siden du kan slette data uten forvarsel.

Gjenopprett kolonnen du nettopp fjernet for videre eksperimentering.

GJØR EN ENDRING I EN KOLONNE

Noen ganger vil du kanskje gjøre endringer i egenskapene til en kolonne, og du trenger ikke å slette den helt for dette.

Denne spørringen ga nytt navn til brukerkolonnen til "brukernavn" og endret typen fra VARCHAR (20) til VARCHAR (30). En slik endring bør ikke endre dataene i tabellen.

SETT INN: Legge til informasjon i en tabell

La oss legge til litt informasjon i tabellen ved å bruke følgende spørring.

Som du kan se, inneholder VERDIER () en kommadelt liste over verdier. Alle verdier er i enkeltkolonner. Og verdiene må være i rekkefølgen til kolonnene som ble definert da tabellen ble opprettet.

Merk at den første NULL-verdien for PRIMARY KEY-feltet heter "user_id". Vi gjør dette for at ID-en skal genereres automatisk, siden kolonnen har AUTO_INCREMENT-egenskapen. Når informasjonen legges til første gang vil ID være 1. Neste rad er 2, og så videre ...

ALTERNATIVT VALG

Det er et annet spørringsalternativ for å legge til rader.

Denne gangen bruker vi nøkkelordet SET i stedet for VALUES, og det har ingen parentes. Det er flere nyanser:

Kolonnen kan hoppes over. For eksempel har vi ikke tilordnet en verdi for "user_id", som vil ha AUTO_INCREMENT-verdien som standard. Hvis du utelater en VARCHAR-kolonne, vil en tom linje bli lagt til.

Hver kolonne må refereres til med navn. På grunn av dette kan de nevnes i hvilken som helst rekkefølge, i motsetning til den forrige versjonen.

ALTERNATIV VALG 2

Her er et annet alternativ.

Igjen, siden det er referanser til kolonnenavnet, kan du oppgi verdiene i hvilken som helst rekkefølge.

LAST_INSERT_ID ()

Du kan bruke denne forespørselen til å få IDen som var AUTO_INCREMENT for den siste raden i gjeldende økt.

NÅ ()

Nå er tiden inne for å vise hvordan du kan bruke MySQL-funksjonen i spørringer.

NOW ()-funksjonen viser gjeldende dato. Så du kan bruke den til å automatisk sette kolonnedatoen til gjeldende dato når du setter inn en ny rad.

Merk at vi mottok 1 advarsel, men ignorer den. Grunnen til dette er at NOW () også brukes til å vise midlertidig informasjon.

PLUKKE UT: Lese data fra en tabell

Hvis vi legger til informasjon i tabellen, vil det være logisk å lære å lese den derfra. Det er her SELECT-spørringen vil hjelpe oss.

Følgende er den enkleste SELECT-spørringen for å lese en tabell.

I dette tilfellet betyr stjernen (*) at vi har bedt om alle feltene fra tabellen. Hvis du kun ønsker spesifikke kolonner, vil spørringen se slik ut.

TilstandHVOR

Oftest er vi ikke interessert i alle kolonner, men bare i noen. La oss for eksempel anta at vi kun vil ha e-postadressen til brukeren "nettuts".

WHERE lar deg angi betingelser i spørringen og gjøre detaljerte valg.

Merk at ett likhetstegn (=) brukes for likhet, ikke to som i programmering.

Du kan også bruke sammenligninger.

OG eller ELLER kan brukes til å kombinere forhold:

Merk at numeriske verdier ikke må oppgis.

IN ()

Dette er nyttig for sampling av flere verdier.

SOM

Lar deg lage "jokertegn"-forespørsler

%-tegnet brukes som jokertegn. Det vil si at alt kan være på sin plass.

TilstandREKKEFØLGE ETTER

Hvis du ønsker å få resultatet sortert etter hvilket som helst kriterium

Standardrekkefølgen er ASC (fra lav til høy). For det motsatte brukes DESC.

GRENSE ... OFFSET ...

Du kan begrense antall oppnådde resultater.

LIMIT 2 tar bare de to første resultatene. LIMIT 1 OFFSET 2 får 1 resultat etter de 2 første. LIMIT 2, 1 betyr det samme (bare vær oppmerksom først kommer offset og deretter limit).

OPPDATER: Gjør endringer i informasjonen i tabellen

Denne spørringen brukes til å endre informasjon i en tabell.

I de fleste tilfeller brukes den sammen med WHERE-leddet, siden du mest sannsynlig vil endre enkelte kolonner. Hvis det ikke er noen WHERE-klausul, vil endringene påvirke alle rader.

Du kan også bruke LIMIT for å begrense antall rader som må endres.

SLETT: Fjerne informasjon fra en tabell

Akkurat som UPDATE, brukes denne spørringen med WHERE:

For å slette innholdet i en tabell, kan du gjøre det ganske enkelt slik:

SLETT FRA brukere;

Men det er bedre å bruke TRUNCATE

I tillegg til å slette, tilbakestiller denne spørringen også verdiene AUTO_INCREMENT og når du legger til rader igjen, vil tellingen starte fra null. SLETT det gjør det ikke, og nedtellingen fortsetter.

Deaktivere lavere verdier og spesielle ord

Strengverdier

Noen tegn må deaktiveres ( flukt ), eller det kan være problemer.

Til dette brukes en omvendt skråstrek.(\).

Spesielle ord

Siden i MySQL det er mange spesielle ord ( VELG eller OPPDATER ), for å unngå feil når du bruker dem, må du bruke anførselstegn. Men ikke vanlige sitater, men disse(`).

Det vil si at du må legge til en kolonne kalt " slette ", det må gjøres slik:

Konklusjon

Takk for at du leste til slutten. Jeg håper denne artikkelen var nyttig for deg. Det er ikke over ennå! Fortsettelse følger:).

Jeg presenterer for din oppmerksomhet en gratis oversettelse av artikkelen SQL for Beginners

Flere og flere moderne nettapplikasjoner samhandler med databaser, vanligvis ved å bruke språket SQL... Heldigvis for oss er dette språket ganske enkelt å lære. I denne artikkelen vil vi begynne å lære det grunnleggende om SQL-spørringer og hvordan de samhandler med databasen. MySQL.

Hva trenger du

SQL (Structured Query Language) er et språk designet for å samhandle med relasjon(DBMS) som f.eks. MySQL, Oracle, Sqlite og andre. For å utføre SQL-spørringene fra denne artikkelen, antar jeg at du har installert MySQL... Jeg anbefaler også å bruke phpMyAdmin som et visuelt visningsverktøy for MySQL.

Følgende applikasjoner vil gjøre det enkelt å installere MySQL og phpMyAdmin til datamaskinen din:

  • WAMP for Windows
  • MAMP for Mac

La oss begynne å utføre spørringer på kommandolinjen. WAMP inneholder den allerede i konsollen MySQL... Til MAMP, du må kanskje lese dette.

LAG DATABASE: Opprett database

Vår aller første forespørsel. Vi skal lage en database å jobbe med.

Først av alt, åpne konsollen MySQL og logg inn. Til WAMP, som standard brukes et tomt passord. Til MAMP passordet må være "root".

Etter å ha logget inn, skriv inn denne forespørselen og klikk Tast inn:

LAG DATABASE my_first_db;

Merk at et semikolon (;) legges til på slutten av spørringen, akkurat som på slutten av en linje i koden din.

Også nøkkelord LAG DATABASE skiller mellom store og små bokstaver som alle søkeord i SQL... Men vi vil skrive dem med store bokstaver for bedre lesbarhet.

Merk: tegnsett og sortering

Hvis du vil angi standard tegnsett og sorteringsrekkefølge, bruk en lignende spørring:

LAG DATABASE my_first_db STANDARD TEGNSETT utf8 SAMLER utf8_general_ci;

Du finner en liste over støttede tegnsett og sammenstillinger på MySQL.

VIS DATABASER: Liste over alle databaser

Denne spørringen brukes til å vise alle databaser.

DROP DATABASE: Sletter en database

Med denne spørringen kan du slette en eksisterende database.

Vær forsiktig med denne spørringen fordi den ikke viser noen advarsler. Når du har tabeller og data i databasen, vil spørringen slette alle på et øyeblikk.

Teknisk sett er ikke dette en forespørsel. Det er en "operatør" og krever ikke semikolon på slutten.

Han informerer MySQL at du må velge standarddatabasen og jobbe med den til slutten av økten. Vi er nå klare til å lage tabeller og resten i denne databasen.

Hva er en databasetabell?

Du kan tenke på en tabell i en database som en vanlig tabell eller som en csv-fil som har strukturerte data.

Som i dette eksemplet har tabellen radnavn og datakolonner. Ved å bruke SQL-spørringer kan vi lage denne tabellen. Vi kan også legge til, lese, endre og slette data.

LAG TABELL: Lag tabell

Med denne spørringen kan vi lage en tabell i databasen. Beklager, dokumentasjonen for MySQL ikke veldig vennlig mot nye brukere. Strukturen til denne spørringen kan være svært kompleks, men vi starter med en enkel.

Følgende spørring oppretter en tabell med to kolonner.

CREATE TABLE-brukere (brukernavn VARCHAR (20), create_date DATE);

Vær oppmerksom på at vi kan skrive en spørring på flere linjer og bruke Tab for innrykk.

Den første linjen er enkel. Vi lager en tabell som heter brukere... Videre, i parentes, er kolonnene i tabellen oppført, atskilt med komma. Hvert kolonnenavn etterfølges av en datatype, for eksempel VARCHAR eller DATO.

VARCHAR (20) betyr at kolonnen er av strengtype og kan ikke være mer enn 20 tegn lang. DATO- datatype beregnet for lagring av datoer i formatet: "ÅÅÅÅ-MM-DD".

Primærnøkkel

Før vi utfører denne spørringen, må vi sette inn en kolonne bruker-ID, som vil være PRIMÆR NØKKEL. Uten å gå for mye i detalj, kan du tenke på en primærnøkkel som en måte å gjenkjenne hver rad med data i en tabell.

Forespørselen blir slik:

CREATE TABLE-brukere (user_id INT AUTO_INCREMENT PRIMARY KEY, brukernavn VARCHAR (20), create_date DATE);

INT- 32-bits heltallstype (numerisk). AUTO_INCREMENT oppretter automatisk et nytt ID-nummer hver gang en datarad legges til. Det er ikke nødvendig, men det er mer praktisk med det.

Denne kolonnen er kanskje ikke et heltall, selv om dette er den vanligste datatypen. Primærnøkkelkolonnen er valgfri, men det anbefales å bruke den til å forbedre ytelsen og arkitekturen til databasen.

La oss kjøre spørringen:

VIS TABELLER: Liste over alle tabeller

Spørringen lar deg få en liste over alle tabellene i gjeldende database.

FORKLAR: Vis tabellstruktur

Bruk denne spørringen for å se strukturen til en eksisterende tabell.

Som et resultat vises feltene (kolonnene) og deres egenskaper.

SLIPP TABELL: Slipper et bord

Også DROPPE DATABASER, sletter denne spørringen tabellen og dens innhold uten noen advarsel.

ENDRE TABELL: Endre en tabell

En slik spørring kan være kompleks fordi den kan gjøre flere endringer i en tabell. La oss ta en titt på noen enkle eksempler.

Takket være lesbarhet SQL, denne forespørselen er selvforklarende.

Å fjerne er like enkelt. Bruk søket med forsiktighet, data slettes uten forvarsel.

La oss legge til feltet på nytt e-post, senere vil det fortsatt være nødvendig:

ALTER TABLE-brukere ADD email VARCHAR (100) ETTER brukernavn;

Noen ganger kan det hende du må endre egenskapene til en kolonne, du trenger ikke å slette den og opprette den på nytt.

Denne forespørselen gir nytt navn til feltet brukernavn v brukernavn og endrer type fra VARCHAR (20)VARCHAR (30)... Slike endringer påvirker ikke dataene i tabellen.

INSERT: Legger til data i en tabell

La oss legge til poster i tabellen ved hjelp av spørringer.

Som du kan se, VERDIER () inneholder en kommadelt liste over verdier. Strengverdier er omsluttet av enkle anførselstegn. Verdiene må være i den rekkefølgen som ble spesifisert da tabellen ble opprettet.

Merk at den første verdien er NULL for primærnøkkelen, feltet som vi navnga bruker-ID... Alt fordi feltet er merket som AUTO_INCREMENT og id genereres automatisk. Den første raden med data vil ha en id på 1. Den neste raden som skal legges til er 2, og så videre.

Alternativ syntaks

Her er en annen syntaks for å sette inn strenger.

Denne gangen brukte vi søkeordet SETT i stedet for VERDIER... La oss merke oss et par ting:

  • Kolonnen kan utelates. For eksempel har vi ikke tildelt en verdi til feltet bruker-ID fordi det er merket som AUTO_INCREMENT... Hvis du ikke tilordner en verdi til et felt med typen VARCHAR, da vil den som standard ta verdien av en tom streng (med mindre en annen standardverdi ble spesifisert da tabellen ble opprettet).
  • Hver kolonne kan refereres med navn. Derfor kan feltene være i hvilken som helst rekkefølge, i motsetning til den forrige syntaksen.

Alternativ syntaks nummer 2

Her er et annet eksempel.

Som før kan du referere til feltene ved navn, de kan gå i hvilken som helst rekkefølge.

Bruk denne spørringen for å få ID-en til den sist innsatte raden.

NÅ ()

Det er på tide å vise deg hvordan du bruker funksjoner MySQL i forespørsler.

Funksjon NÅ () returnerer gjeldende dato. Bruk den til å automatisk legge til gjeldende dato i et typefelt DATO.

Vær oppmerksom på at vi har mottatt en advarsel fra MySQL men dette er ikke så viktig. Årsaken er at funksjonen NÅ () returnerer faktisk tidsinformasjon.

Vi laget et felt lag dato som bare kan inneholde en dato og ikke et klokkeslett, så dataene er avkortet. I stedet for NÅ () vi kunne bruke CURDATE () som bare returnerer gjeldende dato, men sluttresultatet ville være det samme.

SELECT: Henter data fra en tabell

Det er klart at dataene vi har skrevet er ubrukelige før vi kan lese dem. En forespørsel kommer til unnsetning PLUKKE UT.

Det enkleste eksempelet på bruk av en forespørsel PLUKKE UT for å lese data fra en tabell:

Stjernen (*) betyr at vi ønsker å få alle kolonnene i tabellen. Hvis du bare trenger å få visse kolonner, bruk noe som dette:

Oftere enn ikke ønsker vi bare å få visse rader, ikke alle. La oss for eksempel få brukerens e-postadresse nettuts.

Det ligner på en IF-tilstand. WHERE lar deg sette en betingelse i en spørring og få ønsket resultat.

Enkelttegnet (=) brukes for likhetsbetingelsen, ikke det doble (==), som du sannsynligvis bruker i programmering.

Du kan også bruke andre betingelser:

OG og ELLER brukes til å kombinere forhold:

Merk at numeriske verdier ikke trenger å stå i anførselstegn.

IN ()

Brukes til å sammenligne mot flere verdier.

SOM

Lar deg angi en mal for søket.

Prosenttegnet (%) brukes til å spesifisere mønsteret.

ORDER BY klausul

Bruk denne betingelsen hvis du vil at resultatet skal returneres sortert:

Standardrekkefølgen er ASC(Stigende). Legg til DESCå sortere i omvendt rekkefølge.

GRENSE ... OFFSET ...

Du kan begrense antall rader som returneres.

GRENSE 2 tar de to første linjene. GRENSE 1 OFFSET 2 tar en linje etter de to første. GRENSE 2, 1 betyr det samme, bare det første tallet er forskyvningen, og det andre begrenser antall linjer.

OPPDATERING: Oppdaterer data i en tabell

Denne spørringen brukes til å oppdatere data i en tabell.

I de fleste tilfeller brukes sammen med HVOR for å oppdatere spesifikke linjer. Hvis tilstanden HVOR ikke spesifisert, vil endringene bli brukt på alle rader.

For å begrense mutable strenger, kan du bruke GRENSE.

SLETT: Sletter data fra en tabell

Også , brukes denne spørringen ofte sammen med betingelsen HVOR.

TRUNCATE TABELL

For å fjerne innhold fra en tabell, bruk et søk som dette:

SLETT FRA brukere;

For bedre ytelsesbruk .

Nullstiller også felttelleren AUTO_INCREMENT, så nylagte rader vil ha id lik 1. Når du bruker dette vil ikke skje, og telleren vil fortsette å vokse.

Unngå strengverdier og spesielle ord

Strengverdier

Noen karakterer må escapes, ellers kan det oppstå problemer.

Omvendt skråstrek (\) brukes for å unnslippe.

Dette er veldig viktig av sikkerhetsmessige årsaker. Eventuelle brukerdata må escapes før de skrives til databasen. V PHP bruk funksjonen mysql_real_escape_string () eller forberedte setninger.

Spesielle ord

Siden i MySQL mange reserverte ord som PLUKKE UT eller For å unngå forvirring, omslutt kolonne- og tabellnavn i anførselstegn. I tillegg må du ikke bruke vanlige anførselstegn, men bakstikk (`).

La oss si at du av en eller annen grunn vil legge til en kolonne med navn :

Konklusjon

Takk for at du leste artikkelen. Jeg håper jeg klarte å vise deg det språket SQL veldig funksjonell og lett å lære.