Databaser kan være vanskelige at pakke hovedet rundt om. De er dog essentielle for fuld-stack programmering og opbygning af back-end-tjenester, der gemmer data.
I dette indlæg vil jeg afmystificere SQL, databaser og relationelle databasestyringssystemer. Jeg vil også bruge nogle analogier til troldmandsverdenen, inklusive Harry Potter selv og nogle af de klasser, han tager på Hogwarts.
Før vi dykker ned i nøgletermer, lad os definere, hvad en database i sig selv er:
En database er et struktureret sæt af data, der opbevares i en computer, især en, der er tilgængelig på forskellige måder. Det er i bund og grund et organiseret sæt data på en computer, som kan tilgås elektronisk fra et computersystem.
Nøglevilkår
Nedenfor er nogle nøgleudtryk, som vi starter med:
- RDMS: Relationelle databasestyringssystemer. Denne ramme for databaser er grundlaget for MySQL.
- SQL: Structured Query Language.
- Tabeller: Databaseobjekter, der bærer data. Et eksempel på et tabelnavn er "Studenter" eller "Lærere" eller "Kurser".
- Felter: Værdierne i en tabel er kendt som felter. Eksempelfelter for studerende ville være "Fornavn", "Efternavn" og "GPA".
- Optag/række: En individuel post i tabellen.
Efter at have tilføjet lærere og kurser til databasen, kan vi have tabeller for studerende, lærere og kurser.
Efterhånden som vi bevæger os fremad i vejledningen, vil vi kun bruge Eleverne eksempel her som reference. Hvis du var så heldig at blive ansat som softwareingeniør hos Hogwarts, kunne din database måske gøre god brug af nogle af disse kommandoer :D
SQL-erklæringer
Syntaks
Semikolon er standardmetoden til at adskille en SQL-sætning fra en anden. Det giver mulighed for at køre flere SQL-sætninger i samme opkald. I denne guide vil vi have et semikolon i slutningen af hver sætning.
De vigtigste SQL-kommandoer
Opret :Opretter en ny SQL-tabel.
Hvis vi for eksempel oprettede elevdatabasen til Hogwarts-skolen, ville vi bruge CREATE at lave et bord kaldet "Studenter".
- Syntaks
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
column3 datatype,
....
);
- Eksempel
CREATE TABLE Students
(first_name VARCHAR(255),
last_name VARCHAR(255),
login VARCHAR(255),
age INTEGER,
gpa REAL,
house VARCHAR(255));
Slip :Sletter en tabel. Vær meget forsigtig, når du bruger denne kommando, da dette vil slette alle data i tabellen!
Hvis vi ønskede at slette hele elevdatabasen, vil vi bruge DROP for at udføre den handling.
- Syntaks
DROP TABLE table_name;
- Eksempel
DROP TABLE Students;
Indsæt :Tilføjer nye rækker af data til en tabel.
Vi ville bruge INSERT at tilføje nye elever, når de tilmelder sig Hogwarts.
- Syntaks
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
- Eksempel
INSERT
INTO Students(first_name, last_name, login, age, gpa, house)
VALUES
('Harry', 'Potter', 'theboywholived', 15, 4.0, 'Gryffindor'),
('Hermionie', 'Granger','granger2', 15, 4.5, 'Gryffindor'),
('Ron', 'Weasley','weasley7', 15, 3.7, 'Gryffindor'),
('Draco', 'Malfoy', 'malfoy999', 15, 4.0, 'Slytherin'),
('Cedric', 'Diggory','diggory123', 15, 4.0, 'Hufflepuff');
Vælg :Bruges til at hente data i en database, der skal returneres i tabelformat.
Hvis vi ønskede at hente alle navne på elever, der er i Gryffindor House, ville vi bruge SELECT kommando. Eksemplet nedenfor forespørger Elever-tabellen efter fornavn og efternavn på hver elev i databasen, hvilket for os kun er de fem rækker beskrevet ovenfor.
- Syntaks
SELECT column1, column2, ...
FROM table_name;
- Eksempel
SELECT first_name, last_name FROM Students;
fornavn | efternavn |
---|---|
Harry | Potter |
Hermioni | Granger |
Ron | Weasley |
Draco | Malfoy |
Cedric | Diggory |
Alternativt, hvis vi ønsker at vælge alle felterne i tabellen, vil vores kommando bruge "*"-syntaksen, hvilket betyder at vælge alle felter:
SELECT * FROM Students;
fornavn | efternavn | login | alder | gpa | hus |
---|---|---|---|---|---|
Harry | Potter | drengen levede | 15 | 4 | Gryffindor |
Hermioni | Granger | granger2 | 15 | 4.5 | Gryffindor |
Ron | Weasley | weasley7 | 15 | 3.7 | Gryffindor |
Draco | Malfoy | malfoy999 | 15 | 4 | Slytherin |
Cedric | Diggory | diggory123 | 15 | 4 | Hufflepuff |
Klausuler
En klausul er en logisk del af en SQL-sætning, og det er (i teorien) et valgfrit felt.
I ovenstående erklæring returnerede vi simpelthen alle felterne i elevdatabasen. Vi har ikke angivet en betingelse for, at værdierne returneres.
Hvad hvis vi ikke ville spørge alle eleverne, men kun dem, hvis hus er Gryffindor? Hvad med at spørge elever, hvis fornavn starter med "H", eller elever i enten Hufflepuff og Slytherin? Disse mere komplekse sager løses af SQL-klausuler.
Nedenfor er en oversigt over de mest almindelige klausuler, men der er flere klausuler i SQL-sproget. Her er en god generel oversigt, hvis du ønsker mere information.
Eksempler på klausuler
Hvor: Bruges til at angive en betingelse, mens data hentes fra en database. Går vi tilbage til eksemplet med Select, bliver vi nødt til at bruge WHERE for at angive huset som Gryffindor.
- Syntaks
SELECT column1, column2, ...
FROM table_name
WHERE condition;
- Eksempel
SELECT * FROM Students
WHERE house='Gryffindor';
fornavn | efternavn | login | alder | gpa | hus |
---|---|---|---|---|---|
Harry | Potter | drengen levede | 15 | 4 | Gryffindor |
Hermioni | Granger | granger2 | 15 | 4.5 | Gryffindor |
Ron | Weasley | weasley7 | 15 | 3.7 | Gryffindor |
Og Bruges til at kombinere flere klausuler i en SQL-sætning, hvor alle betingelser adskilt af AND er sande. Vi ville bruge AND til at få Gryffindor-studerende, der har en GPA på over 3,8.
- Syntaks
SELECT column1, column2, ...
FROM table_name
WHERE condition1 AND condition2 AND condition3 ...;
- Eksempel
SELECT * FROM Students
WHERE house='Gryffindor' AND gpa>3.8;
fornavn | efternavn | login | alder | gpa | hus |
---|---|---|---|---|---|
Harry | Potter | drengen levede | 15 | 4 | Gryffindor |
Hermioni | Granger | granger2 | 15 | 4.5 | Gryffindor |
Eller :Svarer til OG, men returnerer kun data, hvor kun EN af betingelserne adskilt af OR er sande. Hvis vi ville hente elever i Hufflepuff og Slytherin, men ikke begge, ville vi bruge OR-kommandoen.
- Syntaks
SELECT column1, column2, ...
FROM table_name
WHERE condition1 OR condition2 OR condition3 ...;
- Eksempel
SELECT * FROM Students
WHERE house='Slytherin' OR house='Hufflepuff';
fornavn | efternavn | login | alder | gpa | hus |
---|---|---|---|---|---|
Draco | Malfoy | malfoy999 | 15 | 4 | Slytherin |
Cedric | Diggory | diggory123 | 15 | 4 | Hufflepuff |
Synes godt om: Bruges sammen med WHERE for at søge efter et specifikt mønster. Hvis vi kun ville have for- og efternavnet på troldmænd/hekse med navne, der begynder med "H", kunne vi bruge kommandoen Synes godt om.
- Syntaks
SELECT column1, column2, ...
FROM table_name
WHERE columnN LIKE pattern;
- Eksempel
SELECT first_name, last_name FROM Students
WHERE first_name LIKE 'H%';
fornavn | efternavn |
---|---|
Harry | Potter |
Hermioni | Granger |
Antal: Bruges til at finde antallet af en kolonne (eller kolonner) i en tabel.
- Syntaks
SELECT COUNT(column_name)
FROM table_name
WHERE condition;
- Eksempel
SELECT COUNT(first_name) FROM Students;
COUNT(fornavn) |
---|
5 |
To andre kommandoer, der bruger den samme syntaks, er AVG og SUM. AVG beregner gennemsnittet af alle værdier, og sum beregner summen af alle værdier.
Vælg grænse: Bruges til at afskære svar til kun et bestemt antal. Den måde, hvorpå de øverste svar vælges, er i rækkefølge efter først indsat i databasen kronologisk.
- Syntaks
SELECT column_name(s)
FROM table_name
WHERE condition
LIMIT number;
- Eksempel
SELECT * FROM Students LIMIT 3;
fornavn | efternavn | login | alder | gpa | hus |
---|---|---|---|---|---|
Harry | Potter | drengen levede | 15 | 4 | Gryffindor |
Hermioni | Granger | granger2 | 15 | 4.5 | Gryffindor |
Ron | Weasley | weasley7 | 15 | 3.7 | Gryffindor |
Andre nyttige kommandoer
Bestil efter: Sorterer resultaterne i stigende eller faldende rækkefølge.
- Syntaks
SELECT column1, column2, ...
FROM table_name
ORDER BY column1, column2, ... ASC|DESC;
- Eksempel
SELECT * FROM Students ORDER BY first_name;
fornavn | efternavn | login | alder | gpa | hus |
---|---|---|---|---|---|
Cedric | Diggory | diggory123 | 15 | 4 | Hufflepuff |
Draco | Malfoy | malfoy999 | 15 | 4 | Slytherin |
Harry | Potter | drengen levede | 15 | 4 | Gryffindor |
Hermioni | Granger | granger2 | 15 | 4.5 | Gryffindor |
Ron | Weasley | weasley7 | 15 | 3.7 | Gryffindor |
Gruppér efter: Grupperer kategorier, der har de samme værdier, i rækker. Hvis du ville vide antallet af elever i hvert hus (3 i Gryffindor for eksempel), kan du bruge kommandoen Grupper efter.
- Syntaks
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
ORDER BY column_name(s);
- Eksempel
SELECT COUNT(first_name), house FROM Students GROUP BY house;
COUNT(fornavn) | hus |
---|---|
3 | Gryffindor |
1 | Hufflepuff |
1 | Slytherin |
Endelig, her er en DB Fiddle, der viser alle ovenstående kommandoer i aktion!
Normaliserede vs denormaliserede databaser
Når du designer en database, er der to hoveddesignmønstre, du kan følge, hver med deres egne afvejninger.
Normaliseret: Optimerer til minimering af redundans ikke til læsetid.
Lad os sige, at vi har en kursustabel, der har et lærer-id for den lærer, der underviser i det pågældende kursus. Vi har også en lærerdatabase, der har lærernavnet.
Når vi ønsker at få navne på lærere, der underviser i et bestemt kursus, bliver vi nødt til at forespørge på både kurser- og lærertabellerne, fordi kursustabellen ikke har lærernavnet (effektivt, men overflødigt).
Denormaliseret: Optimerer til læsetid , ikke for at minimere redundans.
Lad os sige, at vi har en kursustabel, der har et lærer-ID OG et lærernavn. Vi har en lærerdatabase, der også har lærernavnet. Når vi ønsker at få navne på lærere i kurset, kan vi blot bruge kursustabellen (overflødig, men effektiv).
Dataintegritet
Det er afgørende for brugerne, at de data, de interagerer med, er sikre, korrekte og fornuftige. Eksempler er at sikre, at alder ikke er et negativt tal, eller at ikke to elever har de samme oplysninger. Vi omtaler dette som dataintegritet.
Dataintegritet antager flere former og kan opdeles i fire kategorier:
- Enhedsintegritet :Der findes ingen duplikerede rækker i en tabel. For eksempel kan vi ikke indsætte Ron Weasley to gange i databasen.
- Domæneintegritet :Begrænsning af typen af værdier, som man kan indsætte for at håndhæve korrekte værdier. For eksempel kan et hus kun være Gryffindor, Ravenclaw, Slytherin eller Hufflepuff.
- Referentiel integritet :Optegnelser, der bruges af andre poster, kan ikke slettes. En lærer kan ikke slettes, hvis de i øjeblikket underviser i et kursus.
- Brugerdefineret integritet: En "andet" kategori, der består af forretningsrelateret logik og regler til databasen.
Almindelige SQL-databaser
- Oracle :Meget stabil og moden, men kan være dyr
- MySQL :Let og hurtig at sætte op, men ikke så modent som Oracle
- PostgreSQL :God til visse anvendelsestilfælde, men ikke superhurtig
Ressourcer
- SWEPrep - Interviewspørgsmål direkte til din indbakke
- freeCodeCamps SQL og databaser
- Rens kode
- Effektiv Java
- Oracle-dokumentation
- MySql-dokumentation
- PostgreSQL-dokumentation
Hold dig opdateret
- Reddit-tråde :Gode tråde om databaser, SQL og nye teknologier
- Hacker-nyheder: Virkelig god ressource til at holde dig orienteret om den seneste udvikling inden for teknologiindustrien
- CodePen: En fremragende ressource til at opdage god SQL-praksis.