Когда 15 июля 1015 г. умер великий князь Владимир Святославич, в Киеве утвердился его племянник Святополк. Новый князь начал планомерно уничтожать сыновей Владимира, которых рассматривал как потенциальных конкурентов в борьбе за власть. От рук убийц погибли ростовский князь Борис, Глеб Муромский и Святослав Древлянский. Но самым серьезным противником Святополка был Ярослав Новгородский. Ярослав был самым старшим из сыновей Владимира, поэтому не собирался уступать Киев двоюродному брату. При поддержке новгородцев князь набрал большое войско: «И собрал Ярослав тысячу варягов, а других воинов 40 000, и пошел на Святополка» (31, 157). Данные Новгородской летописи вызывают больше доверия: «И собра вои 4000: Варяг бяшеть тысяща, а новгородцов 3000; и поиде на нь» (26, 175). Об этом пишет и автор Рогожского летописца: «прииде Ярослав из Новагорода с 3000, а Варяг 1000, на Святополка» (66, 17). Узнав о масштабных приготовлениях новгородского князя, Святополк начал готовиться и собрал «бесчисленное количество воинов, русских и печенегов» (31, 157). Печенеги были той силой, что могла остановить скандинавских наемников Ярослава. Степняки были страшны не только молниеносными атаками, но и сильны в обороне, перед битвой печенеги окружали свой стан тяжелыми повозками, куда отступали при неблагоприятном ходе сражения. Даже панцирной коннице ромеев очень редко удавалось прорваться в эту импровизированную крепость на колесах.
В конце лета 1016 г. новгородские полки и варяжские дружины двинулись на юг. Святополк решил встретить противника на дальних подступах к столице и выступил навстречу Ярославу. Противники встретились у города-крепости Любеча. Рать Ярослава расположилась на правом берегу Днепра, воинство Святополка стояло на левобережье. Расположенный на высоких холмах, Любеч был хорошо укреплен, поэтому стал для киевского князя надежной базой. Однако Святополк очень неудачно расположил свои войска. Печенеги и киевляне разбили станы отдельно, но получилось так, что между ними оказались озера. В наши дни они называются Воскресенье и Берестово и находятся к северу от Любеча. Поэтому в случае вражеской атаки, степняки не могли прийти на помощь союзникам. Изначально на данный факт никто внимания не обратил, что имело роковые последствия для Святополка.
Битва у Любеча. Миниатюра из Радзивилловской летописи
Противники стояли друг напротив друга три месяца. Никто не хотел первым форсировать Днепр, слишком велики были ставки в противостоянии. Наступили холода, реки и озера стали покрываться льдом, начал замерзать и Днепр. Знаменитый воевода Волчий Хвост, некогда служивший Владимиру, а затем перешедший на сторону Святополка, решил спровоцировать новгородцев на битву. Старый воин разъезжал вдоль реки и выкрикивал оскорбления в адрес противника: «Чего пришли с хромцом этим, эй, вы, плотники? Вот поставим вас хоромы рубить нам!» (31, 157). Действительно, Ярослав был с детства хром, а новгородцы славились как искусные плотники. Слова воеводы вызвали именно ту реакцию, на которую Волчий Хвост рассчитывал. Разгневанные новгородцы пришли к своему князю и заявили: «Завтра мы переправимся к ним; если никто другой не пойдет с нами – сами ударим по ним» (31, 157–158). Ярослав оценил порыв, но решил проявить осторожность. В окружении Святополка у новгородского князя был верный человек, к нему и отправил Ярослав лазутчика выяснить обстановку во вражеском стане. Шпион встретился с приближенным киевского князя и передал слова Ярослава: «что ты тому велишь творити; меду мало варено, а дружины много». Ответ был такой: «да аще меду мало, а дружине много, да к вечеру дати» (26, 175). Ярославу предлагали атаковать вражеский лагерь этой же ночью. Получив такую важную информацию, новгородский князь позвал воевод и варяжских конунгов на военный совет. Было решено воспользоваться моментом, форсировать Днепр и напасть на лагерь Святополка.
Поздним вечером новгородцы и варяги сосредоточились на берегу Днепра. Чтобы в темноте отличить своих товарищей от вражеских воинов, новгородцы по приказу князя обмотали головы белыми платками. Новгородские полки и варяжские дружинники погрузились на ладьи и драккары, переправились через Днепр и беспрепятственно высадились на берег. Чтобы отрезать себе путь к отступлению, новгородцы оттолкнули от берега ладьи и насады. Киевляне не ожидали нападения. Разведка у Святополка работала плохо, киевский князь был уверен, что новгородцы в ближайшие дни не будут переправляться через Днепр. Святополк устроил пир для своей дружины, вражеская атака застала князя врасплох. Несмотря на это, киевляне бились отчаянно: «И бысть сеча зла, оже за рукы емлющеся сечаху и по удолием кровь течаше» (26, 175). Святополку удалось сплотить своих людей, однако в этот момент в бой вступили варяги: «и напали на него в открытый щит. Был тогда жесточайший бой, и много людей погибло, и после этого был прорван строй» (40, 109). Разбитые киевляне отступили на замерзшее озеро, хрупкий лед подломился, дружинники Святополка стали тонуть в полыньях. Положение могла спасти печенежская конница, однако между степняками и киевлянами находилось озеро: «и бысть сеча зла, и не бе лзе озером помогати печенегом» (60, 75). Разгром киевлян произошел раньше, чем степняки смогли принять участие в битве. Печенеги не рискнули вступать в сражение, быстро покинули поле боя и ушли в степь. Святополк потерпел сокрушительное поражение.
Как полководец Ярослав проявил себя с самой лучшей стороны. Новгородский князь проявил выдержку, дождался удобного момента, грамотно спланировал атаку и нанес неотразимый удар по врагу. Большую роль сыграла и хорошо организованная разведка. Святополк вел себя безответственно, поэтому исход противостояния был закономерным. По итогам битвы у Любеча Ярослав вступил в Киев, Святополк бежал в Польшу. Князь лишился поддержки на Руси, теперь все его надежды были на помощь польского короля Болеслава I.