Citação, que resume este artigo:
- SET é o padrão ANSI para atribuição de variáveis, SELECT não.
- SET só pode atribuir uma variável por vez, SELECT pode fazer várias atribuições de uma vez.
- Se atribuir a partir de uma consulta, SET só pode atribuir um valor escalar. Se a consulta retornar vários valores/linhas, SET gerará um erro. SELECT atribuirá um dos valores à variável e ocultará o fato de que vários valores foram retornados (então você provavelmente nunca saberia por que algo estava errado em outro lugar - divirta-se solucionando esse problema)
- Ao atribuir a partir de uma consulta, se não houver valor retornado, SET atribuirá NULL, onde SELECT não fará a atribuição (portanto, a variável não será alterada de seu valor anterior)
- No que diz respeito às diferenças de velocidade - não há diferenças diretas entre SET e SELECT. No entanto, a capacidade do SELECT de fazer várias atribuições de uma só vez oferece uma pequena vantagem de velocidade sobre o SET.