SQL Linguagem Table Joins Uma Obrigação
Todas as consultas até este ponto têm sido úteis com a exceção de uma grande limitação – ou seja, você tem selecionado apenas uma tabela por vez com sua instrução SELECT.
É hora de apresentá-lo a uma das características mais benéficas da SQL & sistemas de banco de dados relacionais – o “Join”. Simplificando, o “Join” torna os sistemas de banco de dados relacionais “relacionais”.
As junções permitem que você vincule dados de duas ou mais tabelas em uma única consulta – de uma única instrução SELECT.
Um “Join” pode ser reconhecido em uma instrução SQL SELECT se tiver mais de uma tabela após a palavra-chave FROM.
Por exemplo:
SELECT "list-of-columns"
FROM table1,table2
WHERE "search-condition(s)"
Joins podem ser explicados mais facilmente demonstrando o que aconteceria se você trabalhasse com apenas uma tabela e não tivesse a habilidade de usar “joins”.
Este banco de dados de tabela única também é algumas vezes chamado de “flat table”. Vamos dizer que você tem um banco de dados de uma tabela que é usado para manter o controle de todos os seus clientes e o que eles compram de sua loja:
id | first | last | address | city | state | zip | date | item | price |
---|
Toda vez que uma nova linha é inserida na tabela, todas as colunas serão atualizadas, resultando em “dados redundantes” desnecessários.
Por exemplo, cada vez que Wolfgang Schultz compra algo, as seguintes linhas serão inseridas na tabela:
id | first | last | address | city | state | zip | date | item | price |
---|---|---|---|---|---|---|---|---|---|
10982 | Wolfgang | Schultz | 300 N. 1st Ave | Yuma | AZ | 85002 | 032299 | snowboard | 45.00 |
10982 | Wolfgang | Schultz | 300 N. 1st Ave | Yuma | AZ | 85002 | 082899 | snow shovel | 35.00 |
10982 | Wolfgang | Schultz | 300 N. 1st Ave | Yuma | AZ | 85002 | 091199 | gloves | 15.00 |
10982 | Wolfgang | Schultz | 300 N. 1st Ave | Yuma | AZ | 85002 | 100999 | lantern | 35.00 |
10982 | Wolfgang | Schultz | 300 N. 1st Ave | Yuma | AZ | 85002 | 022900 | tent | 85.00 |
Uma base de dados ideal teria duas tabelas:
- Uma para controlar os seus clientes
- E o outro para controlar o que eles compram:
Tabela “Customer_info”:
customer_number | firstname | lastname | address | city | state | zip |
---|
Tabela “Purchases”:
customer_number | date | item | price |
---|
Agora, sempre que uma compra é feita de um cliente recorrente, a 2ª tabela “Compras” só precisa ser atualizada! Acabamos de eliminar dados redundantes inúteis, ou seja, acabámos de normalizar esta base de dados!
Observe como cada uma das tabelas tem uma coluna “cusomer_number” comum. Esta coluna, que contém o número de cliente único, será usada para juntar as duas tabelas.
Usando as duas novas tabelas, digamos que você gostaria de selecionar o nome do cliente e os itens que ele comprou. Aqui está um exemplo de uma declaração de junção para conseguir isto:
SELECT customer_info.firstname, customer_info.lastname, purchases.item
FROM customer_info, purchases
WHERE customer_info.customer_number = purchases.customer_number;
Este “Join” em particular é conhecido como “Inner Join” ou “Equijoin”. Este é o tipo mais comum de “Join” que você verá ou usará.
Observe que cada uma das colunas é sempre precedida do nome da tabela e de um ponto final. Isso nem sempre é necessário, no entanto, é uma boa prática para que você não confunda quais colums vão com quais tabelas.
É necessário se os nomes das colunas de nomes forem os mesmos entre as duas tabelas. Eu recomendo preceder todas as suas colunas com os nomes das tabelas ao usar joins.
Nota: A sintaxe descrita acima funcionará com a maioria dos sistemas de banco de dados – incluindo o que está neste tutorial. No entanto, no caso de isto não funcionar com o seu, por favor verifique a documentação específica da sua base de dados.
Embora o acima provavelmente funcione, aqui está a especificação de sintaxe ANSI SQL-92 para uma união interna usando a instrução precedente acima que você pode querer tentar:
SELECT customer_info.firstname, customer_info.lastname, purchases.item
FROM customer_info INNER JOIN purchases
ON customer_info.customer_number = purchases.customer_number;
Outro exemplo:
SELECT employee_info.employeeid, employee_info.lastname, employee_sales.comission
FROM employee_info, employee_sales
WHERE employee_info.employeeid = employee_sales.employeeid;
Essa instrução selecionará o employeeid, o sobrenome (da tabela employee_info) e o valor de comissão (da tabela employee_sales) para todas as linhas onde o employeeid na tabela employee_info corresponde ao employeeid na tabela employee_sales.
0 comentários :
Postar um comentário