använd en SQL INNER JOIN när du behöver matcha rader från två tabeller. Rader som matchar förblir i resultatet, de som inte avvisas. Matchförhållandet kallas vanligen join condition. När matchningsvillkoren innebär jämlikhet, som matchar exakt innehållet i en kolumn till en annan, kallas sql inner join en equijoin. Du kommer att upptäcka att de flesta av de kopplingar du använder är equijoins. En vanlig situation är där du måste gå med i huvudnyckeln i ett bord till en annan utländsk nyckel., Du behöver detta när du denormaliserar data.
Obs! serien börjar med artikelintroduktionen till databasanslutningar. Alla exempel i den här lektionen är baserad på Microsoft SQL Server Management Studio och AdventureWorks2012 databas. Kom igång med dessa gratis verktyg med min Guide komma igång med SQL Server. I den här artikeln kommer vi att täcka inre kopplingar.
grundläggande struktur för en SQL INNER JOIN
nedan är ett exempel på simple select-sats med en Inner JOIN-klausul.,
SELECT columnlistFROM maintableINNER JOIN secondtable ON join condition
fundera på om du vill skapa en katalog med personer och deras telefonnummer. För att göra det måste du kombinera rader från personen och Personentelefonbord.
SQL för att göra detta är:
SELECT Person.FirstName, Person.LastName, PersonPhone.PhoneNumber FROM Person.Person INNER JOIN Person.PersonPhone ON Person.BusinessEntityID = PersonPhone.BusinessEntityID
denna typ av koppling kallas en equi-join, eftersom vi använder en jämlikhet för kopplingsförhållandet. Det är ganska säkert att säga att den stora majoriteten av de kopplingar du möter är equi-joins., Det finns särskilda omständigheter där det är vettigt att använda andra jämförelser som inte är lika med eller större än. Dessa typer av kopplingar, som kallas icke equi-joins, utforskas senare i det här inlägget. När data är sammanfogade kan det också filtreras och sorteras med bekant var och ordning efter klausuler. Ordningen på klausulerna är vad du kan förvänta dig:
SELECT columnlistFROM maintableINNER JOIN secondtable ON join conditionWHERE filter conditionORDER BY columnlist
WHERE-klausulen kan hänvisa till något av fälten från de kopplade tabellerna. För att vara tydlig är det bästa praxis att prefix kolumnerna med tabellnamnet. Detsamma gäller för sortering., Använd vilket fält som helst, men det är vanligt att Sortera efter ett eller flera fält du väljer. Låt oss ta vår telefonkatalog, men bara lista personer, i storleksordningen efternamn, de vars efternamn börjar med C. Med detta krav i åtanke blir vår SQL-sats:
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
Lägg märke till att kopplingsförhållandet förblir detsamma. De enda ändringarna är tillägget av var och ORDER genom klausuler. Vid det här laget borde dessa vara bekanta för dig.
tabell Alias gör SQL går lättare att läsa
När du skapar mer komplicerade SQL-satser kan de bli svåra att läsa., Mycket är av detta beror på språkets ordliga (ordliga) natur. Du kan skära ner på en del av detta genom att använda ett annat namn för dina tabeller i uttalanden. Använd tabell alias för att göra det. Tänk på alias som smeknamn. Luckly är det lätt att definiera Alias! Placera dem bara efter den första referensen av tabellnamnet. Här är ett enkelt exempel där vi alias persontabellen som P:
SELECT P.FirstName, P.LastName FROM Person.Person AS P
i det här exemplet använde vi bokstaven P. det kan verkligen vara ett antal tecken, men jag gillar att hålla Alias enkla. Där Alias verkligen komma till hands är med fogar., Låt oss ta sista join vi gjorde, men den här gången skriva det genom att aliasing Person som P och PersonPhone som PP. Här är uttalandet
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 namngivning, antar jag att du kan alias dina tabeller, A,B,C, men det kan bli svårt att komma ihåg Alias. Mitt system att hålla Alias kort, men ändå lätt att komma ihåg, är det använda den första bokstaven i tabellen. Om tabellen har två ord, som PersonPhone, använder jag vanligtvis den första bokstaven i varje ord.,
SQL INNER Join med mer än ett fält
i vissa fall kan det hända att du behöver använda en SQL INNER JOIN på två eller flera fält. Detta händer när en tabells huvudnyckel består av två eller flera kolumner. Använd och operatören för att länka sammankopplingsförhållanden. Genom att använda och du ”säger” måste båda kolumnerna matcha för att anslutningen ska fortsätta…
överväga ett exempel där vi vill veta alla dagar och tider varje instruktör lär en klass., I vårt exempel är huvudnyckeln för Klasstabellen två fält: klassnamn och instruktör. För att konstruera schemat måste vi gå med i klass till sektion genom att matcha både klassnamn och instruktör.
Obs! Det här exemplet fungerar inte i AdventureWorks2012-databasen
När du skapar inre kopplingar är det viktigt att vara uppmärksam på dina data. I vårt exempel, om vi felaktigt gick med i klassen med Sektionstabellen med endast kolumnen klassnamn, skulle varje instruktions klasslista också innehålla scheman från andra instruktioner som undervisar samma klass., En inre koppling matchar så många rader som möjligt mellan tabeller. Kombinationer av rader ingår i resultatet så länge kopplingsförhållandet är uppfyllt.
När du planerar dina kopplingar, studera varje tabells primära nyckeldefinitioner för att förstå hur tabeller relaterar till varandra.
gå med i tre eller flera tabeller
i AdventureWorks2012-databasen måste du gå med i PhoneNumberType-tabellen för att veta om ett listat telefonnummer är ett hem -, cell-eller kontorsnummer. För att skapa en katalog med namn, telefonnummer typer och nummer tre tabeller måste sammanfogas., Här är relationen:
att inkludera en annan tabell i vår fråga är lika enkelt som att lägga till en annan Inner JOIN-klausul i vårt uttalande.
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
Jag tror inte att det finns någon hård snabb regel för hur du formaterar join-klausulen, jag tenderar att skilja dem på sina egna linjer och när du anger kolumnerna, placera ”join from” – kolumnen först, som:
INNER JOINToTableOn FromTable.PKID = ToTable.FKID
för alla exempel i den här artikeln skrev jag först uttalandet och använde sedan TidySQL för att automatiskt formatera dem.,
self-Join
en self-join är när du går med i en tabell till sig själv. När du använder en self-join är det viktigt att alias tabellen. Antag att vi ville lista alla avdelningar inom en avdelningsgrupp. Du kan använda en självkoppling för att göra detta:
SELECT D1.Name, D2.Name FROM HumanResources.Department AS D1 INNER JOIN HumanResources.Department AS D2 ON d1.GroupName = d2.GroupName
eftersom Avdelningstabellen är ansluten till sig själv måste vi skilja de två förekomsterna av Avdelningen. De är aliaserade som D1 och D2. Förutom att tabellerna är desamma ser du att det inte finns något anmärkningsvärt om denna typ av koppling.,
Non Equi-Joins
en icke equi-join är bara ett fint sätt att säga att ditt join-villkor inte har ett likhetstecken i det. Du kan skrapa huvudet undrar varför du vill använda en icke equi-gå. Jag håller med, för att vara ärlig, det kan vara svårt att tänka upp exempel; men de existerar, och du kommer att uppskatta att veta hur man använder dem när du behöver göra det. En anledning att använda en icke equi-join är när du behöver kontrollera att du har rena data. Tänk på AdventureWorks2012 produkter tabell. Kontrollera att produktnamnet är unikt för varje produkt som anges., Ett sätt att göra detta är att själv ansluta sig till produkttabellen på namn.
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
den här frågan låter oss jämföra värden för varje rad som matchar produktnamnet. Om namnet är unikt, då de enda matcher du bör ha är när ProductID är lika. Så, om vi letar efter dubbletter Produktnamn, följer det att vi vill hitta poster som matchar med olika ProductID s., Detta visas i diagrammet nedan
SQL för att returnera dubbla poster är:
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
Du kanske undrar vad som händer först. Matchar datorn först namnen och sedan, när det är klart letar efter ProductID som inte matchar, eller gör det på något sätt utvärdera båda villkoren eftersom det bygger resultatet? Skönheten i SQL är att, i teorin, hur du skriver din kod inte bör ha en inverkan på hur databasen faktiskt hämtar data. Ordningen för sammanfogningar eller villkor bör inte väsentligt påverka den tid en fråga körs., Allt detta kommer att utforskas när vi pratar om frågeoptimeringen och hur man granskar frågeplaner.