WHERE, comparaciones, AND, OR y NOT
BásicoWHERE conserva solo las filas que cumplen la condición. Las comparaciones son =, <> (distinto), <, <=, > y >=, y se combinan con AND, OR y NOT. AND se evalúa antes que OR, igual que la multiplicación antes que la suma: cuando mezclas los dos, usa paréntesis.
Sintaxis
SELECT ...
FROM tabla
WHERE condición_1
AND (condición_2 OR condición_3)
AND NOT condición_4;Ejemplo
SELECT
t.id,
t.status,
t.amount
FROM transactions AS t
WHERE t.currency = 'UYU'
AND t.kind = 'card_payment'
AND (t.status = 'reversed' OR t.amount >= 4700)
ORDER BY t.id;Resultado
| id | status | amount |
|---|---|---|
| 7221 | completed | 4715.20 |
| 7230 | reversed | 1903.60 |
| 7259 | completed | 4737.20 |
| 7470 | completed | 4735.20 |
| 24056 | reversed | 3769.60 |
| 24790 | reversed | 1944.00 |
Cómo leerlo
Son los pagos con tarjeta en pesos uruguayos que fueron revertidos o que son de 4700 o más. Todas las filas cumplen las dos primeras condiciones, y cada una cumple al menos una de las dos que están dentro del paréntesis: las de completed entran por el monto, las de reversed entran por el estado.
Error común
Así no
SELECT t.id, t.status, t.amount
FROM transactions AS t
WHERE t.currency = 'UYU'
AND t.kind = 'card_payment'
AND t.status = 'reversed'
OR t.amount >= 4700;Sin paréntesis, el motor lee (moneda UYU AND tarjeta AND revertido) OR monto >= 4700. La segunda parte no exige moneda ni tipo, así que la consulta devuelve 17560 filas en cinco monedas distintas en lugar de 6, y además compara montos de monedas diferentes como si fueran lo mismo.
En otros motores: PostgreSQL, MySQL, SQL Server, Oracle, BigQuery, Snowflake
PostgreSQLMySQLSQL ServerOracleBigQuerySnowflake
<>es el operador estándar para «distinto de».!=también funciona en todos estos motores, pero<>es el que vas a ver en la documentación y en el estándar SQL.
Estos fragmentos no se ejecutan en el curso: se muestran como referencia de cada motor.