subconsultas: independentes e correlatas

15/04/2014

mais uma vez com uma pergunta, acredito que não é tão simples.
qual a finalidade da subconsulta? li algo sobre o mesmo e a resposta foi meio vago. e para que serve as subconsultas independentes e correlatas?(na pratica).

Mariana Carvalho

Respostas

15/04/2014

Alex Lekao

Oi Mariana,

Eu uso bastante sub consultas, nao sei bem a respeito das empressoes de independentes e correlatas, mas vamos la. rsrsr

Por exemplo, no cadastro de clientes vc nao tem a data da ultima compra do seu cliente, vc pode obter esse dado a partir de uma subconsulta na tabela de vendas.

Com relacao a independencia ou correlatividade, honestamente eu nunca pensei a respeito e nem estudei desta forma.

Acredito que possa ser o seguinte.

No seu select principal, para apresentar um valor meramente informativo que nao tenha relacao nenhuma com esse select principal vc monta um outro select apenas para informar isso.

e em outro campo por exemplo vc no seu select relaciona campos desta tabela que esta na subconsulta com algum campo da tabela da consulta principal.

neste ultima citacao o exemplo que citei acima o subselect seria o correlato.

Espero que tenha ajudado.

Abraco.

Alex - Lekao
Responder Citar

15/04/2014

Mariana Carvalho

vamos por partes, rsrsrs
eu tenho uma consulta que pega uns 3 campos de uma tabela, então eu crio uma subconsulta bem mais especifica, ex: quero pegar o ultimo ou penultimo campo. mas em nivel de banco de dados, é importante, ou isso é mais utilizado em aplicações?
Responder Citar

16/04/2014

Fabiano Carvalho

Eu considero subconsulta uma forma "errada" de se trabalhar, principalmente com a possibilidade de valores null, o mais correto é utilizar
JOINS(Left,inner,right,cross).
Mas a questão da subconsulta é filtar o resultado, exemplo quero apenas os resultado de uma tabela que tenha em uma tabela.

Select * from tabela1
where id in(select id from tabela2)


Ou que não tenha com a data igual.

Select * from tabela1 as fora
where id not in(select id from tabela2 as dentro
where fora.data <> dentro.data
)


Verifique sobre os operadores some, any e all, eles são utilizados para subconsultas.

E assim vai..
Assunto complexo.
Responder Citar

16/04/2014

Alex Lekao

Oi Mariana,

Eh quase isso. rsrsr

Com relacao a Aplicacao, ela possivelmente(falo como quem nao desenvolve) fara uso do resultado obtivo a partir do script que vc montou no banco.

Um exemplo pratico que eu faco uso aqui.

no meu script eu agrupo todas as vendas por clientes, e faco referencia de representatividade por cliente.

Para que se tenha um parametro para essa respresentatividade eu preciso saber, e informar, quanto a empresa vendeu no seu total, com isso o meu script vai apresentar os valores dos clientes e em uma subconsulta, sem importar o cliente, no caso ela ficaria independente, onde eu somo todas as vendas da empresa, e para colocar a representacao do cliente, eu monto uma outra subconsulta so que lincando os codigos de clientes desta subconsulta a consulta principal, assim eu tenho uma subselect independente, e uma subselect correlata.

lembrando que eu imagino que os termos usados como independente e correlato seja desta forma, porque eu nao tenho habito nem estudei a respeito destes termos, entao estou supondo que essa situacao que informei seja isso que vc questionou.

nao sei se ajudei ou compliquei ainda mais. rsrsrs
Responder Citar

16/04/2014

Mariana Carvalho

Fabiano, a subconsulta, no seu exemplo é: um select dentro de outro select não é? mais uma perguntinha, por que você considera errada? me desculpe a pergunta, é pq vi isso no livro, e pra mim ficou estranho a forma que escreveu. por favor, não interprete mal a minha pergunta.


Select * from tabela1 as fora
where id not in(select id from tabela2 as dentro
where fora.data <> dentro.data
)

Responder Citar

16/04/2014

Mariana Carvalho

Alex, vc escreve demais, kkkkk, brincadeira, vc pode mostrar um codigo que exemplifique?
Responder Citar

16/04/2014

Fabiano Carvalho

Fabiano, a subconsulta, no seu exemplo é: um select dentro de outro select não é? mais uma perguntinha, por que você considera errada? me desculpe a pergunta, é pq vi isso no livro, e pra mim ficou estranho a forma que escreveu. por favor, não interprete mal a minha pergunta.

Select * from tabela1 as fora
where id not in(select id from tabela2 as dentro
where fora.data <> dentro.data
)



Porque quando se tem valores nullos é desconsiderado, e pode ter problemas de inconsistencia
Responder Citar

16/04/2014

Alex Lekao

kkkkk... sem problemas... eu tbm acho que escrevo demais as vezes. rsrsr

Entao seguindo o exemplo que tenho mencionado.

SELECT
  CLIENTE.CODIGO,
   CLIENTE.NOME,
   (SELECT
       SUM(VENDAS.TOTAL)
    FROM VENDAS) AS [TOTAL GERAL],
   (SELECT
       SUM(VENDAS.TOTAL)
    FROM VENDAS
    WHERE VENDAS.CODCLI = CLIENTE.CODIGO) AS [TOTAL CLIENTE]
FROM CLIENTE


Esse exemplo de codigo de estoque usando esta meio grosseiro e pode haver erro de estrutura sintaxe, etc, eh ficticio nao pequei nada meu que ja faca uso para exemplificar.

Voce tem o select principal(pelo menos eu trato assim... nao sei se esta errado ou nao.... rsrsrsr) e nas selecoes eu monto um outro select(subselect... tbm chamo assim... acredito que esteja certo... rsrsr), no caso da coluna que nomeei como total geral eu estou somando todas as vendas, tendo assim o valor total vendido pela empresa, no segundo subselect eu estou fazendo referencia do codigo de clientes constante na tabela vendas com o codigo de clientes da tabela clientes do select principal.

Nas minhas utilizacoes aqui, eh bem normal eu fazer uso deste recurso, porque sempre acontece de vc precisar de um dado que vc nao tem e com isso vc tem a necessidade de monta-lo de alguma forma e algumas delas eh buscar em outra tabela e relacionar com a tabela principal.

o meu exemplo pode nao ser o ideal, porque daria para usar juncao e tal, mas como o intuito era exemplificar os casos de selects, montei desta forma.

Espero ter ficado melhor agora. rsrsr

Pensei em tentar escrever menos... mas nao consegui. kkkk

Abraco.

Alex - Lekao

Alex, vc escreve demais, kkkkk, brincadeira, vc pode mostrar um codigo que exemplifique?
Responder Citar

16/04/2014

Mariana Carvalho

Fabiano, obrigada, entendi perfeitamente, deve-se utilizar somente em tabelas que não tenham valores nulos.

Alex, entendi a ideia do codigo, e o que vc explicou.

vejo a subconsulta da seguinte maneira, me corrijam caso tenha escrito alguma coisa sem sentido, a subconsulta pode ser substituida por um select bem construido. vi nesse topico, pros e contras e tambem enxerguei como um trabalho a mais.
Responder Citar

16/04/2014

Roniere Almeida

perguntinha manjada, essas subconsultas, em outros SGBDs, são melhores?
Responder Citar

16/04/2014

Jefferson Santos

Fabiano, obrigada, entendi perfeitamente, deve-se utilizar somente em tabelas que não tenham valores nulos. Alex, entendi a ideia do codigo, e o que vc explicou. vejo a subconsulta da seguinte maneira, me corrijam caso tenha escrito alguma coisa sem sentido, a subconsulta pode ser substituida por um select bem construido. vi nesse topico, pros e contras e tambem enxerguei como um trabalho a mais.


Ao meu ver, não existindo o certo e o errado, e sim o coerente! veja. sendo simples voce pode fazer de qualquer uma das formas, levando em consideração que seu sistema SEMPRE manipulara a mesma quantidade de registros, isso devido a grande performance das máquinas e dos bancos de dados,

Utilizando a segunda opção com INNER JOIN, inicialmente pode ser mais custoso, pois o banco fará mais operações internas ( como Join e Group By ) já na SubQuery o banco fará 2 Selects. como disse embora mais custoso, quando for estiver manipulando uma grande quantidade de registros ficará evidente que utiliza-se de uma SubQuery não é a melhor opção.
Responder Citar

16/04/2014

Alex Lekao

Eu particularmente sempre utilizo as juncoes, mas infelizmente tem resultados que so optenho com as subselects, com isso acaba sendo necessario.

Com relacao ao custo, eh interessante se aprofuncao com o plano de manutencao que ajuda muito nesses casos e ja indica alguns indices que podem ser criados para melhorar a performance.

de qqr forma tem que se avaliar tudo, dependendo do que estiver querendo pode valer a pena criar uma view com os dados grossos e em seguida tratar o resultado final na view, acho que pode ser melhor, mas em relacao a custos nao tenho certeza se sera melhor ou nao o uso da view.

ou uma tabela temporaria, existe varios recursos que podem subtistuir o que normalmente montamos como consultas e subconsultas. rsrsr

com relacao a essa utilizacao em outros bancos(como perguntou o Roniere) eu desconheco, mas acredito que cada banco trabalhe melhor algumas situacoes embora alguns defendam que seja igual os usos gerais. rsrsr

Espero ter ajudado.

Abraco.

Alex - Lekao
Responder Citar

16/04/2014

Mariana Carvalho

fiz uma leitura sobre o assunto, mas acho que vou apenas estudar por cima, não vejo futuro, rsrsrsrs.
Responder Citar

17/04/2014

Jefferson Santos

fiz uma leitura sobre o assunto, mas acho que vou apenas estudar por cima, não vejo futuro, rsrsrsrs.


Esse é o futuro.
É utilizado quase em 60%, 70% do dia a dia.
Criação de view, procedure, trigger, relatorio, consulta.
Otimização do banco, uso de memoria, uso de CPU.
Responder Citar

17/04/2014

Marisiana

Tava acompanhando o post, e eu concordo com o que o Jefferson acabou de mencionar!
A utilização de subconsultas é bem útil e muitas vezes simplifica a solução de um problema que parecia complexo.
Responder Citar