Putting aside any opinions on performance, I've been trying to test a notion about whether a couple queries would output the same data (ordering doesn't matter).
SELECT *
FROM articles
WHERE (
last_updated >= %s
OR id IN (1, 2, 3)
)
AND created_at IS NOT NULL
SELECT *
FROM articles
WHERE last_updated >= %s
AND created_at IS NOT NULL
UNION
SELECT *
FROM articles
WHERE id IN (1, 2, 3)
AND created_at IS NOT NULL
I think they're equivalent, but I can't prove it to myself.
Edit:
Aye, looking at the replies, I'm becoming aware that I left out a couple key assumptions I've made. Assuming:
a) id
is a PRIMARY KEY
(or otherwise UNIQUE
)
b) I mean equivalent
insofar as "the rows returned will contain equivalent data same (though maybe ordered differently)"
Ah but that's true ONLY IF the table doesn't itself contain duplicates. Quick example:
So we could change the query to use UNION ALL, which does include duplicates. In that case, the returned rows are the same ONLY IF the rows returned by the left side of the UNION do not overlap those returned by the right side, otherwise it will return more rows.
For completeness, here's an example where the two queries in the UNION do not return any of the same rows: