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:

  1. INNER JOIN: Retorna només les files que tenen coincidències en ambdues taules.
  2. 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.
  3. 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.
  4. 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.
  5. CROSS JOIN: Retorna el producte cartesià de les files de les taules involucrades.

Sintaxi de les Unions

INNER JOIN

SELECT a.column1, b.column2
FROM table1 a
INNER JOIN table2 b ON a.common_column = b.common_column;

LEFT JOIN

SELECT a.column1, b.column2
FROM table1 a
LEFT JOIN table2 b ON a.common_column = b.common_column;

RIGHT JOIN

SELECT a.column1, b.column2
FROM table1 a
RIGHT JOIN table2 b ON a.common_column = b.common_column;

FULL JOIN

SELECT a.column1, b.column2
FROM table1 a
FULL JOIN table2 b ON a.common_column = b.common_column;

CROSS JOIN

SELECT a.column1, b.column2
FROM table1 a
CROSS JOIN table2 b;

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

Mòdul 7: Seguretat i gestió d'usuaris

Mòdul 8: Treballant amb JSON i funcionalitats NoSQL

Mòdul 9: Extensions i eines avançades

Mòdul 10: Estudis de cas i aplicacions del món real

© Copyright 2024. Tots els drets reservats