Você está na página 1de 81

Banco de Dados

SQL
SQL

⚫ SQL (Structured Query Language) é uma


linguagem criada na década de 70 pela IBM
(San-Jose na Califórnia) para manipulação de
Bancos de Dados Relacionais como Oracle,
DB2, SQL Server, Ingres, etc.
⚫ Primeira Implantação no SGBD ORACLE em
1980.
⚫ Inicialmente chamada “SEQUEL”.
2
SQL

⚫ ANSI-SQL é a SQL padrão (desde 87),


definida pelo ANSI (American National
Standard Institute).
Porém, cada SGBD implementa uns
comandos específicos de SQL.
⚫ Alguns SGBDs, como SQL Server, Oracle,
Interbase, só podem ser consultados via
comandos SQL.

3
Características da SQL

⚫ Linguagem não procedural;


⚫ Sem condicional, nem iteração, etc.

⚫ Exprima o “O Quê?” e não o “Como?”


⚫ O SGBD é responsável pela execução do
comando!

4
Três Aspectos

⚫ SQL é uma:
⚫ Linguagem de Definição de Dados - LDD;
⚫ Linguagem de Manipulação de Dados - LMD;
⚫ Linguagem de Segurança de Dados - LSD.

5
Linguagem de Definição dos Dados

⚫ Os comandos de Definição de Dados


permitem a criação de tabelas, índices,
alteração de tabelas, exclusão de tabelas e
índices.
⚫ Exemplo:
⚫ CREATE TABLE, CREATE INDEX;
⚫ CREATE VIEW;
⚫ ALTER TABLE, DROP TABLE;
⚫ DROP VIEW e DROP INDEX.

6
Linguagem de Manipulação dos
Dados
⚫ Os comandos de Manipulação de Dados
permitem a inserção, atualização, exclusão e
seleção de tuplas de uma tabela.
⚫ Exemplo:
⚫ INSERT;
⚫ UPDATE;
⚫ DELETE;
⚫ SELECT.

7
Linguagem de Segurança dos
Dados
⚫ Eles servem para gerenciar o acesso dos
usuários a determinadas tabelas, e manter a
integridade dos dados.
⚫ Exemplo:
⚫ BEGIN TRANSACTION;
⚫ COMMIT;
⚫ ROLLBACK;
⚫ GRANT;
⚫ REVOKE.

8
SQL como uma Linguagem
de Manipulação de Dados
Select
Select [Tipo] Lista-de-Atributos
From Lista-de-Relações
[Condição];
⚫ Para selecionar tuplas nas relações
⚫ Tipo: Pode ser Distinct ou ALL, indica se
apenas as tuplas com valores distintas serão
selecionadas ou todas.
⚫ Lista-de-Atributos: pode ser * (para mostrar
todos os atributos) ou uma lista de atributos
separados por uma virgula. Se os atributos
pertencem a tabelas diferentes às vezes é preciso
usar: nome-tabela.atributo

10
Select

⚫ Lista-de-Relação: Lista das relações


(tabelas) separados por virgula, cujo os
atributos selecionados pertencem.

⚫ Condição: defina o filtro da consulta


usando uma das seguintes claúsulas:
WHERE, GROUP BY, HAVING, UNION,
PLAN, e ORDER BY.
11
Exemplo

⚫ Pilotos da companhia:
SELECT * FROM Pilotos;
⚫ Salário dos pilotos da companhia:
SELECT Nome, Salário FROM Pilotos;
⚫ Idade dos pilotos que moram em Brasília:
SELECT Nome, Idade FROM Pilotos WHERE
Endereço = ‘Brasília’;
⚫ Nome dos pilotos em atividades:
SELECT Distinct Nome FROM Pilotos, Voos WHERE
Voos.PlNUM=Pilotos.PlNUM;

12
Sub-consultas

⚫ São consultas que se baseiam em outras


consultas: Isto é feito incluindo um comando
SELECT na cláusula WHERE da consulta
principal. O segundo comando SELECT deve
estar entre parênteses.
⚫ Pilotos que ganham o mesmo salário que o
Piloto Roberto:
SELECT Nome FROM Pilotos WHERE
Salario= (Select Salario From Pilotos
WHERE Nome=‘Roberto’);

13
Claúsulas

⚫ Where
⚫ Group by
⚫ Having
⚫ Order by

14
Where

⚫ Sintaxe WHERE <condição>


⚫ Alunos morando no São Francisco
SELECT * FROM Alunos WHERE Bairro=
‘São Francisco’;

15
Group by

⚫ Sintaxe GROUP BY <atributo>


⚫ Agrupa as tuplas de uma tabela baseado em
valores comuns de um determinado atributo.
⚫ É utilizado principalmente em funções
agregadas, tais como SUM, AVG, etc.
⚫ Pode ser usado em conjunto com o comando
HAVING.

16
Group by

⚫ Média da capacidade dos aviões por tipo:


SELECT Tipo, AVG(Capacidade) FROM Aviao
GROUP BY Tipo;
⚫ Soma dos salários dos pilotos que moram na
mesma cidade / por cidade
SELECT Cidade, SUM(Salario) FROM Aviao
GROUP BY Cidade;

17
Having

⚫ Sintaxe HAVING <condição>


⚫ Esta cláusula estabelece a condição que os
grupos, criados com a cláusula GROUP BY,
devem atender.
⚫ Média dos preços dos produtos por categoria
e cuja a soma é maior que 1000
SELECT NomeProduto, AVG(Preço) FROM
Produtos GROUP BY Categoria HAVING
SUM(Preço)>1000;

18
Having

⚫ Média dos salários dos pilotos jovens de idade


menor que 30 por cidade e cuja a soma é
maior que 10000
SELECT Cidade, AVG(Salario) FROM Pilotos
WHERE Idade<30 GROUP BY Cidade
HAVING SUM(Salario)>10000;

19
Order by

⚫ Sintaxe ORDER BY <atributo> <ASC/DESC>


⚫ Ordena (de forma crescente: ASC ou
decrescente: DESC) as tuplas selecionadas
sobre um atributo específico.
⚫ Ordem alfabética ascendente do nome dos
pilotos
SELECT * FROM Pilotos ORDER BY Nome
ASC;

20
Order by

⚫ Ordenar por nome e salário os pilotos


SELECT * FROM Pilotos ORDER BY Nome
ASC, Salario DESC;

21
Insert
⚫ Sintaxe INSERT INTO Nome-da-Tabela (atributo1,
atributo2, atributo3) VALUES (valor1, valor2,
valor3)
⚫ Insere uma nova tupla em uma tabela.
⚫ Exemplo: Inserir o piloto João que tem o salário de
60.000:
INSERT INTO Pilotos (Nome, Salario) VALUES (‘João’,
60.000);
⚫ Pode-se usar sub-consultas dentro de uma inserção
(por exemplo incluindo o resultado de uma consulta
como tupla em uma tabela).

22
Update
⚫ Sintaxe UPDATE Nome-da-Tabela SET
atributo1=valor1, atributo2=valor2,
atributo3=valor3
⚫ Atualiza tuplas em uma tabela.
⚫ Exemplo: Aumentar o salário dos pilotos em 10%
UPDATE Pilotos SET Salario=Salario*1,1;
⚫ Exemplo: Aumentar o salário dos pilotos em 10%
apenas os de Brasília
UPDATE Pilotos SET Salario=Salario*1,1 WHERE
Endereço=‘Brasília’;
⚫ É possível usar sub-consultas.

23
Delete

⚫ Sintaxe DELETE FROM Nome-da-Tabela


⚫ Deleta tuplas em uma tabela.
⚫ Exemplo: Remover todos os vôos da
companhia
DELETE FROM Voos;
⚫ Exemplo: Remover todos os vôos da
companhia apenas os que saem de Belém
DELETE FROM Voos WHERE CE=‘Belém’;
⚫ É possível usar sub-consultas.

24
Junção
⚫ Acontece quando a partir de informações em uma
tabela se quer buscar informações em uma outra
tabela que está relacionada.
⚫ Exemplos:
⚫ Nome dos pilotos ativos:
SELECT Nome FROM Pilotos, Voos WHERE
Voos.PlNUM=Pilotos.PlNUM;
⚫ Nome dos pilotos que pilotam um B767:
SELECT Nome FROM Pilotos, Voos, Avioes WHERE
Voos.PlNUM=Pilotos.PlNUM and
Voos.AvNUM=Avioes.AvNUM and Avioes.Tipo=‘B767’;

25
Sinônimos
⚫ Para duplicação de Tabelas, usando nomes menos
compridos.
⚫ Produtos eletrodomésticos:
SELECT Nome FROM Produtos PX WHERE
PX.Categoria=‘Eletrodoméstico’;
⚫ Para duplicação de tabelas.
⚫ Exemplo: Pilotos que ganham o mesmo salário do
piloto João:
SELECT Nome FROM Pilotos PX WHERE
PX.Nome<>‘Adriana’ and PX.Salario=(SELECT Salario
FROM Pilotos WHERE Pilotos.Salario=‘Adriana’);

26
Criação de BDs

⚫ Criação de uma Base de Dados:


CREATE DATABASE Airbase;
⚫ Abertura/Início da Base:
START DATABASE Airbase;
⚫ Remoção da Base:
DROP DATABASE Airbase;

27
Operadores da Linguagem

⚫ Operadores Aritméticos;
⚫ Operadores Lógicos;
⚫ Operadores Relacionais;
⚫ Concatenação de String;
⚫ Operador NULL;
⚫ Operadores Quantitativos.

28
Operadores Aritméticos

⚫ Operação ⚫ Operador
⚫ Adição ⚫ +
⚫ Subtração ⚫ -
⚫ Multiplicação ⚫ *
⚫ Divisão ⚫ / ou :
⚫ Densidade dos países da América Latina:
SELECT Poluçao / area AS Densidade FROM
Paises;

29
Operadores Lógicos

⚫ Operação ⚫ Operador
⚫ E ⚫ and
⚫ OU ⚫ or
⚫ Não ⚫ not

⚫ Pilotos cuja a idade é maior que 30 e que


ganham menos de 3000:
SELECT * FROM Pilotos WHERE Idade>=30
and Salario<=3000;

30
Operador Exists
SELECT PlNUM FROM Voos WHERE NOT
EXISTS (SELECT PlNUM FROM Voos
WHERE NOT EXISTS);

31
Divisão

⚫ Alunos que pegaram emprestado todos os


livros:
SELECT CPD, NOME FROM Alunos WHERE
NOT EXISTS (SELECT LvNUM FROM
Livros WHERE NOT EXISTS) SELECT *
FROM Emprestimo EMP WHERE
Emp.CodAlu=CPD and Emp.CodLiv=LvNUM));

32
Divisão

⚫ Alunos que pegaram emprestado todos os


livros:
⚫Segunda solução que verifica se o número de
livros emprestados é igual ao número de livros.
SELECT CPD, NOME FROM Alunos WHERE
(SELECT COUNT(LvNUM) AS Numero FROM
Emprestimo EMP WHERE Emp.CodAlu=CPD
and Emp.CodLiv=LvNUM) = (SELECT
COUNT(LvNUM) FROM Livro);

33
Operadores Relacionais
⚫ Operação ⚫ Operador
⚫ Igual ⚫ =
⚫ Diferente ⚫ <>
⚫ Maior ⚫ >
⚫ Maior Igual ⚫ >=
⚫ Menor ⚫ <
⚫ Menor Igual ⚫ <=
⚫ Livros emprestados após 20/02/2000:
SELECT * FROM Emprestimo WHERE
Data_Emprestimo >= ’20/02/2000’;

34
Operadores Relacionais

⚫ Operação ⚫ Operador
⚫ Entre de... a ⚫ Between... and
⚫ Em ⚫ In (...,...,...)
⚫ Como ⚫ Like ‘...%...’

⚫ Pilotos que ganham entre 4000 e 5000:


SELECT * FROM Piloto WHERE Salario
BETWEEN 4000 AND 5000;

35
Operadores Relacionais
⚫ Livros sobre SQL:
SELECT * FROM Livro WHERE titulo LIKE
%SQL%;
O % representa vários caracteres
O _ representa apenas um caractere
⚫ Pilotos que tem 30, 40 e 50 anos:
SELECT * FROM Piloto WHERE Idade IN
(30,40,50);

36
Operadores Relacionais
⚫ Pilotos que tem a mesma idade que um piloto
cujo nome começa pela letra ‘J’:
SELECT * FROM Piloto WHERE Idade In
(SELECT Idade FROM Pilotos WHERE
Nome LIKE %J%);
⚫ Pilotos que pilotam os aviões 14 e 15:
SELECT PlNUM FROM Voos WHERE
AvNUM=14 AND PlNUM IN (SELECT
PlNUM FROM Voos WHERE AvNUM=15);

37
Concatenação de Strings

⚫ É o operador || ‘’João’ || ’Carlos’ →


’João Carlos’
⚫ Outros Bancos de Dados (como Access) usam
o operador +.
⚫ Mas outros (como dBase) não aceitam
concatenação de strings.

38
Operador Null

⚫ Sintaxe: atributo IS NULL


⚫ Para testar se um atributo não foi preenchido
(atributo nulo).
⚫ Colocar 2000 o salário dos pilotos cujo os
endereços não foram preenchidos:
UPDATE Pilotos SET Salario=2000 WHERE
Endereço IS NULL;

39
Operadores Quantitativos

⚫ Operação ⚫ Operador
⚫ Todos ⚫ ALL
⚫ Algum ⚫ SOME / ANY

⚫ Permitem comparar um valor a um conjunto


de valores.
⚫ Quais os pilotos mais pagos:
SELECT Nome, Salario FROM Pilotos WHERE
Salario >= ALL (SELECT Salario FROM
Pilotos);

40
Operadores Quantitativos
⚫ Pilotos que ganham mais que todos os pilotos
maranhenses:
SELECT Nome, Salario FROM Pilotos WHERE
Salario >= ALL (SELECT Salario FROM
Pilotos WHERE Estado=‘Maranhão’);

41
Funções

⚫ Funções de manipulação de strings


⚫ Funções agregadas (de cálculo)

42
Funções de manipulação de strings

⚫ UPPER: transformação em maiúsculo


⚫ LOWER; transformação em minúsculo
⚫ LTRIM; retira os caracteres em branco a
esquerda
⚫ LTRIM(' Roberta’)
⚫ RTRIM; retira os caracteres em branco a direita
⚫ SUBSTRING. Cria uma substring a partir de
uma outra string
⚫ SUBSTRING(’Maria de Fátima’, 2, 4)
retorna ’aria’

43
Funções de manipulação de strings

⚫ Exemplo:
⚫ Capital da Colômbia:
SELECT Nome, Capital FROM Paises WHERE
UPPER (Nome)=‘COLÔMBIA’);
⚫ Senão tem que escrever o nome Colômbia
exatamente como está na relação.
⚫ Pode-se usar também o LOWER:
SELECT Nome, Capital FROM Paises WHERE
LOWER (Nome)=‘colômbia’);

44
Funções Agregadas

⚫ Count;
⚫ AVG;
⚫ Min;
⚫ Max;
⚫ SUM;

45
Count

⚫ Sintaxe: COUNT ( )
⚫ Retorna o número de tuplas na tabela.
⚫ Sintaxe: COUNT ([all] <val>)
⚫ Conta todos os valores não nulos (NOT NULL) do
atributo ou expressão especificado pelo (val).
⚫ Sintaxe: COUNT (Distinct <val>)
⚫ Retorna o número de valores únicos e não nulos,
do atributo ou expressão especificado pelo (val).

46
AVG

⚫ Determina a média dos valores de um determinado


atributo ou expressão
⚫ Sintaxe: AVG ([all] <val>)
⚫ Calcula a média de todos os valores não nulos (NOT NULL)
do atributo ou expressão especificado pelo (val).
⚫ Sintaxe: AVG (Distinct <val>)
⚫ Retorna a média dos valores únicos e não nulos, do atributo
ou expressão especificado pelo (val).

47
MIN

⚫ Sintaxe: MIN ([all] <val>)


⚫ Retorna o mínimo de todos os valores não nulos
(NOT NULL) do atributo ou expressão especificado
pelo (val).
⚫ Sintaxe: MIN (Distinct <val>)
⚫ Retorna o mínimo dos valores únicos e não nulos,
do atributo ou expressão especificado pelo (val).

48
MAX

⚫ Sintaxe: MAX ([all] <val>)


⚫ Retorna o máximo de todos os valores não nulos
(NOT NULL) do atributo ou expressão especificado
pelo (val).
⚫ Sintaxe: MAX (Distinct <val>)
⚫ Retorna o máximo dos valores únicos e não nulos,
do atributo ou expressão especificado pelo (val).

49
SUM

⚫ Sintaxe: SUM ([all] <val>)


⚫ Retorna a soma de todos os valores não nulos
(NOT NULL) do atributo ou expressão especificado
pelo (val).
⚫ Sintaxe: SUM (Distinct <val>)
⚫ Retorna a soma dos valores únicos e não nulos, do
atributo ou expressão especificado pelo (val).

50
Exemplo

⚫ Pilotos que ganham mais que todos os pilotos


maranhenses:
SELECT Nome, Salario FROM Pilotos WHERE
Salario = (SELECT MAX(Salario) FROM
Pilotos WHERE Estado=‘Maranhão’);

51
Atributos Virtuais

⚫ É possível atribuir o resultado de uma


consulta SQL, usando uma operação
matemática, a um atributo da relação:
SELECT SUM(Salario) AS SomaSalario FROM
Clientes;
⚫ Cria um atributo virtual SomaSalario

52
Tipos de Dados SQL

⚫ Caracteres;
⚫ Numéricos;
⚫ Datas;
⚫ Dados Extensos;
⚫ Outros;

53
Tipos Caracteres

⚫ Char
⚫ Varchar
⚫ Exemplo:
CREATE TABLE Clientes (Nome char(35))
INSERT INTO Clientes VALUES (‘Maria’);
⚫ Maria será representado sobre 35 caracteres.
Porém, caso a declaração seja feita com varchar
apenas 5 caracteres serão representados.

54
Tipos Numéricos

⚫ smallint: números inteiros de -32.768 a 32.767.


⚫ integer (int): números inteiros de -2.147.483.648 a
2.147.483.648.
⚫ Numeric[(p, d)]: número com precisão de até 15
dígitos (p corresponde à precisão). d corresponde ao
número de decimais.
⚫ Exemplo: numeric(10,3) terá dez dígitos,
sendo três depois da vírgula e apenas sete dígitos
correspondem à parte inteira.

55
Tipos Numéricos

⚫ decimal (p, d): semelhante ao tipo numeric.


⚫ float: número científico com até 7 dígitos de
precisão. Representa números de 3,4 * 10-38
3,4 * 1038. Ocupa na memória 32 bits (4
bytes).
CREATE TABLE Clientes (Nome char(35),
preço float);

56
Datas
⚫ O tipo date:
⚫ Uma data é colocada entre apóstrofos:
⚫ ‘01/01/2000’
⚫ No caso do ACCESS é preciso usar #:
⚫ #01/01/2000#

57
Tipo Blob para dados extensos

⚫ O tipo de dado BLOB (Binary Large Object)


é usado para representar dados extensos.
Este tipo de dado armazena dados multimídia,
como gráficos, textos, e sons.
⚫ Exemplo:
CREATE TABLE Clientes (foto bolb);

58
Outros Tipos

⚫ Existe outros tipos como:


⚫ Boolean ou Logical, ou Yes/No;
⚫ Autoinc ou Autoincrement;
⚫ Money ou $ ou Currency;
⚫ Memo, etc.

59
Conversão de Tipos entre SGBDs

SQL My SQL Paradox Access SQL Server

char char alpha text char

varchar varchar alpha text varchar

smallint smallint short number (integer) smallint

integer integer long number (long integer


integer integer)
float float number number (double) float

numeric numeric number number (double) numeric

decimal decimal bcd - decimal

date Date/time date date/time dateetime

blob blob memo memo -

60
SQL como uma Linguagem
de Definição de Dados
Os comandos

⚫ CREATE TABLE, ALTER TABLE, DROP


TABLE;
⚫ CREATE INDEX, DROP INDEX;
⚫ CREATE VIEW, DROP VIEW.
⚫ CRETAE DATABASE, START DATABASE,
DROP DATABASE

62
Linguagem de Definição de Dados

⚫ Correspondência:
⚫ Relação → tabela
⚫ Atributo → coluna
⚫ Domínio → ?
⚫ Infelizmente a noção de domínio não existe em
SQL.

63
Create Table

⚫ Sintaxe: CREATE TABLE Nome-da-Tabela (atributo


tipo <descriçao>, atributo2 tipo <descriçao>
<restrições>)
⚫ Tipo: char, numeric, date
⚫ <descrição>: NOT NULL / UNIQUE (não existe no
paradox e dbase e NOT NULL não tem no Access)
⚫ <restrições>: Primary key / Foreign key (att)
References (Relaçao)

64
Exemplos
CREATE TABLE Produto (Codigo smallint,
Nome char(30), Preco float)

CREATE TABLE Produto (Codigo smallint,


Nome char(30), Preco float NOT NULL)

CREATE TABLE Produto (Codigo smallint,


Nome char(30), Preco float NOT NULL,
PRIMARY KEY (Codigo))

65
Criação com Sub-Consultas

⚫ Criando relações à partir de outra:


CREATE TABLE NovosPilotos (Nome,
Salario) AS (SELECT Nome, Salario
FROM Pilotos WHERE Data_Admissão
> ‘01/01/2000’)

66
Alter Table

⚫ Adicionar um novo atributo:


ALTER TABLE Pilotos ADD Idade smallInt;
⚫ Deletar/Alterar um atributo:
ALTER TABLE Pilotos DROP Idade;
ALTER TABLE Avião MODIFY CAP TO
Smallint;
⚫ SQL Server não permiti a exclusão de atributos via
comandos SQL!

67
Drop Table

⚫ Deletar tabelas:
DROP TABLE Pilotos;

68
Create Index
⚫ Criação de índices para tabelas. Os índices
são usados para aumentar a velocidade de
acesso às tabelas.
CREATE INDEX iNome ON Clientes (Nome);
⚫ Índice Múltiplo:
CREATE INDEX iNomeIdade ON Clientes
(Nome, Idade);
⚫ Índice Único:
CREATE UNIQUE INDEX iNome ON Clientes
(Nome);

69
Drop Index

⚫ Deletar Índices:
DROP INDEX Tabela.NomeIndex
⚫ Exemplo:
DROP INDEX Clientes.iNome;

70
Create View

⚫ Criar uma visão de uma ou mais tabelas. Uma


visão é uma tabela virtual:
CREATE VIEW Nome-da-Visao (atributos) AS
<subconsulta>
⚫ Exemplo:
CREATE VIEW PilotosMaranhenses AS
SELECT * FROM Pilotos WHERE
Estado=‘Maranhão’;
⚫ Create view não é suportado pelo dbase e
paradox.

71
Drop View

⚫ Deletar Visões:
DROP VIEW Nome-da-Visao
⚫ Exemplo:
DROP VIEW PilotosMaranhenses;

72
Manipulação das visões

⚫ Pilotos maranhenses cuja a idade é menor


igual a 30.
SELECT Nome FROM PilotosMaranhenses
WHERE Idade <=30;

73
SQL como uma Linguagem
de Segurança de Dados
Os comandos

⚫ GRANT, REVOKE;

⚫ BEGIN TRANSACTION;
⚫ COMMIT, ROLLBACK.

75
GRANT

⚫ Para limitar o acesso do usuário aos dados


das tabelas
⚫ Sintaxe: GRANT tipo acesso ON
NomeTabela TO login, senha
⚫ Exemplo:
GRANT SELECT ON Voos TO adm, password
;

76
REVOKE

⚫ Este comando revoga concessões feitas


anteriormente pelo comando GRANT.
⚫ Sintaxe: REVOKE ListaPrivilegios FROM
NomeTabela login
⚫ Exemplo:
REVOKE SELECT FROM Voos adm;

77
Os direitos

⚫ Select, Insert, Update, Delete,...


⚫ O ALL concede todos os direitos:
GRANT ALL ON Voos TO adm;
⚫ Direito a dar direitos:
GRANT ALL ON Voos TO adm WITH GRANT
OPTION;

78
Begin Transactions

⚫ Este comando inicia uma transação. Enquanto


o comando COMMIT não for executado,
todas as inserções, alterações, etc. feitas
após um comando BEGIN TRANSACTION
não são efetivadas.
⚫ Sintaxe: BEGIN TRANSACTION Nome-
Transação

79
Commit

⚫ Este comando efetiva as operações no banco


de dados. Enquanto este comando não for
executado, todas as inserções, alterações, etc
não são efetivadas, garantindo a integridade
dos dados quando diversas operações
simultâneas precisam ser feitas no banco de
dados.
⚫ Sintaxe: COMMIT Nome-Transação

80
RollBack

⚫ Este comando elimina as operações que


ainda não foram efetivadas.
⚫ Sintaxe: ROLLBACK Nome-Transação

81

Você também pode gostar