El Lenguaje de Consulta de Datos (DQL, por sus siglas en inglés) es el componente de SQL dedicado exclusivamente a la recuperación de información almacenada en las tablas de una base de datos. A través de diversas cláusulas, permite filtrar, agrupar, ordenar y segmentar los resultados de manera eficiente.
Estructura Fundamental de una Consulta DQL
Para construir una sentencia de consulta completa, se sigue un orden lógico de palabras clave que el motor de la base de datos procesa secuencialmente:
SELECT
lista_de_campos
FROM
nombre_tabla
WHERE
condiciones_de_filtrado
GROUP BY
campos_de_agrupacion
HAVING
filtros_post_agrupacion
ORDER BY
criterios_de_ordenacion
LIMIT
parametros_de_paginacion;
Preparación del Entorno de Datos
Para ilustrar los conceptos, definiremos una tabla denominada colaboradores que simula la nómina de una organización:
CREATE TABLE colaboradores (
id_empleado INT PRIMARY KEY,
codigo_staff VARCHAR(12) NOT NULL,
nombre_completo VARCHAR(50),
genero CHAR(1),
edad TINYINT UNSIGNED,
dni_archivo CHAR(18),
oficina_ciudad VARCHAR(30),
fecha_contrato DATE
) COMMENT 'Tabla de registros de personal';
INSERT INTO colaboradores (id_empleado, codigo_staff, nombre_completo, genero, edad, dni_archivo, oficina_ciudad, fecha_contrato)
VALUES
(1, 'S001', 'Elena Rodriguez', 'M', 22, '987654321A', 'Madrid', '2021-03-15'),
(2, 'S002', 'Marcos Lopez', 'H', 29, '123456789B', 'Barcelona', '2019-11-20'),
(3, 'S003', 'Sofia Martinez', 'M', 34, NULL, 'Madrid', '2020-01-10'),
(4, 'S004', 'Javier Gomez', 'H', 45, '456123789C', 'Valencia', '2015-06-05'),
(5, 'S005', 'Lucia Fernandez', 'M', 19, '321654987D', 'Sevilla', '2023-02-28'),
(6, 'S006', 'Andres Sanz', 'H', 31, '789456123E', 'Madrid', '2018-09-12'),
(7, 'S007', 'Marta Diaz', 'M', 27, '654789321F', 'Barcelona', '2022-05-14');
Consultas Básicas y Alias
Es posible seleccionar columnas específicas o utilizar alias para mejorar la legibilidad del reporte resultante.
-- Selección de campos específicos
SELECT nombre_completo, edad FROM colaboradores;
-- Uso de alias para columnas
SELECT oficina_ciudad AS 'Ubicación Laboral' FROM colaboradores;
-- Eliminación de duplicados en los resultados
SELECT DISTINCT oficina_ciudad FROM colaboradores;
Filtrado de Datos con WHERE
La cláusula WHERE permite establecer condiciones lógicas para extraer solo las filas que cumplen ciertos criterios.
-- Búsqueda por igualdad exacta
SELECT * FROM colaboradores WHERE edad = 31;
-- Rango de valores (operador BETWEEN)
SELECT * FROM colaboradores WHERE edad BETWEEN 20 AND 30;
-- Validación de nulos
SELECT nombre_completo FROM colaboradores WHERE dni_archivo IS NULL;
-- Pertenencia a un conjunto (operador IN)
SELECT * FROM colaboradores WHERE oficina_ciudad IN ('Madrid', 'Valencia');
-- Coincidencia de patrones (operador LIKE)
-- Buscar nombres que terminen con 'z'
SELECT * FROM colaboradores WHERE nombre_completo LIKE '%z';
Funciones de Agregación
Estas funciones realizan cálculos sobre un conjunto de valores y devuelven un único resultado escalar. Los valores NULL suelen ser ignorados en estos cálculos.
-- Conteo total de registros
SELECT COUNT(*) FROM colaboradores;
-- Cálculo del promedio de edad
SELECT AVG(edad) FROM colaboradores;
-- Obtención del valor máximo y mínimo
SELECT MAX(edad) AS 'Mayor Edad', MIN(edad) AS 'Menor Edad' FROM colaboradores;
-- Sumatoria condicionada
SELECT SUM(edad) FROM colaboradores WHERE oficina_ciudad = 'Barcelona';
Agrupación de Resultados (GROUP BY)
Permite segmentar los datos en grupos basados en una o más columnas para aplicar funciones de agregación sobre cada grupo.
-- Cantidad de empleados por género
SELECT genero, COUNT(*) FROM colaboradores GROUP BY genero;
-- Promedio de edad por ciudad, filtrando ciudades con más de 1 empleado
SELECT oficina_ciudad, AVG(edad)
FROM colaboradores
GROUP BY oficina_ciudad
HAVING COUNT(*) > 1;
Nota técnica: WHERE actúa antes de la agrupación, mientras que HAVING se aplica a los resultados ya agrupados.
Ordenación de los Datos (ORDER BY)
Establece el orden en que se presentan las filas devueltas por la consulta.
-- Orden ascendente por edad y descendente por fecha de contrato
SELECT * FROM colaboradores
ORDER BY edad ASC, fecha_contrato DESC;
Paginación de Consultas (LIMIT)
Especialmente útil en aplicaciones web para no sobrecargar el sistema con miles de registros en una sola petición.
-- Obtener los primeros 3 registros (Página 1)
SELECT * FROM colaboradores LIMIT 0, 3;
-- Obtener los siguientes 3 registros (Página 2)
SELECT * FROM colaboradores LIMIT 3, 3;
Casos de Uso Combinados
A continuación, se presentan ejemplos prácticos que integran múltiples cláusulas para resolver requerimientos específicos.
-- Listado de mujeres entre 20 y 35 años, ordenado por nombre
SELECT nombre_completo, edad
FROM colaboradores
WHERE genero = 'M' AND edad BETWEEN 20 AND 35
ORDER BY nombre_completo;
-- Obtener los 2 empleados más jóvenes de la oficina de Madrid
SELECT * FROM colaboradores
WHERE oficina_ciudad = 'Madrid'
ORDER BY edad ASC
LIMIT 2;