2010-12-01 5 views
0

im regardant ce code:compréhension rejoindre

select customers.name 
from customers, orders, order_items, books 
where customers.customerid = orders.customerid 
and orders.orderid = order_items.orderid 
and order_items.isbn = books.isbn 
and books.title like '%java%'; 

et ont du mal à comprendre.

d'abord j'ai 4 tables, et le code fait une table dynamique,
devrais-je le regarder différemment afin de mieux le comprendre? D'abord, je sélectionne customer.name, mais seulement après que le dernier code a été exécuté et que j'ai ma table dynamique, n'est-ce pas?

Devrais-je essayer d'aligner chaque table 2 lignes par lignes en utilisant la table dynamique qui a été créée une ligne plus tôt?

et aussi pendant que la table est faite, est-ce que toutes les données de la table sont écrites ou seulement ce que je demande dans l'où?

ill apprécier votre aide.

Répondre

3

En théorie, lorsque vous interrogez plusieurs tables pour essayer de joindre toute la table, un produit croisé temporaire de toutes les tables impliquées est calculé. Cela impliquerait que le nombre total de lignes soit la multiplication du nombre de lignes de chaque table.

En pratique cependant, l'implémentation de SQL (MySQL dans votre cas) prendra soin de calculer efficacement la requête. Un chemin d'exécution de requête est calculé sur la base de divers paramètres et utilisé pour obtenir la sortie souhaitée.

Une meilleure façon d'écrire l'énoncé ci-dessus serait de suivre la nouvelle syntaxe:

SELECT customers.name FROM customers 
INNER JOIN orders ON customers.customerid = orders.customerid 
INNER JOIN order_items ON orders.orderid = order_items.orderid 
INNER JOIN books ON order_items.isbn = books.isbn 
WHERE books.title LIKE '%java%' 

Lire la suite de here pour raisons.

0

Rapid Fire a bien expliqué l'aspect «produit croisé». Voici quelques conseils supplémentaires.

D'abord et avant tout: SQL n'est pas un code de procédure. C'est une requête. La requête entière a lieu simultanément. Vous devez lire toute la requête pour tout comprendre. Il n'y a pas d '"ordre" dans lequel vous lisez les requêtes. Pour une analogie, X = Y est le même que Y = X ... de même, vous lisez toute la requête comme une seule unité.

Ensuite, SQL vous fait abstraction du processus de création de table. Essayez d'y penser d'un point de vue mathématique, basé sur l'algèbre relationnelle. Autrement dit, les tables sont des relations (ou tuples) et ainsi de suite. Recherchez les livres de C. J. Date et lisez-les. Il y a un langage mathématique que SQL a été conçu, et l'apprentissage qui améliorera grandement votre capacité à comprendre les bases de données.

+0

Je pense que cette affirmation pourrait être dangereuse pour les débutants: "SQL n'est pas un code de procédure, c'est une requête, toute la requête se déroule simultanément." Rien n'est jamais simultané, nous avons tous besoin d'une bonne technique pour lire une requête et chaque optimiseur de requête appliquera une "procédure" pour interpréter votre requête et l'envoyer pour exécution. Pour des raisons de performances, toutes ces choses doivent être connues, aucun serveur sql n'est une boîte noire magique où vous pouvez vider les données et les récupérer instantanément. ceteras

+1

@ceteras: Bien sûr, l'optimisation est importante, et la compréhension de la séquence d'analyse et de l'optimisation vous permettra de créer des requêtes plus efficaces. Mais l'affiche originale a des problèmes avec la sémantique de base, à savoir: les jointures. Ceci est absolument crucial pour utiliser SQL de quelque façon que ce soit.Pour l'instant, il est plus important de comprendre SQL à partir de la perspective "Black Box". Après avoir compris cela ... il peut commencer à s'inquiéter de l'optimisation. – Dragontamer5788