Hvordan kombinerer jeg resultater fra flere SQL-tabeller (tip: der er tre måder)
Mange gange i en relationsdatabase er de oplysninger, du vil vise i din forespørgsel, i mere end et bord. Dette rejser spørgsmålet “Hvordan kombinerer du resultater fra mere end en tabel?”
Alle eksemplerne til denne lektion er baseret på Microsoft SQL Server Management Studio og AdventureWorks2012-databasen. Du kan komme i gang med at bruge disse gratis værktøjer, der bruger min guide Kom godt i gang ved hjælp af SQL Server.
Hvordan kan jeg kombinere resultater fra mere end en forespørgsel?
SQL ville ikke være et meget nyttigt sprog, hvis det ikke gjorde det ‘t giver dig et let middel til at kombinere resultater fra mere end en forespørgsel. Heldigvis er der tre hovedmåder, du kan kombinere data fra flere tabeller. Vi gennemgår disse kort her og giver links til mere dybtgående artikler.
Tre hovedmåder til at kombinere data
Data i relationelle databasetabeller er organiseret i rækker og kolonner. Når vi undersøger måder at kombinere data på, skal du huske at slutresultatet bliver at enten tilføje flere kolonner til et resultat, måske fra en anden relateret tabel eller rækker, ved at tage et sæt rækker fra to eller flere tabeller s.
Når de fleste mennesker lærer at kombinere data, lærer de om:
- JOIN – Du kan bruge joins til at kombinere kolonner fra en eller flere forespørgsler til et resultat.
- UNION – Brug fagforeninger og andre sætoperatører til at kombinere rækker fra en eller flere forespørgsler til et resultat.
- Underforespørgsler – Nogle gange kaldes indlejrede forespørgsler, disse kan bruges til at udføre en separat søgning i databasen viste, at resultaterne kan bruges i en anden forespørgsel.
Tilslutninger
Jeg kan godt lide at tænke på sammenføjninger som den lim, der sætter databasen sammen igen. Relationsdatabaser normaliseres normalt for at gøre dataene nemmere at vedligeholde og forbedre ydeevnen, men slutresultatet er, at information er opdelt i mange tabeller. Du kan bruge Joins til at kombinere disse oplysninger sammen igen i et mere menneskeligt læsbart format. Dataene rekombineres ved at matche kolonner fra hver tabel.
I alle tilfælde kræver sammenføjninger to hovedingredienser: To tabeller og en sammenføjningsbetingelse. Tabellerne er det, vi vil bruge til at trække rækkerne og kolonnerne, og sammenhængsbetingelsen er, hvordan vi har til hensigt at matche kolonnerne mellem tabellerne.
Eksempel JOIN
SELECT Person.FirstName, Person.LastName, PersonPhone.PhoneNumber FROM Person.Person INNER JOIN Person.PersonPhone ON Person.BusinessEntityID = PersonPhone.BusinessEntityID
Der er to hovedtyper af sammenføjninger. Indre sammenføjninger og ydre sammenføjninger.
Indvendige sammenføjninger returnerer kun en resulterende række, hvis sammenføjningsbetingelsen stemmer overens i begge tabeller. Indvendige sammenføjninger bruges hovedsageligt til at matche den primære nøgle i en tabel og en fremmed nøgle i en anden.
Den anden type sammenføjning er en ydre sammenføjning. Ydre sammenføjninger returnerer altid mindst en række til hovedtabellen, kaldet den venstre eller højre tabel, og nulværdier i de tilsvarende kolonner i den ikke-matchende kolonne. Ydre sammenføjninger er nyttige til at finde data, der ikke matcher.
Det er vigtigt at bemærke, at sammenføjninger kan returnere flere rækker, end der findes i begge tabeller tilsammen. Sammenføjningerne returnerer kombinationer af kampe. Hvis du slutter dig til to tabeller, den ene med 5 række og den anden 10, kan resultatet indeholde alt fra 0 til 50 rækker afhængigt af sammenkædningsbetingelsen.
Foreninger
En UNION er bruges til at kombinere rækkerne med to eller flere forespørgsler til et resultat. Unionen kaldes en sætoperatør.
Der er nogle særlige forhold, der skal forekomme for at en fagforening kan arbejde. For det første skal hver forespørgsel have det samme antal kolonner. For det andet skal datatyperne i disse kolonner være kompatible. Generelt skal hver forespørgsel returnere det samme antal og typen af kolonner.
Et praktisk eksempel på union er, når to tabeller indeholder delnumre, og du vil oprette en kombineret liste til et katalog. Du kan enten vælge at få slutresultatet til en unik fortegnelse for den kombinerede forespørgsel, eller hvis du bruger UNION ALLE returnerer alle rækker fra hver tabel.
Eksempel UNION
SELECT C.NameFROM Production.ProductCategory AS CUNIONSELECT S.NameFROM Production.ProductSubcategory AS S
Ud over Union er der et par andre praktiske sætoperatører:
- INTERSECT – Du kan bruge dette til kun at returnere rækker, der er fælles mellem to tabeller.
- Bortset fra – Du kan bruge dette til at returnere rækker, der findes på en tabel, men ikke findes i en anden.
Når du fortsætter med at lære mere SQL, finder du at du kan bruge sammenføjninger til at skrive ækvivalente udsagn til Intersect og Undtagen, men der er ingen ækvivalenter for Union.
Underforespørgsler
Underforespørgsler kaldes undertiden indlejrede forespørgsler. De er forespørgsler, der er defineret i andre forespørgsler. Underforespørgsler kan være forvirrende. Jeg tror, at meget af dette stammer fra det faktum, at de kan bruges mange steder i en SQL select-sætning, og til flere formål!
For eksempel er her nogle områder, du kan se en underforespørgsel:
- SELECT-sætning – Bruges til at returnere en værdi. For eksempel, hvis du forespørger om en salgstabel, kan du medtage det samlede salg ved at returnere en sum af alt salg fra en underforespørgsel.
- WHERE-klausul – Underforespørgsler kan bruges i hvor-klausulen i sammenligninger. Du kan oprette en sammenligning for at sammenligne salget med det samlede gennemsnit. Det samlede gennemsnit returneres fra en underforespørgsel. Du kan også bruge underforespørgsler i medlemsoperatører som IN. I stedet for at hårdkode in-klausulen kan du bruge en underforespørgsel til at gøre den mere dynamisk.
- HAVING-klausul – En enkelt værdi fra en underforespørgsel er inkluderet i HAVING-klausulens sammenligninger.
Eksempel på underforespørgsel
SELECT SalesOrderID, LineTotal, (SELECT AVG(LineTotal) FROM Sales.SalesOrderDetail) AS AverageLineTotalFROM Sales.SalesOrderDetail
Når det bruges i udvalgte klausuler og sammenligningsoperatorer som lig med, større end og mindre end , kan en underforespørgsel kun returnere en række. Hvis det bruges sammen med en medlemsoperatør, såsom IN, er det OK for forespørgslen at returnere en eller flere rækker.