Depois de estar um tempo afastado aqui da nossa coluna do portal da Devmedia – SQL MAGAZINE - retorno para apresentar um assunto que muitos programadores e iniciantes em programação SQL abordam em alguns fóruns e listas nas quais atuo como moderador.

Primeiramente, vamos passar por conceitos de modelagem de dados, modelos conceituais, relacionais e físicos e então apresentarei os tipos de JOIN que são implementados dentro do SQL Server 2000. Salientando também que os códigos (SQL) que aqui serão abordados, foram escritos em ambiente Windows rodando a versão XP Professional e com Servidor SQL Server 2000 Developer Edition.

MODELO RELACIONAL

O modelo relacional se resume diretamente em tabelas e relacionamentos. Uma vez definido o modelo conceitual, ou o modelo E-R, podemos convertê-lo, implementando tabelas para armazenar os dados e relacionando-as para garantir integridade e diminuir a redundância do modelo.

As tabelas também são conhecidas como entidades ou mesmo relações e é composta por linhas que também podem ser chamadas de registros ou tuplas.

Um registro é composto por vários atributos que são ordenados dentro de cada entidade. Cada atributo está em uma coluna, que conterá valores que, uma vez combinados, formarão a informação – vale salientar o conceito de ”dado” e “informação”.

Resumindo, o modelo relacional é aquele que está em meio físico e contempla a realidade de um banco de dados: tabelas e relacionamento.

MODELAGEM DE DADOS

Certa vez, há algum tempo atrás, tive que apresentar um projeto para uma locadora de carros, a qual gostaria de focar em um sistema que resolvesse seus problemas de desorganização. Eram pilhas e mais pilhas de papéis contendo informações de quem alugou tal veículo, quanto tempo, quilometragem gasta e valor de acordo com a quilometragem gasta. Detalhe, a ficha passava pela aprovação de três setores antes da liberação do veículo para o locatário furioso que aguardava na recepção da empresa.

Pensando no foco do problema, considerei o seguinte modelo:

exemplo1

Para a construção desse modelo foram levadas em conta algumas premissas básicas em relação à cardinalidade, como:

  • Há clientes cadastrados que alugam carros e outros não;
  • Um automóvel pode ser locado por um ou mais clientes;

Não levarei em consideração aqui, a questão de quantidades de automóveis de um mesmo tipo. Consideraremos que existe somente um automóvel de cada dentro da locadora. (Examine o source, caso faça o download que temos um índice criado para impedir o cadastro de mais de um automóvel com o mesmo nome).

Diante dessa proposta, como foi definido no E-R acima, temos um relacionamento muitos-para-muitos que, obrigatoriamente gera uma terceira tabela que terá a movimentação do relacionamento que dei o nome de “locação”.

DEFINIDO O MODELO FÍSICO

Temos então, cinco tabelas:

  1. Cliente;
  2. Automóveis;
    • Modelo – tabela decodificação;
    • Marca - tabela decodificação;
  3. Locação;
modelo-tabela
Modelo relacional e diagrama do modelo físico que implementamos no banco de dados.

CARGA NA BASE

Já que agora temos nossa base de dados para a locadora, iremos dar carga nas tabelas, cadastrando alguns modelos de automóveis, marcas, alguns clientes, alguns automóveis e enfim começaremos a cadastrar as locações, que será o ponto principal da abordagem de nosso artigo, onde traremos as informações em consultas utilizando a sintaxe JOIN.

Lembrando que você poderá fazer o download do script SQL utilizando para montar todo esse modelo ao final do artigo.

CONCEITOS DE JOIN

As JOIN ou “associação” é uma operação que lhe permite consultar duas ou mais tabelas para produzir um conjunto de resultados que incorpore registros e colunas de cada tabela. Você pode associar tabelas em qualquer expressão que seja baseada em qualquer coluna ou combinação de colunas das tabelas envolvidas.

No nosso exemplo, temos uma associação de até três tabelas:

  • Automóvel
    1. Marca;
    2. Modelo;

...neste caso, podemos, em algum momento, diante da necessidade que surdir, precisar tirar um relatório do automóvel + modelo + marca que temos em nossa locadora, assim, teremos que associar as três tabelas para buscar as informações.

Existem três tipos de associação possíveis entre entidades de uma base de dados:

  • Associações internas, mais conhecidas como INNER JOIN;
  • Associações externas, mais conhecidas como LEFT OUTER JOIN ou RIGHT OUTER JOIN;
  • Associações cruzadas, mais conhecidas como CROSS JOIN;

Em meio as JOIN's, você perceberá que usaremos também, elementos que são chamados de “alias”, que encurtam as declarações, colocando interligação nos nomes das entidades que irão compor nossa consulta ao banco. Por exemplo, podemos fazer uma consulta da seguinte forma:


SELECT COUNT (*) AS numero FROM automovel 
GO

...onde a saída desse comando será:

exemplo2
A coluna assume o nome passado como alias da função agregada COUNT ().

Você perceberá também o uso da palavra ON, que indicará que a consulta estará associando as colunas das tabelas relacionadas.

ASSOCIAÇÕES INTERNAS – INNER JOIN

As associações internas ou INNER JOIN combinam tabelas comparando valores em colunas que sejam comuns a ambas as tabelas. O SQL Server retorna somente registros que correspondem às condições da associação, ou seja, caso algum dos campos associados de uma tabela qualquer que esteja vinculada na consulta não tiver dados para o campo em comparação, sua consulta não retornará dados satisfatórios, pois estas linhas que faltam farão com que alguns registros não apareçam no resultset.

Dentro do nosso exemplo que estamos estudando, já temos algumas tabelas que se encontram associadas, como marca e modelo é referenciada dentro automóvel utilizando os recursos de bancos de dados para manter integridade: PK e FK...sendo assim, temos campos em comum nas tabelas, o que então nos possibilita associar associá-las.

innerjoin
Já temos algumas marcas, modelos e automóveis cadastrados, sendo assim, podemos fazer a seguinte consulta:

Consulta com associações internas (INNER JOIN).

Explicando o código:

Iniciamos o SELECT os campos que queremos retornar nas consulta. Antes do nome de cada campo, colocamos um alias para determinar em qual tabela o consulta buscará os valores deste campo. Como colocamos “a.auto_nome” e no FROM temos a indicação “automóvel AS a”, indicamos para o analisador de consultas que o campo “auto_nome” está na tabela “automóvel”, sendo assim, automóvel.auto_nome é o mesmo que a.auto_nome, e assim acontece com os outros campos

ON é usado para determinar ou igualar os campos em comum das tabelas relacionadas, lembrando que quando você for implementar relacionamentos, sempre preserve o mesmo trabalhando com números, pois o banco de dados ou mesmo um sistema computacional trabalha melhor com números inteiros que com qualquer outra coisa, tornando sua consulta mais rápida e satisfatória.

Terminamos a consulta com uma declaração de ordenação, ORDER BY, ordenando os resultados por a.auto_nome (nome dos automóveis na tabela automóvel) de forma ascendente.

RECOMENDAÇÕES

Caso você trabalhe com views, talvez possa ser interessante mascar o nome dos campos para que o seu estagiário não faça nenhuma bobagem, quando você sair para tomar um café.

Façamos a mesma consulta, só que agora mascarando o nome dos campos, usando alias, aplicando-os de outra maneira:

recomendacoes

Mascarando a complexidade da consulta podendo usá-la em uma view.

ASSOCIAÇÕES EXTERNAS – LEFT OUTER JOIN ou RIGHT OUTER JOIN

As associações externas à esquerda ou à direita combinam registros de duas tabelas que correspondem à condição de associação, além de quaisquer registros não-correspondentes da tabela à esquerda ou à direita, conforme especificado na cláusula JOIN. Os registros que não correspondem à condição de associação exibem NULL (Nulo) no conjunto de resultados. Você também pode usar associações externas completas para exibir todos os registros das tabelas associadas, independentemente de as tabelas terem ou não valores correspondentes ou relacionados.

Use associações externas à direita ou à esquerda quando precisar de uma lista de dados completa, que é armazenada em uma das tabelas associadas, além das informações que correspondem à condição de associação.

Geralmente usamos para saber quase dados ainda não foram associados em tabelas relacionadas ou adjacentes. No Nosso caso, podemos buscar informações de carros que ainda não foram locados ou clientes que ainda não locaram nenhum carro.

ASSOCIAÇÕES CRUZADAS – CROSS JOIN

As associações cruzadas (CROSS JOIN)exibem todas as combinações de todos os registros nas tabelas associadas. Uma coluna em comum não se faz necessária nesse tipo de associação.

Enquanto as associações cruzadas são raramente usadas em bancos de dados normalizados, você pode usá-la para prover testes e gerar conjunto de associações de dados. Essas consultas não têm bom desempenho e podem trazer problemas quando utilizadas em um ambiente de produção.

EXEMPLO DE CROSS JOIN

Vamos então, a partir do conceito de CROSS JOIN visualizar quais as possibilidades de locação de automóveis temos de acordo com clientes e automóveis cadastrados. Lembre-se que, não é preciso ter um relacionamento entre as tabelas ou mesmo uma coluna em comum.

Escrevendo a consulta:

escrevendoconsulta
CROSS JOIN gera uma combinação dos resultados todos-com-todos.

CROSS JOIN gera uma combinação dos resultados todos-com-todos.

Por fim, podemos então fazer uma consulta à tabela locacao associando as tabela automovel e cliente para saber quais locações já fizemos.

consulta

Bem, falamos então sobre JOIN's e espero que tenham gostado. No próximo artigo falaremos sobre STORED PROCEDURES dentro do SQL Server e no Mysql. Um abraço especial a todos!