八日清晨,李如松下令攻城,根据平壤的地形,李如松采取三面围攻,东面设伏的战术,分派蓟镇游击吴惟忠和辽东副总兵查大受率领步兵和骑兵攻打城北要塞牡丹峰,中军杨元、右军张世爵领兵攻打西边的七星门,左军李如柏、参将李芳春领兵攻击西面普通门;副总兵祖承训,游击骆尚志与朝鲜将领李镒、金应瑞率领军队一律乔装成朝鲜军队以麻痹日军,攻打城南的芦门,主帅李如松则在前线督阵。
战斗开始后,明军的大炮猛轰平壤城头,一时间杀声震天,在炮火的掩护下,各路明军架上攻城梯,争相攀登。日军则依托坚固高大的城池,在城墙上设立白旗作为联系,以弓箭、铁炮连续射击,顿时砲矢如雨,日军占据有利地势,从城楼上泼洒沸水,砸下巨石,拼死抵抗,杀伤明军甚多。小西行长领导的日本士兵都是经历过战国时代内战的洗礼磨练,其中不乏精兵悍将,战斗力自然不容小视,现在明军的攻势受挫,李如松终于按耐不住了,率领亲兵驰援城下,斩杀了数名后退的士兵后,稳住了阵势。紧接着,他严令军队禁止后撤,组织敢死队,用钩梯攀登,并且传令全军,凡率先登城者赏银50两。
正所谓重赏之下必有勇夫,受到激励的士兵士气大涨,无不以一当十,踊跃攀梯,向城楼扑去。游击骆尚志率领的浙江兵,原本就是戚家军,他们强行登上含毯门,拔掉日军旗帜,插上明军的大旗。
祖承训也从城南发起攻势,日军一向轻视缺乏战斗力的朝鲜军,所以对祖承训这支佯装成朝鲜人的部队未引起足够的重视,南城门防守空虚,祖承训运用这个弱点,在靠近城墙,接近敌军之时,立刻脱下朝军服饰,亮出明军铠甲。日本人大惊,急忙分兵据守,但祖承训已经占据主动,很快便拿下了南面的芦门,李如柏、李芳春杀入普通门,张世爵的部队则用大炮轰碎了城西的七星门,游击吴惟忠虽胸部中弹,但仍旧奋力呼喊,指挥督战,攻占了北部的牡丹峰,这样明军陆续攻破了日军的防线。
战斗进行到此时已经非常激烈了,明军伤亡不小,李如松的坐骑被炮火炸死后,立即换马再战;李如柏的头盔也被日军的铁炮击中,幸好只是伤及皮肉,并无大碍,骆尚志在登城时为巨石砸伤。杨元攻七星门时也被击伤,其部将丁景禄则阵亡。
明军杀入平壤城内,小西行长率残部退守到城内早已布置好的防御工事—土堡之内。李如松见此状况,就采用火攻,焚烧土堡,日军如同瓮中之鳖,被活活烧死的士兵不计其数。小西行长龟缩在城北土堡风月楼内,不敢出战,外面被明军重重包围。各处土堡内幸存的残余日军如同笼子里的困兽拼命挣扎,负隅顽抗。
经过一天的激战,小西行长久久不见援军,准备突围。这是一个名叫大石荒河助的勇士,脱下铠甲,只是穿着单衣攀上高楼,冒着生命危险,硬是在弓矢弹雨中勘察出了一条逃生的路。
七日晚,双方的战斗逐渐平息了下来,李如松为避免伤亡,令俘获的日军通译张大膳传信给小西行长,只要他迅速退出平壤城,明军将不予追击。小西行长看出自己败局已定,后无援军,便准备率领五千残兵连夜撤离平壤城。
实际上,李如松并不是真正要放走小西行长,而是使用了《孙子兵法》中的一个计策:围师必阙。怎么回事呢,如果四面合围,切断所有的退路,城内的敌人就可能孤注一掷,拼死抵抗,但如果留出一个缺口,等于给了敌军逃生的希望,敌人就很有可能失去斗志,从而有利于瓦解敌方的军心。正所谓上兵伐谋,李如松正是采用了这样一种心理战术,三面包围日军,唯独留出南面的大道,诱使日军突围。
入夜之后,求生心切的日军见眼前已无敌军阻拦,便从各大土堡内蜂拥而出,奔向城南。明军将领故意将人放出城外,小西行长率领5000残兵突围,非常顺利地渡过大同江,向龙山方向退却。而李如松早已命令李宁、祖承训、查大受和葛逢夏在沿途设下三千伏兵,静待其后。
惊魂未定的小西行长极其人马渡过江,刚刚上岸的时候,埋伏已久的明军突然杀出,打了个日军措手不及,被杀者360人。综合史料的记载,第二次平壤之战,小西行长所领的第一军团减员11300余名,仅剩6600人,损耗了三分之二的兵力,明军取得了歼灭日军一万多人的骄人战绩,阵亡796人,1492人受伤。
李如松也因为平壤一战,名声大噪。平壤大捷后,明军又乘胜攻下开城,收复黄海、平安、京畿、江源四道。孤悬在北部咸镜道的加藤清正见援军久久不至,闻悉开城失守,也迅速南撤,仓皇退守汉城。这样整个侵朝日军的防线开始向半岛南部收缩,李如松率领的明军兵锋则直逼王京汉城。然而后面在碧蹄馆的恶战却是李如松一生中最大的打击。