What are the main differences between supervised, unsupervised, and semi-supervised learning, and where do they apply?

I know that supervised learning uses labeled data to train models, while unsupervised learning deals with unlabeled data to find patterns. But what exactly sets them apart in practice, and where does semi-supervised learning fit in? Can anyone provide real-world examples of problems where each type of learning is best suited? For example, I’ve seen supervised learning used in spam detection, but I’m curious about how unsupervised and semi-supervised approaches are applied.