AND
El operador AND combina dos o más condiciones en una cláusula WHERE. Para que una fila aparezca en el resultado, todas las condiciones unidas por AND deben ser verdaderas. Si cualquiera de ellas es falsa, la fila se descarta.
Sintaxis
SELECT columnas
FROM tabla
WHERE condicion1
AND condicion2
AND condicion3;Puedes encadenar tantas condiciones con AND como necesites. MySQL las evalúa de izquierda a derecha, aunque el optimizador puede reordenarlas internamente para mejorar el rendimiento.
Dos condiciones
El caso más habitual es combinar dos criterios de filtrado. Por ejemplo, productos de la categoría Smartphones (id 6) que cuesten menos de 800 euros:
SELECT nombre, precio, stock
FROM productos
WHERE categoria_id = 6
AND precio < 800;| nombre | precio | stock |
|---|---|---|
| Google Pixel 8 | 699.00 | 38 |
| Xiaomi 14 | 599.99 | 80 |
De los 4 smartphones, solo 2 cuestan menos de 800 euros. El iPhone 15 Pro (1299.99) y el Samsung Galaxy S24 (899.99) cumplen la primera condición pero no la segunda, así que se descartan.
Tres o más condiciones
Puedes añadir tantas condiciones como necesites. Cada AND adicional hace el filtro más restrictivo:
SELECT nombre, precio, stock
FROM productos
WHERE categoria_id = 6
AND precio < 1000
AND stock > 50;| nombre | precio | stock |
|---|---|---|
| Samsung Galaxy S24 | 899.99 | 62 |
| Xiaomi 14 | 599.99 | 80 |
Ahora necesitamos smartphones con precio menor a 1000 y más de 50 unidades en stock. El Google Pixel 8 cumple las dos primeras condiciones pero tiene solo 38 unidades, así que no aparece.
AND con diferentes tipos de datos
El operador AND funciona con cualquier tipo de dato. Aquí combinamos una condición sobre texto, una sobre fecha y una sobre número:
SELECT id, fecha_pedido, estado, total
FROM pedidos
WHERE estado = 'entregado'
AND total > 500
AND fecha_pedido >= '2025-10-01';| id | fecha_pedido | estado | total |
|---|---|---|---|
| 1 | 2025-10-05 09:30:00 | entregado | 1349.98 |
| 2 | 2025-10-08 14:15:00 | entregado | 899.99 |
| 5 | 2025-11-02 10:20:00 | entregado | 1899.99 |
Pedidos entregados, con importe mayor a 500 euros, realizados a partir de octubre de 2025. Las tres condiciones deben cumplirse simultáneamente.
AND con rangos
AND es la forma natural de expresar rangos cuando no usas BETWEEN:
SELECT nombre, precio
FROM productos
WHERE precio >= 100
AND precio <= 500;| nombre | precio |
|---|---|
| Zapatillas running pro | 129.99 |
| Zapatillas trail | 149.99 |
| Estantería modular | 149.99 |
| Mancuernas ajustables | 199.99 |
| Robot de cocina | 249.99 |
| Escritorio ajustable | 399.00 |
Esta consulta es equivalente a WHERE precio BETWEEN 100 AND 500, que veremos más adelante. Ambas formas son válidas; BETWEEN es más concisa y AND con comparaciones es más explícita.
Tabla de verdad de AND
Para entender cómo se comporta AND con valores nulos, conviene conocer su tabla de verdad. MySQL usa lógica de tres valores: verdadero, falso y NULL (desconocido).
| A | B | A AND B |
|---|---|---|
| TRUE | TRUE | TRUE |
| TRUE | FALSE | FALSE |
| TRUE | NULL | NULL |
| FALSE | FALSE | FALSE |
| FALSE | NULL | FALSE |
| NULL | NULL | NULL |
El punto clave es que AND con un NULL devuelve NULL (a menos que el otro operando sea FALSE). Y una fila cuya condición evalúa a NULL se excluye del resultado, igual que si fuera FALSE.
Esto tiene implicaciones prácticas. Si buscas clientes con teléfono que empiece por "6":
SELECT nombre, telefono
FROM clientes
WHERE telefono IS NOT NULL
AND telefono LIKE '6%';La primera condición telefono IS NOT NULL filtra los 3 clientes sin teléfono. Sin ella, la condición telefono LIKE '6%' devolvería NULL para esos clientes (no FALSE), con el mismo efecto práctico en este caso. Pero ser explícito con IS NOT NULL deja clara la intención y evita sorpresas en consultas más complejas.
AND con OR
Cuando combinas AND y OR en la misma consulta, AND tiene mayor precedencia que OR. Esto significa que AND se evalúa antes que OR, igual que la multiplicación se evalúa antes que la suma en aritmética:
SELECT nombre, precio, categoria_id
FROM productos
WHERE categoria_id = 6
OR categoria_id = 7
AND precio > 1500;Esta consulta no hace lo que podrías esperar a primera vista. Debido a la precedencia, MySQL la interpreta como:
WHERE categoria_id = 6
OR (categoria_id = 7 AND precio > 1500)Es decir: todos los smartphones o los portátiles que cuesten más de 1500. Para obtener "smartphones o portátiles que cuesten más de 1500", necesitas paréntesis:
WHERE (categoria_id = 6 OR categoria_id = 7)
AND precio > 1500;| nombre | precio | categoria_id |
|---|---|---|
| ASUS ROG Zephyrus | 1899.99 | 7 |
| Lenovo ThinkPad X1 | 1549.00 | 7 |
La regla es simple: siempre que mezcles AND y OR, usa paréntesis para dejar clara la agrupación. No confíes en la precedencia implícita.
Practica con AND
Usa el editor para combinar condiciones con AND. Prueba a filtrar por precio y stock simultáneamente:
En el siguiente artículo veremos el operador OR con más detalle.
Escrito por Eduardo Lázaro
