Gebruik een SQL INNER JOIN wanneer u rijen uit twee tabellen wilt matchen. Rijen die overeenkomen blijven in het resultaat, degenen die niet worden afgewezen. De wedstrijdvoorwaarde wordt vaak de joinvoorwaarde genoemd. Wanneer de wedstrijdvoorwaarden gelijkheid impliceren, dat is precies overeenkomen met de inhoud van de ene kolom naar de andere, wordt de SQL inner join een equijoin genoemd. U zult merken dat de meeste joins die u zult gebruiken equijoins zijn. Een veel voorkomende situatie is waar je nodig hebt om de primaire sleutel van een tabel toe te voegen aan de buitenlandse sleutel van een andere., Dit heb je nodig als je data denormaliseert.
Opmerking: De reeks begint met het artikel Inleiding tot Database Joins. Alle voorbeelden voor deze les zijn gebaseerd op Microsoft SQL Server Management Studio en de AdventureWorks2012 database. Aan de slag met deze gratis tools met my Guide Aan de slag met SQL Server. In dit artikel gaan we innerlijke joins behandelen.
basisstructuur van een SQL INNER JOIN
Hieronder is een voorbeeld van een eenvoudig SELECT statement met een INNER JOIN clausule.,
SELECT columnlistFROM maintableINNER JOIN secondtable ON join condition
Overweeg of u een map met mensen en hun telefoonnummers wilt maken. Om dit te doen moet je rijen van de persoon en PersonPhone tafels te combineren.
De SQL om dit te doen is:
SELECT Person.FirstName, Person.LastName, PersonPhone.PhoneNumber FROM Person.Person INNER JOIN Person.PersonPhone ON Person.BusinessEntityID = PersonPhone.BusinessEntityID
Dit type join wordt een equi-join genoemd, omdat we een gelijkheid gebruiken voor de Join-voorwaarde. Het is vrij veilig om te zeggen dat de overgrote meerderheid van de joins die je tegenkomt equi-joins zijn., Er zijn speciale omstandigheden waar het zinvol is om andere vergelijkingen te gebruiken, zoals niet gelijk is aan of groter is dan. Dat soort joins, genaamd non equi-joins, worden later in dit bericht onderzocht. Zodra de gegevens zijn samengevoegd kan het ook worden gefilterd en gesorteerd met behulp van vertrouwde waar en volgorde op clausules. De volgorde van de clausules is wat u zou kunnen verwachten:
SELECT columnlistFROM maintableINNER JOIN secondtable ON join conditionWHERE filter conditionORDER BY columnlist
De waar-clausule kan verwijzen naar een van de velden uit de samengevoegde tabellen. Om duidelijk te zijn, is het het beste om de kolommen met de tabelnaam voor te voegen. Hetzelfde geldt voor sorteren., Gebruik elk veld; het is echter gebruikelijk om te sorteren op een of meer velden die u selecteert. Laten we onze telefoon directory nemen, maar alleen de lijst van mensen, in volgorde van achternaam, degenen wiens achternaam begint met C. Met deze eis in het achterhoofd, onze SQL statement wordt:
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
merk op dat de join voorwaarde blijft hetzelfde. De enige wijzigingen zijn de toevoeging van de waar en volgorde door clausules. Deze zullen je nu wel bekend zijn.
Tabelaliassen maken SQL-Joins gemakkelijker te lezen
naarmate u ingewikkelder SQL-statements maakt, kunnen ze moeilijk te lezen worden., Veel van dit is te wijten aan de uitgebreide (langdradige) aard van de taal. U kunt bezuinigen op een aantal van deze door het gebruik van een andere naam voor uw tabellen in statements. Gebruik hiervoor tabelaliassen. Denk aan aliassen als bijnamen. Gelukkig is het gemakkelijk om aliassen te definiëren! Plaats ze gewoon na de eerste referentie van de tabelnaam. Hier is een eenvoudig voorbeeld waar we de Persoonentabel als P alias:
SELECT P.FirstName, P.LastName FROM Person.Person AS P
in dit voorbeeld gebruikten we de letter P. Het kan echt elk aantal tekens zijn, maar ik hou aliassen graag eenvoudig. Waar aliassen echt van pas komen is met joins., Laten we de laatste join we deden, maar deze keer schrijven door aliasing persoon als P en PersonPhone als PP. Hier is het statement
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
met betrekking tot naamgeving, ik veronderstel dat je je tabellen A, B,C zou kunnen alias,maar het kan moeilijk worden om de aliassen te onthouden. Mijn systeem om de aliassen kort te houden, maar makkelijk te onthouden, is het gebruik van de eerste letter van de tabel. Als de tabel twee woorden heeft, zoals PersonPhone, gebruik ik meestal de eerste letter van elk woord.,
SQL INNER Join met meer dan één veld
in sommige gevallen kunt u merken dat u een SQL INNER JOIN op twee of meer velden moet gebruiken. Dit gebeurt wanneer de primaire sleutel van een tabel uit twee of meer kolommen bestaat. Gebruik de en operator om join voorwaarden te koppelen. Door te “zeggen” moeten beide kolommen overeenkomen om de join verder te laten gaan…
overweeg een voorbeeld waarin we alle dagen en tijden willen weten waarop elke instructeur een les geeft., In ons voorbeeld is de primaire sleutel voor de Class tabel twee velden: ClassName en Instructor. Om het schema te construeren moeten we lid worden van Class to Section door zowel klassennaam als instructeur te matchen.
Opmerking: dit voorbeeld werkt niet in de AdventureWorks2012 database
bij het maken van interne joins is het belangrijk om aandacht te besteden aan uw gegevens. In ons voorbeeld, als we per ongeluk lid zijn geworden van de klasse met de Sectietabel met alleen de ClassName kolom, dan zou de klassenlijst van elke instructie ook schema ‘ s bevatten van andere instructies die dezelfde klasse onderwijzen., Een innerlijke join komt overeen met zoveel rijen als het kan tussen tabellen. Combinaties van rijen zijn opgenomen in het resultaat zolang aan de join-voorwaarde is voldaan.
bij het plannen van uw joins, bestudeer de primaire sleuteldefinities van elke tabel om te begrijpen hoe tabellen zich tot elkaar verhouden.
samenvoegen van drie of meer tabellen
in de database AdventureWorks2012 moet u deelnemen aan de tabel met telefoonnummers om te weten of een vermeld telefoonnummer een thuis -, cel-of kantoornummer is. Om een directory met namen, telefoonnummertypen en nummers te maken, moeten drie tabellen worden samengevoegd., Hier is de relatie:
Het opnemen van een andere tabel in onze query is zo eenvoudig als het toevoegen van een andere innerlijke JOIN-clausule aan ons statement.
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
Ik denk niet dat er een harde fast regel is om de join clausule te formatteren, ik heb de neiging om ze te scheiden op hun eigen regels en bij het specificeren van de kolommen, plaats de “join from” kolom eerst, als:
INNER JOINToTableOn FromTable.PKID = ToTable.FKID
voor alle voorbeelden in dit artikel schreef ik eerst het statement en gebruikte vervolgens TidySQL om ze automatisch te formatteren.,
Self-Join
een self-join is wanneer u een tabel aan zichzelf toevoegt. Wanneer u een self-join gebruiken is het belangrijk om alias de tabel. Stel dat we alle afdelingen binnen een afdelingsgroep willen opsommen. U kunt een self-join gebruiken om dit te doen:
SELECT D1.Name, D2.Name FROM HumanResources.Department AS D1 INNER JOIN HumanResources.Department AS D2 ON d1.GroupName = d2.GroupName
aangezien de Afdelingstabel met zichzelf wordt verbonden, moeten we de twee instanties van afdeling onderscheiden. Ze zijn aliased als D1 en D2. Behalve dat de tabellen hetzelfde zijn, zie je dat er niets opmerkelijks is aan dit type join.,
niet-Equi-Joins
een niet-Equi-join is gewoon een mooie manier om te zeggen dat uw join-voorwaarde geen gelijkteken heeft. Je kan krabben je hoofd af waarom je zou willen gebruiken een niet equi-join. Ik ben het eens, om eerlijk te zijn, het kan moeilijk zijn om te bedenken voorbeelden; echter, ze bestaan, en je zult waarderen te weten hoe ze te gebruiken wanneer je nodig hebt om dit te doen. Een reden om een niet-Equi-join te gebruiken is wanneer je moet controleren of je schone gegevens hebt. Overweeg de AdventureWorks2012 Productentabel. Controleer of de productnaam uniek is voor elk vermeld product., Een manier om dit te doen is om zelf-toetreden tot de producttabel op naam.
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
Met deze query kunnen we waarden vergelijken voor elke rij die overeenkomt met de productnaam. Als de naam uniek is, dan zijn de enige matches die je moet hebben wanneer de ProductID ‘ s gelijk zijn. Dus, als we op zoek zijn naar dubbele Productnaam, volgt daaruit dat we records willen vinden die overeenkomen met verschillende ProductID ‘ s., Dit wordt getoond in het onderstaande diagram
De SQL om de dubbele records te retourneren is:
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
u kunt zich afvragen wat er als eerste gebeurt. Komt de computer eerst overeen met de namen en dan, zodra dat is voltooid zoekt naar ProductID ‘ s die niet overeenkomen, of is een of andere manier evalueren beide voorwaarden als het bouwt het resultaat? Het mooie van SQL is dat, in theorie, de manier waarop je je code schrijft geen invloed zou moeten hebben op hoe de database de data daadwerkelijk opvraagt. De volgorde van de joins of Voorwaarden mag niet significant invloed hebben op de tijd dat een query wordt uitgevoerd., Dit zal allemaal worden onderzocht wanneer we praten over de query optimize en hoe je query plannen te bekijken.