본래 고령가야국(古寧伽耶國)이었는데 신라가 이를 취하여 고동람군(古冬攬郡, 또는 古陵郡)을 설치하였다. 경덕왕 때 고령군(古寧郡)으로 고치면서 관산(冠山)ㆍ가선(嘉善)ㆍ호계(虎溪) 등을 임내(任內)로 하였다.
961년(광종 12) 함녕군(咸寧郡)으로 고쳤고, 현종 때 상주에 귀속시키고 함창으로 바꾸었으며, 명종 때에 감무를 설치하였고 1413년(태종 13)에 현감을 두었다. 1914년 행정구역개편 때 상주군에 병합되어 함창면이 되었다.
1980년 읍으로 승격되었고, 1995년에는 상주군과 상주시가 통합되어 새로운 상주시가 되었다. 함창의 옛 이름인 고동람은 대읍(大邑) 또는 장읍(長邑)의 뜻을 가지므로 부족국시대의 족장이 살았던 지역으로 추측된다. 이 지역은 소백산맥 남쪽사면의 낙동강상류를 차지하는 분지의 지형이었다.
조선시대에는 경상도 북부의 교통요지로 문경과 상주를 잇는 남북의 도로와 보은과 용궁(龍宮)을 잇는 동서의 도로가 발달하였고, 부근에 덕통역(德通驛)이 있었다. 남산(南山) 봉수는 남쪽의 소산(所山)과 북쪽의 선암산(禪巖山) 봉수를 이어주었다.