Introdução ao banco de dados se junta ao mariadb e exemplos de junção mysql

Introdução ao banco de dados se junta ao mariadb e exemplos de junção mysql

Objetivo

Aprenda a conhecer os diferentes tipos de junções e como usá -las trabalhando com bancos de dados MySQL ou Mariadb

Requisitos

  • Nenhum requisito específico

Convenções

  • # - exige que o comando linux seja executado com privilégios de raiz também
    diretamente como usuário root ou por uso de sudo comando
  • $ - Dado o comando Linux a ser executado como um usuário não privilegiado regular

Introdução

Em um sistema de banco de dados relacional, os dados são organizados em tabelas, compostas por linhas e colunas. Cada linha é uma instância da entidade representada pela tabela, com as colunas usadas como suas propriedades. As relações entre as tabelas são estabelecidas pelo uso de chaves estrangeiras e a declaração com a qual podemos realizar consultas que abrangem várias tabelas que são chamadas de juntar. Neste tutorial, veremos o tipo diferente de junções disponíveis ao usar o MySQL ou o MariaDB.

O banco de dados "Movie_store"

O que vamos fazer neste tutorial é reproduzir alguns casos concretos em que as junções podem nos ajudar a realizar o que queremos.

A primeira coisa a fazer é criar um banco de dados de teste. Digamos que possuímos uma loja de filmes e precisamos acompanhar os títulos que temos disponíveis: vamos criar um banco de dados "Movie_store" e uma tabela para hospedar informações sobre os diretores de filmes:

Mariadb [(nenhum)]> criar banco de dados Movie_store; Mariadb [(nenhum)]> Use Movie_store; Mariadb [Movie_store]> Criar diretor de tabela ( -> id smallint (1) não assinado não nulo auto_increntry, -> nome varchar (35) não nulo, -> data de nascimento não nula, -> chave primária (id)); 
cópia de

Aqui está a representação visual da tabela que acabamos de criar:

Mariadb [filmes]> Descreva o diretor; +-------------+--------------------+------+-----+- --------+ ----------------+ | Campo | Tipo | Nulo | Chave | Padrão | Extra | +-------------+--------------------+------+-----+- --------+ ----------------+ | id | SmallInt (1) não assinado | Não | PRI | Nulo | Auto_increment | | nome | Varchar (35) | Não | | Nulo | | | Data de nascimento | data | Não | | Nulo | | +-----------+----------------------+------+-----+---------+----------------+ 
cópia de

Primeiro, criamos o banco de dados Movie_store, do que o “inserimos” usando o USAR declaração e finalmente criou a tabela de diretor. Como dissemos antes, cada linha em uma tabela representa uma "instância" da entidade representada pela própria tabela, neste caso um diretor de cinema.

Cada diretor tem algumas propriedades representadas pelas colunas da tabela, por exemplo, cada diretor tem um nome e um aniversário. Cada linha tem um identificador único, que é o valor na coluna que é o chave primária da mesa.

Neste exemplo, a chave primária também é o que é chamado de Chave substituta. Esse tipo de chave é um identificador "artificial", no sentido de que não está relacionado à natureza da entidade (um diretório neste caso): não tem significado semântico e é gerado e usado pelo sistema para seu próprio trabalho interno. A chave é gerada automaticamente e, como tem o INCREMENTO AUTOMÁTICO Propriedade, é inserida incrementalmente toda vez que criamos uma nova linha, por isso não precisamos inseri -la explicitamente:

Mariadb [Movie_store]> Inserir no diretor ('nome', 'data de nascimento') valores-> ('George Lucas', '1944-05-14'),-> ('George Romero', '1940-02-04' ),-> ('John McTiernan', '1951-01-08'),-> ('Rian Johnson', '1973-12-17'); 
cópia de

Nossa mesa agora contém quatro diretores:

+----+----------------+------------+ | id | nome | Data de nascimento | +----+----------------+------------+| 1 | George Lucas | 1944-05-14 | | 2 | George Romero | 1940-02-04 | | 3 | John McTiernan | 1951-01-08 | | 4 | Rian Johnson | 1973-12-17 | +----+----------------+------------+ 
cópia de

Cada um desses diretores tem um ou mais filmes associados a ele: como poderíamos representá -los ? Não podemos adicionar informações sobre os filmes nesta tabela: isso significaria ter muitos dados repetidos: cada vez que adicionamos um filme, repetiríamos suas informações de diretor, e isso seria horrível para dizer o mínimo. Precisamos criar uma tabela dedicada para hospedar informações de filmes e, ao mesmo tempo, precisamos ser capazes de criar uma referência entre ela e seu diretor. Isso é o que Chaves estrangeiras são para:



Mariadb [Movie_store]> Criar título da tabela ( -> id smallInt (1) não assinado não nulo auto_increment, -> nome varchar (35) não nulo, -> release_date Data não nula, -> gênero varchar (10) não nulo, -> diretor_id smallInt (1) não assinado NOL, -> Primária Key (ID), -> Chave estrangeira (diretor_id) Diretor de referências (ID)); 
cópia de

Criamos a tabela como antes, definindo uma chave primária e adicionando uma restrição de chave estrangeira. É assim que habilitamos uma relação entre duas tabelas: basicamente estamos impondo que, para uma linha a ser inserida, o valor da coluna do diretor_id deve corresponder a um valor na coluna de identificação da tabela de diretores (que é única, pois é o Tabela Primária Chave). Em outras palavras, cada título deve ter uma referência a um diretor existente em nosso banco de dados, caso contrário, um erro será acionado: isso garante consistência.

Vamos inserir alguns títulos em nossa mesa:

Mariadb [filme_store]> inserir no título ('nome', 'release_date', 'gênero', 'diretor_id') ),-> ('Revenge of the Sith', '2005-05-19', 'Space Opera', 1),-> ('Die Hard', '1988-07-15', 'Ação', 3) ; 
cópia de

É isso, temos algum título. Primeiro, inserimos a obra -prima de um filme que é 'Night of the Living Dead', dirigido por George Romero: Observe que o 2 Na coluna Director_id corresponde ao ID de George Romero na tabela de diretores.

Usando o mesmo princípio, inserimos um filme de George Lucas (ID 1 na tabela do diretor), 'Revenge of the Sith' e 'Die Hard', um famoso filme de ação dirigido por John McTiernan (ID 3 na tabela do diretor). No momento, não temos filmes de Rian Johnson: há uma razão para isso (além do fato de estar decepcionado com os últimos Jedi), e veremos mais tarde. Agora que configuramos uma estrutura de banco de dados muito básica, podemos começar a falar sobre Junta -se.

Quantos tipos de junção?

Nomes diferentes são usados ​​para referenciar o mesmo tipo de junções, mas basicamente temos interno e exterior Junta -se. Os primeiros também são chamados Juns cruzados ou simplesmente Junta -se (Eles são sinônimos em MySQL - Mariadb). A última categoria inclui esquerda e certo Junta -se.



INNER JUNAS

Uma junção interna, vamos combinar linhas em uma mesa com linhas em outra. Essa associação pode se basear na relação entre as duas tabelas ou pode ser feita independentemente disso: neste caso, todas as linhas de uma tabela serão unidas a todas as linhas do outro, produzindo o que é chamado produto cartesiano. Isso não tem muito sentido em nosso exemplo, mas vamos demonstrá -lo:

Mariadb [Movie_store]> Selecione * do título do diretor de participação; +----+----------------+------------+----+--------- -----------------+--------------+------------+---- ---------+ | id | nome | Data de nascimento | id | nome | release_date | gênero | diretor_id | +----+----------------+------------+----+--------- -----------------+--------------+------------+---- ---------+ | 1 | George Lucas | 1944-05-14 | 1 | Noite dos mortos -vivos | 1968-10-01 | horror | 2 | | 1 | George Lucas | 1944-05-14 | 2 | Vingança dos Sith | 2005-05-19 | operação espacial | 1 | | 1 | George Lucas | 1944-05-14 | 3 | Morrer duro | 1988-07-15 | ação | 3 | | 2 | George Romero | 1940-02-04 | 1 | Noite dos mortos -vivos | 1968-10-01 | horror | 2 | | 2 | George Romero | 1940-02-04 | 2 | Vingança dos Sith | 2005-05-19 | operação espacial | 1 | | 2 | George Romero | 1940-02-04 | 3 | Morrer duro | 1988-07-15 | ação | 3 | | 3 | John McTiernan | 195101-08 | 1 | Noite dos mortos -vivos | 1968-10-01 | horror | 2 | | 3 | John McTiernan | 1951-01-08 | 2 | Vingança dos Sith | 2005-05-19 | operação espacial | 1 | | 3 | John McTiernan | 1951-01-08 | 3 | Morrer duro | 1988-07-15 | ação | 3 | | 4 | Rian Johnson | 1973-12-17 | 1 | Noite dos mortos -vivos | 1968-10-01 | horror | 2 | | 4 | Rian Johnson | 1973-12-17 | 2 | Vingança dos Sith | 2005-05-19 | operação espacial | 1 | | 4 | Rian Johnson | 1973-12-17 | 3 | Morrer duro | 1988-07-15 | ação | 3 | +----+----------------+------------+----+--------------------------+--------------+------------+-------------+ 
cópia de

Como você pode ver, cada linha de uma mesa foi combinada com cada linha da outra, produzindo 12 linhas.

Vamos agora ver um caso de uso diferente para uma junção. Digamos que queremos inspecionar nosso banco de dados para verificar todos os filmes dirigidos por George Lucas que temos na loja. Para realizar esta tarefa, devemos restringir a junção com um SOBRE Cláusula, para que seja baseada no relacionamento entre títulos e seu diretor:

Mariadb [Movie_store]> Selecione o diretor.titulo.nome como filme_title do diretor -> participe do título no diretor.id = título.diretor_id -> onde diretor.nome = "George Lucas" 
cópia de

Aqui está o resultado da consulta acima:

+--------------+---------------------+ | nome | filme_title | +--------------+---------------------+| George Lucas | Vingança dos Sith | +--------------+---------------------+ 
cópia de

Usando uma junção restrita, com base no relacionamento entre as duas tabelas, descobrimos que temos apenas um título de George Lucas na loja: Revenge of the Sith. Não apenas restringimos a junção na base do relacionamento existente entre as duas tabelas, mas também restringimos a consulta aos filmes dirigidos por Lucas, usando o ONDE declaração. Se tivéssemos omitido, a consulta teria produzido uma tabela com todo o diretor existente - correspondência de filmes:

+----------------+--------------------------+ | nome | filme_title | +------------------+------------------------+| George Lucas | Vingança dos Sith | | George Romero | Noite dos mortos -vivos | | John McTiernan | Morrer duro | +----------------+--------------------------+ 
cópia de

Observe que Rian Johnson não está incluído na consulta. Por que isso acontece? Esta é uma característica das junções internas: elas mostram apenas linhas onde existe uma partida em ambas as tabelas. Como não existe correspondência para Rian Johnson na tabela de títulos, não temos resultados para este diretor.



Junta externo

O outro tipo de junções que temos são os Junta externo. Esta categoria é dividida em Esquerda se junta e Junta -se à direita. Qual é a diferença com as junções internas que vimos acima ? Ao contrário do que acontece com uma junção interna, uma junção externa mostra correspondências, mesmo quando uma correspondência não existe em ambas as tabelas. Quando for o caso, ele mostrará um valor nulo nas colunas (s) solicitadas da tabela onde a partida não existe.Isso pode ser útil, por exemplo, se quisermos saber se há alguns diretores associados a nenhum filme. No nosso caso, já sabemos que é o caso, mas vamos verificar usando uma junção à esquerda:

Mariadb [Movie_store]> Selecione o diretor.titulo.nome como filme_title -> do diretor deixou o título de junção no título.diretor_id = diretor.eu ia 
cópia de

O resultado da consulta:

+----------------+--------------------------+ | nome | filme_title | +------------------+------------------------+| George Romero | Noite dos mortos -vivos | | George Lucas | Vingança dos Sith | | John McTiernan | Morrer duro | | Rian Johnson | Nulo | +----------------+--------------------------+ 
cópia de

O único diretor que não tem filmes em nossa loja é Rian Johnson. Ao usar uma união externa, junte -se à ordem em que especificamos as tabelas é importante. Por exemplo, usando um ASSOCIAÇÃO À ESQUERDA, Como fizemos acima, quando a linha da tabela esquerda (neste caso diretor) não se corresponde nas linhas da tabela certa (título), um NULO O valor é especificado em cada coluna solicitada deste último; Quando uma partida é encontrada, em vez disso, seu valor é exibido exatamente como acontece com uma junção interna.

A Junção direita Funciona da mesma forma, a única diferença é que o papel das tabelas é invertido. Na junção certa, todas as fileiras da mesa certa, que não combina na tabela esquerda, estão marcadas com um valor nulo.

Essa propriedade da parte externa se une, é muito útil, mas há casos em que um pouco de confusão pode surgir, principalmente quando uma tabela tem valor nulo permitido em algumas de suas colunas.

Tutoriais do Linux relacionados:

  • Instale o MySQL no Ubuntu 20.04 LTS Linux
  • Coisas para instalar no Ubuntu 20.04
  • Como instalar o MySQL no Almalinux
  • Como alterar a senha do usuário do mariadb
  • Introdução aos mecanismos de armazenamento MySQL
  • Aplicativos gráficos de interface do usuário (GUI) para gerenciar…
  • Ubuntu 20.04 WordPress com instalação do Apache
  • Uma introdução à automação, ferramentas e técnicas do Linux
  • OpenLITESPEED WordPress Instalação
  • Instalação do Ampache Raspberry Pi