Могу ли я добавить предложение ORDER BY в запрос с предложением UNION в SQL? - PullRequest
0 голосов
/ 23 февраля 2020

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

Таблица Person

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;

Ответы [ 2 ]

1 голос
/ 23 февраля 2020

Ваш последний запрос (хотя 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 ни в одном из 2 запросов (если вы также не хотите устанавливать LIMIT), но используйте один в конце для окончательного результата.

1 голос
/ 23 февраля 2020

Ваши запросы имеют неправильный формат - столбцы в запросе 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;
...