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 вместо

UNION.

3. Сортировка результатов комбинированных запросов

Результаты выполнения оператора SELECT сортируются с помощью предложения ORDER BY. При комбинировании запросов с помощью UNION только одно предложение ORDER BY может быть использовано, и оно должно быть проставлено в последнем операторе SELECT. Действительно, на практике нет особого смысла часть результатов сортировать в одном порядке, а другую часть — в другом. Поэтому несколько предложений ORDER BY применять не разрешается.

Статьи по теме:

  • SQL-Урок 11. Внешнее объединение (OUTER JOIN)
  • SQL-Урок 13. Добавление данных (INSERT INTO)
  • mysql — как объединить в два запроса в одну таблицу

    Вопрос задан

    6 лет 1 месяц назад

    Изменён 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
    пытаюсь делать так но пишет ошибку SQL Error (1064): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘WHERE chat. addressee=@user GROUP BY rec’ at line 1 То есть первую строку открывает а остальные нет и в поле not_seen суммирует все записи разбиение не присходит

     
     
    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
    0

    Я всё сделал если кому полезно будет, суть скрипта что он видит у кого сколько не прочитанных сообщений

    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=?
     

    Спасибо.

    5

    Вы можете использовать псевдонимы для обоих запросов и выбирать их в запросе выбора
    http://sqlfiddle.com/#!2/ca27b/1

     SELECT x.a, y.b FROM (SELECT * from a) as x, (SELECT * FROM b) as y
     
    10

    Вы можете использовать ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ :

     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 -- используйте здесь реальный запрос
     
    5

    Вы также можете использовать CTE для захвата групп нужной вам информации и объединения их вместе, если вы хотите, чтобы они находились в одной строке. Пример, в зависимости от того, какой синтаксис SQL вы используете, здесь:

     WITH group1 AS (
      ВЫБЕРИТЕ тестA
        ИЗ таблицы А
    ),
    группа2 АС (
      ВЫБЕРИТЕ тестB
        ИЗ таблицы Б
    )
    ВЫБИРАТЬ *
      ИЗ группа1
      ПРИСОЕДИНЯЙТЕСЬ к группе2 ON group1.testA = group2.testB -- ваш выбор присоединения
    ;
     

    Вы решаете, какой тип JOIN вам нужен, на основе данных, которые вы извлекаете, и убедитесь, что в группах, из которых вы получаете информацию, есть одни и те же поля, чтобы поместить все это в одну строку. Если у вас есть несколько столбцов, обязательно назовите их все правильно, чтобы вы знали, какой из них есть какой. Кроме того, для повышения производительности лучше использовать CTE, а не встроенные SELECT и тому подобное. Надеюсь это поможет.

    0

    как объединить 4 запроса в один запрос

    показать ниже запрос

    1. общее количество ожидающих рассмотрения дел + 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
    4

    То, что вы показываете, по-прежнему является двумя отдельными результатами. Один запрос дает вам один результат. Если вы хотите объединить два запроса, которые дают один запрос и один результат. Один метод:

     ВЫБЕРИТЕ что, имя, значение
    ОТ
    (
      ВЫБЕРИТЕ «ДОХОД» как что, имя, доход как значение, 1 как sortkey1, -доход как sortkey2
      ИЗ таблицы1
      ГДЕ доход > 150
      СОЮЗ ВСЕХ
      ВЫБЕРИТЕ 'РЕЗУЛЬТАТ' как что, имя, результат как значение, 2 как sortkey1, результат как sortkey2
      ИЗ таблицы2
      ГДЕ результат < 200
    )
    ORDER BY sortkey1, sortkey2;
     

    Вы можете ПРИСОЕДИНИТЬСЯ к этим двум таблицам по имени и ВЫБРАТЬ как доход, так и результат, например:

     ВЫБРАТЬ t1.