GO är som slutet på ett manus.
Du kan ha flera CREATE TABLE-satser, åtskilda av GO. Det är ett sätt att isolera en del av skriptet från en annan, men skicka in allt i ett block.
BEGIN och END är precis som { och } i C/++/#, Java, etc.
De band ett logiskt kodblock. Jag brukar använda BEGIN och END i början och slutet av en lagrad procedur, men det är inte strikt nödvändigt där. Där det ÄR nödvändigt är för loopar och IF-satser, etc, där du behöver mer än ett steg...
IF EXISTS (SELECT * FROM my_table WHERE id = @id)
BEGIN
INSERT INTO Log SELECT @id, 'deleted'
DELETE my_table WHERE id = @id
END