JOIN of geen JOIN

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

- SanThe -

- SanThe -

23/05/2012 11:57:09
Quote Anchor link
Gewoon een vraagje aan de experts uit nieuwsgierigheid.
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


Het werkt trouwens perfect.
Gewijzigd op 23/05/2012 12:02:29 door - SanThe -
 
PHP hulp

PHP hulp

22/11/2024 08:45:28
 
G P

G P

23/05/2012 12:01:17
Quote Anchor link
Hummm... Dat is een interessante vraag, dit ga ik mee opvolgen, ben ook benieuwd! :)

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
 
De VeeWee

de VeeWee

23/05/2012 12:58:38
Quote Anchor link
Ik was dit een tijdje geleden aan het uitzoeken en kwam op volgende link uit:
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.
 
Bartje Jansen

Bartje Jansen

07/06/2012 12:15:23
Quote Anchor link
- 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?

Quote:
SELECT u.nickname, u.status
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.
 
Erwin H

Erwin H

07/06/2012 12:22:11
Quote Anchor link
Het kan beide. Wat je nu doet is een impliciete join, als je het uitschrijft met een JOIN dan is het een expliciete join. Sommige SQL implementaties kennen geen expliciete joins, dus dan moet het zoals je het nu doet.

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
 
Bartje Jansen

Bartje Jansen

07/06/2012 18:11:57
Quote Anchor link
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.
 
Erwin H

Erwin H

07/06/2012 18:14:36
Quote Anchor link
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.
 
Jeroen VD

Jeroen VD

07/06/2012 20:55:51
Quote Anchor link
Het is net zoiets als met de asterix (*). Het kan wel, maar het is beter om te benoemen. Expliciet is altijd beter dan impliciet.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.