Gairebé tot el programari que fas servir cada dia desa informació en algun lloc: el teu banc desa moviments, una botiga en línia desa comandes, una aplicació de missatgeria desa converses. Aquest "algun lloc" és, en la immensa majoria dels casos, una base de dades relacional, i el llenguatge amb què s'hi parla es diu SQL. Aquesta primera lliçó encara no t'ensenyarà a escriure consultes complexes: et donarà el mapa mental que necessites perquè tot el que vindrà després hi encaixi. Entendràs quin problema resol SQL, en què es diferencia dels llenguatges de programació que potser ja coneixes, com s'organitza internament el llenguatge i per què, cinquanta anys després de la seva invenció, continua sent una de les habilitats tècniques més valorades del mercat.
Contingut
- Què és SQL i quin problema resol
- SQL no és el mateix que un SGBD
- Breu història: de l'article de Codd a l'estàndard ANSI/ISO
- L'estàndard davant dels dialectes
- SQL és declaratiu, no imperatiu
- Els cinc subllenguatges: DDL, DML, DQL, DCL i TCL
- On es fa servir SQL avui i per què continua sent imprescindible
- El cas del curs: BotigaVerda
- Errors habituals i consells
- Exercicis
- Conclusió
- Què és SQL i quin problema resol
SQL són les sigles de Structured Query Language (llenguatge de consulta estructurat). És un llenguatge especialitzat en una única cosa: descriure quines dades vols d'una base de dades relacional, i què hi vols fer.
Per entendre el problema que resol, imagina't que gestiones les comandes d'una botiga en una carpeta de fitxers de text. Cada vegada que vulguis respondre una pregunta tan simple com "quant vam facturar a França el mes passat?" hauries de:
- Obrir cada fitxer i llegir-lo sencer.
- Escriure codi que separi els camps de cada línia.
- Filtrar manualment per país i per data.
- Sumar els imports vigilant els decimals.
- Repetir tot el procés des de zero per a la pregunta següent.
I això sense comptar problemes pitjors: què passa si dues persones escriuen al mateix fitxer alhora? Com garanteixes que una comanda no quedi a mig desar si marxa la llum? Com evites que algú registri una comanda d'un client que no existeix?
Una base de dades relacional resol tot això, i SQL és la interfície que et dona accés a aquesta maquinària. Amb SQL, la pregunta anterior és una sola frase que el sistema tradueix per tu en un pla de lectura eficient:
No et preocupis per la sintaxi encara: fixa't només que estàs descrivint el resultat que vols, no els passos per obtenir-lo.
En resum, SQL et permet:
| Necessitat | Què et dona SQL |
|---|---|
| Desar dades de manera estructurada | Taules amb columnes de tipus definit |
| Recuperar exactament el que necessites | Consultes amb filtres, ordenació i límits |
| Combinar informació de diversos llocs | Operacions de reunió entre taules (JOIN) |
| Resumir i analitzar | Agregacions (comptar, sumar, fer mitjanes) |
| Garantir que les dades siguin correctes | Restriccions i integritat referencial |
| Que diverses persones treballin alhora sense corrompre res | Transaccions i control de concurrència |
- SQL no és el mateix que un SGBD
És la confusió número u de qui comença. Convé fixar-la des del principi:
- SQL és el llenguatge. És una especificació escrita, com ho són l'HTML o el català.
- Un SGBD (Sistema Gestor de Bases de Dades, en anglès DBMS) és el programa que entén aquest llenguatge, desa les dades al disc, les indexa, gestiona la concurrència i et retorna resultats.
L'analogia útil: SQL és al SGBD el que l'idioma català és a les persones que el parlen. Totes parlen català, però cadascuna amb el seu accent i les seves expressions locals.
Aquests són els SGBD relacionals més habituals:
| SGBD | Llicència | Perfil típic d'ús | Notes per a aquest curs |
|---|---|---|---|
| PostgreSQL | Open source | Aplicacions web, analítica, geodades | És el dialecte de referència del curs |
| MySQL / MariaDB | Open source | Web clàssica, WordPress, hosting compartit | N'assenyalarem les diferències quan importin |
| SQLite | Domini públic | Mòbils, escriptori, fitxers locals, tests | Alternativa mínima si no pots instal·lar res |
| SQL Server | Comercial (Microsoft) | Entorns corporatius amb stack .NET | El seu dialecte es diu T-SQL |
| Oracle Database | Comercial | Banca, grans ERP, sistemes crítics | El seu dialecte es diu PL/SQL |
Decisió del curs: tots els exemples estan escrits i provats per a PostgreSQL 16. Quan MySQL o SQLite es comportin de manera diferent en alguna cosa rellevant, hi trobaràs una nota o una taula comparativa. Mai barrejarem dialectes sense avisar-te.
- Breu història: de l'article de Codd a l'estàndard ANSI/ISO
Conèixer la història ajuda a entendre per què el llenguatge és com és (incloses les seves raresses).
| Any | Fita |
|---|---|
| 1970 | Edgar F. Codd, d'IBM, publica A Relational Model of Data for Large Shared Data Banks. Proposa organitzar les dades en relacions (taules) amb una base matemàtica sòlida. |
| 1974 | Donald Chamberlin i Raymond Boyce, també a IBM, creen SEQUEL (Structured English Query Language) per al prototip System R. |
| 1977 | El nom s'escurça a SQL per un conflicte de marca registrada. Per això molta gent continua pronunciant-lo "sicuel". |
| 1979 | Relational Software (avui Oracle) llança el primer SGBD SQL comercial, avançant-se a IBM. |
| 1986 | ANSI publica el primer estàndard SQL (SQL-86). Un any després l'adopta ISO. |
| 1992 | SQL-92, la versió que va fixar el nucli del llenguatge que encara fem servir. |
| 1999-2016 | Successives revisions afegeixen disparadors, recursivitat (WITH RECURSIVE), funcions de finestra (SQL:2003), XML i JSON (SQL:2016). |
| 2023 | SQL:2023 incorpora, entre altres coses, tipus de graf de propietats. |
La lliçó important: SQL no és un llenguatge congelat als anys 70. Moltes de les eines més potents que veuràs al mòdul 10 (funcions de finestra, CTE, JSON) són incorporacions modernes i són al cor de l'anàlisi de dades actual.
- L'estàndard davant dels dialectes
L'estàndard ANSI/ISO defineix un llenguatge comú, però cap SGBD no l'implementa al 100 %, i tots hi afegeixen extensions pròpies. Això és el que s'anomena dialecte.
Un exemple concret: demanar "només les 5 primeres files".
| SGBD | Sintaxi |
|---|---|
| Estàndard SQL:2008 | FETCH FIRST 5 ROWS ONLY |
| PostgreSQL | LIMIT 5 (i també accepta FETCH FIRST) |
| MySQL / SQLite | LIMIT 5 |
| SQL Server | SELECT TOP 5 ... |
| Oracle (clàssic) | WHERE ROWNUM <= 5 |
Un altre exemple: concatenar dos textos.
| SGBD | Sintaxi |
|---|---|
| Estàndard / PostgreSQL / Oracle | 'Botiga' || 'Verda' |
| MySQL | CONCAT('Botiga', 'Verda') |
| SQL Server | 'Botiga' + 'Verda' |
Conseqüència pràctica: el 80 % del que aprenguis aquí funcionarà tal qual en qualsevol SGBD. El 20 % restant requerirà petits ajustos. Aprendre bé un dialecte (PostgreSQL) i saber que hi ha diferències és molt més útil que intentar aprendre un "SQL genèric" que en realitat no parla ningú.
- SQL és declaratiu, no imperatiu
Aquesta és la idea que més costa a qui ve de Python, Java o JavaScript, i la que més rendiment et donarà entendre aviat.
- En un llenguatge imperatiu descrius el procediment: obre això, recorre allò, acumula, comprova, tanca.
- En un llenguatge declaratiu descrius el resultat desitjat, i el sistema decideix com obtenir-lo.
Compara mentalment les dues maneres de respondre a "dona'm els clients de València".
Enfocament imperatiu (pseudocodi tipus Python):
resultat = []
for client in llegir_fitxer("clients.csv"):
if client["ciutat"] == "València":
resultat.append(client)
resultat.sort(key=lambda c: c["cognoms"])Enfocament declaratiu (SQL):
A la versió SQL no hi apareix cap bucle, cap índex de posició, cap variable acumuladora. Tu declares el què; l'optimitzador de consultes del SGBD decideix el com: si llegir la taula sencera, si fer servir un índex, en quin ordre combinar taules, si paral·lelitzar la feina entre diversos processadors.
| Aspecte | Llenguatge imperatiu | SQL (declaratiu) |
|---|---|---|
| Què escrius | Els passos | El resultat |
| Qui decideix l'estratègia | Tu | L'optimitzador del SGBD |
| Control del flux | Explícit (bucles, condicionals) | No existeix en una consulta |
| Com es millora el rendiment | Reescrivint l'algorisme | Amb índexs, estadístiques i reescriptura de la consulta |
| Unitat de treball | L'element individual | El conjunt de files |
La conseqüència mental més important: en SQL es pensa en conjunts, no en files una a una. Si et sorprens pensant "i ara recorro cada comanda i...", gairebé sempre hi ha una manera en conjunt d'expressar-ho, més curta i moltíssim més ràpida.
Compte: que l'optimitzador decideixi no vol dir que puguis escriure qualsevol cosa. Dues consultes que retornen el mateix resultat poden trigar 3 mil·lisegons o 3 minuts. El mòdul 8 està dedicat precisament a això.
- Els cinc subllenguatges: DDL, DML, DQL, DCL i TCL
SQL és prou gran com perquè convingui dividir-lo en famílies de sentències. No és una divisió formal de l'estàndard, però és la classificació que fa servir tothom i t'ajudarà a situar cada mòdul del curs.
| Subllenguatge | Nom complet | Per a què serveix | Sentències típiques | On es veu al curs |
|---|---|---|---|---|
| DDL | Data Definition Language | Definir i modificar l'estructura (taules, columnes, índexs) | CREATE, ALTER, DROP, TRUNCATE |
Mòduls 5, 8 i 10 |
| DML | Data Manipulation Language | Modificar les dades que hi ha a dins | INSERT, UPDATE, DELETE, MERGE |
Mòdul 5 |
| DQL | Data Query Language | Consultar dades sense modificar-les | SELECT |
Mòduls 2, 3, 4, 6, 7 |
| DCL | Data Control Language | Gestionar permisos i rols | GRANT, REVOKE |
Mòdul 11 |
| TCL | Transaction Control Language | Delimitar transaccions | BEGIN, COMMIT, ROLLBACK, SAVEPOINT |
Mòdul 9 |
Un exemple d'una línia de cadascun, ja sobre les taules de BotigaVerda que veuràs a la lliçó 01-06:
-- DDL: crear una estructura
CREATE TABLE categories (id INTEGER PRIMARY KEY, nom VARCHAR(60), descripcio TEXT);
-- DML: inserir una dada
INSERT INTO categories (id, nom) VALUES (1, 'Alimentació');
-- DQL: consultar
SELECT nom FROM categories;
-- DCL: donar permís de lectura a un rol
GRANT SELECT ON categories TO analista;
-- TCL: confirmar els canvis d'una transacció
COMMIT;Nota important sobre SELECT: molta gent classifica SELECT dins de DML, perquè l'estàndard no reconeix "DQL" com a categoria separada. Totes dues versions són acceptables; el que és rellevant és que distingeixis llegir d'escriure, perquè els permisos, el rendiment i els riscos són molt diferents en cada cas.
- On es fa servir SQL avui i per què continua sent imprescindible
graph LR
A[Base de dades<br/>relacional] --> B[Backend<br/>d'aplicacions]
A --> C[Analítica de<br/>producte i negoci]
A --> D[Business<br/>Intelligence]
A --> E[Data<br/>Engineering]
B --> B1[API REST, e-commerce,<br/>ERP, banca]
C --> C1[Mètriques, cohorts,<br/>experiments A/B]
D --> D1[Quadres de comandament:<br/>Power BI, Tableau, Looker]
E --> E1[ETL/ELT, dbt,<br/>magatzems de dades]
- Backend d'aplicacions. Tota aplicació amb usuaris, comandes o contingut necessita persistència. Encara que facis servir un ORM (Hibernate, Django ORM, Prisma, SQLAlchemy), l'ORM genera SQL: si no el saps llegir, no sabràs per què la teva pàgina triga vuit segons a carregar-se.
- Analítica de dades. És l'eina diària de l'analista: segmentar clients, mesurar retenció, calcular ingressos per canal.
- Business Intelligence. Power BI, Tableau, Metabase, Looker i Superset es recolzen en SQL, i tots permeten (o exigeixen) escriure consultes a mà per al que no és trivial.
- Data engineering. Els magatzems de dades moderns (BigQuery, Snowflake, Redshift, Databricks SQL) es consulten amb SQL, i eines com dbt consisteixen literalment a organitzar transformacions escrites en SQL.
- Ciència de dades i IA. El pas previ a qualsevol model és obtenir i netejar el conjunt de dades, i aquest pas gairebé sempre comença amb una consulta SQL.
Per què no l'ha substituït res? Se'n va anunciar la mort amb el moviment NoSQL del 2010, i va passar el contrari: els sistemes NoSQL van acabar afegint capes de consulta semblants a SQL. Les raons de la seva permanència:
- Està basat en matemàtiques, no en modes: l'àlgebra relacional continua sent vàlida.
- És portable com a habilitat: canvies d'empresa, de SGBD o de dècada, i el teu coneixement es transfereix.
- Separa el què del com: els motors milloren el seu rendiment sense obligar-te a reescriure les consultes.
- És el llenguatge comú entre desenvolupament, analítica i negoci.
- El cas del curs: BotigaVerda
A partir d'aquí i fins al projecte final, tots els exemples i exercicis del curs faran servir la mateixa base de dades: la de BotigaVerda, una botiga en línia fictícia de productes ecològics.
- Seu: València (Espanya).
- Catàleg: alimentació ecològica, cosmètica natural, llar sostenible, begudes, higiene personal i complements.
- Mercats: Espanya, Portugal i França.
- Operativa: ven per web (comandes sense comercial assignat) i per telèfon (comandes gestionades per un comercial de l'equip). Treballa amb proveïdors de diversos països, gestiona estoc, accepta ressenyes de clients i tramita devolucions.
La seva base de dades té nou taules: categories, proveidors, productes, clients, empleats, comandes, linies_comanda, ressenyes i devolucions. La veuràs en detall, amb el seu diagrama i el seu script de càrrega, a la lliçó 01-06.
Treballar sempre sobre el mateix cas té un avantatge enorme per a l'autoaprenentatge: no gastaràs energia a entendre un context nou a cada lliçó, i podràs comparar com la mateixa pregunta es respon amb eines cada vegada millors.
Aquestes són algunes de les preguntes de negoci que avui no saps respondre i que en acabar el curs resoldràs amb soltesa:
| Pregunta de negoci | Eina que necessitaràs | Mòdul |
|---|---|---|
| Quins productes costen menys de 10 € i estan actius? | SELECT + WHERE |
2 |
| Quins clients no han fet mai una comanda? | LEFT JOIN + IS NULL |
3 i 4 |
| Quin és el tiquet mitjà per país? | GROUP BY + AVG |
4 |
| Quines categories facturen més de 500 €? | GROUP BY + HAVING |
4 |
| Qui és el cap de cada empleat? | SELF JOIN |
3 |
| Quins productes tenen millor nota mitjana i com a mínim 3 ressenyes? | Agregació + HAVING |
4 |
| Quins clients gasten més que la mitjana? | Subconsulta | 7 |
| Per què aquesta consulta triga 4 segons? | Índexs + EXPLAIN |
8 |
| Com registro una comanda sense arriscar-me a deixar-la a mitges? | Transaccions | 9 |
| Quin és el rànquing mensual de vendes per categoria? | Funcions de finestra | 10 |
Errors habituals i consells
- Confondre SQL amb "la base de dades". Frases com "fem servir SQL" són ambigües. El correcte és "fem servir PostgreSQL" (el SGBD) "i el consultem amb SQL" (el llenguatge).
- Creure que hi ha un únic SQL. Copiar una consulta de Stack Overflow escrita per a MySQL i esperar que funcioni a PostgreSQL és una font constant de frustració. Comprova sempre per a quin motor està escrit el que copies.
- Pensar fila a fila. L'error mental més car. Si el teu primer instint és "recorro cada comanda", atura't: en SQL s'opera sobre conjunts complets.
- Assumir que SQL és "cosa de bases de dades antigues". És exactament al revés: l'auge de l'analítica i de la data engineering n'ha multiplicat la demanda en l'última dècada.
- Consell: aprèn un dialecte a fons. Dominar PostgreSQL i conèixer les diferències principals val més que un coneixement superficial de cinc motors.
- Consell: escriu sempre les consultes a mà al principi. Els assistents i els generadors automàtics són útils després; al principi impedeixen que interioritzis el model mental.
Exercicis
Aquests exercicis són conceptuals: encara no necessites tenir res instal·lat.
Exercici 1
Classifica cadascuna d'aquestes frases indicant a quin subllenguatge pertany (DDL, DML, DQL, DCL o TCL) i justifica breument per què:
- Afegir una columna
telefona la taulaclients. - Registrar una nova comanda del client 7.
- Esbrinar quants productes hi ha a la categoria "Begudes".
- Desfer tots els canvis fets des de l'inici de l'operació en curs.
- Permetre que l'usuari
analistapugui llegir la taulacomandesperò no modificar-la. - Eliminar per complet la taula
devolucions, estructura inclosa.
Exercici 2
Un company et diu: "He escrit la consulta amb SELECT TOP 10 * FROM productes i PostgreSQL em dona un error de sintaxi. És evident que PostgreSQL no compleix l'estàndard SQL."
Explica en tres o quatre frases per què el seu raonament és incorrecte i com hauria de plantejar el problema.
Exercici 3
Tradueix a llenguatge natural, en una sola frase, el que declara aquesta consulta. No intentis descriure els passos que fa el motor, sinó el resultat que es demana:
Solucions
Solució 1
| Frase | Subllenguatge | Per què |
|---|---|---|
1. Afegir columna telefon |
DDL | Canvia l'estructura de la taula, no les seves dades (ALTER TABLE) |
| 2. Registrar una comanda | DML | Insereix dades noves (INSERT) |
| 3. Comptar productes de "Begudes" | DQL | Només llegeix informació (SELECT); no modifica res |
| 4. Desfer els canvis en curs | TCL | Controla la transacció (ROLLBACK) |
| 5. Donar permís de lectura | DCL | Gestiona privilegis (GRANT SELECT) |
| 6. Eliminar la taula sencera | DDL | Elimina un objecte de l'estructura (DROP TABLE) |
Fixa't en el matís del punt 6: esborrar les files de devolucions seria DML (DELETE), però esborrar la taula és DDL (DROP). El mateix verb en català, dues famílies diferents.
Solució 2
El raonament falla en dos punts. Primer, SELECT TOP 10 no forma part de l'estàndard ANSI/ISO: és una extensió pròpia de SQL Server, així que PostgreSQL no incompleix res quan la rebutja. Segon, l'estàndard limita files amb FETCH FIRST 10 ROWS ONLY, i PostgreSQL sí que ho admet, a més de la seva forma habitual LIMIT 10. El correcte seria preguntar-se "quina és la sintaxi d'aquest dialecte per limitar files?" en comptes d'assumir que la sintaxi que un coneix és l'estàndard. A la pràctica, cap SGBD implementa l'estàndard complet i tots hi afegeixen extensions.
Solució 3
"Dona'm el nom i el preu dels productes que estan actius i costen menys de 10 euros, començant pel més car."
Observa el que no apareix en aquesta frase: cap bucle, cap recorregut, cap decisió sobre índexs. Això és exactament el que significa que SQL sigui declaratiu. La consulta no diu com trobar aquestes files —això ho decidirà l'optimitzador—, només quines vols i en quin ordre les esperes.
Conclusió
En aquesta lliçó has construït el marc conceptual del curs:
- SQL és un llenguatge declaratiu i estandarditzat per definir, manipular, consultar i controlar dades en bases relacionals; descriu què vols, no com obtenir-ho.
- SQL (llenguatge) i SGBD (programa) són coses diferents: PostgreSQL, MySQL, SQLite, SQL Server i Oracle parlen SQL, cadascun amb el seu dialecte.
- L'estàndard ANSI/ISO defineix un nucli comú des del 1986, però cap motor no l'implementa del tot: per això el curs fixa PostgreSQL 16 com a referència.
- El llenguatge s'organitza en cinc famílies —DDL, DML, DQL, DCL i TCL— que es corresponen amb els mòduls que recorreràs.
- SQL és avui imprescindible en backend, analítica, BI i data engineering, i no ha estat substituït per res.
- BotigaVerda serà el teu camp de proves de principi a fi.
A la lliçó següent, Configurar el teu entorn SQL, passaràs de la teoria a la pràctica: instal·laràs PostgreSQL (amb instruccions per a Linux, macOS i Windows, a més de l'opció recomanada amb Docker), aprendràs a connectar-te amb el client psql, coneixeràs els clients gràfics més habituals i crearàs la base de dades botigaverda que faràs servir durant tot el curs.
Curs de SQL
Mòdul 1: Introducció a SQL
- Què és SQL?
- Configurar el teu entorn SQL
- Sintaxi bàsica de SQL
- Entendre bases de dades i taules
- El model relacional: claus primàries i foranes
- La base de dades del curs: BotigaVerda
Mòdul 2: Consultes bàsiques de SQL
- Instrucció SELECT
- Àlies, expressions i columnes calculades
- Filtrar dades amb WHERE
- DISTINCT i eliminació de duplicats
- Ordenar dades amb ORDER BY
- Limitar resultats amb LIMIT
Mòdul 3: Treballar amb múltiples taules
- Operacions JOIN
- INNER JOIN
- LEFT JOIN
- RIGHT JOIN
- FULL OUTER JOIN
- SELF JOIN i CROSS JOIN
- Unions de conjunts: UNION, INTERSECT i EXCEPT
Mòdul 4: Filtratge avançat de dades
- Utilitzar LIKE per a coincidència de patrons
- Operadors IN i BETWEEN
- Valors NULL i IS NULL
- Funcions d'agregació: COUNT, SUM, AVG, MIN i MAX
- Agregar dades amb GROUP BY
- Clàusula HAVING
Mòdul 5: Manipulació de dades
- Crear taules i restriccions amb CREATE TABLE
- Instrucció INSERT
- Instrucció UPDATE
- Instrucció DELETE
- Instrucció UPSERT (MERGE)
- Modificar l'esquema: ALTER TABLE i migracions segures
Mòdul 6: Funcions avançades de SQL
- Funcions de cadena
- Funcions numèriques
- Funcions de data i hora
- Conversió de tipus i tractament dels NULL: CAST i COALESCE
- Expressions condicionals
Mòdul 7: Subconsultes i consultes imbricades
- Introducció a les subconsultes
- Subconsultes correlacionades
- EXISTS i NOT EXISTS
- Utilitzar subconsultes en les clàusules SELECT, FROM i WHERE
- Subconsultes o JOIN: quin triar
Mòdul 8: Índexs i optimització del rendiment
- Entendre els índexs
- Creació i gestió d'índexs
- Tipus d'índex i quan no indexar
- Tècniques d'optimització de consultes
- Anàlisi del rendiment de les consultes
Mòdul 9: Transaccions i concurrència
- Introducció a les transaccions
- Propietats ACID
- Instruccions de control de transaccions
- Nivells d'aïllament i anomalies de concurrència
- Gestió de la concurrència: bloquejos i interbloquejos
Mòdul 10: Temes avançats
- Vistes
- Expressions de taula comunes (CTE)
- Funcions de finestra
- Procediments emmagatzemats
- Disparadors (triggers)
- JSON i dades semiestructurades
Mòdul 11: SQL a la pràctica
- Casos d'ús al món real
- Bones pràctiques
- Seguretat: injecció SQL, permisos i rols
- SQL per a l'anàlisi de dades
- SQL en el desenvolupament web
