MySQL DELETE JOIN

Resumo : neste tutorial, mostraremos como excluir dados de várias tabelas usando a instrução MySQL DELETE JOIN  .

No tutorial anterior, você aprendeu como excluir linhas de múltiplas tabelas usando:

  • Uma única DELETEinstrução em várias tabelas.
  • Uma única DELETEinstrução em várias tabelas relacionadas em que a tabela filha possui uma  ON DELETE CASCADEação referencial para a chave estrangeira .

Este tutorial apresenta uma maneira mais flexível de excluir dados de várias tabelas usando a cláusula INNER JOINor LEFT JOINcom a DELETEinstrução.

MySQL DELETE JOIN com INNER JOIN

O MySQL permite que você use a INNER JOINcláusula na DELETEinstrução para excluir linhas de uma tabela que possui linhas correspondentes em outra tabela.

Por exemplo, para excluir linhas de tabelas T1e T2que atendam a uma condição especificada, use a seguinte instrução:

DELETE T1, T2
FROM T1
INNER JOIN T2 ON T1.key = T2.key
WHERE condition;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Observe que você coloca os nomes das tabelas T1e T2entre as  palavras-chave DELETEe FROM . Se você omitir T1a tabela, a DELETEinstrução excluirá apenas as linhas da  T2tabela. Da mesma forma, se você omitir T2a tabela, a DELETEinstrução excluirá apenas as linhas da  T1tabela.

A expressão T1.key = T2.keyespecifica a condição para correspondência de linhas entre tabelas T1e T2que serão excluídas.

A condição da   WHEREcláusula determina as linhas em T1e T2que serão excluídas.

MySQL DELETE JOIN com exemplo INNER JOIN

Suponha que temos duas tabelas t1e t2com as seguintes estruturas e dados:

DROP TABLE IF EXISTS t1, t2;

CREATE TABLE t1 (
    id INT PRIMARY KEY AUTO_INCREMENT
);

CREATE TABLE t2 (
    id VARCHAR(20) PRIMARY KEY,
    ref INT NOT NULL
);

INSERT INTO t1 VALUES (1),(2),(3);

INSERT INTO t2(id,ref) VALUES('A',1),('B',2),('C',3);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )
MySQL DELETE JOIN

A instrução a seguir exclui a linha com id 1 na t1tabela e também a linha com ref1 na t2tabela usando DELETE...INNER JOINa instrução:

DELETE t1,t2 FROM t1
        INNER JOIN
    t2 ON t2.ref = t1.id 
WHERE
    t1.id = 1;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

A instrução retornou a seguinte mensagem:

2 row(s) affectedLinguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Indicou que duas linhas foram excluídas.

MySQL DELETE JOIN com LEFT JOIN

Freqüentemente usamos a  LEFT JOINcláusula na SELECTinstrução para encontrar linhas na tabela esquerda que possuem ou não linhas correspondentes na tabela direita.

Também podemos usar a LEFT JOINcláusula na DELETEinstrução para excluir linhas em uma tabela (tabela esquerda) que não possui linhas correspondentes em outra tabela (tabela direita).

A sintaxe a seguir ilustra como usar DELETEa instrução with LEFT JOINcláusula para excluir linhas da T1tabela que não possuem linhas correspondentes na T2tabela:

DELETE T1 
FROM T1
        LEFT JOIN
    T2 ON T1.key = T2.key 
WHERE
    T2.key IS NULL;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Observe que colocamos T1tabela apenas após a DELETEpalavra-chave, não ambas T1e T2tabelas como fizemos com a  INNER JOINcláusula.

MySQL DELETE JOIN com exemplo LEFT JOIN

Consulte o seguinte customerse ordersas tabelas no banco de dados de amostra:

Tabelas de Clientes e Pedidos

Cada cliente tem zero ou mais pedidos. No entanto, cada pedido pertence a um e apenas um cliente.

Podemos usar DELETEinstrução com LEFT JOINcláusula para limpar os dados mestre do cliente. A declaração a seguir remove clientes que não fizeram nenhum pedido:

DELETE customers 
FROM customers
        LEFT JOIN
    orders ON customers.customerNumber = orders.customerNumber 
WHERE
    orderNumber IS NULL;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Podemos verificar a exclusão descobrindo se existem clientes que não possuem pedidos usando a seguinte consulta:

SELECT 
    c.customerNumber, 
    c.customerName, 
    orderNumber
FROM
    customers c
        LEFT JOIN
    orders o ON c.customerNumber = o.customerNumber
WHERE
    orderNumber IS NULL;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

A consulta retornou um conjunto de resultados vazio, que é o que esperávamos.

Neste tutorial, você aprendeu como usar a  DELETE JOIN instrução MySQL para excluir dados de duas ou mais tabelas.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *