Subquerys

Subquerys nada mais é que uma query aninhada dentro de outra query. Podemos aninhar quantas querys queremos, e elas podem estar presentes no SELECT, FROM, WHERE, HAVING. Apenas na cláusula FROM é que podemos aninhar “apenas” 255 querys, em outros locais a quantidade é ilimitada.

As sub querys podem ser relacionadas nas seguintes categorias:

Escalar – Nada mais é uma query que retorna apenas uma linha e uma coluna, representando um valor unitário.

Linha Única – Retorna apenas uma linha

Múltiplas Linhas – Retorna mais de uma linha.

Múltiplas Colunas – Retorna mais de uma coluna para comparação.

Correlacionada – Em que a sbuquery depende da query pai. Ela não funciona sozinha, diferentemente das categorias anteriores mencionadas. Em subquery que não são correlacionadas elas são sempre executadas primeiro doo que a query pai, mas isso não é verdade na query relacionada, elas sempre tem que ser executadas juntas. Talvez ela seja a mais difícil de se entender, mas darei exemplos mais pra frente.

Mas vale lembrar também que uma subquery pode se encaixar em mais de uma categoria ao mesmo tempo. Uma query correlacionada também pode ser escalar por exemplo. Antes de avançarmos com mais informações de subquerys, vamos ver exemplos bem simples que demostram o uso na prática.

Na query acima retornamos o nome completo dos funcionários que trabalham no departamento de IT. Este é um excelente exemplo de uma query escalar, onde termos apenas um valor como retorno da subquery, mas temos que ter cuidado pois a coluna department_name não é unique e isso pode gerar erros, já que na query pai esperamos apenas um valor ao usarmos o operador “=”. Poderíamos ter conseguido o mesmo resultado utilizando um JOIN, que ficaria assim:

SELECT first_name, last_name
FROM employees
JOIN departments USING (employee_id)
WHERE department_name = 'IT';

Em alguns casos a performance do Oracle será melhor em casos que utilizamos subquerys ao invés de JOINs, além de que, quando fazemos muito JOINs em uma mesma query fica difícil de entender e manter. Já conseguimos então visualizar que o que antes seria preciso duas querys, com apenas uma agora, com subquerys, é possível obter o mesmo resultado. Vejam um exemplo no caso de retornar todos os funcionários em que possuam uma comissão maior que a média. Sem subquery seria necessário talvez em uma query saber qual seria o valor média de comissão e utilizar esse valor em uma segunda query. Mas, veja como fica com o uso de subquery.

Bem mais prático e elegante não é mesmo? Podemos usar a subquery para resolver problemas de diversas maneiras. No caso acima utilizamos para comparar valores. Podemos utilizar também para fazer uma transformação estrela. Não sabe o que é? Então veja a imagem abaixo.

Percebam na imagem acima que encontramos o nome do departamento que fica na cidade de “Seattle” e que o sobrenome do seu gerente é “King”, mas que o nosso código ficou bem bagunçado e difícil de entender e manter. Agora vejamos como fica a mesma query com subquery com transformação estrela.

Transformação Estrela

Transformação Estrela

Vimos que fica até mesmo melhor de ler e entender o que essa query faz, além de ter um ganho de performance em relação a query anterior e também de se modificar conforme desejado. Uma outra forma de utilizamos subquerys é por criarmos uma view dinâmica, em que nada mais é que substituir uma tabela na cláusula FROM por uma subquery. Veja um exemplo.

View Dinâmica

View Dinâmica

Conseguimos através dessa consultar contar quantos funcionários existem em cada cidade. Isso foi feito utilizando uma subquery na cláusula FROM. Percebemos então que as aplicações são muitas e elas realmente são. Podendo até mesmo utilizar como elemento na nossa lista de seleção.

Subquery no Select List

Subquery no Select List

Vejam que ambas as subquerys presentes no nosso SELECT são escalares, caso não seja será lançado um erro na execução. Uma técnica para termos certeza que a nossa query seja escalar é usarmos uma função de agregação, neste exemplo foi utilizado a função MAX e AVG. Existem ainda algumas outras maneiras de utilizar subquerys sem ser no SELECT. Um exemplo disso é utilizar para popular a tabela no momento da sua criação com dados já existente no banco. Além de popular uma tabela já existe, atualizar ou excluir, vejam exemplos abaixo de como ficaria essas querys:

UPDATE employees
SET salary = (SELECT AVG(salary) FROM employees);

DELETE FROM employees
WHERE salary > (SELECT avg(salary) FROM employees);

INSERT INTO job_history
SELECT employee_id, sysdate-30, sysdate, (select max(job_id) from jobs)
FROM employees
WHERE department_id IS NULL;

Uma ressalva aqui para se utilizar no INSERT. A maneira correta é como esta descrita acima, caso você utilize em VALUES irá ocorrer um erro.

Até agora vimos alguns exemplos de subquerys escalares, de linha única e de múltiplas linhas. Faltam ainda ver as de múltipla coluna e correlacionada. Vejamos um exemplo de cada.

Múltiplas Colunas

Múltiplas Colunas

Nossa subquery na imagem acima retornou duas colunas que foram comparadas pelo operador IN nas duas colunas da cláusula WHERE, então não somos obrigados a comparar apenas uma coluna e nem retornar apenas uma também ao mesmo tempo. Vamos agora para o nosso último exemplo, subquery correlacionada.

Correlacionada

Correlacionada

Essa query retorna alguns dados dos funcionários que tem uma comissão maior que a média do seu departamento. Vejam algo bem particular nessa subquery. A query interna que serve para comparar com o valor da comissão do funcionário faz referencia a tabela da query pai. Ou seja, essa query depende da query pai e não pode ser executada antes e nem sozinha. E a cada linha que a query pai pesquisa na tabela a subquery é executada novamente. Podemos perceber que então esse tipo de subquery tem uma performance pior do que as outras. Então a regra é sempre evitarmos esse tipo de subquery, mas infelizmente algumas coisas só são possíveis com ela.

Bem, depois desse longo post terminamos aqui, mas ainda não finalizamos esse assunto. Veremos mais no próximo post.

Anúncios

Formado em Ciências da Computação pela UFPB com experiência em Servidores Windows Server e Linux e banco de dados Oracle desde 2008 juntamente com os seus serviços. Desenvolvimento de Sistemas em Java SE com banco de dados Oracle e MySQL. Certificado Oracle Certified SQL Expert, mantendo o blog https://oraclepress.wordpress.com/ reconhecido pela OTN, articulista na OTN, portal http://www.profissionaloracle.com.br/gpo e na revista SQL Magazine.

Marcado com: ,
Publicado em Sem categoria

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Esse Blog é reconhecido pela
Certificações
Sou articulista
Sou articulista

Clique para seguir este blog e receber notificações via email de novos posts.

Tércio Costa

Tércio Costa

Formado em Ciências da Computação pela UFPB com experiência em Servidores Windows Server e Linux e banco de dados Oracle desde 2008 juntamente com os seus serviços. Desenvolvimento de Sistemas em Java SE com banco de dados Oracle e MySQL. Certificado Oracle Certified SQL Expert, mantendo o blog https://oraclepress.wordpress.com/ reconhecido pela OTN, articulista na OTN, portal http://www.profissionaloracle.com.br/gpo e na revista SQL Magazine.

Links Pessoais

Serviços verificados

Visualizar Perfil Completo →

Total de Visualizações da Página
  • 55,932 Visualizações
%d blogueiros gostam disto: