Lær SQL – En veiledning med kodeeksempler
Syntaksen i SQL er basert på relasjonsalgebra, noe som skiller dette programmeringsspråket fra andre språk. Å gjøre deg kjent med syntaksen gjennom praktiske eksempler kan hjelpe deg med å lære SQL på en effektiv måte.
Hva er SQL-syntaks?
I programmering refererer syntaks til hvordan et programmeringsspråk skrives. Syntaksen bestemmer de grunnleggende kodekonstruksjonene og hvordan de skal kobles sammen. Å forstå syntaksen er en grunnleggende forutsetning for å kunne lese og skrive kode i programmeringsspråk.
De viktigste syntakselementene i SQL er SQL-setninger, som også kan inneholde klausuler. Begge kalles ofte «SQL-kommandoer», selv om dette fra et teknisk synspunkt ikke er helt korrekt. Dette er imidlertid ikke de eneste syntakselementene i SQL. Nedenfor finner du en tabell som gir deg en oversikt over syntakselementene i SQL.
| SQL-begrep | Forklaring | Eksempel |
|---|---|---|
| Setning | Beordrer DBMS til å utføre en handling; avsluttes med et semikolon | CREATE TABLE People;
|
| Klausul | Modifiserer en setning; kan bare forekomme innenfor setninger | WHERE, HAVING
|
| Uttrykk | Returnerer en verdi ved evaluering | 6 * 7
|
| Identifikator | Navnet på et databaseobjekt, en variabel eller en prosedyre; kan være kvalifisert eller ukvalifisert | dbname.tablename / tablename
|
| Predikat | Uttrykk som evalueres til TRUE, FALSE eller UNKNOWN
|
Age < 42
|
| Spørring | Spesiell setning; returnerer funnet sett med poster | SELECT Name FROM People WHERE Age < 42;
|
| Funksjon | Behandler en eller flere verdier; skaper vanligvis en ny verdi | UPPER('text') -- returns 'TEXT'
|
| Kommentar | Brukes til å kommentere SQL-kode; ignoreres av RDBMS | -- Comment up to end of line / /*multiline comment if necessary*/
|
SQL-kommandoer som SELECT og CREATE TABLE skrives vanligvis med store bokstaver. SQL skiller imidlertid ikke mellom store og små bokstaver. Bruken av store bokstaver i kommandoer er bare en vanlig konvensjon.
Hvordan utføres SQL-kode?
SQL-kode finnes som kildekode i tekstfiler. Koden blir først aktivert i et passende kjøringsmiljø. Kildekoden leses av en SQL-tolker og omgjøres til handlinger i et RDBMS. Det finnes to grunnleggende tilnærminger her:
1. Kjør SQL-kodeinteraktivt I denne metoden skrives eller kopieres SQL-koden direkte inn i et tekstvindu. SQL-koden kjøres, og resultatet vises. Du kan justere koden og kjøre den på nytt. Den raske vekslingen mellom å endre koden og vise resultatene gjør denne metoden best egnet for læring og utarbeidelse av komplekse spørsmål. 2. Kjør SQL-kode somskript I denne tilnærmingen kjøres en hel kildekodefil som inneholder SQL-kode linje for linje. Om nødvendig sendes tilbakemelding til brukeren først ved slutten av kjøringen. Denne tilnærmingen er best egnet for automatisering av prosesser og for import av MySQL-databasesikkerhetskopier med MySQL dump.
| Grensesnitt | Beskrivelse | Eksempler |
|---|---|---|
| Kommandolinjegrensesnitt (CLI) | Tekstbasert grensesnitt; SQL-kode legges inn og kjøres, resultatet vises som tekst | mysql, psql, mysqlsh |
| Grafisk brukergrensesnitt (GUI) | SQL-kode legges inn i et tekstvindu og/eller genereres som svar på brukerinteraksjon; SQL-koden kjøres, resultatet vises som tabeller | phpMyAdmin, MySQL Workbench, HeidiSQL |
| Programmeringsgrensesnitt (API) | Muliggjør direkte kommunikasjon med et RDBMS; SQL-kode inkluderes og kjøres som en streng i koden til programmeringsspråket; resultatene er tilgjengelige som datastrukturer for videre bruk | PHP Data Objects (PDO), Connector/J (Java), Connector/Python, C API |
Hvordan sette opp et produktstyringssystem ved hjelp av SQL
Den enkleste måten å lære et programmeringsspråk på er å skrive og kjøre koden selv. I denne veiledningen skal vi lage en minidatabase og kjøre spørringer mot den. Til dette bruker vi den nettbaserte SQL-tolken fra nettstedet sql.js. For å følge veiledningen går du til nettstedet og erstatter SQL-koden som allerede er lagt inn, med koden fra eksemplene våre. Kjør koden bit for bit for å få resultatene vist.
Opprett en SQL-database
I dette eksemplet skal vi utvikle et produktstyringssystem for en butikk. Dette er kravene:
- Vi har flere produkter, og vi har et visst antall av hvert produkt på lager.
- Vår kundebase består av mange kunder.
- Bestillinger fra kunder kan inneholde flere produkter.
- For hver bestilling lagrer vi bestillingsdatoen og opplysningene om personen som legger inn bestillingen, samt hvilke produkter som ble bestilt og bestillingsmengden.
Disse kravene oversettes til en abstrakt beskrivelse og deretter til SQL-kode:
- Opprett modell
- Definer skjema
- Legg inn dataposter
- Definer spørringer
Opprett en modell av enheter og relasjoner
Det første trinnet foregår på papir eller ved hjelp av spesielle modelleringsverktøy. Vi samler inn informasjon om systemet som skal modelleres for å utlede enheter og relasjoner. Dette trinnet gjennomføres ofte i form av et entitet-relasjonsdiagram (ER-diagram).
Hvilke enheter finnes det, og hvordan henger de sammen? Enheter er kategorier av objekter. I eksemplet med produktstyringssystemet er enhetene produkter, kunder og bestillinger. For hver enhet trengs det en tabell. På grunn av relasjonsmodellens særtrekk må det legges til flere tabeller for å modellere relasjonene. Det krever erfaring å forstå dette og implementere det på riktig måte.
Et sentralt spørsmål som må besvares, er hvordan enhetene forholder seg til hverandre. Her må vi ta hensyn til begge retningene i et forhold og skille mellom entall og flertall. Her er et eksempel med biler og bileiere:
- En eier kan potensielt eie flere biler.
- En bil kan bare tilhøre én eier.
Det tegner segtre mulige relasjonsmønstre mellom de to enhetene:
| Forhold | Enheter | Fra venstre | Fra høyre |
|---|---|---|---|
| 1:1-relasjon | Auto:indikator | En bil kan bare ha én indikator. | En indikator kan bare tilhøre én bil. |
| 1:n-relasjon | Eier:bil | En eier kan potensielt ha flere biler. | En bil kan bare tilhøre én eier. |
| m:n-relasjon | Bil:gate | En bil kan kjøre på flere veier. | Flere biler kan kjøre på én vei. |
Implementere produkter
Først skal vi implementere produkttabellen. For å gjøre dette må vi definere et skjema, legge inn dataposter og, for testformål, kjøre noen enkle spørringer.
Definer skjema
Den viktigste SQL-kommandoen for å definere databasetabeller er CREATE TABLE. Denne kommandoen lar deg opprette en tabell med et navn og angi kolonneegenskaper. Samtidig defineres datatyper og, om nødvendig, begrensninger på verdiene som skal lagres:
DROP TABLE IF EXISTS Products;
CREATE TABLE Products ( product_id int, product_name text, stocked int, price int );sqlVi bruker en DROP TABLE IF EXISTS-setning før vi definerer tabellen. Dette fjerner eventuelle eksisterende tabeller og gjør det mulig å kjøre den samme SQL-koden flere ganger uten at det oppstår feilmeldinger.
Legg til datasett
Nå skal vi opprette noen testposter. Vi skal bruke SQL-kommandoen INSERT INTO samt VALUES-funksjonen til å fylle ut feltene:
INSERT INTO Products VALUES (10, 'ABC Product', 74, 1050);
INSERT INTO Products VALUES (20, 'KLM Product', 23, 750);
INSERT INTO Products VALUES (30, 'XYZ Product', 104, 350);sqlDefiner spørsmål
For å sjekke tilstanden til tabellen «Products» skal vi skrive en enkel spørring. Vi bruker kommandoen SELECT FROM og viser hele tabellen:
SELECT * FROM Products;sqlNå skal vi skrive et litt mer komplisert spørsmål som beregner den totale verdien av produktene vi har på lager:
SELECT product_name AS 'Name', (stocked * price) AS 'Value' FROM Products;sqlLegg til flere tabeller
Nå skal vi opprette de resterende tabellene vi trenger. Vi følger de samme trinnene som vi brukte for tabellen «Produkter». Først oppretter vi tabellen «Kunder»:
DROP TABLE IF EXISTS Customers;
CREATE TABLE Customers ( customer_id int, customer_name text, contact text );sqlDeretter legger vi inn opplysninger for to eksempler på kunder:
INSERT INTO Customers VALUES (100, 'EDC Customer', 'ED@example.com');
INSERT INTO Customers VALUES (200, 'WVU Customer', 'WV@example.com');sqlFor å sjekke om det fungerte, skal vi vise kundetabellen:
SELECT * FROM Customers;sqlNeste trinn er å opprette tabellen «Orders»:
DROP TABLE IF EXISTS Orders;
CREATE TABLE Orders ( order_id int, customer_id int, order_date text );sqlNå skal vi legge inn tre eksempler på innkjøpsordrer. For den første verdien i postene tildeler vi en ID som primærnøkkel. Den andre verdien er eksisterende kunde-ID-er, som fungerer som fremmednøkler. Deretter lagrer vi datoen for ordren:
INSERT INTO Orders VALUES (1000, 100, '2022-05-03');
INSERT INTO Orders VALUES (1001, 100, '2022-05-04');
INSERT INTO Orders VALUES (1002, 200, '2022-05-08');sqlFor å teste det, skal vi utføre følgende kommandoer:
SELECT * FROM Orders;sqlTil slutt trenger vi en tabell for produktene i en ordre sammen med antallet av dem. Dette er et m:n-forhold, fordi en ordre kan inneholde flere produkter, og et produkt kan forekomme i flere ordrer. Vi skal definere en tabell som inneholder ID-ene til ordrer og produkter som fremmednøkler:
DROP TABLE IF EXISTS OrderItems;
CREATE TABLE OrderItems ( orderitem_id int, order_id int, product_id int, count int );sqlNå legger vi inn noen produkter som er bestilt. Vi velger ID-ene til bestillingene og produktene slik at det blir én bestilling med to produkter og en annen bestilling med bare ett produkt:
INSERT INTO OrderItems VALUES (10001, 1000, 10, 3);
INSERT INTO OrderItems VALUES (10002, 1000, 20, 2);
INSERT INTO OrderItems VALUES (10003, 1002, 30, 12);sqlFor å sjekke dette, skal vi sende ut de bestilte produktene:
SELECT * FROM OrderItems;sqlSkriv komplekse spørsmål
Hvis du har kjørt alle kodebitene som er vist så langt, bør du ha fått en god forståelse av strukturen i testdatabasen vår. La oss nå gå videre til mer komplekse spørringer som viser hvor kraftig SQL er. Først skal vi skrive en spørring som slår sammen data spredt over flere tabeller. Vi skal bruke en SQL JOIN-kommando for å koble sammen tabellene som inneholder kundedata og ordrer. Mens vi gjør dette, skal vi gi kolonnene navn og angi en samsvarende kunde-ID som JOIN-betingelse. Husk at vi bruker kvalifiserte identifikatorer for å skille mellom kolonnene i de to tabellene:
SELECT customers.customer_name as 'Customer', customers.customer_id, orders.order_id, orders.order_date AS 'Date' FROM Customers JOIN Orders ON Orders.customer_id = Customers.customer_id ORDER BY Customers.customer_id;sqlNå skal vi bruke en ny JOIN-kommando for å beregne den totale kostnaden for de bestilte produktene:
SELECT OrderItems.order_id, OrderItems.orderitem_id AS 'Order Item', Products.product_name AS 'Product', Products.price AS 'Unit Price', OrderItems.count AS 'Count', (OrderItems.count * Products.price) AS 'Total' FROM OrderItems JOIN Products ON OrderItems.product_id = Products.product_id;sql