Salta el contingut

Referència ràpida SQL — 4 motors

Comparació de sintaxi entre PostgreSQL, MySQL/MariaDB, SQL Server i Oracle per als patrons més habituals. Útil com a full de referència durant les pràctiques i exàmens.


Paginació de resultats

Motor Sintaxi
PostgreSQL SELECT ... LIMIT 10 OFFSET 20;
MySQL / MariaDB SELECT ... LIMIT 10 OFFSET 20; (o LIMIT 20, 10)
SQL Server SELECT ... ORDER BY col OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
Oracle SELECT ... OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY; (12c+)

SQL Server i Oracle requereixen ORDER BY

OFFSET / FETCH NEXT exigeix una clàusula ORDER BY. Sense ella, la consulta retorna un error.


Concatenació de cadenes

Motor Operador / Funció Exemple
PostgreSQL \|\| o CONCAT() nom \|\| ' ' \|\| cognoms
MySQL / MariaDB CONCAT() CONCAT(nom, ' ', cognoms)
SQL Server + o CONCAT() nom + ' ' + cognoms
Oracle \|\| o CONCAT() nom \|\| ' ' \|\| cognoms

CONCAT() és portable

CONCAT(a, b, c) funciona als 4 motors i ignora NULLs a MySQL/MariaDB (a PostgreSQL i SQL Server, un NULL propaga NULL). Per evitar problemes, useu COALESCE(col, '') si la columna pot ser NULL.


Clau primària autoincremental

-- Opció 1: SERIAL (drecera)
CREATE TABLE productes (
    id_producte SERIAL PRIMARY KEY,
    nom         VARCHAR(100) NOT NULL
);

-- Opció 2: IDENTITY (SQL:2003, recomanat des de PG 10)
CREATE TABLE productes (
    id_producte INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    nom         VARCHAR(100) NOT NULL
);
CREATE TABLE productes (
    id_producte INT AUTO_INCREMENT PRIMARY KEY,
    nom         VARCHAR(100) NOT NULL
);
CREATE TABLE productes (
    id_producte INT IDENTITY(1,1) PRIMARY KEY,
    nom         VARCHAR(100) NOT NULL
);
-- Oracle 12c+: IDENTITY
CREATE TABLE productes (
    id_producte NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    nom         VARCHAR2(100) NOT NULL
);

-- Oracle pre-12c: seqüència + trigger
CREATE SEQUENCE seq_productes START WITH 1 INCREMENT BY 1;
-- INSERT: VALUES (seq_productes.NEXTVAL, 'Llapis')

Obtenir l'últim ID inserit

Motor Funció / Expressió
PostgreSQL INSERT ... RETURNING id_producte; o lastval()
MySQL / MariaDB LAST_INSERT_ID()
SQL Server SCOPE_IDENTITY() o OUTPUT INSERTED.id
Oracle RETURNING id INTO :var o seq.CURRVAL

Tipus de dades principals

Concepte PostgreSQL MySQL / MariaDB SQL Server Oracle
Enter petit SMALLINT SMALLINT SMALLINT NUMBER(5)
Enter estàndard INTEGER INT INT NUMBER(10)
Enter gran BIGINT BIGINT BIGINT NUMBER(19)
Decimal exacte NUMERIC(p,s) DECIMAL(p,s) DECIMAL(p,s) NUMBER(p,s)
Decimal aproximat FLOAT FLOAT FLOAT FLOAT
Cadena fixa CHAR(n) CHAR(n) CHAR(n) CHAR(n)
Cadena variable VARCHAR(n) VARCHAR(n) VARCHAR(n) VARCHAR2(n)
Text llarg TEXT TEXT VARCHAR(MAX) CLOB
Data DATE DATE DATE DATE
Data + hora TIMESTAMP DATETIME DATETIME2 TIMESTAMP
Booleà BOOLEAN TINYINT(1) BIT NUMBER(1)
Binari gran BYTEA BLOB VARBINARY(MAX) BLOB
JSON JSON / JSONB JSON NVARCHAR(MAX) + ISJSON() JSON (21c+)

Funcions de data i hora

Operació PostgreSQL MySQL / MariaDB SQL Server Oracle
Data actual CURRENT_DATE CURDATE() CAST(GETDATE() AS DATE) TRUNC(SYSDATE)
Timestamp actual NOW() NOW() GETDATE() SYSDATE
Extreure any EXTRACT(YEAR FROM col) YEAR(col) YEAR(col) EXTRACT(YEAR FROM col)
Afegir dies col + INTERVAL '7 days' DATE_ADD(col, INTERVAL 7 DAY) DATEADD(day, 7, col) col + 7
Diferència en dies col1 - col2 DATEDIFF(col1, col2) DATEDIFF(day, col2, col1) col1 - col2
Format data TO_CHAR(col, 'DD/MM/YYYY') DATE_FORMAT(col, '%d/%m/%Y') FORMAT(col, 'dd/MM/yyyy') TO_CHAR(col, 'DD/MM/YYYY')

Funcions de cadena

Operació PostgreSQL MySQL / MariaDB SQL Server Oracle
Longitud LENGTH(s) LENGTH(s) LEN(s) LENGTH(s)
Majúscules UPPER(s) UPPER(s) UPPER(s) UPPER(s)
Minúscules LOWER(s) LOWER(s) LOWER(s) LOWER(s)
Subcadena SUBSTRING(s, i, n) SUBSTRING(s, i, n) SUBSTRING(s, i, n) SUBSTR(s, i, n)
Posició POSITION(sub IN s) INSTR(s, sub) CHARINDEX(sub, s) INSTR(s, sub)
Eliminar espais TRIM(s) TRIM(s) TRIM(s) TRIM(s)
Reemplaçar REPLACE(s, old, new) REPLACE(s, old, new) REPLACE(s, old, new) REPLACE(s, old, new)
Omplir esquerra LPAD(s, n, c) LPAD(s, n, c) RIGHT(REPLICATE(c,n)+s, n) LPAD(s, n, c)

Gestió de NULLs

Operació PostgreSQL MySQL / MariaDB SQL Server Oracle
Valor per defecte si NULL COALESCE(col, val) COALESCE(col, val) COALESCE(col, val) NVL(col, val)
Primer no-NULL COALESCE(a, b, c) COALESCE(a, b, c) COALESCE(a, b, c) COALESCE(a, b, c)
NULL si iguals NULLIF(a, b) NULLIF(a, b) NULLIF(a, b) NULLIF(a, b)
Expressió condicional CASE WHEN ... END CASE WHEN ... END CASE WHEN ... END CASE WHEN ... END o DECODE()

Transaccions

Operació PostgreSQL MySQL / MariaDB SQL Server Oracle
Iniciar BEGIN; START TRANSACTION; BEGIN TRANSACTION; (automàtic)
Confirmar COMMIT; COMMIT; COMMIT; COMMIT;
Desfer ROLLBACK; ROLLBACK; ROLLBACK; ROLLBACK;
Punt de control SAVEPOINT nom; SAVEPOINT nom; SAVE TRANSACTION nom; SAVEPOINT nom;
Desfer fins a punt ROLLBACK TO SAVEPOINT nom; ROLLBACK TO SAVEPOINT nom; ROLLBACK TRANSACTION nom; ROLLBACK TO SAVEPOINT nom;
Autocommit per defecte Sí (psql) No (DML manual)

Nivells d'aïllament disponibles

Nivell PostgreSQL MySQL / MariaDB SQL Server Oracle
READ UNCOMMITTED Tractada com RC Disponible Disponible No disponible
READ COMMITTED Per defecte Disponible Per defecte Per defecte
REPEATABLE READ Disponible Per defecte Disponible No disponible
SERIALIZABLE Disponible Disponible Disponible Disponible

Còpies de seguretat (línia de comandes)

# Exportar una BD (text SQL)
pg_dump -U postgres -d nom_bd > backup.sql

# Exportar en format personalitzat (compres, restaurable selectivament)
pg_dump -U postgres -Fc -d nom_bd > backup.dump

# Restaurar
psql -U postgres -d nom_bd < backup.sql
pg_restore -U postgres -d nom_bd backup.dump
# Exportar
mysqldump -u root -p nom_bd > backup.sql

# Exportar totes les BD
mysqldump -u root -p --all-databases > all_backup.sql

# Restaurar
mysql -u root -p nom_bd < backup.sql
-- Còpia completa (T-SQL)
BACKUP DATABASE nom_bd
TO DISK = 'C:\backups\nom_bd.bak'
WITH FORMAT, COMPRESSION;

-- Restaurar
RESTORE DATABASE nom_bd
FROM DISK = 'C:\backups\nom_bd.bak'
WITH REPLACE;
# Export amb expdp (Data Pump)
expdp system/password DIRECTORY=backup_dir DUMPFILE=nom_bd.dmp SCHEMAS=nom_esquema

# Import
impdp system/password DIRECTORY=backup_dir DUMPFILE=nom_bd.dmp SCHEMAS=nom_esquema

Gestió d'usuaris i privilegis

-- Crear usuari
CREATE USER joan WITH PASSWORD 'secret';

-- Atorgar privilegis
GRANT SELECT, INSERT ON TABLE clients TO joan;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO joan;

-- Revocar
REVOKE INSERT ON TABLE clients FROM joan;

-- Eliminar usuari
DROP USER joan;
CREATE USER 'joan'@'localhost' IDENTIFIED BY 'secret';

GRANT SELECT, INSERT ON nom_bd.clients TO 'joan'@'localhost';
GRANT ALL PRIVILEGES ON nom_bd.* TO 'joan'@'localhost';
FLUSH PRIVILEGES;

REVOKE INSERT ON nom_bd.clients FROM 'joan'@'localhost';

DROP USER 'joan'@'localhost';
CREATE LOGIN joan WITH PASSWORD = 'Secret1!';
CREATE USER joan FOR LOGIN joan;

GRANT SELECT, INSERT ON clients TO joan;
GRANT CONTROL ON DATABASE::nom_bd TO joan;

REVOKE INSERT ON clients FROM joan;

DROP USER joan;
DROP LOGIN joan;
CREATE USER joan IDENTIFIED BY "Secret1!";
GRANT CREATE SESSION TO joan;

GRANT SELECT, INSERT ON clients TO joan;
GRANT DBA TO joan;          -- rol predefinit amb tots els privilegis

REVOKE INSERT ON clients FROM joan;

DROP USER joan CASCADE;     -- CASCADE elimina tots els objectes de l'usuari

Veure objectes del sistema

Objectiu PostgreSQL MySQL / MariaDB SQL Server Oracle
Llistar BD \l (psql) SHOW DATABASES; SELECT name FROM sys.databases; SELECT name FROM v$database;
Llistar taules \dt (psql) SHOW TABLES; SELECT name FROM sys.tables; SELECT table_name FROM user_tables;
Estructura taula \d nom_taula DESCRIBE nom_taula; sp_help nom_taula; DESC nom_taula;
Llistar índexos \di (psql) SHOW INDEX FROM taula; sp_helpindex taula; SELECT * FROM user_indexes;
Llistar usuaris \du (psql) SELECT user, host FROM mysql.user; SELECT name FROM sys.logins; SELECT username FROM dba_users;
Pla d'execució EXPLAIN ANALYZE ... EXPLAIN ... SET STATISTICS IO ON; ... EXPLAIN PLAN FOR ...; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);