O delimitador padrão do MySQL é
;
que é usado para uma instrução na linha de comando, algo como select * from users ;
Quando você escreve um gatilho ou procedimento armazenado para executar todo o código, o mysql precisa entender que é um bloco de código/consulta.
Se nenhum delimitador for fornecido, quando o mysql encontrar qualquer
;
dentro do procedimento de armazenamento ou gatilho, ele pensará que é uma instrução e tentará executá-lo. Portanto, precisamos fornecer um delimitador para o procedimento de armazenamento ou gatilho e fazer o mysql entender que qualquer coisa dentro desse delimitador é um conjunto completo de código. Então no seu exemplo
SELECT * FROM products;
ele fará parte da instrução completa quando houver um delimitador diferente de
;
é fornecido no início.