O documento descreve como modelar relações hierárquicas em bases de dados usando auto-associações, onde funcionários podem ter um superior hierárquico. Explica como usar uma chave estrangeira nula para permitir que funcionários não tenham superior, e como usar uma tabela de relação com duas chaves estrangeiras para representar relações de 1:M, 1:1 ou M:M. Também fornece um resumo das principais cláusulas SQL como SELECT, WHERE, ORDER BY e LIMIT.
LabMM4 (T06 - 12/13) - Auto-associações e Introdução ao SQL
1. Bases de dados: Auto-associações
SQL: SELECT
Carlos Santos
LabMM 4 - NTC - DeCA - UA
Aula 06, 05-03-2013
2. Auto-associações
Pretende-se modelar a seguinte situação numa BD:
• Num escritório os funcionários possuem (ou não) um superior hierárquico
• Cada funcionário pode ter um único superior hierárquico
• Cada superior hierárquico pode coordenar vários funcionários
Como modelar esta relação numa BD?
Funcionarios
idFuncionarios
Nome
3. Auto-associações
Como a FK pode admitir valores nulos e valores repetidos
• Um funcionário pode ser superior hierárquico de vários outros
• Podem existir funcionários sem superior hierárquico
Se a FK não permitir valores nulos (NOT NULL)
• Não podem existir funcionários sem superior hierárquico
Se FK não permitir valores repetidos (UNIQUE)
• Cada funcionário só pode ser superior hierárquico de um único funcionário
• (a relação transforma-se numa 1:1)
4. Auto-associações (solução alternativa)
Utilizar uma tabela de relação com duas chaves estrangeiras que apontam
para a mesma chave primária!
Cada uma das FK não admite valores nulos por ser parte duma chave
primária composta. No entanto:
• Funcionarios_idFuncionarios e Funcionarios_idFuncionarios1 podem
ser configuradas com o parâmetro UNIQUE para evitar os valores
repetidos em cada uma das colunas
Nota: se a relação é do tipo 1:M, esta representação física não está
totalmente correta. Ver a discussão iniciado do grupo no SAPO Campus!
5. Auto-associações (solução alternativa)
Diferentes possibilidades:
• M:M - Se as duas FK admitirem valores repetidos (em cada uma das
colunas)
• 1:M - Se apenas uma das FK admitir valores repetidos
• 1:1 - Se nenhuma das FK admitir valores repetidos
6. SQL | Structured Query Language
Desenvolvida no início dos anos 70. Permite a interação com os SGBD e
as BD aí existentes. É suportada por todos os SGBDR (embora com
pequenas diferenças). Está estruturada em várias categorias:
• Data Query Language (DQL) – consultar os dados existentes na BD
• SELECT
• Data Manipulation Language (DML) – criar e modificar os dados na BD
• INSERT, UPDATE, DELETE
• Data Definition Language (DDL) – criar e modificar objectos da BD
(tabelas, views, …), ou a própria BD
• CREATE, ALTER, DROP
• Data Control Language (DCL) – gerir os privilégios dos utilizadores na
gestão da BD, dos seus objectos e dos dados aí existentes
• GRANT, REVOKE
7. SQL: SELECT
Vamos considerar como exemplo o exercício de gestão dos CDs. A base
de dados designa-se “MeusCDs” e existe uma tabela com os “Amigos”
• SELECT * FROM MeusCDs.Amigos;
“Devolve todos os campos de todos os registos existentes na tabela
Amigos da BD MeusCDs”
• SELECT nome, email FROM MeusCDs.amigos;
“Devolve os campos nome e email de todos os registos existentes na
tabela Amigos da BD MeusCDs”
8. SQL: SELECT ... WHERE
Para selecionar um determinado conjunto de registos utiliza-se a cláusula
WHERE
• SELECT nome_colunas
FROM nome_tabela
WHERE nome_coluna operador valor;
A ter em atenção:
• a coluna da condição não tem que estar na lista nome_colunas
• um valor do tipo string é escrito como “valor” ou ‘valor’
• os operadores possíveis de utilizar são: =, <>, >, <, >=, <=, BETWEEN,
LIKE e IN
• o operador LIKE só deve ser utilizado para pesquisas em campos do tipo
string
9. SQL: SELECT ... WHERE
• SELECT * FROM MeusCDs.amigos WHERE nome = ”Rui”;
• SELECT * FROM MeusCDs.amigos WHERE nome > ‘Carlos’;
• SELECT * FROM MeusCDs.amigos WHERE nome > Carlos;
“Unknown column ‘Carlos’ in ‘WHERE clause’
10. SQL: SELECT ... WHERE ... LIKE
Wildcards em SQL com operador LIKE
• “_” -> pode ser substituído por qualquer caracter (mas apenas 1)
• “%” -> pode ser substituído por 0 ou mais caracteres
• SELECT * FROM MeusCDs.amigos WHERE nome LIKE ”R%”;
• SELECT * FROM MeusCDs.amigos WHERE nome LIKE ”r%”;
11. SQL: SELECT ... WHERE ...
• SELECT * FROM MeusCDs.amigos WHERE nome LIKE ”%o%”;
As condições também podem incluir os operadores lógicos: AND, OR e NOT
• SELECT * FROM MeusCDs.amigos
WHERE nome="pedro" OR email LIKE "r%";
12. SQL: SELECT ... ORDER BY ...
Os resultados finais podem ser ordenados pelos valores de uma ou mais
colunas
• SELECT nome_colunas
FROM nome_tabela
...
ORDER BY nome_coluna(s) [ASC|DESC]
A ter em atenção:
• a coluna que tem mais prioridade é a que aparece primeiro na lista de
colunas
• por defeito, a ordenação é ascendente
13. SQL: SELECT ... ORDER BY ...
• SELECT * FROM MeusCDs.amigos ORDER BY nome;
• SELECT * FROM MeusCDs.amigos ORDER BY nome DESC;
14. SQL: SELECT ... LIMIT ...
Os resultados finais podem ser limitados a uma determinada gama de
resultados
• SELECT nome_colunas
FROM nome_tabela
LIMIT X,Y;
A ter em atenção:
• X é o índice do primeiro elemento do resultado global que queremos obter
• Y é o número de resultados
• mecanismo muito útil para criar sistemas de paginação! Porquê?
15. SQL: SELECT ... LIMIT ...
• SELECT * FROM MeusCDs.amigos LIMIT 1,2;
• SELECT * FROM MeusCDs.amigos LIMIT 3,100;