- na linguagem SQL, há instruções que permitem manipular os dados de um banco de dados, epertencem à divisão
DML
(Data Manipulation Language) da linguagem. - são operações de manutenção de um banco de dados:
- inclusão ou inserção de dados em uma tabela.
- alteração ou atualização de dados em uma tabela.
- exclusão ou deleção de dados em uma tabela.
- após a implementação da estrutura de um banco de dados, o passo seguinte é popular esse banco.
comando INSERT
:
INSERT INTO <nome-tabela>
[(<nome-coluna>, <nome-coluna>,...)]
VALUES
([<conteúdo>], [<conteúdo>], ...);
- a lista de colunas pode ser omitida na declaração do comando.
- existem algumas situações que podem ocasionar erros durante a inserção de dados:
- violação de Chave Primária: é um campo que deve receber um valor único; se houver tentativa de inserção de valor repetido, ocasionará violação de Chave Primária.
- violação de UNIQUE CONSTRAINT: o campo UNIQUE deve receber um valor que não se repete em outros registros (único).
- valor informado excede o tamanho de coluna.
- tipo de dado incompatível com a coluna (caracteres em coluna).
- violação de CHECK CONSTRAINT: tentativa de inserção de um valor que está em desacordo com a validação imposta pelo uso de CHECK.
- violação de Chave Estrangeira: quando há tentativa de inserir um registro filho que não tem correspondente na tabela de origem (pai).
- violação de Not Null: quando um campo de preenchimento obrigatório deixa de ser preenchido.
comando UPDATE
: faz parte da DML.
UPDATE <nome-tabela>
SET <nome-coluna> = <novo conteúdo para o campo>
[,<nome-coluna> = <novo conteúdo para o campo>]
[WHERE <condição>]
- as situações de erro que foram vistas para a instrução INSERT também se aplicam ao UPDATE.
comando DELETE
: faz parte da divisão DML.
DELETE FROM <nome-tabela>
[WHERE <condição>]
- se tentarmos excluir um registro que possui registros filhos, ocasionará uma violação de Chave Estrangeira (na tentativa de excluir um registro que tem um campo Chave Primária, que é Chave Estrangeira em outra tabela).
-
transação
: conjunto de instruções para realização de uma operação completa no banco de dados, e deve respeitar o princípio ACID.- Atomicidade (Atomicity): Atômico, tudo (commit) ou nada (rollback).
- Consistência (Consistency): toda transação executada deve seguir as regras de integridade do BD, mantendo a consistência da base de dados.
- Isolamento (Isolation): garante que nenhuma transação seja interferida por outra até que a primeira seja completada.
- Durabilidade (Durability): garante que as informações gravadas no banco de dados durem de forma imutável até que outra transação de atualização ou remoção as afete.
-
o controle de transações pode ser realizado utilizando as instruções:
COMMIT
: efetiva as atualizações no banco de dados (inserção, atualização ou exclusão de registros).ROLLBACK
: desfaz as operações que não tenham sido efetivadas no banco de dados ainda.
- para ilustrar o uso dos comandos DML, utilizar o Estudo de Caso “SIP - SISTEMA DE CONTROLE DE IMPLANTAÇÃO DE PROJETOS”.
Regras de Negócio:
- RN01 – Um funcionário possui apenas um endereço residencial.
- RN02 – Um funcionário pode ter um ou mais dependentes (filhos, esposa ou marido).
- RN03 – Um funcionário tem apenas uma data de admissão.
- RN04 – Um funcionário deve pertencer a um único departamento.
- RN05 – Um funcionário possui um único número de matrícula.
- RN06 – Um funcionário pode participar da implantação de um ou mais projetos.
- RN07 – Um departamento pode locar vários funcionários.
- RN08 – Um projeto pode ser implantado por vários funcionários.
- RN09 – Cada dependente deve ter uma datade nascimento.
- RN10 – Cada dependente pertence a um único funcionário.
- RN11 – Um funcionário pode participar da implantação de um mesmo projeto várias vezes, ou seja, um funcionário pode participar da implantação de um projeto em diferentes momentos.
- RN12 – Não será considerada a hipótese de termos um casal trabalhando na mesma empresa, pois eles teriam dependentes comuns.
Modelo de dados físico/relacional do Estudo de Caso “SIP - SISTEMA DE CONTROLE DE IMPLANTAÇÃO DE PROJETOS”.
-- INSERINDO DADOS NA TABELA DEPARTAMENTO
INSERT INTO T_SIP_DEPARTAMENTO VALUES (1,'FINANCEIRO');
INSERT INTO T_SIP_DEPARTAMENTO
(cd_depto, nm_depto) VALUES (2, 'MARKETING');
- podemos realizar a inserção informando ou não as colunas.
- quando as colunas não são listadas, os valores informados serão inseridos conforme a ordem (o desenvolvedor precisa conhecer a ordem das colunas).
- quando listamos as colunas, os dados serão incluídos conforme a ordem declarada no comando.
- valores contendo cadeia de caracteres e datas devem ser informados entre apóstrofos.
SELECT *
FROM T_SIP_DEPARTAMENTO;
- na sintaxe do comando SELECT, o asterisco (*) equivale a todas as colunas da tabela “DEPARTAMENTO”.
- após incluir informações, aplicar o comando COMMIT para que a inserção física seja realizada; caso contrário, ao fechar a ferramenta, as informações inseridas serão perdidas!
- uma instrução DML pode utilizar o resultado de uma subconsulta.
- exemplo: realizar uma operação para inserir todas as linhas da tabela “DEPARTAMENTO” que serão copiadas na“DEPARTAMENTO_TEMP”.
-- COPIANDO LINHAS DE UMA TABELA PARA OUTRA
INSERT INTO T_SIP_DEPARTAMENTO_TEMP
(cd_depto, nm_depto)
(SELECT cd_depto, nm_depto FROM T_SIP_DEPARTAMENTO);
- para visualizar o resultado da inserção:
SELECT * FROM T_SIP_DEPARTAMENTO_TEMP;
- observação: para realizar o teste, é necessário criar a tabela “T_SIP_DEPARTAMENTO_TEMP” com a mesma estrutura da tabela “T_SIP_DEPARTAMENTO”.
- ao inserir linhas que contenham colunas que recebem valores de data, normalmente utilizamos a
função TO_DATE()
para informar a data e o formato que está sendo enviada ao SGBD. - para inserção de valores decimais, geralmente informamos o valor a ser armazenado, utilizando o ponto decimal.
- exemplo: comando INSERT para inserir registros na tabela “FUNCIONARIO”:
-- Inserindo DATA e números DECIMAIS
INSERT INTO T_SIP_FUNCIONARIO
(nr_matricula, cd_depto, nm_funcionario,
dt_nascimento, dt_admissao,
ds_endereco, vl_salario)
VALUES (1234,1,'ANA MARIA',
TO_DATE('10/02/1986','DD/MM/YYYY'),
TO_DATE('09/08/2010','DD/MM/YYYY'),
'R. DARIO PEREIRA, 23', 1234.56);
- visualizando a inserção realizada:
SELECT *
FROM T_SIP_FUNCIONARIO;
- para inserção de colunas opcionais, podemos informar
“NULL”
como valor para a coluna opcional quando ela não receber valores. - exemplo: comando INSERT para inserir registros na tabela “FUNCIONARIO” (a coluna “dt_nascimento” é opcional, podendo informar valor “NULL” no momento da inserção).
-- Inserindo valor NULL para colunas opcionais
INSERT INTO T_SIP_FUNCIONARIO
( nr_matricula, cd_depto, nm_funcionario,
dt_nascimento, dt_admissao,
ds_endereco, vl_salario )
VALUES ( 1235,1, 'JOANA', NULL,
TO_DATE('19/03/2012','DD/MM/YYYY'),
'R. DARIO PEREIRA, 23', 1098.00);
- visualizando a inserção realizada:
SELECT *
FROM T_SIP_FUNCIONARIO;
- outra forma de realizar a inserção é omitindo as colunas opcionais (coluna “dt_nascimento”).
-- Inserindo valor NULL para colunas opcionais
INSERT INTO T_SIP_FUNCIONARIO
( nr_matricula, cd_depto, nm_funcionario,
dt_admissao, ds_endereco, vl_salario )
VALUES ( 1236,1, 'JOANA',
TO_DATE('19/03/2012','DD/MM/YYYY'),
'R. DARIO PEREIRA, 23', 1098.00);
- ao utilizar o comando UPDATE, não é obrigatório informar uma condição para atualização. Porém, se isso não for feito, todas as linhas das tabelas serão afetadas!!!
- é muito importante o uso de uma condição para estabelecer as linhas que deverão sofrer a alteração.
- exemplo: apenas o nome do departamento de código igual a 2 será alterado.
-- ATUALIZANDO OS DADOS NA TABELA
-- DEPARTAMENTO (TEMPORÁRIA)
UPDATE T_SIP_DEPARTAMENTO_TEMP
SET NM_DEPTO='TESTANDO ATUALIZAÇÃO'
WHERE CD_DEPTO=2;
- visualizando a alteração realizada:
SELECT *
FROM T_SIP_DEPARTAMENTO_TEMP;
- o comando UPDATE também aceita o uso de subconsultas.
- exemplo: o nome do departamento de código igual a 6 da tabela “DEPARTAMENTO_TEMP” terá o mesmo nome do departamento de código igual 1 da tabela “DEPARTAMENTO”.
-- ATUALIZANDO OS DADOS NA TABELA
-- DEPARTAMENTO (TEMPORÁRIA)
UPDATE T_SIP_DEPARTAMENTO_TEMP
SET NM_DEPTO =
(SELECT NM_DEPTO FROM T_SIP_DEPARTAMENTO WHERE CD_DEPTO=1)
WHERE CD_DEPTO=2;
- subquery: comando SELECT (consulta), em que recuperamos o nome do departamento de código igual a dois da tabela “DEPARTAMENTO”.
- visualizando a alteração:
SELECT * FROM T_SIP_DEPARTAMENTO_TEMP;
- exemplo: o salário dos funcionários será reajustado em 10%; o cálculo é baseado no valor existente no campo “VL_SALARIO”, acrescido de 10%.
-- ATUALIZAÇÃO DE UMA COLUNA COM BASE NELA MESMA.
-- AUMENTO DE TODOS OS SALÁRIOS EM 10%.
UPDATE T_SIP_FUNCIONARIO
SET VL_SALARIO = VL_SALARIO * 1.10;
- não há cláusula WHERE no comando UPDATE., fazendo com que todos os salários armazenados sejam alterados.
- para visualizar a alteração realizada:
SELECT *
FROM T_SIP_FUNCIONARIO;
- podemos atualizar os dados de várias colunas de um registro:
-- ATUALIZAÇÃO DE VÁRIAS COLUNAS.
-- OS CAMPOS ALTERADOS SÃO SEPARADOS POR VÍRGULA.
UPDATE T_SIP_FUNCIONARIO
SET NM_FUNCIONARIO = 'MARIA DAS DORES',
DT_ADMISSAO = TO_DATE('20/05/2014', 'DD/MM/YYYY'),
DS_ENDERECO = 'RUA DA VEIGA, 97',
VL_SALARIO = 3245.98
WHERE NR_MATRICULA=1236;
- para visualizar a alteração realizada:
SELECT *
FROM T_SIP_FUNCIONARIO;
- as condições utilizadas na cláusula WHERE podem ser estabelecidas com o uso de operadores lógicos e/ou relacionais.
- exemplo: a instrução a seguir estabelece o reajuste do salário em 5% de todos os funcionários admitidos a partir de 01/03/2012 e que possuem remuneração inferior a R$ 1.700,00.
-- ATUALIZAÇÃO UTILIZANDO OPERADORES LÓGICO E RELACIONAL.
UPDATE T_SIP_FUNCIONARIO
SET VL_SALARIO = VL_SALARIO * 1.05
WHERE DT_ADMISSAO >= TO_DATE ('01/03/2012', 'DD/MM/YYYY')
AND VL_SALARIO < 1700.00 ;
- para visualizar a alteração realizada:
SELECT *
FROM T_SIP_FUNCIONARIO;
- no comando DELETE, o uso de condições é opcional; porém, caso não seja estabelecida uma condição, todas as linhas da tabela serão excluídas.
- exemplo:
-- EXCLUINDO OS DADOS NA TABELA.
-- DEPARTAMENTO (TEMPORÁRIA).
DELETE FROM T_SIP_DEPARTAMENTO_TEMP
WHERE CD_DEPTO = 2;
-- apenas o nome do departamento de código = 2 será excluído.
- para visualizar a exclusão realizada:
SELECT *
FROM T_SIP_DEPARTAMENTO_TEMP;
Atomicidade, Consistência, Isolamento e Durabilidade.
Todas as linhas da tabela serão apagadas.
COMMIT.
TO_DATE.
Todas as anteriores.