Databaser kan vara knepiga att linda huvudet runt. Men de är viktiga för full-stack programmering och bygga ut back-end-tjänster som lagrar data.
I det här inlägget kommer jag att avmystifiera SQL, databaser och relationella databashanteringssystem. Jag kommer också att använda några analogier till trollkarlsvärlden, inklusive Harry Potter själv och några av klasserna han tar på Hogwarts.
Innan vi dyker in i nyckeltermer, låt oss definiera vad en databas i sig är:
En databas är en strukturerad uppsättning data som finns i en dator, särskilt en som är tillgänglig på olika sätt. Det är i huvudsak en organiserad uppsättning data på en dator, som kan nås elektroniskt från ett datorsystem.
Nyckelvillkor
Nedan följer några nyckeltermer som vi börjar med:
- RDMS: Relationella databashanteringssystem. Detta ramverk för databaser är grunden för MySQL.
- SQL: Structured Query Language.
- Tabell: Databasobjekt som bär data. Ett exempel på ett tabellnamn är "Elever" eller "Lärare" eller "Kurser".
- Fält: Värdena i en tabell kallas fält. Exempelfält för studenter skulle vara "Förnamn", "Efternamn" och "GPA".
- Spela in/rad: En individuell post i tabellen.
Efter att ha lagt till lärare och kurser i databasen kan vi ha tabeller för studenter, lärare och kurser.
När vi går vidare i guiden kommer vi bara att använda eleverna exempel här som referens. Om du hade turen att bli anställd som mjukvaruingenjör på Hogwarts, kan din databas göra bra användning av några av dessa kommandon :D
SQL-uttalanden
Syntax
Semikolon är standardsättet att separera en SQL-sats från en annan. Det tillåter att flera SQL-satser körs i samma anrop. I den här guiden kommer vi att ha ett semikolon i slutet av varje påstående.
De viktigaste SQL-kommandona
Skapa :Skapar en ny SQL-tabell.
Om vi skulle skapa elevdatabasen för Hogwarts-skolan, till exempel, skulle vi använda CREATE att göra ett bord som heter "Studenter".
- Syntax
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
column3 datatype,
....
);
- Exempel
CREATE TABLE Students
(first_name VARCHAR(255),
last_name VARCHAR(255),
login VARCHAR(255),
age INTEGER,
gpa REAL,
house VARCHAR(255));
Släpp :Tar bort en tabell. Var mycket försiktig när du använder det här kommandot eftersom det kommer att radera all data i tabellen!
Om vi vill ta bort hela studentdatabasen använder vi DROP för att utföra den åtgärden.
- Syntax
DROP TABLE table_name;
- Exempel
DROP TABLE Students;
Infoga :Lägger till nya rader med data i en tabell.
Vi skulle använda INSERT att lägga till nya elever när de registrerar sig på Hogwarts.
- Syntax
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
- Exempel
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älj :Används för att hämta data i en databas som ska returneras i tabellformat.
Om vi ville hämta alla namn på elever som finns i Gryffindor House, skulle vi använda SELECT kommando. Exemplet nedan frågar i tabellen Studenter för förnamn och efternamn på varje elev i databasen, vilket för oss bara är de fem raderna som beskrivs ovan.
- Syntax
SELECT column1, column2, ...
FROM table_name;
- Exempel
SELECT first_name, last_name FROM Students;
förnamn | efternamn |
---|---|
Harry | Potter |
Hermioni | Granger |
Ron | Weasley |
Draco | Malfoy |
Cedric | Diggory |
Alternativt, om vi vill välja alla fält i tabellen, skulle vårt kommando använda "*"-syntaxen, vilket betyder att alla fält markeras:
SELECT * FROM Students;
förnamn | efternamn | logga in | ålder | gpa | hus |
---|---|---|---|---|---|
Harry | Potter | pojken levde | 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 är en logisk del av en SQL-sats, och det är (i teorin) ett valfritt fält.
I ovanstående uttalande returnerade vi helt enkelt alla fält i studentdatabasen. Vi har inte angett något villkor för värdena som returneras.
Tänk om vi inte ville fråga alla studenter, utan bara de vars hus är Gryffindor? Vad sägs om att fråga elever vars förnamn börjar med "H", eller elever i antingen Hufflepuff och Slytherin? Dessa mer komplexa fall löses med SQL-satser.
Nedan finns en översikt över de vanligaste klausulerna, men det finns flera fler satser i SQL-språket. Här är en bra allmän översikt om du vill ha mer information.
Exempel på klausuler
Var: Används för att ange ett villkor när data hämtas från en databas. Om vi går tillbaka till exemplet med Select, måste vi använda WHERE för att ange huset som Gryffindor.
- Syntax
SELECT column1, column2, ...
FROM table_name
WHERE condition;
- Exempel
SELECT * FROM Students
WHERE house='Gryffindor';
förnamn | efternamn | logga in | ålder | gpa | hus |
---|---|---|---|---|---|
Harry | Potter | pojken levde | 15 | 4 | Gryffindor |
Hermioni | Granger | granger2 | 15 | 4.5 | Gryffindor |
Ron | Weasley | weasley7 | 15 | 3.7 | Gryffindor |
Och Används för att kombinera flera satser i en SQL-sats, där alla villkor separerade med AND är sanna. Vi skulle använda AND för att få Gryffindor-studenter som har över 3,8 GPA.
- Syntax
SELECT column1, column2, ...
FROM table_name
WHERE condition1 AND condition2 AND condition3 ...;
- Exempel
SELECT * FROM Students
WHERE house='Gryffindor' AND gpa>3.8;
förnamn | efternamn | logga in | ålder | gpa | hus |
---|---|---|---|---|---|
Harry | Potter | pojken levde | 15 | 4 | Gryffindor |
Hermioni | Granger | granger2 | 15 | 4.5 | Gryffindor |
Eller :Liknar AND, men returnerar endast data där endast ETT av villkoren separerade med ELLER är sanna. Om vi ville hämta elever i Hufflepuff och Slytherin, men inte båda, skulle vi använda OR-kommandot.
- Syntax
SELECT column1, column2, ...
FROM table_name
WHERE condition1 OR condition2 OR condition3 ...;
- Exempel
SELECT * FROM Students
WHERE house='Slytherin' OR house='Hufflepuff';
förnamn | efternamn | logga in | ålder | gpa | hus |
---|---|---|---|---|---|
Draco | Malfoy | malfoy999 | 15 | 4 | Slytherin |
Cedric | Diggory | diggory123 | 15 | 4 | Hufflepuff |
Gilla: Används med WHERE för att söka efter ett specifikt mönster. Om vi bara ville ha för- och efternamnet på trollkarlar/häxor med namn som börjar med "H", skulle vi kunna använda kommandot Gilla.
- Syntax
SELECT column1, column2, ...
FROM table_name
WHERE columnN LIKE pattern;
- Exempel
SELECT first_name, last_name FROM Students
WHERE first_name LIKE 'H%';
förnamn | efternamn |
---|---|
Harry | Potter |
Hermioni | Granger |
Antal: Används för att hitta antalet av en kolumn (eller kolumner) i en tabell.
- Syntax
SELECT COUNT(column_name)
FROM table_name
WHERE condition;
- Exempel
SELECT COUNT(first_name) FROM Students;
ANTAL(förnamn) |
---|
5 |
Två andra kommandon som använder samma syntax är AVG och SUM. AVG kommer att beräkna medelvärdet av alla värden, och summan beräknar summan av alla värden.
Välj gräns: Används för att skära av svar till bara ett specificerat belopp. Sättet som de översta svaren väljs på är i den ordning de först infogas i databasen kronologiskt.
- Syntax
SELECT column_name(s)
FROM table_name
WHERE condition
LIMIT number;
- Exempel
SELECT * FROM Students LIMIT 3;
förnamn | efternamn | logga in | ålder | gpa | hus |
---|---|---|---|---|---|
Harry | Potter | pojken levde | 15 | 4 | Gryffindor |
Hermioni | Granger | granger2 | 15 | 4.5 | Gryffindor |
Ron | Weasley | weasley7 | 15 | 3.7 | Gryffindor |
Andra användbara kommandon
Beställ efter: Sorterar resultaten i stigande eller fallande ordning.
- Syntax
SELECT column1, column2, ...
FROM table_name
ORDER BY column1, column2, ... ASC|DESC;
- Exempel
SELECT * FROM Students ORDER BY first_name;
förnamn | efternamn | logga in | ålder | gpa | hus |
---|---|---|---|---|---|
Cedric | Diggory | diggory123 | 15 | 4 | Hufflepuff |
Draco | Malfoy | malfoy999 | 15 | 4 | Slytherin |
Harry | Potter | pojken levde | 15 | 4 | Gryffindor |
Hermioni | Granger | granger2 | 15 | 4.5 | Gryffindor |
Ron | Weasley | weasley7 | 15 | 3.7 | Gryffindor |
Grupp efter: Grupperar kategorier som har samma värden i rader. Om du vill veta antalet elever i varje hus (t.ex. 3 i Gryffindor) kan du använda kommandot Gruppera efter.
- Syntax
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
ORDER BY column_name(s);
- Exempel
SELECT COUNT(first_name), house FROM Students GROUP BY house;
ANTAL(förnamn) | hus |
---|---|
3 | Gryffindor |
1 | Hufflepuff |
1 | Slytherin |
Slutligen, här är en DB Fiddle som visar alla ovanstående kommandon i aktion!
Normaliserade vs denormaliserade databaser
När du designar en databas finns det två huvudsakliga designmönster du kan följa, var och en med sina egna avvägningar.
Normaliserad: Optimerar för att minimera redundans, inte för lästid.
Låt oss säga att vi har en kurstabell som har ett lärar-ID för läraren som undervisar i den kursen. Vi har även en lärardatabas som har lärarens namn.
När vi vill få namn på lärare som undervisar i en viss kurs måste vi fråga både kurser och lärare eftersom kurstabellen inte har lärarnamnet (effektivt men överflödigt).
Denormaliserad: Optimerar för lästid , inte för att minimera redundans.
Låt oss säga att vi har en kurstabell som har ett lärar-ID OCH ett lärarnamn. Vi har en lärardatabas som också har lärarnamnet. När vi vill få namn på lärare i kursen kan vi bara använda kurstabellen (överflödigt men effektivt).
Dataintegritet
Det är viktigt för användarna att den data de interagerar med är säker, korrekt och förnuftig. Exempel är att se till att ålder inte är ett negativt tal, eller att inga två elever har samma information. Vi hänvisar till detta som dataintegritet.
Dataintegritet har flera former och kan delas in i fyra kategorier:
- Enhetsintegritet :Det finns inga dubbletter av rader i en tabell. Vi kan till exempel inte infoga Ron Weasley två gånger i databasen.
- Domänintegritet :Begränsning av typen av värden som man kan infoga för att framtvinga korrekta värden. Ett hus kan till exempel bara vara Gryffindor, Ravenclaw, Slytherin eller Hufflepuff.
- Referensintegritet :Poster som används av andra poster kan inte raderas. En lärare kan inte tas bort om de för närvarande undervisar i en kurs.
- Användardefinierad integritet: En "annan" kategori som består av affärsrelaterad logik och regler till databasen.
Vanliga SQL-databaser
- Oracle :Mycket stabil och mogen men kan vara kostsam
- MySQL :Lätt och snabb att installera men inte lika mogen som Oracle
- PostgreSQL :Bra för vissa användningsfall men inte supersnabb
Resurser
- SWEPrep - Intervjufrågor direkt till din inkorg
- freeCodeCamps SQL och databaser
- Ren kod
- Effektiv Java
- Oracle-dokumentation
- MySql-dokumentation
- PostgreSQL-dokumentation
Håll dig uppdaterad
- Reddit-trådar :Bra trådar om databaser, SQL och ny teknik
- Hackernyheter: Riktigt bra resurs för att hålla dig uppdaterad om den senaste utvecklingen inom teknikbranschen
- CodePen: En utmärkt resurs för att upptäcka bra SQL-praxis.