Beregninger og konstante værdier

I SQL-sproget kan du indsætte konstante værdier som en kolonne, og du kan lave beregninger direkte i en forespørgsel. Beregninger og indsættelse af konstante kolonneværdier er nyttigt i flere situationer. Enten fordi der er krav om, at der leveres eksempelvis en pris med moms, men værdien er skrevet uden moms. Eller der kan være et ønske om, at alle rækker har en kolonne med en bestemt oplysning, f.eks. for at identificere data i forbindelse med samkøring af data fra flere kilder.

Når du ændrer en kolonnes oprindelige værdi eller indsætter en kolonne med konstant værdi, vil SQL Server ikke længere give dig navnet på kolonnen. Det er der umiddelbart to grunde til: For det første kan det give dataforvirring, hvis en kolonne har samme navn, men en ny værdi, og for det andet kan beregningen indeholde flere kolonner, og det er så ikke tydeligt hvilket kolonnenavn, der skal bruges. Derfor navngiver/omdøber jeg konsekvent kolonner, der laves beregninger på. Se mere om at omdøbe og navngive kolonner i denne lektion.

Sådan beregner du moms på priskolonne

Et ganske åbenlyst eksempel er at lave en momsberegning af priskolonnen i varetabellen. Momsen i Danmark (i skrivende stund) er 25%. Vi skal altså gange prisen med 1,25. Gangetegnet i SQL Server er *. Det skal ikke forveksles med * i forbindelse med visning af alle kolonner i en SELECT.

SELECT
  Varenr,
  Varebetegnelse,
  Pris PrisUdenMoms,
  Pris*1.25 PrisMedMoms
FROM Vare

Konstante værdier i en kolonne

Det kan være nødvendigt eller bare praktisk at have en eller flere kolonner med kontante værdier i. Det er supernemt, du skal bare skrive værdien som var det et felt. Tekstværdier skal skrives i apostroffer.

Dette eksempel skriver en kolonne med teksten Boblekuvert TILBUD og laver dertil en kolonne med værdien 50, som er den rabatprocent, der ydes. Selvfølgelig beregnes prisen også.

SELECT
  'Boblekuvert TILBUD' Tilbudsinformation,
  50 Rabatprocent,
  Varebetegnelse,
  Pris NormalprisUdenMoms,
  Pris*0.5 TilbudsprisUdenMoms
FROM Vare
WHERE Varenr LIKE 'BOBA%'

Tekstfelter kan også manipuleres

Du kan også manipulere tekstfelter, f.eks. ved at lægge en tekst til, eller bruge en tekstfunktion til at afkorte eller på anden måde ændre værdien. Her skriver vi Halv pris! foran varebetegnelsen.

SELECT
  'Boblekuvert TILBUD' Tilbudsinformation,
  'Halv pris! ' + Varebetegnelse Varebetegnelse,
  Pris NormalprisUdenMoms,
  Pris*0.5 TilbudsprisUdenMoms
FROM Vare
WHERE Varenr LIKE 'BOBA%'

Regnearter og funktioner

SQL Server kender de almindelige regnearter og har en masse indbyggede funktioner til forskellige formål. Denne forespørgsel viser de fire regnearter og eksempler på et par indbyggede funktioner.

  • SIGN(værdi): Viser fortegnet af værdien. -1 negativ, 0 nul, 1 positiv.
  • ROUND(værdi, antaldecimaler): afrunder værdien til det ønskede antal decimaler.
  • RAND(): viser et tilfældigt tal mellem 0 og 1. Bemærk, at der ikke beregnes en ny værdi i hver række!
SELECT
  Pris,
  Pris*2 Multiplikation,
  Pris/2 Division,
  Pris+2 Addition,
  Pris-0.2 Subtraktion,
  SIGN(Pris) FortegnPostiv,
  SIGN(-Pris) FortegnNegativ,
  SIGN(0) FortegnNul,
  ROUND(Pris/7, 4) Afrund4decimaler,
  ROUND(Pris/7, 2) Afrund2decimaler,
  RAND() Tilfældig
FROM Vare
WHERE Varenr LIKE 'BOBA%'

Prøv selv

  • I Ordrelinje-tabellen er der antal, pris og rabat (i kroner pr. enhed). Lav en kolonne, der viser totalen.
  • Lav en forespørgsel med en Varebetegnelse-kolonne, hvor varenummer skrives i parentes efter varebetegnelsen. Kolonnens navn skal stadig være Varebetegnelse.
  • Funktionen DATEDIFF beregner tidsrum mellem to datoer. Første parameter er enheden. Brug DATEDIFF(enhed, dato1, dato2) og GETDATE() til at finde ud af, hvor mange dage (parameter hedder d), der er siden ordrerne i Ordre-tabellen er oprettet.
    I løsningen i videoen er der også løsning på antal timer, uger og måneder.

Omdøbe felter og tabeller med AS

SQL-sproget har en indbygget kommando til at omdøbe felter og tabelnavne i resultatet. Det sker med AS-kommandoen. Som du skal se, tillader SQL endda, at du sparer de par tastetryk, der skal til at skrive AS.

Omdøbning af tabelnavne er i sandhed en stor fordel, når man arbejder med flere tabeller. Se nærmere i kapitlet om JOIN (link kommer). Men det er også en måde at give et navn til en kolonne i et resultat med beregnede værdier.

Sådan omdøbes felt eller kolonne i SQL

I SQL skriver du AS og det nye navn lige efter kolonne- eller tabelnavn.

SELECT
  Kolonne1 AS Nytkolonne1navn,
  Kolonne2 AS Nytkolonne2navn
FROM Tabel AS Nyttabelnavn

I dette eksempel omdøbes feltet Navn i Kunde-tabellen til Kundenavn. Feltet Bynavn påvirkes ikke.

SELECT Navn AS Kundenavn, Bynavn
FROM Kunde

Tabellen kan omdøbes sådan her, men det ses ikke umiddelbart i resultatet.

SELECT Navn
FROM Kunde AS Kundetabel

Brug af kvalificeret navngivning med punktum

Senere, når vi arbejder med flere tabeller i en forespørgsel bliver det nødvendigt at angive eksakt feltnavn ved at henvise til tabelnavn og feltnavn på én gang. Det kalder vi for kvalificeret navngivning. Ved at skrive tabelnavn et punktum og dernæst kolonnenavn, fortæller du SQL, at du vil have kolonnen i den specifikke tabel.

SELECT Tabel.Kolonne1, Tabel.Kolonne2, Tabel.*
FROM Tabel

Eksempel: Vis kolonnen Navn i tabellen Kunde:

SELECT Kunde.Navn
FROM Kunde

Omdøbning af tabel og kvalificeret navngivning

I forbindelse med kvalificeret navngivning bliver det meget relevant, hvad man har omdøbt tabellen til. Se dette klip fra SQL Server Management Studio. De røde streger antyder, at Kunde.Navn ikke kan findes.

Du får en fejl, hvis du kører forespørgslen:

Msg 4104, Level 16, State 1, Line 18
The multi-part identifier "Kunde.Navn" could not be bound.

Den korrekt måde er at bruge det navn, der er angivet efter AS ved tabellen.

SELECT Kundetabel.Navn
FROM Kunde AS Kundetabel

Resultatet er det samme som tidligere.

Du behøver ikke skrive AS

SQL tillader, at du udelader ordet AS. Så du kan faktisk gøre sådan her. Bemærk brugen af kvalificeret navngivning, hvor Kunde-tabellen er omdøbt til K.

SELECT K.Navn Kundenavn,
  K.Adresse1 Vej1,
  K.Adresse2 Vej2,
  K.Postnr Postnummer
FROM Kunde K

Prøv selv

  • Vis rækker fra Vare-tabellen med kolonnenavne, der kun er på ét bogstav.
  • Vis kolonnerne Navn, Email og Telefon fra Kundeemne-tabellen med kvalificeret navngivning, giv Kundeemner-tabellen navnet E.
  • Omdøb kolonnerne til hhv. Firmanavn, Emailadresse og Telefonnummer – brug AS.

NOT i forespørgsel

Vi har endnu en logisk operator i SQL Server. Du har faktisk allerede mødt NOT et par gange. Se evt. lektionen om NULL, hvor NOT bliver brugt. I kombination med andre logiske operatorer, som AND og OR, er NOT i stand til at forfine dine betingelser i SQL-forespørgslerne.

Den logiske operator NOT

Denne operator vender resultatet af et udsagn fra SAND til FALSK eller omvendt. Eksempler:

1=2 – er FALSK
NOT 1=2 – er SAND
1<>2 – er SAND
NOT 1<>2 – er FALSK

NOT-operatoren bruges på denne måde i SQL:

SELECT Navn, Bynavn FROM Kunde
WHERE NOT Bynavn = 'Viborg'

Husk dog i forbindelse med NULL, skrives NOT efter IS:

SELECT Navn, Email FROM Kunde
WHERE Email IS NOT NULL

Dette er faktisk også gyldigt og giver samme resultat:

SELECT Navn, Email FROM Kunde
WHERE NOT Email IS NULL

Du kan også udføre NOT på et udtryk, som allerede indeholder NOT, altså dobbelt negation:

SELECT Navn, Email FROM Kunde
WHERE NOT Email IS NOT NULL

Eller, hvis du har lyst til at gå amok i dobbeltnegation:

SELECT Navn, Bynavn FROM Kunde
WHERE NOT NOT Bynavn = 'Viborg'

Brug af NOT med AND og OR

Tingene kan blive lidt mere komplicerede, når vi blander NOT ind i andre betingelser med AND eller OR. Lad os finde varer, der hedder noget med Boble og som ikke koster mellem 1 og 2 kr.

Første forsøg er forkert, da NOT kun påvirker første betingelse:

SELECT * FROM Vare
WHERE
    Varebetegnelse LIKE 'Boble%'
    AND
    NOT Pris > 1 AND Pris < 2

I stedet skal vi indkapsle prisbetingelsen i parentes, hvorved NOT påvirker hele udtrykket:

SELECT * FROM Vare
WHERE
    Varebetegnelse LIKE 'Boble%'
    AND
    NOT (Pris > 1 AND Pris < 2)

Prøv selv

  • Find kunder ikke i Nyborg
  • Find kunder i Nyborg med gyldig email
  • Find papkasser, hvor prisen ikke er mellem 4 og 6 kr.

NULL betyder tom

Der går som regel ikke lang tid med databaser, inden du støder på begrebet NULL. Denne lektion forklarer de vigtigste facetter af NULL i en database. Du får brug for dette senere og – vil jeg påstå – resten af din karriere med SQL Server, uanset om det er Microsoft SQL Server som i dette kursus, eller en af mange andre varianter af SQL-databaser. Som en lille bonus får du at se, hvordan du kan bruge SELECT uden at vælge en tabel, du bliver introduceret til beregninger i en SQL-forespørgsel.

Der er nogen ting man skal indse og acceptere, når man har med NULL at gøre i sine SQL forespørgsler. Først og fremmest: NULL er ikke en værdi! NULL betyder faktisk lige præcis, at feltet ikke har nogen værdi.

Lær dette udsagn:

NULL viser, at et felt ikke har en værdi.

Dette har nogle konsekvenser for sammenligning af værdier i en forespørgsel i SQL. Her er nogle udsagn, der alle gælder i SQL:

  • NULL er ikke det samme som nul: 0
  • NULL er ikke det samme som tom tekst: ”
  • NULL er ikke større end nul, tom tekst eller nogen som helst dato
  • NULL er ikke mindre end nul eller tom tekst eller nogen som helst dato
  • NULL er ikke større end, mindre end eller lig med NULL
  • Et felt har ikke værdien NULL
  • Et felt kan være NULL eller være ikke-NULL
  • Et felt med en værdi er altid ikke-NULL
  • NULL kan opstå, hvis et felt ikke tildeles en værdi
  • NULL kan forbydes i et felt i tabeldesign
  • NULL kan opstå, når man sammenkæder tabeller (se lektionen om left og right join), også for felter, der ikke må være NULL
  • Regnestykker med NULL er NULL:
    • 2+3=5, men 2+NULL er NULL
    • ‘Hans ‘ + ‘og Grethe’ = ‘Hans og Grethe’, men ‘Hans ‘ + NULL + ‘og Grethe’ er NULL
    • Du kan dividere med NULL, resultatet er NULL

Afgør, om et felt er tomt med IS NULL

I SQL-sproget og dermed i dine forespørgsler, kan du ikke sammenligne direkte med NULL. Følgende er simpelthen dybt ulovligt og vil aldrig give et resultat.

SELECT * FROM Kunde
WHERE Adresse2 = NULL

Bemærk, at du ikke får en fejl fra SQL Server. Det er faktisk tilladt at sammenligne med NULL, men der kommer bare aldrig et resultat.

Intet er lig med NULL

Du skal altid spørge, om værdien er NULL (på engelsk IS NULL):

SELECT * FROM Kunde
WHERE Adresse2 IS NULL

Eller du skal spørge, om værdien er ikke-NULL (på engelsk IS NOT NULL)

SELECT * FROM Kunde
WHERE Adresse2 IS NOT NULL

Du kan ikke regne med NULL

Jeg ved godt, overskriften lyder lidt som en onkelvittighed, men der er nu noget sandt i det. Hver gang NULL indgår i en beregning er resultatet altid NULL. Det er på én gang både befriende enkelt og frustrerende besværligt. Du kommer sikkert ud for, at du faktisk er mest interesseret i, at tomme felter opfører sig, som om de ikke er der, i stedet for at dominere resultatet. Der er en indbygget funktion til det formål, den hedder COALESCE og bruges lidt senere i denne lektion. Andre muligheder er at se lektionen om CASE, hvor du både har mulighed for at vælge, hvad NULL skal betyde i din aktuelle forespørgsel samt, hvad andre værdier skal kategorisere som.

Se denne forespørgsel. Bemærk udtrykket, Adresse1 + ' ' + Adresse2, der simpelthen tager Adresse1 lægger et mellemrum (omkranset af apostrofer) og Adresse2 til. Dermed sammensætter du en kolonne med værdier fra andre kolonner.

SELECT
    Navn,
    Adresse1 + ' ' + Adresse2,
    Bynavn
FROM Kunde

Løsningen ser umiddelbart fin ud, men resultatet er lidt nedslående. Problemet er, at Adresse2 i flere tilfælde er tom og derfor bliver resultatet i disse rækker NULL. Som det ses her:

For fuldstændighedens skyld i denne lektion, og så du ikke efterlades uden løsning på problematikken ovenfor, giver jeg et lille kig på en indbygget tekst-funktion (se mere i den lektionen om tekst-funktioner), der løser denne opgave. Med denne forespørgsel, hvor du anvender den indbyggede funktion CONCAT, kan du lægge tekster sammen uden at blive forstyrret af tomme felter. NULL-værdier ignoreres i dette tilfælde:

SELECT
    Navn,
    CONCAT(Adresse1, ' ', Adresse2),
    Bynavn
FROM Kunde
Resultatet er ret godt, men der er i flere tilfælde et usynligt mellemrum til sidst

Det er ikke kun skidt, at beregninger med NULL altid giver NULL. Denne forespørgsel viser alle rækker, hvor Email, Telefon eller begge er NULL i Kunde-tabellen på en ret nem måde uden at skrive flere betingelser med brug af OR (se lektionen om de logiske operatorer AND og OR):

SELECT Navn, Telefon, Email
FROM Kunde
WHERE Email + Telefon IS NULL

Håndter NULL med COALESCE-funktionen

Eksemplet ovenfor med håndteringen af NULL i Adresse2-feltet kan også håndteres med den indbyggede funktion COALESCE. Denne funktion returnerer første ikke-NULL værdi fra en liste af værdier. Her er der to muligheder. Enten vises værdien fra kolonnen Adresse2, eller hvis den er NULL, vises næste værdi, som er (Tomt felt).

SELECT
    Navn,
    Adresse2,
    COALESCE(Adresse2, '(Tomt felt)')
FROM Kunde

Jeg vender tilbage til sammenkædningen af adresser igen. Eksemplet med CONCAT ovenfor har den ulempe, at der tilføjes et mellemrum til sidst, hvis Adresse2 er NULL. Det er ikke altid ønskeligt. Der findes funktioner til at håndtere dette efterfølgende. Vi kan med COALESCE også håndtere dette ganske elegant. Denne forespørgsel lægger adresserne sammen (du kan bruge CONCAT, hvis du vil). COALESCE returnerer nu enten mellemrum + Adresse2 eller tom tekst (to apostroffer uden noget i mellem er en tom tekst).

SELECT
    Navn,
    Adresse1 + COALESCE(' ' + Adresse2, ''),
    Bynavn
FROM Kunde

Eksempler på beregninger med NULL

Du har tidligere i kapitlet om Simpel SELECT set, at kommandoen altid efterfølges af FROM og navnet på en tabel – jeg beklager påstanden. Det er løgn! Du kan sagtens bruge SELECT alene til at lave beregninger direkte i Management Studio.

SELECT NULL

Resultat: NULL

SELECT 2 + 3

Resultat: 5

SELECT 2 + 3 + NULL

Resultat: NULL

SELECT 30 / 5

Resultat: 6

SELECT 30 / NULL

Resultat: NULL

SELECT 30 / 0

Resultat: Fejl division med nul (Divide by zero error encountered).

Prøv selv

  • Find alle kunder, hvor Email er tom
  • Find alle kunder, hvor Email er udfyldt
  • Find alle kunder, hvor Email og Telefon er udfyldt
  • Find rækker i Kundeemner-tabellen, hvor telefon er tom tekst eller uden værdi

Dato og tid i SQL Server

I SQL Server skriver vi dato og klokkeslæt som tekst i et fastlagt format. Men dato og klokkeslæt opfører sig ikke altid som andre tekstfelter. I denne lektion lærer du at bruge dato og klokkeslæt i en WHERE-sætning og samtidig får du kortvarigt snuset til den logiske AND-operator, da den er en del af BETWEEN-operatoren.

Eksempler på datoer:

  • 22. april 2020: ‘2020-04-22’
  • 1. februar 1946: ‘1946-02-01’
  • 29. februar 2020: ‘2020-02-29’

Ovenstående datoer alle er gyldige, men hvis du taster en ugyldig dato, som f.eks. 29. februar i 2019 (som ikke er et skudår), får du en fejl fra SQL Server:

The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
SQL Server kan ikke oversætte dato eller klokkeslæt til en gyldig værdi

Eksempler på klokkeslæt:

  • Timer, minutter ’11:05′
  • og sekunder ’11:05:25′
  • og millisekunder ’11:05:25.934′

Vi bruger 24-timers-ur:

  • Timer, minutter, sekunder ’21:14:58′

Dato og klokkeslæt på én gang adskilles af et mellemrum, 20. april 2020 kvart over syv om aftenen og nogle sekunder: ‘2020-04-20 19:15:25’ mere præcist med 354 millisekunder: ‘2020-04-20 19:15:25.354’.

Ugyldige klokkeslæt giver også samme fejl som ovenfor.

Find ordrer fra en bestemt dato

Et hurtigt kig i Ordre-tabellen giver os en kolonne med navnet Dato, som vi kan bruge til at finde rækker ud fra en bestemt dato. Find rækker, hvor ordredato er 20. april 2020.

SELECT * FROM Ordre
WHERE Dato = '2020-04-20'
Ordrer på en bestemt dato

Hvis du gerne vil se rækkerne oprettet alle andre datoer end 20. april 2020, har du sikkert gættet, at du kan anvende <> (ikke lig med):

SELECT * FROM Ordre
WHERE Dato <> '2020-04-20'
Ordrer på alle andre datoer

Sådan finder du rækker før og efter en dato

Når du fremover skal arbejde med datoer og klokkeslæt, er det ofte ud fra at ønske om at se rækker, som er oprettet før eller efter en bestemt dato. I den sammenhæng bruger du > og < til at afgøre dette.

Større end betyder, at datoen ligger efter. Læs denne sætning som: Dato er større end (altså senere end, længere ude i fremtiden end) 20. april 2020:

SELECT * FROM Ordre
WHERE Dato > '2020-04-20'
Datoer senere end findes med “større end”

Helt som forventet bruger du mindre end, til at finde værdier i fortiden: Dato er mindre end (altså tidligere end, længere tilbage i fortiden end) 20. april 2020:

SELECT * FROM Ordre
WHERE Dato < '2020-04-20'
Datoer tidligere end findes med “mindre end”

Brug ikke LIKE med dato og klokkeslæt

Det er fristende at opfatte datoer som ren tekst lagret i databasen. Men sådan er det ikke. Selv om du skriver dato og klokkeslæt i apostroffer, bliver værdien oversat og lagret som et felt af typen datetime i SQL Server.

LIKE-operatoren fungerer ikke som forventet med jokertegn på datoer.

Følgende kan altså ikke bruges til at finde Ordre oprettet i april 2020:

SELECT * FROM Ordre
WHERE Dato LIKE '2020-04-%'
LIKE sammen med datoer dur ikke, resultatet er tomt – bemærk, at det ikke er en fejl!

Der er andre måder at løse denne problemstilling på med dato- og tid-funktionerne eller BETWEEN-operator, som du kan se herunder.

Perioder kan findes med BETWEEN

Det er ganske naturligt at have et ønske om at se rækker, som har en start- og slutdato i en given periode. BETWEEN-operatoren er god at kende, da det er nemt at forstå, når du læser SQL, at dato skal ligge mellem to angivne værdier. Alternativet til at bruge BETWEEN er at sammenligne med >= og <=. Bemærk, at BETWEEN inkluderer begge datoer i resultatet.

SELECT * FROM Ordre
WHERE Dato BETWEEN '2020-04-19' AND '2020-04-21'
BETWEEN giver alle datoer i perioden, inklusive start- og slutdato

Prøv selv

  • Find ordrer oprettet før eller på 21. april 2020.
  • Find ordrer oprettet efter 21. april 2020.
  • Find ordrer oprettet før kl. 19 d. 21. april 2020.
  • Find ordrer oprettet mellem 17. april og 19. april (begge inklusive)
  • Find ordrer oprettet mellem 17. april og 20. april (begge eksklusive)
    I videoen kan du se alternative løsninger til de to sidste opgaver.

Afgrænsning med WHERE

I lektionen om Simpel SELECT kunne vi kun hente alle rækker fra en tabel. I denne lektion skal du se, hvordan du kan udvide SELECT til at begrænse resultatet til de interessante rækker.

Du tilføjer en afgrænsning af resultatet med kommandoen WHERE. SQL-sætningen kommer så til at se sådan ud:

SELECT <Kolonne1, Kolonne2, ...>
FROM Tabel
WHERE Betingelse

Altså Udvælg noget Fra et sted Hvor betingelse er opfyldt. Når betingelsen er sand for en række i tabellen, vil den komme med i udtrækket, ellers ikke.

Betingelser

En betingelse er et logisk udtryk, som resulterer i en af værdierne SAND eller FALSK.

Her er et antal betingelser taget ud af den blå luft – i parentesen står resultatet af betingelsen.

  • 1 > 2 – Ét er større end to (Falsk)
  • 2 > 1 – To er større end ét (Sand)
  • 2 = 1 + 1 – To er lig med et plus et (Sand)
  • 4 <= 4 – Fire er mindre eller lig med fire (Sand)
  • 4 < 4 – Fire er mindre end fire (Falsk)
  • 3 <> 2 – Tre er forskellig fra to (Sand)

I SQL vil vi naturligvis benytte kolonnenavne i vores logiske udtryk. Værdier behøver ikke være tal, det kan også være tekst. Tekst skal skrives omkranset af apostroffer (enkelt-anførselstegn). Eksempler:

  • ‘Hans’ = ‘Grethe’ – teksterne Hans og Grethe er ens (Falsk)
  • ‘Hans’ > ‘Grethe’ – ordet Hans kommer efter Grethe i alfabetet (Sand)

Der er flere muligheder, hvilket vi kommer ind på i senere lektioner.

Videoen til denne lektion lidt ekstra tips undervejs

Find en kunde ud fra navn

Lad os kigge i Kunde-tabellen igen. Vi vil gerne finde ud af, hvilken by kunden Min Bix ligger i. Vi udvælger altså Navn og Bynavn fra Kunde-tabellen og kræver, at Navn er lig med Min Bix:

SELECT Navn, Bynavn
FROM Kunde
WHERE Navn = 'Min Bix'
Det viser sig, at Min Bix ligger i Hellerup

Find alle kunder efter K i alfabetet

Vælg alt fra Kunde-tabellen, hvor navnet kommer efter K i alfabetet ved at afgrænse på Navn-kolonnen og kræve, at den er større end K.

SELECT *
FROM Kunde
WHERE Navn >'K'
Bemærk navnene. ‘Kagen’ er større end ‘K’, da ‘Kagen’ skal sorteres efter ‘K’

Find varer ud fra pris

Tal er jo oplaget at sammenligne på. Her er en række eksempler på at finde varer ud fra prisen i Vare-tabellen.

Find den eller de varer, der koster 7 kr.:

SELECT * FROM Vare
WHERE Pris = 7

Find dem, der koster 7 kr. eller mere:

SELECT * FROM Vare
WHERE Pris >= 7

Find dem, der koster 7 kr. eller mindre:

SELECT * FROM Vare
WHERE Pris <= 7

Find dem, der koster alt andet end 7 kr.:

SELECT * FROM Vare
WHERE Pris <> 7

Find den vare, der koster 2,50 kr.:

Bemærk, at decimaltal skal skrives i amerikansk notation (punktum i stedet for komma), selv om beløbet faktisk vises med komma i tabellen.

SELECT * FROM Vare
WHERE Pris = 2.5

Prøv selv

  • Kolonnen, som du afgrænser på, behøver ikke være med i resultatet. Prøv at finde telefonnummer på Liselottes Garn.
  • Find navn og email på kunden med telefonnummer 79441566.
  • Skrev du ‘ ‘ omkring telefonnummeret? Prøv samme SQL både med og uden ‘ ‘. SQL Server forsøger at konvertere værdien til kolonnens datatype, og telefonnummeret kan nemt oversættes til tekst.
  • I tabellen Ordrestatus kan du finde kolonnen Statusbetegnelse, som indeholder teksten til en given id. Hvad teksten til id=3 og id=5?
  • Kan man sammenligne to kolonner? Find alle kunder, hvor navnet kommer efter byen i alfabetet.
  • Find varerne, der koster 4,60 kr. og derunder.

Simpel SELECT

Den mest grundlæggende kommando i SQL-sproget er SELECT FROM, og den gælder for alle varianter af SQL. I Microsoft SQL Server kaldes SQL-varianten for Transact-SQL eller bare T-SQL. Navnet henviser til muligheden for at afvikle forespørgsler som transaktioner (det er et emne til senere). SELECT-kommandoen er både meget simpel og uhyggelig avanceret.

I denne lektion starter jeg med det helt enkle, hvor du skal hente data ud fra en enkelt tabel. De kommende mange lektioner vil bruge SELECT FROM i mange afskygninger.

Navnet på kommandoen fortæller, hvad den laver – SELECT = Udvælg og FROM = Fra – altså udvælg noget fra et sted.

Noget er kolonner i tabellen, og sted er tabellen med kolonnerne.

Sådan skrives den simpleste udgave af kommandoen:

SELECT <kolonne1, kolonne2, …>  FROM <tabel>

Bemærk: Jeg skriver SQL-kommandoer med store bogstaver og deler dem ofte over flere linjer evt. med indrykning. SQL-sproget har intet krav til store og små bogstaver, linjedeling eller indrykning. Du kan sagtens springe over, hvor gærdet er lavest og indtaste det hele på én linje med små bogstaver.

Videoen viser indholdet fra denne lektion

Sådan skriver du en forespørgsel i Management Studio

SQLKursus.dk bruger Microsoft SQL Server Management Studio (kaldes også bare for SSMS) hele vejen igennem. SSMS giver adgang til databasen og mulighed for at skrive, gemme og udføre SQL-sætninger og endvidere håndtere opbygning af databasen, tilpasse indstillinger og udføre diveres administrative opgaver, som backup og oprydning. Du har installeret SSMS sammen med klargøring af testmiljø.Start SQL Server Management Studio

  1. Forbind til serveren med din kursusdatabase.
  2. Udfold Databases
  3. Højreklik på SQLKursus
  4. Vælg New Query

Bemærk, at databasens navn (SQLKursus) skal være synlig i dropdown-listen øverst til venstre. Der står navnet på den aktuelle database altid. Hvis du ikke eksplicit vælger en database, vil der som regel stå Master, som er navnet på en systemdatabase. Forespørgslerne er tiltænkt SQLKursus-databasen og fungerer ikke i Master-databasen.

Bemærk, at den rigtige database skal være valgt

Se værdier fra en kolonne

Det enkleste er nok at bede SQL om at give os alle værdier fra en enkelt kolonne. Denne forespørgsel viser alle værdier fra Navn-kolonnen i Kunde-tabellen:

SELECT Navn FROM Kunde

Indtast (eller tag en kopi her fra websitet) forespørgslen i et nyt forespørgselsvindue.

Kør forespørgsel ved at trykke på Execute-knappen (genvejstast F5)

Resultatet er (forkortet – se hele resultatet i videoen, eller når du selv forsøger):

Resultatet fra valg af en kolonne

Se værdier fra to eller flere kolonner

Flere kolonner kan vises samtidig. Kolonnernes navne skal adskilles af et komma.

SELECT
Navn,
Bynavn
FROM Kunde

Bemærk, at jeg har skrevet kolonnerne på en linje hver sig. Det er ikke nødvendigt, men øger ofte overskueligheden. Nedenstående er fuldstændig det samme:

SELECT Navn, Bynavn FROM Kunde

Resultatet er følgende (igen forkortet):

Resultatet efter valg af to kolonner

Vis alle kolonner med *

Ganske ofte er der brug for at se alle kolonner i hele resultatet. Eller også er du bare doven i øjeblikket og vil ikke skrive navnene på de kolonner, du skal bruge.

SELECT * FROM Kunde 

Giver dette resultat:

Alle kolonner vises med *

Prøv selv

  • Tilføj kolonnerne Telefon og Email, kør forespørgslen og se de nye værdier.
  • Byt rundt på rækkefølgen af kolonnerne, kør forespørgslen og bemærk, at rækkefølgen afspejles i resultatet.
  • Tilføj * som en kolonne, altså hav både * og kolonnenavne adskilt med komma. Se, at alle kolonner vises fordi * er med og endvidere vises de kolonner, du har skrevet navnet på.
  • Prøv evt. også at have * med flere gange.

Klargør testmiljø

SQL Kursus er lavet med fokus på Microsoft SQL Server. Hvis du ikke har adgang til en Microsoft SQL Server til brug for dette kursus, kan du hente en gratis version hos Microsoft. Versionen hedder Microsoft SQL Server Express. Det er en fuld funktionsdygtig databaseserver med nogle få begrænsninger. Det er tilladt at bruge SQL Server Express i et produktionsmiljø, dog skal du være opmærksom på, at databasen ikke kan overstige 10 GB. Til vores undervisningsformål er den størrelse intet problem.

I denne artikel viser jeg dig, hvordan du får SQL Server Express op at køre og installerer Management Studio, som vi bruger til at skrive SQL-sætninger i. Til sidst indlæser du en backup af undervisningsdatabasen. Nu er du køreklar!

  • Første trin er at hente og installere serverprogrammet fra Microsoft.
  • Andet trin er at hente og installere SQL Server Management Studio.
  • Tredje trin er at forbinde til din Microsoft SQL Server Express og konstatere, at den kører.
  • Fjerde trin er at indlæse en backup af undervisningsdatabasen.
Videoen viser hele processen, som du kan læse om i detaljer herunder.

Hent og installer Microsoft SQL Server Express

  1. Find downloadsitet hos Microsoft. I skrivende stund (april 2020) er denne adresse gyldig: https://www.microsoft.com/en-us/sql-server/sql-server-downloads (åbner i ny fane) – hvis den adresse ikke længere fungerer, må du ty til internettets søgemaskiner og søge efter ”Download Microsoft SQL Server Express”.
  2. Vælg Basic-installation. Du får sikkert en besked om, at dansk ikke er understøttet som sprog. Jeg bruger den engelske version her i SQL Kursus. Svar Yes til at installere på engelsk.
  3. Accepter licensbetingelserne.
  4. Accepter installationsmappe eller vælg en anden, og gennemfør installationen.
  5. Bemærk oversigtsbilledet til sidst, her står navnet på din instans: SQLEXPRESS og hvem der kan administrere databasen – i mit tilfælde er det brugeren X på X-PC.
  6. Lad vinduet stå åbent, og gå til næste step for at installere SSMS.

Hent og installer SQL Server Management Studio (SSMS)

  1. Til sidst i installationen af SQL Server Express er der en knap til at hente Management Studio (SSMS), brug den gerne. Ellers skal du et smut forbi Microsofts hjemmeside for at hente programmet. SSMS er gratis, også til professionelt brug. Denne adresse virker nu (april 2020), https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms (åbner i ny fane) – hvis den ikke virker, når du forsøger, må du søge efter ”SQL Server Management Studio” på internettet.
  2. Installer programmet efter download, vælg installationsmappe, accepter betingelser m.m.
  3. Efter installation er du klar til at bruge det.

Forbind til databaseserver med Management Studio

  1. Start Management Studio.
  2. Det først, du skal tage stilling til er, hvilken database du vil forbinde til. Vælg her (hvis det ikke allerede er valgt) <dit computernavn>/SQLEXPRESS. Authentication skal være Windows Authentication.
  3. Klik på Connect.
  4. I venstre side skal du se dit databaseserverens navn (som i trin 2 ovenfor), der skal være et grønt symbol ved navnet for at vise, at databaseserveren kører.

Indlæs backup af kursusdatabasen

Bemærk, at denne process forudsætter, at du ikke har en SQLKursus-database i forvejen. Hvis du vil genindlæse backuppen for at starte på en frisk, skal du slette den eksisterende database først.

  1. Hent SQLKursus.bak fra denne side (åbner i ny fane). Hvis du henter ZIP-filen, skal du huske at pakke den ud, før du fortsætter.
  2. Flyt SQLKursus.bak til mappen, hvor SQL Server forventer at finde sine backupfiler. Det er som regel i mappen (bemærk MSSQL15.SQLEXPRESS – hvis du har en anden version, vil mappen hedde noget andet!):
    C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS\MSSQL\Backup
  3. Du skal sikkert acceptere administratoradgang for at tilgå mappen.
  4. I Management Studio skal du højreklikke på Databases og vælge Restore Database.
  5. Klik Device.
  6. Klik på …-symbolet.
  7. Der vises en dialogboks, hvor du skal vælge mediet. Sørg for, at der står File i Backup Media Type, og tryk på Add.
  8. Du skal nu udpege den SQLKursus.bak-fil, du har hentet. Tryk OK.
  9. Du har nu valgt et backupmedie. Klik OK.
  10. Klik OK for at indlæse backup.

Du er nu klar til næste artikel, hvor du opretter din første forespørgsel.