Cómo combinar los resultados de múltiples consultas SQL utilizando la declaración de la Unión

Cómo combinar los resultados de múltiples consultas SQL utilizando la declaración de la Unión

En un artículo anterior hablamos sobre el tipo de tipo de UNIRSE Podemos usar en una base de datos mariadb/mysql. Esta vez, en cambio, echamos un vistazo a UNIÓN Declaración: cómo funciona, cómo podemos usarlo para combinar el resultado de las consultas ejecutadas en diferentes tablas y cuáles son sus peculiaridades.

En este tutorial aprenderás:

  • Cómo usar la declaración de la Unión en un servidor mariadb/mysql
  • ¿Cuáles son las propiedades de la declaración de la Unión?


El resultado de una declaración de la Unión

Requisitos y convenciones de software utilizados

Requisitos de software y convenciones de línea de comandos de Linux
Categoría Requisitos, convenciones o versión de software utilizada
Sistema INDEPENDO DEL OS
Software Una base de datos mariadb/mysql que funciona
Otro Conocimientos básicos de la base de datos MariadB/MySQL
Convenciones # - requiere que los comandos de Linux dados se ejecuten con privilegios raíz directamente como un usuario raíz o mediante el uso de sudo dominio
ps - Requiere que los comandos de Linux dados se ejecuten como un usuario regular no privilegiado

La declaración de la Unión

El UNIÓN Declaración Combinar los resultados de dos o más consultas. Mientras que al realizar una unión, podemos ejecutar algún tipo de acción o recuperar información adicional sobre la base de las relaciones existentes entre las tablas, al usar el UNIÓN Declaración, si se cumplen algunas condiciones, las filas resultantes de consultas lanzadas en tablas diferentes, incluso no relacionadas, se pueden combinar. En este tutorial veremos un ejemplo básico y de un mundo real de cómo podemos usar el UNIÓN declaración en un entorno mariadb/mysql.

Un ejemplo básico

Comencemos con un ejemplo muy básico para introducir las peculiaridades del UNIÓN declaración. Supongamos que tenemos dos tablas completamente no relacionadas: la primera llamada "película" y la segunda "color". En la primera, cada fila contiene información sobre una película: el título, el género y la fecha de lanzamiento. El último alberga solo el nombre de algunos colores. Así es como se ven las tablas:

+----+---------------+---------+--------------+ | ID | título | género | Release_date | +----+---------------+---------+--------------+| 1 | Una nueva esperanza | fantasía | 1977-05-25 | | 2 | El padrino | Drama | 1972-05-24 | +----+---------------+---------+--------------++- -+ --------+ | ID | nombre | +----+--------+| 1 | Azul | | 2 | Amarillo | +----+--------+ 
Copiar

Y esta es su descripción:

+--------------+-------------+------+-----+---------+----------------+ | Campo | Tipo | NULL | Clave | Predeterminado | Extra | +--------------+-------------+------+-----+------- -+ ----------------+ | ID | int (2) | No | PRI | NULL | auto_increment | | título | Varchar (20) | No | | NULL | | | género | Varchar (20) | No | | NULL | | | Release_date | Fecha | No | | NULL | | +--------------+-------------+------+-----+------- -+----------------++-------+-------------+------++ -----+---------+----------------+| Campo | Tipo | NULL | Clave | Predeterminado | Extra | +-------+-------------+------+-----+---------+---- ------------+ | ID | int (2) | No | PRI | NULL | auto_increment | | nombre | Varchar (10) | No | | NULL | | +-------+-------------+------+-----+---------+----------------+ 
Copiar

Como se dijo antes, estas dos tablas no tienen absolutamente ninguna conexión entre sí. Mediante el uso del UNIÓN Declaración, sin embargo, podemos combinar los resultados de dos consultas separadas lanzadas en ellas. Corramos:

Seleccione Título, Género de Movie Union Select ID, nombre del color;

El comando anterior devuelve el siguiente resultado:

+---------------+---------+ | título | género | +---------------+---------+| Una nueva esperanza | fantasía | | El padrino | Drama | | 1 | Azul | | 2 | Amarillo | +---------------+---------+ 
Copiar

Explicemos. Realizamos dos diferentes SELECCIONAR Consultas: en la primera seleccionamos el valor del "título" y "género" de las columnas para cada fila de la tabla de la película. En el segundo, en su lugar, seleccionamos las columnas "ID" y "Nombre" de la tabla "Color", nuevamente sin usar ningún filtro.

Incluso si las dos tablas están completamente no relacionadas, ya que usamos el UNIÓN Declaración entre las dos consultas, las filas devueltas por cada una de ellas se combinan: el resultado es la tabla que puede ver arriba.

Incluso si en la gran mayoría de los casos del mundo real, las columnas seleccionadas de las tablas involucradas probablemente tendrían los mismos tipos de datos, en el ejemplo tonto anterior, podemos ver claramente cómo UNIÓN sucede incluso si las columnas de las dos tablas originales contienen diferentes tipos de datos: ambas columnas seleccionadas de la tabla "Película" son de la Varar Tipo de datos, mientras que la columna "ID" de la tabla "Color" es de tipo EN T. Esto es posible porque la base de datos realiza automáticamente las conversiones de datos necesarias.



Otra cosa muy importante a notar es que las columnas en el UNIÓN resultado, heredó sus nombres de los seleccionados en el primero consulta, la que está a la izquierda del UNIÓN Palabra clave: "Título" y "Género". Mirar el ejemplo anterior probablemente te haría preguntarte cuál UNIÓN La declaración puede ser útil para el escenario de la vida real: veamos otro ejemplo.

El caso de fútbol de fantasía

Hace algún tiempo he estado involucrado en la creación de una pequeña aplicación de fútbol de fantasía. En la base de datos de la aplicación, había una tabla llamada "Club", que alojaba información sobre los clubes de fantasía involucrados en la competencia. Este es un extracto de ello:

+----+-----------------+--------+ | ID | nombre | Presupuesto | +----+-----------------+--------+| 1 | La Habana Blu | 4 | | 2 | Longobarda | 4 | | 3 | Real Siderno | 0 | | 4 | Equipo de terremoto | 66 | | 5 | Kalapagos | 33 | | 6 | Cantasant | 5 | | 7 | F.C. Mojito | 0 | | 8 | Apoel Nicotina | 1 | | 9 | Dharma | 0 | | 10 | Real 1908 | 12 | +----+-----------------+--------+ 
Copiar

En el mismo proyecto también había una llamada de tabla "Calendario", en la que cada fila representaba un partido entre dos de los clubes enumerados anteriormente. Como teníamos 10 clubes, cada día de campeonato organizó un total de 5 partidos. Como ejemplo, aquí hay un extracto de todos los partidos de los primeros cuatro días:

+----+-----+------+-------------+-------+--------------+ | ID | día | anfitrión | host_scores | invitado | invitados_scores | +----+-----+------+-------------+-------+--------- -----+ | 1 | 1 | 2 | 75.5 | 8 | 67 | | 2 | 1 | 4 | 80 | 6 | 77 | | 3 | 1 | 7 | 63 | 9 | 71.5 | | 4 | 1 | 3 | 79.5 | 5 | 68 | | 5 | 1 | 10 | 64 | 1 | 72.5 | | 6 | 2 | 5 | 66.5 | 10 | sesenta y cinco.5 | | 7 | 2 | 9 | 82 | 3 | 62.5 | | 8 | 2 | 6 | 83 | 7 | 69.5 | | 9 | 2 | 8 | 77 | 4 | 79.5 | | 10 | 2 | 1 | 67 | 2 | 81.5 | | 11 | 3 | 4 | 73 | 2 | 58 | | 12 | 3 | 7 | 70.5 | 8 | 75.5 | | 13 | 3 | 3 | 66.5 | 6 | 88 | | 14 | 3 | 10 | 74.5 | 9 | 60.5 | | 15 | 3 | 5 | 68.5 | 1 | 72.5 | | 16 | 4 | 9 | 68 | 5 | 69 | | 17 | 4 | 6 | 60 | 10 | 66 | | 18 | 4 | 8 | 70.5 | 3 | 73.5 | | 19 | 4 | 2 | 71.5 | 7 | 79 | | 20 | 4 | 1 | 68.5 | 4 | 68 | +----+-----+------+-------------+-------+--------------+ 
Copiar

La primera columna de cada fila contiene un clave sustituta utilizado como el Clave primaria para la mesa. El segundo contiene el entero que representa el día en que el partido es parte de. El anfitrión, host_scores, y invitado, invitados_scores Las columnas contienen, respectivamente, la identificación y los puntajes del club que jugaron como anfitriones y los del club que jugaron como invitado.



Ahora, digamos que queremos generar un rango en el que todos los clubes figuran en orden descendente en la base de los puntajes totales que realizaron en los primeros cuatro días de campeonato. Si cada identificación del club se enumerara solo en una columna, digamos "host", la operación sería realmente fácil: solo calcularíamos la suma de los puntajes utilizando el SUMA() función agregada y agrupar los resultados por la identificación de los clubes, mostrándolos en orden descendente:

Seleccionar host, sum (host_scores) como total_scores del grupo calendario por orden de host por total_scores DESC
Copiar

Sin embargo, dado que cada día de campeonato, un club juega alternativamente como anfitrión y como invitado, la consulta anterior no devolvería los resultados que queremos, pero produciría los puntajes totales de un equipo que incluye solo los puntajes hechos cuando jugó como anfitrión (o alternativamente, como invitado).

Ese es un caso en el que el UNIÓN La declaración puede ser útil: podemos realizar dos consultas separadas, una que involucra las columnas "host" y "host_scores", y la otra que involucra las "invitadas" y "invitados_scores"; Entonces podemos usar el UNIÓN Declaración para agregar la fila resultante de la segunda consulta a las devueltas por la primera y finalmente calcular los valores agregados. Además, podemos realizar una unión con la tabla "Club", para que el nombre de cada club aparezca en el resultado. Aquí está la consulta completa:

Seleccionar datos.Team_id, club.Nombre, suma (puntajes) como Total_scores de (seleccione Host como Team_id, Host_Scores como puntajes de Calendar Union All Select Guest, Guest_Scores de Calendar) como datos se unen al club en el club.id = datos.GRUPO EQUIP_ID POR DATOS.ORDER_ID ORDER por Total_Scores Desc; 
Copiar

Aquí está el resultado de la consulta:

+---------+-----------------+--------------+ | Team_id | nombre | Total_scores | +---------+-----------------+--------------+| 6 | Cantasant | 308 | | 4 | Equipo de terremoto | 300.5 | | 8 | Apoel Nicotina | 290 | | 2 | Longobarda | 286.5 | | 3 | Real Siderno | 282 | | 9 | Dharma | 282 | | 7 | F.C. Mojito | 282 | | 1 | La Habana Blu | 280.5 | | 5 | Kalapagos | 272 | | 10 | Real 1908 | 270 | +---------+-----------------+--------------+ 
Copiar

Como puede ver, al final del cuarto día de campeonato, el equipo "Cantasant" fue el que tenía los puntajes más altos. Otra cosa a notar en la consulta anterior es el uso de la TODO palabra clave junto con UNIÓN: Era necesario porque cuando el UNIÓN La declaración se utiliza, por defecto, se eliminan las filas duplicadas; si Unión todos se usa, en su lugar, las filas se conservan.

Conclusiones

En este tutorial aprendimos a conocer el UNIÓN Declaración en bases de datos mariadb/mysql. Vimos un ejemplo básico para demostrar algunas de las propiedades de la declaración y un ejemplo del mundo real, tomado de un proyecto real. Para resumir, las características de un UNIÓN declaración:

  • En la tabla resultante, se usa el nombre de las columnas seleccionadas en la primera consulta;
  • El número de columnas debe ser el mismo en todas las consultas;
  • Los tipos de datos de las columnas pueden ser diferentes, la base de datos realizará la conversión;
  • Por defecto, cuando el UNIÓN Se utiliza la declaración, se eliminan las filas duplicadas en los resultados: para evitar esto podemos usar Unión todos ;

Expanda aún más su conocimiento de la declaración de la Unión, puede echar un vistazo a la documentación oficial.

Tutoriales de Linux relacionados:

  • Instale MySQL en Ubuntu 20.04 LTS Linux
  • Cómo instalar MySQL en Almalinux
  • Ubuntu 20.04 WordPress con instalación de Apache
  • Cosas para instalar en Ubuntu 20.04
  • Introducción a los motores de almacenamiento MySQL
  • Instalación de ampache Raspberry Pi
  • Una introducción a la automatización, herramientas y técnicas de Linux
  • Cómo crear una pila de lámparas basada en Docker usando Docker en ..
  • Cómo cambiar la contraseña de usuario de mariadb
  • Cómo persistir los datos a PostgreSQL en Java