Я всегда пробую разные упражнения по программированию, чтобы учиться и расти как разработчик. Одним из моих любимых учебных упражнений является перенос с одного диалекта 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 г.