UNIVERSIDADE FEDERAL DE SANTA CATARINA CENTRO TECNOLÓGICO DEPARTAMENTO DE INFORMÁTICA E ESTATÍSTICA Curso de Bacharelado em Ciências da Computação Autor: Ederson Luiz Paes Responsável: Fábio Teixeira de Campos Orientador: Fábio Teixeira de Campos FERRAMENTA DIDÁTICA PARA O ENSINO DE ÁLGEBRA RELACIONAL Trabalho apresentado à disciplina Projeto I em Ciências da Computação, como requisito de avaliação orientado pelo professor Renato Cislaghi Florianópolis 20051 Sumário 1. Fundamentação Teórica................................................................................. 3 1.1. Álgebra Relacional ................................................................................ 3 1.1.1. Operação Seleção .............................................................................. 3 1.1.2. Operação Projeção............................................................................. 4 1.1.3. Operação União ................................................................................. 4 1.1.4. Operação Diferença entre Conjuntos ................................................. 4 1.1.5. Operação Produto Cartesiano ............................................................ 5 1.1.6. Operação Renomeação ..................................................................... 5 1.1.7. Operação de Interseção ..................................................................... 5 1.1.8. Operação Junção ............................................................................... 6 1.1.9. Operação Junção Natural................................................................... 6 1.1.10. Operação Divisão ............................................................................. 6 1.2. Visões.................................................................................................... 7 1.3. SQL ....................................................................................................... 7 1.3.1. As partes da linguagem SQL .............................................................. 8 1.3.2. A Linguagem de Definição de Dados (SQL-DDL) .............................. 9 1.3.2. Linguagem de Manipulação de Dados - DML .................................. 11 1.4. Linguagens Formais e Compiladores ................................................. 13 1.4.1. Analisador Léxico ............................................................................. 14 1.4.2. Analisador Sintático .......................................................................... 14 1.4.3. Analisador Semântico....................................................................... 15 2. Ferramenta Didática para o Ensino de Álgebra Relacional .......................... 16 2.1. Desenvolvimento do Compilador ......................................................... 16 2.2. Desenvolvimento da Ferramenta de Manipulação de Relações e Tuplas. 17 2.3. Desenvolvimento da Interface com o Usuário ..................................... 18 2.4. Integração dos Módulos do Sistema ................................................... 19 2.5. Realização de Testes .......................................................................... 19 3. Referência Bibliográfica ............................................................................... 20 2 1. Fundamentação Teórica 1.1. Álgebra Relacional A álgebra relacional é uma linguagem de consultas procedural. Consiste em um conjunto de operações tendo como operando uma ou duas relações e produzindo, como resultado, uma nova relação. As operações fundamentais na álgebra relacional são seleção, projeção, união, diferença, produto cartesiano. Além dessas operações fundamentais existem algumas outras operações – renomeação, interseção, junção natural, divisão, e atribuição, que são definidas em termos das operações fundamentais. As operações seleção, projeção e renomeação são chamadas de operações unárias, pois operam uma única relação. As outras três operações fundamentais operam um par de relações e são portanto chamadas de operações binárias. 1.1.1. Operação Seleção A operação seleção retorna um subconjunto de tuplas que satisfaçam um determinado predicado, usando a letra grega sigma () para denotar seleção. O predicado aparece subscrito a . O argumento da relação é dado entre parênteses, seguindo o predicado. 3 1.1.2. Operação Projeção A operação projeção é usada para obter determinados atributos de uma relação. A operação é executada em apenas uma relação e o resultado é uma nova relação contendo apenas os atributos especificados, eliminando-se as eventuais duplicidades entre as tuplas. É denotada pela letra grega pi () e são listados, subscritos em , os atributos exibidos no resultado. O argumento da relação vem a seguir entre parênteses. 1.1.3. Operação União A operação de união cria uma relação partindo de outras duas, levando as tuplas comuns e não-comuns a ambas. Desta forma aparecerão no resultado somente linhas únicas de uma ou outra relação e as informações duplicadas aparecerão somente uma vez. A operação somente é possível caso as relações de origem possuam compatibilidade de união, ou seja, possuam o o mesmo grau e atributos correspondentes definidos num domínio comum. Simbologia: Sintaxe: (Relação 1) (Relação 2) 1.1.4. Operação Diferença entre Conjuntos A operação diferença entre conjuntos, denotada por -, permite encontrar as tuplas que estão no primeiro operando, mas não no outro. A operação de diferença não é comutativa. Por exemplo, a operação r-s produz resultado diferente da operação s-r. 4 1.1.5. Operação Produto Cartesiano A operação produto cartesiano permite combinar informações de duas relações quaisquer. No resultado para cada tupla da primeira relação haverá a combinação com todas as tuplas da segunda relação ou vice-versa. Simbologia: x Sintaxe: (Relação 1) x (Relação 2) 1.1.6. Operação Renomeação A operação rename, representada pela letra minúscula grega rho (), permite nominar uma relação com outro nome, permitindo desta forma o uso desta como primeiro e segundo operando de uma operação binária. 1.1.7. Operação de Interseção A relação criada pela operação interseção será o resultado de todas as tuplas que pertençam a ambas as relações presentes na operação. A operação de interseção usa o símbolo entre os nomes das relações envolvidas. Ela é comutativa, isto é, r s é equivalente a s r. Porém, não é uma operação fundamental e não imprime maior poder à álgebra relacional. Simplesmente é mais conveniente escrever r s que r – (r – s). 5 1.1.8. Operação Junção A operação de junção é utilizada para combinar tuplas de duas relações partindo dos atributos comuns a ambas. O resultado conterá os atributos das duas relações que estão participando da junção. A operação é de extrema importância em bancos de dados relacionais, pois é através dela que é permitida a realização de relacionamentos. Simbologia: |x| Sintaxe: (Relação 1) <condição de junção> x (Relação 2) 1.1.9. Operação Junção Natural A operação junção natural é uma operação binária que permite combinar as operações de seleção e produto cartesiano dentro de uma única operação. Isto é representado pelo símbolo de “join” A operação de junção natural gera como resultado uma relação composta por todos os atributos da primeira relação mais os atributos da segunda relação, exceto aqueles usados na cláusula de junção. 1.1.10. Operação Divisão A operação de divisão, simbolizada por , é usada nas consultas nas quais se exige que todos os elementos do divisor estejam presentes no dividendo. Produz como resultado a projeção de todos os atributos da primeira relação 6 exceto aqueles presentes no divisor. Não é um operador primitivo, mas pode ter o resultado obtido por uma combinação de operadores primitivos. 1.2. Visões Não é desejável que todos os usuários vejam o modelo lógico como um todo de um banco de dados. Considerações sobre segurança podem exigir que determinados dados não estejam disponíveis para alguns usuários. Com base nessas questões pode-se desejar criar uma coleção de relações personalizadas que se ajustam mais às necessidades do usuário do que ao modelo lógico. Qualquer relação que não faça parte do modelo lógico mas é visível para o usuário como uma relação virtual é chamada de visão. Uma visão é definida usando o comando create view, seguido do nome da visão e a expressão de consulta em álgebra relacional que define a visão. 1.3. SQL Quando os Bancos de Dados Relacionais estavam sendo desenvolvidos, foram criadas linguagens destinadas à sua manipulação. O Departamento de Pesquisas da IBM, desenvolveu a SQL como forma de interface para o sistema de BD relacional denominado SYSTEM R, início dos anos 70. Em 1986 o American National Standard Institute ( ANSI ), publicou um padrão SQL. Numerosos Sistemas Gerenciadores de Banco de Dados suportam a linguagem SQL. A SQL estabeleceu-se como a linguagem padrão de banco de 7 dados relacional. Embora existam diversas versões, com algumas diferenças entre elas, a estrutura da SQL se mantém inalterada desde a sua criação 1.3.1. As partes da linguagem SQL A linguagem SQL pode ser dividida nas seguintes partes: Data Definition Language (DDL) (Linguagem de Definição de Dados). A SQL DDL fornece comandos para definição e modificação de esquemas de relação, remoção de relações e criação de índices. Os principais comandos que fazem parte da DDL são: CREATE, ALTER, DROP. Data Manipulation Language (DML) (Linguagem de Manipulação de Dados). A SQL DML inclui uma linguagem de consulta baseada na álgebra relacional e no cálculo relacional. Compreende também comandos para inserir, remover e modificar informações em um banco de dados. Os comandos básicos da DML são: SELECT, INSERT, UPDATE, DELETE Data Control Language (Linguagem de Controle de Dados). É o conjunto de comandos que fazem o cadastramento de usuários e determina seu nível de privilégio para os objetos do banco de dados. Os principais comandos são: GRANT, REVOKE. Transactions control (Controle de Transações). A SQL inclui comandos para especificação do início e fim das transações. Diversas implementações 8 permitem o trancamento explícito de dados para o controle de concorrência. (COMMIT, ROLLBACK, SAVEPOINT) 1.3.2. A Linguagem de Definição de Dados (SQL-DDL) A Linguagem de Definição de Dados da SQL (SQL-DDL) é um conjunto específico de instruções SQL que fornece meios para a definição e modificação de esquemas de relação, remoção de relações e criação de índices. 1.3.2.1. Criando Tabelas Uma tabela (ou relação) SQL é definida usando o comando create table: create table r (A1 D1, A2 D2,...,An Dn) onde r é o nome da relação, Ai é o nome de um atributo no esquema da relação r e Di é o tipo do atributo Ai. Exemplo: create table cliente (nome char(30), sexo char(1), CPF number(11), endereço char(30), cidade char(30) ) Uma relação é criada inicialmente vazia. O comando insert pode ser usado para carregar os dados para a relação. Muitos produtos de banco de dados relacionais possuem um grande volume de utilitários para carregar um conjunto inicial de tuplas em uma relação. 9 1.3.2.2. Removendo uma Tabela Para remover uma relação de um banco de dados SQL, usa-se o comando drop table. O comando drop table remove todas as informações sobre a relação. O comando drop table r onde r é o nome de uma relação (tabela) existente. 1.3.2.3. Alterando uma Tabela O comando alter table é usado para adicionar, excluir ou alterar atributos em uma relação existente. Para inserir um novo atributo em uma tabela é usada a cláusula add. Todas as tuplas na relação são assinaladas como null para o valor do novo atributo. alter table r add ( A1 D1, A2 D2, ... ) onde r é o nome de uma relação existente e A1 D1, A2 D2, ... é uma lista contendo nome do atributo (A) a ser adicionado e o tipo do atributo (D), respectivamente. Para excluir colunas de uma tabela utiliza-se a cláusula drop. alter table r drop A1, A2, ... onde r é o nome de uma relação existente e A1, A2, ... é uma lista dos atributos a serem removidos. Para alterar o nome de um atributo de uma tabela utiliza-se a cláusula rename. 10 alter table r rename A NA onde r é o nome de uma relação existente, A é o nome do atributo a ter o seu nome alterado para NA. Para alterar o tipo de um atributo utiliza-se a cláusula modify. alter table r modify A1 D1, A2 D2, ... onde r é o nome de uma relação existente, A 1 D1, A2 D2,... é uma lista contendo o nome do atributo (An) a ter o seu tipo alterado para (Dn). 1.3.2. Linguagem de Manipulação de Dados - DML A principal estrutura da SQL DML consiste em três cláusulas: select, from e where. select A1, A2, A3, ..., An from r1, r2, ..., rm where P onde Ai representa um atributo ri é uma tabela P é um predicado (condição/critério de seleção). Exemplo: select Fcodigo, status from Fornecedor where cidade = ‘Paris’ 11 A condição (ou predicado) que segue where pode incluir operadores de comparação =, <> (diferente), >, >=, < e <=; os operadores booleanos AND, OR e NOT. Exemplo: Select Fcodigo, nome from Fornecedor where cidade = ‘Paris’ and status > 20 A lista A1, A2, ..., An de atributos pode ser substituída por um asterisco (*) para selecionar todos os atributos de todas as relações presentes na cláusula from. Exemplo: select * from Fornecedor Linguagens de consultas formais são baseadas em noções matemáticas de relação. Assim, nunca deveriam aparecem tuplas duplicadas nas relações. Na prática, a eliminação de duplicação é uma relativa perda de tempo. Todavia, a SQL permite duplicações em relações. Nos casos em que queremos forçar a eliminação de duplicações, inserimos a palavra distinct depois de select. Exemplo: select distinct status from Fornecedor A linguagem SQL oferece uma maneira de controlar a ordem que as tuplas de uma relação serão dispostas. A cláusula ORDER BY ocasiona o aparecimento de tuplas no resultado de uma consulta em uma ordem determinada. SELECT A1, A2, ..., An FROM ...r1, r2, ..., rn WHERE ...p 12 ORDER BY A1 [ASC/DESC] A2 [ASC/DESC] ... An [ASC/DESC] Onde An são nomes de atributos que servirão como parâmetro de ordenamento da consulta. A cláusula ORDER BY permite ordenar as linhas do resultado da consulta segundo algum(s) atributo(s) indicado, em ordem crescentes ou decrescente. Quando for necessário utilizar esta cláusula ela sempre deve aparecer na última linha da consulta. Não há limite quanto ao número de atributos utilizados para ordenação. As palavras ASC e DESC determinam se a ordenação será ascendente ou descendente. Caso nada seja especificado, é assumido a ordenação ascendente (ASC). Exemplo: select distinct status from Fornecedor order by status Exemplo: select status, nome from Fornecedor order by status DESC, nome ASC 1.4. Linguagens Formais e Compiladores O processo de compilação de um programa passa por duas partes: a análise e a síntese. A parte da análise divide o programa-fonte nas partes constituintes e 13 cria uma representação intermediária do mesmo. A de síntese constrói o programa-alvo desejado, a partir da representação intermediária. Das duas, a síntese requer as técnicas mais especializadas. A análise do programa-fonte é dividida em três fases: Análise léxica; Análise sintática; Análise semântica. 1.4.1. Analisador Léxico Faz a interface entre o programa-fonte e o compilador. Suas funções básicas são: Ler o programa-fonte; Agrupar caracteres em itens léxicos (tokens), que são identificadores, palavras reservadas da linguagem, constantes numéricas e literais e símbolos especiais; Ignorar elementos sem valor sintático, como espaços em branco, comentários e caracteres de controle; Detectar e diagnosticar erros léxicos, como símbolos inválidos, elementos mal formados, tamanho inválido de constantes, literais e identificadores. 1.4.2. Analisador Sintático Suas funções básicas são: 14 Agrupar tokens em estruturas sintáticas (expressões, comandos, declarações, etc.); Verificar se a sintaxe da linguagem na qual o programa foi escrito está sendo respeitada; Detectar/Diagnosticar erros sintáticos. 1.4.3. Analisador Semântico Suas funções básicas são: Verificar se as construções utilizadas no programa-fonte estão semanticamente corretas; Detectar e diagnosticar erros semânticos; Extrair informações do programa-fonte que permitam a geração de código; Entre as verificações semânticas usuais no programa-fonte estão: Análise de escopo; Variáveis não declaradas; Múltiplas declarações de uma mesma variável; Compatibilidade de tipos; Coerência entre declaração e uso de identificadores; Correlação entre parâmetros formais e atuais; Referências não resolvidas; Procedimentos e desvios. 15 2. Ferramenta Didática para o Ensino de Álgebra Relacional A seguir estão descritas as etapas de desenvolvimento do sistema. 2.1. Desenvolvimento do Compilador Ao receber um comando em álgebra relacional, o sistema o coloca como entrada em um compilador. O comando passa por analisadores léxico, sintático e semântico, e se passar por essa fase é realizada a sua conversão para SQL. Em razão do desenvolvimento do sistema ao mesmo tempo em que está sendo cursada a disciplina de Construção de Compiladores, o cronograma de desenvolvimento do compilador do sistema está condicionado ao aprendizado do desenvolvimento das fases de um compilador na referida disciplina. Para o desenvolvimento do compilador está sendo usado o GALS (Gerador de Analisadores Léxicos e Sintáticos, desenvolvido por Carlos Eduardo Gesser como trabalho de conclusão de curso de Ciências da Computação. Abaixo segue gramática criada para entrada no GALS. A partir dela serão gerados os procedimentos de análise léxica, sintática e semântica em linguagem Pascal, para serem usados em ambiente de desenvolvimento Delphi. A gramática está adaptada para o formato de entrada do GALS de forma que possa ser identificada perfeitamente. Ainda não foi definido o tipo de analisador sintático a ser utilizado dentre os disponíveis no GALS (Descendente Recursivo, LL(1), SLR(1), LALR(1) ou LR(1)), de forma que dependendo do analisador escolhido a gramática ainda precisa de algumas simplificações. 16 GRAMATICA ALGEBRA Vn = { <COMANDO> <REL> <ATRIB> <CONDS> <COND> <COMP> <VALOR> } Vt = { sel "(" relacao ")" uniao "-" "," x jn njn div intr proj ren nome atributo and or "." "=" ">" ">=" "<" "<=" "<>" int bool string flutuante } S = <COMANDO> P={ <COMANDO> ::= <REL> ::= <ATRIB> <CONDS> ::= <CONDS> ")" ; <COND> <COMP> <VALOR> } ::= ::= sel <CONDS> "(" relacao ")" | sel <ATRIB> "(" <REL> ")" | "(" relacao ")" uniao "(" relacao ")" | "(" relacao ")" uniao "(" <REL> ")" | "(" relacao ")" "-" "(" relacao ")" | "(" relacao ")" "-" "(" <REL> ")" | "(" relacao ")" x "(" relacao ")" | "(" relacao ")" x "(" <REL> ")" | "(" relacao ")" njn "(" relacao ")" | "(" relacao ")" njn "(" <REL> ")" | "(" relacao ")" <CONDS> jn "(" relacao ")" | "(" relacao ")" div "(" relacao ")" | "(" relacao ")" intr "(" relacao ")" | proj <ATRIB> "(" relacao ")" | proj <ATRIB> "(" <REL> ")" | ren nome "(" relacao ")" ; sel <ATRIB> "(" relacao ")" | sel <ATRIB> "(" <REL> ")" | "(" relacao ")" uniao "(" relacao ")" | "(" relacao ")" uniao "(" <REL> ")" | "(" relacao ")" "-" "(" relacao ")" | "(" relacao ")" "-" "(" <REL> ")" | "(" relacao ")" x "(" relacao ")" | "(" relacao ")" x "(" <REL> ")" | "(" relacao ")" njn "(" relacao ")" | "(" relacao ")" njn "(" <REL> ")" | "(" relacao ")" <CONDS> jn "(" relacao ")" | "(" relacao ")" div "(" relacao ")" | "(" relacao ")" intr "(" relacao ")" ; ::= atributo | atributo "," <ATRIB> ; "(" <COND> ")" | "(" <COND> and <CONDS> ")" | "(" <COND> or ::= atributo <COMP> atributo | relacao "." atributo <COMP> relacao "." atributo | atributo <COMP> relacao "." atributo | relacao "." atributo <COMP> atributo | atributo <COMP> <VALOR> | relacao "." atributo <COMP> <VALOR> ; "=" | ">" | ">=" | "<" | "<=" | "<>" ; int | bool | string | flutuante ; 2.2. Desenvolvimento da Ferramenta de Manipulação de Relações e Tuplas. Para a execução de comandos em álgebra relacional é preciso que anteriormente sejam criadas relações e inseridas tuplas a serem manipuladas. Essa etapa do desenvolvimento contempla a criação dessas ferramentas. São 17 disponibilizados ao usuário as opções de criar, alterar, visualizar e apagar relações e tuplas. O desenvolvimento está sendo realizado em linguagem Pascal e ambiente de desenvolvimento Delphi. As relações são criadas em forma de tabelas do gerenciador de banco de dados Mysql para Windows. Para acessar o banco de dados Mysql foi instalado o gerenciador na máquina onde está sendo desenvolvido o projeto e o acesso ao banco de dados pelo sistema é feito através de driver ODBC. A escolha do ambiente de desenvolvimento Delphi par o projeto se dá em razão da experiência de uso desde o início do curso e a escolha do banco de dados Mysql se dá em razão da experiência de uso em alguns projetos profissionais e também por ser livre. Essa etapa do desenvolvimento está sendo feita em paralelo com a primeira etapa, uma vez que não depende das informações geradas pelo compilador. 2.3. Desenvolvimento da Interface com o Usuário Nesta etapa será desenvolvido o prompt de comando onde o usuário entra com o comando a ser executado em álgebra relacional. Estarão disponíveis para o usuário as letras gregas usadas nas operações da álgebra, e como as mesmas não estão previstas na gramática criada, cada letra grega usada será convertida em um comando com nome relacionado a cada operação ( σ vira SEL, π vira PROJ, por exemplo). Esses comandos serão usados internamente pelo sistema, não estando disponíveis ao usuário. Os resultados da execução do comando de álgebra relacional será apresentado em um grid e também estará disponível para visualização o 18 meesmo comando convertido para linguagem SQL através do compilador usado internamente pelo sistema. 2.4. Integração dos Módulos do Sistema Cada módulo desenvolvido, descritos nos itens 2.1, 2.2 e 2.3, pode ser desenvolvido separadamente, e após a conclusão de todos os módulos será feita a integração de modo a permitir o perfeito funcionamento do sistema. 2.5. Realização de Testes Com o sistema concluído começa a realização dos testes, realizando as seguintes operações do sistema: Criação de relações; Manipulação de relações (inclusão, alteração e exclusão de atributos); Inclusão de tuplas; Manipulação de tuplas (alteração dos valores dos atributos e exclusão de tuplas); Execução de comandos da álgebra relacional. 19 3. Referência Bibliográfica 1. Silberschatz, Abraham; Kort, Henry F. e Sudarshan, S. Sistema de Banco de Dados. Makron Books, São Paulo, 1999. p. 69-100. 2. Aho, Alfred V.; Sethi, Ravi e Ullman, Jeffrey D. Compiladores, Princípios, Técnicas e Ferramentas. LTC, Rio de Janeiro. Original: inglês.. p. 1-4. 3. Furtado, Olinto José Varela. Transparências das aulas de Linguagens Formais e Compiladores. Departamento de Informática e Estatística, Curso de Bacharelado em Ciências da Computação, UFSC. Cap. 1. 4. Rezende, Ricardo. Álgebra Relacional – Parte I. Linguagem de Consulta Formal. SQL Magazine. Disponível em: < http://www.sqlmagazine.com.br/Colunistas/RicardoRezende/04_AlgebraRel acional_P1.asp> Acesso em 24 nov. 2004. 5. Rezende, Ricardo. Álgebra Relacional – Parte II. Linguagem de Consulta Formal. SQL Magazine. Disponível em: < http://www.sqlmagazine.com.br/Colunistas/RicardoRezende/04_AlgebraRel acional_P2.asp> Acesso em 24 nov. 2004. 6. Cocco, Adriana Pereira. A Linguagem SQL. <http://main.unicruz.edu.br/~adriana/bd/aula11.html> Acesso em 27 maio 2005. 20 7. Cocco, Adriana Pereira. A Linguagem SQL. <http://main.unicruz.edu.br/~adriana/bd/aula12.html> Acesso em 27 maio 2005. 21