Grunderna i SQL del 1

Relevanta dokument
Grunderna i SQL del 1

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

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

Design och underhåll av databaser

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.

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

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

Databaser och. SQL, utsökningar mot en tabell

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

Structured Query Language (SQL)

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

Övningar i SQL. SQLAccess.doc Ove Lundgren

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

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

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

Laboration SQL. Kom igång.

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

Databaser. Vad du ska lära dig: Ordlista

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

Föreläsning 5: Relationsmodellen

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

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

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

Structured query language (SQL)

Databasutveckling Introduktion till SQL och TSQL

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

Starta MySQL Query Browser

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

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

Klassdeklaration. Metoddeklaration. Parameteröverföring

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

FileMaker 14. SQL-referens

Databasspråket SQL - online.

Tentamen för DD1370 Databasteknik och informationssystem

Databasspråket SQL - online.

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

Lösningar till tentamen i EDAF75

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

Databasspråket SQL - online.

Databasspråket SQL - online.

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.

1.Lär känna MS SQL Observera. Tips. Förberedelse

Databasspråket SQL - online.

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

3. Dynamiska webbplatser, 20 Yhp (4 v)

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

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

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata.

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

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

Parameteröverföring. Exempel. Exempel. Metodkropp

Relationsalgebra. Varför behöver jag lära mig relationsalgebra?!

TDDC77 Objektorienterad Programmering

Lär känna MS SQL 2008 / Övning. Observera. Tips. Förberedelse

07/11/14. Databasteknik och informationssystem DD1370 F2. Allmänna frågor. Är Lab0 svårbegriplig? Nu: Clickers. Är Kurswebben svårbegriplig?

DDL Kommandon CREATE/DROP Database CREATE /ALTER/DROP Table ALTER/ADD/DROP Column CREATE /ALTER/DROP Index

Databaskunskap 7,5 högskolepoäng Provmoment: Ladokkod: Tentamen ges för:

Tentamen för DD1370 Databasteknik och informationssystem

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

F2 Datatyper och variabler. ID1004 Objektorienterad programmering Fredrik Kilander

Pascal... Pascal. Pascal... Pascal...

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

Pascal. reserverade ord fördefinierade funktioner och procedurer egendefinierade funktioner, procedurer och objekt

Föreläsning 5 Dagens föreläsning går igenom

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Strukturdiagram. Styra. Algoritmer. Val

Databaser - Design och programmering. Operationer i relationsalgebra. Att söka ut data. Exempel DBschema. Att plocka ut data, forts

Vad är SQL? Introduktion till SQL

Exempel-Tentamen III

EMPS(NAME, SALARY, DEPT)

Microsoft Excel Grundkurs

Sample exam questions. Database exam TIG058

Objektorienterad programmering Föreläsning 4

i LabVIEW. Några programmeringstekniska grundbegrepp

Databaser och SQL - en kort introduktion

Karlstads Universitet, Datavetenskap 1

Datorsystemteknik DVG A03 Föreläsning 3

F5 Selektion och iteration. ID1004 Objektorienterad programmering Fredrik Kilander

16/12/14. Databasteknik och informationssystem DD1370. Dagens föreläsning (den sista!) Motivera med kokbok! Idag: Inga knappar L. Dagens föreläsning

Arbetsblad 1:1. Tiondelar på tallinjen 0,1 0,5 0,9 0,2 0,8 0,3 0,8 1,1 1,5 1,6 2,1 2,4 1,1 1,4 2,6 3,2 3,8

Arbetsblad 1:1. Tiondelar på tallinjen 0,9 1,1 0,8. 6 Sätt ut pilar som pekar på talen: A = 0,3 B = 0,8 C = 1,4

Arbetsblad 1:1. Tiondelar på tallinjen. 6 Sätt ut pilar som pekar på talen: A = 0,3 B = 0,8 C = 1,4

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

Tentamen för DD1370 Databasteknik och informationssystem

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Beräkningsvetenskap föreläsning 2

TDIU01 - Programmering i C++, grundkurs

Relationsdatabasdesign

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

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

NKRR. Regelskrivning i praktiken

Datalager och datautvinning

Räkna med C# Inledande programmering med C# (1DV402)

Block 1 - Mängder och tal

Fältnamn /Rubrik Fältnamn /Rubrik Fältnamn /Rubrik Fältnamn /Rubrik Data Data Data Data Data Data Data Data

Laborationer - databaser, EDAA20 Programmering och databaser

Labb LABB 1. Databassagan och en rundtur i databasers märkliga värld. Plushögskolan Frågeutveckling inom MSSQL - SU14

Föreläsning 4 Dagens föreläsning går igenom

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

Block 1 - Mängder och tal

Transkript:

Grunderna i SQL del 1 1. SELECT-frågor 2. SELECT 3. WHERE Kap. 3 4. ORDER BY 5. Inre join 6. Yttre join 7. Andra typer av join Kap. 4 8. Union 9. Aggregatfunktioner 10. Gruppera och summera Kap. 5 utom ROLLUP, CUBE, GROUPING SETS Sid. 1

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 SELECT Attribut -- 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) Notera WHERE och ORDER BY är valfritt i en SELECT-fråga! 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) SELECT [ALL DISTINCT] [TOP n [PERCENT] [WITH TIES]] Attribut1 [[AS] Alias1] [, Attribut2 [[AS] Alias2]]... FROM Tabell Sid. 3

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... Exempel Hämtar fullständigt namn: SELECT 'Fullnamn: ' + Förnamn + ' ' + Efternamn AS Namntexter FROM Lärare Namntexter Fullnamn: Andreas Persson Fullnamn: Johan Petersson Lärare Förnamn Efternamn E-post Andreas Persson andreas.persson@oru.se Johan Petersson johan.petersson@oru.se Sid. 4

2.2. Aritmetiska uttryck Attribut bestående av tal (heltal eller flyttal) fungerar tillsammans med aritmetiska operatorer Multiplikation, division och mobulus utförs före subtraktion och addition Ordningen på operationerna kan ändras genom parenteser! Alias som innehållande mellanrum skrivs inom hakparenteser ([])! Aritmetiska operatorer + -- Adderar attribut - -- Subtraktion mellan attribut * -- Multiplicerar attribut / -- Dividerar attribut % -- Modulus mellan attribut Exempel 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 NULL Resultat AnställdID Lön efter skatt 5 13090 2 15750 10 14840 Sid. 5

2.3. ALL eller DISTINCT resultat Default hämtas alla (ALL) poster vid en SELECT -frågan (även dubbletter!) För endast unika poster i resultatet så används nyckelordet DISTINCT SELECT [ALL DISTINCT] Attribut... Exempel Anställda som har fått en utbetalning under året: SELECT DISTINCT AnställdID FROM Utbetalningar Månader med utbetalningar: SELECT DISTINCT Månad FROM Utbetalningar -- Månad: -- Juli -- Augusti Utbetalningar AnställdID Belopp Månad 5 18700 Juli 5 1600 Juli 10 21200 Augusti 7 NULL Juli 2 22500 Juli 2 22500 Augusti 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... Exempel Hämta den högsta utbetalningen: SELECT TOP 1 Belopp, Månad FROM Utbetalningar Hämtar högsta utbetalningar (även samma belopp för olika månader): SELECT TOP 1 WITH TIES Belopp, Månad FROM Utbetalningar Utbetalningar AnställdID Belopp Månad 5 18700 Juli 5 1600 Juli 10 21200 Augusti 7 NULL Juli 2 22500 Juli 2 22500 Augusti Sid. 7

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. 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! Exempel Alla utbetalda belopp över 20000: SELECT * FROM Utbetalningar WHERE Belopp > 20000 Alt.1.) Alla utbetalda belopp i intervallet 15000-20000: SELECT * FROM Utbetalningar WHERE Belopp >= 15000 AND Belopp <= 20000 Alt.2.) Alla utbetalda belopp i intervallet 15000-20000: Utbetalningar AnställdID Belopp Månad 5 18700 Juli 5 1600 Juli 10 21200 Augusti 7 NULL Juli 2 22500 Juli 2 22500 Augusti SELECT * FROM Utbetalningar WHERE NOT( Belopp < 15000 OR Belopp > 20000) Sid. 9

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 Exempel Alt.3.) Alla utbetalda belopp i intervallet 15000-20000: Notera SELECT * FROM Utbetalningar WHERE Belopp BETWEEN 15000 AND 20000 NOT kan användas framför både IN och BETWEEN för att få det motsatta resultatet Utbetalningar AnställdID Belopp Månad 5 18700 Juli 5 1600 Juli 10 21200 Augusti 7 NULL Juli 2 22500 Juli 2 22500 Augusti Sid. 10

3.3. LIKE-operatorn 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 Notera 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

3.4. Exempel Alla telefonnummer till Örebro universitet: SELECT Telefon FROM Lärare WHERE Telefon LIKE '019-30%' Alla efternamn som börjar på Per eller Pet : SELECT Efternamn FROM Lärare WHERE Efternamn LIKE 'Pe[rt]%' Lärare Förnamn Efternamn E-post Telefon Rumsnummer Andreas Persson andreas.persson@oru.se 019-303191 L2123 Johan Petersson johan.petersson@oru.se 019-303811 L2138 Sid. 12

3.5. IS NULL-operatorn Då vissa attribut tillåter NULL-värden finns IS NULL Hämta poster som har just ett NULL-värde! Behövs eftersom värdet NULL beter sig så konstigt: inget, inte ens NULL, är lika med NULL! Alla som inte har ett telefonnummer: SELECT Förnamn, Efternamn FROM Lärare WHERE Telefon IS NULL Alla som har ett telefonnummer: SELECT Förnamn, Efternamn FROM Lärare WHERE Telefon IS NOT NULL Lärare Förnamn Efternamn E-post Telefon Andreas Persson andreas.persson@oru.se 019-303191 Johan Petersson johan.petersson@oru.se 019-303811 Kalle Räisänen kalle.raisanen@oru.se NULL Notera NOT används i samband med IS NULL-operatorn för att utesluta poster med NULL-värden. Sid. 13

4. ORDER BY Genom ORDER BY-uttrycket så sorteras resultatet Sorteringen kan ske i stigande ordning (ASC) eller sjunkande ordning (DESC) Default används stigande ordning (ASC) ORDER BY Attribut [ASC DESC]... Exempel Notera Alla utbetalda belopp över 15000 i stigande ordning: SELECT Belopp, Månad FROM Utbetalningar WHERE Belopp > 15000 ORDER BY Belopp Utbetalningar AnställdID Belopp Månad 5 18700 Juli 5 1600 Juli 10 21200 Augusti 7 NULL Juli 2 22500 Juli 2 22500 Augusti Sorteringsordningen för ORDER BY-uttrycket är: 1.) NULL -värden, 2.) specialtecken, 3.) siffror och 4.) bokstäver. Sid. 14

4.1. Sortering på alias och attributnummer Sortering med ORDER BY -uttrycket kan även ske på attributalias eller direkt på attributnumret Exempel Sorterat i sjunkande ordning på ett alias för fullständigt namn: SELECT Förnamn + ' ' + Efternamn AS Fullnamn FROM Lärare ORDER BY Fullnamn DESC Sorterat i sjunkande ordning på andra attributet (Efternamn): SELECT Förnamn, Efternamn FROM Lärare ORDER BY 2 DESC -- Efternamn: -- Räisänen -- Petersson -- Persson Lärare Förnamn Efternamn E-post Telefon Andreas Persson andreas.persson@oru.se 019-303191 Johan Petersson johan.petersson@oru.se 019-303811 Kalle Räisänen kalle.raisanen@oru.se NULL Sid. 15

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 SELECT Attribut FROM Tabell1 [INNER] JOIN Tabell2 ON Joinvillkor [[INNER] JOIN Tabell3 ON... Notera 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. 16

5.1. Exempel En inre join som kombinerar fullständigt namn och tillhörande akademi: SELECT Förnamn + ' ' + Efternamn AS Fullnamn, Akademier.Namn AS Akademi FROM Lärare JOIN Akademier ON Lärare.Akademi = Akademier.AkademiID ORDER BY Fullnamn Lärare Förnamn Efternamn E-post Telefon Akademi Andreas Persson andreas.persson@oru.se 019-303191 3 Johan Petersson johan.petersson@oru.se 019-303811 3 Kalle Räisänen kalle.raisanen@oru.se NULL 3 Akademier AkademiID Namn 3 Handelshögskolan 4 Institutionen för naturvetenskap och teknik Resultat Fullnamn Andreas Persson Johan Petersson Kalle Räisänen Akademi Handelshögskolan Handelshögskolan Handelshögskolan Sid. 17

5.2. Implicit inre join Den syntax som har använts hittills har varit explicit join-syntax Innan SQL-92-standarden fanns bara implicit join-syntaxen: Alla tabeller skrivs i FROM-uttrycket separerade med komman Joinvillkoret skrivs i WHERE-uttrycket SELECT Attribut FROM Tabell1, Tabell2,... WHERE Tabell1.Attribut operator Tabell2.Attribut [AND OR]... Exempel Implicit join som listar fullständigt namn och tillhörande akademi: SELECT Förnamn + ' ' + Efternamn AS Fullnamn, Akademier.Namn AS Akademi FROM Lärare, Akademier WHERE Lärare.Akademi = Akademier.AkademiID Notera 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. 18

5.3. Tabellalias Tabellalias kan användas för ett temporärt tabellnamn inom FROM -uttrycket Tabellalias skapas (liksom för attribut) genom nyckelordet AS framför ett alias SELECT Attribut FROM Tabell1 AS Alias1 [INNER] JOIN Tabell2 AS Alias2 ON... Exempel Föregående exempel fast med tabellalias: SELECT Förnamn + ' ' + Efternamn AS Fullnamn, Akademier.Namn AS Akademi FROM Lärare AS L JOIN Akademier AS A ON L.Akademi = A.AkademiID ORDER BY Fullnamn Notera Tabellalias kan ge en tydligare syntax ifall långa tabell- och attributnamn används! Sid. 19

5.4. Självjoin Med självjoin så skapas en join mellan attribut i en och samma tabell Vid självjoin så måste tabellalias användas Exempel 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 Handelshögskolan Akademin för Naturvetenskap och teknik Andra akademin Akademin för Naturvetenskap och teknik Handelshögskolan Notera 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. 20

6. Yttre join En yttre join (outer join) inkluderar även poster som inte uppfyller joinvillkoret 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) SELECT Attribut FROM Tabell1 {LEFT RIGHT FULL} [OUTER] JOIN Tabell2 ON Joinvillkor [{LEFT RIGHT FULL} [OUTER] JOIN Tabell3 ON... Notera 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.) Sid. 21

6.1. Exempel En yttre LEFT join som kombinerar fullständigt namn och tillhörande akademi: SELECT Förnamn + ' ' + Efternamn AS Fullnamn, Akademier.Namn AS Akademi FROM Lärare LEFT JOIN Akademier ON Lärare.Akademi = Akademier.AkademiID Lärare Förnamn Efternamn E-post Telefon Akademi Andreas Persson andreas.persson@oru.se 019-303191 NULL Johan Petersson johan.petersson@oru.se 019-303811 3 Kalle Räisänen kalle.raisanen@oru.se NULL 3 Akademier AkademiID Namn 3 Handelshögskolan 4 Akademin för Naturvetenskap och teknik 5 Musikhögskolan Resultat (LEFT) Fullnamn Andreas Persson Johan Petersson Kalle Räisänen Akademi NULL Handelshögskolan Handelshögskolan Sid. 22

6.2. Exempel2 En yttre RIGHT join som kombinerar fullständigt namn och tillhörande akademi: SELECT Förnamn + ' ' Efternamn AS Fullnamn, Akademier.Namn AS Akademi FROM Lärare RIGHT JOIN Akademier ON Lärare.Akademi = Akademier.AkademiID En yttre FULL join som kombinerar fullständigt namn och tillhörande akademi: SELECT Förnamn + ' ' Efternamn AS Fullnamn, Akademier.Namn AS Akademi FROM Lärare FULL JOIN Akademier ON Lärare.Akademi = Akademier.AkademiID Resultat (RIGHT) Resultat (FULL) Fullnamn Akademi Fullnamn Akademi NULL Akademin för Naturvetenskap och teknik NULL Akademin för Naturvetenskap och teknik Johan Petersson Handelshögskolan Andreas Persson NULL Kalle Räisänen Handelshögskolan Johan Petersson Handelshögskolan NULL Musikhögskolan Kalle Räisänen Handelshögskolan NULL Musikhögskolan Sid. 23

6.3. Implicit yttre join (Gammalt och deprecated. Använd inte detta.) Joinvillkoret i en implicit yttre join skrivs i WHERE -uttrycket, men är begränsad till två operatorer: *= för LEFT yttre join =* för RIGHT yttre join SELECT Attribut FROM Tabell1, Tabell2,... WHERE Tabell1.Attribut {*= =*} Tabell2.Attribut [AND OR]... Exempel En implicit yttre LEFT join som kombinerar fullständigt namn och tillhörande akademi: SELECT Förnamn + ' ' + Efternamn AS Fullnamn, Akademier.Namn AS Akademi FROM Lärare, Akademier WHERE Lärare.Akademi *= Akademier.AkademiID Notera Det finns ingen motsvarande FULL JOIN med implicit yttre join! Sid. 24

7. Andra typer av join Kombinationer av inre och yttre join går bra med explicita join (dock inte med implicita join) Genom kartesisk produkt ( korsad join ) kombineras alla poster i två tabeller Nyckelordet CROSS används för att skapa en korsad join SELECT Attribut FROM Tabell1 CROSS JOIN Tabell2 -- Korsad join Exempel En korsad join som kombinerar fullständigt namn och akademier: SELECT Förnamn + ' ' + Efternamn AS Fullnamn, Akademier.Namn AS Akademi FROM Lärare CROSS JOIN Akademier -- Resultatet består av 9 poster Notera 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. Sid. 25

8. Union Med UNION så kombineras resultaten från flera SELECT-frågor Resultaten från respektive SELECT-fråga måste innehålla lika många attribut 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 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 SELECT Attribut första frågan... UNION [ALL] SELECT Attribut andra frågan... [UNION [ALL] SELECT Attribut tredje frågan...] [ORDER BY Attribut från första frågan] Notera En UNION tar automatiskt bort alla dubblettposter. För att inkludera alla poster används nyckelordet ALL. Sid. 26

8.1. Exempel En union som kombinerar resultatet från två SELECT-frågor: SELECT 'Människa' AS Typ, Förnamn + ' ' + Efternamn AS Namn FROM Lärare UNION SELECT 'Plats' AS Typ, Namn FROM Akademier ORDER BY Namn Lärare Förnamn Efternamn E-post Telefon Akademi Andreas Persson andreas.persson@oru.se 019-303191 NULL Johan Petersson johan.petersson@oru.se 019-303811 3 Kalle Räisänen kalle.raisanen@oru.se NULL 3 Akademier AkademiID Namn 3 Handelshögskolan 4 Akademin för Naturvetenskap och teknik Resultat Typ Plats Människa Plats Människa Människa Namn Akademin för Naturvetenskap och teknik Andreas Persson Handelshögskolan Johan Petersson Kalle Räisänen Sid. 27

8.2. EXCEPT (differens) och INTERSECT (snitt) 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 SELECT Attribut första frågan... {EXCEPT INTERSECT} SELECT Attribut andra frågan... [ORDER BY Attribut från första frågan] Exempel Utesluter alla lärare utan ett telefonnummer (den långa vägen): SELECT * FROM Lärare EXCEPT SELECT * FROM Lärare WHERE Telefon IS NULL 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 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 Notera Alla aggregatfunktioner med angivet attribut ignorerar poster med NULL-värden. COUNT(*) räknar det totala antalet poster inklusive poster med NULL-värden! Sid. 29

9.1. Exempel 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 NULL Skillnaden mellan COUNT(Attribut) och COUNT(*): SELECT COUNT(Lön) AS Utbetalningar: FROM Lönespecifikation -- Utbetalningar: 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. 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 SELECT Attribut 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 Notera 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) Sid. 31

10.1. Exempel Grupperar det totala beloppet och listar alla anställda som får mer än 30000 utbetalat: SELECT AnställdID, SUM(Belopp) AS Totalt FROM Utbetalningar 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 FROM Utbetalningar GROUP BY Månad ORDER BY Månad Utbetalningar AnställdID Belopp Månad 5 18700 Juli 5 1600 Juli 10 21200 Augusti 7 NULL Juli 2 22500 Juli 2 22500 Augusti Notera 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. 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 Exempel Anställda med total utbetalning över 20000 (med HAVING): SELECT AnställdID, SUM(Belopp) AS Totalt FROM Utbetalningar GROUP BY AnställdID HAVING SUM(Belopp) > 20000 Anställda med total utbetalning över 20000 (med WHERE): Utbetalningar AnställdID Belopp Månad 5 18700 Juli 5 1600 Juli 10 21200 Augusti 7 NULL Juli 2 22500 Juli 2 22500 Augusti SELECT AnställdID, SUM(Belopp) AS Totalt FROM Utbetalningar WHERE Belopp > 20000 GROUP BY AnställdID Sid. 33