Many rows can share a value: plenty of customers live in Chicago. SELECT DISTINCT returns each different row once:
SELECT DISTINCT city
FROM customers;
DISTINCT applies to the whole row, not just the first column. SELECT DISTINCT country, city returns each different pair, so London and Leeds both appear under UK.
NULL counts as one value here: if some customers have no loyalty tier, SELECT DISTINCT loyalty_tier returns one NULL row alongside the real tiers. Inside COUNT(DISTINCT ...), though, NULL is skipped, as in every aggregate.
COUNT(DISTINCT column) tells you how many different values there are. A query with GROUP BY city and no aggregate returns the same rows as SELECT DISTINCT city; use DISTINCT when you only want the list and GROUP BY when you also want a count or total per value.