Como é a saída de uma instrução JOIN?


8

Há um tempo que eu queria usar junções, mas estou tendo problemas para visualizar a saída, então sei como usá-la.

Digamos que eu tenho 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 executar uma consulta SQL para obter os dados do perfil de um usuário, como eu usaria uma associação para associar a cidade ao registro de um usuário e como o registro de saída seria exibido?

Respostas:


12

Todo resultado de uma operação SQL é funcionalmente uma nova tabela, esteja ela armazenada ou não no disco ou na memória

A função de uma junção é "Associar" duas tabelas em uma terceira tabela sintética que (normalmente) só existe na memória durante o tempo em que é enviada para o aplicativo.

O motivo para usar uma associaçã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 alterar os códigos postais (o que acontece com muita freqüência para os gostos dos desenvolvedores de bancos de dados *), a tabela de pessoas precisará ser atualizada para que todos os códigos postais antigos pertençam corretamente à cidade e ao novo código postal corretos.

Nesse caso, o mesmo código postal está em várias tuplas da tabela e, se a tabela for editável manualmente, estará sujeito a anomalias severas de atualização quando novas combinações de cidade / código postal forem 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 "tabela" única acima, através 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 for alterado, sem danificar o restante dos dados associados.

An INNER JOINé o tipo padrão de associação. Grosso modo, ele observa: "combine tuplas onde este registro da tabela a corresponde a este registro da tabela b" Os outros tipos de junções são OUTER JOINSe o que é conhecido como a CARTESIAN PRODUCT. Uma junção externa é "Pegue tudo da tabela esquerda ou direita (conforme especificado) e, onde a outra tabela corresponder, junte-se a ela. Onde não corresponder, preencha-a 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 produza em uma tabela, sem corresponder a nada.

* Mais do que nunca, especialmente no caso de mover os limites dos códigos postais por causa da gerrymandering


6

Acho que você está procurando

SELECT username, cities.city FROM Users JOIN Cities ON (Cities.Id = Users.City)

o que daria a você

| username | city      |
| John     | Singapore |
| Toby     | London    |
| Eric     | Paris     |

mas não aceite minha palavra: experimente no seu banco de dados e veja o que você ganha!


3

Em poucas palavras, sua instrução SQL será -

SELECT FIELD1, FIELD2 .. FIELDN
FROM PARENT_TABLE 
  INNER JOIN CHILD_TABLE ON ( PARENT_TABLE.PARENT_KEY = CHILD_TABLE.FOREIGN_KEY)

Fields1 .. Fieldsn serão os campos que você deseja buscar - de um ou de ambos os tabls.


Parênteses não são obrigatórios, torna a consulta mais difícil de ler.
Spredzy

11
@Spredzy reverso é o caso para mim, Parêntese aumenta a legibilidade para mim
Sathyajith Bhat
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.