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

¿Qué es RDB y RDBMS?

14

Instalación local de un RDBMS (Windows)

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

Preguntándole a la base de datos

46/67
Recursos
  • GROUP_CONCAT toma el resultado del query y lo pone como campo separado por comas.

Aportes 214

Preguntas 36

Ordenar por:

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

Función CASE permite agregar un campo virtual con información generada a partir de condiciones múltiples.
Mostrar el idioma, precio de todos los libros, así como agregar una columna de informe que indique si el libro es caro, módico o barato basado en el precio

SELECT  idioma, precio, 
CASE
	WHEN precio > 1000 THEN "Muy caro"
	WHEN precio > 500 THEN "Precio módico"
	ELSE "Muy barato"
END AS "informe"
FROM libros;

Para los que todavia tienen problemas con las relaciones entre tablas, les anexo el diagrama de Venn que hice para no confundirme. Espero que sea de ayuda!

Una buena practica es dar Alias a las tablas para no tener que llamarlas por su nombre completo

Ejemplo:

SELECT P.posts_Id,P.Titulo, count(E.Etiquetas_Id) NoEtiquetas
 FROM posts P
  LEFT JOIN posts_etiquetas PE
   ON P.posts_Id = PE.posts_Id
  LEFT JOIN etiquetas E
   ON E.Etiquetas_Id = PE.Etiquetas_Id
GROUP BY posts_Id,P.Titulo
ORDER BY count(E.Etiquetas_Id) DESC

Otro aporte sería el mencionar que la función GROUP_CONCAT si bien acepta un solo parámetro, se puede personalizar al gusto mediante estas tres opciones
DISTINCT, ORDER BY, SEPARATOR

SELECT posts.titulo, GROUP_CONCAT(DISTINCT etiquetas.nombre ORDER BY etiquetas.nombre SEPARATOR " - "), posts.id, COUNT(*) AS num_etiquetas
FROM posts
INNER JOIN posts_etiquetas
ON posts.id = posts_etiquetas.post_id
INNER JOIN etiquetas
ON etiquetas.id = posts_etiquetas.etiqueta_id
GROUP BY posts.id
ORDER BY num_etiquetas;

GROUP_CONCAT. Sirve para concatenar todos los registros afectados por un GROUP BY en un solo campo.
'
Criterios.

  • DISTINCT. Evita duplicidad en los valores.
  • ORDER BY. Sirve para decidir el orden de concatenación del campo.
  • SEPARATOR. Es el separador a utilizar para separar los valores (por defecto, el separador es una coma “,”).
-- Cuales etiquetas pertenecen a los posts.
Select posts.Titulo, Group_Concat(Distinct etiquetas.Nombre_Etiqueta 
							Order By etiquetas.Nombre_Etiqueta 
							Separator ' - ') As Nom_Etiqueta
From posts
	Inner Join posts_etiquetas On posts.Id = posts_etiquetas.Posts_Id
    Inner Join etiquetas on etiquetas.Id = posts_etiquetas.Etiquetas_Id
Group By posts.Id;

-- Cuáles serían los postsId que puede tener relación con un usuario.
Select usuarios.Id, usuarios.Nickname, Group_Concat(posts.Id Separator ' - ') As PostsId
From usuarios
	Inner Join posts On usuarios.Id = posts.Usuario_Id
Group By usuarios.Id;

-- Cuáles son las etiquetas que no tienen ningún posts.
Select * From etiquetas
	Left Join posts_etiquetas On etiquetas.Id = posts_etiquetas.Etiquetas_Id
Where posts_etiquetas.Etiquetas_Id Is Null;

Para que se entienda mejor el INNER JOIN doble hice una pequeña ilustración:

Me he tomado la libertad de generar mis propios apuntes relacionados con este curso así como investigación adicional, y por mucho superan en cuanto a contenido y calidad a los de dos semestres en la universidad.
Gracias profesor

Recomiendo mucho el uso de Alias (AS) para nombrar sus tablas como a y b cuando hacen JOINS. Facilita mucho el nombramiento de cada columna y evita repetir una y otra vez el nombre de la tabla.

Un ejemplo para saber las etiquetas que no tienen posts:

SELECT a.nombre_etiquetas, a.id
FROM etiquetas AS a
LEFT JOIN posts_etiquetas AS b
ON a.id = b.id_etiquetas
WHERE b.id_etiquetas IS NULL;

Me hago la pregunta de cuales son los cursos en los que está matriculado cada alumno respecto a que ciclo y la profesión que esta siguiendo.
/*

/*

Esta es otra forma de relacionar tablas.
Mediante WHERE

SELECT publicaciones.titulo, categorias.nombre, niveles.nombre, usuarios.nombre 
FROM publicaciones, categorias, niveles, usuarios
WHERE 
publicaciones.categoria_id = categorias.id
AND
publicaciones.nivel_id = niveles.id
AND
publicaciones.usuario_id = usuarios.id;

al que copió la base de datos del men de los comentarios “nombre_etiqueta” es en realidad “nombre” a secas

La Funcion Group_concat me volo la cabeza. De verdad es muy util para agrupar informacion sin la necesidad que se repita la primera columna, logrando una consulta mas corta en cantidad de filas y nos permite tambien que el programa que reciba la consulta tenga menos trabajo que hacer ya que la informacion viene ordenada.

¡Esta clase vale oro!

Mi aporte es el modificador SEPARATOR, mismo que nos permite establecer el tipo de separador para el grupo concatenado

SELECT posts.titulo, GROUP_CONCAT(etiquetas.nombre SEPARATOR " - "), posts.id, COUNT(*) AS num_etiquetas
FROM posts
INNER JOIN posts_etiquetas
ON posts.id = posts_etiquetas.post_id
INNER JOIN etiquetas
ON etiquetas.id = posts_etiquetas.etiqueta_id
GROUP BY posts.id
ORDER BY num_etiquetas;

No conocía el GROUP_CONCAT, muy útil

Mi solución a la pregunta: ¿Cuantas etiquetas tiene cada post? antes de ver la clase 💪🏼

SELECT titulo, etiquetas_qty FROM posts INNER JOIN (
    SELECT post_id,
            count(*) AS etiquetas_qty
    FROM posts_etiquetas
    GROUP BY  post_id
) AS etiquetas_qty_table
ON id = etiquetas_qty_table.post_id; 

Trasncripcion del primer ejercicio porque va muy rapido.

tenemos que plantearnos primero que es lo que queremos sacar con El Select, Select lo que nos va a proyectar es justamente de la tabla post… vamos a traer el título del post para saber de qué post se trata, es lo primero que necesitamos. En segundo lugar vamos a necesitar un conteo. conteo de que? el conteo va hacer justamente de los tags osea de los grupos caos tener vamos a tener. Vamos a contar todo y esto le vamos a llamar número de etiquetas, que es justamente el número que nos va a regresar la agrupación. vamos a decir ahora de dónde vamos a sacar la información? que tablas necesitamos para tener información? y hasta este punto necesitamos saber la unión entre varias tablas, necesitamos la unión al menos entre post y etiquetas Pero recuerda que post_etiquetas no tienen una liga directa, tenemos una tabla transitiva que está en medio de las dos y qué hace la unión entre ambas tablas, vamos a reunir las 3 atra vez de está tabla transitiva o tabla pivote entonces vamos a decirle from la vamos a sacar primero de posts y luego vamos a hacer un inner join que todo eso ya lo estuvimos viendo en la clase de from, y vamos a hacer un inner join porque solo nos interesan los que si tienen registros en ambos lados… con la tabla post etiquetas la tabla, la tabla post etiquetas es la tabla transitiva que nos ayudó a unirlo, vamos a hacer un ON, ON nos va a indicar qué campo de cada lado los une, en el caso de la tabla post es el ID del post y del lado de la tabla posts etiqueta es el campo post ID. okay eso nos va a dar la unión entre post y post etiquetas ahora vamos unirlo finalmente con la tabla etiquetas y ese va a ser a través de los campos en la tabla etiquetas en el campo ID de la etiqueta con respecto a en la tabla posts_etiquetas en el campo etiqueta_ID justamente… Eso va a ser la unión entre las escalas 3 tablas, post etiquetas, post_etiquetas y etiquetas, son las 3 tablas que se van a unir y al final lo que le voy a decir es que lo agrupe, Y eso es que le agrupe por el post id, porque lo que me interesa saber es contar cuántas etiquetas cuántos registros en el otro lado tengo en un blog post, entonces teniendo esto lo ejecutamos.
Ahora sí quisiéramos saber un paso más allá podemos ver cuáles son los post que tienen más etiquetas, pata responder a esta pregunta a este query le agregamos la parte de order by y lo vamos a ordenar a través de la, El campo que creamos que es el num_etiquetas, esto nos va a ordenar primero ascendentemente y entonces le vamos a decir que la haga descendentemente para saber cuáles son los que tienen más entonces ya vemos que los que tienen más son esos que tienen 4 y es uno respecto a la bolsa otra respecto a vehículos autónomos y otro que tiene que ver con los mejores vestidos en la alfombra roja resulta que esos son los que tienen mas etiquetas en nuestra base datos…

Si alguien está trabajando con SQL_Server y no le funciona “GROUP_CONCAT” es debido a que aquì la equivalencia es “STRING_AGG(parámetro_agrupar , elemento_separador¨)”.

EL PROFE, ORGULLOSO DE QUE ESTÉS APRENDIENDO
![](

Soy nueva en todo los relacionado con Bases de Datos, pero realmente considero que estas clases han sido muy buenas para poder iniciarse y tener más ganas de aprender.

Wow, no sabía del GROUP_CONCAT, creo que esto me va a ser de muchas ayuda xD

Algo interesante es que a ese group concat le puedes poner igual un alias para que te presente los datos de una forma más bonita:

SELECT posts.titulo, GROUP_CONCAT(etiquetas.nombre_etiqueta) AS etiquetas
FROM posts
	INNER JOIN posts_etiquetas ON posts.id = posts_etiquetas.post_id
	INNER JOIN etiquetas ON etiquetas.id = posts_etiquetas.etiqueta_id
GROUP BY posts.id;

He trabajado con R y aprender acerca de como crear archivos csv me ha sido de mucha ayuda! muchas graciassss

mmmm no sabia que en MySQL los campos por los que agrupas no necesariamente tienen que estar dentro del SELECT, eso es nuevo, en Oracle siempre me marca error cuando pasa eso.

Creo que antes en el curso no se trata el tema de UNIR VARIAS TABLAS con INNER JOIN, hasta ahora solo se habian unido una y una, el profe lo hace aqui automatico y de verdad me perdi un poco. Fui a investigar el paso a paso y halle esto y entendi mejor

https://www.sqlshack.com/learn-sql-join-multiple-tables/

Estas clases vienen enfocadas al análisis y eso es muy bueno

el segundo Inner join se puede omitir en el primer ejercicio por que el count lo realiza sobre el numero de post_id en la tabla post_etiqueta

select posts.titulo ,count(*) num_etiquetas

from POSTS
inner join posts_etiquetas on posts.id = posts_etiquetas.post_id
group by posts.id

Consulta:
¿Cuántas etiquetas tiene cada uno de los posts, agrupados por títulos?

SELECT p.titulo, COUNT(*) AS num_etiquetas
FROM posts p, etiquetas e, posts_etiquetas pe
WHERE p.id = pe.post_id AND e.id = pe.etiqueta_id
GROUP BY p.titulo
ORDER BY num_etiquetas DESC;

En mi caso particular uso la técnica de plano cartesiano limitando con llaves foráneas para que no traiga datos redundantes y así optimice en procesamiento.

Me parece que el INNER es conmutativo, es decir, permite hacer referencia a ambas tablas sin importar si están a la derecha o a la izquierda.

Preguntas

  1. ¿Cuantas etiquetas están ligadas a los blogpost?
select p.titulo, count(pe.etiqueta_id) as etiquetas_x_blog
from posts_etiquetas pe inner join posts p ON pe.post_id=p.id
GROUP BY pe.post_id
  1. Saber cuales son las Etiquetas que estan ligadas a los post
select p.titulo, group_concat(nombre_etiqueta) as etiquetas_x_blog
from posts p 
inner join  posts_etiquetas pe ON pe.post_id=p.id
inner join  etiquetas e ON pe.etiqueta_id=e.id
GROUP BY p.id
  1. Saber cual son las etiquetas que no están relacionadas con un post
select * 
from etiquetas 
left join posts_etiquetas pe on  etiquetas.id=pe.etiqueta_id
where pe.etiqueta_id is null

Consulta:
¿De que tema no se ha publicado ningún post?

SELECT *
FROM etiquetas
WHERE etiquetas.id NOT IN (SELECT posts_etiquetas.etiqueta_id FROM posts_etiquetas);

En algunos casos uso una técnica de subconsultas, donde la condición WHERE depende de una consulta, como es éste caso.

Con GROUP_ CONCAT vamos a poder mostrar los datos asociados a una columna de otra tabla en forma de seguida separados por comas, esto será útil para mostrar la relación que tienen nuestros datos y hacer los resultados de nuestras consultas más sencillos y completos.

Otra forma para saber cuántas etiquetas tiene un post es así:

SELECT posts.id, posts.titulo, COUNT(post_etiquetas.post_id) AS num_etiquetas
FROM posts
INNER JOIN posts_etiquetas
ON posts.id = post_etiquetas.post_id
GROUP BY posts.id;

Buenas noches.
Esta pregunta lo realice de esta manera:

  1. ¿Cuántas etiquetas están ligadas a un blogposts?

Mi solución a la pregunta: ¿Cuales son las etiquetas que no tienen asociado ningún post? antes de ver la clase 👌🏼

SELECT nombre_etiqueta 
FROM posts_etiquetas
	RIGHT JOIN etiquetas ON etiquetas.id = posts_etiquetas.etiqueta_id
WHERE posts_etiquetas.post_id IS NULL
A mi no me funcionó la sentencia `SELECT posts.titulo, GROUP_CONCAT(nombre_etiquetas)` En su lugar tuve que usar `SELECT posts.titulo, GROUP_CONCAT(etiquetas.nombre)` Se le puede agregar `SELECT posts.titulo, GROUP_CONCAT(etiquetas.nombre) AS nombre_etiquetas` Para que quede como en el ejemplo de la clase

No hace falta traer la 3er tabla para saber cuantas etiquetas tiene un posts, lo hice de esta manera y obtuve el mismo resultado que el profesor

SELECT titulo , COUNT(*) AS cant_etiquetas 
FROM posts INNER JOIN posts_etiquetas ON posts.id = posts_etiquetas.post_id 
GROUP BY titulo;

Realizar cálculos con los valores almacenados en la tabla de la base de datos.

Mostrar los libros calculando su IVA, DESCUENTO e IMPORTE TOTAL

SELECT titulo, idioma, precio, 
(precio * 0.16) AS IVA, (precio * .04) as DESCUENTO,
(precio + (precio * 0.16) - (precio * .04) ) AS importe
FROM libros;

no puedo ejecutar el query , me sale esto , alguien me puede ayudar

  • este es el codigo:

SELECT posts.titulo, GROUP_CONCAT(nombre_etiqueta)
FROM posts
INNER JOIN posts.etiquetas ON posts.id=posts_etiquetas.post_id
INNER JOIN etiquetas ON etiquetas.id=posts_etiquetas.etiqueta_id
GROUP BY posts.id;

Hola, les explico la lógica en palabras mas sencillas.

Al hacer:

SELECT  *
FROM    posts
    INNER JOIN posts_etiquetas ON posts.id = posts_etiquetas.post_id
    INNER JOIN etiquetas ON etiquetas.id = posts_etiquetas.etiqueta_id
;

Se juntan las tablas posts, posts_etiquetas y etiquetas, creando una tabla con todas las columnas juntas, al unir, nos da una tabla que repite toda la información del post en la misma cantidad de etiquetas que tenga.

Seguidamente agrupa por el ID del post y cuenta cuantas veces se repite ese id o el título para determinar cuántas etiquetas tenía ese mismo título.

Escribe el query de mas arriba en workbench y lo entenderás mejor.

En oracle al 99,999% soy seguro, che no puedes traer un campo en el Select, que no sea parte del Group By.
En el ejemplo, se trae e titulo e se agrupa por id, esto daria errore en oracle.
En MySQL es mas flexible hacer queries, en algun proyecto he tenido la oportunidad de usar MySql y las escribia sabiendo que en algun otro RBDMS no iban a funzionar.

Here’s the commands that use the teacher in the video:
SELECT posts.titulo, COUNT(*) num_etiquetas
FROM posts
INNER JOIN posts_etiquetas ON posts.id = posts_etiquetas.post_id
INNER JOIN etiquetas ON etiquetas.id = posts_etiquetas.etiqueta_id
GROUP BY posts.id
ORDER BY num_etiquetas DESC;

SELECT posts.titulo, GROUP_CONCAT(nombre_etiqueta)
FROM posts
INNER JOIN posts_etiquetas ON posts.id = posts_etiquetas.post_id
INNER JOIN etiquetas ON etiquetas.id = posts_etiquetas.etiqueta_id
GROUP BY posts.id;

SELECT *
FROM etiquetas
LEFT JOIN posts_etiquetas ON etiquetas.id = posts_etiquetas.etiqueta_id
WHERE posts_etiquetas.etiqueta_id IS NULL;

El equivalente de “GROUP_CONCAT” en SQL Server es “STRING_AGG” y se agrega un valor adicional, el cual es el “separador” ejemplo:

SELECT posts.titulo, STRING_AGG(etiquetas.nombre_etiqueta, ', ') AS 'Etiquetas', COUNT(etiquetas.idEtiqueta) AS 'Cantidad'
FROM posts
INNER JOIN posts_etiquetas ON posts_etiquetas.idPost = posts.idPost
INNER JOIN etiquetas ON etiquetas.idEtiqueta = posts_etiquetas.idPostEtiqueta
GROUP BY  posts.titulo;

excelente, no conocía GROUP_CONCAT !!!

para saber cuantos posts a creado cada usuario pero agrupado por nickname:

select usuarios.nickname,count(*) num_posts
from usuarios
inner join posts on posts.usuario_id=usuarios.id
group by usuarios.nickname
order by usuarios.id;

Wow! con esto aprendí como juntar varias tablas, muy practico!

Vaya!!! Esta clase se fue bastante tediosa para mi… Pero aprendo cada vez más.

GROUP_CONCAT toma el resultado del query y lo pone como campo separado por comas.

I’M GONNA BE THE FIRTS THAT WRITE A POST OF MATHs, jsjsjsj

Para encontrar el producto que más se vende en mi tienda virtual, realice una consulta SQL que sume la cantidad de unidades vendidas para cada producto y luego ordenar los resultados en orden descendente

SELECT producto_id, nombre_producto, SUM(cantidad) AS total_vendido
FROM pedidos
GROUP BY producto_id, nombre_producto
ORDER BY total_vendido DESC
LIMIT 10;
SELECT posts.post_id, posts.title, COUNT(*) AS label_quantity, GROUP_CONCAT(label) AS labels
FROM posts
    INNER JOIN post_labels ON posts.post_id = post_labels.post_id
    INNER JOIN labels ON labels.label_id = post_labels.label_id
GROUP BY posts.post_id
ORDER BY label_quantity DESC;

En mi proyecto la pregunta que me hice fue:cuales son los medicamentos disponibles para HIV y cual es el riesgo teratogenico para cada uno de los medicamentos?

Para los compañeros que están trabajando en sql server como yo jejeje, el equivalente a group_concat() es String_agg()
comparto mi query por si a alguien le llega a servir:

SELECT posts.titulo,STRING_AGG(nombre_etiqueta,',') as nombre_etiquetas
	FROM posts
	inner join posts_etiquetas on posts.id = posts_etiquetas.posts_id
	inner join etiquetas on etiquetas.id = posts_etiquetas.etiquetas_id
GROUP BY posts.titulo,nombre_etiqueta, posts.id

En el segundo 9:30 creo que la sentencia no es
"WHERE posts_etiquetas.etiqueta_id IS NULL" sino “WHERE posts_etiqueta.post_id IS NULL” porque estamos buscando una etiqueta que no tenga ninguna publicación asociada. El resultado que has dado te ha coincidido con la respuesta correcta porque casualmente la etiqueta no tenía una etiqueta_id. Por favor corrígeme si estoy equivocado.

Simplifca tu vida, Simplifca tu query:

Debido a que solo queríamos ver el número de etiquetas por post, podemos skippear los inner joins y solo trabajar con la tabla posts_etiquetas.

SELECT post_id, COUNT(*) AS n_etiquetas
FROM posts_etiquetas
GROUP BY post_id

Además podemos ver el promedio de número de etiquetas usando un nested query.

SELECT AVG(n_etiquetas)
FROM(
	SELECT post_id, COUNT(*) AS n_etiquetas
	FROM posts_etiquetas
	GROUP BY post_id
) AS n_etiq

Cuesta mucho cuando estás aprendiendo lo básico, consideraría ir con ejercicios de menor nivel al principio e ir subiendo progresivamente

Solamente la práctica será el camino para poder dominar la manera de hacer queris

El equivalente en postgresql de group_concat es:

 array_to_string(array_agg(nombre), ',')

Ejmplo:

SELECT titulo, array_to_string(array_agg(nombre), ',')
FROM platziblog."Posts" AS posts
	INNER JOIN platziblog."post_etiquetas" AS pe ON posts.id = pe.post_id
	INNER JOIN platziblog."etiquetas" AS e ON e.id = pe.etiqueta_id
GROUP BY posts.id;

Para la pregunta: ¿Cuántas etiquetas tiene cada post? usé este query:

select posts.titulo, count(*)
FROM posts_etiquetas
INNER JOIN posts
ON posts.id = posts_etiquetas.post_id
GROUP BY posts.titulo;

Muchas gracias por compartir tus conocimientos y poner ejemplos prácticos que son o pueden ser muy parecidos a los que se nos pueden presentar en la industria. ¡Me encanta el curso!

use platziblog;

SELECT posts.titulo AS 'Titulo', group_concat(etiquetas.nombre_etiqueta) etiquetas, count(*) num_etiquetas,
case
	when count(*) >= 4 THEN 'Buen numero de etiquetas'
    when count(*) >= 2 THEN 'Faltan etiquetas'
    else 'Pocas etiquetas'
end as 'Informe'
from posts

al principio no me salia el null pero era un que tenia el nombre de la tabla mal escrito 😅

-- ¿Que etiqueta no tiene ningun post asociado?
SELECT	*
FROM	etiquetas 
	LEFT JOIN posts_etiquetas on etiquetas.id = posts_etiquetas.etiqueta_id
WHERE	posts_etiquetas.etiqueta_id IS NULL;

-- Las categorías ordenadas por numero de posts
SELECT c.nombre_categoria, COUNT(*) AS cant_posts
FROM    categorias AS c
    INNER JOIN posts AS p on c.id = p.categoria_id
GROUP BY c.id
ORDER BY cant_posts DESC;

En Postgres se usa string_agg

SELECT posts.titulo, string_agg(DISTINCT etiquetas.etiqueta, ',') AS etiquetas, COUNT(*) num_etiquetas
FROM posts
	INNER JOIN posts_etiquetas ON posts.id = posts_etiquetas.post_id
	INNER JOIN etiquetas ON etiquetas.id = posts_etiquetas.etiqueta_id
GROUP BY posts.id
ORDER BY num_etiquetas DESC;

En este query se puede obtener cuantas publicaciones ha escrito el usuario de acuerdo a las etiquetas utilizadas

SELECT usuarios.id AS User_ID, usuarios.nickname AS User_nickname, etiquetas.id AS Tag_ID, etiquetas.nombre AS Etiqueta, COUNT(posts_etiquetas.etiqueta_id) AS Publicaciones
FROM usuarios
INNER JOIN posts
ON usuarios.id = posts.usuario_id
INNER JOIN posts_etiquetas
ON posts.id = posts_etiquetas.post_id
INNER JOIN etiquetas
ON posts_etiquetas.etiqueta_id = etiquetas.id
GROUP BY posts_etiquetas.etiqueta_id
ORDER BY usuarios.id ASC;

Haciendo el SELECT donde trajimos las etiquetas sin posts asociados, encontré la forma de hacer el ejercicio inverso al de traer el numero de etiquetas asociadas a cada post. O sea, logré traer el numero de posts asociados a cada etiqueta:

SELECT	etiquetas.nombre_etiqueta, COUNT(*) AS num_posts
FROM	etiquetas 
	LEFT JOIN posts_etiquetas on etiquetas.id = posts_etiquetas.etiqueta_id
WHERE posts_etiquetas.etiqueta_id IS NOT NULL
GROUP BY etiquetas.nombre_etiqueta
ORDER BY num_posts DESC
;

Aquí traigo los mismos datos pero cambiando lo de posts por lo de etiquetas en el ejercicio original:

SELECT  etiquetas.nombre_etiqueta, COUNT(*) AS num_posts
FROM    etiquetas
    INNER JOIN posts_etiquetas ON etiquetas.id = posts_etiquetas.etiqueta_id
    INNER JOIN posts ON posts.id = posts_etiquetas.post_id
GROUP BY etiquetas.id
ORDER BY num_posts DESC;

A la primera pregunta pensé que no era necesario los inner:

SELECT post_id, count(*) as numero_etiquetas 
FROM platziblog.posts_etiquetas
group by post_id
order by numero_etiquetas desc;

Jajajaja a mas de uno aca se nos exploto la cabeza al ver GROUP_CONCAT().

Excelente el group_concat. Ahora también se que en SQL SERVER también existe STRING_AGG

Excelente saber sobre GROUP_CONCAT

No conocía la sentencia GROUP_CONCAT, muy interesante.

A modo de recordatorio los INNER JOIN los vimos en la clase FROM

Muy útil el Group_concat

Excelente video

Como ver Datos Huerfanos en tablas relacionadas

Para relacionarlas de diferentes maneras y consultar datos

como consultar datos de las tablas relacionadas por otra tabla

No conocía Group_Concat!! 😁👌

Por lo que entendi, si en vez de contar la cantidad de elementos (en este caso etiquetas) quiero enumerar cada uno de esos elementos (nombre de las etiquetas), deberia hacer basicamente lo mismo pero reemplazando el COUNT (*) AS num_etiquetas por GROUP_CONCAT (etiquetas.nombre) , agregando por supuesto, un INNER JOIN a la tabla de etiquetas.

muy interesante la explicacion del tema!
★★★★★

muy bien!!

Excelente clase, a seguir practicando consultas

como funciona exactamente la sentencia GROUP_CONCAT?

No tenia conocimiento de la función GROUP CONCAT es de gran ayuda.

Muy bueno el group_concat

¡Excelente GROUP_CONCAT! no había escuchado de ella antes

aqui les dejo un link para practicar un poco con las consultas

GROUP_CONCAT, muy buena función.

GROUP_CONCAT, EXCELENTE. Este curso esta genial. Habia trabajado con BDs con Laravel, pero conocer las bases ayuda a comprender muchas cosas.

Hola si alguien le sirve, en PostgreSQL no existe la función GROUP_CONCAT, pueden usar : array_to_string(array_agg(culumna),’,’) la coma es el separador

Nota:
GROUP_CONCAT(*) → devuelve los valores en una sola columna separados por coma

Sigue siendo la etiqueta sin comentarios: ![](https://static.platzi.com/media/user_upload/Captura%20de%20pantalla%202024-07-24%20103437-17a54026-93bf-4f89-b9b4-4d0aa5523c46.jpg)
Me surgió la duda para agrupar todas las etiquetas que pertenecen a un posts separados por coma de esta manera: ![](https://i.ibb.co/L5mpVsK/Screenshot-from-2024-06-16-05-16-25.png) Y esta fue la solución: ```js SELECT posts.titulo, GROUP_CONCAT(etiquetas.nombre_etiqueta) AS etiquetas FROM posts_etiquetas AS p_e INNER JOIN etiquetas ON etiquetas.id = p_e.etiqueta_id INNER JOIN posts ON posts.id = p_e.post_id GROUP BY p_e.post_id ```
Por qué me da este resultado![]()![]()
Hay que tener en cuenta que en el primer ejemplo de las etiquetas no se ve reflejado en el código directamente el conteo de las etiquetas en el SELECT, más sin embargo las cuenta es por medio de la tabla transitiva. Esto debido a que en la tabla transitiva hay múltiples combinaciones del id del post con varios id de las etiquetas, las cuales si se pueden contar si se agrupan esas combinaciones por el posts.id. Por lo tanto, lo que cuenta son el numero de veces que se repite el post en la tabla transitiva al ser allí donde se interceptan el post\_id y el etiqueta\_id
Mi query con, titulo, números de etiquetas y la agrupación de etiquetas separados por comas: `SELECT p.titulo AS titulo_post,` ` COUNT(*) AS num_etiquetas,` ` group_concat(e.nombre_etiqueta SEPARATOR ', ' ) AS etiquetas` `FROM posts p` `INNER JOIN posts_etiquetas pe ON p.id = pe.post_id` ` INNER JOIN etiquetas AS e ON e.id = pe.etiqueta_id` `GROUP BY p.id` `ORDER BY num_etiquetas DESC;` Result Grid \# titulo\_post, num\_etiquetas, etiquetas 'Los mejores vestidos en la alfombra roja', '4', 'Celebridades, Estilo, Moda, Eventos' 'Se mejora la conducción autónoma de vehículos', '4', 'Automovilismo, Computación, Avances, Robótica' 'La bolsa cae estrepitosamente', '4', 'Brokers, Inversiones, Bolsa de valores, Largo plazo' 'Se descubre nueva partícula del modelo estandar', '3', 'Avances, Física, Nobel' 'Químicos descubren nanomaterial', '3', 'Avances, Química, Nobel' 'Bienes raices más baratos que nunca', '3', 'Inversiones, Bienes Raíces, Largo plazo' 'Equipo veterano da un gran espectaculo', '3', 'Equipos, Campeonatos, Celebridades' 'Fuccia OS sacude al mundo', '3', 'Teléfonos Móviles, Avances, Computación' 'Escándalo en el mundo de la moda', '3', 'Estilo, Moda, Celebridades' 'Se descubre la unión entre astrofísica y fisica cuántica', '3', 'Avances, Física, Nobel' 'Se presenta el nuevo teléfono móvil en evento', '2', 'Teléfonos Móviles, Eventos' 'Tenemos un nuevo auto inteligente', '2', 'Automovilismo, Computación' 'Ganador del premio Nobel por trabajo en genética', '2', 'Nobel, Avances' 'Se fortalece el peso frente al dolar', '2', 'Inversiones, Bolsa de valores' 'Tenemos ganador de la formula e', '2', 'Automovilismo, Campeonatos' 'Ganan partido frente a visitantes', '2', 'Equipos, Campeonatos' 'U.S. Robotics presenta hallazgo', '2', 'Avances, Robótica' 'Cierra campeonato mundial de football de manera impresionante', '2', 'Equipos, Campeonatos' 'Tenemos campeona del mundial de volleiball', '2', 'Campeonatos, Celebridades' 'Los paparatzi captan escándalo en cámara', '1', 'Celebridades' 'Escándalo con el boxeador del momento', '1', 'Celebridades'

Llevo algunos años usando SQL y no sabía que existía GROUP_CONCAT, según estuve averiguando en SQL server sería STRING_AGG() y tiene la misma sintaxis. La verdad que este curso es muy bueno

En la última pregunta, ¿Cuáles son las etiquetas sin usar? Me parece poco intuitivo que al final el Profe use la columna "etiqueta\_id" para validar valores nulos, porqué realmente lo que se quiere validar es que la etiqueta no tenga ningun post asociado, por lo que usar la columna "post\_id" es lo ideal. O esa es mi perspectiva del problema. ```python SELECT * FROM etiquetas LEFT JOIN posts_etiquetas ON etiquetas.id=posts_etiquetas.etiqueta_id WHERE posts_etiquetas.post_id IS NULL; ```SELECT \* FROM etiquetas LEFT JOIN posts\_etiquetas ON etiquetas.id=posts\_etiquetas.etiqueta\_id WHERE posts\_etiquetas.post\_id IS NULL;

a mi me dice que la comlumna nombre_etiqueta no existe en la segunda practica