Alguem pode me explicar como este codigo sql funciona ? (resolvido )

11 respostas
S

na verdade eu queria fazer o seguinte
sql 1

select max(avg(insc_quantia)) 
from  zz_view_inscricao_completa 
group by alunosProvincia

mas quando eu fiz assim deu erro então fiz da seguinte forma que vi na internet e deu certo, mas nao entendi bem o porque que deu certo.

alguem pode me explicar o funcionamento deste codigo sql???
sql2

SELECT *, max(ttt) FROM 
(  select avg(insc_quantia) as ttt 
from  zz_view_inscricao_completa 
group by alunosProvincia )
 as dddd
;

eu nunca aprendi nem nunca vi uma sintaxe de codigo sql assim, e fiquei pasmo, como é que funcionou

11 Respostas

felipedamiani

neste trecho

( select avg(insc_quantia) as ttt from zz_view_inscricao_completa group by alunosProvincia )

ele seleciona as médias (avg), depois ele faz um select neste resultado (subselect), buscando o máximo.
isso porque ele primeiro precisa saber as médias, para depois poder calcular o máximo, entendeu?

Abraço

papagaio

SELECT *, max(ttt) FROM ( select avg(insc_quantia) as ttt from zz_view_inscricao_completa group by alunosProvincia ) as dddd ;

é facil
isso é um select e um subselect

o subselect é como uma tabela temporaria
vc esta dando um select nos dados que estao vindo do subselect
o nome da tua tabela temporaria é ‘dddd’ e vc esta somando uma o campo dela ‘ttt’

S

felipedamiani:
neste trecho

( select avg(insc_quantia) as ttt from zz_view_inscricao_completa group by alunosProvincia )

ele seleciona as médias (avg), depois ele faz um select neste resultado (subselect), buscando o máximo.
isso porque ele primeiro precisa saber as médias, para depois poder calcular o máximo, entendeu?

Abraço

olha valeu mano, !!! mas parece que nao leste bem,.
a minha duvida é apenas no segundo trecho.
porque o primeiro trecho fui eu que fiz :slight_smile: :slight_smile: , mas infelizmente o primeiro trecho nao funcionou, na minha logica e na minha teoria deveria funcionar, mas nao funcionou, e entao procurei na internet, e notei que devia fazer como esta no segundo trecho, e entao fiz e funcionou, mas o problema é que funcionou e mesmo assim eu nao entendi o porque que funcionou, e tambem nao entendi o porque que o primeiro trecho nao funcionou

S

papagaio:
SELECT *, max(ttt) FROM ( select avg(insc_quantia) as ttt from zz_view_inscricao_completa group by alunosProvincia ) as dddd ;

é facil
isso é um select e um subselect

o subselect é como uma tabela temporaria
vc esta dando um select nos dados que estao vindo do subselect
o nome da tua tabela temporaria é ‘dddd’ e vc esta somando uma o campo dela ‘ttt’

ok, agora estou a começar a entender a logica disso, valeu,
devo entender o subselect como uma tabela temporaria porque o subselect esta no campo from onde devia ficar os dados das ou da tabela.

o problema é que eu nao gosto que as coisas funcionem ,sem eu entender bem

valeu, ja entendi , e vou ver se exercito esta sintaxi, para ver se me acostumo,
mas ja agora eu acho que o primeiro trecho devia funcionar, nao entendo o porque que nao funciona??? tens alguma idea do que tem de errado no primeiro trecho??? :idea: :idea: :idea:

ateubh

A diferença é que no segundo treço vc tira a média e depois agrupa, aí sim pega o maior valor

No primeiro vc tira a média, pega o maior valor e agrupa.

Tendeu?

sulito:
felipedamiani:
neste trecho

( select avg(insc_quantia) as ttt from zz_view_inscricao_completa group by alunosProvincia )

ele seleciona as médias (avg), depois ele faz um select neste resultado (subselect), buscando o máximo.
isso porque ele primeiro precisa saber as médias, para depois poder calcular o máximo, entendeu?

Abraço

olha valeu mano, !!! mas parece que nao leste bem,.
a minha duvida é apenas no segundo trecho.
porque o primeiro trecho fui eu que fiz :slight_smile: :slight_smile: , mas infelizmente o primeiro trecho nao funcionou, na minha logica e na minha teoria deveria funcionar, mas nao funcionou, e entao procurei na internet, e notei que devia fazer como esta no segundo trecho, e entao fiz e funcionou, mas o problema é que funcionou e mesmo assim eu nao entendi o porque que funcionou, e tambem nao entendi o porque que o primeiro trecho nao funcionou

S

fiz uma prova ontem que saiu uma pergunta desse genero, e entao cheguei em casa e recriei o cenario com outras tabelas de um banco de dados que eu tinha,
mas na prova eu meti como estava o primeiro trecho de codigo,
e cheguei em casa testei e nao funcionou, entao pesquisei e cheguei no segundo trecho

S

ateubh:
A diferença é que no segundo treço vc tira a média e depois agrupa, aí sim pega o maior valor

No primeiro vc tira a média, pega o maior valor e agrupa.

Tendeu?

sulito:
felipedamiani:
neste trecho

( select avg(insc_quantia) as ttt from zz_view_inscricao_completa group by alunosProvincia )

ele seleciona as médias (avg), depois ele faz um select neste resultado (subselect), buscando o máximo.
isso porque ele primeiro precisa saber as médias, para depois poder calcular o máximo, entendeu?

Abraço

olha valeu mano, !!! mas parece que nao leste bem,.
a minha duvida é apenas no segundo trecho.
porque o primeiro trecho fui eu que fiz :slight_smile: :slight_smile: , mas infelizmente o primeiro trecho nao funcionou, na minha logica e na minha teoria deveria funcionar, mas nao funcionou, e entao procurei na internet, e notei que devia fazer como esta no segundo trecho, e entao fiz e funcionou, mas o problema é que funcionou e mesmo assim eu nao entendi o porque que funcionou, e tambem nao entendi o porque que o primeiro trecho nao funcionou

ok, valeu a dica, ja entendi a diferença entre eles. eu pensava que eu entendia tudo sobre consultas, mas notei que afinal ainda tem muitos segredos, valeu a força gujeiros :slight_smile: :slight_smile: todos os dias se aprende algo novo

S

topico resolvido :slight_smile: :slight_smile:

fantomas

Oi Sulito,

Vou tentar explicar o quê entendi do seu problema.

Acredito que o código que vc escreveu (primeiro trecho) não funcionou porque o banco de dados que vc utiliza verifica se é possivel a execução de função (AVG) dentro de outra função (MAX). Nem todas funções podem ser executadas recebendo qualquer outra função como parametro, ha critérios para isso, me parece que é o seu caso ( MAX e AVG).

No código que vc encontrou na net (segundo trecho) acontece o seguinte): As execuções das funções acontecem SEPARADAS, primeiro ocorre a execução da função AVG no subselect (já foi explicado pelo nosso amigo) e logo em seguida a banco de dados executa a função MAX utilizando como parametro o resultado do subselect que utilizou o AVG. Ou seja, a idéia central do código é a separação e priorização das execuções das funções MAX e AVG. A função AVG é executada em primeiro lugar e a MAX em segundo e única ligação que existe entre elas são os dados resultantes.

flws

S

tentei executar no mysql, me falta tentar no oracle, talvez ele aceite excutar o primeiro trecho onde tem o max(avg)

S

fantomas:
Oi Sulito,

Vou tentar explicar o quê entendi do seu problema.

Acredito que o código que vc escreveu (primeiro trecho) não funcionou porque o banco de dados que vc utiliza verifica se é possivel a execução de função (AVG) dentro de outra função (MAX). Nem todas funções podem ser executadas recebendo qualquer outra função como parametro, ha critérios para isso, me parece que é o seu caso ( MAX e AVG).

No código que vc encontrou na net (segundo trecho) acontece o seguinte): As execuções das funções acontecem SEPARADAS, primeiro ocorre a execução da função AVG no subselect (já foi explicado pelo nosso amigo) e logo em seguida a banco de dados executa a função MAX utilizando como parametro o resultado do subselect que utilizou o AVG. Ou seja, a idéia central do código é a separação e priorização das execuções das funções MAX e AVG. A função AVG é executada em primeiro lugar e a MAX em segundo e única ligação que existe entre elas são os dados resultantes.

flws


Mas gostei da tua logica de raciocinio,

Criado 14 de dezembro de 2010
Ultima resposta 14 de dez. de 2010
Respostas 11
Participantes 5