袁绍已经吞并了公孙瓒,兼并了四州的地区,率领军队10多万人,将要进军攻打许都。曹操各将领认为不可抵抗。曹操说:“我了解袁绍的为人,志向大而才智小,表面严厉而内心怯懦,嫉妒刻薄而缺少威望,考虑周全而犹豫不决,谋士多却不为他所用,士兵虽多却指挥筹划不当,将领骄横而且政令不统一,土地虽然广阔,粮食虽然丰足,却正好是把这些作为我的奉献啊。”秋季8月,曹操向黎阳进军,派臧霸等进入青州攻破齐、北海、东安,留下于禁在黄河边驻守。9月,曹操回到许都,分出部分兵力把守官渡。冬季11月,张绣率领部队投降。12月,曹操在官渡驻军。
次年2月,袁绍派遣郭图、淳于琼、颜良在白马攻打东郡太守刘延,袁绍领兵到了黎阳,准备渡过黄河。夏季4月,曹操往北救援刘延,荀攸劝说曹操道:“如今我们兵力少不能抵挡,分散敌人的兵力才可以取胜。您到了延津,装作准备渡过黄河向他们的后方进军,袁绍必定往西迎战您,然后派轻装部队袭击白马,趁他们没有防备,就可以捉住颜良了。”曹操听从了荀攸的计策。袁绍听说曹军渡过黄河,立即分出兵力往西迎战曹军。曹操就率领军队急行,直奔白马,离白马尚有10多里,颜良大惊,前来迎战。曹操派张辽、关羽做先锋,先打败了敌人,斩了颜良,终于解除了白马之围,迁徙白马的百姓,循着黄河朝西走。袁绍在这时渡过黄河追击曹操的部队。追到延津的南面,曹操指挥军队在西面山坡下扎营,派人登上营垒望敌军,报告说:“大约有6000骑兵。”过了一会儿,又报告:“骑兵逐渐增多,步兵多得数不过来。”曹操说:“不用再报告了。”就下令让骑兵御下马鞍放开马匹。这时,白马驻军的辎重已经上路。各将领认为敌军的骑兵多,不如回去守卫军营。荀攸道:“这是用来引诱敌人上钩的,为什么要离开这儿呢?”袁绍的骑兵将领文丑和刘备带领大约6000骑兵先后来到。各将领又说:“可以上马了。”曹操说:“可以了。”于是大家都上马,当时骑兵不足600人,就挥军出击,大败敌军,斩了文丑。颜良、文丑都是袁绍的有名将领,两次交战,都被擒杀,袁绍的军队大为震动,曹操回军官渡。袁绍进军保卫阳武。关羽逃回刘备那儿。
8月,袁绍连接营垒逐渐向前推进,靠着沙丘驻扎,从东到西连绵数十里。曹操也分扎营垒跟敌方对抗,交战不利。当时曹操兵力不足1万人,伤员占十分二三。袁绍军队前进到官渡,堆土山挖地道。曹操也在营内堆土山挖地道,跟敌军对抗。袁绍军射箭入曹军营中,箭下如雨,走动的都要用盾牌遮挡,大家非常害怕。这时曹操粮食少,给荀彧写信,商议打算撤回许都。荀彧回信说:“袁绍全部人马聚集在官渡,准备跟您决一胜负。您以最弱小的兵力对抗最强大的敌军,如果不能制服他,必定被敌军所追逐,这是天下的重大转机啊。况且袁绍只是一个一般的豪雄罢了,能够聚集人才却不能使用人才。凭借您的神武英明并且加上以天子之命讨伐叛乱的正当名义,有什么事而不能做成功呢?”曹公听从了荀彧的意见。
袁绍数千辆运送谷物的车子到达,曹操采用荀攸的计策,派徐晃、史涣去截击,大败袁军,全部烧毁了袁绍的运粮车。曹操跟袁绍相持了几个月,虽然每次交战都斩杀敌将,但是兵少粮尽,士兵疲乏。曹操对运粮的人说道:“再过15天替你们打败袁绍,不再让你们劳苦了。”冬季10月,袁绍派车运粮,令淳于琼等5个人带领1万多士兵护送车队,露宿在袁绍军营北面40里的地方。袁绍的谋臣许攸贪婪无度,袁绍不能满足他,就前来投奔曹操,借机劝说曹操攻打淳于琼等人。曹操身边的人怀疑他。荀攸、贾诩劝说曹操采纳。曹操于是留下曹洪防守,自己带领5000步兵和骑兵乘夜前往,恰在天亮时到达。淳于琼等人望见曹操兵少,出去到营门外布阵。曹操急速攻击淳于琼,淳于琼退守营房,于是就攻打淳于琼的营房。袁绍派骑兵援救淳于琼。曹操身边的人有的说:“敌人的骑兵逐渐接近,请求分兵抵抗他们。”曹操发怒说:“敌人到背后才报告!”士兵都拼死作战,大败淳于琼等人,把他们全斩了。袁绍刚听到曹操攻打淳于琼时,对大儿子袁谭说道:“趁他攻打淳于琼等人,我去攻占他的军营,他就没有地方落脚了!”于是派张郃、高览攻打曹洪。张郃等人听到淳于琼败亡,就前来投降。袁绍军队大溃败,袁绍和袁谭扔下军队逃跑,渡过了黄河。曹军追赶上他们,全部缴获了他们的辎重、图表文书和珍宝,俘虏了他们的部众。曹操缴获袁绍的信件中,有许都和曹军中的人和袁绍来往信件,曹操把它们全部烧掉了。冀州各郡很多城邑都自动投降了。
6年夏季4月,曹操在黄河边检阅军队,攻击袁绍在仓亭的军队,把它打败。袁绍回来,又收拢被打散的士兵,平定了各反叛的郡县。9月,曹操回到许都。
袁绍自从军队被打败之后,发病吐血,在夏季五月死去。小儿子袁尚接替他的官职,袁谭自称车骑将军,驻扎在黎阳。秋季9月,曹操征讨他们,连续交战,袁谭、袁尚屡次战败退却,坚守黎阳。