Alejandro González Reyes
Facundo Nicolás García Martoni
ProfesorUsuario anónimo
UserAlejandro González Reyes
Facundo Nicolás García Martoni
ProfesorUsuario anónimo
UserDayse Poma
Mariana Velez
Edwin Posso
Oscar Gama
Daniel Andrés Giraldo Benites
Carlos Fernando Aguilar González
Alejandro González Reyes
Sebastian Calderón Araque
John Fredy Ramirez Bedoya
Augusto Jose Suarez Flores
Edwin Posso
Miqueas Gamero
Sergio Fernandez
luis Fernando cruz sanchez
Miguel Torres
Fernando Orozco Velasquez
Julián Cárdenas
Alejandro González Reyes
Fernando Huamán Santamaria
Alejandro González Reyes
Osvaldo Olguín
Jose Cardenas
César Espinoza García
William Andres Tovar Riobo
Carlos Eduardo Repillosa Del Valle
Pat Villarroel
DARWIN JUAN CARLOS CATUNTA GARCIA
Alejandro González Reyes
Carlos Andrés Valderrama Pabón
Facundo Nicolás García Martoni
ProfesorSilvana Rolón
RENÉ ABRAHAM MUCIÑO GUTIERREZ
Jerson Alexis CN
Daniel Andrés Peñuela González
Miguel Angelo Silva
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;
👏🏼👏🏼👏🏼 Interesantísimo aporte compañero!
¡UN dato muy curioso!
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!
Gracias! porque esta clase me está sacando leche!!! 😭
Muy ingenioso, muchas gracias 😁
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
recién acabo de aprender esto y es muy útil, muchas gracias
Muchas gracias
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;
Tu aporte solucionó un query que me estaba planteando. Gracias crack!
GROUP_CONCAT. Sirve para concatenar todos los registros afectados por un GROUP BY en un solo campo. ' Criterios.
-- 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;
muchisimas gracias por las explicaciones
Excelente dato y muy buena explicación, muchas gracias 👾
Para que se entienda mejor el INNER JOIN doble hice una pequeña ilustración:
Estaba super perdido hasta que vi esto, mil gracias, muy buen aporte
Gracias, dos años despues de hacer este aporte me iluminaste la cabeza, gracias!
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;
¿Es mejor nombrarlas como "a y b" o con las iniciales del nombre de las tablas a relacional?
Así me confundo más antes
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
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;
Es factible, pero no es tan eficiente, ya que primero genera una tabla con todas las combinaciones posibles de las tuplas entre las tablas (y en tu ejemplo son bastantes), y luego filtra solo donde coinciden las claves que indicas en la cláusula WHERE.
al que copió la base de datos del men de los comentarios "nombre_etiqueta" es en realidad "nombre" a secas
Gracias, creo que eres el único con la respuesta a ese problema.
Ooooohhhhh....... Muchas Gracias Bro <3 <3
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!
Concuerdo con usted :)
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¨)".
Y en Oracle existe LISTAGG como equivalente... :)
EL PROFE, ORGULLOSO DE QUE ESTÉS APRENDIENDO ![](