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

Introducción a las bases de datos relacionales

2

Historia de las bases de datos relacionales

3

Entidades y atributos

4

Entidades de Platzi Blog

5

Relaciones

6

Múltiples muchos

7

Diagrama ER

8

Diagrama Físico: tipos de datos y constraints

9

Diagrama Físico: normalización

10

Formas normales en Bases de Datos relacionales

11

Diagrama Físico: normalizando Platziblog

RDBMS (MySQL) o cómo hacer lo anterior de manera práctica

12

¿Qué es RDB y RDBMS?

13

Instalación local de un RDBMS (Windows)

14

Instalación local de un RDBMS (Mac)

15

Instalación local de un RDBMS (Ubuntu)

16

Clientes gráficos

17

Servicios administrados

SQL hasta en la sopa

18

Historia de SQL

19

DDL create

20

CREATE VIEW y DDL ALTER

21

DDL drop

22

DML

23

¿Qué tan standard es SQL?

24

Creando Platziblog: tablas independientes

25

Creando Platziblog: tablas dependientes

26

Creando Platziblog: tablas transitivas

Consultas a una base de datos

27

¿Por qué las consultas son tan importantes?

28

Estructura básica de un Query

29

SELECT

30

FROM

31

Utilizando la sentencia FROM

32

WHERE

33

Utilizando la sentencia WHERE nulo y no nulo

34

GROUP BY

35

ORDER BY y HAVING

36

El interminable agujero de conejo (Nested queries)

37

¿Cómo convertir una pregunta en un query SQL?

38

Preguntándole a la base de datos

39

Consultando PlatziBlog

Introducción a la bases de datos NO relacionales

40

¿Qué son y cuáles son los tipos de bases de datos no relacionales?

41

Servicios administrados y jerarquía de datos

Manejo de modelos de datos en bases de datos no relacionales

42

Top level collection con Firebase

43

Creando y borrando documentos en Firestore

44

Colecciones vs subcolecciones

45

Recreando Platziblog

46

Construyendo Platziblog en Firestore

47

Proyecto final: transformando tu proyecto en una db no relacional

Bases de datos en la vida real

48

Bases de datos en la vida real

49

Big Data

50

Data warehouse

51

Data mining

52

ETL

53

Business intelligence

54

Machine Learning

55

Data Science

56

¿Por qué aprender bases de datos hoy?

Bonus

57

Bases de datos relacionales vs no relacionales

58

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

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

Aportes 170

Preguntas 25

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.

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;

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

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

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

/*

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;

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;

¡Esta clase vale oro!

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; 

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;

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.

No conocía el GROUP_CONCAT, muy útil

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¨)”.

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.

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;

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.

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.

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.

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

Buenas noches.
Esta pregunta lo realice de esta manera:

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

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…

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

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

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;

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;

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

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.

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.

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;

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;

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 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;

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;

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;

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/

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

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

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

Pregunte a mi base de datos que contiene todos los ganadores mundiales de la formila1. ¿Cuáles son los pilotos con mayor cantidad de títulos y en que años fueron campeones?

select drivers.name, group_concat(f1_world_winners.date),count(*) Total
from f1_world_winners
	inner join drivers on f1_world_winners.driver_id = drivers.id
group by drivers.name
order by Total desc;

Para los que quieran hacer las preguntas por su cuenta sin ver como las hace el profe, les dejo los enunciados:

  1. ¿Cuántas etiquetas tiene cada blogpost? Puede haber blogposts con una sola etiqueta o puede haber blogposts con todas las etiquetas.

  2. ¿Cuáles son las etiquetas que no tienen ningún post? Que etiquetas no están relacionadas con ningún post.

Consultas vistas en clase

No conocía la propiedad GROUP_CONCAT()

La primera búsqueda que hizo el profesor la logré con un código mucho más sencillo y quiero compartirlo

SELECT titulo, COUNT(etiqueta_id)
FROM posts_etiquetas
	RIGHT JOIN posts ON posts_etiquetas.post_id = posts.id
GROUP BY titulo
; 

Mi aporte sobre la base de datos que se creo durante el curso, mediante la sentencia CASE.

select titulo, year(fecha_publicacion) as post_year,
case
	when usuarios_id is null then 'Sin usuario'
    when usuarios_id is not null then 'Con usuario'
end as 'informe_usuarios',
case
	when categorias_id is null then 'Sin categoria'
    when categorias_id is not null then 'Con categoria'
end as 'informe_categoria'
from post
order by informe_usuarios desc;

Para resaltar:
La función GROUP_CONCAT permite para el caso de uso, tomar el resultado del query y en vez de ponerlo en un row tras otro, cuando sea agrupado, va a ponerlo como un campo por separado por comas.

Me encanto lo de GROUP_CONCAT esa si no me la sabia

Cuántos posts tiene cada etiqueta:

SELECT etiquetas.nombre_etiqueta, COUNT(*) posts_quantity
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 posts_quantity DESC;

Cambiar “DESC” por “ASC” para obtener los datos de forma ascendente, es decir:

SELECT etiquetas.nombre_etiqueta, COUNT(*) posts_quantity
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 posts_quantity ASC;

Thank you :3

Los 2 primeros códigos hechos se resumen en este código para saber cuales han sido los títulos con más etiquetas y cuales son esas etiquetas.

SELECT posts.titulo, COUNT(*) AS num_tags, GROUP_CONCAT(tag_name) AS names
FROM posts
INNER JOIN post_etiquetas
ON posts.id = post_etiquetas.post_id
INNER JOIN tags
ON tags.id = post_etiquetas.etiqueta_id
GROUP BY posts.id
ORDER BY num_tags DESC;

special query

Sin querer estaba haciendo el inner join entre post_id = post_etiquetas.post_id.

Corría, pero traía como 1000 registros. Casi mne vuelvo loco intentando entender porqué pasaba eso.

Recordar el post . id

En esta página pueden practicar SQL: https://sqlzoo.net/wiki/SQL_Tutorial

Una recomendación al usar GROUP_CONCAT es poder usar HAVING y el operador LIKE para buscar etiquetas que están en los posts

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

Preguntándole a la base de datos

Pregunta

¿Cuántas etiquetas tiene un blogpost?

Sentencia

select post.title, count(*) AS num_tags
from post
	inner join posts_tags on post.idpost = posts_tags.idpost
	inner join tag on tag.idtag = posts_tags.idtag
group by post.idpost
order by num_tags desc;

Pregunta

¿Cuáles etiquetas pertenecen a cuál post?

Sentencia

select post.title, group_concat(tagName) as Tags
from post
	inner join posts_tags on post.idpost = posts_tags.idpost
	inner join tag on tag.idtag = posts_tags.idtag
group by post.idpost;

Nuevo comando

GROUP_CONCAT() , este comando permite coger varios resultados y lograr que no se repitan filas, sino concatenar el resultado y separarlo por comas (,).

Pregunta

¿Cuáles etiquetas no están asociadas a ningún post?

Sentencia

select *
from tag
	left join posts_tags on tag.idtag = posts_tags.idtag
where posts_tags.idtag is null 
;

Otra forma de contar cuántas etiquetas tiene cada post:

SELECT posts.titulo AS titulo, COUNT(*) cantidad_etiquetas
FROM posts_etiquetas, posts
WHERE posts_etiquetas.post_id = posts.id 
GROUP BY posts.titulo
ORDER BY cantidad_etiquetas DESC;

Me ha encantado esta clase, intente resolver las consultas de las preguntas antes que el profesor pero solo pude hacer la ultima xd
.

  • Cuales son las etiquetas que no tienen nigun post?
SELECT * FROM etiquetas 
 LEFT JOIN posts_etiquetas ON etiquetas.id = post_etiquetas.etiqueta_id
WHERE  post_etiquetas.etiqueta_id IS NULL;

Me encantó esta clase. El procedimiento fue muy claro.