SELECT i detaljer samt opsamlingsfunktioner

Tags:    databaser
<< < 123 > >>
Skrevet af Bruger #4522 @ 06.02.2008

Introduktion


Denne artikel giver en udførlig beskrivelse af SQL sætningen SELECT. Artiklen forudsætter et kendskab til SQL på begynderniveau og bygger videre på det for at give læseren en god og grundig forståelse for SELECT. Kun selve SELECT berøres, så jeg kommer i denne artikel ikke ind på WHERE, FROM eller andre "bisætninger" der ofte anvendes sammen med SELECT.

Artiklen fokuserer også meget på brugen af det jeg på dansk kalder for opsamlingsfunktioner - det engelske udtryk er aggregation function; disse funktioner kan være utrolig nyttige, men mange begyndere har det lidt svært med dem. Et andet udtryk for dem er mængdefunktioner (ikke at forveksle med mængdeoperationer som der også findes nogle af i SQL).

Et eksempel på en database


For ordentligt at illustrere SELECT er det nødvendig med en database som jeg kan lave nogle forespørgelser mod.

Jeg har til dette formål selv konstrueret en database om krigsskibe (det giver mig forhåbentlig mulighed for på et tidspunkt at kunne bruge udtrykket "splitte mine bramsejl"). Det er ikke en "seriøs" database, men blot en jeg konstruerede til denne artikel ud fra data fra wikipedia. Et af skibene i den lille base er HMS Africa fra 1905:



Nå, lad os få bygget basen.

Først laver vi selve databasen. Derefter laver jeg tre tabeller: Ships, Engines og Builders. Ships indeholder de enkelte skibe, Engines indeholder de motorer som skibene bruger, og den sidste tabel, Builders, indeholder de skibsværfter som byggede de enkelte skibe.

Følgende SQL Server script konstruerer både databasen og de tre tabeller (det kan meget nemt modificeres til MySQL).

Fold kodeboks ind/udKode 


Ok. Nu er vi klar til at indsætte noget data i vores tabeller. Vi starter med nogle af værfterne. Følgende script indsætter dem i vores database:

Fold kodeboks ind/udKode 


Hvis vi nu laver en SELECT * på Builders får vi (jeg kommer ind på "SELECT * ..." i detaljer nedenfor):

Fold kodeboks ind/udKode 


Ok, det var én tabel. Fyldt med data. Nu er det så tid til at indsætte data i Engines tabellen. Det sørger følgende script for:

Fold kodeboks ind/udKode 


En SELECT * på den nybefolkede Engines tabel giver os:

Fold kodeboks ind/udKode 


Så er det tid til at indsætte data i Ships-tabellen. Endelig! Det sørger følgende script for:

Fold kodeboks ind/udKode 


En SELECT * fra tabellen Ships giver os følgende resultatmængde:

Fold kodeboks ind/udKode 


Rigtige søfolk bruger ikke udtryk som km/t, så de siger i stedet knob hvorfor hastighedskolonnen (altså Speed) holder værdier i knob. 1 knob er 1 sømil/time, og 1 sømil = 1,852 km. Så 1 knob er altså næsten 2 km/t. Draught, som på dansk heder dybgang, angiver anfstanden fra skrogets bund til vandlinjen der hvor skibet ligger lavest. Mange skibe har en måleskala på boven hvor det netop kan ses:



Både dybgang og længde måles i basen i meter.

Det er jo ikke meningen at dette skal være en artikel om skibe, men om SQL, så lad os komme i gang med at kigge på SELECT!




<< < 123 > >>

Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (5)

User
Bruger #6559 @ 07.02.08 19:34
En meget god artikel. Jeg synes der er mange gode ting, som man måske ikke lige er faldet over i andre artikler.

User
Bruger #2730 @ 08.02.08 09:54
Du skriver at følgende er ulovlig: select name, sum(speed)
Både ja og nej, den kan ikke eksekvere, der mangler en grupperings funktion. Så for at den skal virke skal den hedde select name, "sum(speed) group by name". Samtidig synes jeg starten er lidt malplaceret, du vil skrive om aggregeringsfunktioner, men starter ud med at have 2 sider om alt andet end aggregeringsfunktioner. Du er hurtigt omkring joins, men gør det ikke færdigt...

Det du dækker omkring aggregeringsfunktioner er godt og velskrevet
User
Bruger #4522 @ 08.02.08 11:17
Hej Brian,

Ang. SELECT name, sum(speed) værende ulovlig så tager jeg selvsagt ikke GROUP BY i betragtning i artiklen overhovedet, og det er med vilje da det er et stort emne for sig selv. Jeg kunne måske havde nævnt det forbehold mere eksplicit.

Meningen var at artiklen udelukkende skulle omhandle SELECT og mængdefunktioner, hverken GROUP BY eller FROM (og altså ej heller JOINs); artiklen var ikke ment til en nybegynder hvorfor jeg antog det rimeligt at læseren havde noget SQL viden i forvejen, og derfor kunne betragte emnerne i isolation.

Jeg medgiver dog at jeg muligvis kunne have gjort disse forbehold mere eksplicit. Du tydeliggør i hvert fald at jeg har fejlet hvad det angår.

Tak for dine kommentarer ;)
User
Bruger #11375 @ 17.02.08 01:11
Hej Jacob,

en virkelig superfed artikel som der simpelthen har været en fornøjelse at læse.

SQL er virkelig et fedt sprog med ret så mange muligheder. :-)

User
Bruger #8782 @ 20.06.08 16:07
Meget nyttig artikel, men mest for de brugere som har en lille smule forstand på MySQL vil jeg påskønne. :D
- Men jeg synes stadig artiklen er til en 5'er!

Og som Martin Th. Sonne siger, det var virkelig en fornøjelse at læse artiklen!
Du skal være logget ind for at skrive en kommentar.
t