O seguinte comando SQL foi executado em uma típica ferramenta de acesso a banco de dados relacional Oracle. SELECT C.CDCLIENTE, C.NOME_CLIENTE, P.CDPEDIDO, P.VLPEDIDO, P.DT_EMISSAO FROM CLIENTE C, PEDIDO_VENDA P WHERE C.CDCLIENTE = 18; Qual será a resposta do SGBDR para a instrução executada acima?
Questão
O seguinte comando SQL foi executado em uma típica ferramenta de acesso a banco de dados relacional Oracle.
SELECT C.CDCLIENTE, C.NOME_CLIENTE, P.CDPEDIDO, P.VLPEDIDO, P.DT_EMISSAO FROM CLIENTE C, PEDIDO_VENDA P WHERE C.CDCLIENTE = 18;
Qual será a resposta do SGBDR para a instrução executada acima?
Alternativas
A) Irá fazer o produto cartesiano, ou seja, irá trazer os dados do cliente 18 e relacioná-lo com todos os pedidos existentes, porém, o cliente 18 irá somente trazer os dados de seus respectivos pedidos.
B) Irá fazer o produto cartesiano, ou seja, irá trazer todos os pedidos do cliente 18, bem como os pedidos de todos os outros clientes. Assim sendo, todos os clientes e todos os pedidos irão ser selecionados nessa consulta, independente da cláusula where.
C) Irá fazer o produto cartesiano, ou seja, irá trazer os dados do cliente 18 e relacioná-lo com todos os pedidos existentes, independente se o cliente já tenha feito o pedido ou não.
D) Irá fazer a junção normal (natural join), selecionado o cliente 18 e seus respectivos pedidos. Os pedidos de outros clientes não serão selecionados nessa consulta.
E) Irá exibir todos os clientes e seus respectivos pedidos para todos os clientes que tenham o código 18.
Explicação
Na consulta:
SELECT C.CDCLIENTE, C.NOME_CLIENTE, P.CDPEDIDO, P.VLPEDIDO, P.DT_EMISSAO
FROM CLIENTE C, PEDIDO_VENDA P
WHERE C.CDCLIENTE = 18;
-
A cláusula
FROM CLIENTE C, PEDIDO_VENDA P(com vírgula) representa um produto cartesiano entre as tabelas, isto é, combina cada linha deCLIENTEcom cada linha dePEDIDO_VENDA, a menos que exista uma condição de junção (join) restringindo essa combinação. -
A cláusula
WHERE C.CDCLIENTE = 18não relacionaCLIENTEcomPEDIDO_VENDA; ela apenas filtra a tabelaCLIENTEpara manter somente o(s) registro(s) do cliente de código 18. -
Como não existe condição do tipo
C.CDCLIENTE = P.CDCLIENTE(ou equivalente) noWHERE, o resultado final será:
- todas as linhas do cliente 18 (normalmente 1 linha) combinadas com todas as linhas de
PEDIDO_VENDA.
Ou seja, serão mostrados pedidos de todos os clientes, mas “anexados” ao cliente 18, independentemente de o pedido ser realmente dele.
Alternativa correta: (C).