The two-time Premier League champions are believed to have parted with £37m for the 20-year-old's signature, making him the most expensive player bought under Pep Guardiola's reign.
The German international had been linked with City for some time, while Bayern Munich were also thought to be interested in the attacker, who scored eight goals in 33 Bundesliga matches last season.
Sane also produced six assists for Schalke, and was involved in more goals than any other player under 21 in Germany's top flight in the 2015-16 campaign.
"I feel really good, I'm happy to be here and happy that it has all worked out," Sane told City's official website. "Now I can settle here in Manchester and play for City.
"One of the reasons I decided to join City was Pep Guardiola - he convinced me to come here and that I can continue to progress. I know I will learn a lot under him and now I can take the next step in my career.
"I followed Pep at Barcelona and at Bayern where he achieved a lot and worked really well with young players. I think he can make me a more complete player. I think I will need a bit of time to start with because it's another league and there's a different style of play but I think I can adapt very quickly."
Sane, who made his senior debut for Schalke in 2014, will wear the number 19 shirt at the Etihad Stadium.