На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! информация о разделе
user posted imageДанный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ.

Модераторы: Akina
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> Как работают вычисления в SQL?
    Здравствуйте.
    Работаю с базой данный через PhpMyAdmin.
    В нем можно отправлять SQL запросы к базе и в интерфейсе PhpMyAdmin видеть результат. Заинтересовали расчеты с помощью SQL. Помогите с ними разобраться.

    Пример 1.
    Есть Таблица с одинаковым товаром, с полями
    - номер заказа
    - количество проданного товара
    - стоимость товара за штуку

    Можно ли с помощью SQL посчитать сумму за каждый заказ умножив
    (количество проданного товара)*(стоимость товара за штуку)?

    Где в таком случае выведется результат произведения?
    Будет создан абстрактный (временный) столбец, где выведутся произведения для каждого заказа?
    Объясните, пожалуйста, как это работает.

    --

    Пример 2.
    Есть таблицы с полями
    - Номер заказа
    - Статус заказа
    - Дата время наступления статуса

    Строка 1:
    - Номер заказа: "123"
    - Статус заказа: "Создан"
    - Дата время наступления статуса: "01.12.2023"

    Строка 2:
    - Номер заказа: "123"
    - Статус заказа: "Завершен"
    - Дата время наступления статуса: "03.12.2023"

    Нужно посчитать с помощью SQL сколько дней для Заказа "123" прошло между статусам "Создан" и "Завершен".
    Т.е. "03.12.2023" - "01.12.2023" = 2дня
    Можно ли это посчитать через SQL?
    Вопрос аналогичный, где будет выведен результат?
    Будет создана абстрактная (временная) таблица в которой будут выведены
    - Номер заказа
    - Количество дней между прошло между статусам "Создан" и "Завершен".
    ??

    user posted image
    Сообщение отредактировано: rownong@yandex.ru -
      Цитата rownong@yandex.ru @
      Можно ли это посчитать через SQL?

      Конечно можно. Для этого тебе нужно сделать соединение таблицы с самой себя. Условие соединения - что номера заказов совпадают, и у первой таблицы в поле статуса заказа "создан", и у второй "завершен". В этом запросе в блоке SELECT указываешь первым полем - номер заказа (первой или присоединяемой таблицы - без разницы, т.к. они равны), вторым полем используешь функцию с постфикcом AS days. Этим самым ты переназовешь второй столбец. Функцию ищи в документации, которая рассчитывает разницу в днях. Если я не ошибаюсь - в MySQL это DATEDIFF. В PostgreSQL используй что-то типа:

      ExpandedWrap disabled
        (timestamp2::date - timestamp1::date) AS days


      Добавлено
      Цитата rownong@yandex.ru @
      Вопрос аналогичный, где будет выведен результат?
      Будет создана абстрактная (временная) таблица в которой будут выведены
      - Номер заказа
      - Количество дней между прошло между статусам "Создан" и "Завершен".
      ??

      Будет создан результат, который будет выведен в интерфейс phpMyAdmin, и никуда не будет записан. Если нужно его куда-то сохранить - копируй из интерфейса копипастой. Или создай заранее нужную таблицу в БД и в нее произведи запись результата запроса.
        Цитата rownong@yandex.ru @
        Где в таком случае выведется результат произведения?

        В запросе, который описывает задание серверу, указывается, какие поля нужно вернуть, и с помощью каких выражений следует получать для них значения. Можно вывести поле исходной таблицы без изменения, можно его при выводе переименовать, можно на основе нескольких полей написать вычисляющее выражение и дать ему имя...

        Например, запрос может выглядеть так:
        ExpandedWrap disabled
          SELECT table1.name1, table2.name2 AS name3, table1.name4 * table2.name5 AS name6
          FROM ...

        Соответственно после связывания исходных таблиц в соответствии в секцией FROM, фильтрации в соответствии со WHERE и сортировкой в соответствии с ORDER BY будет возвращён набор записей. Он будет состоять из трёх полей с именами name1, name3 и name6, первые два будут содержать неизменённые значения указанных полей исходных таблиц, третье - произведение указанных полей.
        Сообщение отредактировано: Akina -
          Цитата
          В запросе, который описывает задание серверу, указывается, какие поля нужно вернуть, и с помощью каких выражений следует получать для них значения. Можно вывести поле исходной таблицы без изменения, можно его при выводе переименовать, можно на основе нескольких полей написать вычисляющее выражение и дать ему имя...

          Получается когда делаем SQL запрос, чтобы соединить 2 таблицы можем в результате скрывать (не выводить) определённые столбцы? Вернее, выводить только нужны столбцы из обоих таблиц

          Добавлено
          Если есть например 10 менеджеров по продажам, мы можем в результате SQL запроса вывести не 10 строка с суммой продажи каждого менеджера за месяц, а 1 строк с суммой продаж всех менеджеров за месяц?
          Сообщение отредактировано: rownong@yandex.ru -
            Цитата rownong@yandex.ru @
            Получается когда делаем SQL запрос, чтобы соединить 2 таблицы можем в результате скрывать (не выводить) определённые столбцы? Вернее, выводить только нужны столбцы из обоих таблиц

            Да.
            Цитата rownong@yandex.ru @
            Если есть например 10 менеджеров по продажам, мы можем в результате SQL запроса вывести не 10 строка с суммой продажи каждого менеджера за месяц, а 1 строк с суммой продаж всех менеджеров за месяц?

            Можем. Есть несколько вариантов. Первый - используй фильтрацию запросов оператором WHERE чтобы получить одну нужную строку, либо пробуй использовать оператор LIMIT с аргументом 1. Во втором случае скорее всего нужно будет прибегнуть заранее к сортировке строк результата, ибо лимит только "обрежет" остальные строки из результата. А без предварительной сортировки это будет недетерминированный результат.

            Хотя, суммируя все продажи, мы реально должны получить одну строку без всяких телодвижений типа WHERE и LIMIT.
              Цитата rownong@yandex.ru @
              Получается когда делаем SQL запрос, чтобы соединить 2 таблицы можем в результате скрывать (не выводить) определённые столбцы? Вернее, выводить только нужны столбцы из обоих таблиц

              Выводить нужно (не можно, а именно нужно) только то, что реально требуется. Если нужны только результаты вычисления каких-то выражений - в выходном наборе должны быть только они. SELECT * в рабочей версии приложения пишут исключительно идиоты (да, вот настолько безальтернативно) - даже если действительно нужны все поля, следует их перечислять по одному. Или идти учить матчасть по нормализации данных.

              Цитата rownong@yandex.ru @
              Если есть например 10 менеджеров по продажам, мы можем в результате SQL запроса вывести не 10 строка с суммой продажи каждого менеджера за месяц, а 1 строк с суммой продаж всех менеджеров за месяц?

              Продажа отдельного менеджера и продажа всех менеджеров - это разные уровни группировки. Поэтому сама фраза не имеет смысла - нужно ведь либо то, либо другое. А если вдруг надо всё это одновременно (программист не умеет заставить клиентскую часть выводить итоги), то есть GROUP BY WITH ROLLUP/CUBE. Нереляционно, но если по другому не умеешь - пусть его. Это ж потом не SQL-серверу трахаться, а клиентской части, её не жалко.
                Цитата Akina @
                SELECT * в рабочей версии приложения пишут исключительно идиоты (да, вот настолько безальтернативно) - даже если действительно нужны все поля, следует их перечислять по одному

                Согласен полностью. Но только с учетом именно рабочей версии. В процессе написания скрипта и его отладки SELECT * вполне допустимо использовать, иногда это немного экономит время. ИМХО.
                  SELECT * можно писать в рабочем коде. Вот MS SQL пример:
                  ExpandedWrap disabled
                    IF EXISTS(SELECT * …

                  Есть еще по крайней мере один случай, когда нельзя перечислять поля, а надо писать SELECT * в рабочем коде.
                    Цитата MIF @
                    надо писать SELECT * в рабочем коде

                    Хм...Это с какого такого перепугу? :P
                      Цитата MIF @
                      SELECT * можно писать в рабочем коде. Вот MS SQL пример:

                      Вас спасает только то, что MS SQL достаточно умный. И знает, что в EXISTS сами значения полей не нужны, и лезть за ними в тело таблицы не требуется. Но вот формально - такой код требует метнуться за значениями полей, а потому SELECT {const} разумнее и логичнее.

                      Цитата MIF @
                      Есть еще по крайней мере один случай, когда нельзя перечислять поля, а надо писать SELECT * в рабочем коде.

                      Хотелось бы конкретики. Я пока о таких случаях не слышал - за исключением ситуации, когда необходимость грести всё подряд определяется или отставанием клиента, или мультиверсионностью БД.
                        Еще подскажите:

                        1. При SQL запросе, когда создаем абстрактные (не существующие) поле (столбцы) можно ли кроме присвоения им имен, также добавлять комментарии, на время просмотра SQL запроса?
                        Аналогично как это сделано например в PhpMyAdmin для обычных полей (столбцов)?

                        2. Какой оператор нужно использовать, чтобы использовать фильтр типа "содержит"?
                        Например выбрать все записи из table1, в которых поле log содержит текст "395948"

                        Пример значений поля log
                        {"items_data":[{"item_sid":"7069294","qty":1}],"contact_phone":"79777777777","contact_name":"u0421u043eu0431u0441u0442u0432u0435u043du043du0430u044f u0437u0430u044fu0432u043au0430","contact_email":"service@yandex.ru","jp_purchase_id":"395948"}

                        {"items_data":[{"item_sid":"2388062","qty":2}],"contact_phone":"79777777777","contact_name":"u0421u043eu0431u0441u0442u0432u0435u043du043du0430u044f u0437u0430u044fu0432u043au0430","contact_email":"service@yandex.ru","jp_purchase_id":"395948"}

                        Интересует как это указывать в запросе и в фильтре PhpMyAdmin.
                        user posted image
                        user posted image
                        Сообщение отредактировано: rownong@yandex.ru -
                          Цитата rownong@yandex.ru @
                          1. При SQL запросе, когда создаем абстрактные (не существующие) поле (столбцы) можно ли кроме присвоения им имен, также добавлять комментарии, на время просмотра SQL запроса?

                          Нет.

                          Цитата rownong@yandex.ru @
                          2. Какой оператор нужно использовать, чтобы использовать фильтр типа "содержит"?

                          Показанные примеры не относятся к типу "содержит". Это типичный случай "равно" (использован синтаксис MySQL):
                          ExpandedWrap disabled
                            WHERE log->>"$.jp_purchase_id" = '395948'
                            Цитата Akina @
                            Цитата rownong@yandex.ru @
                            1. При SQL запросе, когда создаем абстрактные (не существующие) поле (столбцы) можно ли кроме присвоения им имен, также добавлять комментарии, на время просмотра SQL запроса?

                            Нет.

                            Цитата rownong@yandex.ru @
                            2. Какой оператор нужно использовать, чтобы использовать фильтр типа "содержит"?

                            Показанные примеры не относятся к типу "содержит". Это типичный случай "равно" (использован синтаксис MySQL):
                            ExpandedWrap disabled
                              WHERE log->>"$.jp_purchase_id" = '395948'

                            Спасибо!
                              Подскажите, правильно понимаю, что результатом SQL запроса могут быть:
                              1. Реальная таблица из БД.
                              2. Абстрактная таблица (с несуществующими столбцами, но которые создаем в момент запроса)
                              3. Число (например результат расчетов). Т.е. просто одно число (без таблиц и столбцов), которое получаем в результате.
                              ??
                                Цитата rownong@yandex.ru @
                                Подскажите, правильно понимаю, что результатом SQL запроса могут быть:
                                1. Реальная таблица из БД.
                                2. Абстрактная таблица (с несуществующими столбцами, но которые создаем в момент запроса)
                                3. Число (например результат расчетов). Т.е. просто одно число (без таблиц и столбцов), которое получаем в результате.

                                Не совсем правильно. Результатом SQL запроса не может быть ни реальная таблица из БД, ни абстрактная таблица, и ни число. Ибо результатом SQL запроса может быть только сам результат SQL запроса :)

                                Другое дело, что может содержать этот результат. А он может содержать:

                                1. Значения всех или отдельных полей (столбцов) реальной таблицы или таблиц из БД
                                2. Значения полей (столбцов), получаемых в результате вычислений, обращений к VIEW или хранимым процедурам
                                3. Значения полей (столбцов), заданных константой

                                Последний вариант, скажем так, сильно менее распространён. Как правило используется в подзапросах. Ибо в финальном запросе указывать поле, содержащее константу, по факту - бессмысленно.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0454 ]   [ 15 queries used ]   [ Generated: 22.12.24, 06:01 GMT ]