Я всегда пробую разные упражнения по программированию, чтобы учиться и расти как разработчик. Одним из моих любимых учебных упражнений является перенос с одного диалекта SQL на другой, поскольку все они имеют свои индивидуальные особенности. Необходимость собиратьили зеркалировать несуществующую функциональность действительно бросает вызов моему мышлению, что позволяет мне расти и совершенствовать свои навыки запросов. В этом посте я делюсь воспроизведением тех же результатов запросов с использованием MySQL для запросов, о которых я впервые узнал/обнаружил, которые были покрыты с помощью Oracle SQL и конкретных функций реализации…

Самореклама:

Если вам нравится содержание, написанное здесь, во что бы то ни стало, поделитесь этим блогом и вашими любимыми сообщениями с другими, кому это может быть полезно или нравится. Поскольку кофе — мой любимый напиток, вы даже можете купить мне его, если хотите!

OpenLampTech – это информационный бюллетень для разработчиков PHP и MySQL. Подпишитесь сегодня на кураторский и оригинальный контент PHP/MySQL.

Кредит и источники

Я нашел большое вдохновение, обучение, понимание и идею для этого поста в блоге, основанного на этом видео на YouTube.

Образец данных

Окончательные результаты запроса, которые нам нужны, основаны на существующих данных в таблице «important_events», имеющей эти фиктивные данные:

SELECT * FROM important_events;

Обратите внимание, что есть 5 случайных дат из одного и того же месяца и года с названием события и комментарием к нему. Цель состоит в том, чтобы предоставить результаты для каждого дня всего месяца, включая те дни, которые не имеют строки в таблице «important_events».

Вы являетесь участником Медиум? Если да, получать уведомление по электронной почте каждый раз, когда я публикую сообщение в блоге, если вы предпочитаете платформу Medium. Не член? Не беспокойся! Воспользуйтесь моей ссылкой для регистрации (я получу комиссию без дополнительных затрат для вас) и присоединяйтесь. Мне очень нравится читать весь этот замечательный контент, и я знаю, что вам тоже понравится!!!

Окончательные результаты должны быть такими, как показано ниже:

Информация нужна

Информация, которая нам нужна для получения результатов запроса:

  • Первый день месяца на основе значения месяца в столбце «event_date».
  • Последний день месяца на основе значения месяца в столбце «event_date».
  • Общее количество дней в месяце основано на значении месяца в столбце «event_date».

При определении первого и последнего дня соответствующего месяца мы должны использовать минимальное и максимальное значения «event_date», хранящиеся в настоящее время в таблице «important_events». Мы можем легко получить эти значения, используя агрегатные функции MIN() и MAX(), нацеленные на столбец «event_date»:

Используя минимальное и максимальное значения даты, мы вычисляем первый и последний день месяца и общее количество дней в целевом месяце, используя определенные функции даты MySQL. Этот запрос может выглядеть как следующий пример:

В MySQL есть встроенная функция даты LAST_DAY(), которую мы используем для получения последнего дня месяца. Однако в MySQL нет функции даты FIRST_DAY() (на момент написания), поэтому нам нужно проделать небольшую дополнительную работу и вычислить ее самостоятельно, используя выражение:

Если вы хотите поддержать мой блог и контент, рассмотрите возможность внесения лишних изменений в мою Сосуд для советов. Большое спасибо!

Рекурсивное общее табличное выражение

В Oracle SQL есть предложение CONNECT BY, но на момент написания статьи в MySQL нет такого встроенного предложения, как в MySQL. Чтобы реплицировать эту функциональность, для целей этого конкретного запроса мы можем использовать рекурсивное общее табличное выражение (CTE).

Для простоты обработки я буду хранить количество дней в месяце в переменной сеанса, используя ключевое слово SET:

Затем я могу использовать переменную ‘@num_days’ в рекурсивном CTE, как показано ниже:

CTE ‘n_dte’ возвращает увеличивающийся набор INTEGER значений, равных общему количеству дней в целевом месяце (фактически 1 строка для каждого дня):

Теперь мы можем добавить каждое отдельное увеличивающееся значение INTEGER к 1-му дню значения даты месяца и вернуть календарный день для каждого дня месяца. Запрос для получения этой информации может выглядеть следующим образом:

OpenLampTech – это информационный бюллетень для разработчиков PHP и MySQL. Подпишитесь сегодня на кураторский и оригинальный контент PHP/MySQL.

Я ограничил выходные строки для лучшей читаемости, как показано на снимке экрана ниже:

Несколько общих табличных выражений

Мы можем иметь несколько CTE в одном и том же предложении WITH, разделяя их запятыми, поэтому я включу этот запрос как отдельный CTE в дополнение к уже установленному «n_dte»:

Вместе наши 2 CTE выглядят так:

LEFT JOIN — окончательный набор результатов

Теперь нам просто нужно LEFT JOIN CTE «all_mnth_days» в таблицу «important_events» в двух столбцах дат:

И у нас есть желаемые, окончательные результаты запроса:

Я не буду утверждать, что это лучший, или единственный, или самый эффективный способ решения этого конкретного запроса в MySQL. Только так я понял, как получить эти конкретные данные. Я хотел бы знать ваши мысли, предложения и отзывы. Если бы вы использовали другой подход или другую функциональность MySQL, пожалуйста, поделитесь в комментариях ниже, чтобы я и другие читатели могли изучить и расширить наши собственные отборы запросов.

Если у вас есть какие-либо вопросы или вы видите какие-либо ошибки в коде, сообщите мне об этом в комментариях. Конструктивные комментарии помогают мне предоставлять точные сообщения в блоге и очень ценятся. Спасибо за чтение!

Нравится то, что вы прочитали? Видите что-нибудь неправильное? Пожалуйста, прокомментируйте ниже и спасибо за чтение!

Призыв к действию!

Спасибо, что нашли время, чтобы прочитать этот пост. Я искренне надеюсь, что вы открыли для себя что-то интересное и поучительное. Пожалуйста, поделитесь своими выводами здесь с кем-то из ваших знакомых, кто также получит от этого такую ​​же пользу.

Посетите Страницу портфолио-проектов, чтобы увидеть сообщения в блоге/технические статьи, которые я написал для клиентов.

Мне очень нравится пить кофе. Помогите мне получить!!!

Чтобы получать уведомления по электронной почте (никогда не спамить) из этого блога (Проза цифровой совы) о последних сообщениях в блоге по мере их публикации, подпишитесь (по собственному желанию), нажав кнопку Нажмите, чтобы подписаться! на боковой панели. домашняя страница! (Не стесняйтесь в любое время просмотреть Страницу политики конфиденциальности Digital Owl’s Prose по любым вопросам, которые могут у вас возникнуть: обновления по электронной почте, подписка, отказ, контактные формы и т. д.)

Обязательно посетите страницу Лучшее из для коллекции моих лучших постов в блоге.

Джош Отвелл страстно желает учиться и расти как разработчик SQL и блоггер. Другие любимые занятия заставят его уткнуться носом в хорошую книгу, статью или командную строку Linux. Среди них он разделяет любовь к настольным ролевым играм, чтению фантастических романов и проведению времени с женой и двумя дочерьми.

Отказ от ответственности: примеры, представленные в этом посте, являются гипотетическими идеями о том, как достичь подобных результатов. Это не самое лучшее решение(я). Большинство, если не все, представленные примеры выполняются в среде рабочей станции для персональной разработки/обучения и не должны рассматриваться как качественные или готовые к использованию. Ваши конкретные цели и потребности могут отличаться. Используйте те методы, которые лучше всего подходят для ваших нужд и целей. Мнения мои собственные.

OpenLampTech – это информационный бюллетень для разработчиков PHP и MySQL. Подпишитесь сегодня на кураторский и оригинальный контент PHP/MySQL.

Чем я могу вам помочь?

  • Думаете завести блог? Я использую WordPress для своего блога. Давайте оба сэкономим на предложенных планах. 💸
  • Возьмите шаблон подписи электронной почты Gmail в формате HTML из моего магазина Etsy и сделайте свои электронные письма яркими и выделяющимися. ✉️
  • Нужен хостинг для вашего следующего веб-приложения или сайта WordPress? Я использую и очень рекомендую Hostinger. У них отличные цены и обслуживание.
  • Мне нравится читать Refind: Сущность Интернета, каждое утро в вашем почтовом ящике. Подпишитесь бесплатно. Помогите мне получить премиум-подписку, зарегистрировавшись самостоятельно по моей реферальной ссылке.
  • Получите бесплатный пакет мобильных обоев Creator.

Раскрытие информации. Некоторые ссылки на услуги и продукты в этом сообщении являются партнерскими ссылками. Без каких-либо дополнительных затрат для вас, если вы совершите покупку, нажав на один из них, я получу комиссию.

Первоначально опубликовано на https://joshuaotwell.com 19 января 2022 г.