6 - Banco de Dados – Cálculos e funções.pdf

39
Banco de Dados – Cálculos e funções Prof. Camilo de Lelis Aula 5

Transcript of 6 - Banco de Dados – Cálculos e funções.pdf

Banco de Dados – Cálculos e funções

Prof. Camilo de Lelis

Aula 5

Operadores

Operador Ação

+ Soma/Adição

- Subtração

* Multiplicação

/ Divisão

Funções numéricas

POSITION/INSTR

CHARACTER_LENGTH

POSITION/INSTR

O objetivo de ambas as funções éretornar a posição do caractere debusca na cadeia de caracteres origem.

Sintaxe POSITION(destino IN origem)

INSTR( origem, destino [, inicio, [fim]])

Tipo DescriçãoDestino Cadeia de caracteres que se quer pesquisar.

Origem Cadeia de caracteres em que será realizada a pesquisa

InícioPosição inicial de busca (se não especificada inicia na posição 1.

FimOcorrência que deve ser pesquisada(se não especificada, indica que é a primeira ocorrência.

Exemplos

Retorna a posição do caractere de busca na cadeia de caracteres de origem

POSITION (destino IN origem)

Exemplo:

SELECT POSITION (‘Ru’ In ‘Renato Russo’ ) AS BUSCA;

Insere o nome BUSCA no cabeçalho da coluna

INSTR

Mesma função do anterior.

INSTR(origem, destino [, início, [fim]])

Exemplo

SELECT INSTR(‘Renato Russo’, ‘Ru’)

AS BUSCA;

Insere o nome BUSCA no cabeçalho da coluna

Não funciona no PostgreSQL

CHARACTER_LENGTH

Retorna o número de caracteres contidos emuma cadeia de caracteres

SELECT CHARACTER_LENGTH(‘Renato Russo’) AS TAM ;

Insere o nome TAM no cabeçalho da coluna

Concatenando

Para concatenar cadeias de caracteres, utilizando dois pipes (||).

SELECT NOME_GRAVADORA || ‘ – ‘ || ‘CONTATO’ FROM GRAVADORA;

Utilize no MySQL a função CONCAT(PARAMETROS)

Upper

Na realização de buscas é realizada uma comparação com maiúsculas.

Exemplo:

SELECT * FROM AUTOR

WHERE UPPER(NOME_AUTOR) LIKE ‘ROBERTO%’

LOWER

Faz a conversão para minúsculos.

Exemplo:

SELECT * FROM AUTOR

WHERE LOWER(NOME_AUTOR) LIKE‘roberto%’

TRIM

Utilizado para retirar caracteres antes e/oudepois de outra cadeia de caracteres.

Sintaxe:

TRIM [{BOTH | LEADING | TRAILING} car FROM ] cadeia )

Exemplos de utilização

TRIM(‘teste’) ‘teste’

Retira espaços antes e depois

da palavra teste

TRIM(BOTH ‘#’ FROM ’#’ ‘teste’)

‘teste’Retira o símbolo # que estava antes e depois (Both) da cadeia de caracteres.

TRIM(LEADING ’ ‘FROM ‘ teste’

‘teste’Retira o espaço que estava antes da palavra teste.

TRIM(TRAILING ‘ ‘ FROM ‘ teste’

‘teste’Retira o espaço que estava após a palavra

SUBSTRING

Retorna parte de uma cadeia de caracteres.

Sintaxe:

SELECT SUBSTRING( cadeia_origem FROM posição_inicio FOR número_caracteres )

Exemplo

SELECT SUBSTRING( NOME_AUTOR FROM 1 FOR 3 ) as RES, NOME_AUTOR

FROM AUTOR

WHERE NOME_AUTOR LIKE ‘R%’

TRANSLATE

Serve para pesquisar e substituir caracteresem uma cadeia de caracteres.

TRANSLATE(caracteres, ’pesquisa’,’substituição’)

Exemplo:

SELECT TRANSLATE( UPPER(NOME_AUTOR), ’RT’, ’AB’ )

FROM AUTOR

WHERE CODIGO_AUTOR = 1;

Todas as letras R serãosubstituídas pela letra Ae as letras T pela letra B

Replace

Substitui uma cadeia de caracteres poroutra.

Sintaxe:

SELECT REPLACE( UPPER(NOME_AUTOR),’RT’,’AB’)

FROM AUTOR

WHERE CODIGO_AUTOR =1; Não acontece nada.

Exemplo:

SELECT REPLACE( UPPER(NOME_AUTOR),’RE’,’AB’)

FROM AUTOR

WHERE CODIGO_AUTOR =1;

Mudança do inicio do nome

Manipulação de datas

Tipos de dados relacionados com a data e hora

Tipo Descrição

DATE Apenas Data

Time Apenas Hora

TIMESTAMP Data e Hora

INTERVALIntervalo entre os dois tipos de dados anteriores

Foram definidos algumas funções paradeterminar a data e/ou hora atuais dosistema. Acrescentando CURRENT_antes dos três primeiros tiposanteriores:

CURRENT_DATE

CURRENT_TIME

CURRENT_TIMESTAMP

Para converter o formato da data no MySQL

SELECT DATE_FORMAT(nome_da_coluna_com_a_data, '%d/%m/%Y') FROMnome_da_tabela;

Exemplo:

Para saber quais os CDs lançados no dia de hoje:

SELECT * FROM CD

WHERE DATA_LANCAMENTO = CURRENT_DATE;

OPERAÇÕES ARITMÉTICAS COM DATAS

A coluna do tipo data é composta de seis elementos:

YEAR (ano)

MONTH (mês)

DAY (dia)

HOUR(hora)

MINUTE (minuto)

SECOND (segundo)

Operações:

Expressão Resultado

DATETIME-DATETIME INTERVAL

DATETIME INTERVAL DATETIME

INTERVAL INTERVAL INTERVAL

INTERVAL * número INTERVAL

INTERVAL/número INTERVAL

OBS.

Quando usar INTERVAL, especifique em qual tipo de intervalo se quer visualizar a resposta (YEAR, MONTH, DAY, etc) e até indicar o período de tempo (YEAR TO MONTH ou DAY TO SECOND)

Exemplo:

SELECT CURRENT_DATE, DATA_LANCAMENTO,

CURRENT_DATE – DATA_LANCAMENTO ASDIFERENCA

FROM CD;

Encontrar o intervalo de dias entre duas datas

No MySQL

SELECT current_date, data_lancamento,

DATEDIFF(current_date,'2007,08,30')

from cd;’

Adicionar dias em uma data

SELECT DATA_LANCAMENTO + 7

FROM CD;

SELECT DATA_LANCAMENTO + INTERVAL ‘7’ DAY

FROM CD;

Somente sefor dentro domes

No MySQL

SELECT DATE_ADD('2005-12-31 23:59:59', INTERVAL 1 DAY);

Subtrair meses de uma data

SELECT DATA_LANCAMENTO – INTERVAL ‘2’ MONTH

FROM CD;

EXTRACT

Extrai e retorna um valor de um campo do tipo data. É possível extrair apenas o dia, o mês, o ano, a hora, o minuto ou o segundo.

Exemplos:

SELECT EXTRACT( MONTH FROM DATE ‘2002-05-01’) FROM DUAL

SELECT EXTRACT( YEAR FROM DATE ‘2002-05-01’) FROM DUAL;

SELECT EXTRACT( DAY FROM DATE ‘2002-05-01’) FROM DUAL;

Tipo SERIAL

Quando definimosuma colunacomo sendo dotipo serial,estamos criandoimplicitamenteuma seqüência.

CREATE TABLE alunos (

id serial,nome varchar(30)

);

Neste caso é criado uma seqüência com o nome alunos_id_seq. O PostgreSQL cria o nome das seqüências utilizando a seguinte forma:

nometabela_nomecoluna_seq.

A tabela criada acima também poderia ser criada da seguinte forma, obtendo o mesmo resultado:

CREATE SEQUENCE alunos_id_seq;CREATE TABLE alunos ( id integer DEFAULT nextval('alunos_id_seq') NOT NULL );

CAMPO SERIAL

O campo serial é na realidade um campo dotipo integer associado a uma seqüência. Seacaso for esperado que a seqüência possaatingir valores maiores que 2.147.483.648deve-se usar o BIGSERIAL, que narealidade é uma associação do tipo bigintcom uma seqüência. O tipo integer utilizaquatro bytes para armazenamento denúmeros enquanto o bigint usa oito bytes.

Abaixo temos um exemplo da utilização de seqüências:

BEGIN;

INSERT INTO pedido(data)VALUES (now());INSERT INTO item (fk_pedido, produto, quantidade, valor)

VALUES (currval('pedido_numero_seq'), 'Camiseta', 2, 25.00);INSERT INTO item (fk_pedido, produto, quantidade, valor)

VALUES (currval('pedido_numero_seq'), 'Calça', 2, 40.70);INSERT INTO item (fk_pedido, produto, quantidade, valor)

VALUES (currval('pedido_numero_seq'), 'Meia', 5, 5.90);INSERT INTO item (fk_pedido, produto, quantidade, valor)

VALUES (currval('pedido_numero_seq'), 'Camisa', 1, 60.00);

COMMIT;

A chave primária da tabela pedido foidefinida como serial, sendo a função currvalutilizada para preencher a chave estrangeirana tabela item, antes que a transação sejafinalizada.

CONSIDERAÇÕES FINAIS

Se for passado um valor para os campos dotipo serial, a seqüência associada ao serialnão é incrementada, o que pode criarproblemas de chaves duplicadas. Portantonão deve-se passar valor para campos seriais,exceto em situações especiais em que sabe-seexatamente o que deseja fazer. Um exemplodeste tipo de uso é em casos de replicação dedados.

Para saber o valor atual da seqüência,independentemente das funções currval enextval, use o seguinte comando:

SELECT * FROM nome_sequencia;- Quando é excluída alguma tabela da base de dados, a

seqüência criada implicitamente com o tipo serial para esta tabela também é excluída. Podem gerar problemas quando uma tabela referencia uma seqüência criada por outra tabela já excluída.

- Não é possível excluir seqüências criadas pelo tipo serial, a não ser que exclua-se a coluna da tabela que gerou a seqüência.