Databasesystemer Flashcards
Hvordan putte noe inn i en tabell
INSERT INTO student VALUES(‘Hans’, 18, ‘Lund’);
Endre en verdi flere steder
Endre verdier på flere verdier som passer med et tilfelle
Slette all data som passer med viss tilfelle
Query all data etter en viss verdi
Query data med andre navn
UPDATE student
SET name = ‘Bio’
WHERE major = ‘Biology’
UPDATE student
SET name = ‘Bio’
WHERE major = ‘Biology’ OR major = ‘Chemistry’
DELETE FROM student
WHERE student_id = 5
SELECT employee.name
FROM employee
WHERE employee.on_holiday = false
SELECT first_name as fornavn, last_name as surname
FROM employee
Logiske operatorer
WHERE:
UPDATE student
SET name = ‘Bio’
WHERE major = ‘Biology’;
AND
SELECT title
FROM videgame
WHERE metascore > 80 AND plaotform = ‘PC’;
OR:
UPDATE student
SET name = ‘Bio’
WHERE major = ‘Biology OR major = ‘Chemistry’;
NOT
SELECT title
FROM videgame
WHERE NOT plaotform = ‘PC’;
DELETE:
DELETE FROM student
WHERE student_id = 5;
AS
Navnet man vil ha for referenase til noe, hvis man vil ha noe annet som refererer
SELECT first_name as forename, last_name as surname
FROM employee
LIKE Samme som == SELECT * FROM client WHERE client_name LIKE 'B%'; B%\_\_\_\_\_ B med fem tegn etter %Mario% Tablet har mario i seg % kalles wildcard
Hva er normalisering?
Hva skjer hvis man ikke normaliserer?
Hva er 1NF
Hva er 2NF
Hva er 3NF
Hva er BCNF
En måte å organisere data
Har som mål å redusere redundant data
Brukes for å ta vekk repetert data og for å vise at dataen gir logisk mening, altså er nyttig.
Applikasjon går treigere ettersom den må grave igjennom mer data som egentlig ikke har noe nytte
Det kan bli vansklig å håndtere og oppdatere databasen
Sletter repeterte grupper
Lager separate tabeller for hvert set med relatert data
Identifiserer hvert set av relatert data med en pimary key
Så hvis man har en kolonne, så skal man ikke ha flere mengder info på samme kolonne-rad, som en slags liste info.
man skal heller da lage en separat column for den informasjonen.
Tabell har ikke delevis avhengighet
Delevis avhengighet betyr at primary key ikke er fullt avhengig av data i andre columns, altså det er noen columns man kunne vært foruten.
Altså man la oss si pokemon en pokemon tabell, så burde man ikke ha noe slikt:
Eks | department id | employee id | office_location - Disse burde heller deles opp
| employee id | department id | og |department_id | office_location
Det skal ikke være “transitive dependency for non.prime attributes”
Hva betyr dette?
At alle non-prime attributes avhenger av prime attributet
Eks man burde ikke ha en subject_id og subject i samme kolonne, man burde heller bare ha subject_id, som så refererer til en subject-tabell der subject er.
Hvis A determinerer B, kan ikke B være en primærnøkkel.
Dette spesifiserer 3NF.
3NF sier at prime-atts skal determinere non-prime.
Altså:
3NF -
non-prime atts kan ikke determinere andre non-prime atts.
BCNF -
non-prime atts kan ikke determinere prime-atts
Hva er surogate key
natrual key
primary key
foreign key
Surogate key
En nøkkel som ikke har noen virkelig relasjon til noe i databasen,
Men er heller der for å unikt kunne identifisere data i tabellen.
Eks id
Natrual key
En primary key som har en virkelig relasjon til ting i databasen.
Primary key’en i dette tilfelle fir faktisk info, og er for mer enn å bare identifisere
Annen info i tabellen.
Primary key
Nøkkel for å identifisere data i en tabell
Hva hvis man har to prime nøkkler?
Da kan bare de to nøkklene sammen identifisere data
Foreign key
Data som linker til info i en annen tabell.
Foreign key må referere til en primary key i en annen tabell
Grupperingsfunksjoner
Grupperings syntax
SELECT platfrom, AVG(user_score) FROM games
GROUP BY platfrom
AVG SUM COUNT MIN MAX
Man bruker HAVING, fremfor Where, når utvalg er basert på grupperinger
SELECT platfrom, AVG(metascore)
FROM videogame
GROUP By platfrom
HAVING AVG(metascore) > 68
Noen innebyggde funksjoner
Operatorer
SELECT [column]*10
SUM TOTAL DIV AVR AS - referere etter et annet navn UPPER(COLUMN) - oppercase FLOOR(column) - runder ned ROUND() - avrunder
Operatorer: Aritmetiske: *, /, +, - Sammenligning > < = <= >= <> LIKE Null-test IS NULL Boolske NOT, AND, OR Intervall BETWEEN… AND
Putte ting fra en tabell inn i en annen
INSERT INTO tabell1
SELECT DISTINCT kolonne
FROM tabell2
Hva gjør join Syntax til JOIN FULL OUTER JOIN LEFT JOIN RIGHT JOIN INNER JOIN
Hva gjør JOIN? Putter samme to tabeller Det er altså noe man kan gjøre med SELECT, der man kan få opp info fra flere forskjellige tabeller Man har: INNER JOIN LEFT JOIN RIGHT JOIN
Hvilke rader fra tabeller blir kombinert i følgende scenarioer?
________________________________________________________________________________________
INNER JOIN
De radene som har lik key av de key’ene som sammenlignes.
SELECT youtube_channels.yt_profile.profile_name, youtube_channels.yt_vid.video_title, youtube_channels.yt_vid.veiws
FROM youtube_channels.yt_profile
INNER JOIN youtube_channels.yt_vid
ON youtube_channels.yt_vid.profile_id=youtube_channels.yt_profile.profile_id;
________________________________________________________________________________________
Hva er LEFT? - Den tabellen man selecter FROM, altså tabellen etter FROM
Hva er RIGHT? - Den tabellen man selecter mot, altså den tabellen man sammenligner med
SELECT * FROM tabell1 LEFT JOIN tabell2
Tabell 1 er til venste, mens tabell2 er til høyre
LEFT JOIN
Viser alle radene fra left-tabellen, men viser ting bare fra right-tabellen hvis radene matcher.
Hvis left-tabellen ikke har en match i right-tabellen, vil infoen bli vist som NULL.
SELECT youtube_channels.yt_profile.profile_name, youtube_channels.yt_vid.video_title, youtube_channels.yt_vid.veiws
FROM youtube_channels.yt_profile
LEFT JOIN youtube_channels.yt_vid
ON youtube_channels.yt_vid.profile_id=youtube_channels.yt_profile.profile_id;
RIGHT JOIN
Viser alle radene fra right-tabellen, men viser ting bare fra left-tabellen hvis radene matcher.
Hvis right-tabellen ikke har en match i left-tabellen, vil bli vist som NULL.
________________________________________________________________________________________
FULL OUTER JOIN
Viser begge tabellene.
Men vil også vise om cellene matcher, ved at
1. Hvis celler har en match blir de puttet øverst i seleksjonen
2. Hvis celler ikke har en match, vil de vise NULL, der de ville vist info fra en annen tabell.
Jeg vet ikke hvorfor syntax’en her ikke fungerer
Det har noe med ‘OUTER’
SELECT youtube_channels.yt_profile.profile_name, youtube_channels.yt_vid.video_title, youtube_channels.yt_vid.veiws
FROM youtube_channels.yt_profile
FULL OUTER JOIN youtube_channels.yt_vid
ON youtube_channels.yt_vid.profile_id=youtube_channels.yt_profile.profile_id;
Hva er en vindu funksjon?
Hvordan fungerer over() med partition?
Synatx
Det lar en skap eet “vindu” til en tabell i en annen tabell. Man kan altså i select putte inn enda en row, som gir et “vindu” til noe man ikke kunne ha gjort utenom window funksjoner. Man kan eks ha liste over hver individuelle lønning, sammen med maxlønningen i samme query.
window funksjoner fungerer litt som group by, i det at man kan samle data for en ting, men window funksjoner skiller seg i det at man kan også ha individuell data.
[grupperingsverdi] over(partition by gruppering]
syntax:
select [det som skal ses],
[grupperingsverdi] over(partition by gruppering]
from [table]
Hva gjør case
Syntax for case
Case gjør at man kan legge til enda en column i en query, der ting kategoriseres etter et tilfelle.
select [verdi], CASE
WHEN [verdi] [sammenligning] [verdi2] THEN [verdi i col]
WHEN [verdi] [sammenligning] [verdi2] THEN [verdi i col]
WHEN [verdi] [sammenligning] [verdi2] THEN [verdi i col]
ELSE [verdi i col]
END AS [navn på column]
FROM [table]
Hva gjør row_number?
Gir et row_number for hver row.
Hvis man ikke har noe i over(), får hele tabellen et row_number().
Hvis man bruker partition by i over, gis det et row_number for hver gruppering i over.
Dette gjør så man kan enklere referere til grupperinger, og gjøre ting med dem
gir row number for hver data i en query
ROW_NUMBER() OVER (
[PARTITION BY partition_expression, … ]
ORDER BY sort_expression [ASC | DESC], …
)
Hva gjør rank?
rangerer det som er i over() ved å legge til en ny column,
med et tall for rangeringen.
Hva gjør dense_rank?
rank skipper duplicate verdier??
mens denserank skipper ikke duplicate verdier.
Hva gjør lead og lag?
Skjekker det som er foran og det som er bak
Det lager enda en column, der man se kan disse verdiene.
Så eks row 3, vil ha en column som inkluderer en verdi i row 2 (hvis man bruker lag)
Eks:
1 id | company | value
SELECT company, value,
LAG(value, 2) OVER(ORDER BY sale) as previous_sale_value
FROM sale;
starter fra 2 rader over 1. ser her 2. 3. 4. gjeldende rad