Bases de dados: Auto-associações
SQL: SELECT
Carlos Santos
LabMM 4 - NTC - DeCA - UA
Aula 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_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
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.amigos
    WHERE 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_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
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_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ê?
SQL: SELECT ... LIMIT ...



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




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

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 aseguinte 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 FKpode 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) Utilizaruma 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) Diferentespossibilidades: • 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 | StructuredQuery 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 considerarcomo 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;