Ah but that's true ONLY IF the table doesn't itself contain duplicates. Quick example:
CREATE TEMPORARY TABLE animal (species VARCHAR(255) NOT NULL, colour VARCHAR(255) NOT NULL);
INSERT INTO animal VALUES ('monkey', 'green'), ('rabbit', 'orange'), ('elephant', 'pink'),('monkey','blue'),('rabbit','orange'),('monkey','green'),('monkey','green');
SELECT * FROM animal WHERE species = 'monkey' OR colour = 'green';
+---------+--------+
| species | colour |
+---------+--------+
| monkey | green |
| monkey | blue |
| monkey | green |
| monkey | green |
+---------+--------+
SELECT * FROM animal WHERE species = 'monkey' UNION SELECT * FROM animal WHERE colour = 'green';
+---------+--------+
| species | colour |
+---------+--------+
| monkey | green |
| monkey | blue |
+---------+--------+
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.
SELECT * FROM animal WHERE species = 'monkey' UNION ALL SELECT * FROM animal WHERE colour = 'green';
+---------+--------+
| species | colour |
+---------+--------+
| monkey | green |
| monkey | blue |
| monkey | green |
| monkey | green |
| monkey | green |
| monkey | green |
| monkey | green |
+---------+--------+
For completeness, here's an example where the two queries in the UNION do not return any of the same rows:
SELECT * FROM animal WHERE species = 'monkey' OR colour = 'orange';
+---------+--------+
| species | colour |
+---------+--------+
| monkey | green |
| rabbit | orange |
| monkey | blue |
| rabbit | orange |
| monkey | green |
| monkey | green |
+---------+--------+
SELECT * FROM animal WHERE species = 'monkey' UNION ALL SELECT * FROM animal WHERE colour = 'orange';
+---------+--------+
| species | colour |
+---------+--------+
| monkey | green |
| monkey | blue |
| monkey | green |
| monkey | green |
| rabbit | orange |
| rabbit | orange |
+---------+--------+