À quoi ressemble la sortie d'une instruction JOIN?

8

Cela fait un moment que je souhaite utiliser des jointures, mais j'ai du mal à visualiser la sortie, donc je sais comment l'utiliser.

Disons que j'ai 2 tables:

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 mon application doit exécuter une requête SQL pour obtenir les données de profil d'un utilisateur, comment puis-je utiliser une jointure pour obtenir la ville associée à l'enregistrement d'un utilisateur et comment l'enregistrement en sortie apparaîtra-t-il?

Kaji
la source

Réponses:

12

Chaque résultat d'une opération SQL est fonctionnellement une nouvelle table, qu'elle soit ou non stockée sur disque ou en mémoire

La fonction d'une jointure est de «joindre» deux tables ensemble dans une troisième table synthétique qui (généralement) n'existe que dans la mémoire pendant la durée de sa sortie vers l'application.

La raison d'utiliser une jointure est de réduire les anomalies de données , en s'assurant que les données apparaissent à un et un seul endroit dans la base de données.

Considérer ce qui suit:

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

Ici, chaque fois que le gouvernement change de code postal (ce qui arrive trop souvent aux goûts des développeurs de bases de données *, la table des personnes devra être mise à jour de sorte que tous les anciens codes postaux appartiennent correctement à la bonne ville et au nouveau code postal.

Dans ce cas, le même code postal se trouve dans plusieurs tuples de la table, et si la table est modifiable manuellement, elle sera sujette à de graves anomalies de mise à jour car de nouvelles combinaisons ville / code postal sont entrées sans que la base de données dans son ensemble soit mise à jour.

En ayant trois tables à la place, nous obtenons les mêmes données, mais avec une flexibilité et une fiabilité accrues (au détriment de certaines performances, bien que les questions de «dénormalisation appropriée» soient un sujet pour une autre série de réponses.)

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)`

Et nous pouvons obtenir une seule "table" de ce qui précède grâce à la requête suivante: SELECT Fname, Lname, AddressLine1, City, State, ZipCode FROM Person INNER JOIN Address USING (PersonID) INNER JOIN City USING (CityID)

Cela nous permet de mettre à jour les tables individuelles chaque fois que quelque chose de spécifique les modifie, sans corrompre le reste des données associées.

An INNER JOINest le type de jointure par défaut. En gros, il note: "combinez les tuples où cet enregistrement de la table a correspond à cet enregistrement de la table b" Les autres types de jointures sont OUTER JOINSet ce qu'on appelle a CARTESIAN PRODUCT. Une jointure externe est "Prenez tout dans la table de gauche ou de droite (comme spécifié) et où l'autre table correspond, joignez-la. Où elle ne correspond pas, remplissez-la avec des valeurs nulles" Et un produit cartésien (sans entrer dans l'algèbre relationnelle est: Prendre toutes les combinaisons possibles de tuples dans les deux tables et les sortir dans une table, sans rien faire correspondre.

* Plus que jamais, en particulier dans le cas de déplacer les limites des codes postaux en raison de gerrymandering

Brian Ballsun-Stanton
la source
6

Je pense que tu cherches

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

ce qui vous donnerait

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

mais ne me croyez pas sur parole: essayez-le sur votre base de données et voyez ce que vous obtenez!

Gaurav
la source
3

En un mot, votre instruction SQL sera -

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

Fields1 .. Fieldsn sera les champs que vous souhaitez récupérer - à partir de l'un ou des deux tableaux.

Sathyajith Bhat
la source
Les parenthèses ne sont pas obligatoires, cela rend la requête plus difficile à lire.
Spredzy
1
Le cas de @Spredzy Reverse est pour moi, la parenthèse augmente la lisibilité pour moi
Sathyajith Bhat