Buehrle (2-4) threw 116 pitches, striking out three and walking two.
"We faced good pitching. You don't have to be overpowering to dominate a game," said second baseman Orlando Hudson, who finished with one of the Padres' five hits. "He pitched a great game tonight."
For San Diego, left-hander Clayton Richard threw a solid outing, limiting the Marlins to a run through seven innings. But he ran into trouble in the eighth, and remains winless since his first outing of the season.
Richard (1-4) allowed three runs and nine hits in seven-plus innings. He struck out a season-high seven and walked one.
The Marlins scored two runs to snap a 1-1 tie in the eighth. After Richard issued a leadoff walk -- his only free pass of the game -- to Jose Reyes, Emilio Bonifacio beat Richard's throw to first on a bunt.
"It was a really good bunt," Richard said. "The frustrating thing was walking Reyes before. That's what I really had control over, making pitches there, and I didn't do it."
Dale Thayer replaced Richard, and the Padres were unable to turn a double play when Hanley Ramirez hit a grounder, as second baseman Orlando Hudson's throw pulled first baseman Yonder Alonso off the bag. Greg Dobbs' pinch-hit single gave the Marlins a 2-1 lead. Omar Infante's sacrifice fly made it 3-1.
"Broken bat, had a little English on it," Padres manager Bud Black said of Ramirez's grounder. "It pulled Yonder off the bag. Bang-bang play, Ramirez is getting down the line pretty well."
"Well pitched by Clayton. He probably deserved better," Black added. "Buehrle was outstanding.
"Our guys haven't seen a lot of him. There were only a few guys who had multiple at-bats against him. He's a good one."
It was Buehrle's first complete game since Oct. 2, 2010, against Cleveland and the 28th of his career.
"Every time I go out there I try to go deep in the game," Buehrle said. "Obviously, knowing the situation with guys getting worn out [Friday] and guys being shut down, it put more stress in going out there. But no matter what the situation is, even if the bullpen is fresh, I try to go deep into the game."
The Padres tied the game at 1 in the sixth. Jesus Guzman hit a one-out double and scored on Chase Headley's single.
The Marlins took a 1-0 lead in the fourth on Infante's RBI double that scored Austin Kearns, who singled and took second on a throw.
Miami scored one run in the first seven innings despite smacking eight hits, including four doubles. Padres outfielders helped preserve a scoreless game early. Left fielder Jesus Guzman threw out Ramirez at second base on his single in the first, and right fielder Chris Denorfia threw out Ramirez at third base on Kearns' single in the fourth.
"The defense kept us in it," Richard said. "I made some pitches that got hit hard and defensively, our outfielders did a tremendous job getting the ball in and made some huge plays, huge throws."
San Diego had opportunities to score in the fifth. With runners on first and third with one out, Jason Bartlett tried for a safety squeeze, but Buehrle fielded the ball and made a glove flip to catcher John Buck for the out at the plate. Richard grounded into a forceout to end the inning.
Bartlett's bunt was supposed to get the ball down the first-base line past the pitcher, Black said.
"We just didn't execute it well enough," Black said.
In his Major League debut, Padres reliever Miles Mikolas allowed a solo home run to the first batter he faced, Giancarlo Stanton, giving the Marlins a 4-1 lead in the ninth. Mikolas issued a walk before striking out two of the last three batters he faced.