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 65

Preguntas 9

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

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 鈥榚ncuentra 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.

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

sigo pensando que eres de los mejores profesores de platzi

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.

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

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

鉃★笍 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:

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.

Yo le cambiar铆a el nombre al Curso鈥 No se puede llamar 鈥淐urso 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

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

Me cost贸 trabajo el OFFSET pero ya esta est谩 dominado.

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;

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 鈥渢ablas din谩micas鈥 y el head(n) para seleccionar una cantidad de datos. Esta ruta es integral definitivamente.

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.

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


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.

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 鈥榦rder by鈥 de alg煤n modo cumple la misma funci贸n del 鈥榙istinct鈥?

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

![](

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

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:

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;

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)*/

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 鈥淐u谩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?