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
Introducción a SQL
Breve historia de SQL
Álgebra relacional
Instalación de la BD de ejemplo
Qué es una proyección (SELECT)
Origen (FROM)
Productos cartesianos (JOIN)
Selección (WHERE)
Ordenamiento (ORDER BY)
Agregación y limitantes (GROUP BY y LIMIT)
Ejercitando tu SQL
El primero
El segundo más alto
Seleccionar de un set de opciones
En mis tiempos
Seleccionar por año
Duplicados
Selectores de rango
Eres lo máximo
Egoísta (selfish)
Resolviendo diferencias
Todas las uniones
Triangulando
Generando rangos
Regularizando expresiones
Conceptos de SQL Avanzado
Bases de datos distribuidas
Queries distribuídos
Sharding
Window functions
Particiones y agregación
El futuro de SQL
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Israel Vázquez Morales
Aportes 73
Preguntas 9
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
GROUP BY
yLIMIT
(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)
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:
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 😄
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;
SELECT *
FROM tabla_diaria
GROUP BY marca;
SELECT *
FROM tabla_diaria
GROUP BY marca, modelo;
Limitantes
SELECT *
FROM tabla_diaria
LIMIT 1500;
SELECT *
FROM tabla_diaria
OFFSET 1500 -- Cuantos quiero que me salte
LIMIT 1500;
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
![](
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.
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.
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
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 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.
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;
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?
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?