SQL-Урок 12. Комбинированные запросы (UNION)
ВВЕРХ❮ ❯
В большинстве SQL-запросов используется один оператор, с помощью которого возвращаются данные из одной или нескольких таблиц. SQL также позволяет выполнять одновременно несколько отдельных запросов и отображать результат в виде единого набора данных. Такие комбинированные запросы обычно называют сочетаниями или сложными запросами.
1. Использование оператора UNION
Запросы в языке SQL комбинируются с помощью оператора UNION. Для этого необходимо указать каждый запрос SELECT и разместить между ними ключевое слово UNION. Ограничений по количеству использованного оператора UNION в одном общем запросе нет. В предыдущем разделе мы отмечали, что Access не имеет возможности создавать полное внешнее объединение, теперь мы посмотрим, как можно этого достичь через оператор UNION.
SELECT * FROM Sumproduct LEFT JOIN Sellers ON Sumproduct.City = Sellers.City UNIONSELECT * FROM Sumproduct RIGHT JOIN Sellers ON Sumproduct.City = Sellers.City
Видим, что запрос отобразил как все колонки из первой таблицы — так и с другой, независимо от того, все ли записи имеют соответствия в другой таблице.
Также стоит отметить, что во многих случаях вместо UNION мы можем использовать предложение WHERE со многими условиями, и получать аналогичный результат. Однако из-за UNION записи выглядят более лаконичными и понятными. Также необходимо соблюдать определенные правила при написании комбинированных запросов:
- запрос UNION должен включать два и более операторов SELECT, отделенных между собой ключевым словом UNION (т.е. если в запросе используется четыре оператора SELECT, то должно быть три ключевых слова UNION)
- каждый запрос в операторе UNION должен иметь одни и те же столбцы, выражения или статистические функции, которые, к тому же, должны быть перечислены в одинаковом порядке
- типы данных столбцов должны быть совместимыми.
2. Включение или выключение повторяющихся строк
Запрос с UNION автоматически удаляет все повторяющиеся строки из набора результатов запроса (то есть, ведет себя как предложения WHERE с несколькими условиями в одном операторе SELECT ). Такое поведение оператора UNION по умолчанию, но при желании мы можем изменить это. Для этого нам следует использовать оператор UNION ALL вместо
3. Сортировка результатов комбинированных запросов
Результаты выполнения оператора SELECT сортируются с помощью предложения ORDER BY. При комбинировании запросов с помощью UNION только одно предложение ORDER BY может быть использовано, и оно должно быть проставлено в последнем операторе SELECT. Действительно, на практике нет особого смысла часть результатов сортировать в одном порядке, а другую часть — в другом. Поэтому несколько предложений ORDER BY применять не разрешается.
Статьи по теме:
mysql — как объединить в два запроса в одну таблицу
Вопрос задан
Изменён 6 лет 1 месяц назад
Просмотрен 228 раз
Здравствуйте такая проблема есть два запроса по отдельность работают, а вот как их объединить left join или еще как не знаю всем спасибо, вот запросы
rec и id одинаковый идентификатор, то есть к первому запросу добавить поля fullName, imgRealtorSmall, fileNameSmall
@user = 1; SELECT IF(sender=@user,addressee, sender) rec, max(date) last_date, substr(max(concat(date,message)),20) last_msg, sum(addressee_status=0) not_seen FROM chat WHERE addressee=@user GROUP BY rec SELECT id, fullName, imgRealtorSmall, fileNameSmall FROM realtor
SET @user=236; SELECT IF(chat.sender=@user,chat.addressee, chat.sender) rec, max(chat.date) last_date, substr(max(concat(date,chat.message)),20) last_msg, sum(chat.addressee_status=0) not_seen, realtor.fullName, realtor.imgRealtorSmall, realtor.fileNameSmall FROM chat INNER JOIN realtor ON chat.sender = realtor.id; WHERE chat.addressee=@user GROUP BY rec
- mysql
- sql
Я всё сделал если кому полезно будет, суть скрипта что он видит у кого сколько не прочитанных сообщений
SELECT IF(sender=:user,addressee,sender) rec, // проверяет условие так условие 1 параметр 2параметр истина 3 ложь max(date) last_date,//ищет последнюю дату substr(max(concat(date,message)),20) last_msg, // объединяю дату с сообщением что бы не было проблем с повторяющим ид сообщений sum(addressee_status=0) not_seen, // суммирую статус не прочитанных realtor.fullName, // добавляю данные из таблицы realtor realtor.imgRealtorSmall,// добавляю данные из таблицы realtor realtor.fileNameSmall // добавляю данные из таблицы realtor FROM chat INNER JOIN realtor ON sender = realtor.id // говорю что с чем должно сравниваться WHERE addressee=:user // условие что показываются все сообщения, где в входящих прописан юзер исходящего GROUP BY rec // группирую запрос
Зарегистрируйтесь или войдите
Регистрация через Google Регистрация через Facebook Регистрация через почтуОтправить без регистрации
ПочтаНеобходима, но никому не показывается
Отправить без регистрации
ПочтаНеобходима, но никому не показывается
By clicking “Отправить ответ”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.
Объединение результатов двух запросов SQL в виде отдельных столбцов
спросил
Изменено 1 год, 8 месяцев назад
Просмотрено 235 тысяч раз
У меня есть два запроса, которые возвращают отдельные наборы результатов, и запросы возвращают правильный вывод.
Как мне объединить эти два запроса в один, чтобы получить один набор результатов с каждым результатом в отдельном столбце?
Запрос 1:
ВЫБЕРИТЕ СУММУ (Fdays) AS fDaysSum From tblFieldDays WHERE tblFieldDays.NameCode=35 AND tblFieldDays.WeekEnding=?
Запрос 2:
ВЫБЕРИТЕ СУММУ (CHdays) AS hrsSum From tblChargeHours ГДЕ tblChargeHours.NameCode=35 AND tblChargeHours. WeekEnding=?
Спасибо.
Вы можете использовать псевдонимы для обоих запросов и выбирать их в запросе выбора
http://sqlfiddle.com/#!2/ca27b/1
SELECT x.a, y.b FROM (SELECT * from a) as x, (SELECT * FROM b) as y10
Вы можете использовать ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ
:
SELECT * ОТ ( ВЫБЕРИТЕ СУММУ (Fdays) AS fDaysSum ОТ tblFieldDays ГДЕ tblFieldDays.NameCode=35 AND tblFieldDays.WeekEnding=1) A -- используйте здесь реальный запрос ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ (ВЫБЕРИТЕ СУММУ (CHdays) AS hrsSum ОТ tblChargeHours ГДЕ tblChargeHours.NameCode=35 AND tblChargeHours.WeekEnding=1) B -- используйте здесь реальный запрос
Вы также можете использовать CTE для захвата групп нужной вам информации и объединения их вместе, если вы хотите, чтобы они находились в одной строке. Пример, в зависимости от того, какой синтаксис SQL вы используете, здесь:
WITH group1 AS ( ВЫБЕРИТЕ тестA ИЗ таблицы А ), группа2 АС ( ВЫБЕРИТЕ тестB ИЗ таблицы Б ) ВЫБИРАТЬ * ИЗ группа1 ПРИСОЕДИНЯЙТЕСЬ к группе2 ON group1.testA = group2.testB -- ваш выбор присоединения ;
Вы решаете, какой тип JOIN вам нужен, на основе данных, которые вы извлекаете, и убедитесь, что в группах, из которых вы получаете информацию, есть одни и те же поля, чтобы поместить все это в одну строку. Если у вас есть несколько столбцов, обязательно назовите их все правильно, чтобы вы знали, какой из них есть какой. Кроме того, для повышения производительности лучше использовать CTE, а не встроенные SELECT и тому подобное. Надеюсь это поможет.
0как объединить 4 запроса в один запрос
показать ниже запрос
- общее количество ожидающих рассмотрения дел + 2.дела, поданных в течение этого месяца (на основе sysdate) + общее количество дел (1+2) + нет. дела расположены, где nse = расположены + нет. незавершенных дел (кроме nse <> рассмотренных)
nsc = характер случая
отчет сдается 06 числа каждого месяца
(месячный отчет будет считаться с 05 числа предыдущего месяца по 05 числа текущего месяца)
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google Зарегистрироваться через Facebook Зарегистрируйтесь, используя электронную почту и парольОпубликовать как гость
Электронная почтаТребуется, но никогда не отображается
Опубликовать как гость
Электронная почтаТребуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.
mysql — объединить два отдельных SQL-запроса в один запрос
Задавать вопрос
спросил
Изменено 6 лет, 2 месяца назад
Просмотрено 5к раз
У меня есть эти две таблицы:
Имя | Доход ----------|---------- Алиса | 200 Боб | 100 Чарли | 50 Дэйв | 500 Имя | Исход ----------|---------- Алиса | 300 Боб | 40 Чарли | 100 Дэйв | 250
Я могу сделать этот запрос, чтобы получить всех людей с доходом больше 150 и упорядочить их
ВЫБЕРИТЕ Имя, Доход ИЗ таблицы1 ГДЕ Доход > 150 СОРТИРОВАТЬ ПО доходу DESC
Точно так же я могу получить всех людей, у которых результат меньше 200:
ВЫБЕРИТЕ Имя, Результат ИЗ таблицы2 ГДЕ Результат < 200 ORDER BY Результат DESC
Есть ли способ получить два представления, написав один запрос, т. е. используя только один ;
?
РЕДАКТИРОВАТЬ: Извините, я только что понял, что не совсем понял, что я хочу получить. Это более или менее то, что я пытаюсь достичь:
Имя | Доход ----------|---------- Дэйв | 500 Алиса | 200 Имя | Исход ----------|---------- Чарли | 100 Боб | 40
Я знаю о JOIN
, но в результате получится только одна таблица. Я также не могу использовать UNION
, потому что Outcome и Income имеют один и тот же тип данных, но означают разные вещи.
- MySQL
- SQL
То, что вы показываете, по-прежнему является двумя отдельными результатами. Один запрос дает вам один результат. Если вы хотите объединить два запроса, которые дают один запрос и один результат. Один метод:
ВЫБЕРИТЕ что, имя, значение ОТ ( ВЫБЕРИТЕ «ДОХОД» как что, имя, доход как значение, 1 как sortkey1, -доход как sortkey2 ИЗ таблицы1 ГДЕ доход > 150 СОЮЗ ВСЕХ ВЫБЕРИТЕ 'РЕЗУЛЬТАТ' как что, имя, результат как значение, 2 как sortkey1, результат как sortkey2 ИЗ таблицы2 ГДЕ результат < 200 ) ORDER BY sortkey1, sortkey2;
Вы можете ПРИСОЕДИНИТЬСЯ
к этим двум таблицам по имени и ВЫБРАТЬ
как доход, так и результат, например:
ВЫБРАТЬ t1.