# Query by Example

Query-by-Example (QBE) é uma linguagem de consulta e também um antigo SGDB que incluia essa linguagem. A linguagem QBE foi criada por Moshé M. Zloof da IBM na década de 70, em paralelo com a criação do SQL. Como diz seu nome (pergunta "por exemplos"), o usuário apenas descreverá as informações desejadas, dando exemplos do que deseja encontrar, mas não fornecerá um procedimento específico para obter essas informações. A QBE foi baseada na lógica relacional.

## Características

A QBE possui dois recursos característico:
* Possui uma sintexe bidimensional, ou seja, as consultas se parecem com tabelas. Uma consulta em linguagem unidimensional, como o SQL pode ser escrita em uma linha, porém, uma bidimensional exigirá duas dimensões (uma tabela)
* As consultas QBE são expressas "por exemplos". Em vez de fornecer um procedimento para obter a resposta, o usuário fornece um exemplo do que é desejado e o sistema generalizará esse exemplo para calcular a resposta.
Existem dois tipos de QBE: a versão original baseada em texto e uma versão gráfica, desenvolvida mais tarde e que foi aceita pelo Microsoft Access

## Estrutura da linguagem

Expressamos consultas na QBE por tabelas de estruturas . Em vez de encher a tela com todas as estruturas, o usuário seleciona as estruturas necessárias para uma determinada consulta e preenche as estruturas com linhas de exemplo.
Usaremos a seguinte tabela de informação para as consultas
Universidade :
| Aluno | Materia | Nota | Situação |
| Alberto | Calculo | 10 | Aprovado |
| Lucas | Banco de Dados | 4 | Reprovado |
| Andréia | Programação | 7 | Aprovado |
| Lucas | Calculo | 4.9 | Reprovado |
| Mariana | Física | 7 | Aprovado |
| Fernando | Calculo | 5 | Aprovado |

### Consultas em uma relação

Vamos começar realizando uma pesquisa de todos os estudantes que cursaram "Cálculo"
| Aluno | Materia | Nota | Situação |
| P. | Calculo | | |
Essa consulta diz ao sistema para procurar as tuplas que tem "Cálculo" como valor para Matéria e exibir apenas a coluna aluno. Como exemplo, poderíamos fazer a consulta de mostrar todos os alunos, retirando apenas a restrição, teríamos:
| Aluno | Materia | Nota | Situação |
| P. | | | |
A QBE permite consultas com comparações aritméticas em vez de comparações de igualdade. Por exemplo, na consulta: Encontre todas as matérias que os alunos tiraram nota maior que 5.
| Aluno | Materia | Nota | Situação |
| | P. | | > 5 |
Podemos encontrar relações a partir de negação. Na consulta: Encontre todos os alunos que não cursaram Física, teremos:
| Aluno | Materia | Nota | Situação |
| P. | not Física | | |
A principal finalidade das variáveis da QBE é obrigar valores de certas tuplas a terem o mesmo valor de certos atributos. Vamos considerar a consulta: Encontre o Nome dos alunos com a mesma nota de Mariana.
| Aluno | Materia | Nota | Situação |
| P._X | | _Y | |
| Mariana | | _Y | |
Nesta consulta, _X e _Y são variáveis (assim como todas que começarem com "_", contudo está não é uma restrição do programa, apenas uma notação nossa para organização). Ela retornará todas as relações que tenham _Y igual a nota de mariana, que neste caso é 7. Perceba que a segunda linha, é apenas para encontrar o valor dessa nota e atribuí-lo a _Y.

### Consulta em várias relações

A QBE permite que as consultas abranjam várias relações diferentes. As conexões entre as várias relações são obtidas por meio de variáveis que obrigam certas tuplas a terem o mesmo valor em certos atributos. Vamos então realizar a consulta: Encontrar todos os alunos que tiveram aula com o professor Marcelo:
| Aluno | Materia | Nota | Situação |
| P._X | _Y | | |
| Professor | Materia Administrada | Nível de Graduação |
| Marcelo | _Y | |

### Caixa de Condição

Às vezes, é inconveniente ou impossível expressar todas as restrições nas variáveis de domínio dentro das tabelas de estrutura. Por causa disso, a QBE inclui o recurso caixa de condição, que permite expressar restrições gerais sobre qualquer uma das variáveis do domínio.
Por exemplo, se quisermos encontrar todos os alunos com notas maiores que 4 e menores que 8, teremos:
| Aluno | Materia | Nota | Situação |
| P. | | _x | |
* Condições
* _x < 8
* _x > 4

### Vários Resultados

Até agora, todas as relações que demostramos tem em comum apenas um único resultado, mas podemos expandir de forma a criar novas tabelas com todos os resultados que queremos mostrar. Se quisermos pesquisar: o nome do aluno, sua situação e o nome do professor, temos a seguinte busca:
| Aluno | Materia | Nota | Situação |
| _W | _X | | _y |
| Professor | Materia Administrada | Nível de Graduação |
| _Z | _X | |
| Resultado | Aluno | Situação | Professor |
| P. | _W | _Y | _Z |