No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso Práctico de SQL

Curso Práctico de SQL

Israel Vázquez Morales

Israel Vázquez Morales

Agregación y limitantes (GROUP BY y LIMIT)

9/29
Recursos

Aportes 73

Preguntas 9

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

En SQL Sever no existe el comando limit, en cambio se usa el comando TOP que va despues del SELECT
ex:

SELECT TOP 10 * 
FROM Tabla_diaria as A
JOIN Tabla_semanal as B
on A.col1 = B.col1

HAVING es una clausula también bastante usada para especificar condiciones, se usa despues de agrupar los datos

SELECT  name, SUM(sales)
FROM tabla_diaria
GROUP BY name
HAVING SUM(sales) > 100

Agregación y limitantes GROUP BYyLIMIT(SELECT TOP porque no existe LIMIT en SQL)

GROUP BY es una sentencia que agrupa filas que tienen el mismo valor en columnas con el sumatorio. Como decirle ‘encuentra el número de clientes en cada país’.

Suele usarse frecuentemente con las funciones COUNT MAX MIN MAX SUM AVG a un grupo de una o más columnas.

SELECT *
FROM tabla_diaria
GROUP BY marca;

SELECT *
FROM tabla_diaria;
GROUP BY marca, modelo;

SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
ORDER BY COUNT(CustomerID) DESC;

SELECT TOP es usada para especificar el número de registros que se van a retornar.

SELECT TOP es útil para tablas con miles de registros, pues un gran número de registros puede afectar el rendimiento.

SELECT TOP number
FROM table1
WHERE condition;

SELECT TOP 1500
FROM tabla_diaria;

Mis notas personales sobre GROUP BY y LIMIT

Aqui les muestro un resumen de todo lo visto hasta el momento

Si alguien está haciendo el curso con mysql, OFFSET se puede escribir de dos formas:

LIMIT 10, 15 // 10 sería el offset

LIMIT 15 OFFSET 10 // OFFSET debe ir después de LIMIT

Acá la doc de SELECT donde encontré esta parte.

sigo pensando que eres de los mejores profesores de platzi

Agregación (GROUP BY y LIMIT)

  • GROUP BY especifica por qué campos se agrupan las agregaciones
  • LIMIT especifica la cantidad de registros, en SQL Server se llama TOP y va después de SELECT
  • OFFSET especifica a partir de qué registro se trae la consulta, luego puede venir LIMIT para cerrar el rango. En SQL Server es FETCH NEXT

Estoy utilizando el motor MySQL y el Offset va después del Limit

Sin duda que SQL es un camino mucho más complejo de lo imaginado. Ideal para todos los que nos gusta jugar y cruzar datos.

Comparto mi query que hize con ayuda de GROUP BY y AVG, lo que hace es sacarme el promedio de colegiatura que hay por cada carrera

Comparto los apuntes que llevo hasta el momento, espero sea de mucha utilidad 😉

➡️ Con esta consulta pude sacar:

  1. Cuántos alumnos tiene cada carrera.
  2. Ordenar por las carreras que tienen mas alumnos y sacar el top 5.

De esas dos tablas que tenemos podemos sacar muchísimos reportes. He aquí el mío:

Me costó trabajo el OFFSET pero ya esta está dominado.

Me gusta como la entandarización que mencionaba antes se refleja en diferentes librerias. Por ejemplo en pandas de python podemos usar el group by para hacer “tablas dinámicas” y el head(n) para seleccionar una cantidad de datos. Esta ruta es integral definitivamente.

Notas 😄

Agregación y limitantes (GROUP BY y LIMIT).

  • La agregación es la reducción los datos en grupos. Nos sirve mucho para sacar estadísticas y gráficas. Podemos especificar los parámetros por los que queremos agrupar.

  • Ejemplos:

    SELECT * tabla
    GROUP BY marca;
    
    # Se puede usar varios parámetros de agrupación
    SELECT * FROM tabla
    GROUP BY marca, modelo;
    
  • Esto nos podría servir para, por ejemplo, sacar el promedio del costo de cada una de las marcas (en lugar del promedio general de todas generales). Por eso, este parámetro va muy de la mano del SELECT y funciones como AVG.

  • Las limitantes (LIMIT), son sentencias simples para ahorrar recursos y mejorar el rendimiento. Es para limitar el query usando una condición numérica (por ejemplo, solo traer 5 registros). Ejemplos:

    # Primeros 1500 registros
    SELECT * FROM tabla LIMIT 1500;
    
    # Registro 1500 a 3000
    SELECT * FROM tabla
    OFFSET 1500
    LIMIT 1500;
    

Para que hacer un query de cuales son las computadoras mas costosas si ya sabemos que siempre seran las de apple

También pueden realizar prácticas en sitios como:

https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_groupby

SELECT AVG(precio)
FROM Tabla_marcas
GROUP BY marca;

Hola disculpa, lo intento ejecutar en SQL pero no me sale
https://drive.google.com/drive/folders/1mGQ-POrs6yZWF6-M-unnCN_ucGW31U6t
alguna mini guia porfavor.

Increible la combinacion de limit y offset, super útil.

Para ORACLE como usar LIMIT Y OFFSET. Les quiero compartir lo que encontré:

Limit y con ordenamieto similar a Mysql, Postgres

SELECT * FROM (
SELECT a.* FROM libros a
ORDER BY titulo ASC
) WHERE ROWNUM BETWEEN 1 AND 3;
El anterior utiliza between pero también podemos usar las comunes «mayor igual» y «menor igual»:

SELECT * FROM (
SELECT a.* FROM libros a
ORDER BY a.titulo ASC
) WHERE ROWNUM >=1 AND ROWNUM <=3;

Compleja pero rápida

En internet se encontrará muchas más formas, anidadas, complejas y la más optimizada por la velocidad es esta:

SELECT * FROM (
SELECT a.*, ROWNUM AS num FROM (
SELECT * FROM libros ORDER BY titulo ASC
) a WHERE ROWNUM <= 3
) WHERE num >= 1

Aunque no me agrada tanta anidación, cuando trabajas con millones de registros, es la más rápida.

Limitando con Offset

Otra forma implementada a partir de Oracle 12C R1 (12.1), es la clausula OFFSET, algo más familiar y que nos permite realizar paginación fácilmente:

SELECT * FROM libros
ORDER BY titulo
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

Donde indica que después de las primeras 20 filas, tomará las siguientes 10. Bastante útil y aunque el offset es familiar, el fetch next only es algo completamente nuevo y difiere de los demás manejadores, por lo tanto debemos acostumbrarnos que en Oracle todo es y seguirá siendo diferente en comparación con los demás, complicando la estandarización de nuestras consultas.

Yo le cambiaría el nombre al Curso… No se puede llamar “Curso práctico de SQL” le colocaría… "Curso teorico de SQL"
Ademas de que algunas imagenes cuando lo haces en SQL SERVER no funcionan… y toca a ir a consultar externamente.
Un feliz día

Les comparto mis dos consultas la primera usando GROUP BY para hallar cuanto dinero ingresa en total cada carrera de las colegiaturas y la segunda adicionando LIMIT para saber el top 5 de carreras que ingresan más dinero por las colegiaturas.

Agrupación 1 Campo

SELECT CA.carrera
  FROM PRUEBAS.ALUMNOS AL JOIN PRUEBAS.CARRERAS CA 
  					      ON AL.CARRERA_ID = CA.ID
GROUP BY ca.carrera; 

Agrupación 2 Campos

SELECT CA.carrera, 
	   AL.colegiatura
  FROM PRUEBAS.ALUMNOS AL JOIN PRUEBAS.CARRERAS CA 
  					      ON AL.CARRERA_ID = CA.ID
GROUP BY al.colegiatura, ca.carrera; 

Limite

 SELECT *
  FROM PRUEBAS.ALUMNOS
 LIMIT 10;

Limitar a partir de un numero, se usa para paginación empieza desde el registro 6 hasta el 15

  SELECT *
  FROM PRUEBAS.ALUMNOS
OFFSET 5
 LIMIT 10;

9. Agregación y limitantes (GROUP BY y LIMIT)

  • Agregación (ciencia de datos).
  • Reducir los datos en grupos.
  • Decir los parámetros por los cuales queremos agrupar
SELECT * 
FROM tabla_diaria
GROUP BY marca;

SELECT * 
FROM tabla_diaria
GROUP BY marca, modelo;

Limitantes

  • Pone un límite al query
  • Normalmente se utiliza con números
  • Primeros 5 datos, 5 con mayor precio, top ten.
SELECT * 
FROM tabla_diaria
LIMIT 1500;

SELECT * 
FROM tabla_diaria
OFFSET 1500 -- Cuantos quiero que me salte
LIMIT 1500;

No tenía idea del OFFSET, hice un pequeño programa de inventarios y esto hubiera sido demasiado útil en su momento.
Group by suena como las tablas dinamicas en excel. Escoges como las quieres agrupar

Si queremos hacer un GROUP BY, digamos por tres columnas como nombre, email, carrera; lo hacemos de la siguiente manera:

SELECT nombre, email, carrera_id, COUNT(*)
FROM platzi.alumnos
GROUP BY nombre, email, carrera_id;

Y nos arrojaría el siguiente resultado:

Una comparativa simple con GROUP BY, LIMIT y OFFSET usando la BD de ejemplo de este curso.

SELECT colegiatura
FROM alumnos;
/*
colegiatura
-------------
        5000
        2500
        2300
        2000
        4800
        2000
        3000
        2300
        5000
        2300
        5000
        3000
        4500
        2500
         .
         .
         .*/

SELECT colegiatura
FROM alumnos
GROUP BY colegiatura;
/*
 colegiatura
-------------
        3000
        2000
        2300
        4500
        3500
        5000
        2500
        4800
(8 filas)*/

SELECT colegiatura
FROM alumnos
GROUP BY colegiatura
LIMIT 5;
/* Se muestra los primeros 5 resultados.
 colegiatura
-------------
        3000
        2000
        2300
        4500
        3500
(5 filas)*/

SELECT colegiatura
FROM alumnos
GROUP BY colegiatura
LIMIT 5
OFFSET 3;
/* Se muestra los resultados a partir del 4º puesto.
 colegiatura
-------------
        4500 <-- Observar que son los mismos de los
        3500 <-/ dos últimos de la anterior consulta.
        5000
        2500
        4800
(5 filas)*/

Para SQL Server

-- offset de 5 y fetch next de 5
-- top 10: saltar 5 primeros, mostrar los siguientes 5
USE [platzi]
SELECT
	carrera
FROM platzi.carreras
ORDER BY 1 ASC OFFSET 5 ROWS
	FETCH NEXT 5 ROWS ONLY
GO


Para limitar la cantidad de registros que devuelve el SELECT en BD Oracle anteriores a la versión 12c pueden usar la condición:

WHERE ROWNUM < 'NumeroLimite'

, en versiones posteriores se usa la siguiente sintaxis después de los WHERE y los ORDER:

FETCH FIRST 'NumeroLimite' ROWS ONLY

Aquí un pequeño ejercicio para agrupar por alumnos inscritos por carrera

-- agrupar or por carreras
SELECT count(a.id) alumnos_inscritos, c.carrera 
FROM alumnos a 
INNER JOIN carreras c 
ON a.carrera_id = c.id 
GROUP BY c.carrera
ORDER BY alumnos_inscritos DESC;

Me gusta como lo explica antes de llegar al código . Gracias

Tengo una duda. El ‘order by’ de algún modo cumple la misma función del ‘distinct’?

Al agrupar por atributo(s) usando group by, es necesario describirlo en el select. EJM:
SELECT marca, modelo
FROM Tabla_1
GROUP BY marca, modelo

![](

Agregación con GROUP BY y HAVING

  • Ahora, supongamos que solo estás interesado en las carreras que tienen más de 5 alumnos:
SELECT carrera_id, COUNT(*) AS cantidad_alumnos
FROM platzi.alumnos
GROUP BY carrera_id
HAVING COUNT(*) > 5;

La cláusula HAVING se utiliza después del GROUP BY para filtrar los grupos según una condición de agregación. En este caso, estamos seleccionando solo aquellos grupos (carreras) donde la cantidad de alumnos es mayor que 5.

*La propiedad* **OFFSET***, **luego** de las sentencia* **LIMIT**, *permite **saltar** una **determinada** **cantidad** de los **primeros** **registros*** q*ue se **mostraran** en el* Output *o resultado.* `/*` `Syntax` `SELECT *` `FROM tableName` `ORDER BY sentence` `LIMIT value` `OFFSET value;` `*/` `SELECT *` `FROM posts` `ORDER BY publicationDate ASC` `LIMIT 50` `OFFSET 5;` *La propiedad* **FETCH***, **luego** de las sentencia* **OFFSET***, permite **definir** una **determinada** **cantidad total** de **registros** que**** se **mostraran** en el* Output *o resultado.* `/*` `Syntax` `SELECT *` `FROM tableName` `ORDER BY sentence` `OFFSET value` `FETCH value;` `*/` `SELECT *` `FROM products` `ORDER BY productID` `OFFSET 5` `FETCH 20;`
*La propiedad* **GROUP BY** *permite **agrupar** de manera funcional los datos de los campos en una tabla en el* Output *o resultado de una consulta queries, **luego** de las sentencias* **SELECT***,* **FROM***, se **utiliza** la propiedad* **GROUP BY** ***seguido** por el **nombre** del campo a **agrupar**.* ```js /* Syntax SELECT * FROM tableName GROUP BY sentence; */ SELECT status, MONTHNAME(publicationDate) AS postMonth, COUNT(*) AS postQuantity FROM posts GROUP BY status, postMonth; ```*La propiedad* **LIMIT,** ***luego** de las sentencias,* **SELECT***,* **FROM** *y* **ORDER BY** *permite **agregar** un **limite** de resultados de **registros** que se **mostraran** en el* Output *o resultado.* ```js /* Syntax SELECT * FROM tableName ORDER BY sentence LIMIT value; */ SELECT * FROM posts ORDER BY publicationDate ASC LIMIT 20; ```
Debemos tomar en cuanto que la clausula limit varia dependiendo el motor de bases de datos.

CHATGPT:
GROUP BY se utiliza para agrupar datos y realizar operaciones de agregación dentro de esos grupos, mientras que HAVING se utiliza para filtrar esos grupos basados en condiciones específicas después de la agregación.

El estándar SQL es: FETCH FIRST n ROWS ONLY

 

  • LIMIT n es su el equivalente en la mayoría de los DBMS
     

La imagen siguiente corresponde a un FETCH FIRST n ROWS WITH TIES

Utilizando la base de datos de ejemplo, pude hacer una lista (top 5) con la cantidad de alumnos que tenemos por carrera utilizando un OFFSET de 3

hice esta query para ver el promedio de la colegiatura de cada carrera

SELECT pa.carrera_id, ca.carrera, avg(pa.colegiatura) AS avg_c
FROM platzi.alumnos pa
join platzi.carreras ca on  pa.carrera_id= ca.id
GROUP BY pa.carrera_id, ca.carrera
ORDER BY avg_c DESC

Mis apuntes (NOTION):

pequeño ejercicio para ver cuales nombres están repetidos en la tabla de alumnos:

SELECT nombre, COUNT(nombre) AS nombre_repetido
FROM platzi.alumnos
GROUP BY nombre
HAVING COUNT(nombre) >= 2
ORDER BY nombre_repetido DESC;

Les dejo un ejemplo con el dataset del curso!!

Cuando se realiza un GROUP BY, se debe colocar tanto el parámetro al final de la sentencia como en el SELECT, por ejemplo

SELECT [pais]
FROM [Continente]
GROUP BY [pais]

Ya que si no lo colocas así va a dar error.

MYSQL

SELECT  "Campo"
FROM "Tabla"
WHERE "Condición"
LIMIT 10

Tenemos que tener claro que la cláusula LIMIT no existe en Microsoft SQL Server.

En la actual versión de SQL Server , hay una nueva forma de limitar los registros utilizando la cláusula OFFSET.
Este sería un ejemplo de como se haría una consulta en Sql Server en versiones anteriores del 2012

SELECT *
FROM (SELECT *, row_number() over (ORDER BY id ASC) as row from TableName) A 
WHERE row > 0 and row <= 20 ORDER BY id ASC

LIMIT es la última sentencia en el query

siempre hay que reforzar conocimiento, lo bueno es que como tengo los fundamentos de Bases de datos puedo enfocarme mas en consolidarlo

Mysql Worbech se puede hacer lo mismo del offset de la siguiente forma,;
SELECT * FROM DB.table Limit 10 OFFSET 5;

o puede ser :
SELECT * FROM DB.table Limit 5,10;

en postgress no tengo idea, también se puede hacer de la segunda forma?

Cuando intenté aplicare el GROUP BY haciendo uso de la base de estudiantes tal cual se refleja al comienzo de la lección me aparece este mensaje:

ERROR: la columna al . id debe aparecer en la cláusula GROUP BY o ser usada en una función de agregación LINE 1: SELECT *

Está mal explicado lo del offset, si quiero traer del 10 al 20 el offset es 9, no 10.

select *
from tabla
offset 9
limit 10

➡️ Hice una consulta para saber “Cuántos alumnos tiene cada carrera y agruparlo por carrera”

Un ejemplo, en donde agrupo algunos conceptos vistos hasta ahora. La consulta arroja las 5 carreras más usadas:

SELECT carrera, COUNT(*) AS conteo 
FROM platzi.alumnos AS ta
JOIN platzi.carreras AS tc
ON ta.carrera_id = tc.id
GROUP BY carrera
ORDER BY conteo DESC
LIMIT 5
;

Resultado:

Ejemplo (PostgresQL), excluye los primeros 5 ordenados de manera predeterminado, y la trae los siguientes 5 :

select * from status s offset 5 limit 5 

Otro ejemplo (MySQL) :

Así seria con SQL.

SELECT *
FROM tabla
where criterio
ORDER BY empleado ASC
OFFSET 0 ROWS FETCH NEXT 1500 ROWS ONLY

SELECT *
FROM tabla
where criterio
ORDER BY empleado ASC
OFFSET 1500 ROWS FETCH NEXT 1500 ROWS ONLY

Un ejemplo de como yo uso las bases de datos. Manejo un sistema con bases de datos, y la plataforma genera reportes csv, hay una tabla que tiene como columna un titulo, resulta que al generar el reporte, no arroja el csv y esto por que en una fila de una columna o un registro, se guardo mal, y el error del sistema me aparecia que no podía obtener un título. Asi que, haciendo un análisis de donde podria encontrarse ese dato, ya localizado, pude borrar ese registro. Al final, obtuve el reporte de 5 años en un csv.

  1. AGREGACIÓN (Group By)
  • Los datos se agrupan de acuerdo a la instrucción. Para el ejemplo, si tu tabla_diaria tiene información respecto a marcas de computadoras y quieres sumar las de x marca, usas el GROUP BY marca

  • SELECT *
    FROM tabla_diaria
    GROUP BY marca;

  • SELECT *
    FROM tabla_diaria
    GROUP BY marca, modelo;

    1. LIMITANTES (Limit)
  • Con esta sentencia se pone un límite a la búsqueda o acción que estemos realizando

  • SELECT *
    FROM tabla_diaria
    LIMIT 1500; —> De nuestra tabla diaria, traerá los primeros 1500 registros
    SELECT *
    FROM tabla_diaria
    OFFSET 1500; —> Con esta sentencia se están ignorando los primeros 1500 registros
    LIMIT 1500 ;

También se puede usar LIMIT inicio, final;
Por ejemplo para seleccionar 8 alumnos empezando desde el 4to
LIMIT 4, 8;

GROUP BY tiene que ver con agrupación. Indica a la base de datos qué criterios debe tener en cuenta para agrupar.

Gruop by te permite agrupar estilo pivot tables, e informes.

select * from platzi.alumnos offset 500 limit 100;

Limit siempre trae los primeros registros? Cómo puedo hacer para que traiga, no los primeros, sino los de mayor puntuación?