Bruke en SQL INDRE DELTA når du trenger å matche rader fra to tabeller. Rader som samsvarer forbli i resultatet og de som ikke er avvist. Kampen tilstanden er ofte kalt delta tilstand. Når kampen forhold innebære likestilling, som er like nøyaktig innholdet i en kolonne til en annen, sql indre delta kalles equijoin. Du vil finne at de fleste blir du vil bruke, er equijoins. En vanlig situasjon er der du trenger å bli med primærnøkkelen for en tabell til utenlandske nøkkelen til en annen., Du trenger dette når du er denormalizing data.
Merk: serien starter med artikkelen Innføring i Databasen Blir. Alle eksemplene for denne leksjonen er basert på Microsoft SQL Server Management Studio og AdventureWorks2012 database. Kom i gang ved å bruke disse gratis verktøy med min Guide Komme i Gang ved Hjelp av SQL Server. I denne artikkelen skal vi dekke indre sammenføyninger.
Grunnleggende Strukturen i en SQL-INNER JOIN
Nedenfor er et eksempel på enkelt velge uttalelse med en INNER JOIN-setningsdel.,
SELECT columnlistFROM maintableINNER JOIN secondtable ON join condition
Vurdere hvis du ønsker å lage en katalog av mennesker og deres telefonnumre. For å gjøre så du nød å kombinere rader fra Personen og PersonPhone bord.
SQL å gjøre dette på er:
SELECT Person.FirstName, Person.LastName, PersonPhone.PhoneNumber FROM Person.Person INNER JOIN Person.PersonPhone ON Person.BusinessEntityID = PersonPhone.BusinessEntityID
Denne typen av delta er kalt en equi-bli med, siden vi bruker en likestilling for delta tilstand. Det er ganske trygt å si at de aller fleste blir du møter på, er equi-sammenføyninger., Det er spesielle omstendigheter der det er fornuftig å bruke andre sammenligninger som ikke er lik eller større enn det. Disse typer sammenføyninger, kalt ikke equi-møter, drøftes senere i dette innlegget. Når dataene er tilsluttet det kan også filtreres og sorteres ved å bruke kjente DER og BESTILLING AV klausuler. Rekkefølgen på punktene er hva du kan forvente:
SELECT columnlistFROM maintableINNER JOIN secondtable ON join conditionWHERE filter conditionORDER BY columnlist
WHERE-klausulen kan du se noen av feltene fra den sluttet bord. Å være tydelig, det er best å prefiks kolonner tabell med navn. Det samme gjelder for sortering., Bruk alle felt, men det er vanlig å sortere etter ett eller flere felt du velger. La oss ta våre telefonkatalogen, men bare til å liste opp folk, i rekkefølge etter etternavn, de som sist har navn som begynner med C. dette kravet i sinn, vår SQL-setningen blir:
SELECT Person.FirstName, Person.LastName, PersonPhone.PhoneNumber FROM Person.Person INNER JOIN Person.PersonPhone ON Person.BusinessEntityID = PersonPhone.BusinessEntityID WHERE Person.LastName LIKE 'C%' ORDER BY Person.LastName
Merke bli med tilstanden forblir den samme. De eneste endringene er i tillegg av HVOR og BESTILLING AV klausuler. Ved å nå disse bør være kjent for deg.
Tabell Aliaser gjøre SQL Blir Lettere å Lese
Som du kan opprette mer kompliserte SQL-setninger de kan bli vanskelig å lese., Mye av dette skyldes den detaljerte (snirklende) arten av språket. Du kan kutte ned på noe av dette ved å bruke et annet navn på tabeller i uttalelser. Bruk tabellen aliaser til å gjøre det. Tenk på aliaser som kallenavn. Luckly er det lett å definere Aliaser! Bare plassere dem etter den første referansen i tabellen navn. Her er et enkelt eksempel der vi alias Personen tabell som P:
SELECT P.FirstName, P.LastName FROM Person.Person AS P
I dette eksempelet har vi brukt bokstaven P. kan Det virkelig være hvilket som helst antall tegn, men jeg liker å holde aliaser enkel. Hvor aliaser virkelig kommer i hendig er med sammenføyninger., La oss ta vare delta som vi gjorde, men denne gangen skrive det av aliasing Person som P og PersonPhone som PP. Her er uttalelsen
SELECT P.FirstName, P.LastName, PP.PhoneNumber FROM Person.Person AS P INNER JOIN Person.PersonPhone AS PP ON P.BusinessEntityID = PP.BusinessEntityID WHERE P.LastName LIKE 'C%' ORDER BY P.LastName
Om navngiving, jeg antar at du kan aliaset ditt bord, A,B,C, men det kan bli vanskelig å huske aliaser. Mitt system for å holde aliaser kort, men enkelt å huske, er det bruk den første bokstaven i tabellen. Hvis tabellen har to ord, som PersonPhone, jeg vil vanligvis bruke den første bokstaven i hvert ord.,
SQL INDRE Delta med Mer enn Ett Felt
I noen tilfeller kan du finne det at du må bruke en SQL-INDRE DELTA på to eller flere felt. Dette skjer når en tabell er primærnøkkelen består av to eller flere kolonner. Bruker OG operatør koblingen bli med betingelser. Ved å bruke OG du «sier» begge kolonner må matche for å bli med å gå videre…
se på et eksempel der vi ønsker å vite alle dager og tider hver instruktør som underviser en klasse., I vårt eksempel primærnøkkel for Klassen tabellen er i to områder: ClassName og Instruktør. Å konstruere den planen vi trenger for å bli med i Klassen Delen av matchende både ClassName og Instruktør.
Merk: Dette eksempelet vil ikke fungere i AdventureWorks2012 databasen
Når du oppretter indre sammenføyninger det er viktig å ta hensyn til dine data. I vårt eksempel, hvis vi ved en feiltakelse ble med i Klasse med den Delen tabellen med bare ClassName-kolonnen, og deretter hver instruksjon er klassen oppføringen vil også omfatte tidsplaner fra andre instruksjoner som underviser i samme klasse., En indre delta i kamper så mange rader som det kan mellom tabeller. Kombinasjoner av rader som er inkludert i resultatet så lenge delta tilstanden er fornøyd.
Når du planlegger din blir, studere hver tabell er primærnøkkel definisjoner for å forstå hvordan tabeller forholder seg til hverandre.
Bli med Tre eller Flere Tabeller
I AdventureWorks2012 database, trenger du å bli med til PhoneNumberType bordet for å vite om en oppført telefonnummer er et hjem, celle, eller office-nummeret. For å opprette en katalog med navn, telefonnummer typer, og nummer tre bord må være koblet sammen., Her er forholdet:
Inkludert et annet bord i vår spørring er så enkelt som å legge en annen INNER JOIN-setningsdel til vår uttalelse.
SELECT P.FirstName, P.LastName, PP.PhoneNumber, PT.NameFROM Person.Person AS P INNER JOIN Person.PersonPhone AS PP ON P.BusinessEntityID = PP.BusinessEntityID INNER JOIN Person.PhoneNumberType AS PT ON PP.PhoneNumberTypeID = PT.PhoneNumberTypeIDWHERE P.LastName LIKE 'C%'ORDER BY P.LastName
jeg tror ikke det er noen harde fast regel for hvordan du formaterer join-setningsdel, jeg har en tendens til å skille dem på sine egne linjer, og når du angir kolonner, plasserer «bli med fra» kolonne først, slik:
INNER JOINToTableOn FromTable.PKID = ToTable.FKID
For alle eksemplene i denne artikkelen, Første gang jeg skrev den setningen, og deretter brukt TidySQL å automatisk formatere dem.,
Selv-Bli med
En selv-bli med er når du setter deg ved et bord for seg selv. Når du bruker en selv-bli med, er det viktig å alias bordet. Anta at vi ønsket å liste alle avdelinger innenfor en avdeling gruppen. Du kan bruke en selv-bli med å gjøre dette:
SELECT D1.Name, D2.Name FROM HumanResources.Department AS D1 INNER JOIN HumanResources.Department AS D2 ON d1.GroupName = d2.GroupName
Siden Department tabellen blir sluttet seg til seg selv, vi må skille mellom to forekomster av Avdelingen. De er aliased som D1 og D2. Andre enn den bord blir det samme, du ser, det er ikke noe bemerkelsesverdig om denne typen bli med.,
Ikke Equi-Tiltrer
En ikke equi-bli med er bare en fancy måte å si din bli med tilstand som ikke har likhetstegn i det. Kan du være skrape hodet og lurer på hvorfor du ønsker å bruke ikke equi-bli med. Jeg er enig i, for å være ærlig, det kan være vanskelig å tenke seg eksempler, men de finnes, og du vil sette pris på å vite hvordan du bruker dem når du trenger å gjøre det. En grunn til å bruke en ikke equi-bli med er når du trenger å bekrefte at du har rene data. Vurdere AdventureWorks2012 Produkter bordet. Kontroller at navnet på produktet er unikt for hvert produkt er oppført., En måte å gjøre dette på er å selv bli med produktet bord på Navn.
SELECT P1.ProductID, P1.Name FROM Production.Product AS P1 INNER JOIN Production.Product AS P2 ON P1.Name = P2.Name ORDER BY P1.ProductNumber
Dette søket gir oss mulighet til å sammenligne verdiene for hver rad som samsvarer med Navnet på Produktet. Hvis Navnet er unikt, da det eneste kampene du bør ha er når ProductID er like. Så, hvis vi er ute etter dupliserte Produkt Navn, følger det at vi vil finne poster som samsvarer med ulike ProductID-tallet., Dette er vist i diagrammet nedenfor
SQL å returnere duplikatoppføringer er:
SELECT P1.ProductID, P1.Name, P1.ProductNumberFROM Production.Product AS P1 INNER JOIN Production.Product AS P2 ON P1.Name = P2.Name AND P1.ProductID <> P2.ProductIDORDER BY P1.ProductNumber
lurer Du kanskje på hva som skjer først. Gjør datamaskinen første kampen navn og så, når det er ferdig ser for ProductID er som ikke stemmer, eller ikke er noe å vurdere både forhold som det bygger resultatet? Skjønnheten av SQL er det, i teorien, måten du skriver koden må ikke ha en påvirkning på hvordan databasen faktisk henter data. Rekkefølgen på skjøter eller forhold bør ikke betydelig innflytelse tiden en spørring kjøres., Dette vil bli undersøkt når vi snakker om spørringen optimalisere og hvordan å skrive en anmeldelse spørring planer.