Queries básicas: SELECT, FROM, WHERE

Intermedio
SQL
SQL
Actualizado: 02/09/2025

SELECT

La instrucción SELECT es el fundamento de cualquier consulta SQL. Su propósito principal es recuperar datos de las tablas de una base de datos, especificando exactamente qué información queremos obtener. Es la herramienta que nos permite visualizar y extraer la información almacenada en nuestras bases de datos.

Sintaxis básica

La sintaxis fundamental de SELECT es sencilla pero versátil:

SELECT columna1, columna2, columna3
FROM nombre_tabla;

Esta estructura básica nos permite especificar las columnas exactas que queremos recuperar de una tabla determinada. Cada columna se separa con una coma, y el nombre de la tabla se especifica después de la palabra clave FROM.

Seleccionar columnas específicas

Cuando trabajamos con bases de datos reales, es buena práctica seleccionar únicamente las columnas que necesitamos. Esto mejora el rendimiento de nuestras consultas y hace que los resultados sean más legibles.

-- Seleccionar información básica de empleados
SELECT nombre, apellido, departamento
FROM empleados;

En este ejemplo, recuperamos solamente tres campos específicos de la tabla empleados, ignorando cualquier otra información como fechas de nacimiento, salarios o direcciones que puedan existir en la tabla.

Seleccionar todas las columnas

El asterisco (*) es un comodín que nos permite recuperar todas las columnas de una tabla sin necesidad de escribirlas individualmente:

SELECT *
FROM empleados;

Esta consulta devuelve todos los campos disponibles en la tabla empleados. Aunque es útil para explorar el contenido completo de una tabla, su uso en aplicaciones de producción debe ser cuidadoso, ya que puede impactar el rendimiento si la tabla contiene muchas columnas o registros.

Alias de columnas

Los alias nos permiten asignar nombres temporales más descriptivos a las columnas en los resultados de nuestra consulta. Esto mejora significativamente la legibilidad, especialmente cuando trabajamos con nombres de columnas técnicos o poco descriptivos.

SELECT 
    nombre AS nombre_empleado,
    apellido AS apellido_empleado,
    salario AS salario_mensual
FROM empleados;

En este ejemplo, las columnas aparecerán en los resultados con los nombres más descriptivos que hemos definido. El uso de alias es especialmente útil cuando generamos reportes o cuando las columnas originales tienen nombres técnicos poco intuitivos.

También podemos crear alias sin la palabra clave AS:

SELECT 
    nombre nombre_empleado,
    apellido apellido_empleado,
    salario salario_mensual
FROM empleados;

Ambas sintaxis producen el mismo resultado, aunque la versión con AS es más explícita y legible.

Alias con espacios

Cuando necesitamos que nuestros alias contengan espacios o caracteres especiales, debemos utilizar comillas dobles o corchetes:

SELECT 
    nombre AS "Nombre del Empleado",
    salario AS "Salario Mensual"
FROM empleados;

Esta funcionalidad es especialmente útil cuando generamos reportes que serán visualizados por usuarios finales que esperan encabezados más amigables.

Expresiones en SELECT

SELECT no se limita únicamente a recuperar columnas existentes. También podemos incluir expresiones y cálculos:

SELECT 
    nombre,
    apellido,
    salario,
    salario * 12 AS salario_anual,
    salario * 0.15 AS impuesto_estimado
FROM empleados;

En este ejemplo, creamos dos columnas calculadas: una que muestra el salario anual multiplicando el salario mensual por 12, y otra que calcula un impuesto estimado del 15%.

Concatenación de columnas

Podemos combinar el contenido de múltiples columnas para crear nuevas expresiones más útiles:

-- En MySQL y otros sistemas
SELECT 
    CONCAT(nombre, ' ', apellido) AS nombre_completo,
    departamento
FROM empleados;
-- En SQL Server
SELECT 
    nombre + ' ' + apellido AS nombre_completo,
    departamento
FROM empleados;

Esta técnica es muy útil para crear campos compuestos que presentan la información de manera más natural y legible.

Valores literales

También podemos incluir valores constantes en nuestras consultas SELECT:

SELECT 
    nombre,
    apellido,
    'Activo' AS estado,
    2024 AS año_consulta
FROM empleados;

Los valores literales aparecerán en todas las filas del resultado con el mismo valor, lo cual puede ser útil para agregar contexto o metadatos a nuestros resultados.

Buenas prácticas con SELECT

Al utilizar SELECT, es recomendable seguir ciertas prácticas profesionales:

  • Especificar columnas exactas en lugar de usar * en aplicaciones de producción
  • Utilizar alias descriptivos para mejorar la legibilidad de los resultados
  • Formatear las consultas de manera clara, especialmente cuando seleccionamos múltiples columnas
  • Ordenar las columnas de manera lógica en la lista SELECT
-- Ejemplo de consulta bien estructurada
SELECT 
    e.codigo_empleado,
    e.nombre,
    e.apellido,
    e.fecha_ingreso,
    d.nombre_departamento
FROM empleados e, departamentos d
WHERE e.id_departamento = d.id_departamento;

FROM

La cláusula FROM especifica el origen de los datos en nuestras consultas SQL. Es la encargada de indicar de qué tabla o tablas queremos recuperar la información, actuando como el vínculo entre nuestra consulta y la base de datos física donde residen los datos.

Sin la cláusula FROM, SQL no sabría dónde buscar la información que solicitamos con SELECT. Es por ello que FROM es un componente obligatorio en toda consulta SELECT que recupera datos de tablas existentes.

Sintaxis básica

La estructura fundamental de FROM es directa y clara:

SELECT columnas
FROM nombre_tabla;

Esta sintaxis establece que los datos se extraerán de la tabla especificada después de la palabra clave FROM. La tabla debe existir en la base de datos y el usuario debe tener permisos de lectura sobre ella.

Especificar una tabla

Cuando trabajamos con una sola tabla, simplemente indicamos su nombre después de FROM:

SELECT nombre, email, telefono
FROM clientes;

En este ejemplo, recuperamos información específica de la tabla clientes. SQL buscará esta tabla en el esquema por defecto del usuario actual y recuperará los datos de las columnas especificadas.

Nombres de tabla con espacios

Algunos sistemas de bases de datos permiten nombres de tabla que contienen espacios o caracteres especiales. En estos casos, debemos usar delimitadores específicos:

-- Usando corchetes (SQL Server)
SELECT *
FROM [Datos Empleados];
-- Usando comillas dobles (PostgreSQL, Oracle)
SELECT *
FROM "Datos Empleados";
-- Usando acentos graves (MySQL)
SELECT *
FROM `Datos Empleados`;

Sin embargo, es recomendable evitar espacios en los nombres de tabla y usar convenciones como datos_empleados para mayor compatibilidad entre diferentes sistemas.

Alias de tabla

Los alias de tabla proporcionan nombres temporales más cortos o descriptivos para las tablas en nuestras consultas. Esto mejora la legibilidad y facilita la escritura, especialmente cuando trabajamos con nombres de tabla largos.

SELECT e.nombre, e.apellido, e.departamento
FROM empleados AS e;

En este ejemplo, asignamos el alias e a la tabla empleados, lo que nos permite referenciar la tabla de manera más concisa en el SELECT. El uso de alias es especialmente útil cuando necesitamos calificar los nombres de columna con el nombre de la tabla.

Alias sin palabra clave AS

La palabra clave AS es opcional en la mayoría de los sistemas SQL. Podemos crear alias directamente:

SELECT c.nombre_cliente, c.email
FROM clientes c;

Ambas sintaxis producen el mismo resultado, aunque incluir AS hace que el código sea más explícito y fácil de leer, especialmente para personas que están aprendiendo SQL.

Especificar esquema y base de datos

En entornos empresariales, es común que las tablas estén organizadas en diferentes esquemas o incluso en bases de datos separadas. FROM nos permite especificar la ubicación completa:

-- Especificando esquema
SELECT producto, precio
FROM ventas.productos;
-- Especificando base de datos y esquema (SQL Server)
SELECT empleado_id, nombre
FROM empresa.recursos_humanos.empleados;

Esta funcionalidad es esencial cuando trabajamos con sistemas que manejan múltiples bases de datos o cuando queremos ser específicos sobre el origen exacto de nuestros datos.

Múltiples tablas en FROM

Podemos especificar múltiples tablas en la cláusula FROM separándolas con comas. Esto crea un producto cartesiano entre las tablas, aunque generalmente necesitaremos filtrar estos resultados con condiciones WHERE apropiadas:

SELECT c.nombre, p.nombre_producto
FROM clientes c, pedidos p
WHERE c.cliente_id = p.cliente_id;

Este enfoque funciona, pero en la práctica moderna es preferible usar la sintaxis JOIN explícita que veremos en lecciones posteriores, ya que hace más clara la intención de relacionar las tablas.

Buenas prácticas con FROM

Al utilizar FROM, es importante seguir ciertas convenciones profesionales:

  • 1. Usar alias consistentes que sean fáciles de entender y recordar:
-- Buena práctica: alias descriptivos
SELECT e.nombre, d.nombre_departamento
FROM empleados AS e, departamentos AS d;
  • 2. Incluir el esquema cuando trabajamos en entornos multi-esquema:
SELECT p.nombre, p.precio
FROM tienda.productos AS p;
  • 3. Mantener coherencia en el estilo de nomenclatura de alias a lo largo del proyecto:
-- Consistente: usar siempre la primera letra de cada palabra
SELECT emp.nombre, dep.nombre
FROM empleados AS emp, departamentos AS dep;
  • 4. Calificar nombres de columna cuando hay posibilidad de ambigüedad:
SELECT c.nombre, p.fecha_pedido
FROM clientes AS c, pedidos AS p
WHERE c.id = p.cliente_id;

WHERE

La cláusula WHERE es el mecanismo fundamental para filtrar y limitar los resultados de nuestras consultas SQL. Su función principal es establecer condiciones específicas que determinan qué filas de una tabla deben incluirse en el resultado final. Sin WHERE, nuestras consultas SELECT devuelven todas las filas de la tabla, lo cual raramente es lo que necesitamos en aplicaciones reales.

Esta cláusula actúa como un filtro inteligente que evalúa cada fila de la tabla según las condiciones que especifiquemos, incluyendo únicamente aquellas filas que cumplan con todos los criterios establecidos.

Sintaxis básica

La estructura fundamental de WHERE es clara y directa:

SELECT columnas
FROM tabla
WHERE condicion;

La condición debe ser una expresión lógica que pueda evaluarse como verdadera o falsa para cada fila. Solo las filas donde la condición resulte verdadera aparecerán en el resultado final.

Operadores de comparación

SQL proporciona varios operadores de comparación que nos permiten crear condiciones precisas:

Igualdad y desigualdad:

-- Buscar empleados del departamento de ventas
SELECT nombre, apellido, salario
FROM empleados
WHERE departamento = 'Ventas';
-- Buscar empleados que no sean del departamento de ventas
SELECT nombre, apellido, departamento
FROM empleados
WHERE departamento != 'Ventas';

Comparaciones numéricas:

-- Empleados con salario mayor a 3000
SELECT nombre, apellido, salario
FROM empleados
WHERE salario > 3000;
-- Empleados con salario menor o igual a 2500
SELECT nombre, apellido, salario
FROM empleados
WHERE salario <= 2500;

Operadores lógicos

Los operadores lógicos nos permiten combinar múltiples condiciones para crear filtros más sofisticados:

Operador AND:

-- Empleados de ventas con salario mayor a 3000
SELECT nombre, apellido, departamento, salario
FROM empleados
WHERE departamento = 'Ventas' AND salario > 3000;

Operador OR:

-- Empleados de ventas o marketing
SELECT nombre, apellido, departamento
FROM empleados
WHERE departamento = 'Ventas' OR departamento = 'Marketing';

Operador NOT:

-- Empleados que no son del departamento de recursos humanos
SELECT nombre, apellido, departamento
FROM empleados
WHERE NOT departamento = 'Recursos Humanos';

Precedencia y paréntesis

Cuando combinamos múltiples condiciones, es fundamental usar paréntesis para controlar el orden de evaluación:

-- Sin paréntesis: puede ser ambiguo
SELECT nombre, apellido, departamento, salario
FROM empleados
WHERE departamento = 'Ventas' OR departamento = 'Marketing' AND salario > 3000;
-- Con paréntesis: significado claro
SELECT nombre, apellido, departamento, salario
FROM empleados
WHERE (departamento = 'Ventas' OR departamento = 'Marketing') AND salario > 3000;

Operador BETWEEN

El operador BETWEEN nos permite filtrar valores dentro de un rango específico:

-- Empleados con salario entre 2500 y 4000
SELECT nombre, apellido, salario
FROM empleados
WHERE salario BETWEEN 2500 AND 4000;

BETWEEN incluye los valores límite en el resultado. Es equivalente a usar >= valor_minimo AND <= valor_maximo.

Operador IN

El operador IN simplifica la búsqueda de valores que coincidan con cualquier elemento de una lista:

-- Empleados de departamentos específicos
SELECT nombre, apellido, departamento
FROM empleados
WHERE departamento IN ('Ventas', 'Marketing', 'Desarrollo');

Esta sintaxis es más concisa y legible que usar múltiples condiciones OR.

Operador LIKE y patrones

El operador LIKE nos permite buscar patrones en campos de texto usando comodines:

-- Empleados cuyo nombre comience con 'Mar'
SELECT nombre, apellido
FROM empleados
WHERE nombre LIKE 'Mar%';
-- Empleados cuyo apellido termine con 'ez'
SELECT nombre, apellido
FROM empleados
WHERE apellido LIKE '%ez';
-- Empleados con exactamente 4 caracteres en el nombre
SELECT nombre, apellido
FROM empleados
WHERE nombre LIKE '____';

Los comodines principales son:

  • % - representa cero, uno o múltiples caracteres
  • _ - representa exactamente un carácter

Manejo de valores NULL

Los valores NULL requieren un tratamiento especial en las condiciones WHERE. Los operadores de comparación tradicionales no funcionan con NULL.

Buscar valores NULL:

-- Empleados sin teléfono registrado
SELECT nombre, apellido, telefono
FROM empleados
WHERE telefono IS NULL;

Buscar valores no NULL:

-- Empleados con teléfono registrado
SELECT nombre, apellido, telefono
FROM empleados
WHERE telefono IS NOT NULL;

Error común que hay que evitar:

-- INCORRECTO: no devuelve los resultados esperados
SELECT nombre, apellido
FROM empleados
WHERE telefono = NULL;  -- Esto no funciona

Filtros con fechas

El filtrado por fechas es una operación común que requiere atención especial al formato:

-- Empleados contratados después del 1 de enero de 2020
SELECT nombre, apellido, fecha_contratacion
FROM empleados
WHERE fecha_contratacion > '2020-01-01';
-- Empleados contratados en 2023
SELECT nombre, apellido, fecha_contratacion
FROM empleados
WHERE fecha_contratacion BETWEEN '2023-01-01' AND '2023-12-31';

Combinando múltiples condiciones

En consultas complejas, podemos combinar diferentes tipos de condiciones:

-- Consulta compleja con múltiples filtros
SELECT nombre, apellido, departamento, salario, fecha_contratacion
FROM empleados
WHERE (departamento = 'Ventas' OR departamento = 'Marketing')
  AND salario BETWEEN 3000 AND 5000
  AND fecha_contratacion >= '2022-01-01'
  AND telefono IS NOT NULL;

Buenas prácticas con WHERE

Para escribir condiciones WHERE efectivas y mantenibles:

  • 1. Usar paréntesis para clarificar la lógica cuando combinamos AND y OR:
SELECT *
FROM productos
WHERE (categoria = 'Electrónicos' OR categoria = 'Informática')
  AND precio < 1000;
  • 2. Colocar las condiciones más selectivas al principio para mejorar el rendimiento:
-- Mejor rendimiento: condición más selectiva primero
SELECT *
FROM empleados
WHERE codigo_empleado = 'E12345' AND departamento = 'Ventas';
  • 3. Ser consistente con el formato y estilo de las condiciones:
SELECT nombre, apellido, salario
FROM empleados
WHERE departamento = 'Ventas'
  AND salario > 3000
  AND fecha_contratacion >= '2023-01-01';
  • 4. Usar IN en lugar de múltiples OR cuando sea posible:
-- Preferible
WHERE departamento IN ('Ventas', 'Marketing', 'Desarrollo')

-- En lugar de
WHERE departamento = 'Ventas' OR departamento = 'Marketing' OR departamento = 'Desarrollo'

Fuentes y referencias

Documentación oficial y recursos externos para profundizar en SQL

Documentación oficial de SQL
Alan Sastre - Autor del tutorial

Alan Sastre

Ingeniero de Software y formador, CEO en CertiDevs

Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, SQL es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.

Más tutoriales de SQL

Explora más contenido relacionado con SQL y continúa aprendiendo con nuestros tutoriales gratuitos.

Aprendizajes de esta lección

  • Comprender la sintaxis y uso básico de la cláusula SELECT para recuperar datos específicos.
  • Aprender a especificar el origen de los datos con la cláusula FROM, incluyendo alias y múltiples tablas.
  • Utilizar la cláusula WHERE para filtrar resultados mediante condiciones lógicas y operadores.
  • Aplicar buenas prácticas en la escritura de consultas SQL para mejorar legibilidad y rendimiento.
  • Manejar casos especiales como valores NULL, patrones con LIKE y filtrado por rangos y fechas.