Newsgroup: it.comp.appl.access
Titolo: Differenza tra WHERE e INNER JOIN

Come avrà capito chi ha letto il mio precedente post, non sono certo un 
esperto (questo sì che è un eufemismo!) di SQL. Comunque sono andato un 
po' in giro per la rete e mi sono letto un po' di tutorial e 
documentazione varia su SQL (a proposito, ho fatto anche qualche 
giratina sul sito comune: complimenti!)... eppure non sono riuscito a 
chiarire un punto: che differenza c'è fra usare INNER JOIN e usare 
WHERE?
Sarò tonto, ma... esempio!
***Tabella1***
ID_ordine
ID_cliente
Data
Pinco
Pallino
...
***Tabella2***
ID_Cliente
Nome
Telefono
...
Che differenza c'è fra:
SELECT * FROM Tabella1 INNER JOIN Tabella2 ON Tabella1.ID_cliente = 
Tabella2.ID_CLiente
e
SELECT * FROM Tabella1, Tabella2 WHERE Tabella1.ID_cliente = 
Tabella2.ID_CLiente
Aspetto che qualcuno mi spieghi quanto sono bischero per non averlo 
capito da solo...  :-)
Grazie
Giacomo 

 ha scritto:

          Inner join è il tipo dii relazione tra due tabelle, where è un filtro
Tu potresti avere tutt'e due tranquillamente
Se hai una tabA e tabB
Potresti avere le due tabelle che sono relazionate per i campi id-rif_id e
quindi creati la tua bella query. Poi di questa query vorresti avere
solotutti i record che hanno TabA.name = "Biso" e useresti il where
MAssimiliano
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 capito da solo...  :-)
Ciao Giacomo,
(solo una approfondimento su quanto già detto da Ma.)
Messa così non c'è nessuna differenza,  sono due modi per fare la stessa
cosa
-- SQL-89 Join Syntax ------
SELECT
  <select_list>
FROM
  T1, T2
WHERE
  <join_condition> [AND <filter>]
---------------
----SQL-92 Join Syntax----
SELECT
  <select_list>
FROM
    T1
  <join_type> JOIN
    T2 [ON <join_condition>]
[WHERE
  <filter>]
--------------
Con Sql 92 sono state introdotte le JOIN per evitare ambiguità tra il
criterio della JOIN e il filtro della WHERE
Ciao Giorgio

 ha
scritto nel messaggio news:38mh81F...@individual.net...

Ciao Giacomo,
dal punto di vista del risultato non c'è nessuna differenza.
La versione con Where è quella usata nelle prime versioni di Access  poi  è
stato consigliato di usare  INNER JOIN credo per uniformarsi  a non so che
versone dello standard SQL...
Cinzia


Puoi usare tutti e due metodi per fare un join.
Come gli altri hanno già scritto la sintassi con WHERE è più vecchio.
Molti sistemi hanno aggiunto la parola chiave JOIN tardi p.e.
ORACLE solo tanti anni dopo 92 da quando fa parte dello standard SQL.
JET invece conosce INNER e LEFT/RIGHT OUTER JOIN già dalla
prima versione, vuol dire da Access 1.0.
Ci sono due differenze tra i metodi.
1. Universale e più o meno cosmetico:
Con JOIN il criterio del join è esplicito e la clausola WHERE
viene usato esclusivamente per criteri di selezione.
2. È specifico per JET e molto importante:
Con la clausola JOIN la query puo essere aggiornabile (dipende
anche di altri fattori), invece se fa un join con la clausola WHERE
la query non è mai aggiornabile.
Per questo dalla parte di MS è consigliato da sempre di usare
JOIN invece di WHERE per fare un join con JET.
-- 
HTH
Karl
*********
Access FAQ: 
www.donkarl.com/it
+info sulla prima Conferenza Italiana per Sviluppatori di Access (CISA1) 

Insomma, mi pare di aver capito che l'unica differenza è un sottinteso 
logico (cioè i due costrutti di riferiscono ad operazioni che hanno una 
logica diversa, anche se in pratica si fanno nello stesso modo e danno 
gli stessi risultati), con la sola diffenrenza pratica che, almeno in 
access, i rirultati di un join sono modificabili mentre quelli di un 
where no...
Grazie a tutti
Giacomo 

 intermedia di 1.000 x 1.000 = 1.000.000 di righe !
Sarebbe buona ma secondo me sbagli.
In ogni join la prima operazione è fare il prodotto cartesiano.
È una regola che non si è cambiato con la nuova sintassi.
Solo dopo viene il processo di selezione.
In questo rispetto non importa se il join è fatto nella clausola
FROM o nella clausola WHERE.
Ci sono stati molti discussioni sia per MS SQL Server o per
Oracle che hanno ricevuto la nuova sintassi più tardi e infine il
risultato era sempre che non ci sono differenze nel performance
delle due metodi. Lo stile nuovo è meglio perché è esplicito non
perché sia più performante o cambia il principio come viene
eseguito un join.
Per Access Kevin Collins (il Mr. JET di MS) nel "Microsoft Jet
Database Engine Programmer's Guide" nel capitolo 4 scrive
che le due vantaggi della sintassi ANSI 92 sono essere
esplicito e rendere la query aggiornabile (solo per JET).
Non dice niente di una differenza nel performance.
-- 
cu



dipende da che motore di database usi.
Un buon optimizer traduce automaticamente la sintassi *SQL-89 Join Syntax*
in *SQL-92 Join Syntax*  evitando il passaggio nella CROSS JOIN
La stessa cosa vale per gli OUTER JOIN
---------------
SELECT *
FROM Clienti, Ordini
WHERE Clienti.ID*=Ordini.ID
---------------
viene tradotta in LEFT JOIN
---------------
SELECT *
FROM Clienti, Ordini
WHERE Clienti.ID=*Ordini.ID
---------------
viene tradotta in RIGHT JOIN
Ciao Giorgio

 ha scritto:
Per completezza....
Questa Query eseguita con AccessXp
-----------------
SELECT Tb1.Id,
       Tb1.Intestazione,
       Tb2.IdTb1,
       Tb2.Campo1
FROM Tb1, Tb2
WHERE Tb1.Id = Tb2.IdTb1;
-----------------
genera questo piano di esecuzione
--- Query1 ---
- Inputs to Query -
Table 'Tb1'
    Using index 'PrimaryKey'
    Having Indexes:
    PrimaryKey 13 entries, 1 page, 13 values
      which has 1 column, fixed, unique, clustered and/or counter,
primary-key, no-nulls
Table 'Tb2'
- End inputs to Query -
01) Inner Join table 'Tb2' to table 'Tb1'
      using index 'Tb1!PrimaryKey'
      join expression "Tb2.IdTb1=Tb1.Id"
---------------------
che è lo stesso piano che viene generato con l'uso esplicito della INNER
JOIN
Ciao Giorgio

...
Beh, dopo il café mi sembra che era tardi e abbastanza falso
perché dipende se ci sono indici che vengono usati. È meglio
dire che se il db engine fa un prodotto cartesiano con WHERE
fa anche uno con JOIN. Se il db engine puo usare un indice
per filtrare la prima tabella (e dopo fare il join) anche vale per
tutti e due metodi.


La mia voleva essere una risposta generale e "filosofica", senza alcun
riferimento a motori e versioni SQL specifici, così come la domanda
che era posta in termini del tutto teorici.
Vincenzo Turturro
---------------------------------------------
il sito comune di it.comp.appl.access:
http://www.sitocomune.com/
---------------------------------------------
E quello di it.comp.as400:
http://www.faq400.com/
---------------------------------------------