Bayern 2-0 Lokomotiv Moskva
The holders had already secured first place in Group A and were made to work for their win by a disciplined Lokomotiv defence, but the half-time introduction of Serge Gnabry sparked Bayern into life. Niklas Süle headed the opener three minutes past the hour before Eric Maxim Choupo-Moting smashed in a clinching second ten minutes from time.
Key stat: The clean sheet was Bayern's first for ten games in all competitions.
Salzburg 0-2 Atlético de Madrid
Atlético booked their last-16 spot with a clinical display in Austria. Mergim Berisha hit the post early on but, for all their endeavour, Salzburg fell behind when Mario Hermoso guided in Yannick Carrasco's free-kick. Dominik Szoboszlai missed a big chance soon after half-time and Enoch Mwepu also struck the upright before Carrasco's late volley sealed Atlético's progress.
Key stat: Mario Hermoso scored his first goal for Atlético.
Real Madrid 2-0 Mönchengladbach
Karim Benzema rose to the occasion as Real Madrid leapt from third to top of Group B in their final game. The French striker headed in first-half crosses from Lucas Vázquez and Rodrygo to give Zinédine Zidane's men qualification, but the visitors progressed too thanks to the goalless draw in Milan.
Key stat: Madrid have qualified for the knockout stage in all 25 of their seasons in the UEFA Champions League.
Internazionale 0-0 Shakhtar Donetsk
Both sides failed to find the victory they required in a nervy encounter. The hosts went closest in the first half, Lautaro Martínez's close-range effort cannoning back off the crossbar. Anatolii Trubin pulled off a stunning one-handed stop to deny Romelu Lukaku as Shakhtar wrapped up third spot and ended Inter's European campaign.
Key stat: Inter failed to win a single home match for the first time in a UEFA Champions League group stage.
Manchester City 3-0 Marseille
City head into the knockout phase having picked up a club-best 16 points from the 18 on offer in Group C. Already assured of pole position, Josep Guardiola's team had little trouble seeing off fourth-placed Marseille. Ferran Torres' neat second-half finish set the ball rolling, with substitute Sergio Agüero and an Álvaro own goal providing late gloss.
Key stat: Torres has scored in four of his five UEFA Champions League appearances for City.
Olympiacos 0-2 Porto
An early penalty from Otávio put Porto on course for a comfortable win in Greece. The home side had chances to equalise, but the game was up when Luis Díaz teed up fellow substitute Matheus Uribe for a late second. Olympiacos, who finished with ten men after Rúben Semedo was sent off, came third and go into the UEFA Europa League despite five defeats in a row.
Key stat: Porto have kept five straight clean sheets in this UEFA Champions League campaign.
Ajax 0-1 Atalanta
Substitute Luis Muriel scored five minutes from time to rubber-stamp Atalanta's place in the last 16 at Ajax's expense. The visitors impressively nullified the threat of an Ajax team needing to win, though they were indebted to Pierluigi Gollini's save to deny Davy Klaassen. Ryan Gravenberch's 80th-minute red card dented Ajax hopes before Muriel ended them.
Key stat: Atalanta have won their last five UEFA Champions League away games, scoring 14 goals and keeping four clean sheets.
Midtjylland 1-1 Liverpool
Alexander Scholz's penalty earned fourth-placed Midtjylland their second UEFA Champions League point as they gave Group D winners Liverpool a scare with a spirited second-half comeback. Mohamed Salah slotted in Liverpool's fastest ever goal in the competition inside the opening minute before Fabinho cleared Sory Kaba's header off the line and Evander rattled the crossbar.
Key stat: The Reds named their youngest ever starting XI in the UEFA Champions League, averaging 24 years and 26 days.
Chelsea 1-1 Krasnodar
A much-changed Chelsea side was denied a win that would have given them a record UEFA Champions League points haul. Rémy Cabella fired the visitors ahead after being afforded time and space in the box, but the lead was short-lived as Kaio brought down Tammy Abraham in the penalty area and Jorginho scored from the spot.
Key stat: Chelsea drew against Russian opposition for the first time in their history (W6 L1 D1).
Rennes 1-3 Sevilla
Sevilla signed off with a flourish in Group E, Jules Koundé's sublime strike providing the opener for the side who had already secured second place. Youssef En-Nesyri's powerful header and excellent finish sealed victory before teenage substitute Georginio Rutter scored his first UEFA Champions League goal for Rennes, who finished fourth.
Key stat: Sevilla are unbeaten in their last six UEFA Champions League away games.
Zenit 1-2 Dortmund
The German club came from a goal down to secure first place in Group F despite trailing to Sardar Azmoun's tenth-minute opener. Łukasz Piszczek forced in the equaliser from a corner midway through the second half and, 12 minutes from time, former Zenit midfielder Axel Witsel fired in from the edge of the area to seal the points.
Key stat: Aged 16 years 18 days, Dortmund's Yousouffa Moukoko became the youngest player to appear in the UEFA Champions League.
Lazio 2-2 Club Brugge
Lazio clung on to earn the point they needed to progress. Joaquín Correa and Ruud Vormer exchanged early goals, but the hosts looked comfortable after Ciro Immobile scored from the spot and Eduard Sobol was sent off for Brugge. Hans Vanaken gave the visitors hope, though, and they were left despairing when Charles De Ketelaere struck the crossbar in added time.
Key stat: Lazio are in the knockout stage for the first time since 1999/2000.
Barcelona 0-3 Juventus
The Bianconeri won the group with a stunning victory at Camp Nou. Cristiano Ronaldo struck the first blow in his renewed rivalry with Lionel Messi by winning and converting an early penalty and Weston McKennie acrobatically volleyed in the second. Clément Lenglet’s handball enabled Ronaldo to clinch top spot with his second spot kick.
Key stat: Barcelona conceded twice in the opening 20 minutes of a UEFA Champions League home game for the first time ever.
Dynamo Kyiv 1-0 Ferencváros
Denys Popov headed in the only goal as the Ukrainian side secured third in Group G and a place in the UEFA Europa League. Centre-back Popov beat his marker to convert Carlos De Pena free-kick on the hour and deny visiting coach Serhiy Rebrov on his return to the club where he made his name as a player.
Key stat: Dynamo Kyiv have won their last three Matchday 6 fixtures in the UEFA Champions League.
Paris 5-1 İstanbul Başakşehir
Paris and Başakşehir played out the remaining 77 minutes of their game on Wednesday after play was suspended on Tuesday. A blistering Neymar hat-trick gave Paris a comprehensive victory to claim top spot in Group H. The Brazilian international completed his third UEFA Champions League treble either side of Kylian Mbappé's confident penalty. The visitors pulled one back via a deflected İrfan Can Kahveci strike, which went in off Mehmet Topal, before Mbappé rounded off the scoring after the hour.
Key stat: Neymar's hat-trick was his first at club level since bagging three against Crvena zvezda in October 2018.
Leipzig 3-2 Manchester United
Leipzig survived a late United fightback to reach the last 16. Angeliño fired in after just two minutes and Amadou Haidara soon converted Leipzig’s second as the hosts took charge. Despite United's second-half rally, Justin Kluivert’s cute finish made it 3-0. Bruno Fernandes’ late penalty and an Ibrahima Konaté own goal made for a nervy ending.
Key stat: Leipzig have won five and drawn one of their last six home UEFA Champions League matches.