Recursos por dialeto

RecursoFirebirdPostgreSQLMySQL
PaginaçãoFIRST n SKIP mLIMIT n OFFSET mLIMIT m, n (ou LIMIT n OFFSET m)
Concatenação de strings|| (pipe)|| (pipe) ou CONCAT()CONCAT() (|| é OR bit a bit)
Data atualCURRENT_DATE / CURRENT_TIMESTAMPCURRENT_DATE / NOW()CURDATE() / NOW()
Adicionar dias a dataDATEADD(day, n, d)d + INTERVAL 'n days'DATE_ADD(d, INTERVAL n DAY)
Extrair parte da dataEXTRACT(MONTH FROM d)EXTRACT(MONTH FROM d)MONTH(d) / EXTRACT(MONTH FROM d)
Aspas em identificadores"coluna" (maiúsculas)"coluna" (case-sensitive)`coluna` (backticks)
String literalAspas simples 'texto'Aspas simples 'texto' (E'...' para escape)Aspas simples 'texto' ou duplas "texto"
NULL em concatenaçãoNULL propaga (resultado NULL)NULL propaga (resultado NULL)NULL propaga (CONCAT ignora NULL)
COALESCE / IFNULLCOALESCE(a,b)COALESCE(a,b)COALESCE(a,b) / IFNULL(a,b)
BooleanoNão nativo (usa SMALLINT 0/1)BOOLEAN (TRUE/FALSE)TINYINT(1) / BOOLEAN
Auto-incrementoGENERATOR + triggerSERIAL / IDENTITYAUTO_INCREMENT
UPSERTUPDATE OR INSERTINSERT ... ON CONFLICTINSERT ... ON DUPLICATE KEY UPDATE
CTE (WITH)Suportado (Firebird 2.1+)SuportadoSuportado (8.0+)
Window functionsSuportado (3.0+)SuportadoSuportado (8.0+)

Mesma query em cada dialeto

Top 5 clientes por total de compras

Firebird
SELECT c.nome, SUM(p.valor_total) AS total
FROM clientes c
JOIN pedidos p ON p.cliente_id = c.id
GROUP BY c.nome
ORDER BY total DESC
ROWS 5
PostgreSQL
SELECT c.nome, SUM(p.valor_total) AS total
FROM clientes c
JOIN pedidos p ON p.cliente_id = c.id
GROUP BY c.nome
ORDER BY total DESC
LIMIT 5
MySQL
SELECT c.nome, SUM(p.valor_total) AS total
FROM clientes c
JOIN pedidos p ON p.cliente_id = c.id
GROUP BY c.nome
ORDER BY total DESC
LIMIT 5

Concatenar nome e sobrenome

Firebird
SELECT nome || ' ' || sobrenome AS nome_completo
FROM clientes
PostgreSQL
SELECT nome || ' ' || sobrenome AS nome_completo
FROM clientes
MySQL
SELECT CONCAT(nome, ' ', sobrenome) AS nome_completo
FROM clientes

Pedidos dos últimos 30 dias

Firebird
SELECT id, data_pedido
FROM pedidos
WHERE data_pedido >= DATEADD(day, -30, CURRENT_DATE)
PostgreSQL
SELECT id, data_pedido
FROM pedidos
WHERE data_pedido >= CURRENT_DATE - INTERVAL '30 days'
MySQL
SELECT id, data_pedido
FROM pedidos
WHERE data_pedido >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)