Escolar Documentos
Profissional Documentos
Cultura Documentos
FACULDADE DE ENGENHARIA
1
4.1 – Strings
4.2 – Matemáticas
4.3 - Agrupamento (Agregação)
4.4 - Data/Hora
4.5 - Formatação de Tipos de Dados
4.6 - Conversão de Tipos (CAST)
Capítulo 5 - Funções Definidas pelo Usuário e Triggers
5.1 - SQL
5.2 - PlpgSQL
5.3 – Triggers
Capítulo 6 - DCL (Data Control Language) - Administração
6.1 - Administração de usuários, grupos e privilégios
Prof: Santos
Prof: Msc. Hugo Dias Dos Santos 5
Modelo Entidade Relacionamento
1.Revisão de conceitos Gerais do MER
6
Convém salientar que, caso a lista de atributos não contenha atributos chaves,
então é provável que tuplas duplicadas apareçam no resultado.
A operação de projeção remove implicitamente todas tuplas duplicadas, para que o
resultado da operação seja um conjunto de tuplas e assim, uma relação válida. Por
exemplo, considere a seguinte operação:
π SEXO, SALÁRIO (EMPREGADO)
Exercícios
de
Aplicação.
Prof: Msc. Hugo Dias Dos Santos
II:SQL,DDL, 31
Oracle SyBase
Informix DB2
Ingress MySQL
SQL Server PostgreSQL
Interbase WampServer
Modificar ou Alterar;
Tabelas
ALTER TABLE [Nome tabela];
Vistas
ALTER VIEW [Nome_vista] AS SELECT [lista_de_colunas]
FROM nome_tabela;
Inserção:
INSERT INTO nome_tabela [([col1],[col2],[coli],[coln] )]
VALUES [([val1],[val2],[vali],[valn] )] ;
Seleção:
SELECT (Lista_de_atributos) FROM (Lista_de_tabelas);
Actualização:
UPDATE nome_tabela SET coluna=valor WHERE (condição);
Deleção:
DELETE FROM nome_tabela WHERE (condição);
nome VARCHAR(40)) ;
(numero INT(10),
nome VARCHAR(40),
);
OBS: antes de criar novamente esta tabela na base u106 deve ser
apagada a tabela criada anteriormente com o mesmo nome.
OBS: poderiamos apenas alterar a tabela com o comando Alter e
a cláusula Modify, mas estes items são tratados em sessões
posteriores.
Outro exemplo: Criar uma tabela empregados com duas restrições CHECK.
A primeira restrição, ck_nome_empregados, obriga a que os nomes tenham
um espaço no meio, ou seja, que exista pelo menos um nome e um apelido
para cada empregado.
A outra restrição, ck_funcao_empregado, obriga a que a função do
empregado esteja em uma lista de valores proposto, no nosso exemplo, entre
‘Presidente’, ‘Analista’ e ‘Vendedor’.
Wamp
CREATE TABLE empregados
(numero INT(10) PRIMARY KEY,
Nome VARCHAR(40) NOT NULL,
data_entrada Varchar(20),
Funcao VARCHAR(20) DEFAULT ‘Programador’,
Sal INT(10) Default 200000 ,
Premios INT(6));
Os nomes das restrições são usados por vários SGBDs para dar uma pista
ao utilizador do que é que correu mal durante uma instrução SQL.
É importante definir nomes de restrições que permitam saber exactamente
que tipo de restrição (em que tabela, em que coluna, chave primária, chave
forasteira, NOT NULL, etc.) impediu a execução normal do comando.
Cada programador ou equipa de programadores deve definir o seu próprio
esquema de nomeação de restrições.
Não existe nenhuma regra fixa mas uma sugestão é usar:
descrição_coluna_tabela
Onde descrição indica que tipo de restrição se está a usar (pk=PRIMARY
KEY, fk=FOREIGN KEY, ck = CHECK, nn=NOT NULL, uni =UNIQUE),
coluna é o nome sobre o qual a restrição actua e tabela é o nome da
tabela dessa coluna.
Activar Restrições
Da mesma forma que é possível desactivar restrições também é possível
activá-las. A sintaxe para activar restrições é:
ALTER TABLE tabela
ENABLE CONSTRAINT nome_condição;
Exemplo: Activa a restrição ck_sexo_empregados
ALTER TABLE empregados
ENABLE CONSTRAINT ck_sexo_empregados;
de
avaliação
Prof: Msc. Hugo Dias Dos Santos
Os Índices
67
Vamos criar uma vista (VIEW) que faz uma selecção vertical
e horizontal sobre uma tabela:
CREATE OR REPLACE VIEW empregado_v1 AS SELECT
nome, numero, funçao FROM empregado WHERE numero in (1,2,3);
Ou CREATE OR REPLACE VIEW bebe_v1 AS SELECT bnome,
id_bebe, bid_mae, peso FROM bebe WHERE peso<4;
Esta VIEW pode ser consultada com o seguinte comando:
SELECT * FROM bebe_v1;
Se dermos GRANT SELECT desta VIEW a outro utilizador,
este só verá as linhas e colunas por ela filtradas, esta vista
mostra apenas um subconjunto da tabela original.
de
aplicação
Prof: Msc. Hugo Dias Dos Santos
DQL: Linguagem de Consultas de Dados
78
de
aplicação
Prof: Msc. Hugo Dias Dos Santos
87
III: Funções
DATE_FORMAT(<data_para_fomatar>,<formato_desejado): como o
nome indica nos permite mudar o formato da apresentação da data. Se a
letra Y fornecida em parametros for minúscula então a dota retornada
tera apenas dois digitos para o ano especificado.
EX: Select date_format(current_date(),’%D/%M/%Y’);
DATEDIFF (data1,data2): Retorna a diferença em dias entre data1 e
data dois. O resultado pode ser negativo.
Ex: obter a diferença de dias entre o primeiro pedido e todos pedidos da
tabela pedido;
R: SELECT data, DATEDIFF(data,(select data from pedido where
cod_pedido=1)) " diferença de dias" from pedido;
DAYOFYEAR(data): Retorna o numero do dia no ano da data em
paramentro.
Ex1: Select DAYOFYEAR(current_date());
As funções de agregação, como ilustradas nos exemplos abaixo, são usadas dentro de
uma cláusula SELECT em grupos de dados para devolver um único valor que se aplica
a um grupo de dados.
AVG – Utilizada para calcular a média dos valores de um campo determinado;
Exemplo: SELECT AVG(credito) FROM cliente;
COUNT – Utilizada para devolver o número de registros da seleção;
Exemplo: SELECT COUNT(especialidae) FROM medico;
SUM – Utilizada para devolver a soma de todos os valores de um campo determinado;
Exemplo: SELECT SUM(Credito) ‘’ Soma Dos Creditos ‘’ FROM cliente;
MAX – Utilizada para devolver o valor mais alto de um campo especificado;
Exemplo: SELECT MAX(credito) FROM cliente;
Exemplo2 : SELECT nome,credito from cliente where credito like (select max(credito)
from cliente);
MIN – Utilizada para devolver o valor mais baixo de um campo especificado.
Exemplo: SELECT nome, credito FROM cliente HAVING MIN (credito);
VARIANCE :Determina a variância de n, ignorando valores nulos.
Sintaxe:
CREATE TRIGGER nome {BEFORE|AFTER} {evento[OR...]} ON tabela [FOR[EACH]
{ROW|STATEMENT} ]EXECUTE PROCEDURE nome_da_função (argumentos)
O gatilho fica associado à tabela especificada e executa a função
especificada nome_da_função quando determinados eventos ocorrerem.
O gatilho pode ser especificado para disparar antes de tentar realizar a
operação na linha (antes das restrições serem verificadas e o comando
INSERT, UPDATE ou DELETE ser tentado), ou após a operação estar
completa (após as restrições serem verificadas e o INSERT, UPDATE ou
DELETE ter completado).
evento Um, entre INSERT, UPDATE ou DELETE; especifica o evento que
dispara o gatilho.
Vários eventos podem ser especificados utilizando OR.
Exempo:
TRIGGER
DELIMITER $$
CREATE TRIGGER Cliente_aud BEFORE UPDATE ON cliente
FOR EACH ROW BEGIN
INSERT INTO cliente_auditoria
SET acao = 'update',
N_asso = OLD. N_asso,
sobrenome = OLD.sobrenome,
modificadoem = NOW(); END $$
DELIMITER ;
IV: DCL
Administração
Prof: Msc. Hugo Dias Dos Santos
DCL: Linguagem de controlo de dados
120
V:Controlo de
Concorrência
Prof: Msc. Hugo Dias Dos Santos
1. Transacção
128
Exemplo em anexo C.
Prof: Msc. Hugo Dias Dos Santos
4. SERIALIZABLE / SERIABILIDADE
157
commit;
Forçar o inicio de uma nova
SET TRANSACTION
transacção na Sessão 2.
ISOLATION
Definir ao nível da transacção o nível
2 LEVEL
SERIALIZABLE; de isolamento SERIALIZABLE.
Select*from Verificar que a nova tabela já é
teste; visível.
insert into teste
(id,nome) values
(1,'aaaaaa');
insert into teste (id,
A Sessão 1 insere várias linhas na tabela
3 nome)values
(2,'bbbbbb'); TESTE mas não confirma as alterações.
insert into teste (id,
nome) values
(3,'cccccc');
159
As alterações feitas na tabela TESTE pela Sessão 1
select * from
5 teste; ainda não são visíveis na Sessão 2 pois ainda não estão
confirmadas.
update teste
set nome= 'CCCCCC' A Sessão 1 executa um UPDATE e confirma a alteração,
8 where id=3; terminando a transacção. Esta alteração é visível na
commit; Sessão 1.
Select*from teste;
Este exemplo mostra que a Sessão 2 só consegue ver as alterações feitas pela Sessão 1
que foram confirmadas e que a Sessão 2 executou o mesmo SELECT várias vezes dentro
da mesma transacção, tendo obtido sempre o mesmo resultado, mesmo com transacções
externas a fazerem INSERT, UPDATE e DELETE. O grau de isolamento foi total;
Como o isolamento foi definido ao nível da transacção, quando esta termina a sessão
volta a trabalhar com o nível READ COMMITED.
Do ponto de vista teórico o nível SERIALIZABLE é muito interessante, mas na prática
obriga a base de dados a um trabalho extra muito pesado, pois tem que guardar uma
fotografia dos dados num determinado instante no tempo. Isto consome espaço
adicional nos segmentos de rollback, que têm armazenamento finito, e obriga a uma
carga acrescida de I/O e CPU.
Na maior parte das situações o nível READ COMMITED é suficiente, sendo por isso o
nível por omissão. O programador deve estar atento às situações especiais onde é
requerido o nível SERIALIZABLE para o activar.
OBS: Até há pouco tempo atrás algumas bases de dados disponíveis no mercado não
faziam sequer READ COMMITED.
8.3 - Converter
8.4 - Otimização e
Desempenho
Prof: Msc. Hugo Dias Dos Santos
164
Ob
riga
Pel do
Ate a
nçã
o
Perguntas ou dúvidas???
Prof:Prof:
Santos
Msc. Hugo Dias Dos Santos
Outros Comandos
165
BFILENAME PATH
COALESCE PRESENTNNV
PRESENTV
CV PREVIOUS
DECODE SYS_CONNECT_BY_PATH
DEPTH SYS_CONTEXT
DUMP SYS_DBURIGEN
EMPTY_BLOB, EMPTY_CLOB SYS_EXTRACT_UTC
EXISTSNODE SYS_GUID
EXTRACT(XML) SYS_TYPEID
SYS_XMLAGG
EXTRACTVALUE
SYS_XMLGEN
GREATES UID
LEAST UPDATEXML
LNNVL USER
NLS_CHARSET_DECL_LEN USERENV
NLS_CHARSET_ID VSIZE
NLS_CHARSET_NAME XMLAGG
XMLCOLATTVAL
NULLIF
XMLCONCAT
NVL XMLFOREST
NVL2 XMLSEQUENCE
XMLTRANSFORM
AVG PERCENTILE_CONT
PERCENTILE_DISC
COLLECT PERCENT_RANK
CORR RANK
CORR_* REGR_Funções (Regressão Linear)
COUNT STATS_CROSSTAB
COVAR_POP STATS_F_TEST
COVAR_SAMP STATS_KS_TEST
STATS_MODE
CUME_DIST
STATS_MW_TEST
DENSE_RANK STATS_ONE_WAY_ANOVA
FIRST STATS_T_TEST_*
GROUP_ID STATS_WSR_TEST
GROUPING STDDEV
GROUPING_ID STDDEV_POP
LAST STDDEV_SAMP
SUM
MAX
VAR_POP
MEDIAN VAR_SAMP
VARIANCE
DEREF CV
MAKE_REF ITERATION_NUMBE
REF R
REFTOHEX7 PRESENTNNV
VALUE PRESENTV
PREVIOUS
Funções Analíticas
As funções analíticas são utilizadas principalmente para por exemplo a extração de
dados gerenciais na base de dados. O Oracle é o banco que mais possui dessas
funções, mas muitos SGBDs atuais já contém essas funções disponíveis em suas
novas versões.
Vamos dar um exemplo para utilizar essas funções:
Imagine que você tenha um sistema de cobrança na sua empresa. Seus
recebimentos são baseados em contratos, ou seja, todos os meses você realiza
vendas e, como as vendas são financiadas, você tem um fluxo freqüente de parcelas.
Você recebe a seguinte missão do diretor financeiro: “preciso saber quais são os
contratos com os maiores valores de prestação a cada mês”. Seria relativamente
simples oferecer esta resposta caso o diretor não tivesse incluído “contratos” na
frase. Saber o valor das prestações a cada mês é muito simples.
Para resolver este problema, você precisará utilizar a partícula OVER do comando
SELECT. Com esta opção é possível, além de extrair dados sumarizados, mostrar as
linhas analíticas (detalhe) ao mesmo tempo.
Ao utilizar o OVER você poderá estabelecer uma “quebra” (ou particionamento)
para sua análise. Veja no comando a seguir:
Código:
SELECT to_char( dtvenc, ‘MM-YYYY’) dtvenc, cdcontr,
MAX( vlprest ) OVER (PARTITION BY to_char(dtvenc,’YYYYMM’))
max_prest, vlprest
FROM vRECEBER
WHERE dtvenc > sysdate;
O destaque mostra a atuação da função de grupo (MAX) e do particionamento da
pesquisa (OVER). Neste caso, está sendo mostrado o maior valor de prestação de
cada mês. Este resultado será mostrado na coluna MAX_PREST. O resultado pode
ser observado na imagem abaixo:
Outro ponto que merece destaque é a possibilidade de mostrarmos os dados
analíticos (VLPREST, CDCONTR e DTVENC) ao mesmo tempo que trabalhamos o
maior valor do mês (MAX_PREST). Desta forma é possível observarmos quais são
os contratos, os valores originais das prestações e o maior valor daquele mês.
MASCARA_DATA
A tabela abaixo mostra os valores possíveis para a máscara
da data:
FORMATO: SIGNIFICADO
SCC ou CC: Século; 'S' faz preceder de '-' as datas 'BC'
(Antes de Cristo)
YYYY ou SYYYY: Século; 'S' faz preceder de '-' as datas 'BC'
(Antes de Cristo)
YYY ou YY ou Y:Ultimos 3 digitos do ano ou 2 ultimos ou
último digito do ano
Y,YYY:Ano com separador dos milhares nessa posição
ANEXO
C
Prof: Msc. Hugo Dias Dos Santos
ANEXO C: Os níveis de isolamento
186
select * from As alterações feitas na tabela TESTE pela Sessão 1 ainda não são
5 teste; visíveis na Sessão 2 pois ainda não estão confirmadas.
188
6 commit; A Sessão 1 confirma as alterações e termina a transacção actual.
insert into
teste (id,nome)
values
A Sessão 1 insere uma linha e confirma a alteração,
12 (4,'dddddd');
commit; terminando a transacção. A alteração é visivel na Sessão 1.
select * from
teste;
A Sessão 2 continua na mesma transacção e executa o
select *
mesmo SELECT pela sexta vez, obtendo um resultado
13 from
teste; diferente das execuções anteriores. Estamos numa situação
PHANTOM READ.
14 commit; A Sessão 2 termina a transacção actual.
select *
15 from A Sessão 2 continua a ver o que já via.
teste;
Triggers
Um TRIGGER ou gatilho é um objeto de banco de dados, associado a uma
tabela, definido para ser disparado, respondendo a um evento em
particular. Tais eventos são os comandos da DML (Data Manipulation
Language): INSERT, REPLACE, DELETE ou UPDATE. Podemos
definir inúmeros TRIGGERS em uma base de dados baseados
diretamente em qual dos comandos acima irá dispará-lo, sendo que, para
cada um, podemos definir apenas um TRIGGER. Os TRIGGERS poderão
ser disparados para trabalharem antes ou depois do evento.
Firma
Select * from pedido join ped_produto on
(pedido.cod_pedido=ped_produto.cod_pedido) join produto on
(ped_produto.cod_produto=produto.cod_produto);
Firma 4 tabelas
select cliente.nome, quantidade, produto.nome,
cliente.cod_cliente from (cliente join pedido on
(cliente.cod_cliente=pedido.cod_cliente) join
ped_produto on (pedido.cod_pedido
=ped_produto.cod_pedido)) join produto on
(ped_produto.cod_produto =produto.cod_produto)
where cliente.nome="claudia";
Prof: Msc. Hugo Dias Dos Santos
ANEXO F: DQL / cláusulas
194