Youth career Born in Brisbane, Australia, Williams started playing football for amateur clubs Westside and Pine Hills, before moving to play youth football for
Mitchelton FC. He spent time training with Belgian club
Club Brugge, he moved abroad in May 2006 to play for Danish team Brøndby IF on a three-year contract.
Brøndby IF At Brøndby, Williams was included in the reserve team, and after 12 goals in five reserve team matches, On 11 November, Williams scored his first Superliga goal for the Brøndby first team in the home game against
Silkeborg IF. In the
Royal League game against Swedish side
Hammarby IF on 30 November, Williams added another two goals in Brøndby's win over the Swedes. Under new Brøndby manager
Tom Køhlert, Williams was promoted to the Brøndby
first team squad in December 2006, alongside
Marc Olsen. Williams played a total 19 games and scored one goal for Brøndby in the
2006–07 Superliga season. He prolonged his Brøndby contract in September 2008, extending it until the summer 2011. He injured his knee in a training mishap in September 2008, and when Williams returned to fitness after the turn of the year, newly appointed Brøndby trainer
Kent Nielsen left him out of the side. Williams' frustration at not playing led to him making a public outburst in June 2009, claiming he would leave the club in three weeks if they didn't play him. Brøndby responded by sending him out on trial to South African club
Bidvest Wits.
A-League North Queensland Fury He joined the
North Queensland Fury FC on a one-year loan deal for the 2009–10
A-League season and signed a permanent contract with the Fury in January 2010.
Sydney FC (loan) On 16 February 2011,
Sydney FC signed Williams on a short-term deal from the Fury for the
AFC Champions League 2011 campaign. He made a total of 4 appearances for the club, during the unsuccessful campaign, in which Sydney FC finished third in the group.
Melbourne City On 22 June 2011, he signed for
A-League club
Melbourne Heart (
Melbourne City FC) on a three-year deal. He signed a two-year contract extension with the Heart on 20 March 2014, tying him to the club until the end of the
2015–16 season. On Sunday 10 August 2014, Williams featured in the
2014 A-League All Stars Game, coming on as a 63rd-minute substitute for
Alessandro Del Piero in what was the latter's last game in Australia. Williams was released from the club in January 2016.
Haladás On 25 January 2016, Williams signed with Hungarian club Haladás in hopes of rejuvenating his hopes of playing for Australia. In June 2018, Williams left
Haladás.
A-League return Wellington Phoenix On 23 July 2018, it was announced that Williams had signed a one-year deal with
Wellington Phoenix to return to the A-league. On 10 June 2019 it was announced that Williams would be leaving the Wellington Phoenix.
Indian Super League ATK On 28 June 2019,
Indian Super League club
ATK signed him from
A-league club
Wellington Phoenix on a one-year contract. Williams scored his first goal for the club in their 5–0 routing of Hyderabad FC. He ended the season with 7 goals and 5 assists and the
Indian Super League title.
Mohun Bagan On 8 September 2020,
Mohun Bagan confirmed the signing of David Williams on a one-year contract. On 21 December 2020, he scored the first goal for the club in a 1-0 win over
Bengaluru FC.
Perth Glory Williams returned to Australia to sign with
A-League Men side
Perth Glory in August 2022. In November 2025, he officially announced his retirement from playing after suffering an ACL injury in December 2024. ==International career==