[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-bugs-dist
Subject:    [Bug 96388] show number of images in the album
From:       chiefaua <tom_t () gmx ! at>
Date:       2007-12-12 10:45:02
Message-ID: 20071212104502.3582.qmail () ktown ! kde ! org
[Download RAW message or body]

------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.
         
http://bugs.kde.org/show_bug.cgi?id=96388         




------- Additional Comments From tom_t gmx at  2007-12-12 11:44 -------
Hello

This query:

SELECT ImageTags.tagid, Images.name FROM ImageTags, Images WHERE ImageTags.imageid = \
Images.id;

is the implicit way of writing

SELECT ImageTags.tagid, Images.name FROM ImageTags INNER JOIN Images ON \
ImageTags.imageid=Images.id;

The database should treat both queries in exactly the same way (and optimise both \
queries to the same disk/database operations). The second way of writing it is more \
explicit, and stresses the fact that there is a join involved. But the database \
(should) work out that the WHERE clause in the first query is equivalent. MySQL, in \
fact, replaces the JOIN clause internally by WHERE clauses.


In the second query, we used an INNER JOIN. This join is different from the LEFT \
JOIN, but due to the nature of the table ImageTags they produce the same result in \
this case. The LEFT JOIN ensures that all rows from the "left" table (in our case \
ImageTags) are included in the resulting set. If there were no corresponding row in \
the Images table, it would fill in null values. But as there are only valid imageid's \
in ImageTags, the database finds for each row in ImageTags an Image, and the result \
is the same as for the INNER JOIN (which would never add null-values).

So, this query is (in this case) also equivalent:

SELECT ImageTags.tagid, Images.name FROM ImageTags LEFT JOIN Images ON \
ImageTags.imageid=Images.id;

There exists also a RIGHT JOIN and a FULL OUTER JOIN. SQLite 3 does not support them, \
and MySQL does not support the FULL OUTER JOIN. Also, there are some other variants \
of joins, like NATURAL joins, but I'm not sure which databases support which joins, \
and where are the exact differences.


So, to conclude, all three queries return the same result, and a database should \
optimize all three of them to the same low level operations (note that the LEFT JOIN \
could possibly constrain the database's optimizations, but in this case there is no \
difference, as there are no further WHERE clauses).

So, I think it comes down to personal taste which of the three queries you use.

Hopefully I could clarify a bit,

Thomas


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic