Já faz um tempo que estou querendo usar junções, mas estou tendo problemas para visualizar a saída, então sei como colocá-la em uso.
Digamos que eu tenha 2 tabelas:
CREATE TABLE Cities (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
city tinyblob
);
CREATE TABLE Users (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username TINYBLOB,
city INT UNSIGNED,
FOREIGN KEY (city) REFERENCES Cities (id)
);
Se meu aplicativo for executar uma consulta SQL para obter os dados de perfil de um usuário, como eu usaria uma junção para obter a cidade associada ao registro de um usuário e como o registro de saída apareceria?
Todo resultado de uma operação SQL é funcionalmente uma nova tabela, esteja ela armazenada ou não em disco ou na memória
A função de uma junção é "juntar" duas tabelas em uma terceira tabela sintética que (geralmente) só existe na memória durante o tempo em que é enviada para o aplicativo.
O motivo para usar uma junção é reduzir as anomalias de dados , garantindo que os dados apareçam em um e apenas um local no banco de dados.
Considere o seguinte:
Person ( ID Integer Primary Key, FName String, LName String, Address String, City String, ZipCode String)
Aqui, sempre que o governo muda os códigos postais (o que acontece com muita frequência para os gostos dos desenvolvedores de banco de dados * a tabela de pessoas precisará ser atualizada de forma que todos os códigos postais antigos pertençam corretamente à cidade correta e ao novo código postal.
Nesse caso, o mesmo código postal está em várias tuplas da tabela e, se a tabela for editável manualmente, estará sujeita a graves anomalias de atualização, pois novas combinações de cidade/código postal são inseridas sem que o banco de dados como um todo seja atualizado.
Ao ter três tabelas, obtemos os mesmos dados, mas com maior flexibilidade e confiabilidade (ao custo de algum desempenho, embora questões de "desnormalização apropriada" sejam um tópico para outra série de respostas).
Person ( PersonID Integer Primary Key, FName String, LName String)
City ( CityID Integer Primary Key, City String, State String, ZipCode String )
Address ( AddressID Integer Primary Key, AddressLine1 String, CityID Integer References City, PersonID Integer References Person)`
E podemos obter uma única "tabela" acima por meio da seguinte consulta:
SELECT Fname, Lname, AddressLine1, City, State, ZipCode FROM Person INNER JOIN Address USING (PersonID) INNER JOIN City USING (CityID)
Isso nos permite atualizar as tabelas individuais sempre que algo específico sobre elas mudar, sem corromper o restante dos dados associados.
An
INNER JOIN
é o tipo padrão de junção. Grosso modo, observa: "combine tuplas onde este registro da tabela a corresponde a este registro da tabela b" Os outros tipos de junções sãoOUTER JOINS
e o que é conhecido como aCARTESIAN PRODUCT
. Uma junção externa é "Pegue tudo da tabela esquerda ou direita (conforme especificado) e onde a outra tabela corresponder, junte-a. Onde não corresponder, preencha com nulos" E um produto cartesiano (sem entrar na álgebra relacional é: Pegue todas as combinações possíveis de tuplas em ambas as tabelas e as imprima em uma tabela, sem corresponder a nada.* Mais do que nunca, especialmente no caso de mover os limites dos códigos postais por causa do gerrymandering
Eu acho que você está procurando
o que te daria
mas não acredite na minha palavra: experimente em seu banco de dados e veja o que consegue!
Em poucas palavras, sua instrução SQL será -
Fields1.. Fieldsn serão os campos que você deseja buscar - de uma ou de ambas as tabelas.