SQL

Tutorial SQL: Filtrado de grupos de resultados con HAVING

Aprende a usar la cláusula HAVING en SQL para filtrar grupos de resultados tras agrupar datos con ejemplos y optimización.

Aprende SQL y certifícate

Filtrado de grupos

Cuando trabajamos con datos agrupados en SQL, a menudo necesitamos aplicar condiciones específicas a estos grupos para obtener resultados más precisos. La cláusula HAVING nos permite filtrar grupos de resultados después de que han sido creados mediante GROUP BY, algo que no podemos lograr con WHERE.

El filtrado de grupos es una técnica fundamental cuando analizamos datos agregados. Mientras que WHERE filtra filas individuales antes de cualquier agrupación, HAVING se aplica después de que los datos han sido agrupados y las funciones de agregación calculadas.

Sintaxis básica

La sintaxis para filtrar grupos con HAVING es:

SELECT columna1, función_agregación(columna2)
FROM tabla
GROUP BY columna1
HAVING condición_sobre_grupos;

La condición en HAVING normalmente involucra el resultado de una función de agregación como COUNT, SUM, AVG, MAX o MIN.

Ejemplos prácticos

Veamos algunos ejemplos para entender mejor cómo funciona el filtrado de grupos:

Ejemplo 1: Encontrar departamentos con más de 5 empleados

SELECT departamento, COUNT(*) AS num_empleados
FROM empleados
GROUP BY departamento
HAVING COUNT(*) > 5;

Este ejemplo agrupa a los empleados por departamento y luego filtra solo aquellos departamentos que tienen más de 5 empleados.

Ejemplo 2: Identificar productos con ventas totales superiores a $10,000

SELECT id_producto, nombre_producto, SUM(precio * cantidad) AS ventas_totales
FROM ventas
JOIN productos ON ventas.id_producto = productos.id
GROUP BY id_producto, nombre_producto
HAVING SUM(precio * cantidad) > 10000
ORDER BY ventas_totales DESC;

Aquí estamos filtrando grupos de productos cuyas ventas totales superan los $10,000.

Operadores de comparación en HAVING

Podemos utilizar todos los operadores de comparación estándar en la cláusula HAVING:

  • Igualdad: =
  • Desigualdad: <> o !=
  • Mayor que: >
  • Menor que: <
  • Mayor o igual que: >=
  • Menor o igual que: <=

Ejemplo: Encontrar categorías de productos con un precio promedio entre $50 y $100

SELECT categoria, AVG(precio) AS precio_promedio
FROM productos
GROUP BY categoria
HAVING AVG(precio) BETWEEN 50 AND 100;

Condiciones múltiples

También podemos combinar múltiples condiciones en HAVING usando operadores lógicos como AND y OR:

SELECT ciudad, COUNT(*) AS num_clientes, AVG(total_compras) AS promedio_compras
FROM clientes
GROUP BY ciudad
HAVING COUNT(*) > 100 AND AVG(total_compras) > 500;

Este ejemplo muestra ciudades que tienen más de 100 clientes y donde el promedio de compras por cliente supera los $500.

Filtrado con expresiones calculadas

HAVING permite filtrar basándose en expresiones calculadas que involucran funciones de agregación:

SELECT año, mes, SUM(ventas) AS ventas_totales
FROM registro_ventas
GROUP BY año, mes
HAVING SUM(ventas) > (SELECT AVG(ventas_mensuales) FROM estadisticas_anuales);

Este ejemplo filtra para mostrar solo los meses cuyas ventas totales superan el promedio mensual de ventas registrado en otra tabla.

Uso con DISTINCT

Podemos combinar HAVING con DISTINCT para filtrar grupos basados en valores únicos:

SELECT departamento, COUNT(DISTINCT puesto) AS puestos_diferentes
FROM empleados
GROUP BY departamento
HAVING COUNT(DISTINCT puesto) > 3;

Este ejemplo muestra departamentos que tienen más de 3 puestos de trabajo diferentes.

Consideraciones de rendimiento

Al filtrar grupos, es importante considerar el rendimiento de nuestras consultas:

  • HAVING procesa datos después de la agrupación, lo que puede ser costoso en términos de recursos si los grupos son numerosos.
  • Para conjuntos de datos grandes, es recomendable usar WHERE para filtrar filas innecesarias antes de agruparlas.
  • Los índices en las columnas utilizadas en GROUP BY pueden mejorar significativamente el rendimiento.
-- Menos eficiente
SELECT departamento, AVG(salario) AS salario_promedio
FROM empleados
GROUP BY departamento
HAVING AVG(salario) > 50000;

-- Más eficiente si muchos salarios son menores a 30000
SELECT departamento, AVG(salario) AS salario_promedio
FROM empleados
WHERE salario > 30000  -- Filtro previo para reducir filas
GROUP BY departamento
HAVING AVG(salario) > 50000;

En el segundo ejemplo, filtramos primero con WHERE para eliminar salarios bajos que probablemente no contribuirían a grupos que cumplan la condición HAVING, mejorando así el rendimiento.

Casos de uso comunes

El filtrado de grupos es especialmente útil en varios escenarios analíticos:

  • Análisis de ventas: Identificar productos, regiones o períodos con ventas por encima o debajo de ciertos umbrales.
  • Gestión de recursos humanos: Encontrar departamentos con alta rotación de personal o salarios atípicos.
  • Control de calidad: Detectar lotes de producción con tasas de defectos superiores al promedio.
  • Análisis de comportamiento de usuarios: Identificar segmentos de usuarios con patrones de uso específicos.
-- Encontrar categorías de productos con alta variabilidad de precios
SELECT categoria, 
       COUNT(*) AS num_productos,
       MAX(precio) - MIN(precio) AS rango_precio
FROM productos
GROUP BY categoria
HAVING (MAX(precio) - MIN(precio)) > 1000 AND COUNT(*) > 5;

Este ejemplo identifica categorías de productos que tienen una amplia variación de precios (más de $1,000 entre el producto más caro y el más barato) y que contienen más de 5 productos.

WHERE vs HAVING

Cuando trabajamos con consultas SQL, es fundamental entender la diferencia entre las cláusulas WHERE y HAVING, ya que ambas permiten filtrar datos pero operan en momentos diferentes del procesamiento de la consulta y sobre distintos tipos de datos.

La principal diferencia radica en que WHERE filtra filas individuales antes de cualquier agrupación, mientras que HAVING filtra grupos de filas después de que se ha aplicado la agrupación. Esta distinción es crucial para construir consultas eficientes y obtener los resultados esperados.

Momento de ejecución en el procesamiento de consultas

El orden de ejecución de una consulta SQL típica es:

  1. FROM: Selección de tablas
  2. WHERE: Filtrado de filas
  3. GROUP BY: Agrupación de filas
  4. HAVING: Filtrado de grupos
  5. SELECT: Selección de columnas
  6. ORDER BY: Ordenamiento de resultados

Este orden explica por qué WHERE no puede utilizar funciones de agregación en sus condiciones, mientras que HAVING sí puede hacerlo.

Comparación de sintaxis

-- Filtrado con WHERE
SELECT columna1, columna2
FROM tabla
WHERE condición_sobre_filas;

-- Filtrado con HAVING
SELECT columna1, función_agregación(columna2)
FROM tabla
GROUP BY columna1
HAVING condición_sobre_grupos;

Diferencias clave

  • Posición en la consulta: WHERE va antes de GROUP BY, mientras que HAVING va después.
  • Tipo de filtrado: WHERE filtra filas individuales; HAVING filtra grupos.
  • Uso de funciones de agregación: WHERE no puede usar funciones como COUNT, SUM o AVG en sus condiciones; HAVING sí puede.
  • Rendimiento: WHERE generalmente es más eficiente porque reduce el conjunto de datos antes de realizar operaciones de agrupación.

Ejemplos comparativos

Veamos algunos ejemplos que ilustran claramente las diferencias:

Ejemplo 1: Filtrado de filas vs. filtrado de grupos

-- Con WHERE: Empleados con salario mayor a 50000
SELECT nombre, departamento, salario
FROM empleados
WHERE salario > 50000;

-- Con HAVING: Departamentos con salario promedio mayor a 50000
SELECT departamento, AVG(salario) AS salario_promedio
FROM empleados
GROUP BY departamento
HAVING AVG(salario) > 50000;

En el primer caso, filtramos empleados individuales con salarios altos. En el segundo, filtramos departamentos con promedios salariales altos.

Ejemplo 2: Combinando WHERE y HAVING

-- Departamentos con salario promedio mayor a 50000, considerando solo empleados a tiempo completo
SELECT departamento, AVG(salario) AS salario_promedio
FROM empleados
WHERE tipo_contrato = 'Tiempo completo'
GROUP BY departamento
HAVING AVG(salario) > 50000;

Aquí, WHERE filtra primero para incluir solo empleados a tiempo completo, y luego HAVING filtra los grupos resultantes para mostrar solo departamentos con salario promedio superior a 50000.

Cuándo usar cada uno

  • Usa WHERE cuando:

  • Necesites filtrar filas individuales basándote en valores de columnas.

  • Quieras mejorar el rendimiento filtrando datos antes de agruparlos.

  • No necesites usar funciones de agregación en tus condiciones de filtrado.

  • Usa HAVING cuando:

  • Necesites filtrar grupos basándote en resultados de funciones de agregación.

  • Quieras aplicar condiciones después de que los datos han sido agrupados.

  • Necesites referirte a alias de columnas creados en la cláusula SELECT.

Errores comunes

Un error frecuente es intentar usar funciones de agregación en la cláusula WHERE:

-- Incorrecto: ERROR - no se puede usar agregación en WHERE
SELECT departamento, COUNT(*) AS num_empleados
FROM empleados
WHERE COUNT(*) > 5
GROUP BY departamento;

-- Correcto: Usar HAVING para condiciones con funciones de agregación
SELECT departamento, COUNT(*) AS num_empleados
FROM empleados
GROUP BY departamento
HAVING COUNT(*) > 5;

Otro error común es intentar filtrar por un alias de columna usando WHERE:

-- Incorrecto: ERROR - no se puede usar alias en WHERE
SELECT nombre, salario, salario * 1.1 AS salario_con_aumento
FROM empleados
WHERE salario_con_aumento > 55000;

-- Correcto: Repetir la expresión en WHERE
SELECT nombre, salario, salario * 1.1 AS salario_con_aumento
FROM empleados
WHERE salario * 1.1 > 55000;

-- Alternativa: Usar subconsulta o CTE
WITH empleados_con_aumento AS (
    SELECT nombre, salario, salario * 1.1 AS salario_con_aumento
    FROM empleados
)
SELECT *
FROM empleados_con_aumento
WHERE salario_con_aumento > 55000;

Optimización de consultas

Para optimizar el rendimiento de tus consultas, considera estas recomendaciones:

  • Usa WHERE siempre que sea posible para reducir el volumen de datos antes de agrupar.
  • Combina WHERE y HAVING cuando necesites filtrar tanto filas individuales como grupos.
  • Aprovecha los índices en las columnas utilizadas en WHERE para mejorar la velocidad.
-- Menos eficiente
SELECT categoria, COUNT(*) AS total_productos
FROM productos
GROUP BY categoria
HAVING COUNT(*) > 10 AND categoria LIKE 'Electr%';

-- Más eficiente
SELECT categoria, COUNT(*) AS total_productos
FROM productos
WHERE categoria LIKE 'Electr%'  -- Filtra primero para reducir filas
GROUP BY categoria
HAVING COUNT(*) > 10;

Compatibilidad entre bases de datos

La mayoría de los sistemas de gestión de bases de datos relacionales (MySQL, PostgreSQL, SQL Server, Oracle) implementan WHERE y HAVING de manera similar, siguiendo el estándar SQL. Sin embargo, pueden existir pequeñas diferencias en cuanto a optimización y comportamiento específico.

Por ejemplo, en MySQL y PostgreSQL, ambos permiten usar HAVING sin GROUP BY (aunque no es una práctica recomendada), mientras que otros sistemas pueden requerir explícitamente GROUP BY cuando se usa HAVING.

-- Funciona en MySQL y PostgreSQL, pero no recomendado
SELECT COUNT(*) AS total
FROM empleados
HAVING COUNT(*) > 100;

-- Forma estándar y recomendada
SELECT COUNT(*) AS total
FROM empleados
GROUP BY ()  -- Grupo vacío en PostgreSQL
HAVING COUNT(*) > 100;

Entender las diferencias entre WHERE y HAVING te permitirá escribir consultas SQL más precisas y eficientes, aprovechando al máximo las capacidades de filtrado que ofrece el lenguaje.

HAVING con JOIN

La combinación de HAVING con JOIN es una técnica poderosa para filtrar datos agrupados provenientes de múltiples tablas. Esta combinación nos permite realizar análisis complejos sobre datos relacionados, aplicando condiciones a grupos después de haber unido la información de diferentes tablas.

Cuando trabajamos con bases de datos relacionales, rara vez la información que necesitamos está contenida en una sola tabla. Los JOIN nos permiten combinar datos de múltiples tablas, mientras que HAVING nos ayuda a filtrar los resultados agrupados según criterios específicos.

Estructura básica

La estructura típica de una consulta que combina HAVING con JOIN es:

SELECT t1.columna1, t2.columna2, función_agregación(t1.columna3)
FROM tabla1 t1
JOIN tabla2 t2 ON t1.columna_relación = t2.columna_relación
GROUP BY t1.columna1, t2.columna2
HAVING condición_sobre_grupos;

Es importante notar que en la cláusula GROUP BY debemos incluir todas las columnas no agregadas que aparecen en el SELECT.

Ejemplos prácticos

Veamos algunos ejemplos que ilustran el uso de HAVING con diferentes tipos de JOIN:

Ejemplo 1: Encontrar categorías de productos con ventas totales superiores a $10,000

SELECT c.nombre_categoria, SUM(v.cantidad * p.precio) AS ventas_totales
FROM ventas v
INNER JOIN productos p ON v.id_producto = p.id_producto
INNER JOIN categorias c ON p.id_categoria = c.id_categoria
GROUP BY c.nombre_categoria
HAVING SUM(v.cantidad * p.precio) > 10000
ORDER BY ventas_totales DESC;

En este ejemplo, unimos tres tablas (ventas, productos y categorías) para calcular las ventas totales por categoría, y luego filtramos para mostrar solo aquellas categorías cuyas ventas superan los $10,000.

Ejemplo 2: Identificar clientes que han realizado más de 5 pedidos en el último año

SELECT c.id_cliente, c.nombre, COUNT(p.id_pedido) AS total_pedidos
FROM clientes c
LEFT JOIN pedidos p ON c.id_cliente = p.id_cliente
WHERE p.fecha_pedido >= DATE_SUB(CURRENT_DATE, INTERVAL 1 YEAR)
GROUP BY c.id_cliente, c.nombre
HAVING COUNT(p.id_pedido) > 5
ORDER BY total_pedidos DESC;

Aquí utilizamos un LEFT JOIN para incluir a todos los clientes (incluso aquellos sin pedidos), filtramos con WHERE para considerar solo pedidos del último año, y finalmente aplicamos HAVING para mostrar únicamente los clientes con más de 5 pedidos.

Uso con diferentes tipos de JOIN

La cláusula HAVING funciona con todos los tipos de JOIN, cada uno con sus propias implicaciones:

  • INNER JOIN con HAVING: Filtra grupos formados solo por filas que coinciden en ambas tablas.
SELECT d.nombre_departamento, AVG(e.salario) AS salario_promedio
FROM empleados e
INNER JOIN departamentos d ON e.id_departamento = d.id_departamento
GROUP BY d.nombre_departamento
HAVING AVG(e.salario) > 50000;
  • LEFT JOIN con HAVING: Permite filtrar grupos que incluyen filas de la tabla izquierda sin correspondencia en la derecha.
SELECT p.nombre_proveedor, COUNT(pr.id_producto) AS num_productos
FROM proveedores p
LEFT JOIN productos pr ON p.id_proveedor = pr.id_proveedor
GROUP BY p.nombre_proveedor
HAVING COUNT(pr.id_producto) = 0;

Este ejemplo muestra proveedores que no tienen productos asociados (COUNT = 0).

  • RIGHT JOIN con HAVING: Similar al LEFT JOIN pero desde la perspectiva de la tabla derecha.

  • FULL JOIN con HAVING: Permite filtrar grupos formados por todas las filas de ambas tablas (disponible en PostgreSQL, pero no en MySQL).

Casos de uso avanzados

Ejemplo 3: Encontrar departamentos donde el salario promedio es mayor que el promedio general de la empresa

SELECT d.nombre_departamento, AVG(e.salario) AS salario_promedio
FROM empleados e
INNER JOIN departamentos d ON e.id_departamento = d.id_departamento
GROUP BY d.nombre_departamento
HAVING AVG(e.salario) > (
    SELECT AVG(salario) 
    FROM empleados
);

Este ejemplo utiliza una subconsulta dentro de HAVING para comparar el salario promedio de cada departamento con el promedio general.

Ejemplo 4: Identificar productos que se venden en más del 50% de las tiendas

SELECT p.nombre_producto, COUNT(DISTINCT v.id_tienda) AS num_tiendas,
       (SELECT COUNT(*) FROM tiendas) AS total_tiendas
FROM productos p
JOIN ventas v ON p.id_producto = v.id_producto
GROUP BY p.nombre_producto, total_tiendas
HAVING COUNT(DISTINCT v.id_tienda) > total_tiendas * 0.5
ORDER BY num_tiendas DESC;

Aquí combinamos JOIN, GROUP BY, HAVING y una subconsulta para encontrar productos populares que se venden en la mayoría de las tiendas.

Optimización de consultas con HAVING y JOIN

Cuando combinamos HAVING con JOIN, es especialmente importante considerar el rendimiento:

  • Orden de las tablas: Coloca la tabla más pequeña primero en la cláusula FROM para reducir el conjunto de datos inicial.
  • Filtrado temprano: Usa WHERE antes de GROUP BY para reducir la cantidad de filas que se procesan.
  • Índices adecuados: Asegúrate de tener índices en las columnas utilizadas en las condiciones de JOIN, WHERE y GROUP BY.
-- Menos eficiente
SELECT c.nombre_categoria, COUNT(*) AS total_productos
FROM productos p
JOIN categorias c ON p.id_categoria = c.id_categoria
GROUP BY c.nombre_categoria
HAVING COUNT(*) > 10;

-- Más eficiente (si sabemos que pocas categorías tienen más de 10 productos)
SELECT c.nombre_categoria, COUNT(*) AS total_productos
FROM (
    SELECT id_categoria, COUNT(*) AS conteo
    FROM productos
    GROUP BY id_categoria
    HAVING COUNT(*) > 10
) AS subq
JOIN categorias c ON subq.id_categoria = c.id_categoria
GROUP BY c.nombre_categoria;

Errores comunes al usar HAVING con JOIN

  • Omitir columnas en GROUP BY: Todas las columnas no agregadas en SELECT deben aparecer en GROUP BY.
-- Incorrecto: falta incluir nombre_categoria en GROUP BY
SELECT c.id_categoria, c.nombre_categoria, COUNT(*) AS total
FROM productos p
JOIN categorias c ON p.id_categoria = c.id_categoria
GROUP BY c.id_categoria
HAVING COUNT(*) > 5;

-- Correcto
SELECT c.id_categoria, c.nombre_categoria, COUNT(*) AS total
FROM productos p
JOIN categorias c ON p.id_categoria = c.id_categoria
GROUP BY c.id_categoria, c.nombre_categoria
HAVING COUNT(*) > 5;
  • Confundir el orden de ejecución: Recuerda que JOIN y WHERE se ejecutan antes que GROUP BY y HAVING.
-- Incorrecto: intenta filtrar por el alias total_ventas en WHERE
SELECT c.nombre_cliente, SUM(v.monto) AS total_ventas
FROM clientes c
JOIN ventas v ON c.id_cliente = v.id_cliente
WHERE total_ventas > 1000  -- Error: total_ventas no existe aún
GROUP BY c.nombre_cliente;

-- Correcto: usar HAVING para filtrar por el resultado de la agregación
SELECT c.nombre_cliente, SUM(v.monto) AS total_ventas
FROM clientes c
JOIN ventas v ON c.id_cliente = v.id_cliente
GROUP BY c.nombre_cliente
HAVING SUM(v.monto) > 1000;

Ejemplos específicos para MySQL y PostgreSQL

MySQL - Encontrar productos con ventas en múltiples regiones:

SELECT p.nombre_producto, 
       COUNT(DISTINCT r.id_region) AS num_regiones
FROM productos p
JOIN ventas v ON p.id_producto = v.id_producto
JOIN tiendas t ON v.id_tienda = t.id_tienda
JOIN regiones r ON t.id_region = r.id_region
GROUP BY p.nombre_producto
HAVING COUNT(DISTINCT r.id_region) >= 3
ORDER BY num_regiones DESC;

PostgreSQL - Análisis de rendimiento de empleados por departamento:

SELECT d.nombre_departamento,
       COUNT(e.id_empleado) AS num_empleados,
       ROUND(AVG(e.evaluacion), 2) AS evaluacion_promedio
FROM departamentos d
LEFT JOIN empleados e ON d.id_departamento = e.id_departamento
GROUP BY d.nombre_departamento
HAVING COUNT(e.id_empleado) > 5 AND AVG(e.evaluacion) < 3.5
ORDER BY evaluacion_promedio;

Este ejemplo identifica departamentos con más de 5 empleados y un promedio de evaluación inferior a 3.5, lo que podría indicar problemas de rendimiento que requieren atención.

Combinando múltiples JOIN con HAVING

Para análisis más complejos, podemos combinar múltiples JOIN con HAVING:

SELECT c.nombre_categoria, 
       p.nombre_proveedor,
       COUNT(DISTINCT pr.id_producto) AS num_productos,
       SUM(v.cantidad) AS unidades_vendidas
FROM categorias c
JOIN productos pr ON c.id_categoria = pr.id_categoria
JOIN proveedores p ON pr.id_proveedor = p.id_proveedor
JOIN ventas v ON pr.id_producto = v.id_producto
WHERE v.fecha_venta >= '2023-01-01'
GROUP BY c.nombre_categoria, p.nombre_proveedor
HAVING COUNT(DISTINCT pr.id_producto) >= 3
   AND SUM(v.cantidad) > 1000
ORDER BY unidades_vendidas DESC;

Esta consulta identifica combinaciones de categorías y proveedores que tienen al menos 3 productos diferentes y han vendido más de 1000 unidades desde el inicio de 2023.

La combinación de HAVING con JOIN es una herramienta esencial para el análisis de datos relacionales, permitiéndonos extraer información valiosa de múltiples tablas y aplicar condiciones sofisticadas a los resultados agrupados.

Aprende SQL online

Otras lecciones de SQL

Accede a todas las lecciones de SQL y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Introducción A Sql

Introducción Y Entorno

Ddl Y Dml

Introducción Y Entorno

Instalación De Mysql

Introducción Y Entorno

Instalación De Postgresql

Introducción Y Entorno

Tipos De Datos

Introducción Y Entorno

Bases De Datos Y Tablas

Introducción Y Entorno

Sistemas De Gestión De Bases De Datos

Introducción Y Entorno

Tipos De Bases De Datos

Introducción Y Entorno

Creación De Bases De Datos Y Tablas: Create Database, Create Table

Sintaxis Dml Crud

Consultas Básicas De Selección: Select Y Where

Sintaxis Dml Crud

Inserción De Datos: Insert Into

Sintaxis Dml Crud

Actualización De Datos: Update

Sintaxis Dml Crud

Eliminación De Datos: Delete

Sintaxis Dml Crud

Introducción A Dml

Sintaxis Dml Crud

Consultar Datos: Select

Sintaxis Dml Crud

Clasificación De Resultados Con Order By

Filtros Y Clasificación

Filtrado De Valores Únicos Con Distinct

Filtros Y Clasificación

Paginación Con Limit Y Offset

Filtros Y Clasificación

Alterar La Estructura De Tablas Existentes: Alter Table

Sintaxis Ddl

Renombrar Tablas Y Bases De Datos: Rename

Sintaxis Ddl

Vaciar Tablas Y Bases De Datos: Drop

Sintaxis Ddl

Uso De Funciones Agregadas: Count, Sum, Avg, Max, Min

Funciones Y Agrupación

Agrupación De Resultados Con Group By

Funciones Y Agrupación

Filtrado De Grupos De Resultados Con Having

Funciones Y Agrupación

Funciones Numéricas Y Matemáticas

Funciones Y Agrupación

Funciones De Fecha Y Hora

Funciones Y Agrupación

Funciones De Texto

Funciones Y Agrupación

Many To One

Asociaciones Entre Tablas

One To Many

Asociaciones Entre Tablas

One To One

Asociaciones Entre Tablas

Many To Many

Asociaciones Entre Tablas

Relaciones Entre Tablas

Joins Y Subqueries

Uso De Inner Join, Left Join, Right Join, Full Join

Joins Y Subqueries

Creación Y Uso De Subqueries

Joins Y Subqueries

Left Join Y Right Join

Joins Y Subqueries

Full Join

Joins Y Subqueries

Cross Join Y Self Join

Joins Y Subqueries

Optimización De Consultas

Sintaxis Avanzada

Uso De Índices Y Particiones

Sintaxis Avanzada

Uso De Vistas

Sintaxis Avanzada

Triggers Y Eventos

Sintaxis Avanzada

Particiones

Sintaxis Avanzada

Restricciones E Integridad

Sintaxis Avanzada

Transacciones

Sintaxis Avanzada

Vistas Materializadas

Sintaxis Avanzada

Rollback

Sintaxis Avanzada

Vistas Con Create View

Sintaxis Avanzada

Principios Acid

Sintaxis Avanzada

Manejo De Errores Y Excepciones

Sintaxis Avanzada

Funciones Ventana

Sintaxis Avanzada

Índices

Sintaxis Avanzada

Expresiones De Tabla Comunes (Cte) Con With

Sintaxis Avanzada

Creación Y Uso De Funciones

Programación En Sql

Creación Y Uso De Procedimientos Almacenados

Programación En Sql

Variables Y Control De Flujo

Programación En Sql

Creación Y Manejo De Usuarios Y Roles

Seguridad Y Administración

Asignación Y Gestión De Permisos

Seguridad Y Administración

Copias De Seguridad Y Restauración De Bases De Datos

Seguridad Y Administración

Accede GRATIS a SQL y certifícate

Ejercicios de programación de SQL

Evalúa tus conocimientos de esta lección Filtrado de grupos de resultados con HAVING con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Tipos de datos

Test

Inserción de datos: INSERT INTO

Test

Filtrado de grupos de resultados con HAVING

Test

Uso de índices y particiones

Test

Renombrar tablas y bases de datos: RENAME

Test

Uso de vistas

Test

Uso de INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN

Test

Agrupación de resultados con GROUP BY

Test

Creación y uso de subqueries

Test

Sentencias INSERT

Código

Copias de seguridad y restauración de bases de datos

Test

Uso de INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN

Código

Instalación de MySQL

Test

Relaciones entre tablas

Código

Eliminación de datos: DELETE

Test

Creación de bases de datos y tablas: CREATE DATABASE, CREATE TABLE

Test

Creación y uso de funciones

Test

Creación de tablas e inserción de datos con SQL

Proyecto

Uso de funciones agregadas: COUNT, SUM, AVG, MAX, MIN

Test

Optimización de consultas

Test

Introducción a SQL

Test

Triggers y eventos

Test

Clasificación de resultados con ORDER BY

Test

Alterar la estructura de tablas existentes: ALTER TABLE

Test

Eliminación de datos: DELETE

Código

Instalación de PostgreSQL

Test

Creación y uso de procedimientos almacenados

Test

Consultas básicas de selección: SELECT y WHERE

Test

Vaciar tablas y bases de datos: DROP

Test

Actualización de datos: UPDATE

Test

Creación y manejo de usuarios y roles

Test

Consultas básicas de selección SELECT y WHERE

Código

Creación de bases de datos y tablas

Código

Bases de datos y tablas

Test

Actualización de datos: UPDATE

Código

Relaciones entre tablas

Test

Filtrado de valores únicos con DISTINCT

Test

Asignación y gestión de permisos

Test

En esta lección

Objetivos de aprendizaje de esta lección

  • Comprender la función y sintaxis de la cláusula HAVING para filtrar grupos en consultas SQL.
  • Diferenciar entre el uso de WHERE y HAVING y conocer el momento de ejecución de cada uno.
  • Aplicar HAVING en consultas que involucran funciones de agregación y múltiples condiciones.
  • Integrar HAVING con JOIN para filtrar datos agrupados provenientes de varias tablas.
  • Optimizar consultas SQL utilizando HAVING y JOIN considerando el rendimiento y buenas prácticas.