Publicado en

SQL desde cero: SELECT, FROM y WHERE

Consulta SQL SELECT FROM WHERE sobre fondo oscuro con cláusulas coloreadas

Cada vez que buscas un producto en una tienda online, consultas tu saldo bancario o filtras una lista de resultados, hay una instrucción SQL ejecutándose en algún servidor. Es el lenguaje con el que las aplicaciones le hacen preguntas a los datos.

¿Qué es SQL?

SQL (Structured Query Language, o lenguaje de consulta estructurado) es el estándar para interactuar con bases de datos relacionales. No es un lenguaje de programación de propósito general: está diseñado exclusivamente para leer, escribir y manipular datos.

MySQL, PostgreSQL, SQLite, SQL Server y Oracle lo utilizan con pequeñas variaciones de sintaxis. Lo que aprendas aquí funciona en cualquiera de ellos.

SQL se divide en sublenguajes según el tipo de operación que realizan sus instrucciones:

  • DDL (Data Definition Language): define la estructura de la base de datos. CREATE TABLE, ALTER TABLE, DROP TABLE.
  • DML (Data Manipulation Language): trabaja con los datos. SELECT, INSERT, UPDATE, DELETE.
  • DCL (Data Control Language): gestiona los permisos de acceso. GRANT, REVOKE.

En este artículo nos centramos en SELECT, la instrucción más usada con diferencia.

La anatomía de una consulta

Diagrama de la anatomía de una consulta SELECT: SELECT elige qué columnas devolver, FROM indica la tabla y WHERE filtra los registros

Una consulta SELECT tiene siempre la misma estructura base:

SELECT columnas
FROM tabla
WHERE condición;

Cada cláusula tiene una función concreta:

  • SELECT: qué columnas quieres recuperar.
  • FROM: de qué tabla vienen los datos.
  • WHERE: qué condición deben cumplir los registros. Es opcional.

El orden de las cláusulas es fijo: siempre SELECT, luego FROM, luego WHERE. SQL no distingue mayúsculas de minúsculas, pero la convención es escribir las palabras reservadas en mayúsculas para separarlas visualmente de los nombres de tablas y columnas.

SELECT: elige qué columnas ver

Los ejemplos de este artículo usan tres tablas de una tienda online sencilla: usuarios, productos y pedidos. Empecemos consultando los productos:

SELECT nombre, precio
FROM productos;

Esto devuelve exactamente esas dos columnas para cada fila de la tabla productos. Si quieres recuperar todas las columnas, puedes usar el asterisco:

SELECT *
FROM productos;

Es útil para explorar datos, pero en producción se evita: si la tabla cambia y se añaden nuevas columnas, la consulta las devuelve sin que el código que la consume lo espere.

Alias con AS

Puedes renombrar columnas en el resultado con AS:

SELECT nombre AS producto, precio AS coste
FROM productos;

El resultado muestra los nuevos nombres sin modificar nada en la base de datos. Es útil cuando adaptas los datos al formato que espera otro sistema o cuando el nombre original de la columna no es suficientemente descriptivo en el contexto de la consulta.

FROM: de qué tabla

En su forma más sencilla, FROM es simplemente el nombre de la tabla de la que quieres leer datos:

SELECT nombre, email
FROM usuarios;

Cuando necesitas cruzar información de varias tablas a la vez, FROM es donde se define qué tablas intervienen y cómo se relacionan. Eso es exactamente lo que hacen los JOINs.

WHERE: filtra los resultados

Diagrama que muestra cómo la cláusula WHERE precio mayor que 50 filtra la tabla productos de 5 filas a 2, dejando solo Monitor y Webcam

Sin WHERE, SELECT devuelve todos los registros de la tabla. Con WHERE, solo los que cumplen una condición:

SELECT nombre, precio
FROM productos
WHERE precio > 50;

Esto devuelve únicamente los productos con precio superior a 50.

Operadores de comparación

  • = — igual a
  • != o <> — distinto de
  • <, > — menor que, mayor que
  • <=, >= — menor o igual, mayor o igual
SELECT nombre, email
FROM usuarios
WHERE nombre = 'Ana';

LIKE: búsquedas por patrón

Para filtrar texto por patrón usa LIKE con dos comodines:

  • % — representa cualquier secuencia de caracteres, incluyendo ninguno.
  • _ — representa exactamente un carácter.
-- Usuarios con email de Gmail
SELECT nombre, email
FROM usuarios
WHERE email LIKE '%@gmail.com';
 
-- Productos cuyo nombre empieza por "Tecla"
SELECT nombre, precio
FROM productos
WHERE nombre LIKE 'Tecla%';

IS NULL / IS NOT NULL

NULL en SQL no es un valor vacío ni un cero: es la ausencia de valor. No puedes compararlo con =:

-- Esto NO funciona como esperas
WHERE email = NULL
 
-- Correcto
WHERE email IS NULL
WHERE email IS NOT NULL

BETWEEN

Para comprobar si un valor está dentro de un rango, incluyendo los extremos:

SELECT nombre, precio
FROM productos
WHERE precio BETWEEN 20 AND 100;

Equivale a precio >= 20 AND precio <= 100, pero resulta más legible.

IN

Para comprobar si un valor pertenece a una lista concreta de posibles valores:

SELECT nombre, email
FROM usuarios
WHERE nombre IN ('Ana', 'Luis', 'María');

Es más limpio que encadenar varios OR.

Combina condiciones con AND, OR y NOT

Puedes combinar varias condiciones en el mismo WHERE:

  • AND: ambas condiciones deben cumplirse.
  • OR: al menos una debe cumplirse.
  • NOT: invierte el resultado de la condición.
SELECT nombre, precio
FROM productos
WHERE precio > 20 AND precio < 200;
 
SELECT nombre, email
FROM usuarios
WHERE nombre = 'Ana' OR nombre = 'Luis';

Cuando mezclas AND y OR en la misma consulta, usa paréntesis. AND tiene mayor precedencia que OR y sin paréntesis el resultado puede no ser el que esperas:

SELECT nombre, precio
FROM productos
WHERE (precio < 10 OR precio > 500) AND nombre LIKE 'A%';

ORDER BY: ordena los resultados

SQL no garantiza ningún orden concreto en los resultados a menos que lo pidas explícitamente:

-- De menor a mayor precio (ASC es el valor por defecto)
SELECT nombre, precio
FROM productos
ORDER BY precio ASC;
 
-- De mayor a menor
SELECT nombre, precio
FROM productos
ORDER BY precio DESC;

Puedes ordenar por varias columnas separándolas por comas; la prioridad sigue el orden en que las listas.

LIMIT: controla cuántos resultados recibes

En tablas con millones de registros, un SELECT sin límite puede saturar la conexión. LIMIT acota el número de filas devueltas:

SELECT nombre, precio
FROM productos
ORDER BY precio DESC
LIMIT 10;

Los diez productos más caros. Combinar ORDER BY con LIMIT es uno de los patrones más habituales en SQL real.

Con SELECT, FROM y WHERE puedes interrogar cualquier tabla de forma completa. Pero las bases de datos relacionales deben su potencia a algo más: la capacidad de cruzar varias tablas en una sola consulta. Obtener no solo los productos, sino en qué pedidos aparece cada uno y quién los realizó. Para eso están los JOINs.