Aula4 - Consulta Envolvendo Tabelas
Aula4 - Consulta Envolvendo Tabelas
Aula4 - Consulta Envolvendo Tabelas
Objetivos:
I. Modelo de dados;
II. Consulta envolvendo mais de uma tabela.
Para reproduzir os exemplos e fazer os exercícios use as cláusulas do arquivo Aula4- Clausula SQL.txt para criar e
inserir os registros nas tabelas tbunidade, tbturno, tbcurso e tbcurso_por_unidade. A seguir tem-se o modelo de
dados relacional das tabelas.
I. Modelo de dados
O modelo de dados possui a representação gráfica dos atributos das tabelas, os tipos de dados e os
relacionamentos entre as tabelas.
A PK (Primary Key – Chave Primária) é usada para identificar unicamente um registro da tabela. A PK é chamada
de identificador. Tomemos como exemplo a tabela tbturno, ao tentarmos inserir um registro que possui id igual 2
será gerado erro, pois o SGBD não aceita chaves repetidas.
O relacionamento entre as tabelas acontece pela FK (Foreign Key – Chave Estrangeira). A FK de uma tabela é a PK
de outra tabela, tomemos como exemplo a coluna idturno na tbcurso_por_unidade, ela é a ligação entre as
tabelas tbturno e tbcurso_por_unidade. A coluna idturno está amarrada a coluna id da tbturno, ou seja, a coluna
1
Aula 4 – Consulta envolvendo tabelas
Modelagem de Banco de Dados – Prof. Marcelo Sudo
idturno só aceitará valores que existem na coluna id da tbturno. A cláusula insert a seguir falhará por não ter a
chave id 5 na tbturno.
O fato da idturno ser PK na tbcurso_por_unidade não tem ligação com o fato dela ser FK, ou seja, esses fatos são
independentes. Uma coluna pode ser FK e não ser PK.
create table if not exists tbcurso_por_unidade(
idunidade integer not null,
idcurso integer not null,
idturno integer not null,
vaga integer,
primary key(idunidade,idcurso,idturno),
foreign key (idunidade)
references tbunidade(id),
foreign key (idcurso)
references tbcurso(id),
foreign key (idturno)
references tbturno(id)
);
No diagrama a ligação entre as tabelas é representada pelas linhas e na instrução SQL usa o termo references. A
tradução do termo a seguir pode ser: a chave estrangeira idturno referencia a coluna id da tbturno.
Na modelagem de dados relacional os dados são distribuídos nas tabelas de modo a não existirem repetições de
dados. O único dado que pode ser repetido é FK, ou seja, no modelo de dados relacional teremos repetições
somente nas colunas idunidade, idcurso e idturno.
2
Aula 4 – Consulta envolvendo tabelas
Modelagem de Banco de Dados – Prof. Marcelo Sudo
Registros da tbtudo:
3
Aula 4 – Consulta envolvendo tabelas
Modelagem de Banco de Dados – Prof. Marcelo Sudo
Então o produto cartesiano das tabelas tbunidade, tbcurso e tbcurso_por_unidade terá 2.860.200 registros. O
produto cartesiano possui todas as combinações possíveis entre os registros, cabe a nós usar o termo where para
filtrar os registros que satisfazem às nossas necessidades. Quando estamos ligando duas tabelas, colocamos no
filtro a comparação entre a PK e FK, por exemplo:
tbunidade.id = tbcurso_por_unidade.idunidade para ligar os registros da tbunidade com os registros da
tbcurso_por_unidade;
tbcurso.id = tbcurso_por_unidade.idcurso para ligar os registros da tbcurso com os registros da
tbcurso_por_unidade.
Quando existe no termo from tabelas que possuem o mesmo nome de coluna, por exemplo, a coluna id existe na
tbcurso e tbunidade, então precisaremos colocar o nome da tabela antes do nome da coluna, por exemplo,
tbcurso.id.
Para simplificar podemos usar o comando as para renomear a tabela no âmbito da consulta. No exemplo a seguir
a tbunidade é identificada por a, e, desta forma, será gerado erro ao usar tbunidade.id em qualquer parte da
cláusula.
select unidade, nome as "curso"
from tbunidade as a, tbcurso as b, tbcurso_por_unidade as c
where a.id = c.idunidade and b.id = c.idcurso
order by unidade asc, curso asc;
4
Aula 4 – Consulta envolvendo tabelas
Modelagem de Banco de Dados – Prof. Marcelo Sudo
Exercícios
Para fazer os exercícios use as cláusulas do arquivo Aula4 - Clausula SQL.txt para criar e preencher as tabelas.
Exercício 1: Fazer uma consulta para listar os cursos disponíveis no município de Jacareí. Use como filtro no termo
where da cláusula somente o nome do município. Apresente o resultado ordenado em ordem alfabética.
Renomear a coluna para Curso.
Observação: você sabe apenas o nome do município, ou seja, você não sabe que o id da unidade é 33.
O resultado terá 3 registros.
Exercício 3: Fazer uma consulta para listar as unidades que possuem o curso de Gestão Financeira. Apresente o
resultado ordenado em ordem alfabética e evitar nomes repetidos. Renomear a coluna para Unidade.
Observação: você sabe apenas o nome do curso, ou seja, você não sabe que o id do curso.
O resultado terá 3 registros.
Dica: use o termo distinct para evitar repetições.
Exercício 4: Fazer uma consulta para listar os turnos que possuem o curso de Gestão Financeira. Apresente o
resultado ordenado em ordem alfabética e evitar nomes repetidos. Renomear a coluna para Turno.
Observação: você sabe apenas o nome do curso, ou seja, você não sabe que o id do curso.
O resultado terá 2 registros.
5
Aula 4 – Consulta envolvendo tabelas
Modelagem de Banco de Dados – Prof. Marcelo Sudo
Exercício 5: Fazer uma consulta para listar a quantidade de cursos por turno. Apresente o resultado ordenado em
ordem alfabética e renomear as colunas para Turno e Quantidade.
O resultado terá 4 registros.
Dica: use o termo group by e a função agrupadora count.
Exercício 6: Fazer uma consulta para listar a quantidade de vagas por turno. Apresente o resultado ordenado em
ordem alfabética e renomear as colunas para Turno e Vagas.
O resultado terá 4 registros.
Dica: use o termo group by e a função agrupadora sum.
Exercício 7: Fazer uma consulta para listar os turnos de cada unidade. Apresente o resultado ordenado em ordem
alfabética e renomear as colunas para Unidade e Turno.
O resultado terá 211 registros.
Dica: use o termo group by.
6
Aula 4 – Consulta envolvendo tabelas
Modelagem de Banco de Dados – Prof. Marcelo Sudo
Exercício 8: Alterar a consulta do Exercício 7 para incluir a quantidade de cursos por turno.
O resultado terá 211 registros.
Dica: use o termo group by e a função agrupadora count.
Exercício 9: Alterar a consulta do Exercício 8 para listar somente os registros que possuem 5 cursos por turno.
O resultado terá 7 registros.
Dica: use os termos group by e having, e a função agrupadora count.
7
Aula 4 – Consulta envolvendo tabelas
Modelagem de Banco de Dados – Prof. Marcelo Sudo
Exercício 10: Alterar a consulta do Exercício 9 para listar somente os registros do turno matutino.
O resultado terá 2 registros.
Dica: adicione a comparação no termo where para filtrar matutino.