Salt la conținutul principal
Modulul 3 · Lecția 1 din 49/57 în curs~12 min
Lecții din modul (1/4)

Unirea a două mese: INNER JOIN

Până acum am citit câte un tabel. În lumea reală, însă, datele sunt răspândit în mai multe tabele asociate: în setul nostru de date, de exemplu, fiecare angajatul are un department_id care indică tabelul departments. Pentru a vedea numele departamentului (și nu doar id) de care trebuie să ne alăturăm două mese. Operatorul care face acest lucru se numește JOIN.

Sintaxa de bază

SQL
SELECT columns
FROM   table_a
JOIN   table_b ON table_a.x = table_b.y;

Citiți în engleză: "luați table_a, atașați-i table_b împerecheând fiecare rând unde table_a.x este egal cu table_b.y". Rezultatul este un nou virtual tabel cu coloanele ambelor.

SQL
-- For each employee, also show the name of their department:
SELECT employees.first_name,
       employees.last_name,
       departments.name AS dipartimento
FROM   employees
JOIN   departments ON employees.department_id = departments.id;

Partea de după ON se numește condiția de îmbinare: este ceea ce spune motor "aceste două rânduri sunt cam același lucru, aliniați-le". În marea majoritate a cazurilor este o egalitate între o cheie primară și o cheie străină cheie (aici departments.id și employees.department_id).

INNER JOIN, în detaliu

Cuvântul cheie complet este INNER JOIN, dar JOIN în sine este standardul sinonim. „Intern” înseamnă că numai rândurile care au o potrivire în ambele tabelele sunt returnate:

  • dacă un angajat are department_id = NULL, acesta nu va apărea în rezultat;
  • dacă un departament nu are angajați, acesta nu va apărea în rezultat.

Nume de coloane de calificare

Când două tabele au coloane cu același nume (aici ambele au id și ambele au name dacă vă gândiți bine), trebuie să specificați ce tabel o coloană provine scriind table.column. Pentru a evita repetarea numelor lungi, pseudonimele sunt adesea folosite (le-ați văzut în Modulul 2):

SQL
SELECT e.first_name, e.last_name, d.name AS dipartimento
FROM   employees   AS e
JOIN   departments AS d ON e.department_id = d.id;

AS este și aici opțional: FROM employees e funcționează la fel.

Încearcă

Exercițiu#sql.m3.l1.e1
Încercări: 0Se încarcă…

Pentru fiecare angajat din departamentul Ingegneria, arata prenume (prenume), prenume (nume) si orasul departamentului (departamente.oras). Trei coloane, un rând per angajat.

Se încarcă editorul...
Afișează indiciu

Completați condiția ON cu egalitatea dintre e.department_id și d.id, apoi selectați d.city ca a treia coloană.

Soluție disponibilă după 3 încercări

Exercițiu de revizuire

Exercițiu#sql.m3.l1.e2
Încercări: 0Se încarcă…

Listați prenumele (prenume) și numele (numele) tuturor angajaților care lucrează într-un departament din Milano. Filtrați pe departments.city, nu pe numele departamentului.

Se încarcă editorul...
Afișează indiciu

Același JOIN ca și exercițiul anterior, dar filtrați pe d.city = 'Milano' în loc de pe numele departamentului.

Soluție disponibilă după 3 încercări