Tenho essas tables e preciso realizar essas querys nelas, sou iniciante e estou quebrando a cabeça e não consigo, alguem poderia me dar uma luz?

04/04/2020

13

Tenho essas tables e preciso realizar essas querys nelas, sou iniciante e estou quebrando a cabeça e não consigo, alguem poderia me dar uma luz?

-- Selecionar o funcionário (matrícula e nome do funcionário) que tem o maior número de dependentes;

-- Selecionar todos os funcionários (matrícula, nome do funcionário, data nascimento) que nasceram a partir de 2002, que tenha pelo menos um dependente e que não possui salário;

** sei que terei que usar o count e o max, porem não consegui entender como usar eles nesses exemplos =/


create table cidade(
codigo int4 not null,
nome varchar(40) not null,
estado bpchar(2) not null,
primary key (codigo)
);

create table funcionario(
matricula int4 not null,
nome varchar(50) not null,
rg varchar(50) not null,
datanascimento date not null,
cidade_nasc int4,
primary key(matricula),
foreign key(cidade_nasc) references cidade(codigo)
);

create table enderecofunc(
matricula int4 not null,
endereco varchar(50) not null,
numero int4 not null,
bairro varchar(50) not null,
cidade int4 not null,
cep varchar(10),
fone varchar(20),
celular varchar(40),
email varchar(50),
primary key(matricula),
foreign key(matricula) references funcionario(matricula),
foreign key(cidade) references cidade(codigo)
);

create table salario(
matricula int4 not null,
ano int4 not null,
mes int4 not null,
salario numeric(12,2) not null,
primary key(matricula, ano, mes),
foreign key(matricula) references funcionario(matricula)
);

create table dependentes(
matricula int4 not null,
codigo int4 not null,
nomedependente varchar(50) not null,
datanascimento date not null,
primary key(matricula, codigo),
foreign key(matricula) references funcionario(matricula)
);
Responder

Post mais votado

06/04/2020

-- Selecionar o funcionário (matrícula e nome do funcionário) que tem o maior número de dependentes;
select top 1 -- dependendo do banco pode ser first 1, ou outro comando, daí a importância do que o Mário Reis postou
	fun.matricula, fun.nome 
from
	funcionario fun
left join
	dependentes dep on dep.matricula = fun.matricula
group by
	fun.matricula, fun.nome
order by
	count(dep.codigo) desc

-- Selecionar todos os funcionários (matrícula, nome do funcionário, data nascimento) que nasceram a partir de 2002, que tenha pelo menos um dependente e que não possui salário;
select
	fun.matricula, fun.nome, fun.datanascimento
from
	funcionario fun
where
	fun.datanascimento >= '2002-01-01'
	and exists(select dep.matricula from dependentes dep where dep.matricula = fun.matricula)
	and not exists(select sal.matricula from salario sal where sal.matricula = fun.matricula)
Responder

Mais Posts

05/04/2020

Mário Reis

Não é possível assim.
V. tem que dizer como liga as tabelas entre si.
Que base de dados está usando. Firebird e que versão?
Que ferramenta front-end usa para aceder e manipular directamente os dados?
E, em que linguagem V. está programando?
Sabem mais alguma coisa talvez te possa ajudar.
Abr.
Responder

06/04/2020

Gabriel Neves

Não é possível assim.
V. tem que dizer como liga as tabelas entre si.
Que base de dados está usando. Firebird e que versão?
Que ferramenta front-end usa para aceder e manipular directamente os dados?
E, em que linguagem V. está programando?
Sabem mais alguma coisa talvez te possa ajudar.
Abr.


Olá Márcio Reis, desculpa a falta de informações, estou utilizando o PostgreSQL. Estou fazendo as buscas diretamente pelo Script do Dbeaver...
Responder

07/04/2020

Gabriel Neves

-- Selecionar o funcionário (matrícula e nome do funcionário) que tem o maior número de dependentes;
select top 1 -- dependendo do banco pode ser first 1, ou outro comando, daí a importância do que o Mário Reis postou
	fun.matricula, fun.nome 
from
	funcionario fun
left join
	dependentes dep on dep.matricula = fun.matricula
group by
	fun.matricula, fun.nome
order by
	count(dep.codigo) desc

-- Selecionar todos os funcionários (matrícula, nome do funcionário, data nascimento) que nasceram a partir de 2002, que tenha pelo menos um dependente e que não possui salário;
select
	fun.matricula, fun.nome, fun.datanascimento
from
	funcionario fun
where
	fun.datanascimento >= ''2002-01-01''
	and exists(select dep.matricula from dependentes dep where dep.matricula = fun.matricula)
	and not exists(select sal.matricula from salario sal where sal.matricula = fun.matricula)


Muito obrigado acabei quebrando a cabeça aqui e realizando as mesmas querys mas com outros métodos.
Porem foi muito bom poder ter noção de quanto mais pratico poderia ter ficado, novamente muito obrigado!


-- f) Selecione o funcionário (matrícula e nome do funcionário) que tem o maior número de dependentes;

select funcionario.matricula, funcionario.nome, count(dependentes.matricula) as qtd_dependentes
from dependentes
right join funcionario on funcionario.matricula = dependentes.matricula 
group by funcionario.matricula, funcionario.nome
having count(dependentes.matricula)=(select max(A.CNT)
						             from (Select count(dependentes.matricula) as CNT
							               from dependentes
						                   group by (dependentes.matricula)) as A);

-- g) Selecione todos os funcionários (matrícula, nome do funcionário, data nascimento) que nasceram a partir de 2002, que tenha pelo menos um dependente e que não possui salário;

select funcionario.matricula, funcionario.nome, funcionario.datanascimento
from dependentes
left join funcionario on funcionario.matricula = dependentes.matricula
left join salario on salario.matricula = dependentes.matricula
group by funcionario.matricula, funcionario.nome, salario.salario
having count(dependentes.matricula) >= 1
and funcionario.datanascimento > ''20020101''
and count(salario.salario) = 0;



Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar