UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas Roteiro 7 – Comandos SQL Parte 1: Criação e manutenção de tabelas Objetivos: • • • Detalhar características da linguagem SQL; Explorar o uso da linguagem SQL no banco de dados Mysql; Manipular a linguagem DDL e DML através da console de comandos; Este roteiro tem como objetivo explorar o uso da linguagem SQL através do uso da console Mysql serão detalhados comandos básicos para a criação de tabelas e bancos de dados e também comandos para a manipulação de informações existentes em tabelas de dados; Ferramentas necessárias Navegador, Xampp,Notepad++, Bibliografias de livros da faculdade. Quando os bancos de dados relacionais estavam sendo desenvolvidos, foram criadas linguagens destinadas à sua manipulação. O Departamento de Pesquisas da IBM, desenvolveu a Sequel como forma de interface para o sistema de BD relacional denominado SYSTEM R, no início dos anos 70. Esta linguagem foi evoluindo de nome e seu nome foi mudado para SQL (Structured Query Language – Linguagem de Consulta Estruturada). Em 1986 o American National Standards Institute (ANSI) e a International Standards Organization (ISO) publicaram os padrões para o SQL, chamado SQL-86. Em 1989 foi publicada uma extensão chamada SQL-89. Atualmente os sistemas que dão suporte a SQL estão baseados pelo menos nos recursos do SQL-89.A versão mais amplamente suportada é a SQL-92. A última publicação define o SQL-3. O SQL apresenta uma série de comandos que permitem a manipulação de estruturas de dados, manipulação dos dados, definição de restrições de segurança, são estas partes: • • • • • DDL(Data Definition Language) – Linguagem de Definição de dados DML (Data Manipulation Language) – Linguagem de Manipulação de Dados Embedded DML (Incorporação DML) – Comandos SQL para serem usados em linguagens gerais (PHP, JAVA, Python) Definição de Views – Definição de visões de dados Controle de Transações Para controlar e disponibilizar as informações de bancos de dados será utilizado inicialmente o SBGD Mysql, que está embutido no aplicativo integrado XAMPP, disponível no endereço http://187.7.106.14/andre/softwares/xampp/xampp-win321.7.4-VC6-installer.exe. Para o banco de dados, o xampp utiliza uma pasta em sua estrutura denominada Mysql, e para o servidor web utiliza a estrutura contida no Apache, a pasta htdocs.A figura a seguir detalha a estrutura de diretórios utilizada pelo XAMPP quando é descompactado no disco. Figura 17 - Estrutura de diretórios do XAMPP P á g | 39 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. Introdução UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas Utilizando a console Mysql Para realizar logar no Mysql via console é necessário possuir um usuário com privilégios de root para realizar as tarefas de criação, visualização e alteração de bancos de dados, a seguir um exemplo de login utilizando o usuário máster do SGBD Mysql, o usuário root: c:\xampp\mysql\bin\mysql -u root –p O primeiro contato que teremos será o prompt mysql para utilizar nossos comandos: Geralmente inicia-se a manutenção de bancos de dados com uso dos comandos DDL (data definition language) e DML (Data Manipulation language), são demonstrados a seguir os comandos mais comuns que podem ser utilizados: Comando Função Executa um arquivo .SQL no formato Exemplo de uso SOURCE d:\comandos-SQL.sql SOURCE SOURCE caminhoArquivo SHOW DATABASES; Visualiza todos os bancos de dados disponíveis no SGBD; CREATE DATABASE nomedb Cria uma nova base de dados. USE nomedb Faz com que seja escolhida uma nova database nos bancos de dados existentes no servidor Mysql. SHOW DATABASES; CREATE DATABASE ANDRE; USE ANDRE; CREATE TABLE SENAC( CREATE TABLE nometable (CAMPO1 TIPODADOS, CAMPO2 TIPODADOS...); Cria uma nova tabela no servidor de banco de dados, tem a possibilidade de apenas criar a tabela e também de inserir valores na mesma. id int, nome varchar(30) ); DROP TABLE nometable Apaga uma tabela do sgbd. DROP TABLE SENAC; DROP DATABASE nomedb Apaga uma base de dados do sgbd. DROP DATABASE ANDRE; DESC nometable Descreve a estrutura de uma tabela do sgbd. DESC SENAC; INSERT INTO nometable (campo1,campo2) values (valor1,valor2) Insere informações em uma tabela na ordem em que forem definidos. INSERT INTO SENAC(id,nome) VALUES(1,’andré moraes’); P á g | 40 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. COMANDOS DDL/DML UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas SELECT campos FROM nometable Realiza uma consulta de valores existentes em uma tabela. WHERE condicao Adiciona na consulta uma condição. ORDER BY nomecampo Adiciona na consulta uma ordenação dos valores retornados. SELECT * FROM SENAC ORDER BY NOME; Sai da console mysql EXIT; EXIT SELECT * FROM SENAC; SELECT * FROM SENAC WHERE ID =1; 1) Realizar o download do XAMPP para o seu desktop a partir do endereço http://187.7.106.14/andre/softwares/xampp/xampp-win32-1.7.4-VC6-installer.exe, descompactá-lo e iniciar o servidor de banco de dados e o servidor HTTP Apache server; 2) Iniciar o prompt de comandos do Windows, acessar o diretório bin do mysql, localizado em xampp\mysql\bin e realizar o login como usuário root; 3) Listar todos os bancos de dados existentes no SGBD; 4) Criar um novo banco de dados com o nome bd_aluno; 5) Abra o software notepad ++(http://187.7.106.14/andre/softwares/notepad++/npp.5.9.3.bin.zip), modifique a linguagem utilizada para SQL e utilize-o para criar um script com as tabelas descritas abaixo, salve o script com o nome de roteiro-7-script1.sql Tabela: computador Campo Tipo ID INT NOME VARCHAR(50) MEMORIA DOUBLE DISCO DOUBLE MONITOR VARCHAR(15) 6) Execute o script no console, copiando o script e colando diretamente na console; 7) Altere o script criado e inclua o comando drop table [nometabela], precedendo cada tabela criada. Rode o script completo novamente na console. 8) Altere o script criado e inclua os comandos necessários para inserir 3 computadores, com dados à sua escolha; 9) Diretamente na console aplique um select para selecionar todos os computadores da tabela computadores; 10) Diretamente na console, aplique um select para selecionar apenas os computadores onde o ID seja 2; 11) Altere o script de criação de tabelas, e inclua mais duas tabelas, descritas a seguir: Tabela: pessoa Campo Tipo P á g | 41 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. Tarefas UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas ID INT NOME VARCHAR(50) ENDERECO VARCHAR(70) CIDADE VARCHAR(20) Tabela: cidade Campo Tipo ID INT NOME VARCHAR(50) ESTADO VARCHAR(2) 12) Altere o script criado para inserir mais 3 pessoas, 3 cidades e 3 computadores. 13) Aplique um select para selecionar todas as cidades; 15) Descreva a tabela pessoa; 16) Delete cada tabela criada no banco de dados; 17) Visualize as tabelas do banco de dados para confirmar a exclusão das mesmas; 18) Delete o banco de dados; 19) Visualize os bancos de dados existentes para confirmar a exclusão do banco; 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 | 42 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. 14) Aplique um select para selecionar todas as pessoas; UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas Roteiro 8 – Comandos SQL parte 2: Comandos DDL Objetivos: • • Adicionar chaves primárias em tabelas de dados; Utilizar comandos DDL para alteração de estruturas de bancos de dados Neste roteiro são utilizados comandos para realizar a manipulação nas estruturas de bancos de dados que são importantes para modificar ou adicionar componentes as tabelas de bancos de dados. Ferramentas necessárias Navegador, Xampp,Notepad++,console Mysql, Bibliografias de livros da faculdade. Introdução Alterar a estrutura de tabelas é uma tarefa bastante importante na administração de bancos de dados. A estrutura das tabelas pode ser alterada a qualquer momento que se desejar através dos comandos fornecidos pelo SGBD. Serão exploradas algumas das tarefas comuns na manipulação de estruturas de tabelas em bancos de dados. No comando criado, temos de atentar aos itens: NOT NULL, DEFAULT NULL, PRIMARY KEY. • • • NOT NULL – define que o campo não poderá ser definido com valores vazios; DEFAULT NULL – define como valor padrão o NULL; PRIMARY KEY(nome_campo) – Define que o campo mencionado no comando será utilizado como chave primária dentro da estrutura das tabelas. P á g | 43 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. Adicionando Chaves primárias: Para adicionar uma chave primária na definição de uma tabela de dados é suficiente a adição do comando primary key(nome-campo). Exemplo de criação de chave primária para uma tabela contatos: UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas ALTERANDO A ESTRUTURA DE TABELAS Estruturas de tabelas podem ser alteradas através do comando ALTER TABLE. Este comando, como o nome indica, realiza uma alteração na tabela para que seja possível inserir, alterar ou remover colunas de dados. A seguir um exemplo de coluna sendo adicionada: ALTER TABLE DRINKS ADD COLUMN ID_DRINK INT NOT NULL AUTO_INCREMENT FIRST; Indica que a nova coluna a ser inserida ocupará a primeira coluna na tabela de dados a qual estamos inserindo este novo campo, ou seja, o FIRST é a cláusula que permite realizar esta inclusão em primeiro. No comando anterior foi feita a inserção de uma nova coluna denominada id_drink com os parâmetros INT, NOT NULL, AUTO_INCREMENT e FIRST. Sendo que com isso informamos que o campo será do tipo inteiro, não vazio, será incrementado automaticamente e será posicionado como a primeira coluna da tabela. EXEMPLO DE ALTERAÇÃO DE COLUNA: Incluir uma coluna em uma tabela DRINKS com o nome de nota. A coluna será posicionada após a coluna de preço. RENOMEANDO UMA TABELA CRIADA ANTERIORMENTE: Para renomear uma tabela criada anteriormente é possível utilizar o comando ALTER TABLE juntamente com o comando RENAME TO Exemplo de renomeação de tabela BEBIDAS para INGREDIENTES. ALTERANDO NOMES DE CAMPOS DE UMA TABELA: Para alterarmos um campo podemos utilizar o comando ALTER TABLE seguido do comando CHANGE COLUMN. Exemplo de modificação do nome da coluna NOME para DESCRICAO. P á g | 44 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. ALTERANDO UMA TABELA PARA ADICIONAR UMA CHAVE PRIMÁRIA: É possível que uma tabela seja alterada para incluir um novo campo e adicionarmos nossa chave primária, para tanto é utilizado o comando ALTER TABLE. UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas OBSERVAÇÕES: O cuidado ao alterar colunas de tabelas se deve ao tipo de dados e tamanhos escolhidos. Se alterarmos um tipo de uma coluna para um tipo que não é compatível com o anterior, os dados serão perdidos. Caso a alteração seja feita para dados compatíveis, porém de menor tamanho, os dados serão reduzidos para adaptarem-se ao novo tamanho. ALTERANDO APENAS OS TIPOS DE DADOS DE UM CAMPO: Quando for necessário alterar o tipo de dado de uma coluna específica, podemos também utilizar o comando MODIFY campo NOVO_TIPO; EXEMPLO: Modificando o tipo de dados do campo DESCRICAO para VARCHAR(100); A diferença do comando MODIFY para o comando CHANGE se dá no fato de não estarmos modificando o nome e tipo de dados da coluna, e sim apenas o tipo de dados. Tarefas 1) Preencher a tabela de comandos abaixo com uma descrição, baseado no seu exemplo de uso. Todos os comandos listados a seguir devem ser executados sempre precedidos do comando ALTER TABLE [NOMETABELA] Comando ADD COLUMN [nomecoluna] [TIPO] [PARÂMETROS] Função Exemplo de uso ALTER TABLE X ADD COLUMN NOME VARCHAR(30); ALTER TABLE X RENAME TO [nometabela] RENAME TO Y; ALTER TABLE Y LAST ADD COLUMN ZZZ INT LAST; ALTER TABLE Y BEFORE ADD COLUMN AAA INT BEFORE BBB; ALTER TABLE Y AFTER ADD COLUMN CCC INT AFTER BBB; ALTER TABLE Y FIRST ADD COLUMN CHAVE INT FIRST; ALTER TABLE Y AUTO_INCREMENT ADD COLUMN CHAVE2 INT AUTO_INCREMENT; ALTER TABLE Y CHANGE COLUMN CHANGE COLUMN CHAVE2 CHAVEPRINCIPAL INT; TRUNCATE TABLE TRUNCATE TABLE Y; P á g | 45 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. Comandos para alteração de estrutura de tabelas UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas 2) 3) Criar um script para gerar a tabela no formato e com as informações a seguir: COR ANO FABRICANTE MOD_ VALORDECUSTO Prata 1998 Porsche Boxter 17992.540 NULL 2000 Jaguar XJ 15995 Vermelho 2002 Cadillac Escalade 40215.9 A tabela possui um planejamento pouco eficaz, pois possui várias falhas. Utilizando o comando ALTER TABLE gere o script para a modificação da tabela acima para que no formato da tabela a seguir: CARRO_ID CHASSI FABRICANTE MODELO COR ANO VALOR 1 RNKLK66N33G213481 Porsche Boxter Prata 1998 17992.54 2 SAEDA44B175B04113 Jaguar XJ NULL 2000 15995.00 3 3GYEK63NT2G280668 Cadillac Escalade Vermelho 2002 40215.90 • • • • • • • ALTER TABLE RENAME TO ADD COLUMN ADD PRIMARY KEY CHANGE COLUMN MODIFY COLUMN UPDATE; RESULTADO FINAL: 4) Alterar a coluna FABRICANTE para que tenha o tipo varchar(50) e fique em último lugar na tabela; 5) Criar uma tabela DONO, que representará os donos dos veículos. Nesta tabela inclua os campos cpf, nome, telefone, cidade. 6) Insira 3 donos de veículos preenchendo todas as informações da tabela dono; 7) Adicione outra coluna na tabela dono com o nome ID_DONO para que fique na esquerda da tabela, antes de todas as colunas, e fique com a propriedade auto_increment e primary key definidas. 8) Altere o nome da tabela DONO para PESSOA; 9) Zere todos os registros da tabela PESSOA; 10) Insira novamente os registros que foram excluídos na tabela dono, copiando novamente o seu script na console; 11) Adicione uma nova coluna na tabela PESSOA com o nome ID_VEICULO, e insira 3 novos registros completos de donos com ID’S de VEICULOS; P á g | 46 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. COMANDOS SUGERIDOS PARA SEREM UTILIZADOS: UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas 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/ Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. • P á g | 47 UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas 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 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: Restrição Descrição Exemplo de uso NOT NULL 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. CREATE TABLE X( NOME VARCHAR(30) NOT NULL ); DEFAULT 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. CREATE TABLE Y( TPAGTO INT DEFAULT 100 ); CHECK 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. CREATE TABLE Z( TPAGTO INT CHECK(TPAGTO > 0 AND TPAGTO <3) ); P á g | 48 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. 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. UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas 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: Restrição Descrição Exemplo de uso PRIMARY 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. CREATE TABLE X( ID_FUNC INT PRIMARY KEY ); CREATE TABLE X( ID_FUNC INT, PRIMARY KEY(ID_FUNC); ); PRIMARY KEY(CAMPO1,CAMPO2,CAMPO3); FOREIGN KEY 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. CREATE TABLE Y( IDCIDADE INT NOT NULL, FOREIGN KEY(IDCIDADE) REFERENCES CIDADE(IDCIDADE) ); Restrição Descrição Exemplo de uso ON DELETE Define opções para quando são deletados registros envolvendo chaves estrangeiras. ON UPDATE Define opções para quando são atualizados registros envolvendo chaves estrangeiras. SET NULL 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. CREATE TABLE X( ... FOREIGN KEY (IDCIDADE) REFERENCES CIDADE(IDCIDADE) ON DELETE SET NULL ); CASCADE 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. CREATE TABLE X( ... FOREIGN KEY (IDCIDADE) REFERENCES CIDADE(IDCIDADE) ON UPDATE CASCADE ); CREATE TABLE X( ... FOREIGN KEY (IDCIDADE) REFERENCES CIDADE(IDCIDADE) ON DELETE [AÇÃO] ); CREATE TABLE X( ... FOREIGN KEY (IDCIDADE) REFERENCES CIDADE(IDCIDADE) ON UPDATE [AÇÃO] ); P á g | 49 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. 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: UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas 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 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: Comando SELECT campos FROM tabela WHERE argumentos Função Exemplo = Insere um operador de comparação “igual a” entre dois campos. SELECT * FROM dados WHERE nome = “joão” < Insere um operador de comparação “menor que” entre dois campos ou expressões. SELECT * FROM funcionario WHERE salario < 1000 > Insere um operador de comparação “maior que ”entre dois campos ou expressões. SELECT * FROM cidade WHERE populacao > 20000 <= Insere um operador de comparação “maior que” entre dois campos ou expressões. SELECT * FROM cidade WHERE populacao >= 20000 >= Insere um operador de comparação “menor que ”entre dois campos ou expressões. SELECT * FROM aluno WHERE nota >= 7 <> Insere um operador de comparação “diferente de” SELECT * FROM pessoa WHERE sexo <> “masculino” P á g | 50 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. 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. UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas 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 Comando SELECT campos FROM tabela WHERE argumentos 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 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 FK_TABELAORIGEM_TABELADESTINO para as seguintes tabelas a. b. c. d. nomeada com o prefixo Movimento navio; Navio; Porto; 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, a restrição para 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 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. 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. UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas 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; 11) Utilizando o operador NOT, crie uma consulta para listar todos os navios que não estiveram no porto de Santos. 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/ Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. • P á g | 52 UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas Roteiro 10: Consultas com várias tabelas/Operadores de busca Objetivos: • • • • Criar consultas utilizando várias tabelas; Explorar as funcionalidades de selects em várias tabelas utilizando a notação tabela.campo e a cláusula AND; Explorar as funcionalidades de selects em várias tabelas utilizando INNER JOIN; Fazer uso dos operadores de busca em consultas; Neste roteiro são explorados comandos para a realização de consultas em várias tabelas, que são importantes para que seja possível reunir informações onde existam tabelas relacionadas. São explorados os métodos de relacionamento com uso da cláusula AND e também com o uso do operador INNER JOIN (consulta interna), Ferramentas necessárias Navegador, Xampp,Notepad++, console Mysql, Bibliografias de livros da faculdade. Introdução Selects em várias tabelas A forma básica do comando SELECT é também chamada de mapeamento ou bloco select-from-where, onde: • SELECT <lista atributos>: lista de nomes de atributo cujos valores devem ser recuperados pela consulta. • FROM <lista tabelas>: lista dos nomes de tabelas (relação) exigidos para processar a consulta. • WHERE <condição>: expressão condicional (booleana) que identifica as tuplas (linhas) a serem recuperadas pela consulta. Os operadores possíveis de utilizar em consultas são os já vistos no roteiro 08 (http://187.7.106.14/andre/ads/proj_bd/aulas/roteiros/ROTEIRO-8/ROTEIRO-8-ADS_PROJ_BD.pdf) e podem ser combinados de diversas formas para se obter os resultados desejados. Exemplo de select com três tabelas: SELECT CAMPO1, CAMPO2, CAMPO3 FROM TABELA_A, TABELA_B, TABELA_C WHERE TABELA_A.CAMPO1 = TABELA_B.CAMPO2 AND TABELA_B.CAMPO10=TABELA_F.CAMPO20 AND TABELA_C.CAMPO2=TABELA_X.CAMPO30 ; Neste caso o resultado das consultas ficará restrito às condições explicitadas serem TRUE, caso contrário a listagem solicitada não é exibida. Consulta Interna (INNER JOIN) É uma técnica utilizada para realizar a chamada tabela de junção e foi criada para permitir aos usuários especificar uma tabela resultante de uma operação de junção na cláusula FROM de uma consulta. Geralmente é mais fácil de compreender este tipo de consulta do que inserir todas as condições de seleção e junção no WHERE, uma vez que fica claro quais critérios estão realizando junções e quais estão realizando critérios de pesquisa. Existem alguns tipos de junção que podem ser utilizados, porém o modo padrão de junção de tabelas é chamado de INNER JOIN, onde a tupla é incluída no resultado somente se uma tupla combinar com os os critérios da outra tabela. P á g | 53 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. Em um banco de dados relacional é comum trabalhar com tabelas diferentes. As consultas SQL podem ser muito simples até muito complexas, e inicialmente é muito comum utilizar consultas que faça a união entre tabelas diferentes com uso do SELECT FROM WHERE em sua forma básica. UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas Exemplo de utilização de consulta com INNER JOIN SELECT TABELA_A.CAMPO1, TABELA_A.CAMPO2, TABELA_B.CAMPO3 FROM TABELA_A INNER JOIN TABELA_B ON TABELA_A.CAMPO1 = TABELA_B.CAMPOX ; Dica: A ordem em que são feitas as junções não importa nas consultas, o SQL executa a consulta de forma não procedural, então se for realizar uma consulta onde são realizadas junções com mais de 2 tabelas a ordem das junções não modificará o resultado final. Utilizando Operadores de Busca Os operadores de busca podem ser úteis para que seja possível substituir caracteres ou expressões em uma cláusula SELECT. Veremos os operadores LIKE, o operador % e o operador BETWEEN, que podem auxiliar um SELECT quando for necessário. Utilizando Operadores de Busca Coringa SELECT campos FROM tabela WHERE argumentos Função LIKE Utilizada somente com Strings, permite representar combinações possíveis da string que estiver sendo pesquisada. Normalmente realizada para pesquisa linhas onde exista a ocorrência de uma string. % Permite representar uma parte da string, é utilizada em conjunto do comando LIKE. BETWEEN Semelhante ao AND, define um intervalo de dados definido que pode ser utilizado em uma consulta. _ (under line) Permite combinar exatamente um caractere desconhecido utilizado para representar qualquer combinação possível na cláusula LIKE. Exemplo SELECT * FROM dados WHERE nome LIKE “joão” SELECT * FROM funcionario WHERE nome LIKE “%a” AND nome LIKE “a%” SELECT * FROM funcionario WHERE salario BETWEEN 1000 and 5000 SELECT * FROM funcionário WHERE nome LIKE “R___%” Alias Os nomes de campos utilizando a notação de ponto (TABELA.CAMPO1) são utilizados para qualificar um nome completo de um campo, e pode ser utilizado sempre que quiser para evitar a ambiguidade nos nomes de campos de tabelas diferentes. Outra forma de resolver este problema é com a implementação de ALIAS (apelidos) que são dados às tabelas quando necessário. Exemplo de utilização de alias: P á g | 54 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. Comando UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas SELECT F.ID, F.NOME, E.NOME FROM FUNCIONARIO AS F, EMPRESA AS E WHERE F.idEmpresa = E.id ; Eliminando duplicatas Como o resultado de consultas é tratado pelo sql como um multiconjunto, desta forma é comum o aparecimento de tuplas duplicadas, que em muitos casos é necessário eliminá-las com uso do operador DISTINCT. Exemplo de utilização de distinct: Selecionando todos valores de salários pagos na empresa SELECT DISTINCT salario FROM funcionario; Ordenando consultas Exemplo de uso do ORDER BY SELECT nome,endereco,cidade,salario FROM funcionário ORDER BY salario; Tarefas Utilizando o arquivo disponível em representado pela modelagem abaixo, execute as seguintes tarefas em SQL: 1) Utilizando o arquivo da modelagem disponível em http://187.7.106.14/andre/ads/proj_bd/2012-2/roteiros/roteiro10inner-operadores/roteiro-6-bdcinemas.mwb, abra a modelagem no workBench e através da aba Inserts do workBench insira os dados para as tabelas ator, filme, sessão, cidade, cinema, cinemaPassaFilme, participaFilme. Um exemplo de alguns dos dados para serem inseridos é demonstrado na figura abaixo: 2) Aplique as seguintes modificações no modelo do workBench: P á g | 55 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. Ao realizar consultas onde a listagem das tuplas resultantes seja extenso é interessante ordenar os elementos através de uma das colunas utilizadas, isto pode ser feito através do uso do comando ORDER BY, inserido ao final da seleção dos campos utilizado na consulta. UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas Remover as cláusulas NOT NULL para todas as tabelas; b. Aplicar o Forward Engineer ativando a geração de INSERT’S nas tabelas; Realize as seguintes consultas utilizando o INNER JOIN para realizar junções entre tabelas diferentes. Caso alguma consulta não possa ser realizada adapte a modelagem para atender aos critérios e execute novamente o Forward Engineer: a. Selecionar todos os filmes juntamente com os seus gêneros, ordenando por gênero; b. Selecione todos os filmes com duração entre 100 e 190 minutos; c. Selecione todos os filmes onde o ator “Chuck Norris” e a atriz “Julia Roberts” estiverem participando; d. Selecionar todos os nomes de atores e os nomes dos filmes em que trabalharam ordenando pelo nome dos filmes; e. Selecionar todos os filmes que estão passando em todos os cinemas, organizando pelo título do filme; f. Selecione os nomes de filmes que comecem com “O’’ ou “L” e que terminem com “A”. g. Selecione o nome, a duração e nome do cinema que estiver passando os filmes que forem do gênero TERROR e que tenham duração até 120 minutos; h. Selecione o nome, o gênero e a duração dos filmes que não tenham o gênero “Terror”; i. Selecionar todos os cinemas com o nome de todas as sessões atualmente em cartaz; j. Selecionar todos os filmes em que um determinado ator trabalhou; k. Selecione todos os nomes, duração e gênero dos filmes brasileiros. l. Selecionar todos os nomes e gêneros dos filmes que estão em cartaz atualmente; m. Selecionar o nome do cinema, título em português, o título original, o gênero, o diretor dos filmes que estão em cartaz na cidade de pelotas; n. Selecione o nome, a duração, e o gênero de todos os filmes exceto os filmes de drama e comédia; 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 | 56 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. 3) a. UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas Roteiro 11: SubConsultas Objetivos: • • • • Explorar as propriedades de subConsultas; Explorar propriedades de ordenação de informações; Atualizar informações de tabelas com uso de operações diversas; Converter dados de saída com uso do cast; Neste roteiro são explorados comandos para a realização de subconsultas, que são importantes para criar consultas avançadas e que possam sanar maiores necessidades de consultas sql. Também são exploradas propriedades de ordenação e atualização de informações em tabelas que são úteis para a manutenção de bases de dados e tabelas. Ferramentas necessárias Navegador, Xampp,Notepad++, console Mysql, Bibliografias de livros da faculdade. Introdução Algumas consultas necessitam que os valores existentes no banco de dados sejam buscados e depois utilizados em uma condição de comparação. Estas consultas podem ser formuladas com o uso de subconsultas ou consultas aninhadas. É possível utilizar subconsultas quando desejamos buscar valores que não podem ser encontrados apenas com uma única consulta. Este tipo de consulta pode ser implementada com o uso de blocos select-from-where completos dentro da cláusula WHERE de outra consulta. Uma maneira de utilizar uma consulta interna inicialmente é com o uso do operador IN, que compara um valor com um conjunto de valores ao mesmo tempo. Exemplo básico de consulta com uso do operador IN: SELECT filme.tituloOriginalFilme,genero.nomeGenero from filme,genero WHERE filme.generoFilme = genero.idGenero AND genero.nomeGenero IN('Suspense','Comedia',’Drama’,’Terror’,’Acao’) ORDER BY genero.idGenero; Neste caso estamos procurando vários gêneros ao mesmo tempo, os que se adaptarem a nossa consulta serão retornados a tela. Mas a subconsulta, na verdade tem como objetivo principal reduzir o que estamos digitando e unificar uma pesquisa unindo duas consultas em uma só. Tudo o que temos a fazer é substituir uma parte da consulta anterior pelo que podemos chamar de subconsulta: Exemplo melhor elaborado de consulta com operador IN: SELECT filme.tituloOriginalFilme,genero.nomeGenero from filme,genero WHERE filme.generoFilme = genero.idGenero AND genero.nomeGenero IN(SELECT genero.nomeGenero,filme.duracaoFilme genero) ORDER BY genero.idGenero; from É possível ainda combinar vários tipos de consultas internas incluindo a maioria dos operadores utilizados em consultas e também mais de uma coluna, desde que sejam respeitadas a quantidade de colunas da cláusula e do resultante do que resultar do select mais interno. P á g | 57 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. Consultas Aninhadas UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas Operadores para subconsultas São operadores que podem ser explicitados nas consultas com subconsultas e consultas onde os argumentos são relacionados(consultas correlacionadas), a tabela a seguir descreve os operadores mais comuns que podem ser utilizados: Utilizando Operadores em SubConsultas Função IN SELECT campos FROM tabela WHERE argumentos Compara um valor v com um conjunto de valores V e avalia como TRUE se v for um dos elementos em V. Verifica se o resultado de uma consulta aninhada correlacionada é vazio (não contém registros) ou não. EXISTS Exemplo SELECT filme.tituloOriginalFilme,genero.nomeGenero from filme,genero WHERE filme.generoFilme = genero.idGenero AND genero.nomeGenero IN('Suspense','Comedia',’Drama’,’Terror’,’Acao’) ORDER BY genero.idGenero; -- seleciona filmes apenas dos gêneros listados SELECT f.tituloOriginalFilme FROM filme as f WHERE EXISTS(SELECT cipf.cinema_idCinema from cinema_passa_filme as cipf WHERE cipf.filme_idFilme = f.idFilme); -- seleciona os filmes que já passaram; Retorna TRUE se o resultado da consulta aninhada tiver ao menos um registro e FALSE se não houverem registros. OBSERVAÇÕES: É possível combinar os dois operadores de subconsultas com os demais operadores já utilizados (NOT, AND), e inclusive com o próprio IN ou EXISTS na mesma consulta. Ordenando Informações Em um banco de dados relacional, as linhas de uma tabela formam um grupo, não há ordem intrínseca entre as linhas e então temos de pedir ao MySQL para classificar os resultados se os desejarmos em uma ordem em particular. A tabela a seguir demonstra as maneiras de ordenar a informação recuperada em selects. Ordenando Listagens crescente e decrescente Alguns comandos utilizados em conjunto com a cláusula ORDER BY podem fazer com que a listagem retornada de uma consulta possa ser diferente do esperado, para tanto, existem operadores que podem ser combinados para alterar os resultados obtidos em listagens de dados. Comando Função Exemplo SELECT campos FROM tabela WHERE argumentos ORDER BY coluna DESC Classifica uma coluna em ordenação decrescente. ASC Classifica uma coluna em ordenação crescente, é o padrão de um ORDER BY quando não é informada nenhuma ordenação. SELECT nome FROM drinks ORDER BY nome DESC; SELECT nome FROM drinks ORDER BY nome ASC; P á g | 58 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. Comando UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas ATUALIZANDO DADOS EM TABELAS: Os dados das tabelas existentes no banco de dados podem ser modificados caso necessite. Normalmente são tarefas rotineiras do banco de dados atualizas as informações existentes em nossas tabelas. Para isso, podemos utilizar o comando UPDATE (atualizar). Atualizando dados em tabelas O UPDATE pode utilizar todos os parâmetros utilizados em consultas comuns no SQL criado. Podendo inclusive realizar a alteração de várias linhas de tabelas por vez. Comando UPDATE tabela SET novo_valor WHERE condições Função Altera dados de uma tabela mediante condições estipuladas Exemplo UPDATE drinks SET quantidade = 10 WHERE igr_secundario LIKE ‘%abacaxi%’ Ao atualizar informações de tabelas é possível combinar também diversas operações, envolvendo operadores de busca e também operações matemáticas nos valores das colunas, como o exemplo a seguir: Exemplo de UPDATE envolvendo operações matemáticas UPDATE filme SET filme.duracaoFilme = filme.duracaoFilme + 30; -- atualiza o tempo de todos os filmes cadastrados; Forçando Classificações com CAST A classificação da listagem de informações é sempre efetuada como apropriada para o tipo de coluna que está-se utilizando. É possível forçar colunas para que comportem-se diferente utilizando a função CAST( ) seguida pela palavra chave AS. Vejamos as principais propriedades: Propriedade Cast Comando SELECT campos FROM tabela WHERE argumentos ORDER BY CAST(coluna AS tipo) Função Exemplo AS CHAR Para classificar como uma string de caractere. SELECT nome FROM drinks ORDER BY CAST(nome AS CHAR); AS SIGNED Para classificar como um número inteiro assinado. SELECT nome, preco FROM drinks ORDER BY CAST(preco AS SIGNED); AS UNSIGNED Para classificar como um número inteiro não assinado. SELECT nome, preco FROM drinks ORDER BY CAST(preco AS UNSIGNED); AS DATE Para classificar como uma data. SELECT nome, preco FROM drinks ORDER BY CAST(preco AS DATE); AS DATETIME Para classificar como uma data e hora. SELECT nome, preco quant FROM drinks ORDER BY CAST(quant AS DATETIME); Para classificar como uma hora. SELECT nome, preco quant FROM drinks ORDER BY CAST(quant AS TIME); AS TIME P á g | 59 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. DICA: Para estes tipos de operações podem ser combinados os operadores lógicos AND e OR; UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas VERIFICANDO COMO A ESTRUTURA DE SUAS TABELAS FOI CRIADA: Podemos também desejar ver a estrutura das tabelas que foram criadas para testarmos como eles foram projetados. Para isso, podemos utilizar o comando SHOW organizado da seguinte forma: SHOW CREATE TABLE DRINKS; Neste caso, podemos usar o comando para poder visualizar como os dados da sua tabela foram projetados e atendem aos requisitos para os quais foram projetados. 1) Crie uma consulta que liste todos nomes dos filmes, gêneros e duração, ordenados por gênero e em seguida em ordem decrescente de nome de Filme; 2) Utilizando o operador IN, crie uma consulta para que liste o nome de todos os gêneros menos os gêneros de suspense, terror e comédia; 3) Utilizando subconsultas, crie uma consulta que retorne os títulos, gênero e duração de filmes onde o gênero seja SUSPENSE e a duração esteja entre 70 e 130 minutos; 4) Crie uma consulta para atualizar o tempo para + 44 minutos em todos os filmes de suspense. 5) Utilizando o IN, crie uma consulta que selecione o nome dos atores que não participaram de nenhum filme; 6) Atualizar o título em inglês dos filmes para “senac” onde a duração seja maior do que 120min e o gênero seja drama, terror, suspense. 7) Utilizando o IN crie uma consulta que retorne o título e o gênero de todos os filmes que não passaram ainda em cinema algum; 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; • “Aprendendo SQL”, Alan Beaulieu, O’Reilly, Editora Novate, São Paulo, 2010; P á g | 60 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. Tarefas(Se for necessário crie os registros de inserção para testar as consultas solicitadas) UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas Roteiro 12: Funções de Agregação/ Manipulação de Strings Objetivos: • • Explorar funções de Agregação para atingir totais calculados; Explorar comandos para trabalhar com Strings; Ferramentas necessárias Navegador, Xampp,Notepad++, console Mysql, Bibliografias de livros da faculdade. Funções de Agregação Funções de agregação podem executar cálculos em conjuntos de registros em tabelas de bancos de dados. A principal função que desempenha a tarefa de agrupar dados é a função GROUP BY( ). Na tabela a seguir são detalhadas as principais funções de comandos de agregação que podem ser utilizadas com o Mysql: Funções de agregação A seguir são detalhados os comandos comuns a serem utilizados em funções de agregação. Todos os comandos a seguir são comumente utilizados em combinação do comando GROUP BY. Função Exemplo SELECT NOME,CARGO FROM PESSOA GROUP BY CARGO; -- agrupa os nomes de pessoas por cargo; SELECT SUM(SALARIO) FROM PESSOA; -- calcula o somatórios de salários das pessoas cadastradas. SELECT AVG(SALARIO) FROM PESSOA; -- calcula a média dos salários dos funcionários. SELECT NOME, MAX(SALARIO) FROM PESSOA; -- calcula o maior salário das pessoas cadastradas. SELECT NOME, MIN(SALARIO) FROM PESSOA; -- calcula o menor salário das pessoas cadastradas. GROUP BY COLUNA Agrupa os resultados por uma coluna selecionada SUM(COLUNA) Realiza um somatório dos valores agrupados na coluna. AVG(COLUNA) Realiza o cálculo da média dos valores agrupados na coluna. MAX(COLUNA) Determina o maior valor dos valores agrupados. MIN(COLUNA) Determina o menor valor dos valores agrupados. LIMIT NUMERO Restringe os resultados de uma consulta para uma quantidade de valores explícita no argumento numero. SELECT * FROM CIDADE LIMIT 10; -- limita o resultado da consulta a apenas 10 resultados; COUNT(COLUNA) Realiza a contagem de itens listados em um Group By. SELECT COUNT(SALARIO) FROM PESSOA; -- calcula a contagem de salários existentes em pesoa. Trabalhando com Strings Quando nos deparamos com bancos de dados que possuem dados formatados ou inseridos de maneira consistente, é fácil de realizarmos alterações nas suas informações. Normalmente é recomendado para a inserção de informações em um banco, que usuários padronizem a forma como digitam as informações. Por exemplo Imagine inserindo um conjunto de endereços para clientes, automaticamente fazemos um certo padrão de inserção, dividindo o nome da rua, separando com vírgula o número e o bairro. Estes padrões, quando encontrados, podem ser P á g | 61 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. Comando UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas utilizados para que possamos aplicar funções de texto através do SQL. A seguir veremos algumas funções bastante úteis e que podem ser utilizadas pelo MYSQL também. Comandos para manipulação de Strings A seguir são detalhados os comandos comuns a serem utilizados na manipulação de Strings. Função RIGHT(CAMPO,QUANT) LEFT(CAMPO,QUANT) Seleciona uma quantidade específica de caracteres de uma coluna. SUBSTRING_INDEX(CAMPO,CARACT ERE,QUANT) Seleciona caracteres avaliando a ocorrência de algum caractere específico. UPPER(CAMPO) Aplica caixa alta nos caracteres de um campo. LOWER(CAMPO) Aplica caixa baixa nos caracteres de um campo. REVERSE(CAMPO) Inverte o texto do campo selecionado na consulta. LTRIM(CAMPO) RTRIM(CAMPO) Remove espaços em branco à esquerda ou à direita do campo selecionado. LENGTH(CAMPO) Retorna a quantidade de caracteres do campo selecionado. Exemplo SELECT RIGHT(NOME,2) FROM CONTATO; -- seleciona os dois caracteres à direita da coluna nome. SELECT SUBSTRING_INDEX(NOME,’-’,3) FROM PESSOA; -- seleciona os caracteres após o a terceira ocorrência de hífen no campo nome. SELECT UPPER(NOME) FROM PESSOA; -- aplica caixa alta em todos os registros selecionados no campo nome; SELECT LOWER(PROFISSAO) FROM PESSOA; -- aplica caixa baixa em todos os registros selecionados no campo profissão; SELECT REVERSE(NOME) FROM CIDADE; -- Inverte o texto contido no campo selecionado; SELECT LTRIM(NOME) FROM PESSOA -- remove espaços à esquerda no nome das pessoas cadastradas. SELECT LENGTH(NOME) FROM PESSOA; -- retorna a quantidade de caracteres do nome cadastrado; É possível também realizar alterações nos dados das colunas através da manipulação de Strings utilizando o UPDATE em e envolvendo outra coluna internamente no comando utilizado. P á g | 62 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. Comando UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas Tarefas Adaptar as seguintes alterações no script de criação do banco de dados utilizado no roteiro 11: a. Renomear a base de dados que será criada para roteiro12bdcinema; b. Criar uma nova tabela CIDADE, contendo os campos idCidade, nomeCidade, estado; c. Criar uma nova tabela USUARIO, contendo os campos idUsuario, nomeUsuario, emailUsuario, idCidadeUsuario. d. Criar a tabela VENDA, relacionar esta tabela com sessão determinando o tipo de relacionamento para possibilitar a venda de ingressos para as sessões disponíveis no cinema. Em seguida criar um relacionamento entre usuário e venda, determinando a cardinalidade do relacionamento. e. Criar todos os insert’s de dados necessários no próprio workbench; 2) Cadastrar 5 usuários, em seguida cadastrar 10 vendas de ingressos; 3) Criar as seguintes consultas: a. Criar uma consulta para visualizar todas as compras de ingressos para todos os filmes, listando a data, a hora, o e-mail do usuário, e o nome do filme ordenando por filme; b. Criar uma consulta para listar os títulos em Inglês e português dos filmes que ainda não possuem ingressos vendidos; c. Criar uma consulta para contabilizar o total dos valores de ingressos vendidos por filme, liste o nome do filme e a quantidade de ingressos; d. Criar uma consulta para contabilizar o total de valores de ingressos vendidos por cinema, liste o nome do cinema e a quantidade de ingressos; P á g | 63 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. 1) UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas e. Criar uma consulta que contabilize quantos ingressos foram vendidos por cidade, liste o nome da cidade e a quantidade. Em seguida limite para que sejam listados apenas 2 resultados desta consulta; f. Criar uma consulta que contabilize quantos ingressos foram vendidos por filme, liste o nome do filme e a quantidade, liste apenas os 5 primeiros caracteres do nome do filme e a quantidade de ingressos; g. Criar uma consulta que liste o nome de todos os usuários que compraram ingressos. Liste o nome do usuário e o nome do filme ao lado. h. Modifique a consulta 3.g para que apresente o nome do usuário invertido e em letras maiúsculas. i. Criar uma consulta que liste todos os nomes dos cinemas e a quantidade de caracteres de cada nome de cinema; j. Modificar a consulta anterior para que liste apenas os 5 primeiros caracteres do nome do cinema listado; k. Modificar a consulta anterior para remover os espaços em branco dos nomes dos cinemas listados; l. Criar uma consulta para listar a quantidade de atores que trabalharam em cada filme. Listar o nome do filme e a quantidade de atores. m. Criar uma consulta para listar a média de valores de ingressos vendidos por filme. (esta consulta exigirá um número alto de ingressos vendidos por filme) Criar uma consulta que some a quantidade em minutos de cada filme que já teve ingressos vendidos; Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. n. Referências W3Schools – “Funções de Agregação SQL” em http://www.w3schools.com/sql/sql_functions.asp; Elmasri, Navathe – Sistemas de banco de dados 6ª Edição; P á g | 64 UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas Roteiro 13: Stored Procedures /Functions e uso do Having Objetivos: • • • Criar e utilizar stored procedures utilizando linguagem SQL; Criar e utilizar functions utilizando linguagem SQL; Aplicar a restrição HAVING em conjunto de funções de agregação. Ferramentas necessárias Navegador, Xampp,Notepad++, console Mysql, Bibliografias de livros da faculdade. Stored Procedures Uma stored procedure consiste em um repositório para um conjunto de declarações SQL. Stored Procedures podem conter declarações adicionais e processamento lógico que normalmente estaria indisponível em uma declaração SQL tradicional gerada dinamicamente. Elas podem conter comandos de desvios condicionais e repetição como if e while. O principal comando para criar uma stored procedure é o comando CREATE PROCEDURE. Exemplo de criação de stored procedure em Mysql: DELIMITER $$ CREATE PROCEDURE nome(num INT(4)) BEGIN SELECT filme.tituloOriginalFilme from FILME LIMIT num ; END $$ As stored procedures permitem também que códigos de desvios e loops de execução possam ser armazenados, na tabela a seguir são descritos os principais componentes que podem ser utilizados: Componentes da criação de Stored Procedures A seguir são detalhados os comandos comuns a serem utilizados na manipulação de Stored Procedures. Comando CALL NOMEPROCEDURE SHOW PROCEDURE STATUS DELIMITER caractere Função Realiza a execução de uma stored procedure através da console Mysql; Mostra as procedures que foram criadas no SGBD; Define um novo delimitador de código, ou seja, o Mysql irá encerrar grupos de comandos através do caracter que for inserido. CREATE PROCEDURE nomeProcedure Realiza a criação de uma nova stored procedure, seu uso é obrigatório. DROP PROCEDURE nomeProcedure Elimina a procedure do SGBD; Exemplo CALL listaDados(100); SHOW PROCEDURE STATUS; DELIMITER % -- faz com que o delimitador seja o caracter % CREATE PROCEDURE teste(num INT(3)) -- cria um procedimento chamado teste com uma variável como parâmetro DROP PROCEDURE teste; -- elimina a procedure teste P á g | 65 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. As stored Procedures são importantes para tarefas que devam ser realizadas de forma mais automatizada como atualizações que possam ser chamadas via SQL ou controles de dados que devam ser verificados em registros que manipulam informações de estado ou status de algum item contido no banco de dados, além de permitirem o armazenamento permanente de blocos de códigos a serem úteis posteriormente como funções criadas em linguagens de programação. Fazer uso de stored procedures possibilita à aplicação minimizar a quantidade de código fonte da aplicação e coloca estes códigos sob o controle da camada do banco de dados. Isto faz com que o projeto da aplicação fique mais claro e deixa as páginas de código fonte da aplicação livres de códigos SQL dinâmicos. UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas IF condicao THEN ELSE END IF DECLARE nomevariavel TIPO DEFAULT valor; SET nomevariavel = valor Cria um bloco com instruções IF. Podem ser utilizados comandos de seleção, inclusão, e demais comandos aceitos pela sintaxe Mysql. Encerra um bloco completo IF, seu uso é obrigatório. Realiza uma declaração de variável na stored procedure. Associa um novo valor a uma variável declarada; INCREMENT: LOOP Comandos Define a inicialização de um bloco de repetição e finaliza o bloco; END LOOP INCREMENT; LEAVE INCREMENT Realiza a saída de um bloco de repetição, utilizado em conjunto com INCREMENT: LOOP ITERATE INCREMENT Realiza o incremento de uma repetição, utilizado em conjunto com INCREMENT: LOOP CREATE PROCEDURE teste(num INT(3)) BEGIN -- comandos END IF contador > 10 THEN SELECT ‘entrou no if’; ELSE SELECT ‘entrou no else’; END IF; DELIMITER $$ DECLARE contador INT DEFAULT 0; INCREMENT: LOOP SET contador = contador + 1; IF contador =10 THEN LEAVE INCREMENT; ELSE ITERATE INCREMENT; END IF; END LOOP INCREMENT; $$ Functions As functions são bastante semelhantes às Stored Procedures, com a diferença que para cria-las são utilizados os comandos CREATE FUNCTION e que podem retornar valores de saída através de variáveis e também podem ser chamadas dentro de outras funções. A chamada a funções criadas é feita através do comando SELECT nomeFunction(). Os comandos utilizados pelas funções são os mesmos utilizados pelas procedures, uma definição de função é demonstrada a seguir: Exemplo de criação de função em Mysql: DELIMITER $$ DROP FUNCTION IF EXISTS minhaFuncao1; $$ CREATE FUNCTION minhaFuncao1() RETURNS VARCHAR(50) DETERMINISTIC BEGIN DECLARE msg VARCHAR(50) DEFAULT ' '; SET msg = 'Projeto de Banco de Dados!!!'; RETURN msg; END $$ Exemplo de chamada de função em Mysql: SELECT minhaFuncao1(); $$ P á g | 66 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. BEGIN – END Define o corpo da stored procedure, o código da função será inserido entre os blocos BEGIN-END UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas Complemento de Funções de agregação: uso da função Having Em muitos casos é necessário aplicar as funções de agregação a subgrupos de registros em consultas. Foi explorado o comando GROUP BY, que permite que os grupos resultantes de uma consulta sejam particionados em subgrupos com a finalidade de separar estes grupos de informações para que possam ser feitos somatórios, percentuais, ou qualquer tipo de cálculo envolvendo grupos. Exemplo de uso do HAVING SELECT Projnumero,Projnome, COUNT(*) FROM projeto,trabalha_em WHERE projNumero = pnr GROUP BY projNumero,projNome HAVING COUNT(*) > 2; No argumento da função COUNT é possível incluir qualquer nome de campo que possa ser envolvido nos grupos resultantes da consulta de agregação. Tarefas 1) Realize as seguinte alterações na estrutura do banco de dados cinema para resultar no seguinte esquema ilustrado no diagrama E-R (altere no script de criação das tabelas), criando as tabelas necessárias e as modificações nos campos necessários. 2) Ajuste os INSERTS realizados para que se adaptem às novas tabelas P á g | 67 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. REALIZE AS SEGUINTES ADAPTAÇÕES UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas CRIE AS SEGUINTES CONSULTAS 3) Crie uma consulta para listar o somatório de ingressos vendidos para cada filme onde o tipo de pagamento foi parcelado. Liste o nome do filme e o somatório de valor de ingressos. 4) Altere a consulta anterior para que, utilizando a propriedade HAVING, a consulta que liste somente os filmes com mais de 3 ingressos vendidos (cadastre mais vendas se necessário); 5) Crie uma consulta para listar quantos usuários efetuaram compras à vista. 6) Altere a consulta anterior para listar o nome do usuário que fez a compra e a quantidade de compras à vista; 7) Crie uma stored procedure alteraValorIngresso(valor) que defina um novo valor aos ingressos já vendidos por um valor informado na chamada da procedure, listando os ingressos em seguida na própria procedure; 8) Crie uma function alteraParcela(idUsuario) que altere a situação das parcelas de um usuário específico para pagas. A função deve receber como entrada o id de um usuário qualquer e realizar a alteração de todas as parcelas do usuário. 9) Crie uma stored procedure relVendas(Usuario), onde receba o id de algum usuário do sistema e liste todas as parcelas de um usuário específico juntamente com a situação de pagamento das mesmas 10) Crie uma stored procedure visualizaVendas(tipoVenda) onde deve receber como argumento um inteiro 1 para listar o somatório de vendas à vista ou 2 para o somatório de vendas à prazo. Material disponibilizado em aula em Roteiro 11,12 e 13; java2S - “Procedures e Functions” em http://www.java2s.com/Tutorial/MySQL/0201__ProcedureFunction/Catalog0201__Procedure-Function.htm Mysql online – “Editing Stored Procedures e Funções ” em http://docs.oracle.com/cd/E17952_01/refman-5.1-en/connectornet-visual-studio-editing-stored-procedures-and-functions.html Dev Mysql - Flow control Statements, disponível em http://dev.mysql.com/doc/refman/5.1/en/flow-control-statements.html P á g | 68 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. Referências UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas Roteiro 14: Criando e manipulando View’s Objetivos: o Criar e utilizar View’s com uso do Mysql; Ferramentas necessárias Navegador, Xampp,Notepad++, console Mysql, WorkBench, Bibliografias recomendadas. View’s Uma view consiste em uma consulta armazenada acessível como uma tabela virtual composta pelo resultado de um conjunto de consultas (queries). Ao contrário de uma tabela comum em um banco de dados, uma view não faz parte do esquema físico, ela é uma tabela dinâmica e virtual computada ou colada a partir de dados existentes no banco de dados. Ao alterar os dados em uma tabela, os dados exibidos por uma view serão alterados automaticamente. Views podem prover algumas vantagens ao ser comparadas com tabelas: • Podem representar um subconjunto de dados contidos em tabelas; • Podem criar junções, cálculos e simplificar as consultas posteriores para recuperação de informações na camada de aplicativo; • Podem ocultar informações pouco relevantes para diferentes tipos de usuários que interagem com o banco de dados; CREATE VIEW vw_filme_genero AS SELECT filme.tituloOriginalFilme,genero.nomeGenero FROM filme,genero WHERE filme.generoFilme = genero.idGenero ORDER BY genero.nomeGenero; As view’s são simples de criar e podem ser manipuladas como consultas comuns e são tratadas pelo banco de dados como se fossem realmente tabelas. Para visualizar uma view basta utilizar o mesmo comando utilizado para visualizar as tabelas do banco de dados: show tables. OBSERVAÇÃO: Utilizar padrões de nome ao criar uma view é interessante! Utilize sempre o prefixo vw precedendo o nome de uma view para que não haja confusão ao listar tabelas e views e tentar diferenciá-las em sua manutenção. Somente view’s que reúnam informações diretas de tabelas podem sofrer operações de insert, delete e update. View’s que resultem em cálculos de agregação ou somatórios não podem receber atualizações devido a não conseguirem definir quais serão os dados que sofrerão alteração nas tabelas de origem. P á g | 69 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. Exemplo de criação de uma View: UC – Projeto de Banco de Dados Docente: André Luiz Silva de Moraes 4º sem– Análise e Desenvolvimento de Sistemas Tarefas 1) Utilizando o esquema de banco de dados do roteiro 13, renomeie o arquivo da modelagem para roteiro14bdCinema e realize o forward engineer para a criação do banco de dados e de seus insert’s: 2) Através do workbench, crie uma nova tabela chamada de log com os campos idLog e acao, em seguida relacione a tabela com usuário para que tenha o campo idUsuario na mesma. 3) Criar as seguintes view’s: 4) a. Uma view vwAtorFilme para listar os nomes dos atores e o nome do filme em que estão atuando; b. Uma view vwCinemaFilme para listar os nomes dos cinemas, nomes dos filmes que estão passando, o horário da sessão que o filme passou ou está passando e a data; c. Uma view vwUsuarioIngresso para listar os nomes dos usuários que compraram ingressos, o nome do filme, a data da compra, a data da sessão e o nome do cinema que passou a sessão. d. Uma view vwUsuarioParcela para listar os nomes dos usuários, a data da venda, o valor da parcela e a situação de suas parcelas; e. Uma view vwLogAcao para listar todas as ações realizadas no sistema, o nome do usuário que realizou a ação e a data a realização. Criar consultas para realizar as seguintes tarefas com as view’s: a. Alterar na view vwAtorFilme o nome do ator para ‘Senac’ em todos os filmes que iniciarem por ‘a’; b. Alterar na view vwCinemaFilme todas as datas para 2012-11-06; c. Alterar na view vwUsuarioIngresso o nome dos usuários que comprar ingressos para ‘Usuário X’; d. Alterar o valor das parcelas na view vwUsuarioParcela para R$1000.00 e a situação de pagamento para “Quitada”; Referências Material disponibilizado em aula e em Roteiros 13,14; ‘Trabalhando com View’s’, disponível em http://www.devmedia.com.br/mysql-trabalhando-com-views-parte-01/8724 “Introdução as view’s”, disponível em http://www.devmedia.com.br/introducao-a-views/1614 P á g | 70 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. REALIZE AS SEGUINTES ADAPTAÇÕES