Представьте, что у меня есть следующая таблица со следующими данными, уже вставленными в нее:

Стол Человек

id_person          name         age
------------------------------------------
    1              name1        18
    2              name2        37
    3              name3        23

Теперь представьте, что я хочу выполнить запрос, который показывает лиц старше 30 лет и лиц младше 20 лет, и я хочу использовать предложение UNION, например:

select name, age from person
where age >= 30
UNION
select name, age from person
where age <= 20;

Вывод этого запроса будет:

   name      age
-------------------
   name2      37
   name1      18

Но что если я захочу упорядочить вывод, используя предложение order by? Где я должен написать статью?

Будет ли работать любой из следующих запросов?

select name, age from person
where age >= 30
group by name
order by age asc
UNION
select name, age from person
where age <= 20;

...

select name, age from person
where age >= 30
UNION
select name, age from person
where age <= 20
group by name
order by age asc;
0
user157629 23 Фев 2020 в 19:03

2 ответа

Лучший ответ

Ваш последний запрос (хотя age является неоднозначным в списке выбора, поскольку он не включен в предложение group by):

select name, age from person
where age >= 30
UNION
select name, age from person
where age <= 20
group by name
order by age asc;

Такой же как:

(select name, age from person
where age >= 30)
UNION
(select name, age from person
where age <= 20
group by name)
order by age asc;

Как это объясняется в документации:

Инструкция без скобок эквивалентна одной скобке ...

Таким образом, предложение order by влияет на результат UNION.
Также важно знать, что:

Использование ORDER BY для отдельных операторов SELECT ничего не подразумевает в порядке, в котором строки появляются в конечном результате, потому что UNION по умолчанию создает неупорядоченный набор строк

Поэтому не используйте ORDER BY ни в одном из двух запросов (если вы не хотите также устанавливать LIMIT), но используйте один в конце для окончательного результата.

1
forpas 23 Фев 2020 в 16:19

Ваши запросы имеют неправильный формат - столбцы в запросе group by не являются ни ключами, ни агрегированными. Тем не менее, общая идея в MySQL заключается в использовании скобок:

(<query 1>)
union all
(<query 2>)
order by <whatever>

Ваш конкретный запрос может быть записан как:

select name, age
from person
where age >= 30 or age <= 20
order by age asc;
1
Gordon Linoff 23 Фев 2020 в 16:19