SlideShare a Scribd company logo
1 of 31
Databaser
UMB 23/09 2013
Per Bisseberg
Databasestruktur
 Atomære verdier
 Verdinødvendighet
 Unikhet
 Sorterte data
 Pekere
 Kobling av datasett
Atomære verdier
 Sammensatt
 Repeterende
 Sammensatt og repeterende
Avdkode Avdnavn Etasje_og_areal
1 Ost 3 / 100
Avdkode Avdnavn Etasjenr Areal
17 Administrasjon 3, 5 600
Avdkode Avdnavn Etasje_og_areal
17 Administrasjon 3/400, 5 /200
Verdinødvendighet
 Er det nødvendig å fylle ut alle verdier?
◦ NOT NULL
avdkode avdnavn etasjenr areal
3 Sko 4
2 Kjøkken 57 900
Unikhet
 Ingen krav, verdiene kan
være like
 Unik, men kan inneholde “for
mange kolonner”
 Verdiene må være
forskjellige (unike)
 En utvalgt blant evt. flere
kol. Som er unike
Kandidatnøkkel
Primærnøkkel
Supernøkkel
Sortering og pekere
 Vi vil ikke ha sorterte data
◦ Vi vil kunne sortere data uavhengig av
databasestruktur
◦ Dataene er uansett det samme om de er
sortert eller ikke
 Relasjonsdatabaser benytter ikke pekere
Kobling av datasett
 Fremmednøkkel(FK)
◦ FK benyttes til å peke til et element i et annet
datasett ved sammenkobling av flere sett med
data.
◦ FK skjer på identisk/lik verdi i form av en
Primærnøkkel(PK) i det tilkoblete datasett.
Kobling av datasett
Ansattnr Fnavn Enavn Adresse Telefonnr Avdkode* Lønn
1000 Anders Andersen Aveien 1 12345678 3 250000
1001 Bernt Bertsen Bveien 1 234567890
1002 Cesar Cesarsen Cveien 1 345678901 1 300000
1003 David Davidsen Dveien 1 456789012 1 400000
9834 Edgar Edgarsen Eveien 1 567890123 14 250000
Avdkode Avdnavn Etasjenr Areal
1 Ost 4 100
14 Hvite potteplanter 5 1000
3 Sko 4
2 Kjøkken 57 900
5 Røde potteplanter 1 50
Integritetsregler
 entitetsintegritet
 referanseintegritet
Entitetsintegritet
 Primærnøkkel(PK)
◦ Krav:
 Not NULL
 alle verdier av det valgte kolonne/kombinasjon må
være unik.
 ingen del av felt/kombinasjon kan være NULL.
◦ Formål:
 alle forekomster (entiteter = "ting") skal kunne
identifiseres og ha mening.
 Hvis ansattnr brukes for å identifisere, vil vi ikke tillate
like ansattnr, heller ikke at ansattnr er "ukjent".
Referanseintegritet
 Fremmednøkkel(FK)
◦ Hvis to tabeller er sammensatt i et
Primærnøkkel - Fremmednøkkel-forhold, må
alle verdier av fremmed-nøkkelen
◦ enten: "matche med" en verdi i
primærnøkkelen
◦ eller: helt ut være NULL (udefinert, finnes ikke)
◦ NB! Gjelder også sammensatt Primærnøkkel
CREATE TABLE
Sammensatt Primærnøkkel
 CREATE TABLE kunde (
landskode varchar(2) not null,
kundenr integer not null,
kundenavn varchar(20) not null,
kundeadresse varchar(50),
PRIMARY KEY (landskode,kundenr)
);
Fremmednøkkel - Enklest mulig
(anbefales ikke):
 CREATE TABLE ordre (
ordrenr integer not null,
ordredato date,
kundenr integer not null FOREIGN KEY
REFERENCES kunde(kundenr),
kontaktperson varchar(30),
PRIMARY KEY (ordrenr)
);
Fremmednøkkeldelen til slutt
(nødvendig ved sammensatt PK):
 CREATE TABLE ordre (
ordrenr int not null,
ordredato date,
kundenr int not null,
landskode varchar(2),
kontaktperson varchar(30),
PRIMARY KEY (ordrenr, kundenr),
FOREIGN KEY (landskode, kundenr)
REFERENCES kunde(landskode,kundenr)
);
Fremmednøkkeldelen som egen
setning (anbefales)
 CREATE TABLE ordre (
ordrenr int not null,
ordredato date,
kundenr int not null,
kontaktperson varchar(30),
primary key (ordrenr)
);
 ALTER TABLE ordre
ADD CONSTRAINT kunde_fk
FOREIGN KEY (kundenr)
REFERENCES kunde (kundenr);
Metoder for sikring av
referanseintegritet
 ON DELETE
 ON UPDATE
◦ SET NULL
◦ CASCADE
 Syntax eks
◦ ALTER TABLE ordre
ADD CONSTRAINT kunde_fk
FOREIGN KEY (kundenr)
REFERENCES kunde (kundenr)
◦ ON DELETE CASCADE;
ON DELETE
 Utføres når den refererte verdi slettes.
◦ CASCADE vil slette den refererende rad
◦ SET NULL vil sette en null verdi i refererende
attributt
A_id A_verdi
101 100000
102 50000
TABELL A TABELL B
B_id B_verdi A_id*
B1 25 101
B2 12 102
ON DELETE CASCADE
A_id A_verdi
101 SLETTES 100000
102 50000
TABELL A
TABELL B
B_id B_verdi A_id
B2 12 102
ON DELETE SET NULL
A_id A_verdi
101 SLETTES 100000
102 50000
TABELL A
TABELL B
B_id B_verdi A_id
B1 25 NULL
B2 12 102
ON UPDATE CASCADE
A_id A_verdi
101 ny verdi = 1001 100000
102 50000
TABELL A
TABELL B
B_id B_verdi A_id
B1 25 1001
B2 12 102
ON UPDATE SET NULL
A_id A_verdi
101 ny verdi = 1001 100000
102 50000
TABELL A
TABELL B
B_id B_verdi A_id
B1 25 NULL
B2 12 102
Aggregering
Aggregeringsfunksjoner
 SQL kan også brukes til å telle opp
(count), summere (sum), finne
maksimum og minimum (max, min),
gjennomsnitt (avg) m.m.
 Vi kan benytte aggregeringsfunksjoner på
hele datasett eller på grupper av data i
settet
Aggregeringsfunksjoner
 SELECT COUNT(*) FROM kunde;
◦ Returnerer antall rader i kunde entiteten
 SELECT AVG(omsetning) FROM kunde
WHERE omsetning > 2000000;
◦ Returnerer gjennomsnitt av omsetning for
kunder med omsetning over 2000000
 SELECT MAX(omsetning) FROM kunde;
◦ Returnerer høyeste omsetning i kunde
entiteten.
Gruppering
 Om vi vil begrense datasettet til et mindre
utvalg kan vi gruppere.
 SELECT gruppekode, SUM(omsetning) FROM
kunde GROUP BY gruppekode;
◦ Returnerer summen av total omsetning for de
individuelle gruppekodene
 SELECT COUNT(*) FROM STUDENT
GROUP BY hjemsteds_kommune;
◦ Returnerer antall studenter representert fra de
individuelle hjemstedskommunene
ALL/ANY
 ALL og ANY brukes på resultatet av en
delspørring.
◦ ALL er sann hvis alle i delspørringen oppfyller
kriteriet. Usant hvis delspørringen er tom.
◦ ANY er sann hvis noen (en eller flere) oppfyller
kravet. Sant hvis delspørringen er tom. SOME
er ekvivalent med ANY.
ALL/ANY
 SELECT * FROM kunde
WHERE kundenr >= ALL (SELECT kundenr
FROM kunde);
 er det samme som
 Select * FROM kunde
WHERE kundenr >= (SELECT
MAX(kundenr) FROM kunde);
ALL/ANY
 SELECT * FROM kunde
WHERE kundenr <= ALL (SELECT kundenr
FROM kunde);
 er det samme som
 SELECT * FROM kunde
WHERE kundenr <= (select min(kundenr)
FROM kunde);
ALL/ANY
 SELECT * FROM kunde
WHERE kundenr > ANY (SELECT kundenr
FROM kunde);
 er det samme som
 SELECT * FROM kunde WHERE kundenr >
(SELECT MIN(kundenr) FROM kunde);
ALL/ANY
 Litt vanskeligere spørringer, men her ser
vi virkelig nytten av ALL/ANY
 SELECT gruppekode FROM kunde
GROUP BY gruppekode
HAVING AVG(omsetning)
>=
ALL (SELECT AVG(omsetning)
FROM kunde
GROUP BY gruppekode);

More Related Content

Featured

PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024Neil Kimberley
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)contently
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024Albert Qian
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsKurio // The Social Media Age(ncy)
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Search Engine Journal
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summarySpeakerHub
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next Tessa Mero
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentLily Ray
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best PracticesVit Horky
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project managementMindGenius
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...RachelPearson36
 
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Applitools
 
12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at WorkGetSmarter
 
Ride the Storm: Navigating Through Unstable Periods / Katerina Rudko (Belka G...
Ride the Storm: Navigating Through Unstable Periods / Katerina Rudko (Belka G...Ride the Storm: Navigating Through Unstable Periods / Katerina Rudko (Belka G...
Ride the Storm: Navigating Through Unstable Periods / Katerina Rudko (Belka G...DevGAMM Conference
 
Barbie - Brand Strategy Presentation
Barbie - Brand Strategy PresentationBarbie - Brand Strategy Presentation
Barbie - Brand Strategy PresentationErica Santiago
 

Featured (20)

PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
 
12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work
 
ChatGPT webinar slides
ChatGPT webinar slidesChatGPT webinar slides
ChatGPT webinar slides
 
More than Just Lines on a Map: Best Practices for U.S Bike Routes
More than Just Lines on a Map: Best Practices for U.S Bike RoutesMore than Just Lines on a Map: Best Practices for U.S Bike Routes
More than Just Lines on a Map: Best Practices for U.S Bike Routes
 
Ride the Storm: Navigating Through Unstable Periods / Katerina Rudko (Belka G...
Ride the Storm: Navigating Through Unstable Periods / Katerina Rudko (Belka G...Ride the Storm: Navigating Through Unstable Periods / Katerina Rudko (Belka G...
Ride the Storm: Navigating Through Unstable Periods / Katerina Rudko (Belka G...
 
Barbie - Brand Strategy Presentation
Barbie - Brand Strategy PresentationBarbie - Brand Strategy Presentation
Barbie - Brand Strategy Presentation
 

database tull

  • 2. Databasestruktur  Atomære verdier  Verdinødvendighet  Unikhet  Sorterte data  Pekere  Kobling av datasett
  • 3. Atomære verdier  Sammensatt  Repeterende  Sammensatt og repeterende Avdkode Avdnavn Etasje_og_areal 1 Ost 3 / 100 Avdkode Avdnavn Etasjenr Areal 17 Administrasjon 3, 5 600 Avdkode Avdnavn Etasje_og_areal 17 Administrasjon 3/400, 5 /200
  • 4. Verdinødvendighet  Er det nødvendig å fylle ut alle verdier? ◦ NOT NULL avdkode avdnavn etasjenr areal 3 Sko 4 2 Kjøkken 57 900
  • 5. Unikhet  Ingen krav, verdiene kan være like  Unik, men kan inneholde “for mange kolonner”  Verdiene må være forskjellige (unike)  En utvalgt blant evt. flere kol. Som er unike Kandidatnøkkel Primærnøkkel Supernøkkel
  • 6. Sortering og pekere  Vi vil ikke ha sorterte data ◦ Vi vil kunne sortere data uavhengig av databasestruktur ◦ Dataene er uansett det samme om de er sortert eller ikke  Relasjonsdatabaser benytter ikke pekere
  • 7. Kobling av datasett  Fremmednøkkel(FK) ◦ FK benyttes til å peke til et element i et annet datasett ved sammenkobling av flere sett med data. ◦ FK skjer på identisk/lik verdi i form av en Primærnøkkel(PK) i det tilkoblete datasett.
  • 8. Kobling av datasett Ansattnr Fnavn Enavn Adresse Telefonnr Avdkode* Lønn 1000 Anders Andersen Aveien 1 12345678 3 250000 1001 Bernt Bertsen Bveien 1 234567890 1002 Cesar Cesarsen Cveien 1 345678901 1 300000 1003 David Davidsen Dveien 1 456789012 1 400000 9834 Edgar Edgarsen Eveien 1 567890123 14 250000 Avdkode Avdnavn Etasjenr Areal 1 Ost 4 100 14 Hvite potteplanter 5 1000 3 Sko 4 2 Kjøkken 57 900 5 Røde potteplanter 1 50
  • 10. Entitetsintegritet  Primærnøkkel(PK) ◦ Krav:  Not NULL  alle verdier av det valgte kolonne/kombinasjon må være unik.  ingen del av felt/kombinasjon kan være NULL. ◦ Formål:  alle forekomster (entiteter = "ting") skal kunne identifiseres og ha mening.  Hvis ansattnr brukes for å identifisere, vil vi ikke tillate like ansattnr, heller ikke at ansattnr er "ukjent".
  • 11. Referanseintegritet  Fremmednøkkel(FK) ◦ Hvis to tabeller er sammensatt i et Primærnøkkel - Fremmednøkkel-forhold, må alle verdier av fremmed-nøkkelen ◦ enten: "matche med" en verdi i primærnøkkelen ◦ eller: helt ut være NULL (udefinert, finnes ikke) ◦ NB! Gjelder også sammensatt Primærnøkkel
  • 13. Sammensatt Primærnøkkel  CREATE TABLE kunde ( landskode varchar(2) not null, kundenr integer not null, kundenavn varchar(20) not null, kundeadresse varchar(50), PRIMARY KEY (landskode,kundenr) );
  • 14. Fremmednøkkel - Enklest mulig (anbefales ikke):  CREATE TABLE ordre ( ordrenr integer not null, ordredato date, kundenr integer not null FOREIGN KEY REFERENCES kunde(kundenr), kontaktperson varchar(30), PRIMARY KEY (ordrenr) );
  • 15. Fremmednøkkeldelen til slutt (nødvendig ved sammensatt PK):  CREATE TABLE ordre ( ordrenr int not null, ordredato date, kundenr int not null, landskode varchar(2), kontaktperson varchar(30), PRIMARY KEY (ordrenr, kundenr), FOREIGN KEY (landskode, kundenr) REFERENCES kunde(landskode,kundenr) );
  • 16. Fremmednøkkeldelen som egen setning (anbefales)  CREATE TABLE ordre ( ordrenr int not null, ordredato date, kundenr int not null, kontaktperson varchar(30), primary key (ordrenr) );  ALTER TABLE ordre ADD CONSTRAINT kunde_fk FOREIGN KEY (kundenr) REFERENCES kunde (kundenr);
  • 17. Metoder for sikring av referanseintegritet  ON DELETE  ON UPDATE ◦ SET NULL ◦ CASCADE  Syntax eks ◦ ALTER TABLE ordre ADD CONSTRAINT kunde_fk FOREIGN KEY (kundenr) REFERENCES kunde (kundenr) ◦ ON DELETE CASCADE;
  • 18. ON DELETE  Utføres når den refererte verdi slettes. ◦ CASCADE vil slette den refererende rad ◦ SET NULL vil sette en null verdi i refererende attributt A_id A_verdi 101 100000 102 50000 TABELL A TABELL B B_id B_verdi A_id* B1 25 101 B2 12 102
  • 19. ON DELETE CASCADE A_id A_verdi 101 SLETTES 100000 102 50000 TABELL A TABELL B B_id B_verdi A_id B2 12 102
  • 20. ON DELETE SET NULL A_id A_verdi 101 SLETTES 100000 102 50000 TABELL A TABELL B B_id B_verdi A_id B1 25 NULL B2 12 102
  • 21. ON UPDATE CASCADE A_id A_verdi 101 ny verdi = 1001 100000 102 50000 TABELL A TABELL B B_id B_verdi A_id B1 25 1001 B2 12 102
  • 22. ON UPDATE SET NULL A_id A_verdi 101 ny verdi = 1001 100000 102 50000 TABELL A TABELL B B_id B_verdi A_id B1 25 NULL B2 12 102
  • 24. Aggregeringsfunksjoner  SQL kan også brukes til å telle opp (count), summere (sum), finne maksimum og minimum (max, min), gjennomsnitt (avg) m.m.  Vi kan benytte aggregeringsfunksjoner på hele datasett eller på grupper av data i settet
  • 25. Aggregeringsfunksjoner  SELECT COUNT(*) FROM kunde; ◦ Returnerer antall rader i kunde entiteten  SELECT AVG(omsetning) FROM kunde WHERE omsetning > 2000000; ◦ Returnerer gjennomsnitt av omsetning for kunder med omsetning over 2000000  SELECT MAX(omsetning) FROM kunde; ◦ Returnerer høyeste omsetning i kunde entiteten.
  • 26. Gruppering  Om vi vil begrense datasettet til et mindre utvalg kan vi gruppere.  SELECT gruppekode, SUM(omsetning) FROM kunde GROUP BY gruppekode; ◦ Returnerer summen av total omsetning for de individuelle gruppekodene  SELECT COUNT(*) FROM STUDENT GROUP BY hjemsteds_kommune; ◦ Returnerer antall studenter representert fra de individuelle hjemstedskommunene
  • 27. ALL/ANY  ALL og ANY brukes på resultatet av en delspørring. ◦ ALL er sann hvis alle i delspørringen oppfyller kriteriet. Usant hvis delspørringen er tom. ◦ ANY er sann hvis noen (en eller flere) oppfyller kravet. Sant hvis delspørringen er tom. SOME er ekvivalent med ANY.
  • 28. ALL/ANY  SELECT * FROM kunde WHERE kundenr >= ALL (SELECT kundenr FROM kunde);  er det samme som  Select * FROM kunde WHERE kundenr >= (SELECT MAX(kundenr) FROM kunde);
  • 29. ALL/ANY  SELECT * FROM kunde WHERE kundenr <= ALL (SELECT kundenr FROM kunde);  er det samme som  SELECT * FROM kunde WHERE kundenr <= (select min(kundenr) FROM kunde);
  • 30. ALL/ANY  SELECT * FROM kunde WHERE kundenr > ANY (SELECT kundenr FROM kunde);  er det samme som  SELECT * FROM kunde WHERE kundenr > (SELECT MIN(kundenr) FROM kunde);
  • 31. ALL/ANY  Litt vanskeligere spørringer, men her ser vi virkelig nytten av ALL/ANY  SELECT gruppekode FROM kunde GROUP BY gruppekode HAVING AVG(omsetning) >= ALL (SELECT AVG(omsetning) FROM kunde GROUP BY gruppekode);