7 days of WordPress plugins, themes & templates - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Code
  2. Databases

SQL para principiantes: Parte 3 - Relaciones de base de datos

Scroll to top
Read Time: 10 mins

Spanish (Español) translation by Elías Nicolás (you can also view the original English article)

Hoy continuamos nuestro viaje hacia el mundo de los sistemas de bases de datos SQL y relacionales. En esta parte tres de la serie, aprenderemos cómo trabajar con múltiples tablas que tienen relaciones entre sí. Primero, repasaremos algunos conceptos básicos y luego comenzaremos a trabajar con consultas JOIN en SQL.

También puede ver las bases de datos SQL en acción comprobando las secuencias de comandos SQL, aplicaciones y complementos en Envato Market.

Ponerse al corriente

Introducción

Al crear una base de datos, el sentido común dicta que usamos tablas separadas para diferentes tipos de entidades. Algunos ejemplos son: clientes, pedidos, artículos, mensajes, etc ... Pero también necesitamos tener relaciones entre estas tablas. Por ejemplo, los clientes realizan pedidos y los pedidos contienen elementos. Estas relaciones deben ser representadas en la base de datos. Además, al buscar datos con SQL, necesitamos usar ciertos tipos de consultas JOIN para obtener lo que necesitamos.

Hay varios tipos de relaciones de base de datos. Hoy vamos a cubrir lo siguiente:

  • Relaciones de uno a uno
  • Relaciones de uno a muchos y muchas a una
  • Relaciones muchas a muchas
  • Relaciones Auto-Referentes

Al seleccionar datos de varias tablas con relaciones, utilizaremos la consulta JOIN. Hay varios tipos de JOIN, y vamos a aprender sobre lo siguiente:

  • Cross Joins
  • Natural Joins
  • Inner Joins
  • Left (Outer) Joins
  • Right (Outer) Joins

También aprenderemos acerca de la cláusula ON y la cláusula USING.

Relaciones de uno a uno

Digamos que usted tiene una tabla para los clientes:

Podemos poner la información de la dirección del cliente en una tabla aparte:

Ahora tenemos una relación entre la tabla Customers y la tabla Addresses. Si cada dirección puede pertenecer a un solo cliente, esta relación es "Uno a uno". Tenga en cuenta que este tipo de relación no es muy común. Nuestra mesa inicial que incluía la dirección junto con el cliente podría haber trabajado bien en la mayoría de los casos.

Observe que ahora hay un campo denominado "address_id" en la tabla Customers, que hace referencia al registro coincidente en la tabla Address. Esto se llama una "clave foranea" y se utiliza para todo tipo de relaciones de base de datos. Abordaremos este tema más adelante en el artículo.

Podemos visualizar la relación entre el cliente y los registros de direcciones de la siguiente manera:

Tenga en cuenta que la existencia de una relación puede ser opcional, como tener un registro de cliente que no tiene registro de dirección relacionada.

Relaciones de uno a muchas y muchas a una

Este es el tipo de relación más comúnmente utilizado. Considere un sitio web de comercio electrónico, con lo siguiente:

  • Los clientes pueden hacer muchos pedidos.
  • Las órdenes pueden contener muchos artículos.
  • Los artículos pueden tener descripciones en varios idiomas.

En estos casos, tendríamos que crear relaciones de "uno a muchos". Aquí hay un ejemplo:

Cada cliente puede tener cero, una o varias órdenes. Pero un pedido puede pertenecer a un solo cliente.

Muchas a muchas relaciones

En algunos casos, es posible que necesite múltiples instancias en ambos lados de la relación. Por ejemplo, cada pedido puede contener varios elementos. Y cada artículo puede también estar en órdenes múltiples.

Para estas relaciones, necesitamos crear una tabla adicional:

La tabla Items_Orders tiene un solo propósito, y es crear una relación "Muchos a muchos" entre los elementos y los pedidos.

Aquí está una manera de visualizar este tipo de relación:

Si desea incluir los registros items_orders en el gráfico, puede verse así:

Relaciones Auto-Referentes

Esto se utiliza cuando una tabla necesita tener una relación consigo misma. Por ejemplo, supongamos que tiene un programa de referencia. Los clientes pueden referir a otros clientes a su sitio web de compras. La tabla puede tener este aspecto:

Los clientes 102 y 103 fueron referidos por el cliente 101.

Esto en realidad también puede ser similar a "uno a muchos" relación ya que un cliente puede referirse a múltiples clientes. También se puede visualizar como una estructura de árbol:

Un cliente puede referirse a cero, uno o varios clientes. Cada cliente puede ser referido por un solo cliente, o ninguno en absoluto.

Si desea crear una relación de "muchos a muchos" de auto referenciamiento, necesitará una tabla adicional como la que acabamos de mencionar en la última sección.

Claves foraneas

Hasta ahora sólo hemos aprendido algunos de los conceptos. Ahora es el momento de darles vida usando SQL. Para esta parte, necesitamos entender lo que son las Claves foraneas.

En los ejemplos de relación anteriores, siempre teníamos estos campos "**** _ id" que hacían referencia a una columna en otra tabla. En este ejemplo, la columna customer_id de la tabla Orders es una columna Foreign Key:

Con una base de datos como MySQL, hay dos formas de crear columnas de claves externas:

Definición explícita de la clave foranea

Vamos a crear una tabla de clientes sencilla:

Ahora la tabla de pedidos, que contendrá una clave foranea:

Ambas columnas (customers.customer_id y orders.customer_id) deben tener la misma estructura de datos exacta. Si uno es INT, el otro no debe ser BIGINT por ejemplo.

Tenga en cuenta que en MySQL sólo el motor InnoDB tiene total compatibilidad con Foreign Keys. Sin embargo, otros motores de almacenamiento le permitirán especificarlos sin dar ningún error. Además, la columna Clave externa se indexa automáticamente, a menos que especifique otro índice para ella.

Sin Declaración Explícita

Se puede crear la misma tabla de pedidos sin declarar explícitamente que la columna customer_id sea una clave foranea:

Al recuperar datos con una consulta JOIN, todavía puede tratar esta columna como una clave externa aunque el motor de base de datos no es consciente de esa relación.

Vamos a aprender más acerca de las consultas JOIN en el artículo.

Visualizar las relaciones

Mi software favorito actual para diseñar bases de datos y visualizar las relaciones de clave foraneas es MySQL Workbench.

Una vez que diseñe su base de datos, puede exportar el SQL y ejecutarlo en su servidor. Esto es muy útil para diseños de bases de datos más grandes y complejas.

Solicitudes JOIN

Para obtener datos de una base de datos que tiene relaciones, a menudo necesitamos utilizar las consultas JOIN.

Antes de empezar, vamos a crear las tablas y algunos datos de muestra con los que trabajar.

Tenemos 4 clientes. Un cliente tiene dos órdenes, dos clientes tienen una orden cada uno, y un cliente no tiene orden. Ahora vamos a ver los diferentes tipos de consultas JOIN que podemos ejecutar en estas tablas.

Cross Join

Este es el tipo predeterminado de consulta JOIN cuando no se especifica ninguna condición.

El resultado es un llamado "producto cartesiano" de las tablas. Significa que cada fila de la primera tabla se corresponde con cada fila de la segunda tabla. Dado que cada tabla tenía 4 filas, terminamos obteniendo un resultado de 16 filas.

La palabra clave JOIN puede sustituirse opcionalmente por una coma.

Por supuesto este tipo de resultado por lo general no es útil. Así que veamos los otros tipos de combinación.

Natural Join

Con este tipo de consulta JOIN, las tablas deben tener un nombre de columna coincidente. En nuestro caso, ambas tablas tienen la columna customer_id. Por lo tanto, MySQL se unirá a los registros sólo cuando el valor de esta columna coincide con dos registros.

Como puede ver, la columna customer_id sólo se muestra una vez, porque el motor de base de datos trata esto como la columna común. Podemos ver las dos órdenes colocadas por Adam, y las otras dos órdenes de Joe y Sandy. Finalmente estamos recibiendo información útil.

Inner Join

Cuando se especifica una condición de combinación, se realiza una unión interna. En este caso, sería una buena idea tener la coincidencia de campo customer_id en ambas tablas. Los resultados deben ser similares al Natural Join.

Los resultados son los mismos excepto una pequeña diferencia. La columna customer_id se repite dos veces, una vez para cada tabla. La razón es, simplemente pedimos a la base de datos que coincida con los valores de estas dos columnas. Pero en realidad no sabe que representan la misma información.

Vamos a añadir algunas condiciones más a la consulta.

Esta vez sólo recibimos los pedidos de más de $ 15.

Cláusula ON

Antes de pasar a otros tipos de union, necesitamos ver la cláusula ON. Esto es útil para poner las condiciones JOIN en una cláusula separada.

Ahora podemos distinguir la condición JOIN de las condiciones de la cláusula WHERE. Pero también hay una ligera diferencia en la funcionalidad. Veremos esto en los ejemplos LEFT JOIN.

Cláusula USING

La cláusula USING es similar a la cláusula ON, pero es más corta. Si una columna tiene el mismo nombre en ambas tablas, podemos especificarla aquí.

De hecho, esto es muy parecido al NATURAL JOIN, por lo que la columna de unión (customer_id) no se repite dos veces en los resultados.

Left (Outer) Join

Un LEFT JOIN es un tipo de unión externa. En estas consultas, si no hay ninguna coincidencia encontrada en la segunda tabla, el registro de la primera tabla todavía se muestra.

A pesar de que Andy no tiene órdenes, su registro todavía se muestra. Los valores bajo las columnas de la segunda tabla se establecen en NULL.

Esto también es útil para encontrar registros que no tienen relaciones. Por ejemplo, podemos buscar clientes que no hayan realizado pedidos.

Todo lo que hicimos fue buscar valores NULL para el order_id.

Observe también que la palabra clave OUTER es opcional. Puede usar LEFT JOIN en lugar de LEFT OUTER JOIN.

Condicionales

Ahora veamos una consulta con una condición.

¿Qué pasó con Andy y Sandy? LEFT JOIN se suponía que devolvía a los clientes sin órdenes coincidentes. El problema es que la cláusula WHERE está bloqueando los resultados. Para conseguirlas podemos tratar de incluir la condición NULL también.

Tenemos a Andy, pero no Sandy. Sin embargo, esto no parece correcto. Para obtener lo que queremos, necesitamos usar la cláusula ON.

Ahora tenemos a todo el mundo, y todos los pedidos por encima de $ 15. Como dije antes, la cláusula ON a veces tiene una funcionalidad ligeramente diferente a la cláusula WHERE. En una unión externa como ésta, las filas se incluyen incluso si no coinciden con las condiciones de la cláusula ON.

Right (Outer) Join

Una RIGHT OUTER JOIN funciona exactamente igual, pero el orden de las tablas se invierte.

Esta vez no tenemos resultados NULL porque cada orden tiene un registro de cliente coincidente. Podemos cambiar el orden de las tablas y obtener los mismos resultados que hicimos desde LEFT OUTER JOIN.

Ahora tenemos esos valores NULL porque la tabla de clientes está en el lado derecho de la combinación.

Conclusión

Gracias por leer el artículo. ¡Espero que lo hayan disfrutado! Por favor, deje sus comentarios y preguntas, y tenga un gran día!

No olvide revisar las secuencias de comandos SQL, aplicaciones y complementos en Envato Market. Obtendrá una idea de lo que es posible con las bases de datos SQL, y puede encontrar la solución perfecta para ayudarle con su proyecto en desarrollo actual.

Síguenos en Twitter, o suscríbete al RSS Feed de Tuts+ para obtener los mejores tutoriales de desarrollo web en la web.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.