- Banco de Dados RelacionalTipos de ChavesChave Estrangeira
- SQLDMLSELECTGROUP BY e HAVING
- SQLDMLSELECTJOINs
- SQLDMLSELECTUNION, EXCEPT e MINUS
As tabelas TIME, TORNEIO e PARTIDA, representadas abaixo, fazem parte de uma base de dados utilizada para armazenar os resultados dos torneios de Futebol.
| TIME(ID*, NOME) |
| TORNEIO(ID*, NOME, DATA_INICIO, DATA_FIM) |
| PARTIDA(ID*, DATA_HORA_INICIO, LOCAL, ID_TORNEIO, ID_TIME1, ID_TIME2, ID_TIME_VENCEDOR, GOLS_TIME1, GOLS_TIME2) |
As colunas participantes das chaves primárias estão com o símbolo * no nome. Além disso, todos os campos são NOT NULL, exceto o ID_TIME_VENCEDOR que pode ser null, quando a partida terminou em empate.
As chaves estrangeiras estão definidas na tabela abaixo.
| Origem | Destino | ||
| Tabela | Campo | Tabela | Campo |
| PARTIDA | ID_TORNEIO | TORNEIO | ID |
| PARTIDA | ID_TIME1 | TIME | ID |
| PARTIDA | ID_TIME2 | TIME | ID |
| PARTIDA | ID_TIME_VENCEDOR | TIME | ID |
O vencedor de um torneio é o time com maior número de pontos nesse torneio. Além disso, cada vitória vale 3 pontos e os empates, 1 ponto. Considere o caso exposto anteriormente e a consulta SQL abaixo:
SELECT T.NOME,SUM(PO) AS S FROM
(
SELECT T.ID AS I, 0 AS PO
FROM TIME T
UNION
SELECT ID_TIME_VENCEDOR AS I,3 AS PO
FROM PARTIDA P
WHERE ID_TIME_VENCEDOR IS NOT NULL
UNION
SELECT ID_TIME1 AS I,1 AS PO
FROM PARTIDA P
WHERE ID_TIME_VENCEDOR IS NULL
UNION
SELECT ID_TIME2 AS I,1 AS PO
FROM PARTIDA P
WHERE ID_TIME_VENCEDOR IS NULL
) SB
INNER JOIN TIME T ON (T.ID=I)
GROUP BY T.NOME
ORDER BY S DESC
A execução do comando SQL acima produz como resultado