Question

J'ai envie d'avoir recours aux jointures pendant un certain temps, mais je ne parviens pas à visualiser la sortie donc je sais comment les mettre à profit.

Le mot Let 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 ma demande est d'exécuter une requête SQL pour obtenir les données de profil d'un utilisateur, comment pourrais-je utiliser une jointure pour obtenir la ville associée à dossier d'un utilisateur, et comment l'enregistrement en sortie apparaissais?

Était-ce utile?

La solution

Chaque résultat d'une opération SQL est fonctionnellement une nouvelle table, que ce soit ou non il est stocké sur le disque ou dans la mémoire

La fonction d'une jointure est de « Joignez-vous à » deux tables dans une table synthétique troisième qui (habituellement) existe uniquement en mémoire pendant le temps est sortie à l'application.

La raison d'utiliser une jointure est de réduire données Anomalies, en assurant que les données apparaissent dans une seule et unique une place dans la base de données.

Considérez 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 zipcodes (ce qui arrive tout à fait trop souvent pour les goûts des développeurs de bases de données * la table personnes devra être mis à jour de sorte que tous les anciens zipcodes correctement appartiennent à la ville correcte et nouveau code.

Dans ce cas, le même code postal est en plusieurs tuples de la table, et si la table est manuellement modifiable, sera soumis à des anomalies de mise à jour graves comme nouveaux ville / combinaisons zip-code sont entrée sans la base de données dans son ensemble être mis à jour.

En ayant trois tables à la place, nous obtenons les mêmes données, mais avec une plus grande flexibilité et la fiabilité (au prix de certaines performances, bien que des questions de « dénormalisation appropriée » sont 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 par 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 spécifique à leur sujet change, sans altérer le reste des données associées.

Un INNER JOIN est le type de jointure par défaut. En gros, il note: « combiner tuples où ce disque à partir d'une table correspond à ce enregistrement de la table b » Les autres types de relations sont de OUTER JOINS et ce qui est connu comme CARTESIAN PRODUCT. Une jointure externe est « Prenez tout de la gauche ou de la table droite (comme indiqué) et où les autres matches de table, s'y joindre. Si elle ne correspond pas, le remplir avec nulls » Et un produit cartésien (sans entrer dans l'algèbre relationnelle est:. Prenez toutes les combinaisons possibles de tuples dans les deux tables et les sorties dans une table, sans rien correspondant

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

Autres conseils

Je pense que vous êtes à la recherche

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

qui vous donnerait

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

mais ne prenez pas ma parole: l'essayer sur votre base de données et voir ce que vous obtenez

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)

domaines1 .. Fieldsn sera les champs que vous voulez chercher -. De l'un ou les deux tabls

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top