由於漢中是益州北方的一個郡,接近長安三輔地區,而且易守難攻,因此劉備在214年平定益州後,於217年向北攻佔漢中,戰事維持兩年。最終,劉備領有漢中,控制中國西南地區,同年秋進位為漢中王,正式建立基業,不久後創立蜀漢。
建安二十年(215年),曹操進攻佔據漢中的張魯,不久張魯遂投降。劉備知道消息後,立即和正爭奪荊州的孫權議和,回到蜀中。曹操謀士司馬懿、劉曄認為現在可乘勢進攻蜀地,但曹操卻一反常態說道:「人不能不知足,既然已得到隴地,還想虎視蜀地呀!(人苦無足,既得隴,復望蜀邪!)」遂留夏侯淵督張郃、徐晃等守漢中;以丞相長史杜襲為駙馬都尉,留督漢中事。雖然後來曹軍有數次攻蜀,但劉備已有防範。
建安二十二年(217年),法正游說劉備,分析出曹操所以留夏侯淵守備,必是有內亂;夏侯淵、張郃非一國之帥,用大軍必可攻克漢中;說出三個得到漢中的益處:上,可以討伐國賊,尊崇漢室;中,可以虎視雍、涼二州,開拓國境;下,可以固守要害,是持久的計謀。劉備贊同,開始漢中之戰。
劉備率法正、黃忠、魏延、趙雲、高翔、劉封等,先用黃權之計攻破巴東郡的朴胡及巴西郡的杜濩,進攻漢中的陽平關;另派張飛、馬超、吳蘭、雷銅、任夔等攻武都郡,屯於下辨,氐人雷定等七部萬多部落響應;而曹軍便以夏侯淵守陽平關,張郃守廣石、徐晃負責馬鳴閣至陽平一帶,主力抵擋劉備軍,曹洪與曹真則率軍防衛張飛軍。
建安二十三年(218年),張飛與馬超改屯於固山,聲言要斷曹軍後路,曹洪此時想攻擊下辨的吳蘭,但眾人都因張飛軍的揚言舉動有所遲疑,惟獨曹休認為敵人如要斷軍後路,應該伏兵以行;現在他們如此揚言,不如趁他們未合兵,儘早攻擊敵人。曹洪認同,進擊吳蘭軍,斬殺雷銅、任夔等人,吳蘭逃至氐族,被當地人強端所殺。至三月,張飛與馬超軍撤走。
同時,劉備與夏侯淵等對峙。七月,劉備派陳式等攻擊馬鳴閣,被徐晃大破,士兵中有部份甚至在逃亡時掉進山谷中。劉備率精兵十部又不能攻克屯兵廣石的張郃,急送書信到成都要求增派援兵。諸葛亮接受楊洪「若無漢中,則無蜀矣」的意見,於是立即發兵援救。劉軍與曹軍繼續對峙。
由於形勢緊張,曹操便在同年九月到長安坐鎮,不過由於內部問題,所以沒有立即揮軍抗敵。另一方面,夏侯淵與劉備已經相峙一年,劉備為突破局面,在建安二十四年(219年)正月,劉備由陽平南渡沔水,沿著山前進,在定軍山依山勢立營。夏侯淵與張郃率兵來爭奪此營,在走馬谷設營。黃權進謀給劉備,於夜中,劉軍火燒曹軍鹿角。夏侯淵派張郃守護東圍,而自己則率軍守護南圍。劉備軍向張郃那面進攻,張郃不利,夏侯淵便將兵分半幫助張郃。此時,法正說:「可擊矣。(可以攻擊了)」劉備便派黃忠乘著高勢、擂鼓吶喊進攻,大破曹軍並擊斃夏侯淵及趙顒。張郃惟有率兵至漢水北下營。
當時曹軍失去元帥,軍中紛亂。杜襲與郭淮收合散兵,推舉張郃為統帥。張郃接受,指揮軍隊安定陣營,並授各將領節度,軍心才安定。明日,劉備想渡漢水進攻,各將領認為寡不敵眾,想依河建陣禦敵。郭淮卻認為這只是向敵人示弱,不足以挫敗敵人;建議在遠離漢水的地方設陣,引他們渡河,當過了一半時才作攻擊。張郃認為可行,設陣後,劉備疑惑,不敢渡河,曹軍於是退回陽平繼續堅守。而曹操得知夏侯淵陣亡的消息,便命曹真立即增援陽平。曹真到達後,指揮徐晃軍反擊劉備派出的高翔軍,獲得勝利,暫時穩定了戰場形勢。
三月,曹操親自率軍由長安出兵斜谷,到達漢中。但劉備卻不擔心,認為:「曹公雖來,無能為也,我必有漢川矣。(曹公(曹操)雖然到來,但也無能為力了,我必定可以擁有漢川了。)」便聚集群眾,守備險地,不和曹軍交戰。
後曹操在北山下運糧,黃忠出兵奪取,但過期不還。趙雲便率數十騎出營尋找,正好遇上曹操大軍,被圍,趙雲突圍衝陣,一面戰鬥、一面退卻。曹兵再次集合,追到趙雲軍營下,趙雲入營後便大開門,偃旗息鼓。曹軍怕有伏兵便退卻,忽然趙雲軍雷鼓震天,用勁弩從後射殺曹兵。曹兵慌張害怕,自相踐踏,墮進漢水而死的人甚多。
曹操與劉備相守數月,曹軍死傷甚多,曹操欲撤退。至五月,曹操終於退兵回長安,劉備佔領漢中。
劉備成功佔領漢中後,於六月劉備派孟達由秭歸攻房陵,殺死太守蒯祺。後再命劉封由漢中順沔水而下,率孟達軍攻打上庸,太守申耽投降,為益州作了更完滿的防備。而劉備亦在同年七月進位為漢中王,與魏王曹操抗衡。
曹操方面,因怕撤軍以後,劉備乘機攻打武都,於是命雍州刺史張既到武都領五萬多氐人遷徙到扶風郡和天水郡一帶。
攻取漢中是劉備生涯成就的最高峰,不僅僅因為漢中是極重要的戰略要地,也因為以軍事力量從正面擊敗曹操讓劉備的聲威如日中天,重振漢室似乎指日可待。