Bienvenida conceptos b谩sicos y contexto hist贸rico de las Bases de Datos

1

Bienvenida conceptos b谩sicos y contexto hist贸rico de las Bases de Datos

2

Playground: tu primera consulta en bases de datos

Introducci贸n a las bases de datos relacionales

3

Historia de las bases de datos relacionales

4

Qu茅 son entidades y atributos

5

Entidades de Platzi Blog

6

Relaciones

7

M煤ltiples muchos

8

Diagrama ER

9

Diagrama F铆sico: tipos de datos y constraints

10

Diagrama F铆sico: normalizaci贸n

11

Formas normales en Bases de Datos relacionales

12

Diagrama F铆sico: normalizando Platziblog

RDBMS (MySQL) o c贸mo hacer lo anterior de manera pr谩ctica

13

Instalaci贸n local de un RDBMS (Windows)

14

驴Qu茅 es RDB y RDBMS?

15

Instalaci贸n local de un RDBMS (Mac)

16

Instalaci贸n local de un RDBMS (Ubuntu)

17

Clientes gr谩ficos

18

Servicios administrados

SQL hasta en la sopa

19

Historia de SQL

20

DDL create

21

Playground: CREATE TABLE

22

CREATE VIEW y DDL ALTER

23

DDL drop

24

Playground: VIEW, ALTER y DROP en SQL

25

DML

26

Playground: CRUD con SQL

27

驴Qu茅 tan standard es SQL?

28

Creando Platziblog: tablas independientes

29

Creando Platziblog: tablas dependientes

30

Creando Platziblog: tablas transitivas

Consultas a una base de datos

31

驴Por qu茅 las consultas son tan importantes?

32

Estructura b谩sica de un Query

33

SELECT

34

Playground: SELECT en SQL

35

FROM y SQL JOINs

36

Utilizando la sentencia FROM

37

Playground: FROM y LEFT JOIN en SQL

38

WHERE

39

Utilizando la sentencia WHERE nulo y no nulo

40

Playground: Filtrando Datos con WHERE

41

GROUP BY

42

ORDER BY y HAVING

43

Playground: Agrupamiento y Ordenamiento de Datos

44

El interminable agujero de conejo (Nested queries)

45

驴C贸mo convertir una pregunta en un query SQL?

46

Pregunt谩ndole a la base de datos

47

Consultando PlatziBlog

48

Playground: Prueba Final con PlatziBlog

Introducci贸n a la bases de datos NO relacionales

49

驴Qu茅 son y cu谩les son los tipos de bases de datos no relacionales?

50

Servicios administrados y jerarqu铆a de datos

Manejo de modelos de datos en bases de datos no relacionales

51

Top level collection con Firebase

52

Creando y borrando documentos en Firestore

53

Colecciones vs subcolecciones

54

Recreando Platziblog

55

Construyendo Platziblog en Firestore

56

Proyecto final: transformando tu proyecto en una db no relacional

Bases de datos en la vida real

57

Bases de datos en la vida real

58

Big Data

59

Data warehouse

60

Data mining

61

ETL

62

Business intelligence

63

Machine Learning

64

Data Science

65

驴Por qu茅 aprender bases de datos hoy?

Bonus

66

Bases de datos relacionales vs no relacionales

67

Elegir una base de datos

No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Compra acceso a todo Platzi por 1 a帽o

Antes: $249

Currency
$209/a帽o

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscr铆bete

Termina en:

16D
4H
37M
23S

ORDER BY y HAVING

42/67
Recursos

La sentencia ORDER BY tiene que ver con el ordenamiento de los datos dependiendo de los criterios que quieras usar.

  • ASC sirve para ordenar de forma ascendente.
  • DESC sirve para ordenar de forma descendente.
  • LIMIT se usa para limitar la cantidad de resultados que arroja el query.

HAVING tiene una similitud muy grande con WHERE, sin embargo el uso de ellos depende del orden. Cuando se quiere seleccionar tuplas agrupadas 煤nicamente se puede hacer con HAVING.

Aportes 270

Preguntas 32

Ordenar por:

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

o inicia sesi贸n.

En pocas palabras un HAVING remplaza al where cuando se usa un GROUP BY

Se me ocurri贸 que se puede evitar el uso de having con una subconsulta:

En SQL SERVER no funciona el LIMIT, en su lugar use el TOP

Note:
ORDER BY : va a ordenar la consulta en el orden que ti lo determines , puedes utilizar como herramientas

  • <>** para determinar que los datos ser谩n discriminados de mayor o menor a que
  • ASC para indicar si el orden seg煤n la discriminaci贸n sera ascendente
  • DESC para indicar si el orden seg煤n la discriminaci贸n sera descendente
  • LIMIT esta herramienta apoyada con ASC o DESC nos indicara segun el valor que le asignemos, que datos nos datos nos arrojara dentro de esas especificaciones
  • HAVING en este caso lo utilizamos para seleccionar las tuplas asignadas

Encadenar consultas con HAVING

SELECT MONTHNAME(fecha_publicacion) AS mes, estatus, COUNT(*) AS cantidad
FROM posts
GROUP BY estatus, mes
HAVING cantidad > 1 AND mes IN ('December', 'May') ;

En la universidad siempre ten铆a problemas para ordenar de manera adecuada mis vistas y mis select, porque no tenia idea de que primero se hacen las agrupaciones y los conteos, despu茅s el filtrado por HAVING y al final el ordenamiento. Me frustraba much铆simo que mi profesora nunca pudo resolverme esa duda y tenia que encontrar otros m茅todos para solucionar algo tan f谩cil como usar HAVING. Dios, es hermoso.

  • El orden inicial en una tabla es acorde a como fueron creados los datos.
  • El default de la sentencia ORDER BY es ascendente.
  • LIMIT es un complemento al ORDER BY y funciona similar a un filtro.
  • Cuando se desea hacer una selecci贸n de rows, se hace con WHERE, pero cuando se desea hacer una selecci贸n de rows agrupados debe hacerse con HAVING.
  • El orden de ejecuci贸n de los comandos es importante. Ejemplo: HAVING va despu茅s de GROUP BY, no puede ir despu茅s de ORDER BY porque lanza error de syntaxis.

Buenas, les dejo un link con una hoja de Excel con todos los queries que hemos visto hasta ahora en el curso con la descripcion de cada uno, espero que sea de utilidad a la comunidad.
Saludos!

https://docs.google.com/spreadsheets/d/1_LIvLPnMTLNqfgarnR1XbXUjs4RTiV9tHARLpvAp8C0/edit?usp=sharing

ORDER BY

Tiene que ver con el ordenamiento de los datos dependiendo de los criterios que quieras usar.

ASC: sirve para ordenar de forma ascendente.
DESC: sirve para ordenar de forma descendente.
LIMIT: se usa para limitar la cantidad de resultados que arroja el query.

Ejemplos:
SQL interpreta el orden de manera ascendente aunque no se lo mencionemos; para poder ASC. O DESC. Solo basta con colocarlo al final del query.
Limit solo basta con colocar el n煤mero (Cantidad) despu茅s de la sentencia.
.
SELECT *
FROM posts
ORDER BY fecha_publicacion DESC
LIMIT 5;
.

HAVING

Tiene una similitud muy grande con WHERE, sin embargo el uso de ellos depende del orden. El filtro como WHERE lo utilizaremos cuando queremos hacer una selecci贸n de tuplas; pero si lo que queremos es selecicionar una selecci贸n de tuplas agrupados, el mismo no puede ir antes de la agrupaci贸n. Cuando se quiere seleccionar tuplas agrupadas 煤nicamente se puede hacer con HAVING.
.
Ejemplos:
SELECT MONTHNAME(fecha_publicacion) AS post_month, estatus, COUNT(*) AS post_quantity
FROM posts
GROUP BY estatus, post_month
HAVING post_quantity > 1
ORDER BY post_month;

Ya que llegaron al uso de ORDER BY y HAVING puedo compartirles mi conocimiento acerca del uso de 脕lgebra Relacional y SQL.

Algebra Relacional
Relaci贸n matem谩tica de conjunto de tuplas, opera sobre las relaciones, conjuntos, el resultado de cualquier operaci贸n es otra relaci贸n. Existen dos tipos de operaciones.
a) Operaciones tradicionales sobre conjuntos. (U,請,-,x)
Dadas dos relaciones R y S:
R U S: Retorna una relaci贸n con las tuplas que est谩n en R o S o en ambas.
R 請 S: Devuelve una relacion con las tuplas que estan en R y S.
R - S: Es una relaci贸n con las tuplas que est谩n en R pero no en S y viceversa.
R x S: Este operador devuelve una relaci贸n con las tuplas de Rn x Sn. r(a1,a2,鈥,an) s(b1,b2,鈥,bn) entonces r x s (a1,a2,鈥,an,b1,b2,鈥,bn)

b) Operaciones especiales del Algebra Relacional.
*PROYECCI脫N: Permite proyectar atributos de una relaci贸n.
PROJECT, (phi)
Sintaxis --> 蟺<Lista de atributos de R> 庐
*SELECCI脫N: Es un operador que permite seleccionar tuplas de una relaci贸n R, si cumple una condici贸n.
SELECTION, SELECT, (sigma)
Sintaxis --> 蟽<condici贸n> 庐
<atributo>
<operacion>
<constante>
*Join: Permite hacer la concatenaci贸n de tuplas o vinculo atravez de las claves externas entre dos o mas relaciones.
Permite la concatenaci贸n de tuplas de diferentes relaciones de acuerdo a una condici贸n.
Sintaxis --> JOIN, R 鈻衡梽 <condici贸n> S

Tambi茅n existe el Join natural: Los atributos que participan en la condici贸n tienen el mismo nombre. Eficiente para eliminar las columnas duplicadas.
R * S

FUNCIONES AGREGADAS Y DE AGRUPACI脫N.
CUENTA: Retorna el n煤mero de tuplas.
SUMA: Retorna la suma de los valores de la lista.
PROMEDIO(PROM): Devuelve el promedio de una lista de valores.
MIN: Devuelve el valor m铆nimo de una lista de valores.
MAX: Retorna el valor m谩ximo de una lista de valores.

Para aplicar una funcion se utiliza la letra:
脹 (f gotica) Sintaxis --> <atri,agr> 脹 f1a1. f2a2 庐

Ahora un ejercicio de examen resuelto con 脕lgebra relacional y SQL. (Imagenes)





SI QUIEREN GANAR UN MES GRATIS 鈥> https://platzi.com/c/Skillparty
Me ayudarian bastante al compartir el link, gracias y a seguir aprendiendo.

#NuncaParesDeAprender

ORDER BY y HAVING

  • ORDER BY sino se coloca criterio de ordenaci贸n, por defecto se ordenar谩 de forma ascendente.

  • HAVING nos ayuda a filtrar los campos din谩micos que se hallan creado, como por ejemplo para contar o sumar.

-- Ordenar los posts por el campo fecha_publicacion de forma ascendente.
Select * From posts 
Order By fecha_publicacion Asc;

-- Ordenar los posts por el campo fecha_publicacion de forma descendente.
Select * From posts 
Order By fecha_publicacion Desc;


-- Ordenar los posts por el campo fecha_publicacion de forma ascendente.
Select * From posts 
Order By fecha_publicacion;

-- Mostrar los primeros cinco posts que resulten de la consulta.
Select * From posts 
Order By fecha_publicacion Asc
Limit 5;

-- Ordenar los posts por el campo Usuario_Id de forma ascendente, exceptuando los valores nulos.
Select * From posts 
Where Usuario_Id Is Not Null 
Order By Usuario_Id Asc;

-- Ordenar los posts por el campo Usuario_Id de forma ascendente, exceptuando los valores nulos y que su Id esten entre 60 y 70.
Select * From posts Where 
Usuario_Id Is Not Null 
and Id Between 60 and 70
Order By Usuario_Id Asc;

-- Agrupar por estatus y mes. Contar los posts y mostrar los que se han mayores a uno. Finalmente se debe ornear por mes.
Select MonthName(fecha_publicacion) As Mes, status, Count(*) As Cant
From posts Group By status, Mes
Having Cant > 1
Order By Mes;

-- Agrupar por A帽o y mes. Contar los posts y mostrar los que sean mayores a uno. Finalmente se debe ornear por A帽o.
Select Year(fecha_publicacion) As A帽o, MonthName(fecha_publicacion) As Mes, status, Count(*) As Cant
From posts Group By A帽o, Mes
Having Cant > 1
Order By A帽o;

Falt贸 el operador OFFSET

SELECT * FROM artists LIMIT 5 OFFSET [Number of rows to skip];

Por ejemplo, digamos que quieres obtener 5 artistas de una tabla, pero no los primeros 5. Quieres obtener de las filas 5 a 8. Por lo tanto debes a帽adir un OFFSET de 2 para saltar las primeras dos filas.

SELECT * FROM artists LIMIT 5 OFFSET 2;

Puede llegar a ser muy 煤til para hacer paginaci贸n.

Limit and Offset

El HAVING es muy importante, recuerdo cuando lo conoc铆 porque mi sentencia SQL no funcionaba xD Algo curioso es que dentro del HAVING tambien puedes poner subqueries con SELECT, de hecho, puedes poner subqueries en una query y tambi茅n funcionar谩!

Puedes ver todas las tablas de tu DB:

SHOW FULL TABLES FROM platziblog;

Aqu铆 dejo una consulta, realmente interesante, ya que me lista un resumen de actores por categor铆a, lo interesante que pude filtrarlo por numero de actores.

Espero sus comentarios.

La sentencia HAVING se usa para condicionar resultados, despu茅s de haberlos agrupado y totalizado.

A este punto no s茅 si se hayan dado cuenta de que las consultas tienen un orden. Una consultas generica contiene:
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT
OFFSET.
Si la consulta que queremos realizar no tiene alguna de esas palabras simplemente la quitamos pero respetando el orden establecido.

Especifica una condici贸n de selecci贸n para un grupo. HAVING se usa normalmente con el GROUP BY. Cuando no est谩 con el GROUP BY, HAVING se comporta como la cl谩usula WHERE, aunque esto es err贸neo utilizarlo, puesto que ralentiza el sistema.

Para practicar

Yo les recomiendo https://www.sololearn.com/Leaderboard/SQL
e encontrado muy pocas plataforma que me ayuden a practicar lo visto. Si alguien sabe de alguna mucho mejor me encantaria leerlos 馃槂

Recomiendo a 1000 este art铆culo. Si no tienes realmente en claro la diferencia entre el WHERE y el HAVING esto te la va a aclarar.

Entonces, para valores agregados usamos HAVING.
Para valores de una tabla ya existente, WHERE.

驴Por qu茅? Por el 贸rden de ejecuci贸n de las instrucciones.

Apuntes:
A trav茅s de ORDER BY podemos ordenar nuestras consultas mediante criterios que podemos asignar mediante esta sentencia. Con la palabra reservada ASC, podemos ordenar nuestra consulta de manera ascendente, y a trav茅s de la palabra reservada DESC, podemos ordenar la misma de forma descendente. Ambas sentencias funcionan de manera similar tanto para letras como para n煤meros, en el caso de las letras, si es de forma ascendente, las letras iran por orden alfabetico de la A a la Z.

HAVING nos permite hacer lo similar a un WHERE, a diferencia de que WHERE no es posible usarlo cuando estamos haciendo consultas con agrupaciones, cosa que si se puede hacer con HAVING.

Nota:
HAVING: Sirve para filtrar columnas despu茅s de hacer agrupaciones o cuando hay datos agrupados, pero debe de declararse antes de Order By

Ejemplo:

SELECT monthname(posts.fecha_publicacion) AS post_month, estatus, COUNT(*) AS post_quantity FROM posts GROUP BY estatus, post_month having post_quantity > 2 ORDER BY post_month

ASC. Se utiliza para ordenar de forma ascendente.

DESC. Se utiliza para ordenar de forma descendente.

LIMIT. Sirve para limitar las rows que agrupamos.

HAVING. Es muy similar a WHERE. Sirve para filtrar campos din谩micos que agrupamos previamente.

Les recomiendo este sitio para que practiquen lo visto hasta ahora en SQL. Aunque tambi茅n se encontrar谩n con otras funciones interesantes y 煤tiles.

https://www.sql-practice.com/

Comparto una cheat sheet de MySQL 8.0 que me ha servido mucho para orientarme de forma 谩gil cuando tengo una duda, la tengo impresa en un banner a la vista en mi espacio de trabajo para familiarizarme con los comandos.
Descargar imagen

Click en la imagen para mas info!

SELECT usuarios.nickname , count(*) AS posts_per_user 
FROM posts INNER JOIN usuarios ON posts.usuario_id=usuarios.id 
GROUP BY usuarios.nickname;

COMANDOS USADOS EN LA CLASE
SELECT *
FROM posts
ORDER BY fecha_publicacion ASC
;

SELECT *
FROM posts
ORDER BY fecha_publicacion DESC
;

SELECT *
FROM posts
ORDER BY titulo ASC
;

SELECT *
FROM posts
ORDER BY titulo DESC
;

SELECT *
FROM posts
ORDER BY usuario_id ASC
;

SELECT *
FROM posts
ORDER BY fecha_publicacion ASC
LIMIT 5
;

SELECT MONTHNAME(fecha_publicacion) AS post_month, estatus, COUNT(*) AS post_quantity
FROM posts
GROUP BY estatus, post_month
HAVING post_quantity > 4
ORDER BY post_month
;

select usuario_id, count(*) as total_users
from posts
where usuario_id is not null
group by usuario_id
having total_users > 4
order by total_users desc;```

Logr茅 algo b谩sico:

SELECT 
    *
FROM
    usuarios
        INNER JOIN
    posts ON usuarios.id = posts.usuario_id;```

馃槃 xD

El 鈥淥RDER BY ____鈥 SIEMPRE tiene que ir al final de una consulta !

Excelente clase!
Tengo una duda no se si sea de Query o Php.
En mi proyecto tengo una base de datos de por ejemplo libros. Primero necesito extraer los libros que sean de un aturo que el cliente elija. Luego de estos libros extra铆dos, aplicarle una formula condicional a cada dato y si da positivo, mostrarlos en pantalla.
Alguien conoce un script que me pueda ayudar en ello?

Muestro el nombre del genero relacionado por el id a libros agrupando por estatus y g茅nero donde el total sea mayor a 1

M谩ximos 5 puntajes totales por videojuego para cada equipo

SELECT equipos.nombre AS equipo, SUM(puntajes.puntaje) AS puntaje, enfrentamientos.enfrentamiento_id AS "enfrentamiento_no.", videojuegos.nombre AS videojuego
FROM equipos
INNER JOIN puntajes ON equipos.equipo_id = puntajes.equipo_id
INNER JOIN enfrentamientos ON enfrentamientos.enfrentamiento_id = puntajes.enfrentamiento_id
INNER JOIN videojuegos ON enfrentamientos.videojuego_id = videojuegos.videojuego_id
GROUP BY equipo, videojuegos.nombre
ORDER BY puntaje DESC
LIMIT 5;

Al igual que en el GROUP BY, en el ORDER BY puedes ordenar por varios campos, bien sea indicando el nombre de su columna, el alias o el numero segun el orden en el SELECT

En el HAVING se puede usar tanto la funcion como el alias colocado a la funcion.

##聽ORDER BY
ORDER BY nos permite establecer criterios para ordenar los datos consultados. Implementemos esto en el ejemplo del blog ordenando los elementos por fecha de publicaci贸n de manera ascendente:

SELECT *
FROM schemaname.posts
ORDER BY post_date ASC;

Para ordenar de manera descendente, usar铆amos la palabra DESC

Si queremos ordenar mediante criterios aplicados a cadenas de texto, podemos emplear la siguiente forma, que por default ordenar谩 alfab茅ticamente (o num茅ricamente si es el caso):

SELECT *
FROM schemaname.posts
ORDER BY title ASC;

Podemos agregar un l铆mite a nuestro ordenamiento mediante la sentencia LIMIT:

SELECT *
FROM schemaname.posts
ORDER BY post_date ASC
LIMIT 5;
<h3>HAVING</h3>

HAVING tiene una similitud con WHERE, pero su diferencia radica en que los elementos que se agrupan, no se pueden filtrar mediante la sentencia WHERE, para eso se utiliza HAVING, ejemplo:

SELECT MONTHNAME(post_date) AS post_month, status, COUNT(*) AS post_quantity
FROM schemaname.posts
GROUP BY status, post_month
HAVING post_quantity > 1
ORDER BY post_month;

29. Mis apuntes sobre: "ORDER BY y HAVING"
El comando ORDER BY lo ordena de manera ascendete por default.
Ordena en base a valores num茅ricos o alfab茅ticos (dependiendo del tipo de dato).
WHERE selecciona los rows antes de hacer los AS, entonces, si quiere seleccionar tuplas
o rows agrupados, debo usar HAVING al final, antes del ORDER BY.

-1. Ejemplo de C贸digo SQL Usando ORDER BY con ASC:

SELECT *
FROM posts
ORDER BY fecha_publicacion ASC;

Explicaci贸n 1: SELECT * <<mostrar todos los resultados>>
FROM posts <<de la tabla posts>>
ORDER BY fecha_publicacion ASC; <<ordenando los valores de manera ASCENDENTE en base al campo 鈥榝echa_publicacion鈥>>

-2. Ejemplo de C贸digo SQL Usando ORDER BY con DESC:

SELECT *
FROM posts
ORDER BY fecha_publicacion DESC;

Explicaci贸n 2: SELECT * <<mostrar todos los resultados>>
FROM posts <<de la tabla posts>>
ORDER BY fecha_publicacion DESC; <<ordenando los valores de manera DESCENDENTE en base al campo 鈥榝echa_publicacion鈥>>

-3. Ejemplo de C贸digo SQL Usando ORDER BY con ASC y LIMIT:

SELECT *
FROM posts
ORDER BY fecha_publicacion ASC
LIMIT 5;

Explicaci贸n 3: SELECT * <<mostrar todos los resultados>>
FROM posts <<de la tabla posts>>
ORDER BY fecha_publicacion DESC <<ordenando los valores de manera DESCENDENTE en base al campo 鈥榝echa_publicacion鈥>>
LIMIT 5; <<solo mostrar los 5 primeros resultados de la consulta>>

-4. Ejemplo de C贸digo SQL

SELECT MONTHNAME(fecha_publicacion) AS post_month, estatus,
COUNT(*) AS post_quantity
FROM posts
GROUP BY estatus, post_month
HAVING post_quantity>1
ORDER BY post_month;

Explicaci贸n 4: SELECT MONTHNAME(fecha_publicacion) AS post_month, estatus, <<Extraer el nombre del mes del campo fecha_publicacion con el nombre post_month, y todos los datos de status>>
COUNT(*) AS post_quantity <<contar la cantidad de registros y poner el valor en un campo llamado post_quantity>>
FROM posts <<de la tabla posts>>
GROUP BY estatus, post_month; <<mostrarlos de manera agrupada en base al valor de los campos, estatus y post_month extra铆do del SELECT>>
HAVING post_quantity>1 <<mostrar solo las rows donde post_quantity sea mayor a 1>>
ORDER BY post_month; <<ordenar los datos en base al valor que tenga post_month>>

HAVING es super cool!!!

tengo un proyecto para una sala de cine estoy realizando el diagrama de entidad relacion para realizar consultas modificaciones y normalizacion de bases de datos

Notas de clase:

WHERE: filtra los datos antes de la agrupaci贸n,
HAVING: filtra una vez los datos est谩n agrupados.

Limit depende del manejador de base de datos, mysql y posgrest, Rowcount en sql server.

B谩sicamente, HAVING es un WHERE que se utiliza en columnas agrupadas.

El uso de having ser铆a como un where aplicado al grupo

HAVING: para selecci贸n de rows agrupados despu茅s de un GROUP BY

Estos son algunos de los querys que se me han ocurrido para mi proyecto:

Este query lo que hace es traerme todos los pedidos que tuve, con sus datos de costos. y me los filtra por por meses.

SELECT pedidos.id, titulo, costo,url_img,cantidad_productos_vendidos,precio_venta,costos_envio,costos_comisiones,utilidad,fecha,id_compania,comisiones.porcentaje,utilidad_comision, clientes.nombre, clientes.telefono,clientes.email
FROM pedidos
INNER JOIN productos ON productos.id = pedidos.id_producto
	JOIN comisiones ON comisiones.id= pedidos.id_comision
	JOIN clientes ON clientes.id = pedidos.id_cliente
HAVING fecha BETWEEN '2019-01-01' AND '2019-06-01'
ORDER BY fecha
;

Este es un poco m谩s espec铆fico al otro, este me trae el nombre del articulo y la cantidad que se vendieron entre tal fecha.

SELECT productos.titulo, productos.costo, SUM(pedidos.cantidad_productos_vendidos) AS vendidos,fecha
FROM pedidos
INNER JOIN productos ON productos.id = pedidos.id_producto
GROUP BY titulo
HAVING  fecha BETWEEN '2019-01-01' AND '2019-06-01'
;

Tengo algunas dudas pero estan algo extensas para explicar por texto, si llego a encontrar la soluci贸n la pondr茅 en la respuesta a este comentario.

Muy buen curso, anteriormente usaba querys muy b谩sicos desde PHP, pero ahora puedo agregarle nuevas caracter铆sticas a mi aplicaci贸n web.


NO PARAMOS. ME ENCANTA

Estos son las sentencias que hemos usado desde la primera clase hasta ahora, aqu铆 les dejo mores.

/Traer datos de tabla posts/

SELECT * FROM posts;

/Traer ciertos datos y dar alias a las tablas/

SELECT titulo AS Encabezado, fecha_publicacion AS Publicado_en FROM posts;

/Contar cuantos posts existen/

SELECT COUNT(*) AS numero_posts FROM posts;

/LEFT JOIN QUE NOS TRAERA TODOS LOS USUARIOS ASI TENGAN O NO TENGAN POSTS/

SELECT * FROM usuarios LEFT JOIN posts ON usuarios.id = posts.usuario_id;

/LEFT JOIN QUE NOS TRAERA TODOS LOS USUARIOS QUE NO TENGAN POSTS/

SELECT * FROM usuarios LEFT JOIN posts ON usuarios.id = posts.usuario_id WHERE posts.usuario_id IS NULL;

/RIGHT JOIN QUE NOS TRAERA TODOS LOS POSTS ASI TENGAN O NO TENGAN USUARIOS ASOCIADOS/

SELECT * FROM usuarios RIGHT JOIN posts ON usuarios.id = posts.usuario_id;

/RIGHT JOIN QUE NOS TRAERA TODOS LOS POSTS QUE NO TENGAN USUARIOS ASOCIADOS/

SELECT * FROM usuarios RIGHT JOIN posts ON usuarios.id = posts.usuario_id WHERE posts.usuario_id IS NULL;

/INNER JOIN 脫 JOIN QUE NOS TRAERA TODOS LOS USUARIOS QUE TENGAN POSTS ASOCIADOS/

SELECT * FROM usuarios JOIN posts ON usuarios.id = posts.usuario_id;

/FORMA DE SIMULAR UN FULL JOIN EL CUAL TRAERA TODA LA INFORMACION DE AMBAS TABLAS/

SELECT * FROM usuarios LEFT JOIN posts ON usuarios.id = posts.usuario_id UNION SELECT * FROM usuarios RIGHT JOIN posts ON usuarios.id = posts.usuario_id;

/FORMA DE SIMULAR UN FULL JOIN EL CUAL TRAERA TODA LA INFORMACION QUE TENGA LA PRIMERA TABLA Y LA OTRA NO Y VICEVERSA/

SELECT * FROM usuarios LEFT JOIN posts ON usuarios.id = posts.usuario_id WHERE posts.usuario_id IS NULL UNION SELECT * FROM usuarios RIGHT JOIN posts ON usuarios.id = posts.usuario_id WHERE posts.usuario_id IS NULL;

/** TRAER DATOS CON EL MENOR **/

SELECT * FROM posts WHERE id <= 50;

/** TRAER EL STATUS ACTIVO O INACTIVO **/

SELECT * FROM posts WHERE estatus = 'activo';

/** TRAER DATOS CON EL DIFERENTE **/

SELECT * FROM posts WHERE estatus != 'activo';

/** TRAER DATOS CON LA SENTENCIA LIKE LA CUAL NOS PERMITE USAR UNA ESPECIE DE FILTRO **/

SELECT * FROM posts WHERE titulo LIKE '%escandalo%';

/** TRAER DATOS USANDO OPERADOR MAYOR O MENOR QUE CON LAS FECHAS **/

SELECT * FROM posts WHERE fecha_publicacion < '2025-01-01';

/** TRAER DATOS USANDO LA SENTENCIA BETWEEN CON FECHAS **/

SELECT * FROM posts WHERE fecha_publicacion BETWEEN '2023-01-01' AND '2025-12-31';

/** TRAER DATOS CON LA SENTENCIA YEAR() **/

SELECT * FROM posts WHERE YEAR(fecha_publicacion) BETWEEN '2023' AND '2024';

/** TRAER DATOS CON LA SENTENCIA MONTH() **/

SELECT * FROM posts WHERE MONTH(fecha_publicacion) = '04';

/** TRAER LOS DATOS NULOS **/

SELECT * FROM posts WHERE usuario_id IS NULL;

/** TRAER LOS DATOS QUE NO SEAN NULOS Y AGREGAR CONDICIONES A ESO **/

SELECT * FROM posts WHERE usuario_id IS NOT NULL AND estatus = 'activo' AND id < 50 AND categoria_id = 2 AND YEAR(fecha_publicacion) = '2025';

/** SENTENCIA GROUP BY **/

SELECT estatus, COUNT(*) AS post_quantity FROM posts GROUP BY estatus;
SELECT estatus, MONTHNAME(fecha_publicacion) AS post_month, COUNT(*) AS post_quantity FROM POSTS GROUP BY post_month, estatus;

/** SENTENCIA HAVING LA CUAL NOS AYUDA A AGRUPAR CUANDO USAMOS HAVING**/

SELECT * FROM posts ORDER BY fecha_publicacion DESC;
SELECT * FROM posts ORDER BY titulo DESC;
SELECT * FROM posts ORDER BY fecha_publicacion LIMIT 5;
SELECT MONTHNAME(fecha_publicacion) AS post_month, estatus, COUNT(*) AS post_quantity FROM posts GROUP BY estatus, post_month HAVING post_quantity > 1 ORDER BY post_month;

comando de MONTHNAME para postgresql:

SELECT TO_CHAR(fecha_publicacion, 'Month') AS post_month, status, COUNT(*) AS post_quantity
FROM platziblog."Posts"
GROUP BY status, post_month
ORDER BY post_month;

Esta consulta fue la m谩s compleja en su momento que me cost贸 d铆as hacerla (porque a煤n no ten铆a el conocimiento suficiente en base de datos o SQL, actualmente parece un chiste):

SELECT 
	public.factura.cantidad AS stock, registro_producto.codigo AS codigo, registro_producto.producto AS producto, registro_producto.valor_unidad AS valor_unidad, factura.subtotal AS subtotal 

FROM 
	public.factura, public.registro_producto, public.registro_usuario 

WHERE 
	factura.id_registro_producto = registro_producto.id 
AND factura.fecha_venta = '"+txf_fechaVenta.getText()+"' 
AND registro_usuario.cedula = '"+txf_cedula.getText()+"'
;

Saludos desde Ecuador 鉂わ笍 un Full Stack en proceso.

buenos dias, se me ocurrio hacer una busqueda de post filtrando por usuario y a帽o

SELECT estatus, titulo, MONTHNAME(fecha_publicacion) as mes,YEAR(fecha_publicacion) as a帽o, count(*) as cantidad_post
FROM usuarios
	LEFT JOIN post ON usuarios.id = post.usuario_id
where login = "monica"
group by mes, titulo, estatus, a帽o
having a帽o = 2023
order by titulo
SELECT monthname(fecha_publicacion) AS post_month, estatus, COUNT(*) AS post_quantity
FROM posts
GROUP BY estatus, post_month
HAVING post_quantity > 2
ORDER BY post_month;

Les comparto algunas consultas sobre la tabla de prueba sakila que est谩 en el workbench de mySQL.

De la base de datos de sakila en MySQL consultar la siguiente informaci贸n:

            - 驴 Los nombres de los actores que trabajaron en cada  pel铆cula?

                SELECT title, actor.first_name, actor.last_name
                FROM film
                LEFT JOIN film_actor
                ON film.film_id = film_actor.film_id
                LEFT JOIN actor
                ON film_actor.actor_id = actor.actor_id

            - 驴 La cantidad de actores que tiene cada pel铆cula?

                SELECT title, COUNT(*) cantidad_actores
                FROM film
                LEFT JOIN film_actor
                ON film.film_id = film_actor.film_id
                GROUP BY title
                ORDER BY cantidad_actores DESC

            - 驴 Los nombres de las pel铆culas en las que trabajo cada actor ?

                SELECT first_name, last_name, title
                FROM actor
                LEFT JOIN film_actor
                ON actor.actor_id = film_actor.actor_id
                LEFT JOIN film
                ON film.film_id = film_actor.film_id

            - 驴 la cantidad de pel铆culas en las que trabaj贸 cada actor?

                SELECT  actor.first_name, actor.last_name, COUNT(*) cantidad_peliculas
                FROM actor
                LEFT JOIN film_actor
                ON actor.actor_id = film_actor.film_id
                GROUP BY actor. actor_id
                ORDER BY cantidad_peliculas DESC

            - 驴 Listar las pel铆culas d贸nde trabaj贸 un actor en particular?

                SELECT first_name, last_name, title
                FROM actor
                LEFT JOIN film_actor
                ON actor.actor_id = film_actor.actor_id 
                LEFT JOIN film
                ON film.film_id = film_actor.film_id
                WHERE actor.actor_id = 1



En el caso de SQL Server el orden del procesamiento l贸gico de una query es distinto al de MySQL.
La princilap diferencia es que en SQL Server primero se ejecutan GROUP BY seguida de HAVING (en caso de que se incluyan) y justo despues se procesa la instrucci贸n SELECT, por lo tanto un RDBS como SQL Server no es posible utilizar los alias de las columnas en el GROUP BY ni en HAVING por que el procesamiento aun no conoce dichos alias.

Adjunto diagrama con el procesamiento l贸gico de una query en SQL Server

Informaci贸n tomada del libro 鈥淚nside Microsoft SQL Server 2008: T-SQL Querying鈥

En el uso se las sentencias GROUP BY y ORDER BY, puede utilizarse tambi茅n en lugar del nombre de la columna la posici贸n que esta ocupa en el Query. As铆 que la consulta quedar铆a as铆.

SELECT MONTHNAME(fecha_publicacion) AS post_month, estatus, COUNT(*) AS post_quantity
FROM posts
GROUP BY 2, 1
ORDER BY 1;

TENGO mi cinturon de herramientas pero muchas de ellas todavia se me olvidan en el garaje, tengo que seguir practicando para que no se me olviden mis herramientas

de la clase pasada queria intentar si podia hacer uso de join , para ver agregar el usuario , y si pude la satisfaccion es inexpresable un peque帽o paso para devs , un gran paso para mi

<select estatus,login as name,monthname(fecha_publicacion) as post_month , count(*) as post_cuantity
from blog . posts
left join blog . usuarios on usuarios.id = usuario_id
group by login,estatus, post_month;> 

ORDEN DE EJECUCI脫N DE COMANDOS SQL
.

Por fin entiendo la diferencia entre Where y Having

solo como comentario el count es mucho mas rapido usando un count(1) en lugar del count() , usar el count() en base de datos mas grandes presenta problemas de rendimiento .

select *
from
where
group by
having
order by

Just beautiful

Tambien puedes filtrar de manera descendente con el signo menos (-) antes del nombre de la columna: Ejemplo -usuario_id

No se si soy el 煤nico, pero me siento super poderoso con las bases de datos con SQL.

Hola team Platzi 馃槃

Comparto avances de mi proyecto.

Posiblemente lo vea en pr贸ximas clases pero鈥 me gustar铆a que en vez de ver el n煤mero id que le corresponde a la marca de guitarra, aparezca el nombre de la marca 馃槙

Lo que me ha gustado de SQL es que me parece casi lenguaje natural, es muy f谩cil de entender lo que se lee y por ende, f谩cil de escribir

WHERE filtra antes de que se agrupen los datos
HAVING se filtra luego de que se agrupen los datos

LIMIT #n: para traer los #n primero registros de la consulta

Entendido, buena explicacion

Having es muy 煤til para conocer datos que se encuentran duplicados y que no deber铆an estarlo!

Valid茅 cuantas vacas hay por raza y mes de nacimiento.

SELECT monthname(F_NACIMIENTO) AS MES, RAZA_ID, COUNT(*) AS CANTIDAD
FROM VACA
GROUP BY MES, RAZA_ID
HAVING CANTIDAD >1
ORDER BY MES ASC
;

Muy bueno el HAVING, no lo conoc铆a mucho

Gracias instructor hasta el momento el curso ha sido excelente, la forma de explicar es lo suficientemente clara, estoy muy contento de haber ingresado a Platzi.

Buena clase ya me queda mas claro la diferencia where y having

No conocia la utilidad del Having. Gracias

select estatus, monthname(fecha_publicacion) as post_month,
count(*) as post_quantity
from usuarios
left join posts on usuarios.id = posts.usuario_id
left join categorias on categoria_id = categorias.id
group by estatus, post_month
having post_quantity > 1
order by post_quantity desc
;

Mostramos Post que sean igual 1 con estatus inactivos y ordenados por mes.

Esta consulta en el proyecto que hago para la universidad donde estudio.

lo interesante esta en la funcion FIND_IN_SET()

SELECT CONCAT('#', DatosGrupoAC.clavePeriodo, DatosGrupoAC.claveAC, DatosGrupoAC.claveGrupoAC) clavePrimaria,
(CASE WHEN (SELECT COUNT(numeroControl) FROM DatosListaACActual WHERE 
	clavePeriodo=(SELECT clavePeriodoActual FROM DatosGeneralesAC) 
	AND DatosListaACActual.claveAC=DatosGrupoAC.claveAC AND DatosListaACActual.claveGrupoAC=DatosGrupoAC.claveGrupoAC
	AND numeroControl='15371172')>0 THEN TRUE ELSE FALSE END) elegido,
(SELECT COUNT(numeroControl) FROM DatosListaACActual 
	WHERE DatosListaACActual.clavePeriodo=DatosGrupoAC.clavePeriodo
	AND DatosListaACActual.claveAC=DatosGrupoAC.claveAC
	AND DatosListaACActual.claveGrupoAC=DatosGrupoAC.claveGrupoAC) inscritos
FROM DatosGrupoAC, DatosAC 
WHERE 
DatosGrupoAC.claveAC=DatosAC.claveAC 
AND FIND_IN_SET(18, carrerasPermitidas) 
AND clavePeriodo=(SELECT clavePeriodoActual FROM DatosGeneralesAC)
AND claveFundamento=2

Exc Clase!

Ejemplo del HAVING

HAVING tiene una similitud muy grande con WHERE, sin embargo el uso de ellos depende del orden. Cuando se quiere seleccionar tuplas agrupadas 煤nicamente se puede hacer con HAVING.

hola, en mi esperiencia personal me he demorado un poco mas de lo esperado en aprender por qur literalmente no tenia ningun conocimiento de base d datos y apesar de que estudio ing_sofware, al realizar los cursos de platzi me di cuenta que no sabia nada,el camino es largo pero voy dando un paso a la ves

Que bien, aprendimos a ordenar tanto de manera ascendente como descendente los registro, y ahora tengo m谩s claro la diferencia que existen entre el WHERE y el HAVING, ser铆a algo como 驴Qu茅 condiciones quiere que cumpla los registros despu茅s de usar el GROUP BY? en el caso del HAVING.
Ahora, como una de las consultas locas de mi proyecto tengo esta, determine los art铆culos con un valor mayor a 2000 que tengan la etiqueta Enlatados y mu茅strelos de forma descendente en base al Id del art铆culo, este es el c贸digo:

SELECT tbArti.Nombre_articulo, tbArti.Valor_articulo, tbEtiq.Nombre_etiqueta
FROM  articulos tbArti
INNER JOIN etiquetas tbEtiq ON tbArti.Id_etiqueta = tbEtiq.Id_etiqueta
WHERE tbArti.Valor_articulo >2000 AND tbEtiq.Nombre_etiqueta = 'Enlatados'
ORDER By tbArti.Id_articulo DESC

Aqu铆 les dejo un script experimentando con ORDER BY y JOIN para ver los posts ordenados por mes y estado, mostrando tambi茅n la categor铆a. Espero sugerencias:

La sentencia ORDER BY tiene que ver con el ordenamiento de los datos dependiendo de los criterios que quieras usar.

ASC sirve para ordenar de forma ascendente.
DESC sirve para ordenar de forma descendente.
LIMIT se usa para limitar la cantidad de resultados que arroja el query.

mostrando los usuarios y el mes que hicieron posts

select usuario_id as usuario, count(*) as posts, monthname(fecha_publicacion) as mes
from posts
group  by mes
having usuario is not null
order by usuario, posts DESC;```

Mi reto principal ha sido a la hora de ingresar datos con n煤meros, no me ha tomado decimales o un n煤mero me queda tipo 0000000001. Es un tema que tengo que investigar para que la base de datos quede est茅ticamente mejor.
El resto de cosas super claras la verdad 馃槃

frase celebre: 鈥渆sas son las ventajas de un editor visual鈥 XD

Pues no us茅 los order by ni having a煤n pero hasta el momento ha sido este:

SELECT nombre_banco, count(*) as card_emitted
FROM bancos
INNER JOIN (tipos_tarjetas inner join tarjetas on tipos_tarjetas.id_tipostarjetas = tarjetas.id_tipotarjeta)
on bancos.id_banco = tarjetas.id_banco
group by nombre_banco;

SELECT city.city, country.country, address.address, district, COUNT(address.address) AS direcciones_por_country FROM city
INNER JOIN country
ON city.country_id = country.country_id
RIGHT JOIN address
ON address.city_id = city.city_id
GROUP BY country.country
HAVING direcciones_por_country > 5

Agrupando las direcciones por barrios y filtrandolos cuales tengan mas de 5.

La selecci贸n de tuplas agrupadas no se puede hacer con WHERE, debe utilizarse el HAVING鈥

-- Es la Conulta mas Local que se me ocurrio
SELECT NICKNAME, YEAR(FECHA_PUBLICACION) AS A脩O, TITULO, COUNT(*) AS 'CANTIDAD POR A脩O' 
FROM USUARIOS
INNER JOIN posts ON USUARIOS.ID  = POSTS.USUARIO_ID
group by NICKNAME
having TITULO LIKE '%mejores%'
ORDER BY A脩O ASC;```

Muy interesante lo de having, nunca lo habia ocupado

buena clase

Muy interesante la diferencia entre WHERE y HAVING

SELECT posts.id, posts.titulo, posts.fecha_publicacion, posts.estatus, usuarios.nickname
FROM posts inner join usuarios on posts.usuario_id = usuarios.id
ORDER BY posts.fecha_publicacion
LIMIT 5
;

Que tal este querie? En anteriores clases viene esta cadena correspondiente a mi proyecto personal.:

SELECT nombre AS Nombre, deuda AS Deuda, telefono AS Telefono
FROM cliente
RIGHT JOIN trabajo ON cliente.id_cliente=trabajo.id_cliente
GROUP BY fecha_entre
ORDER BY fecha_entre DESC;