1. Tópicos Especiais em
Desenvolvimento de Software
Aprofundamento de DDL & DML
Objetivo: Resgatar recursos avançados de
bancos de dados
Prof. Nécio de Lima Veras
3. Relembrando DDL
• Qual sua serventia?
• Possui conjuntos de:
– Domínios (incluindo o valor null);
– Comandos:
• Create (database, table, ...);
• Alter;
• P/ restrições de integridades (chaves,
valores com checagens, valor padrão,
valor único, valor não nulo, referencial);
• Certo, e agora o que podemos ter de
novidade?
4. Eis algumas novidades...
• Criação de domínios;
• Criação de índices;
• Criação de gatilhos;
• Criação de procedimentos;
• Criação de funções;
• Criação de visões;
5. Criação de Domínios
• Útil para padronizações;
• Comando:
create domain <identificador> <tipo> [opções]
• Exemplos:
1)create domain nomePessoa varchar(45);
2)create domain codigos int not null
default autoincrement;
3)create domain combustiveis varchar(15)
check (combustiveis in ('Gasolina',
'Alcool', 'Diesel', 'Flex'));
● Detalhe, o mySQL não implementa;
6. Apagando um domínio
• drop domain <identificador>;
• Cuidado, pois você poderá estar usando o
domínio;
7. Criação de Índices
• Serve para otimizações de consultas;
• Para as chaves já são criados índices automáticos;
• Sintaxe:
create index <identificador> on <tabela>
(coluna [ asc || desc] [, ...]);
• Exemplos:
create index idx_notaR on TBNotas (nNotaR
asc);
create index idx_inicioNome on tbAluno
(vNome (10)); → note a diferença (este
pega apenas os 10 primeiros caracteres do
nome);
8. Mais sobre índices
• Sintaxe do Comando p/ excluir:
drop index <identificador> on <tabela>;
Exemplo:
drop index idx_notaR on tbNotas;
• Visualizando (mySQL):
– show index from tbNotas;
9. Gatilhos (triggers)
• Servem como armas prontas para serem
disparadas;
• Sintaxe do comando (mySQL):
create trigger <identificador> <tempo>
<evento> on <tabela> for each row
begin
end
– Tempo: Before ou After;
– Evento: Insert, Update ou Delete;
10. Gatilhos (triggers)
• Limitações (mySQL):
– Não pode realizar chamadas a
procedimentos ou funções que retornem
dados ou usam comandos SQL
dinâmicos, por exemplo: now();
– Não pode ter comandos explícitos de
controle de transações, por exemplo:
commit ou rollback;
11. Gatilhos (triggers)
• Exemplo (o campo dDataNasc SEMPRE será null):
delimiter !
create trigger dataNascNull before insert on tbAluno
for each row
begin
if new.dDataNasc is not null then
set new.dDataNasc = null;
end if;
end; !
delimiter ;
12. Exibindo os gatilhos (mySQL)
• Comando:
show triggers from <database>;
– Exemplo:
show triggers from dbTeste;
• Excluindo:
– drop trigger <nome_da_trigger>;
– Exemplo:
drop trigger dataNascNull;
13. Criação de Procedimentos
• Serve para promover:
– Modularização;
– Refatoração;
– E evitar códigos duplicados;
• Sintaxe do comando (mySQL):
create procedure <identificador> ([tipo_parametro]
<identificador_parâmetro> <tipo> [,...])
begin
end;
• Observações:
– Tipo_Parâmetro: in , out ou inout;
14. Exemplos de Procedimento
• Criando:
create procedure addAluno (in nome varchar(30))
begin
insert into tbAluno (vNome)
values (nome);
end;
• Executando:
call addAluno ('Nécio Veras');
• Excluindo:
drop procedure addAluno;
• Visualizando:
select * from information_schema.routines; ou
show procedure status;
15. Exemplo de um procedimento
com retorno
• Criando o procedimento:
create procedure recuperaAluno (in cod int, out
nome varchar(30), dataNasc date)
begin
select vNome, dDataNasc from tbAluno
where id = cod
into nome, dataNasc;
end;
• Executando:
call listaAluno (10, @nm, @dt);
• Exibindo o resultado:
select @nm, @dt
16. Funções
• Retornam valores (podem inclusive serem
calculados);
• Também servem para criar UDF's
(Funções definidas por usuários);
• Sintaxe do comando:
create function <identificador>
(<identificador_parâmetro> <tipo> [,...])
returns <tipo>
begin
end;
17. Exemplo
• Retornando a média:
create function calcMedia (codNota int)
returns numeric(4,1)
begin
declare n1 numeric(4,1);
declare n2 numeric(4,1);
select nNota1, nNota2 from tbNotas where iNota_id =
codNota
into n1, n2;
return (n1 + n2) / 2;
end;
• Executando:
select calcMedia (101);
18. Visões
• É um select pré-moldado, serve para
personalizar comandos de consulta e deixá-
los preparados para a execução;
• Sintaxe do comando:
create view <identificador> [<lista de
colunas>] as <comando select>;
• Exemplo:
create view listaAlunos (cod, nome)
as select id, vNome from tbAluno;
• Visualizando:
select * from listaAlunos ;
19. Exercícios
• Abstraia e crie um banco qualquer (com 3 tabelas que
se relacionem)
– Crie índices que possam agilizar possíveis
consultas futuras;
– Crie gatilhos que possam ser úteis ao banco de
dados;
– Crie procedimentos que padronize as
operações CRUD em TODAS as tabelas;
– Crie funções que possam agilizar possíveis
cálculos;
– Crie visões que forneçam suporte para a
construção de relatórios (a serem imaginados
por você!)
21. Aprofundando
• Sabemos que existem as operações
CRUD que servem como base para a
DML;
• O aprofundamento se dá, principalmente,
no comando de RETRIVE;
– SELECT;
• As outras operações, praticamente, não
existem variações dentre o que já foi
exposto;
22. Relembrando...
• Formatação básica:
select A1, A2, A3, ..., An
from r1, r2, ..., rm
where P
onde Ai representa um atributo
ri é uma (relação) tabela
P é um predicado (condição/critério de seleção).
23. A cláusula BETWEEN
• Especifica intervalos (inclusive);
• Ex:
SELECT numero_emprestimo
FROM emprestimo
WHERE total BETWEEN 90 AND 100;
• Similarmente, temos o NOT BETWEEN;
24. A cláusula From
• Define um produto cartesiano das relações;
– A junção natural é definida em termos de produto cartesiano;
• Exemplo:
– Queremos a seguinte consulta: “para todos os clientes que
tenham um empréstimo em um banco, encontre seus
nomes e números de empréstimos”;
– Em SQL:
SELECT distinct nome_cliente,
devedor.numero_emprestimo
FROM devedor, emprestimo
WHERE devedor.numero_emprestimo =
emprestimo.numero_emprestimo
– Observe as especificações de <tabela>.<coluna> , pois isso
servirá para evitar AMBIGUIDADES;
25. A cláusula As
• Como as tabelas podem possuir nomes relativamente
grandes, então podemos “apelidá-las” usando a cláusula
As;
• O mesmo comando anterior ficaria:
SELECT distinct nome_cliente,
d.numero_emprestimo
FROM devedor as d, emprestimo as e
WHERE d.numero_emprestimo =
e.numero_emprestimo
• Pode ser aplicado no nome da tabela ou no nome do
campo;
– No caso do nome do campo será “apelidada” a
coluna do resultado da consulta;
26. Cláusula Like
• É aplicado em operações de Strings;
• Serve para checar coincidências de pares;
• Elementos:
% => Compara qualquer substring;
_ => Compara qualquer caractere;
• Lembre-se que são sensíveis ao caso;
• Exemplo:
SELECT nome_cliente FROM cliente
WHERE rua_cliente LIKE ‘%Avenida%’;
• Outros exemplos:
– 'Francisco%' => Qualquer valor que inicie com Francisco;
– '_ _ _' => Qualquer string que tenha 3 caracteres;
• Também podemos usar o NOT LIKE;
27. Cláusula Order By
• Serve para ordenar as tuplas resultantes de uma
consulta;
• Temos duas opções:
– Asc => Ascendente;
– Desc => Descendente;
• Pode ordenar qualquer tipo de atributo;
• Exemplo:
SELECT *
FROM emprestimo
ORDER BY total DESC, numero_emprestimo
ASC;
28. A Cláusula Join
• Compõem mecanismos de junção de DUAS relações, são eles:
– Junção condicional;
– Junção natural;
– Junção externa;
– Outras...
• Tipos de junção:
– Define como as tuplas de cada relação irão se corresponder e quais
atributos serão incluídos no resultado final;
– São eles:
• Inner Join (junção interna);
• Outer Join (junção externa);
– São opcionais estas especificações;
– Tipos de condições:
• Natural;
• On;
• Using;
29. Junção Interna
• É quando tuplas são incluídas no resultado de uma
consulta somente se existir uma correspondente na
outra relação;
• Exemplo:
SELECT tabela1.atributo1, tabela2.atributo2
FROM tabela1 INNER JOIN tabela2 ON
tabela1.atributo1 = tabela2.atributo2;
• Se o nome dos atributos for igual, não há necessidade da
cláusula ON, basta usar o NATURAL;
SELECT tabela1.atributo1, tabela2.atributo2
FROM tabela1 NATURAL JOIN tabela2;
– Neste caso, a cláusula INNER também não
precisa;
30. Junção Externa
• É quando tuplas são incluídas no resultado sem que exista
uma tupla correspondente na outra relação;
• Tipos:
– RIGHT OUTER JOIN = Junção Externa a Direita;
– LEFT OUTER JOIN = Junção Externa a Esquerda;
– FULL OUTER JOIN = Junção Externa Total (Junção
Externa a Esquerda + Junção Externa a Direita);
• Exemplo:
SELECT R1.A1, R2.A2
FROM R1 RIGHT OUTER JOIN R2 ON R1.A1= R2.A2;
ou
SELECT R1.A1, R2.A2
FROM R1 LEFT OUTER JOIN R2 ON R1.A1= R2.A2;
31. Operações de Conjunto
• Possuímos as operações de União, Interseção e
Exceção (exceto ou subtração);
• Exemplo de união:
(SELECT nome_cliente FROM depositante)
UNION
(SELECT nome_cliente FROM devedor);
• Esta operação, automaticamente, eliminina as
repetições;
– Se isso não for desejado então usa-se UNION
ALL;
– E isso é válido para TODAS as operações de
conjunto;
32. Operações de conjunto
• De forma análoga à união, temos:
– Interseção : intersect;
– Exceção: except;
33. Funções agregadas
• São funções simples que parte de um conjunto de dados
(valores) e retorna uma valor simples (único);
• Exemplos:
– Média (average): avg;
– Mínimo (minimum): min;
– Máximo (maximum): max;
– Total (total): sum;
– Contagem (count): count;
– Desvio Padrão: stddev;
• Exemplo:
SELECT avg(saldo) FROM conta
WHERE nome_agencia = ‘Parnaíba-Central’;
34. A cláusula Group By
• Existem circunstância em que gostaríamos de
aplicar uma função agregada não somente a
um conjunto de tuplas, mas também a um
grupo de conjunto de tuplas;
• Isso é possível usando a cláusula SQL group
by;
• Exemplo: 'Encontrar a média dos saldos nas
contas de cada uma das agências do banco':
SELECT nome_agencia, avg(saldo)
FROM conta
GROUP BY nome_agencia;
35. Leia sobre ...
• Existem ainda muitas outras coisas que
devem ser pesquisadas e estudadas, tais
como:
– Subconsultas (Cláusulas IN, SOME, ALL,
EXISTS, UNIQUE);
– Subconsultas escalares;