# Parte 3: Join in SQL

Benvenuti alla terza lezione del nostro corso di SQL su ZioMark's HUB! Dopo aver esplorato le query di selezione e le funzioni aggregato, questa lezione si concentrerà sulle diverse tecniche di join in SQL, un aspetto fondamentale per lavorare con database relazionali e combinare dati da più tabelle.

### Che Cos'è un Join?

Un join SQL è un'operazione che combina le righe da due o più tabelle, basandosi su una colonna relazionata tra di loro. Ci sono diversi tipi di join che possono essere utilizzati a seconda delle esigenze specifiche della query.

### Tipi di Join

1. **INNER JOIN**: Restituisce le righe quando c'è almeno una corrispondenza in entrambe le tabelle.
2. **LEFT JOIN (o LEFT OUTER JOIN)**: Restituisce tutte le righe dalla tabella a sinistra, e le righe corrispondenti dalla tabella a destra. Se non c'è corrispondenza, il risultato è `NULL` sul lato destro.
3. **RIGHT JOIN (o RIGHT OUTER JOIN)**: Restituisce tutte le righe dalla tabella a destra, e le righe corrispondenti dalla tabella a sinistra. Se non c'è corrispondenza, il risultato è `NULL` sul lato sinistro.
4. **FULL JOIN (o FULL OUTER JOIN)**: Restituisce le righe quando c'è una corrispondenza in una delle tabelle.

### Sintassi di Base dei Join

```sql
SELECT column_name(s)
FROM table1
[TYPE OF JOIN] JOIN table2
ON table1.column_name = table2.column_name;
```

### Esempio Pratico

Immaginiamo di avere due tabelle, `Employees` e `Departments`, dove gli impiegati sono associati ai loro rispettivi dipartimenti attraverso un ID di dipartimento.

#### Tabella `Employees`

| EmployeeID | EmployeeName | DepartmentID |
| ---------- | ------------ | ------------ |
| 1          | Alice        | 1            |
| 2          | Bob          | 2            |
| 3          | Charlie      | 1            |

#### Tabella `Departments`

| DepartmentID | DepartmentName |
| ------------ | -------------- |
| 1            | HR             |
| 2            | IT             |

#### Query con INNER JOIN

```sql
SELECT Employees.EmployeeName, Departments.DepartmentName
FROM Employees
INNER JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID;
```

Questo restituirà:

| EmployeeName | DepartmentName |
| ------------ | -------------- |
| Alice        | HR             |
| Bob          | IT             |
| Charlie      | HR             |

### Esercizio Pratico

Con le tabelle `Employees` e `Departments` fornite, prova a:

1. Eseguire un LEFT JOIN per visualizzare tutti i dipendenti insieme ai nomi dei loro dipartimenti.
2. Eseguire un RIGHT JOIN per visualizzare tutti i dipartimenti, inclusi quelli senza dipendenti.

#### Soluzioni

1. **LEFT JOIN**:

```sql
SELECT Employees.EmployeeName, Departments.DepartmentName
FROM Employees
LEFT JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID;
```

2. **RIGHT JOIN**:

```sql
SELECT Employees.EmployeeName, Departments.DepartmentName
FROM Departments
LEFT JOIN Employees
ON Departments.DepartmentID = Employees.DepartmentID;
```

### Conclusione

Ora dovresti avere una solida comprensione di come i diversi tipi di join funzionino e come possono essere utilizzati per combinare dati in modi potenti e flessibili. Queste competenze ti saranno utili per analizzare e gestire efficacemente grandi quantità di dati relazionali.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://learn.ziomark.xyz/sql/parte-3-join-in-sql.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
