Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Una panoramica dei tipi di join SQL con esempi

SQL JOIN è una clausola utilizzata per combinare più tabelle e recuperare dati in base a un campo comune nei database relazionali. I professionisti del database utilizzano le normalizzazioni per garantire e migliorare l'integrità dei dati. Nelle varie forme di normalizzazione, i dati sono distribuiti in più tabelle logiche. Queste tabelle usano vincoli referenziali, chiave primaria e chiavi esterne, per rafforzare l'integrità dei dati nelle tabelle di SQL Server. Nell'immagine sottostante, diamo uno sguardo al processo di normalizzazione del database.

Comprendere i diversi tipi di SQL JOIN

SQL JOIN genera dati significativi combinando più tabelle relazionali. Queste tabelle sono correlate tramite una chiave e hanno relazioni uno-a-uno o uno-a-molti. Per recuperare i dati corretti, è necessario conoscere i requisiti dei dati e i meccanismi di join corretti. SQL Server supporta più join e ogni metodo ha un modo specifico per recuperare i dati da più tabelle. L'immagine seguente specifica i join di SQL Server supportati.

Partecipazione interna a SQL

Il join interno SQL include le righe delle tabelle in cui sono soddisfatte le condizioni di join. Ad esempio, nel diagramma di Venn sottostante, inner join restituisce le righe corrispondenti dalla tabella A e dalla tabella B.

Nell'esempio seguente, nota le seguenti cose:

  • Abbiamo due tabelle:[Dipendenti] e [Indirizzo].
  • La query SQL viene unita nella colonna [Employees].[EmpID] e [Address].[ID].

L'output della query restituisce i record dei dipendenti per EmpID che esiste in entrambe le tabelle.

Il join interno restituisce le righe corrispondenti da entrambe le tabelle; pertanto, è anche noto come Equi join. Se non specifichiamo la parola chiave inner, SQL Server esegue l'operazione di inner join.

In un altro tipo di inner join, un theta join, non utilizziamo l'operatore di uguaglianza (=) nella clausola ON. Al contrario, utilizziamo operatori di non uguaglianza come .

SELEZIONA * DA Tabella1 T1, Tabella2 T2 DOVE T1.Prezzo

Accesso automatico a SQL

In un self-join, SQL Server si unisce alla tabella con se stesso. Ciò significa che il nome della tabella viene visualizzato due volte nella clausola from.

Di seguito, abbiamo una tabella [Emp] che contiene i dati dei dipendenti e dei loro manager. Il self-join è utile per interrogare i dati gerarchici. Ad esempio, nella tabella dei dipendenti, possiamo utilizzare l'adesione automatica per conoscere il nome di ciascun dipendente e del relativo responsabile dei rapporti.

La query precedente inserisce un self-join sulla tabella [Emp]. Unisce la colonna EmpMgrID con la colonna EmpID e restituisce le righe corrispondenti.

unione incrociata SQL

Nel cross join, SQL Server restituisce un prodotto cartesiano da entrambe le tabelle. Ad esempio, nell'immagine sottostante, abbiamo eseguito un cross-join per le tabelle A e B.

Il cross join unisce ogni riga della tabella A a ogni riga disponibile nella tabella B. Pertanto, l'output è anche noto come prodotto cartesiano di entrambe le tabelle. Nell'immagine sottostante, nota quanto segue:

  • La tabella [Employee] ha tre righe per Emp ID 1,2 e 3.
  • La tabella [Indirizzo] contiene record per Emp ID 1,2,7 e 8.

Nell'output di unione incrociata, la riga 1 della tabella [Dipendente] si unisce a tutte le righe della tabella [Indirizzo] e segue lo stesso schema per le righe rimanenti.

Se la prima tabella ha x numero di righe e la seconda tabella ha n numero di righe, il cross join fornisce x*n numero di righe nell'output. Dovresti evitare il cross join su tabelle più grandi perché potrebbe restituire un numero elevato di record e SQL Server richiede molta potenza di calcolo (CPU, memoria e IO) per gestire dati così estesi.

Join esterno SQL

Come spiegato in precedenza, il join interno restituisce le righe corrispondenti da entrambe le tabelle. Quando si utilizza un outer join SQL, non solo elenca le righe corrispondenti, ma restituisce anche le righe non corrispondenti dalle altre tabelle. La riga senza corrispondenza dipende dalle parole chiave sinistra, destra o completa.

L'immagine seguente descrive ad alto livello il join esterno sinistro, destro e completo.

Unisci esterno sinistro

Il join esterno sinistro SQL restituisce le righe corrispondenti di entrambe le tabelle insieme alle righe non corrispondenti della tabella di sinistra. Se un record della tabella di sinistra non ha righe corrispondenti nella tabella di destra, visualizza il record con valori NULL.

Nell'esempio seguente, il join esterno sinistro restituisce le seguenti righe:

  • Righe corrispondenti:l'Emp ID 1 e 2 è presente in entrambe le tabelle di sinistra e di destra.
  • Riga non corrispondente:Emp ID 3 non esiste nella tabella giusta. Pertanto, abbiamo un valore NULL nell'output della query.

Unione esterna destra

Il join esterno destro SQL restituisce le righe corrispondenti di entrambe le tabelle insieme alle righe non corrispondenti della tabella di destra. Se un record della tabella di destra non ha righe corrispondenti nella tabella di sinistra, visualizza il record con valori NULL.

Nell'esempio seguente, abbiamo le seguenti righe di output:

  • Righe corrispondenti:Emp ID 1 e 2 esiste in entrambe le tabelle; pertanto, queste righe sono righe abbinate.
  • Righe non corrispondenti:nella tabella di destra sono presenti righe aggiuntive per Emp ID 7 e 8, ma queste righe non sono disponibili nella tabella di sinistra. Pertanto, otteniamo il valore NULL nel join esterno destro per queste righe.

Full outer join

Un join esterno completo restituisce le seguenti righe nell'output:

  • Righe corrispondenti tra due tabelle.
  • Righe senza corrispondenza simili al join esterno sinistro:valori NULL per le righe senza corrispondenza della tabella di destra.
  • Righe senza corrispondenza simili al join esterno destro:valori Null per le righe senza corrispondenza della tabella di sinistra.

Unisce a SQL con più tabelle

Negli esempi precedenti, utilizziamo due tabelle in una query SQL per eseguire operazioni di join. Per lo più, uniamo più tabelle insieme e restituisce i dati rilevanti.

La query seguente utilizza più inner join.

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

Analizziamo la query nei seguenti passaggi:

  • Risultato intermedio 1:  Il primo inner join è tra la tabella [HumanResources].[Employees] e [Person].[Person].
  • Risultato intermedio 2:  Join interno tra il [Risultato intermedio 1] e la tabella [HumanResources].[EmployeeDepartmentHistory].
  • Risultato intermedio 3:  Join interno tra il [Risultato intermedio 2] e la tabella [Risorse umane].[Dipartimento].

Dopo aver eseguito la query con più join, Query Optimizer prepara il piano di esecuzione. Prepara un piano di esecuzione ottimizzato in termini di costi che soddisfa le condizioni di join con l'utilizzo delle risorse, ad esempio, nel piano di esecuzione effettivo di seguito, possiamo guardare più loop nidificati (inner join) e corrispondenze hash (inner join) che combinano i dati da più tabelle di join .

Valori NULL e join SQL

Supponiamo di avere valori NULL nelle colonne della tabella e uniamo le tabelle su quelle colonne. SQL Server corrisponde ai valori NULL?

I valori NULL non corrispondono tra loro. Pertanto, SQL Server non è stato in grado di restituire la riga corrispondente. Nell'esempio seguente, abbiamo NULL nella colonna EmpID della tabella [Employees]. Pertanto, nell'output, restituisce la riga corrispondente solo per [EmpID] 2.

Possiamo ottenere questa riga NULL nell'output in caso di un outer join SQL perché restituisce anche le righe non corrispondenti.

Best practice per l'adesione a SQL

In questo articolo, abbiamo esplorato i diversi tipi di join SQL. Di seguito sono riportate alcune best practice importanti da ricordare e applicare quando si utilizzano i join SQL.

  • I join interni generano le righe corrispondenti dalla condizione di join in entrambe le tabelle.
  • Cross join restituisce il prodotto cartesiano di entrambe le tabelle.
  • Outer join restituisce le righe corrispondenti e non corrispondenti a seconda delle parole chiave sinistra, destra e completa.
  • SQL self-join unisce una tabella a se stessa.
  • Dovresti sempre usare un alias di tabella mentre usi i join nelle query.
  • Utilizza sempre il nome in due parti [table alias].[colonna] formato del nome per le colonne nelle query.
  • Nel caso di più join SQL in una query, dovresti utilizzare gli ordini logici delle tabelle in modo tale da soddisfare la tua richiesta di dati e ridurre al minimo il flusso di dati tra i vari operatori del piano di esecuzione.
  • Puoi combinare più join come inner join, outer join e self-join insieme. Tuttavia, dovresti utilizzare i join e i loro ordini per ottenere i dati richiesti.