Si desea obtener algo significativo de los datos , casi siempre necesitará unir varias tablas. En este artículo, mostraremos cómo hacerlo utilizando diferentes tipos de combinaciones. Para lograrlo, combinaremos INNER JOIN y LEFT JOIN. Entonces, comencemos.
El modelo
En la siguiente imagen puede ver el modelo existente. Consta de 6 tablas y ya, más o menos, lo hemos descrito en los artículos anteriores.
Aún así, incluso sin describir, si la base de datos está modelada y presentada de buena manera (eligiendo los nombres sabiamente, usando la convención de nomenclatura, siguiendo las mismas reglas en todo el modelo, las líneas / relaciones en el esquema no se superponen más de lo necesario), debería poder para concluir dónde puede encontrar los datos que necesita. Esto es crucial porque antes de unir varias tablas, primero debe identificar estas tablas.
Hablaremos sobre la convención de nomenclatura y los consejos sobre cómo pensar al escribir consultas SQL, más adelante en este serie. Hasta ahora, vivamos con el hecho de que este modelo es bastante simple y podemos hacerlo con bastante facilidad.
¿Qué sabemos hasta ahora?
En esta serie, cubierto:
- Conceptos básicos relacionados con la instrucción SQL SELECT, y
- Comparamos INNER JOIN y LEFT JOIN
Usaremos el conocimiento de estos dos artículos y combinarlos para escribir sentencias SELECT más complejas que unirán varias tablas.
Unir varias tablas usando INNER JOIN
El primer ejemplo que analizaremos es cómo recuperar datos de varias tablas utilizando solo INNER JOIN. Para cada ejemplo, iremos con la definición del problema que debemos resolver y la consulta que hace el trabajo. Entonces, comencemos con el primer problema.
# 1 Necesitamos enumerar todas las llamadas con su hora de inicio y finalización. Para cada llamada, queremos mostrar cuál fue el resultado, así como el nombre y apellido del empleado que hizo esa llamada. Ordenaremos nuestras llamadas por hora de inicio de forma ascendente.
Antes de escribir la consulta, identificaremos las tablas que necesitamos usar. Para hacer eso, necesitamos determinar qué tablas contienen los datos que necesitamos e incluirlos. Además, debemos incluir todas las tablas a lo largo del camino entre estas tablas: tablas que no contienen los datos necesarios pero que sirven como una relación entre las tablas que sí lo hacen (ese no es el caso aquí).
La consulta que hace el trabajo se da a continuación:
El resultado de la consulta se da a continuación:
Hay algunas cosas que me gustaría señalar aquí:
- Las tablas que hemos unido están aquí porque los datos que necesitamos se encuentra en estas 3 tablas
- Cada vez que menciono cualquier atributo de cualquier tabla, estoy usando el formato table_name.attribute_name (por ejemplo, employee.first_name). Si bien eso no es necesario, es una buena práctica, porque a veces 2 o más tablas en la misma consulta pueden usar los mismos nombres de atributo y eso daría lugar a un error
- Hemos usado INNER JOIN 2 veces en orden para unir 3 mesas. Esto dará como resultado que se devuelvan solo filas que tengan pares en otra tabla.
- Cuando solo usa INNER JOIN para unir varias tablas, el orden de estas tablas en las uniones no es importante. Lo único importante es que utilice las condiciones de combinación adecuadas después de «ON» (combinación con claves externas)
Dado que todas las llamadas tenían un empleado y un resultado de llamada relacionados, obtendríamos el mismo resultado si hemos usado LEFT JOIN en lugar de INNER JOIN.
Unir varias tablas usando LEFT JOIN
Escribir consultas que usan LEFT JOINs no difiere mucho en comparación con escribir consultas usando INNER JOINs. El resultado, por supuesto, sería diferente (al menos en los casos en que algunos registros no tienen un par en otras tablas).
Este es el problema que queremos resolver.
N.º 2 Enumere todos los condados y clientes relacionados con estos países. Para cada país, muestre su nombre en inglés, el nombre de la ciudad donde se encuentra el cliente y el nombre de ese cliente. Devuelva incluso los países sin ciudades relacionadas y clientes.
Las tablas que contienen los datos que necesitamos se encuentran en la siguiente imagen:
Primero, comprobar rápidamente cuál es el cont entradas de estas 3 tablas.
Podemos notar dos cosas importantes:
- Si bien cada ciudad tiene un país relacionado, no todos los países tienen ciudades relacionadas (España & Rusia no las tiene)
- Lo mismo se aplica a los clientes.Cada cliente tiene definido el valor city_id, pero solo se utilizan 3 ciudades (Berlín, Zagreb & Nueva York)
Primero anotemos consulta usando INNER JOIN:
El resultado de la consulta se muestra en la siguiente imagen:
Tenemos 7 condados y 6 ciudades en nuestra base de datos, pero nuestra consulta devuelve solo 4 filas. Ese es el resultado del hecho de que solo tenemos 4 clientes en nuestra base de datos. Cada uno de estos 4 está relacionado con su ciudad y la ciudad está relacionada con el país. Entonces, INNER JOIN eliminó todos estos países y ciudades sin clientes. Pero, ¿cómo incluirlos también en el resultado?
Para hacerlo, usaremos LEFT JOIN. Simplemente reemplazaremos todo «INTERIOR» con «IZQUIERDA» para que nuestra consulta sea la siguiente:
El resultado se muestra en la siguiente imagen:
Puede notar fácilmente que ahora tenemos todos los países, incluso aquellos sin ninguna ciudad relacionada (Rusia & España), así como todos ciudades, incluso aquellas sin clientes (Varsovia, Belgrado & Los Ángeles). Las 4 filas restantes son las mismas que en la consulta usando INNER JOIN.
LEFT JOIN: el orden de las tablas importa
Si bien el orden de las JOIN en INNER JOIN no es importante, lo mismo no significa LEFT JOIN. Cuando usamos LEFT JOIN para unir varias tablas, es importante recordar que esta unión incluirá todas las filas de la tabla en el lado IZQUIERDO de JOIN. Reorganicemos la consulta anterior:
Al principio, podría decir fácilmente que esta consulta y la anterior son iguales (esto es cierto cuando se usa INNER JOIN). Hemos utilizado las mismas tablas, LEFT JOIN y las mismas condiciones de combinación. Primero, echemos un vistazo a la salida:
Entonces, ¿qué sucedió aquí? ¿Por qué tenemos 4 filas (las mismas 4 que teníamos cuando usamos INNER JOIN)?
La respuesta es simple y está relacionada con cómo funciona LEFT JOIN. Toma la primera tabla (cliente) y une todas sus filas (4 de ellas) a la siguiente tabla (ciudad). El resultado de esto es 4 filas porque el cliente podría pertenecer a solo 1 ciudad. Luego unimos estas 4 filas a la siguiente tabla (país), y nuevamente tenemos 4 filas porque la ciudad podría pertenecer a solo 1 país.
La razón por la que no uniríamos estas 3 tablas en esta La forma viene dada por el texto del ejemplo # 2. La consulta está escrita de tal manera que devuelve 4 filas sería la respuesta a lo siguiente: Devolver los nombres de todos los clientes, así como las ciudades y países en los que se encuentran. Devolver incluso los clientes sin ciudades y países relacionados.
- Nota: cuando usa LEFT JOIN, el orden de las tablas en esa declaración es importante y la consulta devolverá un resultado diferente si cambia este orden. El orden en realidad depende de lo que quieras devolver como resultado.
Únete a varias tablas usando ambos: INNER JOIN & LEFT JOIN
Esto también es posible. Vayamos de nuevo con un ejemplo.
# 3 Devuelva la lista de todos los países y ciudades que tienen pares (excluya los países a los que no hace referencia ninguna ciudad). Para tales pares devuelva todos los clientes. Devuelve pares pares que no tengan un solo cliente.
La consulta que hace el trabajo es:
El resultado de la consulta se muestra en la siguiente imagen:
Puede notar fácilmente que no tenemos países sin ninguna ciudad relacionada (estos fueron España & Rusia). INNER JOIN eliminó estas filas. Aún así, tenemos citas sin clientes (Belgrado, Los Ángeles & Varsovia). Este es el resultado del hecho de que usamos LEFT JOIN entre las tablas ciudad y cliente.
Conclusión
Cuando necesitas unir varias tablas, tienes INNER & LEFT JOIN a su disposición (RIGHT JOIN rara vez se usa y puede ser reemplazado fácilmente por LEFT JOIN). La combinación que utilizará dependerá directamente de la tarea que deba resolver y, en el camino, obtendrá la sensación. En los próximos artículos, analizaremos cómo pensar y organizarse cuando necesite redactar consultas más complejas.
Tabla de contenido
Aprenda SQL: CREATE DATABASE & Operaciones de CREATE TABLE
Aprenda SQL: INSERT INTO TABLE
Aprenda SQL: Clave principal
Aprenda SQL: Clave externa
Aprenda SQL: SELECT instrucción
Aprenda SQL: INNER JOIN vs LEFT JOIN
Aprenda SQL: Scripts SQL
Aprenda SQL: Tipos de relaciones
Aprenda SQL: Unir varias tablas
Aprenda SQL: Funciones agregadas
Aprenda SQL: Cómo escribir un SELECT complejo Consulta
Aprenda SQL: La base de datos INFORMATION_SCHEMA
Aprenda SQL: Tipos de datos SQL
Aprenda SQL: Teoría de conjuntos
Aprenda SQL: Funciones definidas por el usuario
Aprenda SQL: Procedimientos almacenados definidos por el usuario
Aprenda SQL: Vistas SQL
Aprenda SQL: activadores de SQL
Aprenda SQL: practique consultas SQL
Aprenda SQL: SQL Ejemplos de consultas
Aprenda SQL: cree un informe manualmente mediante consultas SQL
Aprenda SQL: Funciones de fecha y hora de SQL Server
Aprenda SQL: cree informes de SQL Server utilizando funciones de fecha y hora
Aprenda SQL: Tablas dinámicas de SQL Server
Aprenda SQL: exportación de SQL Server a Excel
Aprenda SQL: introducción a los bucles de SQL Server
Aprenda SQL: cursores de SQL Server
Aprenda SQL: Mejores prácticas de SQL para eliminar y actualizar datos
Aprenda SQL: Convenciones de nomenclatura
Aprenda SQL: Trabajos relacionados con SQL
Aprenda SQL: Uniones no Equi en SQL Server
Aprenda SQL: Inyección SQL
- Autor
- Publicaciones recientes
Sus compromisos pasados y presentes varían desde el diseño y codificación de bases de datos hasta la enseñanza, la consultoría y la redacción de bases de datos. Además, no hay que olvidar, BI, creación de algoritmos, ajedrez, filatelia, 2 perros, 2 gatos, 1 esposa, 1 bebé …
Lo puedes encontrar en LinkedIn
Ver todas las publicaciones de Emil Drkusic
- Aprenda SQL: Inyección de SQL – 2 de noviembre de 2020
- Aprenda SQL: Non-Equi Joins en SQL Server – 29 de septiembre de 2020
- Aprenda SQL: Trabajos relacionados con SQL – 1 de septiembre de 2020