Hey.
Question by mysql. What are the subtleties of using UNION in mysql?
Faced such a thing - I have two selects, the first of which contains ORDER BY . between UNION stands. sorting in the first for some reason does not happen. That is, it outputs without sorting, and no error is returned.
Created a database
mysql> CREATE DATABASE asd; Query OK, 1 row affected (0.48 sec) mysql> SELECT table_name,table_comment FROM INFORMATION_SCHEMA.tables WHERE table_schema='asd'; Empty set (0.05 sec) mysql> USE asd; Database changed mysql> CREATE TABLE ukraine ( -> name CHAR(30) NOT NULL); Query OK, 0 rows affected (0.84 sec) Created ukraine table
mysql> INSERT INTO ukraine VALUES ('Kiev'),('Lvov'),('Kharkov'),('Poltava'); Query OK, 4 rows affected (0.15 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM ukraine; +---------+ | name | +---------+ | Kiev | | Lvov | | Kharkov | | Poltava | +---------+ 4 rows in set (0.00 sec) Created a russia table
mysql> CREATE TABLE russia ( -> name CHAR(30) NOT NULL); Query OK, 0 rows affected (0.25 sec) mysql> INSERT INTO russia VALUES ('Moskva'),('Belgorod'),('Krasnodar'),('Sochi'); Query OK, 4 rows affected (0.11 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM russia; +-----------+ | name | +-----------+ | Moskva | | Belgorod | | Krasnodar | | Sochi | +-----------+ 4 rows in set (0.00 sec) Объединяю с помощью UNION mysql> (SELECT * FROM ukraine) UNION (SELECT * FROM russia); +-----------+ | name | +-----------+ | Kiev | | Lvov | | Kharkov | | Poltava | | Moskva | | Belgorod | | Krasnodar | | Sochi | +-----------+ 8 rows in set (0.00 sec) Combining with UNION with ORDER BY, does not work
mysql> (SELECT * FROM ukraine ORDER BY name) UNION (SELECT * FROM russia); +-----------+ | name | +-----------+ | Kiev | | Lvov | | Kharkov | | Poltava | | Moskva | | Belgorod | | Krasnodar | | Sochi | +-----------+ 8 rows in set (0.00 sec) Combining with UNION with ORDER BY, does not work
mysql> (SELECT * FROM ukraine) UNION (SELECT * FROM russia ORDER BY name); +-----------+ | name | +-----------+ | Kiev | | Lvov | | Kharkov | | Poltava | | Moskva | | Belgorod | | Krasnodar | | Sochi | +-----------+ 8 rows in set (0.00 sec) I unite with the help of UNION with ORDER BY, which I put in the END, worked
mysql> (SELECT * FROM ukraine) UNION (SELECT * FROM russia) ORDER BY name; +-----------+ | name | +-----------+ | Belgorod | | Kharkov | | Kiev | | Krasnodar | | Lvov | | Moskva | | Poltava | | Sochi | +-----------+ 8 rows in set (0.00 sec) The question is why does ORDER BY only work at the end? He, in theory, it should work within each request.