Executando verificação de segurança...
1

Como resolvo isso no SQL

Estou com exercicio no postgreSQL para resolver.

CRIE UM MODELO DE BANCO DE DADOS QUE:
Um clube possui vários jogadores.
Um clube participa de um ou vários campeonatos.
Um campeonato pode ter vários clubes disputando o campeonato

-Inserir um clube
-Inserir alguns jogadores
-Inserir dois campeonatos
-Listar os nome dos campeonatos que o clube participa
-Listar o número total de jogadores do clube.

FIZ ASSIM:

CREATE TABLE clube (cnpj VARCHAR(18) PRIMARY KEY, nome VARCHAR(30));


CREATE TABLE jogador (cpf VARCHAR(11) PRIMARY KEY, nome VARCHAR(30),idade numeric,cnpj_clube VARCHAR(18),
FOREIGN KEY (cnpj_clube) REFERENCES clube(cnpj));


CREATE TABLE campeonato (codigo_campeonato numeric PRIMARY KEY, nome VARCHAR(18));


CREATE TABLE participa (cnpj_clube VARCHAR(18), FOREIGN KEY (cnpj_clube) REFERENCES clube(cnpj),
codigo_campeonato numeric,
FOREIGN KEY (codigo_campeonato) REFERENCES campeonato(codigo_campeonato) );


INSERT INTO clube(cnpj,nome) VALUES ('57.769.288/0001-80','Botafogo')


INSERT INTO jogador(cpf,nome,idade) VALUES ('910.525.508-27','Márcio Marcos Assunção','60'),
('252.800.323-44','Gabriel Thomas Lima','28'),
('302.954.090-10','Carlos Eduardo Baptista','62'),
('076.699.140-76','Márcio Matheus Sales','44'),
('876.204.540-71','Marcos Gabriel Gonçalves','32'),
('514.343.730-02','Cristiane Flávia Débora','22'),
('313.304.260-29','Gabriel Gonçalves','52'),
('573.102.330-18','Isaac Rodrigo Sales','31'),
('052.356.560-75','Jéssica Louise Carolina','25'),
('249.273.060-38','Manuel Osvaldo Baptista','41'),
('163.938.060-44','Hugo Vinicius Lima','48');


INSERT INTO campeonato(codigo_campeonato,nome) VALUES ('02815781','Brasileirão'),
('46054058','Copa Do Brasil'),
('54615054','Sudamericana'),
('98563242','Cariocão');
_______________________________________________________________________________________________

Porém Não consigo listar a tabela de COMPETIÇÕES e a de JOGADORES juntas, apenas uma por vez
Alguém tem ideia do que fazer ?

Carregando publicação patrocinada...
1

Olhando seu script, primeiro você precisa no seu insert do Jogador associar-ló ao clube, já que você reservou um campo pra isso.

INSERT INTO jogador(cpf,nome,idade, cnpj_clube) VALUES ('91052550827','Márcio Marcos Assunção','60','57.769.288/0001-80');

PS: como você criou a tabela de jogador e definiu o campo CPF com 11 caracteres, precisa tirar a pontuação.

Assim se você executar a query abaixo vai ter os jogadores associado ao clube:
select * from clube c join jogador j on j.cnpj_clube = c.cnpj where c.cnpj = '57.769.288/0001-80';


Agora você precisa fazer insert na tabela Participa, assim você tem o vinculo da Campeonato e Clube

insert into participa(cnpj_clube,codigo_campeonato)

Apenas com essa query você ve a tabela como ficou:

select * from participa


Agora se você quer listar tudo campeonato -> clube -> jogadores, utiliza essa query:
select * from participa p join campeonato ca on ca.codigo_campeonato = p.codigo_campeonato join clube c on c.cnpj = p.cnpj_clube join jogador j on j.cnpj_clube = c.cnpj where c.cnpj = '57.769.288/0001-80'

PS: usei um postgresql online para executar seu script, testar essas teoria e funcionou kkkkkk espero que eu tenha ajudado

1

Joao voce precisa realizar um INNER JOIN para poder listar dados das duas tabelas, por exemplo, daria para trazer todos os campeonatos que um time participa.

1
1

SELECT c.*, j.*
FROM campeonato c
INNER JOIN participa p on (p.codigo_campeonato = c.codigo_campeonato)
INNER JOIN clube cl on (p.cnpj_clube = cl.cnpj)
INNER JOIN jogador j on (j.cnpj_clube = cl.cnpj);

Sugiro você trocar essas definições de coluna em numeric por integer.

1
1

codigo_campeonato numeric

Baseado nos códigos que você colocou, os números são muito grandes e, uma vez que nenhuma operação matemática será realizada com eles (você não vai somar dois códigos, por exemplo) sugiro que sejam armazenados como VARCHAR.

Assim como os dados de CNPJ e CPF que podem ser armazenados como VARCHAR sem pontos e traços, uma vez que essa máscara é padrão, você vai poupar espaço no banco de dados e facilitar suas queries.

No mais, para retornar uma tabela com todas as competições e os jogadores que paerticipam dela, você pode tentar algo como:

SELECT c.nome, j.nome FROM campeonato c INNER JOIN participa p on p.codigo_campeonato = c.codigo_campeonato INNER JOIN clube clu on clu.cnpj = p.cnpj_clube INNER JOIN jogador j on j.cnpj_clube = clu.cnpj (escrevi essa query sem testar, então pode ser que tenha alguma falha, mas é nesse raciocínio).

Lembrando que como utilizei INNER JOIN, o dado precisa estar em todas as tabelas para ser exibido. Se não for seu caso, teste LEFT JOIN por exemplo.