A instrução UPDATE altera os valores existentes em uma tabela, uma tabela de base de uma exibição ou tabela mestre de uma visão materializada.
Segredos do UPDATE
A clausula Update possui uma importante sintaxe na qual permite que você atualize uma tabela a partir de dados de outra tabela sem utilizar um procedimento e sim o próprio set de dados, este método é considerado um segredo, porque normalmente este tipo de sintaxe é substituída por um Cursor (principalmente em Oracle onde existe uma legião de desenvolvedores aficionados por cursores), porem como veremos a seguir o método utilizando a instrução Update executa apenas um acesso ao banco de dados, para alterar, por exemplo, três linhas enquanto se utilizássemos um Cursor, na mesma situação, precisaríamos de no mínimo quatro acessos ao banco de dados, um para selecionar os valores da primeira tabela e três para alterar os valores na segunda tabela, estes se dariam intercaladamente assim como se utilizássemos uma instrução comum de looping de qualquer linguagem de programação.
Oracle, IBM DB2 e Microsoft SQL Server
Para eliminar cursores e alterar grandes quantidades de dados, o exemplo abaixo garante um alto desempenho se utilizado em bases de dados de grande porte, em tabelas com varias rows, imagine alterar cem mil linhas de uma única vez em um único acesso ao banco de dados ao invés de criar um cursor, onde além da seleção dos dados é necessário um laço para navegar por cada uma das cem mil linhas para executar uma instruções update (cem mil).
Para isto a Oracle e a IBM possui conceitos iguais, utilizando um alias na tabela a ser alterada, já a Microsoft resolveu facilitar a logica para os desenvolvedores adicionando na sintaxe do comando Update a clausula From, igualando a logica do clássico comando Select.
UPDATE SET-BASED
Set-Based é um conceito para executar manipulação de dados SQL utilizando um set de dados ao invés de utilizar um procedimento como um cursor ou uma função, deste modo o motor de banco de dados determina os melhores possíveis algoritmos ou lógica de processamento para fazer esta operação.
Primeiro precisamos preparar um exemplo para que seja fácil entender o método de alterar uma tabela à partir de outra tabela, então vamos utilizar os comandos SELECT … INSERT para atualizar os dados das duas tabelas, e um ALTER TABLE para adicionar campos novos nas tabelas, este exemplo necessita da criação das tabelas e inserção de dados dos exemplos anteriores que podem ser encontrados na categoria SQL ou crie um exemplo como na figura a seguir.
Rode todos os comandos do script abaixo exceto o ultimo UPDATE, após a execução dos scripts você obterá duas tabelas contendo dados como na figura abaixo:
Agora precisamos atualizar os dados do campo Tipo da Tabela 1 para o campo Tipo da Tabela 2 que contem valores nulos. O método que normalmente vem a cabeça é utilizar um cursor selecionando os dados da Tabela 1, e enquanto executamos um looping dos dados podemos utilizar um comando Update comum para substituir o valor nulo da Tabela 2 com o valor do campo Tipo da Tabela 1.
Porem é possível obter o mesmo resultado utilizando apenas uma instrução SQL contendo uma subquery no caso do ORACLE e DB2 e utilizando a instrução FROM no caso do MSSQL, como mostra o ultimo exemplo da instrução Update do script abaixo:
Exemplo:
Neste exemplo utilizamos a instrução Update baseada em um set de dados, um método não procedureal para atualizar uma tabela à partir de outra tabela substituindo um cursor.
Oracle / IBM DB2
-- Insere valores da tabela1 para tabela2 insert into tabela2 select * from tabela1; -- Altera tabelas fisicamente, adicionando um campo alter table tabela1 add Tipo CHAR(1); alter table tabela2 add Tipo CHAR(1); -- Altera campo tipo usando uma condição de igual update tabela1 set tipo = 'A' where IdTabela = 2; -- Altera campo tipo usando uma condição de diferente update tabela1 set tipo = 'B' where IdTabela <> 2; -- Atualiza 2 tabelas sem cursor update tabela2 A set A.Tipo = (Select B.Tipo from Tabela1 B Where B.IdTabela = A.IdTabela) -- Visualiza tabela 2 Select * from tabela2;
Microsoft SQL Server
-- Insere valores da tabela1 para tabela2 insert into tabela2 select * from tabela1 -- Altera tabelas fisicamente, adicionando um campo alter table tabela1 add Tipo CHAR(1) alter table tabela2 add Tipo CHAR(1) -- Altera campo tipo usando uma condição de igual update tabela1 set tipo = 'A' where IdTabela = 2 -- Altera campo tipo usando uma condição de diferente update tabela1 set tipo = 'B' where IdTabela <> 2; -- Atualiza 2 tabelas sem cursor update tabela2 set Tipo = B.Tipo from Tabela1 A, Tabela2 B Where A.IdTabela = B.IdTabela -- Visualiza tabela 2 Select * from tabela2