JOIN of geen JOIN
Is dit netjes of hoort dit in een JOIN te zitten?
Quote:
SELECT u.nickname, u.status
FROM loginlog as l, users as u
WHERE l.ingelogd = 1
AND l.user_id = u.id
FROM loginlog as l, users as u
WHERE l.ingelogd = 1
AND l.user_id = u.id
Het werkt trouwens perfect.
Gewijzigd op 23/05/2012 12:02:29 door - SanThe -
Is er zo geen knopje zoals bij Facebook? "Vind ik leuk" of zoiets als "Volgen"? :p
Gewijzigd op 23/05/2012 12:02:05 door G P
http://stackoverflow.com/questions/1018822/inner-join-on-vs-where-clause
Quote:
INNER JOIN is ANSI syntax which you should use.
It is generally considered more readable, especially when you join lots of tables.
It can also be easily replaced with an OUTER JOIN whenever a need arises.
The WHERE syntax is more relational model oriented.
A result of two tables JOIN'ed is a cartesian product of the tables to which a filter is applied which selects only those rows with joining columns matching.
It's easier to see this with the WHERE syntax.
As for your example, in MySQL (and in SQL generally) these two queries are synonyms.
Also note that MySQL also has a STRAIGHT_JOIN clause.
Using this clause, you can control the JOIN order: which table is scanned in the outer loop and which one is in the inner loop.
You cannot control this in MySQL using WHERE syntax.
It is generally considered more readable, especially when you join lots of tables.
It can also be easily replaced with an OUTER JOIN whenever a need arises.
The WHERE syntax is more relational model oriented.
A result of two tables JOIN'ed is a cartesian product of the tables to which a filter is applied which selects only those rows with joining columns matching.
It's easier to see this with the WHERE syntax.
As for your example, in MySQL (and in SQL generally) these two queries are synonyms.
Also note that MySQL also has a STRAIGHT_JOIN clause.
Using this clause, you can control the JOIN order: which table is scanned in the outer loop and which one is in the inner loop.
You cannot control this in MySQL using WHERE syntax.
- SanThe - op 23/05/2012 11:57:09:
Gewoon een vraagje aan de experts uit nieuwsgierigheid.
Is dit netjes of hoort dit in een JOIN te zitten?
Het werkt trouwens perfect.
Is dit netjes of hoort dit in een JOIN te zitten?
Quote:
SELECT u.nickname, u.status
FROM loginlog as l, users as u
WHERE l.ingelogd = 1
AND l.user_id = u.id
FROM loginlog as l, users as u
WHERE l.ingelogd = 1
AND l.user_id = u.id
Het werkt trouwens perfect.
Het werkt wel voor een INNER JOIN, meestal als JOIN geschreven, maar niet voor een LEFT JOIN of RIGHT JOIN. Daarnaast kun je in queries met meerdere joins niet in één keer zien dat het een JOIN betreft en waarop dan wordt gejoind. Het uitschrijven met een JOIN is dus altijd aan te raden. En met LEFT en RIGHT heb je geen andere (eenvoudige) mogelijkheid dan LEFT JOIN of RIGHT JOIN.
Hou het simpel, dan begrijpt een ander het ook.
Wat ik ervan gelezen heb zijn er drie redenen om als het kan expliciete joins te gebruiken.
Ten eerste is het sneller, omdat de database engine de join niet meer hoeft te bepalen. Of het echt veel scheelt weet ik niet.
Ten tweede is het semantisch beter. Bij expliciete joins komen de join voorwaarden in je WHERE clause terecht, terwijl het feitelijk niets te maken heeft met welke rijen je selecteert. Met veel joins in een query kan dit zelfs ook nog behoorlijk oplopen waardoor je WHERE onnodig lang en onduidelijk wordt. Bij een expliciete JOIN staat alles direct bij de JOIN en is het dus veel duidelijker. Je WHERE blijft kort en als je ooit eens een join eruit wil halen dan kan dat vrij eenvoudig.
Ten derde heb je met expliciete joins meer controle over hoe je joins maakt. INNER JOIN, OUTER JOIN, LEFT JOIN zijn allemaal verschillende joins die verschillend werken op de dataset. Dat kan ook met impliciete, maar dan moet je het in de voorwaarde gaan verwerken (zie punt 2).
Dus beide kunnen, maar ik kies bijna zonder uitzondering voor de expliciete joins.
Gewijzigd op 07/06/2012 12:22:38 door Erwin H
Erwin H op 07/06/2012 12:22:11:
Ten eerste is het sneller, omdat de database engine de join niet meer hoeft te bepalen. Of het echt veel scheelt weet ik niet.
Voor PostgreSQL maakt het 0 komma niks uit, het queryplan is namelijk exact hetzelfde. De database herschrijft jouw query namelijk toch naar iets anders, iets waar intern mee kan worden gewerkt.
En dat geldt dus ook voor jouw andere punten.
Een expliciete JOIN is gewoon duidelijker en geeft jou als gebruiker meer mogelijkheden. Daarnaast werkt dit inmiddels op de meest bekende databases die SQL als taal ondersteunen.
Bartje Jansen op 07/06/2012 18:11:57:
En dat geldt dus ook voor jouw andere punten.
Die andere punten hebben er niets mee te maken, dus die opmerking begrijp ik niets van. Maar dat zal wel aan mij liggen. Volgens zeg ik precies wat jij zeg, alleen in andere woorden.
Het is net zoiets als met de asterix (*). Het kan wel, maar het is beter om te benoemen. Expliciet is altijd beter dan impliciet.