Les Expressions de Taula Comunes (CTEs) són una característica poderosa de SQL que permet definir subconsultes temporals que poden ser referenciades dins de la consulta principal. Les CTEs milloren la llegibilitat i mantenibilitat del codi SQL, especialment quan es treballa amb consultes complexes.
Continguts
Què és una CTE?
Una CTE és una subconsulta que es defineix amb la clàusula WITH
i es pot referenciar dins de la consulta principal. Les CTEs són útils per dividir consultes complexes en parts més manejables i per reutilitzar subconsultes dins de la mateixa consulta.
Sintaxi bàsica
La sintaxi bàsica d'una CTE és la següent:
WITH cte_name AS ( -- Subconsulta SELECT column1, column2 FROM table_name WHERE condition ) SELECT column1, column2 FROM cte_name;
Exemple bàsic
Suposem que tenim una taula employees
amb les següents columnes: id
, name
, department
, i salary
. Volem obtenir els empleats del departament de 'Vendes' amb un salari superior a 50,000.
WITH sales_employees AS ( SELECT id, name, salary FROM employees WHERE department = 'Vendes' AND salary > 50000 ) SELECT id, name, salary FROM sales_employees;
CTEs recursives
Les CTEs recursives són una extensió de les CTEs que permeten referenciar-se a si mateixes. Són especialment útils per treballar amb dades jeràrquiques, com ara arbres o grafs.
Sintaxi de CTE recursiva
WITH RECURSIVE cte_name AS ( -- Part no recursiva SELECT column1, column2 FROM table_name WHERE condition UNION ALL -- Part recursiva SELECT column1, column2 FROM table_name JOIN cte_name ON table_name.column = cte_name.column ) SELECT column1, column2 FROM cte_name;
Exemple recursiu
Suposem que tenim una taula employees
amb les columnes id
, name
, manager_id
, i volem obtenir una llista jeràrquica de tots els empleats i els seus managers.
WITH RECURSIVE employee_hierarchy AS ( -- Part no recursiva: selecciona els empleats sense manager SELECT id, name, manager_id FROM employees WHERE manager_id IS NULL UNION ALL -- Part recursiva: selecciona els empleats amb manager SELECT e.id, e.name, e.manager_id FROM employees e JOIN employee_hierarchy eh ON e.manager_id = eh.id ) SELECT id, name, manager_id FROM employee_hierarchy;
Exemples pràctics
Exemple 1: Filtrant dades amb una CTE
WITH high_salary_employees AS ( SELECT id, name, salary FROM employees WHERE salary > 70000 ) SELECT id, name, salary FROM high_salary_employees;
Exemple 2: Utilitzant una CTE recursiva per calcular una jerarquia
WITH RECURSIVE org_chart AS ( SELECT id, name, manager_id FROM employees WHERE manager_id IS NULL UNION ALL SELECT e.id, e.name, e.manager_id FROM employees e JOIN org_chart o ON e.manager_id = o.id ) SELECT id, name, manager_id FROM org_chart;
Exercicis pràctics
Exercici 1: Filtrant dades amb una CTE
Enunciat: Crea una CTE que seleccioni tots els empleats del departament de 'Enginyeria' amb un salari superior a 60,000 i després consulta aquesta CTE per obtenir els resultats.
Solució:
WITH engineering_employees AS ( SELECT id, name, salary FROM employees WHERE department = 'Enginyeria' AND salary > 60000 ) SELECT id, name, salary FROM engineering_employees;
Exercici 2: Utilitzant una CTE recursiva per calcular una jerarquia
Enunciat: Crea una CTE recursiva que generi una llista jeràrquica de tots els empleats i els seus managers, començant pels empleats sense manager.
Solució:
WITH RECURSIVE employee_hierarchy AS ( SELECT id, name, manager_id FROM employees WHERE manager_id IS NULL UNION ALL SELECT e.id, e.name, e.manager_id FROM employees e JOIN employee_hierarchy eh ON e.manager_id = eh.id ) SELECT id, name, manager_id FROM employee_hierarchy;
Conclusió
Les Expressions de Taula Comunes (CTEs) són una eina poderosa per simplificar i organitzar consultes SQL complexes. Les CTEs recursives, en particular, són molt útils per treballar amb dades jeràrquiques. Amb la pràctica, les CTEs poden millorar significativament la llegibilitat i mantenibilitat del vostre codi SQL.
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