labmm4 (t06 - 12/13) - auto-associações e introdução ao sql

15
Bases de dados: Auto-associações SQL: SELECT Carlos Santos LabMM 4 - NTC - DeCA - UA Aula 06, 05-03-2013

Upload: carlos-santos

Post on 27-Jun-2015

600 views

Category:

Education


1 download

TRANSCRIPT

Page 1: LabMM4 (T06 - 12/13) - Auto-associações e Introdução ao SQL

Bases de dados: Auto-associaçõesSQL: SELECT

Carlos SantosLabMM 4 - NTC - DeCA - UAAula 06, 05-03-2013

Page 2: LabMM4 (T06 - 12/13) - Auto-associações e Introdução ao SQL

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

Page 3: LabMM4 (T06 - 12/13) - Auto-associações e Introdução ao SQL

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)

Page 4: LabMM4 (T06 - 12/13) - Auto-associações e Introdução ao SQL

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!

Page 5: LabMM4 (T06 - 12/13) - Auto-associações e Introdução ao SQL

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

Page 6: LabMM4 (T06 - 12/13) - Auto-associações e Introdução ao SQL

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

Page 7: LabMM4 (T06 - 12/13) - Auto-associações e Introdução ao SQL

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”

Page 8: LabMM4 (T06 - 12/13) - Auto-associações e Introdução ao SQL

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

Page 9: LabMM4 (T06 - 12/13) - Auto-associações e Introdução ao SQL

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’

Page 10: LabMM4 (T06 - 12/13) - Auto-associações e Introdução ao SQL

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%”;

Page 11: LabMM4 (T06 - 12/13) - Auto-associações e Introdução ao SQL

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%";

Page 12: LabMM4 (T06 - 12/13) - Auto-associações e Introdução ao SQL

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

Page 13: LabMM4 (T06 - 12/13) - Auto-associações e Introdução ao SQL

SQL: SELECT ... ORDER BY ...

• SELECT * FROM MeusCDs.amigos ORDER BY nome;

• SELECT * FROM MeusCDs.amigos ORDER BY nome DESC;

Page 14: LabMM4 (T06 - 12/13) - Auto-associações e Introdução ao SQL

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ê?

Page 15: LabMM4 (T06 - 12/13) - Auto-associações e Introdução ao SQL

SQL: SELECT ... LIMIT ...

• SELECT * FROM MeusCDs.amigos LIMIT 1,2;

• SELECT * FROM MeusCDs.amigos LIMIT 3,100;