Spring til indhold

Structured Query Language

Fra Wikipedia, den frie encyklopædi

Structured Query Language eller SQL (navnet kan udtales både som enkelte bogstaver, S-Q-L, og som sequel) er det mest udbredte programmeringssprog til relationelle databaser. Det er blevet standardiseret i flere omgange som SQL-92 og SQL-1999, men de fleste databasesystemer har deres egne udvidelser. Sproget dækker både definition af databaser og manipulation af data. SQL er et deklarativt programmeringssprog, hvilket vil sige, at man kun beskriver, hvad der skal ske, men ikke hvordan det sker.

I SQL skelnes der ikke mellem store og små bogstaver, bortset fra i dataværdier. Kommentarer indledes med '--' og varer linjen ud. SQL-kommandoer kan afsluttes med ";", hvis der kommer flere efter hinanden.

Definition af databaser

[redigér | rediger kildetekst]

I denne del af SQL bruges generelt tre typer kommandoer: CREATE opretter noget, ALTER ændrer det og DROP fjerner det igen. Eksempel:

-- Opret en database med et par tabeller
--
-- Databasen
CREATE DATABASE demo;
-- Adresseoplysninger
CREATE TABLE adresser (
  adresse_id INTEGER PRIMARY KEY,
  gade       VARCHAR(40) NOT NULL,
  husnr      INTEGER NOT NULL,
  sted       VARCHAR(20),          -- Etage, landsby mv.
  postnr     INTEGER NOT NULL REFERENCES postnumre (postnr)
);

I eksemplet er adresse_id nøglen, der skal være unik i tabellen. Gade er et tekstfelt, der er op til 40 tegn langt. Feltet skal udfyldes. Husnr er et heltal, der skal udfyldes. Det er valgfrit om feltet sted udfyldes. Feltet postnr skal være udfyldt, og der skal være et postnr i tabellen postnumre med samme værdi. Hvis disse krav ikke er opfyldt, kan data ikke indsættes i tabellen.

Med SQL er det muligt, at definere indekser for en tabel. Et index kan sikre, at enkelte felters data er unikke i en tabel. I eksemplet er adresse_id unik. Et andet argument for at oprette et indeks er, at det i nogle tilfælde kan give hurtigere læseadgang. Prisen er, at oprettelse og opdatering af data bliver en anelse langsommere fordi både tabel og indeks skal opdateres.

Datamanipulation

[redigér | rediger kildetekst]

I en tabel i en database kan data oprettes, ændres, læses og slettes.

Læsning af data

[redigér | rediger kildetekst]

Læsning foregår med kommandoen SELECT. I kommandoen beskrives, hvilke kolonner, der skal læses, hvilke tabeller, der skal læses fra, og hvilke betingelser der skal være opfyldt for at en række bliver læst. Eksempel:

SELECT gade, husnr, sted
FROM adresser
WHERE postnr = 7100;

Gade, husnummer og sted vises for adresser med 7100 som postnummer. Rækkefølgen er ikke defineret og dubletter kan forekomme.

Sortering af data udføres med delsætningen ORDER BY. Delsætningen sættes efter WHERE:

SELECT gade, husnr, sted
FROM adresser
WHERE postnr = 7100;
ORDER BY sted

Der sorteres efter sted (stigende rækkefølge). Ønsker man faldende rækkefølge (største værdier først), sættes nøgleordet DESC efter feltnavnet:

SELECT gade, husnr, sted
FROM adresser
WHERE postnr = 7100;
ORDER BY sted DESC

Der kan angives flere felter i ORDER BY-linjen:

SELECT gade, husnr, sted
FROM adresser
WHERE postnr = 7100;
ORDER BY sted DESC, gade

Her sorteres først på sted i faldende rækkefølge og herefter på gade i stigende rækkefølge.

Indsættelse af data

[redigér | rediger kildetekst]

Data indsættes i en tabel med kommandoen INSERT. Eksempel:

INSERT INTO adresser VALUES (14, 'Prinsessegade', 57, NULL, 7000);

Værdierne anføres i samme rækkefølge, som de er defineret i tabellen. Ofte vil man angive feltnavnene i en INSERT-forespørgsel:

INSERT INTO adresser (adresseID, gade, nr, bogstav, postnr)
VALUES (14, 'Prinsessegade', 57, NULL, 7000);

Når man angiver feltnavnene, er det ikke nødvendigt at medtage alle felter i tabellen. De felter man ikke medtager i feltlisten, bliver tildelt værdien NULL eller en standardværdi for feltet hvis en sådan er defineret:

INSERT INTO adresser (gade, nr, postnr)
VALUES ('Prinsessegade', 57, 7000);

Det er også muligt at bruge en SELECT-forespørgsel som kilde til en INSERT-forespørgsel:

INSERT INTO adresser (gade, nr, postnr)
SELECT gade, nr, postnr
FROM nyeadresser;

Her indsættes indholdet af tabellen nyeadresser ind i tabellen adresser. Denne type forespørgsel kan indsætte en eller flere poster, alt efter hvor mange der returneres af SELECT-forespørgslen i udtrykket.

Opdatering af data

[redigér | rediger kildetekst]

Ved opdatering anføres en tabel, en liste af de værdier, som skal ændres, og et udvælgelseskriterie. Eksempel:

UPDATE adresser
SET sted = 'St. tv.',
    gade = 'Husumgade'
WHERE adresse_id = 14;

Det er vigtigt at sikre at udvælgelseskriteriet er korrekt før man udfører forespørgslen – handlingsforespørgsler (som INSERT, UPDATE og DELETE) udføres med det samme, og der er normalt ingen fortrydelsesfunktion.

I visse tilfælde er det ønskeligt at opdatere mange felter på én gang. Det kan fx være et postnr der er ændret:

UPDATE adresser
SET postnr = 1245
WHERE postnr = 1259

Det er også muligt at opdatere med en beregnet værdi:

UPDATE varer
SET pris = pris * 1.10

Her opdateres en varetabel så alle priser sættes 10 % op.

Sletning af data

[redigér | rediger kildetekst]

Sletning af data udføres med kommandoen DELETE, der som input har et tabelnavn og et kriterium for, hvilke rækker der skal slettes. Eksempel:

DELETE FROM adresser
WHERE adresse_id = 14;

Da adresse_id er unik i tabellen slettes kun en række. "DELETE FROM adresser;" sletter alle rækker uden advarsel.

Brugerrettigheder

[redigér | rediger kildetekst]

Med SQL er det muligt at tildele forskellige rettigheder til de forskellige brugere af databasen. Der kan gives rettigheder til læsning, indsættelse, ændring og sletning af data. Eksempel:

-- Hugo må gøre alt ved databasen demo
GRANT ALL ON demo TO Hugo;
-- Karl må læse i adressetabellen
GRANT SELECT ON adresser TO Karl;

Rettigheder kan trækkes tilbage med kommandoen REVOKE. Brugere kan eventuelt få rettigheder til at give andre rettigheder, der svarer til dem, de selv har.

Eksterne henvisninger/Kilder

[redigér | rediger kildetekst]