Roteiro 9 - SQL Básico: chave estrangeira, operadores de comparação e operadores booleanos Objetivos: Criar restrições para atributos, chaves primárias e estrangeiras; Explorar consultas SQL com uso de operadores de comparação; Explorar consultas SQL com uso de operadores booleanos; Neste roteiro são explorados comandos para a realização de consultas com uso de operadores de comparação e operadores booleanos importantes para a realização de consultas mais complexas onde os dados devem ser filtrados de acordo com critérios específicos do programador. Ferramentas necessárias Navegador, Xampp,Notepad++, console Mysql, Bibliografias de livros da faculdade. Criando Restrições Em SQL, restrições podem ser definidas para as tabelas que forem criadas. Existem restrições de chave e integridade referencial, restrições sobre domínios de atributo e NULLs e restrições sobre tuplas individuais (registros) dentro de uma relação. Restrições de atributo: Como o nome indica, são restrições que podem ser aplicadas aos atributos de uma tabela. Existem algumas restrições que podem ser aplicadas como valores null (NULL), valores padrão e valores (DEFAULT) de checagem (CHECK), que são detalhados a seguir na tabela abaixo: NOT NULL DEFAULT CHECK Se um valor NULL não for permitido isto pode ser especificado através do parâmetro NOT NULL na definição de um campo. Geralmente esta propriedade é definida para campos de chave primária, mas pode ser especificado para quaisquer outros atributos cujos valores não podem ser NULL. Determina um valor padrão para um atributo. O valor padrão será incluído em qualquer registro se um valor explícito não for declarado. Utilizado para limitar valores de atributo ou domínio. Pode ser utilizado para expressar que apenas valores dentro de uma faixa x podem ser utilizados em um campo. NOME VARCHAR(30) NOT NULL CREATE TABLE Y( TPAGTO INT DEFAULT 100 CREATE TABLE Z( TPAGTO INT CHECK(TPAGTO > 0 AND TPAGTO <3) Pág 48
Restrições de chave e integridade referencial: são restrições que podem ser impostas para os atributos para garantir a integridade da informação que será armazenada. Existem as restrições de chave primária (primary key) e de chave segundária (foreign key), as duas propriedades são detalhadas na tabela a seguir: PRIMARY KEY FOREIGN KEY Permite especificar atributos de chave primária em uma tabela. Se o atributo chave for único a restrição pode ser incluída diretamente no atributo, caso contrário deve ser incluído ao final da declaração dos campos ou após através da alteração da tabela. Especifica a criação de uma chave estrangeira. Da mesma forma que a chave primária, esta propriedade pode ser inserida na definição da tabela ou posteriormente através do comando ALTER TABLE. ID_FUNC INT PRIMARY KEY ID_FUNC INT, PRIMARY KEY(ID_FUNC PRIMARY KEY(CAMPO1,CAMPO2,CAMPO3 CREATE TABLE Y( IDCIDADE INT NOT NULL, FOREIGN KEY(IDCIDADE) REFERENCES CIDADE(IDCIDADE) Ações de violação de integridade: uma violação ocorre quando alguma informação inserida ou atualizada em um atributo viola as regras de chave. Quando acontece uma violação de integridade, a ação padrão (default) do SGBD é a de recusar a operação. Porém é possível adicionar ações de comportamento para que sejam executadas, descritas na tabela a seguir: ON DELETE ON UPDATE SET NULL CASCADE Define opções para quando são deletados registros envolvendo chaves estrangeiras. Define opções para quando são atualizados registros envolvendo chaves estrangeiras. Opção para ON DELETE OU ON UPDATE que define que ao ser excluído ou alterado um registro que é referenciado por outras tabelas como chave estrangeira, estas são definidas como NULL. Opção para ON DELETE OU ON UPDATE que define que ao ser alterado um registro que é referenciado por outras tabelas como chave estrangeira, estas são atualizadas juntamente com o novo valor definido. ON DELETE [AÇÃO] ON UPDATE [AÇÃO] ON DELETE SET NULL ON UPDATE CASCADE Pág 49
Nomeando Restrições Uma restrição pode ser nomeada em sua definição com uso da palavra-chave CONSTRAINT. Nomes de restrição precisam ser exclusivos e são importantes por identificarem diferentes restrições no caso de precisarem ser excluídas ou trocadas por outras ao longo da definição do banco de dados. Nomear restrições em bancos de dados é uma tarefa opcional, porém as principais ferramentas CASE de implementação normalmente utilizam nomes em restrições. Exemplo de criação de restrição com uso de CONSTRAINT CONSTRAINT PK_FUNCIONARIO PRIMARY KEY(IDFUNCIONARIO), CONSTRAINT FK_CIDADE_FUNCIONARIO FOREIGN KEY(IDCIDADE) REFERENCES CIDADE(IDCIDADE) ON DELETE SET NULL ON UPDADTE CASCADE; Operadores de comparação A cláusula WHERE introduz um potencial maior para as buscas de informações. Permite que seja possível escolher quais linhas são restauradas de uma declaração SELECT. É utilizado para restaurar linhas que combinem uma condição, como ter um valor de coluna que combine exatamente com uma string, um número maior ou menor que um valor, ou uma string que é o prefixo de outra. A seguir são demonstrados os operadores de comparação sendo utilizados em conjunto com a cláusula WHERE. Operadores de Comparação Os operadores de comparação a serem utilizados em uma consulta SQL são os mesmos utilizados na maioria das linguagens de programação, e permitem que uma consulta possa ser executada de forma muito mais poderosa para a seleção de informações em tabelas. Os operadores de comparação são descritos a seguir: SELECT campos FROM tabela WHERE argumentos Comando Função Exemplo = < > <= >= <> igual a entre dois campos. menor que entre dois campos ou maior que entre dois campos ou maior que entre dois campos ou menor que entre dois campos ou diferente de SELECT * FROM dados WHERE nome = joão SELECT * FROM funcionario WHERE salario < 1000 SELECT * FROM cidade WHERE populacao > 20000 SELECT * FROM cidade WHERE populacao >= 20000 SELECT * FROM aluno WHERE nota >= 7 SELECT * FROM pessoa WHERE sexo <> masculino Pág 50
Operadores Booleanos Os operadores de condição são úteis para combinar duas ou mais condições utilizando os operadores booleanos AND, OR e NOT. Permite unir critérios de pesquisa diferentes na mesma consulta, podemos utilizar a conjunção AND e separar critérios diferentes, por exemplo. Operadores AND, OR e NOT A seguir são detalhados os operadores de combinação que podem ser utilizados em conjunto nas consultas com uso do SELECT em conjunto com a cláusula WHERE. Comando Função Exemplo AND Restringe os resultados para as linhas que possuem ambas as condições. SELECT * FROM dados WHERE nome = joão and salario > 3000 SELECT campos FROM tabela WHERE argumentos OR Restringe os resultados para as linha que atendam pelo menos uma das condições. SELECT * FROM funcionario WHERE salario < 1000 or nome >= G NOT Nega uma declaração Booleana. SELECT * FROM funcionario WHERE NOT (salario >1000 and salario < 5000) Tarefas Utilizando o script de criação disponível em http://187.7.106.14/andre/ads/proj_bd/2012-2/roteiros/roteiro9-chavesrestricoes/roteiro9-definicao-dados.sql, crie o banco de dados em seu servidor Mysql para uso nas tarefas do roteiro. 1) Crie as chaves estrangeiras utilizando uma CONSTRAINT nomeada com o prefixo FK_TABELAORIGEM_TABELADESTINO para as seguintes tabelas a. Movimento navio; b. Navio; c. Porto; d. Porto_visitado; 2) Altere o script de criação e Insira uma restrição de atributo para o campo TIPO_NAVIO.CAPACIDADE_PESO para que não aceite valores inferiores a 20000. Insira um novo registro de tipo de navio e teste o resultado da restrição feita. 3) Insira no script de todas as tabelas criadas para a chave primária a ação de violação de integridade ON UPDATE com CASCADE e ON DELETE para SET NULL; 4) Crie uma consulta para selecionar todos os portos Localizados em Salvador; 5) Crie uma consulta para selecionar todos os tipos de navios com capacidade maior do que 30000 e casco unico; 6) Crie uma consulta para selecionar todos os navios onde o proprietário seja Sergen & Terres OU o tipo seja Graneleiro; 7) Crie uma consulta para selecionar todos os navios onde o proprietário seja Sergen & Terres E o tipo seja Graneleiro; 8) Crie uma consulta para selecionar os navios onde o proprietário seja Maritimus E o tipo seja Graneleiro OU o tipo seja Quimico. 9) Crie uma consulta que liste todos os nomes dos navios que visitaram o porto com o nome de Porto de Santos; Pág 51
10) Crie uma consulta que liste todos os nomes dos navios e a data de inicio onde a data de inicio seja superior a 13 de setembro de 2011; Referências Elmasri, Navathe Sistemas de banco de dados 6ª Edição; Introdução a Banco de dados, Osvaldo Kataro Tokai, disponível em http://pt.scribd.com/doc/50780287/bd; Apache Friends Home page - http://www.apachefriends.org/pt_br/xampp-windows.html#2287 Notepad++ Home page - http://notepad-plus-plus.org/ Pág 52