Hvordan kombinerer jeg resultater fra flere SQL-tabeller (hint: det er tre måter)
Mange ganger i en relasjonsdatabase er informasjonen du vil vise i spørringen din i mer enn ett bord. Dette vekker spørsmålet «Hvordan kombinerer du resultater fra mer enn én tabell?»
Alle eksemplene for denne leksjonen er basert på Microsoft SQL Server Management Studio og AdventureWorks2012-databasen. Du kan komme i gang med disse gratis verktøy ved hjelp av veiledningen Komme i gang med SQL Server.
Hva er måtene jeg kan kombinere resultater fra mer enn ett spørsmål?
SQL ville ikke være et veldig nyttig språk hvis det ikke gjorde det Det er ikke enkelt å kombinere resultater fra mer enn ett spørsmål. Heldigvis er det tre hovedmåter du kan kombinere data fra flere tabeller på. Vi går kort over dette og gir lenker til mer inngående artikler.
Tre hovedmåter for å kombinere data
Data i relasjonelle databasetabeller er organisert i rader og kolonner. Når vi undersøker måter å kombinere data på, må du huske at sluttresultatet blir å enten legg til flere kolonner i et resultat, kanskje fra en annen relatert tabell, eller rader, ved å ta et sett med rader fra to eller flere tabeller s.
Når folk flest lærer å kombinere data de lærer om:
- JOIN – Du kan bruke joins for å kombinere kolonner fra ett eller flere spørsmål til ett resultat.
- UNION – Bruk Unions og andre settoperatører til å kombinere rader fra ett eller flere spørsmål til ett resultat.
- Sub Queries – Noen ganger kalt nestede spørsmål, disse kan brukes til å utføre et eget søk i databasen viste at resultatene kan brukes i et annet spørsmål.
Skjøter
Jeg liker å tenke på sammenføyninger som limet som setter databasen sammen igjen. Relasjonsdatabaser normaliseres vanligvis for å gjøre dataene enklere å vedlikeholde og forbedre ytelsen, men sluttresultatet er at informasjon er delt inn i mange tabeller. Du kan bruke Joins til å kombinere den informasjonen sammen til et mer leselig format. Dataene rekombineres ved å matche kolonner fra hver tabell.
I alle tilfeller krever sammenføyninger to hovedingredienser: To tabeller og en sammenføyningsbetingelse. Tabellene er det vi skal bruke til å trekke radene og kolonnene, og sammenkoblingsbetingelsen er hvordan vi har tenkt å matche kolonnene mellom tabellene.
Eksempel JOIN
SELECT Person.FirstName, Person.LastName, PersonPhone.PhoneNumber FROM Person.Person INNER JOIN Person.PersonPhone ON Person.BusinessEntityID = PersonPhone.BusinessEntityID
Det er to hovedtyper av sammenføyninger. Inner Joins and Yuter Joins.
Inner Joins returnerer bare en resulterende rad hvis sammenkoblingsbetingelsen stemmer overens i begge tabellene. Indre sammenføyninger brukes hovedsakelig til å matche den primære nøkkelen til en tabell, en fremmed nøkkel i en annen.
Den andre typen sammenføyning er en ytre sammenføyning. Ytre sammenføyninger returnerer alltid minst én rad for hovedtabellen, referert til som venstre eller høyre tabell, og nullverdier i de tilsvarende kolonnene i kolonnen som ikke samsvarer. Ytre sammenføyninger er nyttige for å finne data som ikke samsvarer.
Det er viktig å merke seg at sammenføyninger kan returnere flere rader enn det som finnes i begge tabeller til sammen. Sammenføyningene returnerer kombinasjoner av kamper. Hvis du blir med i to tabeller, den ene inneholder 5 rader og den andre 10, kan resultatet inneholde alt fra 0 til 50 rader, avhengig av sammenkoblingsbetingelsen.
Forbund
En UNION er brukes til å kombinere radene med to eller flere spørsmål til ett resultat. Unionen kalles en operatør.
Det er noen spesielle forhold som må oppstå for at en fagforening skal kunne fungere. Først må hvert søk ha samme antall kolonner. For det andre må datatypene til disse kolonnene være kompatible. Generelt sett må hvert spørsmål returnere samme antall og type kolonner.
Et praktisk eksempel på union er når to tabeller inneholder delenumre, og du vil lage en kombinert liste for en katalog. Du kan enten velge at sluttresultatet skal være en unik oppføring for den kombinerte spørringen, eller hvis du bruker UNION ALL, returnerer alle rader fra hver tabell.
Eksempel UNION
SELECT C.NameFROM Production.ProductCategory AS CUNIONSELECT S.NameFROM Production.ProductSubcategory AS S
I tillegg til Union er det et par andre nyttige settoperatører:
- INTERSECT – Du kan bruke dette til å bare returnere rader som er vanlige mellom to tabeller.
- UNNTATT – Du kan bruke dette til å returnere rader som finnes på ett bord, men som ikke finnes i et annet.
Når du fortsetter å lære mer SQL, finner du at du kan bruke sammenføyninger til å skrive ekvivalente utsagn for Intersect og Unntatt, men det er ingen ekvivalenter for Union.
Delspørringer
Delspørsmål kalles noen ganger nestede spørsmål. De er spørsmål definert i andre spørsmål. Delspørsmål kan være forvirrende. Jeg tror mye av dette stammer fra det faktum at de kan brukes mange steder i en SQL select-setning, og for flere formål!
For eksempel, her er noen områder du kan se et underspørsmål:
- SELECT-ledd – brukes til å returnere en verdi. Hvis du for eksempel spør etter en salgstabell, kan du inkludere det totale salget ved å returnere en sum av alt salg fra et underspørring.
- HVOR klausul – Delspørringer kan brukes i hvor-klausulen i sammenligninger. Du kan sette opp en sammenligning for å sammenligne salg med det totale gjennomsnittet. Det totale gjennomsnittet vil bli returnert fra en underspørsel. Du kan også bruke underspørringer i medlemsoperatører som IN. I stedet for hardkoding av in-klausulen, kan du bruke en underspørring for å gjøre den mer dynamisk.
- HAVING-klausul – En enkelt verdi fra en undersøk er inkludert i sammenligningen av HAVING-klausul.
Eksempel på underforespørsel
SELECT SalesOrderID, LineTotal, (SELECT AVG(LineTotal) FROM Sales.SalesOrderDetail) AS AverageLineTotalFROM Sales.SalesOrderDetail
Når det brukes i utvalgte ledd og sammenligningsoperatorer som lik, større enn og mindre enn , kan et underspørsel bare returnere en rad. Hvis det brukes sammen med en medlemsoperatør, for eksempel IN, er det OK at spørringen returnerer en eller flere rader.