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 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 em sua forma básica. 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. <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 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, uma vez que fica claro quais critérios estão realizando junções e quais estão realizando critérios de pesquisa. Pág 53
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. 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 Alias SELECT campos FROM tabela argumentos Comando Função Exemplo LIKE % BETWEEN _ (under line) 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. Semelhante ao AND, define um intervalo de dados definido que pode ser utilizado em uma consulta. Permite combinar exatamente um caractere desconhecido utilizado para representar qualquer combinação possível na cláusula LIKE. SELECT * FROM dados nome LIKE joão SELECT * FROM funcionario nome LIKE %a AND nome LIKE a% SELECT * FROM funcionario salario BETWEEN 1000 and 5000 SELECT * FROM funcionário nome LIKE R % 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. Pág 54
Exemplo de utilização de alias: SELECT F.ID, F.NOME, E.NOME FROM FUNCIONARIO AS F, EMPRESA AS E 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 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. 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/roteiro10- inner-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: Pág 55
2) Aplique as seguintes modificações no modelo do workbench: a. Remover as cláusulas NOT NULL para todas as tabelas b. Aplicar o Forward Engineer ativando a geração de INSERT S nas tabelas 3) 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 Pág 56
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 57