SQL Flashcards
relasjonsterminologi
relasjon/tabell relasjonsnavn relasjonsskjema attributt instans / forkomst / tuppel
lage en tabell
create table R (A1 D1 [S1], ... An Dn [Sn], [liste av skranker] );
R er navnet på relasjonen/tabellen Ai er et atributt
Dj er et domene
Sk er en skranke
[ ] betyr at dette leddet er en valgfri del av setningen
datatyper i PostgreSQL
int(eger) real char(n) varchar(n) numeric(n, d) boolean date time timestamp bit(n) bit varying(n)
vanlige skranker
NOT NULL
UNIQUE
PRIMARY KEY
CHECK (v = … OR v = …)
legge inn data i tabeller
INSERT INTO R(A1, A2, …, Ak)
VALUES (v1, v2, …, vk)
Attributtlisten kan sløyfes hvis den dekker samtlige attributter i R og følger attributtenes default rekkefølge
hente data fra tabeller
SELECT [DISTINCT] FROM [WHERE ] [GROUP BY ] [HAVING ] [ORDER BY [ASC | DESC] [ [ASC | DESC] ] ... ];
Hva slags samling av tupler bruker select?
bag
Altså kan samme tuppel forekomme flere ganger.
join-betingelse
kobler sammen forekomster i ulike tabeller forutsatt at verdiene i de gitte attributtene er like
lovlige uttrykk/relasjoner i where-betingelser
=
<> (not equal)
=
LIKE (ved tekststreng)
BETWEEN
IS (NOT) NULL (NOT) EXISTS (NOT) IN ALL ANY
date ‘yyyy-mm-dd’
time ‘hh:mm:ss+hh’
…
wildcards ved bruk av LIKE
% - vilkårlig sekvens (null eller flere)
_ - ett vilkårlig tegn
fremmednøkkel i SQL
navn CHAR(20) REFERENCES Person(navn)
verdiskranke i SQL
kjonn CHAR(1) NOT NULL CHECK(kjonn IN (‘M’, ‘F’))
enkeltrolleskranker som bare går mellom gruppererroller, blir til forekomstrestirksjoner som ser på ___
NULL
dobbeltrolleskranker hvor gruppererrollene sammenliknes, blir til forekomstrestriksjoner som ser på ___
verdiene i attributtene
CHECK( (gren_blir_saget IS NULL) or
gren_blir_sittet_på IS NULL) or
(gren_blir_saget <> gren_blir_sittet_på)
Hvordan håndheves fremmednøkler?
- Ved INSERT på A må vi sjekke om fremmednøkkelen har en lovlig verdi (peker på en forkomst av B)
- Ved DELETE av en B må vi sjekke at ingen A har en fremmednøkkel til denne forekomsten av B
Hvilke referanserelasjoner kan fjernes (undertrykkes) fra relasjonsdatabaseskjemaet?
Tabeller som kommer fra referansebegreper, altså begreper som ikke spiller noen andre gruppererroller enn de som inngår i den utvalgte referansemåten, og som spiller minst én referanserolle.
Finn navn på de ansatte som er ansatt etter 2003
SELECT navn
FROM Ansatt
WHERE AnsattDato > date ‘2003-12-31’
Eksempel på en seleksjonsbetingelse?
WHERE navn = ‘GET’
Eksempel på en join-betingelse?
WHERE p.id = k.id
oppdater data
UPDATE R
SET A1 = E1, …, Ak = Ek
[WHERE C];
slett data
DELETE FROM R
[WHERE C];
aggregeringsfunksjoner
count, min, max, sum, avg
count(*)
gir antall tupler i tabellen
count(gender)
gir antall tupler i tabellen der attributtet gender ikke er null
gir antall forskjellige verdier i attributtet firstname
count(distinct firstname)
Gitt tabellen Ansatt(anr, navn, lonn).
Finn den største lønnsforskjellen
SELECT max(lonn) - min(lonn) FROM Ansatt
Gitt tabellen Ansatt(anr, navn, lonn),
finn sum lønnsutgifter og gjennomsnittslønn.
SELECT sum(lonn), avg(lonn) FROM Ansatt
HUSK! nil-verdier regnes ikke med
Hvordan beregnes resultatet av grupperinger (GROUP BY)?
- Bregen SELECT * FROM … WHERE …
- Lag grupper av de tuplene som er like i alle grupperingsattributtene
- Utfør aggregeringsfunksjonene lokalt i hver gruppe
- Presenter én resultatlinje for hver gruppe
Hva må man passe på ved GROUP BY-spørringer?
Alle attributter som ikke er grupperingsattributter, må være funksjonelt avhengige av grupperingsattributtene.
En god regel er å inkludere alle grupperingsattributtene i resultatattributt-listen.
Finn antall ansatte i hver avdeling og gjennomsnittlig lønn for disse.
Ansatt(anr, navn, lonn, avd)
Avdeling(avdnr, avdelingsnavn, leder)
Prosjektplan(pnr, anr, timer)
SELECT avd, count(*), avg(lonn)
FROM Ansatt
GROUP BY avd
WHERE vs. HAVING
- WHERE-betingelsen velger ut de tuplene som skal
danne datagrunnlaget for grupperingen - HAVING-betingelsen plukker ut de tuplene fra det ferdig-grupperte resultatet som skal med i det endelige svaret
- HAVING-betingelsen kan inneholde aggregatfunksjoner
en tenkt relasjon som vi bruker som mellomresultat i kompliserte SQL-beregninger
CREATE VIEW Innsats[(A1, ...)] as ( SELECT ... ) UNION ( SELECT ... )
relasjonssammenlikninger
EXISTS R NOT EXISTS R IN R NOT IN R ANY R ALL R
Finn navn på ansatte som skal arbeide mer enn 10 timer på samtlige av sine prosjekter
Ansatt(anr, navn, lonn, avd)
Avdeling(avdnr, avdelingsnavn, leder)
Prosjektplan(pnr, anr, timer)
SELEC navn FROM Ansatt WHERE NOT EXISTS ( SELECT * FROM Prosjektplan WHERE Ansatt.anr = Prosjektplan.anr AND Prosjektplan.timer <= 10 )
hengetuppel
Når vi joiner to tabeller, kaller vi et tuppel som ikke har en match i den andre relasjonen, et hengetuppel
join-varianter
Generelt: FROM tbl1 JOIN tbl2 ON tbl1.a1 = tbl2.a1
(INNER) JOIN NATURAL JOIN FULL OUTER JOIN LEFT OUTER JOIN RIGHT OUTER JOIN