INNER JOIN
Inner join
Met een INNER JOIN worden de rijen getoond die in twee of meerdere tabellen voorkomen. In plaats van INNER JOIN kun je gewoon JOIN gebruiken. Een JOIN maak je met USING of met JOIN ON. Een INNER JOIN wordt ook wel een SIMPLE JOIN genoemd. De eerste tabel heeft zwart, blauw en wit. De tweede tabel heeft blauw, wit en oranje. Alleen blauw en wit komen voor in beide tabellen en die worden dan getoond. Zwart en oranje worden niet getoond.
SELECT last_name, department_name
FROM employees INNER JOIN departments USING(department_id);
SELECT last_name, department_name
FROM employees JOIN departments USING(department_id);
| last_name | department_name |
|---|---|
| King | Executive |
| Kochhar | Executive |
| De Haan | Executive |
| Hunold | IT |
| Ernst | IT |
| Lorentz | IT |
| Mourgos | Shipping |
| Rajs | Shipping |
| Davies | Shipping |
| Matos | Shipping |
| Vargas | Shipping |
| Zlotkey | Sales |
| Abel | Sales |
| Taylor | Sales |
| Whalen | Administration |
| Hartstein | Marketing |
| Fay | Marketing |
| Higgins | Accounting |
| Gietz | Accounting |
Grant heeft geen department_id en komt daarom niet voor in de uitvoer.
Join using
Met USING geef je specifiek aan welke kolommen gebruikt moeten worden voor de JOIN.
SELECT first_name, last_name, department_id, department_name
FROM employees JOIN departments USING(department_id);

Het is mogelijk drie of meer tabellen te gebruiken om alle informatie in één uitvoer te zetten. Als je drie tabellen nodig hebt voor de juiste informatie, noem je de eerste tabel bij FROM en volgen er daarna twee JOINS.
SELECT last_name, department_name, city
FROM employees
JOIN departments
USING(department_id)
JOIN locations
USING(location_id);

Join on
JOIN ON werkt hetzelfde als JOIN USING maar JOIN ON kun je ook gebruiken als de kolomnamen van de twee verschillende tabellen niet exact hetzelfde zijn. Na ON benoem je dan de kolomnamen die aan elkaar gelijk moeten zijn. Eerst noem je de tabel, dan volgt er een punt en dan volgt de kolomnaam. Er zijn twee kolomnamen die je met elkaar wil vergelijken, maar ze heten anders. In de tabel employees heet de kolom salary en in de tabel job_grades heet de kolom lowest_sal. In onderstaand voorbeeld vergelijk je salary van employees met lowest_sal van job_grades. Deze personen zitten dus in de laagste salarisschaal van job_grade.
JOIN ON is de allerbelangrijkste manier om tabellen aan elkaar te knopen en daarom moet er heel veel geoefend worden met JOIN ON!
SELECT first_name, last_name, salary, lowest_sal, highest_sal, grade_level
FROM employees
JOIN job_grades
ON employees.salary = job_grades.lowest_sal;
Met aliassen maak je deze query als volgt wat netter.
SELECT e.first_name,
e.last_name,
e.salary,
g.lowest_sal,
g.highest_sal,
g.grade_level
FROM employees e
JOIN job_grades g
ON e.salary = g.lowest_sal;
| first_name | last_name | salary | lowest_sal | highest_sal | grade_level |
|---|---|---|---|---|---|
| Bruce | Ernst | 6000 | 6000 | 9999 | C |
| Pat | Fay | 6000 | 6000 | 9999 | C |
Nog een voorbeeld van employees die het minimum salaris hebben van de job_id die ze hebben. De tabellen employees en jobs worden samengevoegd op kolommen die niet dezelfde kolomnaam hebben. Merk op dat salary twee decimalen heeft en dat min_salary en max_salary geen decimalen hebben. De kolom salary is van het type DECIMAL en de kolommen min_salary en max_salary zijn van het type INT.
SELECT e.first_name, e.last_name, e.salary, j.min_salary, j.max_salary
FROM employees e
JOIN jobs j
ON e.salary = j.min_salary;
| first_name | last_name | salary | min_salary | max_salary |
|---|---|---|---|---|
| Alexander | Hunold | 9000 | 9000 | 15000 |
| Bruce | Ernst | 6000 | 6000 | 12000 |
| Diana | Lorentz | 4200 | 4200 | 9000 |
| Pat | Fay | 6000 | 6000 | 12000 |
JOIN ON werkt uiteraard ook als de kolomnamen van de verschillende tabellen wel hetzelfde zijn.
SELECT last_name, job_title
FROM employees
JOIN jobs
ON employees.job_id = jobs.job_id;
| last_name | job_title |
|---|---|
| King | President |
| Kochhar | Administration Vice President |
| De Haan | Administration Vice President |
| Hunold | Programmer |
| Ernst | Programmer |
| Lorentz | Programmer |
| Mourgos | Stock Manager |
| Rajs | Stock Clerk |
| Davies | Stock Clerk |
| Matos | Stock Clerk |
| Vargas | Stock Clerk |
| Zlotkey | Sales Manager |
| Abel | Sales Representative |
| Taylor | Sales Representative |
| Grant | Sales Representative |
| Whalen | Administration Assistant |
| Hartstein | Marketing Manager |
| Fay | Marketing Representative |
| Higgins | Accounting Manager |
| Gietz | Public Accountant |
Het is mogelijk drie of meer tabellen te gebruiken om alle informatie in één uitvoer te zetten. Voor de leesbaarheid kun je dan de joins onder elkaar zetten.
SELECT last_name, department_name, city
FROM employees
JOIN departments
ON (employees.department_id = departments.department_id)
JOIN locations
ON departments.location_id = locations.location_id;
| last_name | department_name | city |
|---|---|---|
| King | Executive | Seattle |
| Kochhar | Executive | Seattle |
| De Haan | Executive | Seattle |
| Hunold | IT | Southlake |
| Ernst | IT | Southlake |
| Lorentz | IT | Southlake |
| Mourgos | Shipping | South San Francisco |
| Rajs | Shipping | South San Francisco |
| Davies | Shipping | South San Francisco |
| Matos | Shipping | South San Francisco |
| Vargas | Shipping | South San Francisco |
| Zlotkey | Sales | Oxford |
| Abel | Sales | Oxford |
| Taylor | Sales | Oxford |
| Whalen | Administration | Seattle |
| Hartstein | Marketing | Toronto |
| Fay | Marketing | Toronto |
| Higgins | Accounting | Seattle |
| Gietz | Accounting | Seattle |