Elle est originale te façon de faire des jointures externes.
Logiquement, on utilise plutôt :
select distinct left(nvl(user.nom, ' '), 1) as lettre, user.id, user_admin.id_user
from user right outer join user_admin on user.id = user_admin.id_user
PS: La syntaxe "à la SQL" je l'aime pas, du coup je l'utilise jamais. Donc pour la syntaxe du RIGHT OUTER JOIN, ainsi que l'ordre des tables, je n'en suis pas sûr. D'un point de vue conception, c'est pas contre à mon avis plus propre que ta requête
PS: Et prefixe tes champs par le nom de la table d'où il viennent ! Pour le "nom", je ne sais pas s'il vient de user ou de user_admin ! Si t'avais un "nom" dans les deux tables, MySQL ne saurait pas plus que moi lequel prendre. Il est IMPERATIF de préfixer tes champs. D'ailleurs, c'est peut-être parceque je suis un peu puriste, mais les SGBD devraient planter lamantablement sur un "select *", sur les champs pas préfixés, et surtout, sur les INSERT sans la liste des champs. Toutes ces syntaxes sont autant de sources de bugs débiles qui font perdre un temps monstre pour les localiser.