Les unions són una part fonamental de SQL que permeten combinar dades de dues o més taules basades en una condició relacionada. En aquest tema, explorarem els diferents tipus d'unions disponibles en PostgreSQL, com utilitzar-les i quan aplicar-les.
Tipus d'Unions
Hi ha diversos tipus d'unions en SQL, cadascuna amb les seves pròpies característiques i usos. Els tipus principals són:
- INNER JOIN: Retorna només les files que tenen coincidències en ambdues taules.
- LEFT JOIN (o LEFT OUTER JOIN): Retorna totes les files de la taula esquerra i les files coincidents de la taula dreta. Si no hi ha coincidència, es retorna NULL per les columnes de la taula dreta.
- RIGHT JOIN (o RIGHT OUTER JOIN): Retorna totes les files de la taula dreta i les files coincidents de la taula esquerra. Si no hi ha coincidència, es retorna NULL per les columnes de la taula esquerra.
- FULL JOIN (o FULL OUTER JOIN): Retorna totes les files quan hi ha una coincidència en una de les taules. Si no hi ha coincidència, es retorna NULL per les columnes que no tenen coincidència en ambdues taules.
- CROSS JOIN: Retorna el producte cartesià de les files de les taules involucrades.
Sintaxi de les Unions
INNER JOIN
LEFT JOIN
RIGHT JOIN
FULL JOIN
CROSS JOIN
Exemples Pràctics
Exemple 1: INNER JOIN
Suposem que tenim dues taules, employees
i departments
, i volem obtenir una llista d'empleats amb els seus respectius departaments.
-- Taula employees CREATE TABLE employees ( employee_id SERIAL PRIMARY KEY, name VARCHAR(100), department_id INT ); -- Taula departments CREATE TABLE departments ( department_id SERIAL PRIMARY KEY, department_name VARCHAR(100) ); -- Inserir dades INSERT INTO employees (name, department_id) VALUES ('Alice', 1), ('Bob', 2), ('Charlie', 1); INSERT INTO departments (department_name) VALUES ('HR'), ('Engineering'); -- INNER JOIN SELECT e.name, d.department_name FROM employees e INNER JOIN departments d ON e.department_id = d.department_id;
Resultat:
name | department_name |
---|---|
Alice | HR |
Bob | Engineering |
Charlie | HR |
Exemple 2: LEFT JOIN
Volem obtenir una llista de tots els empleats i els seus departaments, incloent aquells que no tenen un departament assignat.
-- Afegir un empleat sense departament INSERT INTO employees (name, department_id) VALUES ('David', NULL); -- LEFT JOIN SELECT e.name, d.department_name FROM employees e LEFT JOIN departments d ON e.department_id = d.department_id;
Resultat:
name | department_name |
---|---|
Alice | HR |
Bob | Engineering |
Charlie | HR |
David | NULL |
Exemple 3: FULL JOIN
Volem obtenir una llista de tots els empleats i departaments, incloent aquells que no tenen coincidència en l'altra taula.
-- FULL JOIN SELECT e.name, d.department_name FROM employees e FULL JOIN departments d ON e.department_id = d.department_id;
Resultat:
name | department_name |
---|---|
Alice | HR |
Bob | Engineering |
Charlie | HR |
David | NULL |
NULL | HR |
NULL | Engineering |
Exercicis Pràctics
Exercici 1: INNER JOIN
Crea dues taules, students
i courses
, i omple-les amb dades. Escriu una consulta que retorni els noms dels estudiants i els noms dels cursos en què estan inscrits.
Exercici 2: LEFT JOIN
Utilitzant les mateixes taules de l'exercici anterior, escriu una consulta que retorni tots els estudiants i els cursos en què estan inscrits, incloent aquells que no estan inscrits en cap curs.
Exercici 3: FULL JOIN
Escriu una consulta que retorni tots els estudiants i cursos, incloent aquells que no tenen coincidència en l'altra taula.
Solucions
Solució Exercici 1
-- Taula students CREATE TABLE students ( student_id SERIAL PRIMARY KEY, name VARCHAR(100) ); -- Taula courses CREATE TABLE courses ( course_id SERIAL PRIMARY KEY, course_name VARCHAR(100) ); -- Taula enrollments CREATE TABLE enrollments ( student_id INT, course_id INT, PRIMARY KEY (student_id, course_id), FOREIGN KEY (student_id) REFERENCES students(student_id), FOREIGN KEY (course_id) REFERENCES courses(course_id) ); -- Inserir dades INSERT INTO students (name) VALUES ('John'), ('Jane'), ('Mike'); INSERT INTO courses (course_name) VALUES ('Math'), ('Science'); INSERT INTO enrollments (student_id, course_id) VALUES (1, 1), (2, 2), (3, 1); -- INNER JOIN SELECT s.name, c.course_name FROM students s INNER JOIN enrollments e ON s.student_id = e.student_id INNER JOIN courses c ON e.course_id = c.course_id;
Solució Exercici 2
-- LEFT JOIN SELECT s.name, c.course_name FROM students s LEFT JOIN enrollments e ON s.student_id = e.student_id LEFT JOIN courses c ON e.course_id = c.course_id;
Solució Exercici 3
-- FULL JOIN SELECT s.name, c.course_name FROM students s FULL JOIN enrollments e ON s.student_id = e.student_id FULL JOIN courses c ON e.course_id = c.course_id;
Conclusió
Les unions són una eina poderosa en SQL per combinar dades de diverses taules. Comprendre els diferents tipus d'unions i saber quan utilitzar-les és essencial per treballar amb bases de dades relacionals. Amb la pràctica, podràs utilitzar unions per resoldre una àmplia varietat de problemes de consulta de dades.
Curs de PostgreSQL
Mòdul 1: Introducció a PostgreSQL
Mòdul 2: Operacions bàsiques de SQL
Mòdul 3: Consultes SQL avançades
Mòdul 4: Disseny de bases de dades i normalització
Mòdul 5: Funcionalitats avançades de PostgreSQL
Mòdul 6: Optimització i millora del rendiment
- Optimització de consultes
- Estratègies d'indexació
- Analitzant el rendiment de les consultes
- Vacuuming i manteniment
Mòdul 7: Seguretat i gestió d'usuaris
- Rols d'usuari i permisos
- Mètodes d'autenticació
- Encriptació de dades
- Còpia de seguretat i restauració
Mòdul 8: Treballant amb JSON i funcionalitats NoSQL
Mòdul 9: Extensions i eines avançades
- PostGIS per a dades geoespacials
- Cerca de text complet
- Wrappers de dades externes
- PL/pgSQL i altres llenguatges procedimentals