¿Cómo se ve la salida de una declaración JOIN?


8

He estado queriendo usar combinaciones por un tiempo, pero tengo problemas para visualizar el resultado, así que sé cómo usarlo.

Digamos que tengo 2 tablas:

CREATE TABLE Cities (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    city tinyblob
);

CREATE TABLE Users (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    username TINYBLOB,
    city INT UNSIGNED,
    FOREIGN KEY (city) REFERENCES Cities (id)
);

Si mi aplicación es ejecutar una consulta SQL para obtener los datos del perfil de un usuario, ¿cómo usaría una combinación para obtener la ciudad asociada con el registro de un usuario y cómo aparecería el registro generado?

Respuestas:


12

Cada resultado de una operación SQL es funcionalmente una nueva tabla, ya sea que esté o no almacenada en el disco o en la memoria

La función de una combinación es "Unir" dos tablas juntas en una tercera tabla sintética que (por lo general) solo existe en la memoria durante el tiempo que se envía a la aplicación.

La razón para usar una combinación es reducir las anomalías de datos , asegurando que los datos aparezcan en un solo lugar en la base de datos.

Considera lo siguiente:

Person ( ID Integer Primary Key, FName String, LName String, Address String, City String, ZipCode String)

Aquí, cada vez que el gobierno cambie los códigos postales (lo que sucede con demasiada frecuencia para los gustos de los desarrolladores de bases de datos *), la tabla de personas deberá actualizarse de modo que todos los códigos postales antiguos pertenezcan correctamente a la ciudad correcta y al nuevo código postal.

En este caso, el mismo código postal está en múltiples tuplas de la tabla, y si la tabla es editable manualmente, estará sujeto a graves anomalías de actualización a medida que se ingresen nuevas combinaciones de ciudad / código postal sin que se actualice la base de datos en su conjunto.

Al tener tres tablas en su lugar, obtenemos los mismos datos, pero con mayor flexibilidad y confiabilidad (a costa de cierto rendimiento, aunque las preguntas de "desnormalización apropiada" son un tema para otra serie de respuestas).

Person ( PersonID Integer Primary Key, FName String, LName String)

City ( CityID Integer Primary Key, City String, State String, ZipCode String )

Address ( AddressID Integer Primary Key, AddressLine1 String, CityID Integer References City, PersonID Integer References Person)`

Y podemos obtener una sola "tabla" de lo anterior a través de la siguiente consulta: SELECT Fname, Lname, AddressLine1, City, State, ZipCode FROM Person INNER JOIN Address USING (PersonID) INNER JOIN City USING (CityID)

Esto nos permite actualizar las tablas individuales siempre que cambie algo específico sobre ellas, sin corromper el resto de los datos asociados.

Un INNER JOINes el tipo predeterminado de unión. En términos generales, señala: "combinar tuplas donde este registro de la tabla a coincide con este registro de la tabla b" Los otros tipos de combinaciones son OUTER JOINSy lo que se conoce como a CARTESIAN PRODUCT. Una combinación externa es "Tome todo de la tabla izquierda o derecha (como se especifica) y donde coincida la otra tabla, únala. Donde no coincida, llénela con valores nulos" Y un producto cartesiano (sin entrar en el álgebra relacional es: Tome todas las combinaciones posibles de tuplas en ambas tablas y envíelas a una tabla, sin que coincida nada.

* Más que nunca, especialmente en el caso de mover los límites de los códigos postales debido a la gerrymandering


6

Creo que estas buscando

SELECT username, cities.city FROM Users JOIN Cities ON (Cities.Id = Users.City)

que te daría

| username | city      |
| John     | Singapore |
| Toby     | London    |
| Eric     | Paris     |

pero no confíe en mi palabra: pruébelo en su base de datos y vea lo que obtiene.


3

En pocas palabras, su declaración SQL será:

SELECT FIELD1, FIELD2 .. FIELDN
FROM PARENT_TABLE 
  INNER JOIN CHILD_TABLE ON ( PARENT_TABLE.PARENT_KEY = CHILD_TABLE.FOREIGN_KEY)

Fields1 .. Fieldsn serán los campos que desea obtener, de una o ambas tablas.


El paréntesis no es obligatorio, hace que la consulta sea más difícil de leer.
Spredzy

1
@Spredzy Reverse es el caso para mí, el paréntesis aumenta la legibilidad para mí
Sathyajith Bhat
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.