官渡之战
建安五年(200年),曹操亲率兵马东征刘备,把他打败,活捉了其部将夏侯博,和他的妻儿。刘备的大将关羽驻守下邳,曹操乘胜进攻,关羽也投了降。在曹操回师官渡时,袁绍进军保卫阳武县,关羽叛逃到了刘备那里。当时曹操和袁绍在官渡对峙,由于兵少屡战不胜。很多诸侯开始选边站,刘备和孙策都站在袁绍哪一边。所以,孙策在曹操与袁绍对峙时,便密谋袭击许都,结果还没有出兵,就被刺客杀死了。汝南郡降将刘辟发动叛乱,作为袁绍的内应,进攻许都。袁绍派刘备去援助刘辟,曹操令曹仁出击,打败了刘备,并攻克了刘辟的营寨。此时袁绍有几千辆运粮的军车正赶往官渡,曹操采用荀攸的计谋,派徐晃、史涣截击,大败袁绍军,全部粮车被烧毁。
曹操与袁绍在官渡已经相持了几个月,曹操已经到了缺粮的地步,士气低落。到了10月,袁绍再次派兵运粮,命淳于琼等五人带领一万多人护送,在袁绍大寨北面40里的乌巢宿营。袁绍的谋士许攸贪财,由于袁绍没能满足他的要求,就投奔了曹操,并劝说他派兵偷袭淳于琼等人。其实,这是一个机会,也是改变历史的时刻。当时曹操并不信任许攸,不过在荀攸和贾诩两个谋士的劝说下,曹操采纳了他们的建议。于是让曹洪留守大营,自己亲领5000人,攻打淳于琼。淳于琼固守营垒,曹操四面纵火,淳于琼只能出战。由于曹军殊死奋战,淳于琼战败被杀。袁绍见淳于琼被杀,决定让儿子袁谭偷袭曹操大本营。于是派张郃、高览偷袭曹洪的营地。戏剧性的一刻发生了,张郃等人听说淳于琼兵败,就投降了曹操。所以,袁绍一败涂地,自此无力与曹操对抗。
官渡之战
建安六年(201年)四月,曹操继续攻袁绍在仓亭的驻军,袁绍逃往冀州。当时汝南郡投降了刘备,曹操打败袁绍后,南征收拾刘备,刘备不敌逃走,归附了刘表。次年,五月袁绍得病吐血而亡。他的小儿子袁尚接替了他的职位,袁谭因此不满,自封为车骑将军,驻守黎阳。建安八年(203年)三月,曹操攻打黎阳城外城,袁氏兄弟出战,曹军奋勇冲击,袁谭、袁尚连夜逃走。四月,曹操进军邺城,次月回到许都。袁谭和袁尚两兄弟,为争夺冀州而自相残杀,袁谭被袁尚打败后向曹操求救。曹操在谋士荀攸劝说下,发兵援救,并让儿子曹整娶袁谭的女儿为妻,二者联姻以防止袁谭异心。曹军大兵压境,袁尚撤走了平原的围兵,回到邺城。次年,袁尚再次攻打袁谭。曹操发兵援救,并水淹邺城,袁军死伤大半。袁尚撤兵救援邺城,结果被曹操军打败,袁尚知道打不过,派人向曹操投降,没有被采纳。袁尚连夜逃跑,到了中山国,邺城很快平定。
孙刘联合
曹操在包围邺城的时候,袁谭背叛了曹操并攻占了甘陵县、安平国、勃海国、河间国等地。袁谭打了胜仗,并进攻袁尚所在的中山国,袁尚逃往固安县,他的部队被袁谭吞并。曹操写信给袁谭,谴责他违背和约,并与他断绝儿女婚姻关系,让她的女儿回娘家去,然后进军讨伐。袁谭很害怕,从平原县撤退,跑到南皮县。12月,曹操进入平原县,收回被袁谭攻占的郡县。建安十年(205年)正月,曹操军对袁谭发起进攻,打败了袁军,把袁谭斩首,并杀死了他的妻子儿女,平定了冀州。由于袁尚逃亡了乌桓,曹操决定北征乌桓,并很快平定了哪里。袁尚又投奔辽东太守公孙康,公孙康害怕曹操来攻,于是杀了袁尚、袁熙、速仆丸等人,并将首级献给了曹操。
建安十三年(208年),朝廷废除了三公,设置丞相、御史大夫。曹操被任命为丞相,七月并征讨刘表。八月刘表病逝,他的儿子刘琮接替其职位,并驻守襄阳,刘备驻守樊城。曹操率兵抵达新野,刘琮投降,刘备逃往夏口。曹操再兵进江陵讨伐刘备,刘备无力抵抗便联合孙权抵御曹操,两军在赤壁相遇。根据《三国志》的记载: