Søger du en specifik kategori?

 



Oprettet tir. d. 16. februar 2010 kl. 02:17

arne_v
arne_v (1.005.403 point)
Guidens karaktér
1
2
3
4
5

Introduktion til SQL queries

Denne artikel beskriver nogle forskellige muligheder i SQL queries. Eksemplerne skulle gerne være standard SQL og virke i alle databaser. Den forudsætter kun minimalt kendskab til databaser og SQL og er klart for begyndere.
Historie:
V1.0 - 18/08/2004 - original
V1.1 - 16/02/2010 - smårettelser

Introduktion

Q'et i SQL står for query (forespørgsel) og queries er da også en
meget stor del af SQL sproget.

INSERT, UPDATE og DELETE statements er næsten altid ret simple, men
SELECT statements kan blive meget komplekse.

Denne artikel vil gennemgå nogle af de gængse teknikker i queries.

Syntax

En SELECT statement består af følgende dele:

SELECT select liste
FROM tabel liste
[WHERE condition]
[GROUP BY group by liste]
[HAVING condition]
[ORDER BY order by liste]

De med [] markerede dele er optional.

Eksempel data

Alle eksemplerne vil bruge føgende simple data sæt:

medarbejder tabellen

id  navn                stilling        maanedsloen chef
1  Niels Nielsen      IT medarbejder  25000      3
2  Hans Hansen        IT medarbejder  30000      3
3  Jens Jensen        IT chef        37500
4  Anders Andersen    IT medarbejder  27500      3
5  Rasmus Rasmussen    IT trainee      22500      3


stilling tabellen

titel          overenskomst
IT chef        AC
IT medarbejder  HK


SQL sætninger til at create databasen med:

CREATE TABLE medarbejder (
  id INTEGER,
  navn VARCHAR(50),
  stilling VARCHAR(50),
  maanedsloen INTEGER,
  chef INTEGER,
  PRIMARY KEY (id)
);

INSERT INTO medarbejder VALUES (1,'Niels Nielsen','IT medarbejder',25000,3);
INSERT INTO medarbejder VALUES (2,'Hans Hansen','IT medarbejder',30000,3);
INSERT INTO medarbejder VALUES (3,'Jens Jensen','IT chef',37500,NULL);
INSERT INTO medarbejder VALUES (4,'Anders Andersen','IT medarbejder',27500,3);
INSERT INTO medarbejder VALUES (5,'Rasmus Rasmussen','IT trainee',22500,3);

CREATE TABLE stilling (
  titel VARCHAR(50),
  overenskomst VARCHAR(50),
  PRIMARY KEY (titel)
);

INSERT INTO stilling VALUES ('IT medarbejder','HK');
INSERT INTO stilling VALUES ('IT chef','AC');


Vælge kolonner

Du vælger hvilke kolonner der skal vises ved at angive dem i select listen. En * betyder
alle felter.


SELECT *
FROM stilling;


titel          overenskomst
IT chef        AC
IT medarbejder  HK



SELECT overenskomst
FROM stilling;


overenskomst
AC
HK



SELECT navn,stilling
FROM medarbejder;


navn                stilling
Niels Nielsen      IT medarbejder
Hans Hansen        IT medarbejder
Jens Jensen        IT chef
Anders Andersen    IT medarbejder
Rasmus Rasmussen    IT trainee


Vælge rækker

Du vælger hvilke rækker der skal vises ved at angive en WHERE
betingelse.

Du kan bruge normale udtryk (=, <>, <, >, <=, >=, AND, OR, NOT) og en
speciel operator LIKE som sammenligner med wildcards (SQL bruger % som wildcard).


SELECT id, navn
FROM medarbejder
WHERE navn='Anders Andersen';


id  navn
4  Anders Andersen



SELECT id, navn
FROM medarbejder
WHERE maanedsloen > 25000;


id  navn
2  Hans Hansen
3  Jens Jensen
4  Anders Andersen´



SELECT id, navn
FROM medarbejder
WHERE maanedsloen > 25000 AND stilling <> 'IT chef';


id  navn
2  Hans Hansen
4  Anders Andersen



SELECT id, navn
FROM medarbejder
WHERE navn LIKE '%sen';


id  navn
1  Niels Nielsen
2  Hans Hansen
3  Jens Jensen
4  Anders Andersen
5  Rasmus Rasmussen


Vigtigt: feltnavn=NULL vil altid returnere false også selvom værdien er
NULL. Man skal bruge feltnavn IS NULL.

Sortere output

Du sorterer de viste rækker med en ORDER BY på det felt der skal
sorteres efter. Man kan tilføje ASC eller DESC for an angive
stigende eller faldende sortering (default er stigende).


SELECT navn,maanedsloen
FROM medarbejder
ORDER BY maanedsloen;


navn                maanedsloen
Rasmus Rasmussen    22500
Niels Nielsen      25000
Anders Andersen    27500
Hans Hansen        30000
Jens Jensen        37500



SELECT navn,maanedsloen
FROM medarbejder
ORDER BY maanedsloen DESC;


navn                maanedsloen
Jens Jensen        37500
Hans Hansen        30000
Anders Andersen    27500
Niels Nielsen      25000
Rasmus Rasmussen    22500


Data fra flere tabeller

Du kan hente data fra flere tabeller. Det hedder i SQL sproget at joine
tabeller.

Du kan lave forskellige slags joins. En inner join hvor der skal være
en række i begge tabeller. En left outer join hvor der skal være
en række i tabellen til venstre. En right outer join hvor der skal
være en række i tabellen til højre.

Inner join med WHERE (den gamle måde):

SELECT medarbejder.navn,stilling.overenskomst
FROM medarbejder,stilling
WHERE medarbejder.stilling=stilling.titel;


navn                overenskomst
Niels Nielsen      HK
Hans Hansen        HK
Jens Jensen        AC
Anders Andersen    HK


Inner join med JOIN (den nye måde):

SELECT medarbejder.navn,stilling.overenskomst
FROM medarbejder INNER JOIN stilling ON medarbejder.stilling=stilling.titel;


navn                overenskomst
Niels Nielsen      HK
Hans Hansen        HK
Jens Jensen        AC
Anders Andersen    HK


Left join:

SELECT medarbejder.navn,stilling.overenskomst
FROM medarbejder LEFT JOIN stilling ON medarbejder.stilling=stilling.titel;


navn                overenskomst
Niels Nielsen      HK
Hans Hansen        HK
Jens Jensen        AC
Anders Andersen    HK
Rasmus Rasmussen


(bemærk at med mange tabeller så bruger man tabelnavn.feltnavn til at angive felter med)

Appende en query til en anden query

Man kan stable query resultater oven på hinanden med UNION.


(SELECT navn,stilling FROM medarbejder)
UNION
(SELECT navn,'fastansat' FROM medarbejder)


navn                stilling
Niels Nielsen      IT medarbejder
Hans Hansen        IT medarbejder
Jens Jensen        IT chef
Anders Andersen    IT medarbejder
Rasmus Rasmussen    IT trainee
Niels Nielsen      fastansat
Hans Hansen        fastansat
Jens Jensen        fastansat
Anders Andersen    fastansat
Rasmus Rasmussen    fastansat


(bemærk at man godt kan angive et beregnet udtryk i select listen)

Aggregerende funktioner og gruppering

Standard SQL har indbygget funktioner til at udregne minimum (MIN),
maximum (MAX), antal (COUNT) og gennemsnit (AVG) for grupper.


SELECT COUNT(*) AS antal
FROM medarbejder;


antal
5



SELECT stilling,COUNT(*) AS antal,AVG(maanedsloen) AS gennemsnitsloen
FROM medarbejder
GROUP BY stilling;


stilling        antal  gennemsnitsloen
IT chef        1      37500
IT medarbejder  3      27500
IT trainee      1      22500


Bemærk at alle felter i select listen som ikke er aggregerende
funktioner skal optræde i GROUP BY listen.

(bemærk endvidere at man kan give beregnede udtryk i select listen et felt navn)

Self join

Du kan godt riskikere at få brug for at joine en tabel med sig selv. Det kalder
man for en self join.


SELECT m1.navn,m2.navn AS chef
FROM medarbejder AS m1,medarbejder AS m2
WHERE m1.chef=m2.id;


navn                chef
Niels Nielsen      Jens Jensen
Hans Hansen        Jens Jensen
Anders Andersen    Jens Jensen
Rasmus Rasmussen    Jens Jensen


(bemærk at ligesom med felter i select listen kan man også give tabeller andre navnw)

Subqueries

Man har mulighed for at neste queries.

Nestet løsning som virker i de fleste databaser:

SELECT navn
FROM medarbejder
WHERE stilling IN (SELECT titel FROM stilling WHERE overenskomst='HK');


navn
Niels Nielsen
Hans Hansen
Anders Andersen


Workaround med join som kan bruges i bl.a. MySQL 3.x og 4.0.x:

SELECT medarbejder.navn
FROM medarbejder,stilling
WHERE medarbejder.stilling=stilling.titel AND stilling.overenskomst='HK';


navn
Niels Nielsen
Hans Hansen
Anders Andersen


Videre

Det stærke ved SQL er at man kan kombinere alle elementerne i en SELECT statement.

Så i virkelighedens verden vil du ofte skulle kombinere mange af de teknikker
som er gennemgået her.

God SELECT lyst.

Skrevet ons. d. 18. august 2004 kl. 18:00| #1

a1 (51.182 point)
hvis man er helt blank i SQL så er den en god start. du forklarer godt hvad Q'et står for, men ikke S & L, sql = structured query language. Der kunne også godt være lidt mere "kød" på, f.eks. kan en join i de fleste databaser laves alá: "SELECT m.navn, s.stilling FROM mederbejder m INNER JOIN stilling s ON m.fk_stillingID=s.ID" (jeg præfikser altid mine fremmednøgler (foreignkeys) med fk_, man kan jo så også diskutere om det ikke er bedre (hurtigere) at joine på et tal (INTEGER) eller en tekststregn, specielt når det enda er en VARCHAR). ;o)

Skrevet fre. d. 20. august 2004 kl. 22:18| #2

bak (94.640 point)
Fin artikel, lav du bare en opfølger :-)

Skrevet lør. d. 21. august 2004 kl. 09:37| #3

weaponx (17.275 point)
Fin artikel. Det ville være rart hvis den også medtog INSERT og ALTER

Skrevet fre. d. 27. august 2004 kl. 19:49| #4


Skrevet tir. d. 05. oktober 2004 kl. 14:49| #5


Skrevet man. d. 18. oktober 2004 kl. 12:03| #6


Skrevet fre. d. 17. december 2004 kl. 17:12| #7

ohmygod (13.410 point)
Flot =)

Skrevet man. d. 27. december 2004 kl. 14:41| #8

skizo_someone (12.980 point)
utrolig lærerig og velskrevet artikel

Skrevet man. d. 31. januar 2005 kl. 09:02| #9

steenolsen1 (15.120 point)
Rigtig god oversigt! Den er printet ud og ligger som "opslagsværk" :-)

Skrevet ons. d. 02. marts 2005 kl. 21:18| #10

jakobgt (18.346 point)
Ganske udmærket. Jeg søgte en simpel forklaring på joins, og det må jeg sige den giver.

Skrevet lør. d. 07. maj 2005 kl. 16:40| #11

Rigtig god artikel, den gennemgår alle de basale og lettere avancerede "funktioner" i MySQL

Skrevet tir. d. 11. oktober 2005 kl. 15:00| #12

Den giver svar på mange ting, har printet den ud til hjælp :-)

Skrevet fre. d. 15. februar 2008 kl. 21:36| #13


Skriv en kommentar



Mest populære guides

Guidens karakter
!!!Karaktér: 3
12 stemmer
31/01 - 2011
Af: heinzdmx

Dropbox - gratis online lagerplads

Jeg vil i denne guide forklare lidt om hvad Dropbox er og også hvordan du får mest mulig plads på Dropbox. Dropbox er kort sagt en service hvor du har dine data lagt til backup på både nettet og din egen computer.
Guidens karakter
!!!Karaktér: 4
33 stemmer
02/02 - 2009
Af: jkrons

Dato- og tidsberegninger i Excel

En introduktion til simple beregninger med dato og tid i Excel. Opdateret med afsnit om beregning af tillæg.
Excel  |  Læs »
Guidens karakter
!!!Karaktér: 4
21 stemmer
06/11 - 2011
Af: fromsej

Sådan fjerner du virus og malware

Udviklingen går stærkt på "skidt"fronten, så vi har sammensat en ny og effektiv programpakke til fjernelse af det.
Virus  |  Læs »

Log ind

   

   

Seneste guides

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Gør dig selv en tjeneste: Køb et ordentligt SD-kort

Der kan være meget stor hastighedsforskel på to umiddelbare ens SD-kort. Se her hvad du skal være opmærksom på, når du køber ekstra hukommelse til din mobil, tablet eller kamera.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Gratis flysimulator fra Microsoft

Den legendariske Flight Simulator fra Microsoft genopstår den 29. februar - og denne gang er spillet gratis.


Nyheder fra Computerworld

Teaser billede

Bank: Derfor er login uden NemID helt i orden

Der er ikke hold i påstanden om sikkerhedsproblemer i forbindelse med bankkunders login uden brug af NemID, lyder det fra Nykredit Bank.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger