Operação de Seleção

Autor

Douglas Braga

A operação de seleção filtra as tuplas de uma relação, retornando apenas aquelas que satisfazem um determinado predicado.

Notação e Sintaxe

\[\sigma_p(r)\]

onde \(r\) é uma relação e \(p\) é o predicado de seleção — uma condição booleana sobre os atributos das tuplas.

O resultado de \(\sigma_p(r)\) é uma relação com o mesmo schema de \(r\), mas contendo apenas as tuplas para as quais \(p\) é verdadeiro.

Predicados de Seleção

Os predicados podem usar:

  • Operadores de comparação: \(=\), \(\neq\), \(>\), \(\geq\), \(<\), \(\leq\)
  • Conectivos lógicos: \(\wedge\) (e), \(\vee\) (ou), \(\neg\) (não)
  • Comparação entre atributos: \(\sigma_{id\_escola = id\_centro}(escola)\)

Exemplo 1: Professores da ESETI

Considere a relação professor:

id_prof nome id_escola ch_semanal
21200001 Eduarda Souza 21 20
21400002 Felipe Araujo 21 40
31200001 Gustavo Costa 31 20
31400002 Helena Carvalho 31 40
31200003 Igor Melo 31 20
11400001 Bruno Teixeira 11 40
11400002 Carla Pinto 11 40

A expressão \(\sigma_{id\_escola = 31}(professor)\) retorna:

id_prof nome id_escola ch_semanal
31200001 Gustavo Costa 31 20
31400002 Helena Carvalho 31 40
31200003 Igor Melo 31 20

Apenas as tuplas onde id_escola = 31 foram mantidas. O schema do resultado é idêntico ao schema de professor.

Exemplo 2: Predicado Composto

Para selecionar alunos do curso de Engenharia de Software e com ingresso em 2024, usa-se o conectivo \(\wedge\):

\[\sigma_{id\_curso = 311 \,\wedge\, ano\_ingresso = 2024}(aluno)\]

Relação aluno (amostra):

id_aluno nome id_curso ano_ingresso
2023311001 Matheus Lima 311 2023
2023311002 Larissa Araújo 311 2023
2024311001 Pedro Carvalho 311 2024
2024311002 Isabela Freitas 311 2024
2023111001 Beatriz Mendes 111 2023
2023211001 Amanda Moreira 211 2023

Resultado:

id_aluno nome id_curso ano_ingresso
2024311001 Pedro Carvalho 311 2024
2024311002 Isabela Freitas 311 2024

Exemplo 3: Comparação Entre Atributos

O predicado pode também comparar dois atributos da mesma relação. Por exemplo, para encontrar disciplinas cujo código corresponde ao nome do curso ao qual pertencem (verificação de consistência):

\[\sigma_{semestre > 6}(disciplina)\]

Neste caso, o predicado \(semestre > 6\) filtra as disciplinas das fases finais do curso.


Para Praticar

1. Predicado com OR. Escreva a expressão para encontrar todos os professores que são da EEMA ou têm salário acima de 6.000. Quais tuplas o resultado conteria?

\[\sigma_{id\_escola = 21\ \vee\ salario > 6000}(professor)\]

Resultado (7 professores verificados): - EEMA (id_escola=21): Eduarda Souza (3.200 — pelo critério de escola), Felipe Araujo (6.400 — ambos os critérios) - ESETI (id_escola=31): Helena Carvalho (6.700 — pelo salário), Gustavo Costa e Igor Melo (não satisfazem nenhum critério) - ESG (id_escola=11): Bruno Teixeira (6.500) e Carla Pinto (6.600) — pelo salário

Total: 5 tuplas (Eduarda, Felipe, Helena, Bruno, Carla).


2. Predicado composto. Escreva uma expressão para selecionar as disciplinas do curso ENS com carga horária entre 120 h e 160 h (inclusive).

\[\sigma_{id\_curso = 311\ \wedge\ carga\_horaria \geq 120\ \wedge\ carga\_horaria \leq 160}(disciplina)\]

Resultado: 3110202 (120h), 3110402 (120h), 3110601 (150h), 3110602 (120h), 3110802 (160h) = 5 tuplas.


3. Seleção sobre resultado de outra operação. É válido aplicar \(\sigma\) sobre o resultado de um produto cartesiano? Escreva a expressão para encontrar todos os pares (professor, escola) onde professor.id_escola = escola.id_escola e escola.id_centro = 3.

\[\sigma_{professor.id\_escola = escola.id\_escola\ \wedge\ escola.id\_centro = 3}(professor \times escola)\]

Isso é exatamente uma junção com filtro adicional — equivale a \(professor \bowtie_{professor.id\_escola = escola.id\_escola} \sigma_{id\_centro = 3}(escola)\), que retorna apenas os professores da ESETI (vinculada ao centro COETI, id_centro=3).