Usar palavras reservadas para nomear objetos não é uma boa ...
Usar palavras reservadas para nomear objetos não é uma boa ideia, mas no MS SQL Server é possível usar palavras reservadas em certos objetos, desde que, por ocasião da utilização esses objetos, seus nomes sejam de forma especial.
Observe os dois comandos SQL a seguir.
select "having" from teste
where between <> 'between';
select [having] from teste
where [between] <> 'between';
Sobre esses comandos, analise as afirmativas a seguir.
I. O resultado do primeiro comando é sempre vazio.
II. O primeiro comando causa um erro de compilação.
III. O resultado do segundo comando é sempre vazio.
IV. O segundo comando causa um erro de compilação.
Está correto o que se afirma em
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
A alternativa correta é a A - II, somente.
Para entender essa questão, é importante saber que o SQL Server permite a utilização de palavras reservadas como identificadores de objetos, tais como nomes de colunas ou tabelas. No entanto, para fazer isso sem causar confusão no interpretador do SQL, esses identificadores devem ser delimitados de uma maneira especial, utilizando colchetes [ ]
ou aspas duplas " "
.
Olhando para o primeiro comando apresentado na questão:
select "having" from teste
where between <> 'between';
Esse comando tenta selecionar uma coluna chamada having
da tabela teste
, e logo em seguida usa a palavra reservada between
de forma incorreta, causando um erro de compilação. A palavra reservada between
é usada em SQL para definir um intervalo em uma condição WHERE
, e a sua utilização nesse contexto não faz sentido, pois falta a especificação do intervalo e da coluna à qual o intervalo se aplica. Por isso, a afirmação II está correta.
Quanto ao segundo comando:
select [having] from teste
where [between] <> 'between';
Aqui, os identificadores estão corretamente delimitados por colchetes, o que permite que o comando seja interpretado sem erros pelo SQL Server. Portanto, o comando não causa erro de compilação, e o resultado do comando não é necessariamente vazio, pois dependerá dos dados presentes na tabela teste
. Isso torna as afirmações I, III e IV incorretas.
Portanto, a única afirmação correta é a II, indicando que somente o primeiro comando causaria um erro de compilação, fazendo da alternativa A a resposta correta.
Clique para visualizar este gabarito
Visualize o gabarito desta questão clicando no botão abaixo
Comentários
Veja os comentários dos nossos alunos
Ainda não tinha estudado sobre esse conceito. Segue o link da documentação oficial.
Fonte: https://docs.microsoft.com/pt-br/sql/relational-databases/databases/database-identifiers?view=sql-server-ver15
select "having" from teste where between <> 'between';
Esse between precisa estar entre "" ou []
select [having] from teste where [between] <> 'between';
Correto, o segundo 'between' é só uma string, não uma coluna
"Quando identificadores são usados nas instruções Transact-SQL , os identificadores que não estiverem de acordo com essas regras deverão ser delimitados por aspas duplas ou colchetes."
https://docs.microsoft.com/pt-br/sql/relational-databases/databases/database-identifiers?view=sql-server-ver15
O primeiro comando resultará em um erro de compilação, pois a palavra reservada "having" é usada como um identificador sem estar entre colchetes, e o operador "between" também é uma palavra reservada e não pode ser usado dessa maneira.
O segundo comando irá compilar sem erros, pois as palavras reservadas "having" e "between" são usadas como identificadores e estão entre colchetes. No entanto, a cláusula WHERE do comando está comparando a coluna "between" com a string "between", o que pode resultar em resultados diferentes dependendo dos dados na tabela.
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo