sql >> Database >  >> RDS >> Sqlserver

Een overzicht van SQL Join-types met voorbeelden

SQL JOIN is een clausule die wordt gebruikt om meerdere tabellen te combineren en gegevens op te halen op basis van een gemeenschappelijk veld in relationele databases. Databaseprofessionals gebruiken normalisaties om de gegevensintegriteit te waarborgen en te verbeteren. In de verschillende normalisatievormen worden gegevens verdeeld in meerdere logische tabellen. Deze tabellen gebruiken referentiële beperkingen - primaire sleutel en externe sleutels - om de gegevensintegriteit in SQL Server-tabellen af ​​te dwingen. In de onderstaande afbeelding krijgen we een glimp van het normalisatieproces van de database.

De verschillende typen SQL JOIN begrijpen

SQL JOIN genereert zinvolle gegevens door meerdere relationele tabellen te combineren. Deze tabellen zijn gerelateerd met behulp van een sleutel en hebben een-op-een- of een-op-veel-relaties. Om de juiste gegevens op te halen, moet u de gegevensvereisten en de juiste verbindingsmechanismen kennen. SQL Server ondersteunt meerdere joins en elke methode heeft een specifieke manier om gegevens uit meerdere tabellen op te halen. De onderstaande afbeelding geeft de ondersteunde SQL Server-joins aan.

SQL inner join

De SQL inner join bevat rijen uit de tabellen waar aan de join-voorwaarden is voldaan. In het onderstaande Venn-diagram retourneert inner join bijvoorbeeld de overeenkomende rijen uit Tabel A en Tabel B.

Let in het onderstaande voorbeeld op de volgende dingen:

  • We hebben twee tabellen:[Werknemers] en [Adres].
  • De SQL-query wordt samengevoegd in de kolommen [Employees].[EmpID] en [Address].[ID].

De uitvoer van de query retourneert de werknemersrecords voor EmpID die in beide tabellen voorkomen.

De inner join retourneert overeenkomende rijen uit beide tabellen; daarom is het ook bekend als Equi join. Als we het inner keyword niet specificeren, voert SQL Server de inner join-bewerking uit.

In een ander type inner join, een theta join, gebruiken we de gelijkheidsoperator (=) niet in de ON-clausule. In plaats daarvan gebruiken we niet-gelijkheidsoperatoren zoals .

SELECTEER * UIT Tabel1 T1, Tabel2 T2 WAAR T1.Prijs

SQL self-join

In een self-join voegt SQL Server zich bij de tabel met zichzelf. Dit betekent dat de tabelnaam twee keer voorkomt in de from-clausule.

Hieronder hebben we een tabel [Emp] die zowel werknemers als de gegevens van hun managers bevat. De self-join is handig voor het opvragen van hiërarchische gegevens. In de werknemerstabel kunnen we bijvoorbeeld self-join gebruiken om de naam van elke werknemer en hun rapporterende manager te leren.

De bovenstaande query plaatst een self-join op de [Emp]-tabel. Het voegt de kolom EmpMgrID samen met de kolom EmpID en retourneert de overeenkomende rijen.

SQL cross-join

In de cross join retourneert SQL Server een Cartesiaans product uit beide tabellen. In de onderstaande afbeelding hebben we bijvoorbeeld een cross-join uitgevoerd voor tabel A en B.

De cross join verbindt elke rij van tabel A met elke beschikbare rij in tabel B. Daarom wordt de uitvoer ook wel een cartesiaans product van beide tabellen genoemd. Let in de onderstaande afbeelding op het volgende:

  • Tabel [Werknemer] heeft drie rijen voor Werknemer-ID 1,2 en 3.
  • Tabel [Adres] heeft records voor Emp-ID 1,2,7 en 8.

In de cross-join-uitvoer voegt rij 1 van de [Werknemer]-tabel zich samen met alle rijen van de [Adres]-tabel en volgt hetzelfde patroon voor de overige rijen.

Als de eerste tabel x aantal rijen heeft en de tweede tabel n aantal rijen heeft, geeft cross join x*n aantal rijen in de uitvoer. U moet cross-join op grotere tabellen vermijden, omdat het een groot aantal records kan retourneren en SQL Server veel rekenkracht (CPU, geheugen en IO) vereist voor het verwerken van dergelijke uitgebreide gegevens.

SQL outer join

Zoals we eerder hebben uitgelegd, retourneert de inner join de overeenkomende rijen van beide tabellen. Wanneer u een SQL outer join gebruikt, worden niet alleen de overeenkomende rijen weergegeven, maar worden ook de niet-overeenkomende rijen uit de andere tabellen geretourneerd. De niet-overeenkomende rij is afhankelijk van de linker-, rechter- of volledige zoekwoorden.

De onderstaande afbeelding beschrijft op hoog niveau de linker, rechter en volledige outer join.

Linker buitenste join

SQL left outer join retourneert de overeenkomende rijen van beide tabellen samen met de niet-overeenkomende rijen uit de linkertabel. Als een record uit de linkertabel geen overeenkomende rijen in de rechtertabel heeft, wordt de record weergegeven met NULL-waarden.

In het onderstaande voorbeeld retourneert de linker outer join de volgende rijen:

  • Overeenkomende rijen:Emp-ID 1 en 2 komen voor in zowel de linker- als de rechtertabel.
  • Niet-overeenkomende rij:Werkgever-ID 3 bestaat niet in de rechtertabel. Daarom hebben we een NULL-waarde in de uitvoer van de query.

Rechter buitenste join

SQL right outer join retourneert de overeenkomende rijen van beide tabellen samen met de niet-overeenkomende rijen uit de rechtertabel. Als een record uit de rechtertabel geen overeenkomende rijen in de linkertabel heeft, wordt de record weergegeven met NULL-waarden.

In het onderstaande voorbeeld hebben we de volgende uitvoerrijen:

  • Overeenkomende rijen:Emp ID 1 en 2 bestaat in beide tabellen; daarom zijn deze rijen overeenkomende rijen.
  • Niet-overeenkomende rijen:in de rechtertabel hebben we extra rijen voor Emp ID 7 en 8, maar deze rijen zijn niet beschikbaar in de linkertabel. Daarom krijgen we een NULL-waarde in de rechter outer join voor deze rijen.

Volledige outer join

Een volledige outer join retourneert de volgende rijen in de uitvoer:

  • Overeenkomende rijen tussen twee tabellen.
  • Niet-overeenkomende rijen vergelijkbaar met linker outer join:NULL-waarden voor niet-overeenkomende rijen uit de rechtertabel.
  • Niet-overeenkomende rijen vergelijkbaar met rechter outer join:null-waarden voor niet-overeenkomende rijen uit de linkertabel.

SQL joins met meerdere tabellen

In de vorige voorbeelden gebruiken we twee tabellen in een SQL-query om samenvoegbewerkingen uit te voeren. Meestal voegen we meerdere tabellen samen en het geeft de relevante gegevens terug.

De onderstaande query gebruikt meerdere inner joins.

USE [AdventureWorks2019]
GO
SELECT 
e.[BusinessEntityID] 
,p.[FirstName] 
,p.[MiddleName] 
,p.[LastName] 
,e.[JobTitle]
,d.[Name] AS [Department] 
,d.[GroupName] 
,edh.[StartDate] 
FROM [HumanResources].[Employee] e
INNER JOIN [Person].[Person] p
ON p.[BusinessEntityID] = e.[BusinessEntityID]
INNER JOIN [HumanResources].[EmployeeDepartmentHistory] edh 
ON e.[BusinessEntityID] = edh.[BusinessEntityID] 
INNER JOIN [HumanResources].[Department] d 
ON edh.[DepartmentID] = d.[DepartmentID] 
WHERE edh.EndDate IS NULL
GO

Laten we de zoekopdracht in de volgende stappen analyseren:

  • Tussenresultaat 1:  De eerste inner join is tussen [HumanResources].[Employees] en [Person].[Person]-tabel.
  • Tussenresultaat 2:  Innerlijke join tussen de tabel [Tussenresultaat 1] en [HumanResources].[EmployeeDepartmentHistory].
  • Tussenresultaat 3:  Inner join tussen de [Tussenresultaat 2] en [HumanResources].[Department] tabel.

Nadat u de query met meerdere joins heeft uitgevoerd, stelt Query Optimizer het uitvoeringsplan op. Het bereidt een kostengeoptimaliseerd uitvoeringsplan voor dat voldoet aan de join-voorwaarden met resourcegebruik - in het onderstaande werkelijke uitvoeringsplan kunnen we bijvoorbeeld kijken naar meerdere geneste lussen (inner join) en hash-match (inner join) waarbij gegevens uit meerdere samenvoegtabellen worden gecombineerd .

NULL-waarden en SQL-joins

Stel dat we NULL-waarden in de tabelkolommen hebben, en we voegen de tabellen in die kolommen samen. Komt SQL Server overeen met NULL-waarden?

De NULL-waarden komen niet met elkaar overeen. Daarom kan SQL Server de overeenkomende rij niet retourneren. In het onderstaande voorbeeld hebben we NULL in de kolom EmpID van de tabel [Employees]. Daarom retourneert het in de uitvoer alleen de overeenkomende rij voor [EmpID] 2.

We kunnen deze NULL-rij in de uitvoer krijgen in het geval van een SQL outer join omdat het ook de niet-overeenkomende rijen retourneert.

SQL sluit zich aan bij best practices

In dit artikel hebben we de verschillende typen SQL-join onderzocht. Hier zijn een paar belangrijke best practices om te onthouden en toe te passen bij het gebruik van SQL-joins.

  • Inner joins geven de overeenkomende rijen uit de join-voorwaarde in beide tabellen weer.
  • Cross join geeft het cartesiaanse product van beide tabellen terug.
  • Outer join retourneert de overeenkomende en niet-overeenkomende rijen, afhankelijk van de linker-, rechter- en volledige zoekwoorden.
  • SQL self-join voegt een tabel toe aan zichzelf.
  • U moet altijd een tabelalias gebruiken als u de joins in de query's gebruikt.
  • Gebruik altijd de tweedelige naam [tabelalias].[kolom] naamnotatie voor kolommen in query's.
  • In het geval van meerdere SQL-joins in een query, moet u de logische volgorde van de tabellen gebruiken om aan uw gegevensbehoefte te voldoen en de gegevensstroom tussen verschillende operators van het uitvoeringsplan te minimaliseren.
  • Je kunt meerdere joins combineren, zoals inner join, outer join en self-join. U moet echter de joins en hun bestellingen gebruiken om de vereiste gegevens te krijgen.

  1. MySQL varchar-indexlengte

  2. VERWIJDEREN VS DROP in SQL

  3. Impact van uitvoeringsplan op ASYNC_NETWORK_IO Wachten - Deel 1

  4. Geen ondersteuning voor OVER in MS SQL Server 2005?