Upload
carlos-santos
View
602
Download
1
Embed Size (px)
Citation preview
Bases de dados: Auto-associaçõesSQL: SELECT
Carlos SantosLabMM 4 - NTC - DeCA - UAAula 06, 05-03-2013
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
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)
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!
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
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
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”
SQL: SELECT ... WHERE
Para selecionar um determinado conjunto de registos utiliza-se a cláusula WHERE
• SELECT nome_colunasFROM nome_tabelaWHERE 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
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’
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%”;
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.amigosWHERE nome="pedro" OR email LIKE "r%";
SQL: SELECT ... ORDER BY ...
Os resultados finais podem ser ordenados pelos valores de uma ou mais colunas
• SELECT nome_colunasFROM 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
SQL: SELECT ... ORDER BY ...
• SELECT * FROM MeusCDs.amigos ORDER BY nome;
• SELECT * FROM MeusCDs.amigos ORDER BY nome DESC;
SQL: SELECT ... LIMIT ...
Os resultados finais podem ser limitados a uma determinada gama de resultados
• SELECT nome_colunasFROM nome_tabelaLIMIT 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ê?
SQL: SELECT ... LIMIT ...
• SELECT * FROM MeusCDs.amigos LIMIT 1,2;
• SELECT * FROM MeusCDs.amigos LIMIT 3,100;