Grunderna i SQL del 1



Relevanta dokument
Grunderna i SQL del 1

Design och underhåll av databaser

Laboration SQL. Kom igång.

Databasens består av: Tabell Kolumner fält Rader poster (varje post är unik)

Vad är en databas? Databaser. Relationsdatabas. Vad är en databashanterare? Vad du ska lära dig: Ordlista

Databasutveckling Introduktion till SQL och TSQL

Vad är en databas? Databaser. Relationsdatabas. Vad är en databashanterare? Vad du ska lära dig: Ordlista

Informationssystem och Databasteknik, 2I-1100 HT2001. Relationsalgebra. Relationsalgebran är sluten: R 1 op R 2 R 3.

SQL, nästlade delfrågor Nästlade delfrågor. En nästlda delfråga är ett select-from-where uttryck inom where-klausulen i en annan fråga.

Structured Query Language (SQL)

FileMaker 14. SQL-referens

Övningar i SQL. SQLAccess.doc Ove Lundgren

9. Between 10. Group by 11. Aggregatfunktionerna max, min, sum och avg 12. Nästlade sökningar

I denna laboration skriver jag inte ut resultatet på de flesta frågorna utan du kör dem själv i din miljö.

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

1. SQL 2. Utsökningar mot flera tabeller. 4. IN-operatorn 5. Join 6. Kartesisk produkt 7. Tabellalias

Databaser och. SQL, utsökningar mot en tabell

Databaser och SQL - en kort introduktion

Transaktioner. 1. Transaktioner 2. Samtidighet ( concurrency ) och lås. 3. Deadlock. Kap. 17. Informatik B: Databashantering med SQL Server

Structured query language (SQL)

Databaser och. SQL, utsökningar mot flera tabeller TENTA. # radnr (#) studnr (#) kursnr * tentadatum * betyg

Användarhandledning för SQL- och fönsterfilter

Introduktion till frågespråket SQL (v0.91)

SQL. Structured Query Language. Frågespråk för att används för. Kommandon. data åtkomst data manipulation

Tentamen i. för D1 m fl, även distanskursen. fredag 13 januari 2012

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Databaser. Vad du ska lära dig: Ordlista

SQL del 2. Christer Stuxberg Institutionen för Informatik och Media

Abstrakt algebra för gymnasister

a), c), e) och g) är olikheter. Av dem har c) och g) sanningsvärdet 1.

DE FYRA RÄKNESÄTTEN (SID. 11) MA1C: AVRUNDNING

08/11/13. Databasteknik och informationssystem DD1370 F3. Ett urval ur databasen bestäms av en SQL-fråga. Påminnelse: Deadline på tisdag

Vad är en databas? Exempel på databaser: Databas = Organiserad samling och lagring av information.

Javisst! Uttrycken kan bli komplicerade, och för att få lite överblick över det hela så gör vi det så enkelt som möjligt för oss.

Grunderna i stegkodsprogrammering

DIVISIONSEXEMPEL RELATIONSALGEBRA OCH SQL. r s använder vi för att uttrycka frågor där ordet alla figurerar:

Klassdeklaration. Metoddeklaration. Parameteröverföring

Lösningsförslag till Exempel tentamen

Vad är en databas? Databaser. Relationsdatabas. Vad är en databashanterare? Vad du ska lära dig: Ordlista

2.4. Teckensträngar och logiska uttryck

Idag. 1. Från modell till databasstruktur. 2. Prata med databaser (frågepsråket SQL)

Det följande avsnittet visar hur man enkelt kan göra företagets räkenskapsrapporter med hjälp av kontouppställningar.

Databasutveckling Tabeller. tinyint 1 byte (0-255) Upp till 8 bytes

Från verklighet via modell till databas. Idag. Testa reglerna på varuhusmodellen. Från verklighet via modell till databas

Repetitionsuppgifter i Matematik inför Basår. Matematiska institutionen Linköpings universitet 2014

Objektorienterad programmering D2

Sätt att skriva ut binärträd

Programmeringsteknik med C och Matlab

Lär dig sökmöjligheterna i Disgen 8

Databasspråket SQL - online.

INNEHÅLL SQL DEL 2. Funktioner inbyggda Aggregatfunktioner Skalärfunktioner. Chapter 11. Beginning SQL Server 2008 for Developers

ALEPH ver. 16 Sökning

Föreläsning 4: Poster

Programmering A. Johan Eliasson

För att skriva data till skärmen ( konsolen) används objektet System.out tillsammans med metoden println eller print.

INNEHÅLL. Historik Vad är SQL Språkuppbyggnad SELECT Operatorer Logiska/Jämförelse SELECT med Alias och JOIN INSERT UPDATE DELETE

Bonusmaterial till Lära och undervisa matematik från förskoleklass till åk 6. Ledning för att lösa problemen i Övningar för kapitel 5, sid

VHDL och laborationer i digitalteknik

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Lösningar till tentamen i EDAF75

Uppgift (poäng) 1 (2) 2 (3) 3 (4) 4 (4) 5 (3) 6 (4) 7 (6) 8 (6) 9 (8) Summa

Sidor i boken , , 3, 5, 7, 11,13,17 19, 23. Ett andragradspolynom Ett tiogradspolynom Ett tredjegradspolynom

1 Skapa Tabell Skapa Relationer Redigera Relationer Redigera Fält i Tabell Lägga till Poster i Tabell...

Grunderna i SQL del 2 1. Underfrågor 2. Underfrågor som sökvillkor 3. Andra användningsområden för underfrågor

Föreläsning 3.1: Datastrukturer, en översikt

Databasspråket SQL - online.

Senaste revideringen av kapitlet gjordes , efter att ett fel upptäckts.

WCMS-15, Webbutvecklare CMS

Föreläsning 5: Relationsmodellen

Sid 1 (9) Tillämpad fysik och elektronik Karin Fahlquist. Laboration: Databasdesign & SQL

Rolladministration i PaletteArena 5.3

Semesteromställning Personec P

Databasspråket SQL - online.

Grunderna i SQL del 2 1. Underfrågor 2. Underfrågor som sökvillkor 3. Andra användningsområden för underfrågor 4. Komplexa underfrågor 5.

Rapportering till FORA 2016

Skapa gästkonton i Värmdö Kommun

3. Dynamiska webbplatser, 20 Yhp (4 v)

1 Datorn som miniräknare. 1.1 Räkneoperationer. 1.2 Variabler

Tentamen för DD1370 Databasteknik och informationssystem

Hanne Solem Görel Hydén Sätt in stöten! MATEMATIK

Introduktion till programmering SMD180. Föreläsning 2: Variabler, uttryck och satser

Databasspråket SQL - online.

Inledande programmering med C# (1DV402) 27+15=42 1 (22)

Kapitel 15: Data/Matrix Editor

Tabeller och kolumner SQL. Lägga till en ny post. Lägga till en ny post

Tal Räknelagar Prioriteringsregler

Begrepp :: Determinanten

En snabb titt på XML LEKTION 6

Prov kapitel FACIT Version 1

Snabbslumpade uppgifter från flera moment.

Databasspråket SQL - online.

Lektionsanteckningar 2: Matematikrepetition, tabeller och diagram

Çrona Tid. Behörighetssystem. Copyright DataVara AB. Produktutveckling Morgan Klebom, Christian Elber, Hans Bäcklund, Thomas Palm

Vardagsord. Förstår ord som fler än, färre än osv. Har kunskap om hälften/dubbelt. Ex. Uppfattning om antal

Undersökning om pensioner och traditionell pensionsförsäkring. Kontakt AMF: Ulrika Sundbom Kontakt Novus: Anna Ragnarsson Datum:

Dynamisk HTML JavaScript och webbläsarens objektmodell

Parameteröverföring. Exempel. Exempel. Metodkropp

TDDC77 Objektorienterad Programmering

DiveDB Version Användarmanual

Transkript:

Grunderna i SQL del 1 1. SELECT-frågor 2. SELECT 3. WHERE 4. ORDER BY 5. Inre join 6. Yttre join 7. Andra typer av join 8. Union 9. Aggregatfunktioner 10. Gruppera och summera Kap. 3 Kap. 4 Kap. 5 utom ROLLUP, CUBE, GROUPING SETS 1. SELECT-frågor Med SELECT-frågor så hämtas information från en databas SELECT-delen anger attributen (kolumnera) FROM-delen anger tabellen (eller tabellerna) som attributen tillhör WHERE-delen anger ett valfritt sökvillkor för att begränsa posterna (= raderna) i resultat ORDER BY-delen sorterar resultatet Grundläggande syntax -- Anger attributen som ska hämtas FROM Tabell - Anger tabellen som attributen tillhör [WHERE Sökvillkor] - Anger ett sökvillkor för att begränsa resultatet [ORDER BY Attribut] - Sorterar resultatet (med mera) WHERE och ORDER BY är valfritt i en SELECT-fråga! Sid. 1 Sid. 2 2. SELECT I samband med SELECT-delen så: Måste attribut av intresse anges Kan alla attribut av en tabell anges med en asterisk (*) Kan resultatet begränsas till alla (ALL) poster eller endast unika (DISTINCT) poster ALL är default Kan antalet poster i resultatet begränsas genom TOP (i SQL Server) Kan attributalias (kolumnalias) skapas genom nyckelordet AS (även tabellalias) 2.1. Kolumnnamn och stränguttryck Nyckelordet AS används för att ange ett attributalias för resulterande attribut Resulterande attribut kan behandlas som stränguttryck (kräver attribut av strängtyp!) Stränguttryck skrivs mellan enkla apostroftecken (') Stränguttryck sammanfogas med + -tecken (precis som för string -objekt i C#) Specialtecken används genom att inkludera en extra apostrof (') framför specialtecknet SELECT 'Stränguttryck' + Attribut AS Alias... SELECT [ALL DISTINCT] [TOP n [PERCENT] [WITH TIES]] Attribut1 [[AS] Alias1] [, Attribut2 [[AS] Alias2]]... FROM Tabell Hämtar fullständigt namn: SELECT 'Fullnamn: ' + Förnamn + ' ' + Efternamn AS Namntexter Namntexter Fullnamn: Andreas Persson Fullnamn: Förnamn Efternamn E-post Andreas Persson andreas.persson@oru.se johan.petersson@oru.se Sid. 3 Sid. 4

2.2. Aritmetiska uttryck 2.3. ALL eller DISTINCT resultat Attribut bestående av tal (heltal eller flyttal) fungerar tillsammans med aritmetiska operatorer Default hämtas alla (ALL) poster vid en SELECT -frågan (även dubbletter!) Multiplikation, division och mobulus utförs före subtraktion och addition För endast unika poster i resultatet så används nyckelordet DISTINCT Ordningen på operationerna kan ändras genom parenteser! Alias som innehållande mellanrum skrivs inom hakparenteser ([])! SELECT [ALL DISTINCT] Attribut... Aritmetiska operatorer + -- Adderar attribut - -- Subtraktion mellan attribut * -- Multiplicerar attribut / -- Dividerar attribut % -- Modulus mellan attribut Lön efter skatt på 30%: SELECT AnställdID, (Lön * 0.7) AS [Lön efter skatt] FROM Lönespecifikation Lönespecifikation AnställdID Lön 5 18700 2 22500 10 21200 7 Resultat AnställdID Lön efter skatt 5 13090 2 15750 10 14840 Anställda som har fått en utbetalning under året: SELECT DISTINCT AnställdID Månader med utbetalningar: SELECT DISTINCT Månad -- Månad: -- Juli -- Augusti Sid. 5 Sid. 6 2.4. Begränsat resultat SQL Server (olika i olika system): Genom nyckelordet TOP begränsas resultatet TOP kan begränsas till n st poster eller n PERCENT av de resulterande posterna TOP kan kombineras med WITH TIES för att inkludera poster med lika värden TOP bör kombineras med ORDER BY -uttrycket! SELECT [TOP n [PERCENT] [WITH TIES]] Attribut... Hämta den högsta utbetalningen: SELECT TOP 1 Belopp, Månad Hämtar högsta utbetalningar (även samma belopp för olika månader): SELECT TOP 1 WITH TIES Belopp, Månad 3. WHERE Genom WHERE -uttrycket så anges sökvillkor för att begränsa resultatet Jämförelseoperatorer används för att jämföra attribut mot sökuttryck Endast poster som uppfyller sökvillkoret hämtas! WHERE Attribut operator Sökuttryck Jämförelseoperatorer = -- Lika med > -- Större än >= -- Större än eller lika med < -- Mindre än <= -- Mindre än eller lika med <> -- Inte lika med Sid. 7 Sid. 8

3.1. Logiska operatorer Genom de logiska operatorerna AND, OR och NOT så kan flera sökvillkor anges Prioritetsordningen för de logiska operatorerna: 1.) NOT, 2.) AND och 3.) OR Ordningen kan ändras genom parenteser! Alla utbetalda belopp över 20000: 3.2. IN- och BETWEEN-operatorerna IN-operatorn jämför ett attribut mot en lista av uttryck BETWEEN-operatorn jämför ett attribut mot ett intervall WHERE Attribut [NOT] IN ( Uttryck1, Uttryck2,...) WHERE Attribut [NOT] BETWEEN Startuttryck AND Stopputtryck WHERE Belopp > 20000 Alt.3.) Alla utbetalda belopp i intervallet 15000-20000: Alt.1.) Alla utbetalda belopp i intervallet 15000-20000: WHERE Belopp >= 15000 AND Belopp <= 20000 Alt.2.) Alla utbetalda belopp i intervallet 15000-20000: WHERE NOT( Belopp < 15000 OR Belopp > 20000) WHERE Belopp BETWEEN 15000 AND 20000 NOT kan användas framför både IN och BETWEEN för att få det motsatta resultatet Sid. 9 Sid. 10 3.3. LIKE-operatorn 3.4. LIKE-operatorn jämför delvis ett attribut mot ett uttryck Genom att jämföra ett strängmönster mot ett attribut så maskas poster ut WHERE Attribut [NOT] LIKE Strängmönster Strängmönster % -- Alla strängar med noll eller flera tecken _ -- Ett tecken [abc] -- Ett av tecknen inom hakparenteserna [a-z] -- Alla tecken i det angivna intervallet [^a-z] -- Utesluter alla tecken i det angivna intervall Alla telefonnummer till Örebro universitet: SELECT Telefon WHERE Telefon LIKE '019-30%' Alla efternamn som börjar på Per eller Pet : SELECT Efternamn WHERE Efternamn LIKE 'Pe[rt]%' Förnamn Efternamn E-post Telefon Rumsnummer Andreas Persson andreas.persson@oru.se 019-303191 L2123 johan.petersson@oru.se 019-303811 L2138 Strängmönster som anges i samband med LIKE-operatorna är inte case sensitive!! NOT kan användas framför LIKE-operatorn för att i stället utesluta poster. Sid. 11 Sid. 12

3.5. IS -operatorn 4. ORDER BY Då vissa attribut tillåter -värden finns IS Genom ORDER BY-uttrycket så sorteras resultatet Hämta poster som har just ett -värde! Sorteringen kan ske i stigande ordning (ASC) eller sjunkande ordning (DESC) Behövs eftersom värdet beter sig så konstigt: inget, inte ens, är lika med! Default används stigande ordning (ASC) Alla som inte har ett telefonnummer: SELECT Förnamn, Efternamn WHERE Telefon IS Alla som har ett telefonnummer: SELECT Förnamn, Efternamn WHERE Telefon IS NOT Förnamn Efternamn E-post Telefon Andreas Persson andreas.persson@oru.se 019-303191 johan.petersson@oru.se 019-303811 kalle.raisanen@oru.se NOT används i samband med IS -operatorn för att utesluta poster med -värden. ORDER BY Attribut [ASC DESC]... Alla utbetalda belopp över 15000 i stigande ordning: SELECT Belopp, Månad WHERE Belopp > 15000 ORDER BY Belopp Sorteringsordningen för ORDER BY-uttrycket är: 1.) -värden, 2.) specialtecken, 3.) siffror och 4.) bokstäver. Sid. 13 Sid. 14 4.1. Sortering på alias och attributnummer Sortering med ORDER BY -uttrycket kan även ske på attributalias eller direkt på attributnumret Sorterat i sjunkande ordning på ett alias för fullständigt namn: SELECT Förnamn + ' ' + Efternamn AS Fullnamn ORDER BY Fullnamn DESC Sorterat i sjunkande ordning på andra attributet (Efternamn): SELECT Förnamn, Efternamn ORDER BY 2 DESC -- Efternamn: -- Räisänen -- Petersson -- Persson Förnamn Efternamn E-post Telefon Andreas Persson andreas.persson@oru.se 019-303191 johan.petersson@oru.se 019-303811 kalle.raisanen@oru.se 5. Inre join ( vanlig join ) Med inre join (inner join) kombineras attribut från två eller flera tabeller Med join jämförs attribut från flera tabeller mot varandra Resultatet är de poster som uppfyller ett joinvillkor En join skapas ofta på förhållandet mellan en primärnyckel och en främmande nyckel FROM Tabell1 [INNER] JOIN Tabell2 ON Joinvillkor [[INNER] JOIN Tabell3 ON... Ifall attribut har samma namn i två tabeller så måste attributen skiljas genom att använda hela namnet, ex: FROM Tabell1 JOIN Tabell2 ON Tabell1.Attribut = Tabell2.Attribut Alla jämförelseoperatorn fungerar för joinvillkor (dock är =-operatorn vanligast). Nyckelorder INNER är valfritt och används sällan då en JOIN är underförstått en INNER JOIN. Sid. 15 Sid. 16

5.1. 5.2. Implicit inre join En inre join som kombinerar fullständigt namn och tillhörande akademi: Den syntax som har använts hittills har varit explicit join-syntax JOIN Akademier ON.Akademi = Akademier.AkademiID ORDER BY Fullnamn Innan SQL-92-standarden fanns bara implicit join-syntaxen: Alla tabeller skrivs i FROM-uttrycket separerade med komman Joinvillkoret skrivs i WHERE-uttrycket Förnamn Efternamn E-post Telefon Akademi Andreas Persson andreas.persson@oru.se 019-303191 3 johan.petersson@oru.se 019-303811 3 kalle.raisanen@oru.se 3 Akademier AkademiID Namn Resultat Fullnamn 3 Andreas Persson 4 Institutionen för naturvetenskap och teknik Akademi FROM Tabell1, Tabell2,... WHERE Tabell1.Attribut operator Tabell2.Attribut [AND OR]... Implicit join som listar fullständigt namn och tillhörande akademi:, Akademier WHERE.Akademi = Akademier.AkademiID Vid join mellan fler än två tabeller så sker join från vänster till höger och mellan varje join så sparas resultatet i en provisorisk tabell. (Nej, det gör det inte, men man kan tänka sig det.) Sid. 17 Sid. 18 5.3. Tabellalias 5.4. Självjoin Tabellalias kan användas för ett temporärt tabellnamn inom FROM -uttrycket Med självjoin så skapas en join mellan attribut i en och samma tabell Tabellalias skapas (liksom för attribut) genom nyckelordet AS framför ett alias Vid självjoin så måste tabellalias användas FROM Tabell1 AS Alias1 [INNER] JOIN Tabell2 AS Alias2 ON... Föregående exempel fast med tabellalias: AS L JOIN Akademier AS A ON L.Akademi = A.AkademiID ORDER BY Fullnamn Tabellalias kan ge en tydligare syntax ifall långa tabell- och attributnamn används! Skapar en tabell över samarbeten mellan akademier: SELECT DISTINCT A1.Namn AS [Första akademin], A2.Namn AS [Andra akademin] FROM Akademier AS A1 JOIN Akademier AS A2 ON A1.Namn <> A2.Namn ORDER BY 1 DESC Resultat Första akademin Andra akademin DISTINCT används ofta tillsamman med självjoin för att eliminera dubbletter! Flera joinvillkor kan användas vid samma join genom de logiska operanderna AND och OR. Sid. 19 Sid. 20

6. Yttre join 6.1. En yttre join (outer join) inkluderar även poster som inte uppfyller joinvillkoret En yttre LEFT join som kombinerar fullständigt namn och tillhörande akademi: En yttre join kan ske som: LEFT, RIGHT eller FULL En yttre join hämtar poster som uppfyller joinvillkoret + poster som inte uppfyller villkoret men som tillhör LEFT eller RIGHT tabell, eller båda tabellerna (FULL) LEFT JOIN Akademier ON.Akademi = Akademier.AkademiID FROM Tabell1 {LEFT RIGHT FULL} [OUTER] JOIN Tabell2 ON Joinvillkor [{LEFT RIGHT FULL} [OUTER] JOIN Tabell3 ON... Förnamn Efternamn E-post Telefon Akademi Andreas Persson andreas.persson@oru.se 019-303191 johan.petersson@oru.se 019-303811 3 kalle.raisanen@oru.se 3 Nyckelordet OUTER är valfritt och används sällan då nyckelorden LEFT, RIGHT eller FULL (framför JOIN) identifierar att det är en yttre join. Även vid yttre join så skapas en provisorisk tabell ifall fler än två tabeller kombineras. (Nej, det gör det inte, men man kan tänka sig det.) Akademier AkademiID Namn 3 4 5 Musikhögskolan Resultat (LEFT) Fullnamn Andreas Persson Akademi Sid. 21 Sid. 22 6.2. 2 6.3. Implicit yttre join (Gammalt och deprecated. Använd inte detta.) En yttre RIGHT join som kombinerar fullständigt namn och tillhörande akademi: Joinvillkoret i en implicit yttre join skrivs i WHERE -uttrycket, men är begränsad till två operatorer: SELECT Förnamn + ' ' Efternamn AS Fullnamn, Akademier.Namn AS Akademi RIGHT JOIN Akademier ON.Akademi = Akademier.AkademiID *= för LEFT yttre join =* för RIGHT yttre join En yttre FULL join som kombinerar fullständigt namn och tillhörande akademi: SELECT Förnamn + ' ' Efternamn AS Fullnamn, Akademier.Namn AS Akademi FULL JOIN Akademier ON.Akademi = Akademier.AkademiID FROM Tabell1, Tabell2,... WHERE Tabell1.Attribut {*= =*} Tabell2.Attribut [AND OR]... Resultat (RIGHT) Fullnamn Akademi Resultat (FULL) Fullnamn Andreas Persson Akademi En implicit yttre LEFT join som kombinerar fullständigt namn och tillhörande akademi:, Akademier WHERE.Akademi *= Akademier.AkademiID Musikhögskolan Musikhögskolan Det finns ingen motsvarande FULL JOIN med implicit yttre join! Sid. 23 Sid. 24

7. Andra typer av join 8. Union Kombinationer av inre och yttre join går bra med explicita join (dock inte med implicita join) Med UNION så kombineras resultaten från flera SELECT-frågor Genom kartesisk produkt ( korsad join ) kombineras alla poster i två tabeller Resultaten från respektive SELECT-fråga måste innehålla lika många attribut Nyckelordet CROSS används för att skapa en korsad join Datatyperna för attributen måste även stämma överens! Attributen i det kombinerade resultatet får namnen från den första SELECT-frågan FROM Tabell1 CROSS JOIN Tabell2 -- Korsad join Används ORDER BY-uttrycket för att sortera resultatet av en UNION så måste sorteringen ske på attributen i första SELECT-frågan En korsad join som kombinerar fullständigt namn och akademier: CROSS JOIN Akademier -- Resultatet består av 9 poster Utesluts joinvillkoren i WHERE-uttrycket så skapas en implicit korsad join! Resultatet av en korsad join kallas även för den kartesiska produkten av två tabeller. första frågan... UNION [ALL] andra frågan... [UNION [ALL] tredje frågan...] [ORDER BY Attribut från första frågan] En UNION tar automatiskt bort alla dubblettposter. För att inkludera alla poster används nyckelordet ALL. Sid. 25 Sid. 26 8.1. 8.2. EXCEPT (differens) och INTERSECT (snitt) En union som kombinerar resultatet från två SELECT-frågor: SELECT 'Människa' AS Typ, Förnamn + ' ' + Efternamn AS Namn UNION SELECT 'Plats' AS Typ, Namn FROM Akademier ORDER BY Namn Förnamn Efternamn E-post Telefon Akademi Andreas Persson andreas.persson@oru.se 019-303191 johan.petersson@oru.se 019-303811 3 kalle.raisanen@oru.se 3 Med EXCEPT så utesluts poster som finns med som resultat för två SELECT-frågor Med INTERSECT så inkluderas endast poster som finns med som resultat för två SELECT-frågor Attributen i resultaten från SELECT-frågorna måste även här matcha till antal och datatyper Attributen i resultatet får samma namn som attributen i den första SELECT-frågan första frågan... {EXCEPT INTERSECT} andra frågan... [ORDER BY Attribut från första frågan] Akademier AkademiID Namn Resultat Typ Namn Utesluter alla lärare utan ett telefonnummer (den långa vägen): 3 4 Plats Människa Plats Människa Människa Andreas Persson EXCEPT WHERE Telefon IS Sid. 27 Sid. 28

9. Aggregatfunktioner Med aggregatfunktioner (eller kolumnfunktioner) så kan beräkningar utföras på poster för ett attribut En SELECT-fråga som innehåller aggregatfunktioner kallas även för en summeringsfråga Genom DISTINCT istället för ALL (vilket är default) så utförs beräkningarna endast på unika poster Funktioner AVG([ALL DISTINCT] Attribut) -- Medel av posterna för attributet SUM([ALL DISTINCT] Attribut) -- Summan av posterna för attributet 9.1. Medellönen för alla anställda: SELECT AVG(Lön) AS Medellön FROM Lönespecifikation -- Medellön: 20800 Sammanlagd utbetalning: SELECT SUM(Lön) AS Totalt FROM Lönespecifikation -- Totalt: 62400 Lönespecifikation AnställdID Lön 5 18700 2 22500 10 21200 7 MIN([ALL DISTINCT] Attribut) -- Den minsta posten för attributet MAX([ALL DISTINCT] Attribut) -- Den största posten för attributet COUNT([ALL DISTINCT] Attribut) -- Antalet poster för ett attribut COUNT(*) -- Totala antalet poster för hela tabellen Alla aggregatfunktioner med angivet attribut ignorerar poster med -värden. COUNT(*) räknar det totala antalet poster inklusive poster med -värden! Skillnaden mellan COUNT(Attribut) och COUNT(*): SELECT COUNT(Lön) AS : FROM Lönespecifikation -- : 3 SELECT COUNT(*) AS AntalAnställda FROM Lönespecifikation -- AntalAnställda: 4 (även dom utan lön) Vem har lägst lön? SELECT AnställdID AS Anställd FROM Lönespecifikation WHERE Lön = ( SELECT MIN(LÖN) FROM Lönespecifikation) -- Anställd: 5 Sid. 29 Sid. 30 10. Gruppera och summera Med GROUP BY-uttrycket så grupperas resulterande posterna efter angivet attribut Genom HAVING-uttrycket så anges ett sökvillkor för grupperingen Genom att ange gruppering för flera attribut så skapas en sorterad hierarki FROM Tabell [WHERE Sökvillkor] [GROUP BY Attribut] [HAVING Sökvillkor] [ORDER BY Attribut] - Grupperar på angivet attribut - Anger ett sökvillkor för grupperingen HAVING-uttrycket används tillsammans med aggregatfunktioner! Självklart kan flera sökvillkor anges med hjälp av de logiska operatorerna, ex.: HAVING NOT(Sökvillkor1 AND Sökvillkor2) 10.1. Grupperar det totala beloppet och listar alla anställda som får mer än 30000 utbetalat: SELECT AnställdID, SUM(Belopp) AS Totalt GROUP BY AnställdID HAVING SUM(Belopp) > 30000 -- AnställdID: 2 Belopp: 45000 Grupperar medelutbetalningen för varje månad: SELECT Månad, AVG(Belopp) AS Medel GROUP BY Månad ORDER BY Månad När GROUP BY -uttrycket används så kan SELECT -uttrycket innehålla: aggregatfunktioner, attribut som används i grupperingen, eller konstanta värden. Sid. 31 Sid. 32

10.2. Skillnad mellan WHERE och HAVING Med ett WHERE-sökvillkor så sker jämförelsen direkt mot posterna för attributet Med ett HAVING-sökvillkor så sker jämförelsen mot posterna efter gruppering Ett HAVING-uttryck kan endast referera till attribut i SELECT-uttrycket En aggregatfunktion kan endast användas som argument i ett HAVING-uttryck Anställda med total utbetalning över 20000 (med HAVING): SELECT AnställdID, SUM(Belopp) AS Totalt GROUP BY AnställdID HAVING SUM(Belopp) > 20000 Anställda med total utbetalning över 20000 (med WHERE): SELECT AnställdID, SUM(Belopp) AS Totalt WHERE Belopp > 20000 GROUP BY AnställdID Sid. 33