15
Aula 06 – Compreendendo as funções agregadas i 1 Vote Objetivo Esta aula tem como objetivo permitir ao aluno: Identificações as funções agregadas, também conhecidas como funções de grupo; Descrever o uso de funções de grupo; Agrupar dados usando a cláusula GROUP BY; Incluir ou excluir linhas agrupadas usando a cláusula HAVING. Funções de Grupo As funções de grupo operam em conjunto de linhas para fornecer um resultado por grupo. De modo diferente das funções de uma única linha, as funções de grupo operam em conjuntos de linhas para fornecer um resultado por grupo, logo esses conjuntos podem ser a tabela inteira ou a tabela dividida em grupos. Abaixo relacionamos os tipos de funções de grupo comumente utilizados: AVG([DISTINCT|ALL]n) – Valor de médio de n, ignorando valores nulos. COUNT({*|[DISTINCT|ALL]expr}) – Número de linhas, onde expr avalia para algo diferente de nulo (Conte todas as linhas selecionadas usando *, inclusive duplicadas e linhas com nulos). MAX([DISTINCT|ALL]expr) – Valor máximo de expr, ignorando valores nulos. MIN([DISTINCT|ALL]expr) – Valor mínimo de expr, ignorando valores nulos. STDDEV([DISTINCT|ALL]x) – Desvio padrão de n, ignorando valores nulos. SUM([DISTINCT|ALL]n) – Valores somados de n, ignorando valores nulos. VARIANCE([DISTINCT|ALL]x) – Variação de n, ignorando valores nulos. Observe a abaixo, de acordo com a sintaxe apresentada, a aplicabilidade das funções grupo: view source print? 1 SELECT [coluna,] group_function(coluna) 2 FROM tabela 3 [WHERE condição] 4 [GROUP BY coluna] 5 [ORDER BY coluna]; Abaixo exemplificaremos o uso de cada função agregada: view source print? 1 -- MÉDIA DO SALÁRIO DE TODOS OS FUNCIONÁRIOS 2 SELECT AVG(QT_SALARIO) FROM FUNCIONARIO; 3 -- MAIOR DO SALÁRIO DE TODOS OS FUNCIONÁRIOS 4 SELECT MAX(QT_SALARIO) FROM FUNCIONARIO; 5 -- MENOR DO SALÁRIO DE TODOS OS FUNCIONÁRIOS 6 SELECT MIN(QT_SALARIO) FROM FUNCIONARIO; 7 -- CONTAGEM DE FUNCIONÁRIO PRESENTES NA TABELA DE FUNCIONÁRIOS 8 SELECT COUNT(CD_FUNCIONARIO) FROM FUNCIONARIO; Atenção!!! Ao utilizar uma função de grupo, os valores nulos serão ignorados. Criando Grupos de Dados Todas as funções de grupo trataram a tabela como um grande grupo de informações. Às vezes, é necessário dividir a tabela de informações em grupos menores. Isso pode se feito usando a cláusula GROUP BY. Abaixo, vamos relembrar a sintaxe de aplicação das funções de grupo: view source print? 1 SELECT [coluna,] 1

Aulas SQL 1

Embed Size (px)

Citation preview

Page 1: Aulas SQL 1

Aula 06 – Compreendendo as funções agregadas  i1 Vote

ObjetivoEsta aula tem como objetivo permitir ao aluno:Identificações as funções agregadas, também conhecidas como funções de grupo;Descrever o uso de funções de grupo;Agrupar dados usando a cláusula GROUP BY;Incluir ou excluir linhas agrupadas usando a cláusula HAVING.Funções de GrupoAs funções de grupo operam em conjunto de linhas para fornecer um resultado por grupo. De modo diferente das funções de uma única linha, as funções de grupo operam em conjuntos de linhas para fornecer um resultado por grupo, logo esses conjuntos podem ser a tabela inteira ou a tabela dividida em grupos.Abaixo relacionamos os tipos de funções de grupo comumente utilizados:AVG([DISTINCT|ALL]n) – Valor de médio de n, ignorando valores nulos.COUNT({*|[DISTINCT|ALL]expr}) – Número de linhas, onde expr avalia para algo diferente de nulo (Conte todas as linhas selecionadas usando *, inclusive duplicadas e linhas com nulos).MAX([DISTINCT|ALL]expr) – Valor máximo de expr, ignorando valores nulos.MIN([DISTINCT|ALL]expr) – Valor mínimo de expr, ignorando valores nulos.STDDEV([DISTINCT|ALL]x) – Desvio padrão de n, ignorando valores nulos.SUM([DISTINCT|ALL]n) – Valores somados de n, ignorando valores nulos.VARIANCE([DISTINCT|ALL]x) – Variação de n, ignorando valores nulos.Observe a abaixo, de acordo com a sintaxe apresentada, a aplicabilidade das funções grupo:view source

print?1 SELECT [coluna,] group_function(coluna) 2    FROM tabela

3  [WHERE condição] 4  [GROUP BY coluna]

5  [ORDER BY coluna];Abaixo exemplificaremos o uso de cada função agregada:view source

print?1 -- MÉDIA DO SALÁRIO DE TODOS OS FUNCIONÁRIOS 2 SELECT AVG(QT_SALARIO) FROM FUNCIONARIO;

3 -- MAIOR DO SALÁRIO DE TODOS OS FUNCIONÁRIOS 4 SELECT MAX(QT_SALARIO) FROM FUNCIONARIO;

5 -- MENOR DO SALÁRIO DE TODOS OS FUNCIONÁRIOS 6 SELECT MIN(QT_SALARIO) FROM FUNCIONARIO;

7 -- CONTAGEM DE FUNCIONÁRIO PRESENTES NA TABELA DE FUNCIONÁRIOS 8 SELECT COUNT(CD_FUNCIONARIO) FROM FUNCIONARIO;Atenção!!! Ao utilizar uma função de grupo, os valores nulos serão ignorados.Criando Grupos de DadosTodas as funções de grupo trataram a tabela como um grande grupo de informações. Às vezes, é necessário dividir a tabela de informações em grupos menores. Isso pode se feito usando a cláusula GROUP BY. Abaixo, vamos relembrar a sintaxe de aplicação das funções de grupo:view source

print?1 SELECT [coluna,] group_function(coluna) 2    FROM tabela

3  [WHERE condição] 4  [GROUP BY coluna]

5  [ORDER BY coluna];Abaixo exemplificamos o seu uso para que possa compreender melhor:view source

print?01 -- MÉDIA DE SALARIAL POR CARGO (1) 02 SELECT CD_CARGO, AVG(QT_SALARIO) FROM FUNCIONARIO GROUP BY CD_CARGO;

03 -- MÉDIA DE SALARIAL POR CARGO (2) 04 SELECT AVG(QT_SALARIO) FROM FUNCIONARIO GROUP BY CD_CARGO;

05 -- MAIOR SALÁRIO POR CARGO 06 SELECT CD_CARGO, MAX(QT_SALARIO) FROM FUNCIONARIO GROUP BY CD_CARGO;

07 -- MENOR SALÁRIO POR CARGO

1

Page 2: Aulas SQL 1

08 SELECT CD_CARGO, MIN(QT_SALARIO) FROM FUNCIONARIO GROUP BY CD_CARGO;

09 -- AGRUPANDO POR MAIS DE UMA COLUNA 10 SELECT CD_DEPTO, CD_CARGO, AVG(QT_SALARIO) FROM FUNCIONARIO GROUP BY CD_DEPTO, CD_CARGO;Erros que observo muito durante o desenvolvimento das consultas:view source

print?1 -- MÉDIA DE SALARIAL POR CARGO (1) 2 SELECT CD_CARGO, AVG(QT_SALARIO) FROM FUNCIONARIO;

3   4 -- OBSERVAÇÃO:

5-- # Se você explicitou a coluna junto ao termo SELECT, necessariamente deverá incluí-la junto ao termo

6 -- # GROUP BY, logo temos:

7   8 -- MÉDIA DE SALARIAL POR CARGO

9 SELECT CD_CARGO, AVG(QT_SALARIO) FROM FUNCIONARIO GROUP BY CD_CARGO;Restringindo Resultados do GrupoDa mesmo forma que você usa a cláusula WHERE para restringir as linhas que seleciona, poderá usar a cláusula HAVING para restringir grupos. Vejamos abaixo a sintaxe contendo agora a cláusula HAVING:view source

print?1 SELECT [coluna,] group_function(coluna) 2    FROM tabela

3  [WHERE condição] 4  [GROUP BY coluna]

5  [HAVING condição do grupo] 6  [ORDER BY coluna];Exemplificando abaixo, temos:view source

print?1 -- MÉDIA DE SALARIAL POR CARGO (1) 2 SELECT CD_CARGO, AVG(QT_SALARIO) FROM FUNCIONARIO GROUP BY CD_CARGO HAVING AVG(QT_SALARIO)>500;

3 -- MÉDIA DE SALARIAL POR CARGO (2) 4 SELECT AVG(QT_SALARIO) FROM FUNCIONARIO GROUP BY CD_CARGO HAVING AVG(QT_SALARIO)>500;

5 -- MAIOR SALÁRIO POR CARGO 6 SELECT CD_CARGO, MAX(QT_SALARIO) FROM FUNCIONARIO GROUP BY CD_CARGO HAVING MAX(QT_SALARIO)>500;

7 -- MENOR SALÁRIO POR CARGO

8SELECT CD_CARGO, MIN(QT_SALARIO) FROM FUNCIONARIO GROUP BY CD_CARGO HAVING MIN(QT_SALARIO)<500; -- AGRUPANDO POR MAIS DE UMA COLUNA SELECT CD_DEPTO, CD_CARGO, AVG(QT_SALARIO) FROM FUNCIONARIO GROUP BY CD_DEPTO, CD_CARGO HAVING AVG(QT_SALARIO)>500;

Aninhando Funções de GrupoO aninhamento de funções agregadas se dá como qualquer outra função de linha, logo temos o exemplo abaixo:view source

print?1 -- MÉDIA DE SALARIAL POR CARGO 2 SELECT MAX(AVG(QT_SALARIO)) FROM FUNCIONARIO GROUP BY CD_CARGO;SumárioSete funções de grupo estão disponíveis no PL/SQL: AVGSUMMAXMINSUMSTDDEVVARIANCEVocê pode criar subgrupos usando a cláusula GROUP BY. Os grupos podem ser excluídos usando a cláusula HAVING;Coloque as cláusulas HAVING e GROUP BY após a cláusula WHERE em uma instrução. Coloque a cláusula ORDER BY por último.

Aula 07 – Criando Visões com PL/SQL 

2

Page 3: Aulas SQL 1

iRate This

ObjetivoEsta aula tem como objetivo permitir ao aluno compreender melhor que a visão (view) representa logicamente subconjuntos de dados de uma ou mais tabelas, portanto poderá aplicar:Descrever uma view;Criar uma view;Recuperar dados através de uma view;Alterar a definição de uma view;Inserir, atualizar e deletar dados através de uma view;Eliminar uma view.O que é uma View?Uma view é uma “tabela lógica” baseada em uma tabela ou outra view, logo uma view não contém dados próprios mas é como uma “janela” através da qual os dados das tabelas podem ser vistos ou alterados.As tabelas nas quais uma view é baseada são chamadas “tabelas-base”, logo a view é armazenada como uma instrução SELECT no dicionário de dados.O uso das views se dá por diversos fatores, como:Para restringir o acesso a dados;Para facilitar as consultas complexas;Para permitir a independência dos dados;Para apresentar diferentes view dos mesmos dados.Uma view ela pode ser categorizada como “simples” ou “complexa”:View “simples”: Cria dados a partir de somente uma tabela;Não contém funções ou grupos de dados;Pode executar a DML através da view.View “complexa”: Cria dados a partir de várias tabelas;Contém funções ou grupos de dados;Nem sempre executa a DML através da view.Criando uma ViewVocê pode criar uma view incorporando uma subconsulta na instrução CREATE VIEW, no entanto, devemos observar as seguintes regras:A subconsulta pode conter uma sintaxe SELECT complexa;A subconsulta não pode conter uma cláusula ORDER BY.Sintaxe de criação (ou atualização) da view:view source

print?1 CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW2    [(<<apelido>>[, <<apelido>>]...)]

3 AS4 <<subconsulta>>

5 [WHITH CHECK OPTION [CONSTRAINT <<restrição>>]] 6 [WHITH READ ONLY];Podemos observar as seguintes características na sintaxe acima:OR REPLACE – recria a view se ela já existir.FORCE – cria a view independentemente das tabelas-base existirem ou não.NOFORCE – cria a view somente se as tabelas-base existirem (default).view – é o nome da view.apelido – especifica nomes para as expressões selecionadas pela consulta da view, logo o número de apelidos deve corresponder ao número de expressões selecionadas pela view.subconsulta – é uma instrução SELECT completa, logo você pode usar apelidos para as colunas na lista SELECT.)WHIT CHECK OPTION – especifica que somente linhas acessíveis à view podem ser inseridas ou atualizadas.restrição – é o nome atribuído à restrição CHECK OPTION.WHIT READ ONLY – assegura que as operações DML não possam ser executadas nesta view.Podemos observar no exemplo abaixo a criação de um view de complexidade bem baixa:view source

print?1 CREATE VIEW VW_MODALIDADES 2 AS

3 SELECT CD_MODALIDADE, DS_MODALIDE 4   FROM MODALIDADE

5  WHERE DT_ATIVACAO < CURRENT_TIMESTAMP;Em seguida, execute o comando DESCRIVE para descrever a VIEW:view source

print?1 DESCRIBE VW_MODALIDADES;Por questões de segurança, podemos aplicar apelidos sobre as colunas aumentando a segurança ao omitir o nome real das colunas:view source

print?1 CREATE OR REPLACE VIEW VW_MODALIDADES 2 AS

3

Page 4: Aulas SQL 1

3 SELECT CD_MODALIDADE AS CODIGO, DS_MODALIDE AS DESCRICAO 4   FROM MODALIDADE

5  WHERE DT_ATIVACAO < CURRENT_TIMESTAMP;Portanto, para recuperar os dados a partir de uma view, podemos realizar o seguinte comando:view source

print?1 -- EXECUTAMOS UM SELECT SOBRE A VIEW 2 SELECT CODIGO, DESCRICAO

3   FROM VW_MODALIDADES;Removendo uma ViewPodemos remover uma view facilmente utilizando a opção DROP VIEW, logo temos a necessidade de uso da seguinte sintaxe:view source

print?1 DROP VIEW <<nome da visão>>;Exemplificando, temos:view source

print?1 DROP VIEW VW_MODALIDADES;SumárioUtilize as visões para criar relatórios customizados;Todas as consultas que você sempre repetirá e, provavelmente, estarão armazenadas em um arquivo .TXT, podem ser armazenadas em objeto do tipo VIEW;Utilize views para que um funcionário não tenha acesso direto as tabelas e sim, somente, às views.

Aula 08 – Utilizando Funções SQL  i1 Vote

ObjetivoNesta aula, o aluno terá oportunidade de:Descrever vários tipos de funções disponíveis no SQL;Usar funções de data, número e caractere nas instruções SELECT;Descrever o uso das funções de conversão.Funções SQLAs funções formam o bloco de consulta básico mais avançado e são usadas para manipular valores de dados. Portanto, as funções são um recurso avançado do SQL e podem ser usadas para realizar o seguinte:Executar cálculos usando dados;Modificar itens de dados individuais;Manipular saída para grupos de linhas;Formatar datas e números para exibição;Converter tipos de dados de coluna;Podem aceitar argumentos e sempre retornar um valor.

4

Page 5: Aulas SQL 1

Estrutura conceitual de Função SQLAs funções se dividem em:Funções de Uma única linha – essas funções operam somente linhas únicas e retornam um resultado por linha, logo temos funções de Caractere, Número, Data, Conversão e Geral.Suas principais características são: Manipulam itens de dados;Aceitam argumentos e retornam um valor;Agem em cada linha retornada;Retornam um resultado por linha;Podem modificar o tipo de dado;Podem ser aninhadas.Funções de Várias linhas – essas funções manipulam grupos de linha a fim de obter um resultado por grupo de linhas.A sintaxe de uma função é compreendida por:view source

print?1 -- SINTAXE DA FUNÇÃO 2 function_name (coluna/expressão, [arg1, arg2, ...])Vamos adentrar ao assunto por tipo de função, logo temos:Funções de Caractere:Funções de Conversão de Maiúscula e Minúsculas LOWER(coluna|expressão) – converte valores de caractere alfabético para letras minúsculas.UPPER(coluna|expressão) – converte valores de caractere alfabético para letras maiúsculas.INITCAP(coluna|expressão) – converte valores de caractere alfabético para usar maiúsculas na primeira letra de cada palavra e todas as outras.Funções de Manipulação de Caractere CONCAT(coluna1|expressão1,coluna2|expressão2) – retorna o número de caracteres do valor.SUBSTR(coluna|expressão, m[,n]) – retorna caracteres específicos a partir do valor de caractere començando na posição m, até n caracteres depois.LENGTH(coluna|expressão) - retorna o número de caracteres do valor.INSTR(coluna|expressão,m) – retorna a posição numérica do caractere nomeado.LPAD(coluna|expressão, n, ‘string’) – preenche o vlaor de caracter justificado à direita a uma largura total de n posições de caractere.TRIM(anterior|posterior|ambos, trim_character FROM trim_souce) – permite organizar cabeçalhos ou caracteres de fim de linha (ou os dois) a partir de uma string de caractere.Exemplificando o uso das funções de caractere, temos:view source

print?01 -- USANDO A FUNÇÃO LOWER 02 SELECT LOWER('IGOR BORLOT BORBA') FROM DUAL; -> Resultado: "igor borlot borba"

03 -- USANDO A FUNÇÃO UPPER 04 SELECT UPPER('igor borlot borba') FROM DUAL; -> Resultado: "IGOR BORLOT BORBA"

05 -- USANDO A FUNÇÃO INITCAP 06 SELECT INITCAP('igor borlot borba') FROM DUAL; -> Resultado: "Igor Borlot Borba"

07 -- USANDO A FUNÇÃO CONCAT 08 SELECT CONCAT('IGOR','BORBA') FROM DUAL; -> Resultado: "IGORBORBA"

09 -- USANDO A FUNÇÃO SUBSTR 10 SELECT SUSBTR('IGOR', 1, 2) FROM DUAL; -> Resultado: "IG"

5

Page 6: Aulas SQL 1

11 -- USANDO A FUNÇÃO LENGTH 12 SELECT LENGTH('IGOR') FROM DUAL -> Resultado: "4";

13 -- USANDO A FUNÇÃO INSTR 14 SELECT INSTR('IGOR', 'g') FROM DUAL; -> Resultado: "2"

15 -- USANDO A FUNÇÃO LPAD 16 SELECT LPAD('2222', 8, '#') FROM DUAL; -> Resultado: "####2222"

17 -- USANDO A FUNÇÃO TRIM 18 SELECT TRIM('S' FROM 'SSMITH') FROM DUAL; -> Resultado: "MITH"Funções NuméricasAs funções numéricas aceitam entrada numérica e retornam valores numéricos. Esta seção descreve algumas das funções numéricas:ROUND(coluna|expressão) – Arredonda a coluna, expressão ou valore para n casas decimais ou e n for omitido, nenhuma casa decimal (Se n for negativo, os números à esquerda do ponto de decimal serão arredondados).TRUNC(coluna|expressão) – Trunca a coluna, expressão ou valor para n casas decimais ou se n for omitido, nenhuma casa decimal (Se n for negativo, os números à esquerda do ponto decimal serão truncados para zero).MOD(m,n) – Retorna o resto de m dividido por n.Exemplificando o uso das funções de caractere, temos:view source

print?1 -- USANDO A FUNÇÃO ROUND 2 SELECT ROUND(20.235, 2) FROM DUAL; --> Resultado: "20.24"

3 -- USANDO A FUNÇÃO TRUNC 4 SELECT TRUNC(20.235, 2) FROM DUAL; --> Resultado: "20.23"

5 -- USANDO A FUNÇÃO MOD 6 SELECT MOD(1600, 300) FROM DUAL; --> Resultado: "100"Funções de DatasOs produtos da Oracle armazenam datas em um formato numérico interno, representando o século, ano, mês, dia, horas, minutos e segundos.O formato de entrada e exibição default para qualquer data é DD-MON-YY, logo  as datas válidas para a o Oracle estão entre 1 de janeiro, 4712 A.C. e 31 de dezembro, 9999 D.C.Vejamos abaixo algumas funções de data encontradas no Oracle:SYSDATE – É a função de data que retorna a data e hora atual. Você pode usar o SYDATE da mesma forma como usuaria qualquer outro nome de coluna. Por exemplo, é possível exibir a data atual selecionando SYSDATE a partir de uma tabela qualquer (inclui-se a tabela fictícia DUAL).MONTHS_BETWEEN(data1, data2) – Localiza o número de meses entre a data1 e a data2. O resultado pode ser positivo ou negativo. Se a data1 for posterior a data2, o resultado será positivo; se data1 for anterior a data2, o resultado será negativo A parte não-inteira do resultado representa uma parte do mês.ADD_MONTHS(data, n) – Adiciona um número n de meses de calendário à data. O valor de n deve ser inteiro ou pode ser negativo.NEXT_DAY(data, ‘char’) – Localiza a data do próximo dia especifica da data seguinte da semana (‘char’). O valor de char pode ser um número representado um dia ou uma string de caractere.LAST_DAY(data) – Localiza a data do último dia do mês que contém a data.ROUND(data[,'fmt']) – Retorna a data arredondada para a unidade especificada pelo modelo de formato fmt. Se o modelo de formato fmt for omitido, a data será arredondada para o dia mais próximo.TRUNC(data[,'fmt']) – Retorna a data com a parte da hora do dia truncada para a unidade especificada pelo modelo de formato fmt. Se o modelo de formato fmt for omitido, a data será truncada para o dia mais próximo.Exemplificando o uso das funções de caractere, temos:view source

print?01 -- USANDO A FUNÇÃO SYSDATE 02 SELECT SYSDATE FROM DUAL; --> Resultado: "2011-05-10 09:00:00" (exemplificando a data hora atual)

03 -- USANDO A FUNÇÃO MONTHs_BETWEEN 04 SELECT MONTHS_BETWEEN('01-JAN-95','01-JAN-96') FROM DUAL; --> Resultado: "12"

05 -- USANDO A FUNÇÃO ADD_MONTHS 06 SELECT ADD_MONTHS('01-JAN-98', 6) FROM DUAL; --> Resultado: "11-JUL-98"

07 -- USANDO A FUNÇÃO NEXT_DAY 08 SELECT NEXT_DAY('01-FEB-11', 'FRIDAY') FROM DUAL; --> Resultado: "04-FEB-11"

09 -- USANDO A FUNÇÃO LAST_DAY 10 SELECT NEXT_DAY('01-SEP-11') FROM DUAL; --> Resultado: "30-SEP-11"

11 -- USANDO A FUNÇÃO ROUND (1) 12 SELECT NEXT_DAY('25-JUL-95','MONTH') FROM DUAL; --> Resultado: "01-AUG-95"

13 -- USANDO A FUNÇÃO ROUND (2) 14 SELECT NEXT_DAY('25-JUL-95','YEAR') FROM DUAL; --> Resultado: "01-JAN-96"

15 -- USANDO A FUNÇÃO TRUNC (1) 16 SELECT NEXT_DAY('25-JUL-95','MONTH') FROM DUAL; --> Resultado: "01-JUL-95"

17 -- USANDO A FUNÇÃO TRUNC (2) 18 SELECT NEXT_DAY('25-JUL-95','YEAR') FROM DUAL; --> Resultado: "01-JAN-95"

6

Page 7: Aulas SQL 1

Aritmética com datasOs bancos de dados de dados armazenam datas como números, logo você pode executar cálculo usando operadores aritméticos como adição e subtração. É possível adicionar e subtrair constantes de número bem como datas. Vejamos as abaixo as possíveis operações:data + número = data .:. Neste caso adiciona um número de dias para um data;data – número = data .:. Neste caso subtrai um número de dias de uma data;data – data = número de dias .:. Neste caso subtrai uma data de outra;data + número/24 = data .:. Neste caso adiciona um número de horas para uma data.view source

print?1 -- USANDO A FUNÇÃO SYSDATE COM OPERAÇÕES ARITMÉTICAS 2 SELECT (SYSDATE-2) FROM DUAL; --> Resultado: "2011-04-10" (exemplificando a data hora atual - número de dias)Funções de ConversãoA conversão de dados no Oracle pode se dar pelas seguintes formas:Conversão implícita de tipo de dados;Conversão explícita de tipo de dados.Para atribuições, o Oracle Server pode converter automaticamente (de forma implícita) o seguinte:De VARCHAR2 ou CHAR para NUMBER;De VARCHAR2 ou CHAR para DATE;De NUMBER para VARCHAR2;De DATE para VARCHAR2.Para avaliação da expressão, o Oracle Server pode converter automaticamente o seguinte:De VARCHAR2 ou CHAR para NUMBER;De VARCHAR2 ou CHAR para DATE.Conversão explícita de tipo de dados:

Funções de Conversão ExplíticaO PL/SQL oferece três funções – como podemos observar na figura acima – para converter um valor de um tipo de dados para outro:TO_CHAR(número[data, [fmt],[nlsparams]) – Converte um número ou data para uma string de caractere VARCHAR2 com modelo de format fmt. Convesão de Número O parâmetro nlsparams especifica os seguintes caracteres, que são retornados por elementos de formato de número: Caractere decimal;Separador de grupo;Símbolo de moeda local;Símbolo de moeda internacional.Se nlsparams ou qualquer outro parâmetro for omitido, essa função utilizará os valores de parâmetro default para a seção.Conversão de Data O parâmetro nlsparams especifica o idioma no qual os nomes de dias, meses e abreviação retornam. Se este parâmetro for omitido, essa função utilizará os idiomas de data default para a seção.TO_NUMBER(carac,[fmt], [nlsparams]) Converte uma string de caractere contendo dígitos para um número no formato especificado pelo modelo de formato opcional fmt.O parâmetro nlsparams tem a mesma finalidade neste função como na função TO_CHAR para a conversão de número.TO_DATE(carac, [fmt], [nlsparams]) Converte uma string de caractere representando uma data para um valor de data de acordo com o fmt especificado.Se fmt for omitido, o formato é DD-MON-YY.O parâmetro nlsparams possui a mesma finaliade na função TO_CHAR para a conversão de data.Usando a função TO_CHAR com Datasview source

print?1 -- SINTAXE DA FUNÇÃO TO_CHAR 2 TO_CHAR(data, 'fmt')

3 -- CONVERTENDO A DATA/HORA ATUAL PARA STRING 4 SELECT TO_CHAR(SYSDATE, 'DD-MM-YYYY') FROM DUAL -> Resultado: "05-03-2011"O modelo de formato:Deve estar entre aspas simples e fazer distinção entre maiúsculas e minúsculas;Pode incluir qualquer elemento de formato de data válido;

7

Page 8: Aulas SQL 1

Tem um elemento fmt para remover espaços preenchidos ou suprimir zeros à esquerda;É separado do valor de data por uma vírgula.Usando a função TO_CHAR com Númerosview source

print?1 -- SINTAXE DA FUNÇÃO TO_CHAR 2 TO_CHAR(data, 'fmt')

3 -- CONVERTENDO A DATA/HORA ATUAL PARA STRING 4 SELECT TO_CHAR(3000, '$99,999') FROM DUAL -> Resultado: "$3,000"O modelo de formato:Deve estar entre aspas simples e fazer distinção entre maiúsculas e minúsculas;Pode incluir qualquer elemento de formato de número válido;Tem um elemento fmt para remover espaços preenchidos ou suprimir zeros à esquerda;É separado do valor do número por uma vírgula.Usando a função TO_NUMEBR e TO_DATEview source

print?1 -- SINTAXE DA FUNÇÃO TO_DATE 2 TO_DATE(carac[, 'fmt'])

3 -- SINTAXE DA FUNÇÃO TO_NUMBER 4 TO_NUMBER(carac[, 'fmt'])Exemplos de formatos de data válidos:SCC ou CC – Século; Prefixos S data AC com -;Anos em datas YYYY ou SYYYY - Ano; Prefixos S data AC com -;YYY ou YY ou Y – Últimos três, dois ou um dígitos do ano;Y, YYY – Ano com vírgula nesta posição;IYYY, IYY, IY, I - Quatro, três, dois ou um dígito  do ano com base no padrão ISO;SYEAR ou YEAR – Ano inteiro; Prefixos S data AC com -;BC ou AD – Indicador AC/DC;B.C. ou A.D. – Indicador com pontos AC/DC;Q – Trimestre do ano;MM – Mês, valor de dois dígitos;MONTH – Nome do mês preenchidos com espaços limite a nove caracteres;MON – Nome do mês, abreviação de três letras;RM – Mês em números romanos;WW ou W – Semana do ano ou mês;DDD ou DD ou D – Dia do ano, mês ou semana;DAY – Nome do dia preenchido com espaços limitado a nove caracteres;DY – Nome do dia; abreviação de três letras;J – Dia do calendário juliano; o número de dias deste 31 de dezembro 4713 BC.Exemplos de formatos de hora:AM ou PM - Indicador de meridiano;A.M. ou P.M. - Indicador de meridiano com pontos.HH ou HH12 ou HH24 – Horas do dia ou hora (1 a 12) ou hora (0 a 23);MI – Minuto (0 a 59);SS – Segundo (0 a 59);SSSSS – Segundos após a meia-noite (0-86399).Exemplos de outros formatos:/ . , - A pontuação é reproduzida no resultado;“of the” - A string entre aspas é reproduzida no resultado.Exemplos de formatos especificando sufixos para influenciar na exibição de número:TH – Número ordinal (por exemplo, DDTH para 4TH);SP – Número por extenso (por exemplo, DDSP para FOUR);SPTH ou THSP – Números ordinais por extenso (por exemplo, DDSPTH ou FOURTH).Exemplos de formatos de número válidos:Se estiver convertendo um número para tipo de dados de caractere, você pode usar o seguintes elementos:9 - Posição numérica (número de 9s determinam o tamanho da exibição. Exemplo: 999999. Resultado: 1234.0 – Exibe zeros à esquerda. Exemplo: 099999. Resultado: 001234.$ - Sinal de dólar flutuante. Exemplo: $999999. Resultado: $1234.L – Sinal da moeda local flutuante. Exemplo: L999999. Resultado: FF1234.. – Ponto decimal na posição especificada. Exemplo: 999999.99. Resultado: 1234.00., – Vírgula na posição especificada. Exemplo: 999,999. Resultado: 1, 234.MI – Sinais de menos à direita (valores negativos). Exemplo: 999999MI. Resultado: 1234-.PR – Coloca números negativos entre parênteses. Exemplo: 999999PR. Resultado: (1234).EEEE – Notação científica (formato deve especificar quatro Es). Exemplo: 99,999EEEE. Resultado: 1.234E+03.V – Multiplica por 10 n vezes (n = número de 9s após o V). Exemplo: 9999v99. Resultado: 123400.B – Exibe valores de zero como espaço, não 0. Exemplo: B9999.99. Resutlado: 1234.00.Outras funções muito utilizadas:NVL(expr1, expr2) – Converte nulo para um valor real. Os tipos de dados que podem ser usados são data, número e caractere;Dada a sintaxe, temos: expr1 – é o valor de origem ou expressão que pode conter nulo;expr2 – é o valor de destino para a conversão de nulo.Exemplificando, temos: NUMBER – NVL(number_column, 9)DATE - NVL(date_column, ’01-JAN-95′)CHAR ou VARCHAR2 – NVL(character_column, ‘Unavaiable’)

8

Page 9: Aulas SQL 1

DECODE(col/expressão, pesquisa1, resultado1[, pesquisa2, resultado2, ...,][, default]) – Facilita as pesquisas condicionais realizando o trabalho de uma instrução CASE ou IF-THEN-ELSE. A função DECODE decodifica uma expressão de um modo similar a lógica IF-THEN-ELSE usada em diversas linguagens. A função DECODE decodifica a expressão após compará-la a cada valor de pesquisa. Se expressão forma a mesma da pesquisa, o resultado é retornado.Exemplificando, temos o uso das duas funções citadas acima:view source

print?1 -- EXEMPLO DE USO DA FUNÇÃO NVL COM EXPRESSÕES 2 SELECT NVL(NULL, 9) FROM DUAL; -> Resultado: "9";

3 -- EXEMPLO DE USO DA FUNÇÃO NVL COM COLUNAS 4 SELECT CD_FUNCIONARIO, DS_FUNCIONARIO, NVL(QT_SALARIO, 0) FROM FUNCIONARIO; -> Resultado: "1", "IGOR BORLOT BORBA", "0".

5 -- EXEMPLO DE USO DA FUNÇÃO DECODE COM COLUNAS

6SELECT CD_FUNCIONARIO, DS_FUNCIONARIO, DECODE(CD_CARGO, 1, (QT_SALARIO*1), 2, (QT_SALARIO*2), QT_SALARIO) FROM FUNCIONARIO; -> Resultado: "1", "IGOR BORLOT BORBA", "15000".

Aninhando FunçõesAs funções de uma única linha podem ser aninhadas em qualquer nível;Funções aninhadas são avaliadas a partir do nível mais interno para o nível mais externo.

Aninhamento de FunçõesExemplificando, temos:view source

print?1 -- EXEMPLO DE ANINHAMENTO DE FUNÇÕES

2SELECT CD_FUNCIONARIO, NVL(TO_CHAR(DS_FUNCIONARIO),'NÃO INFORMADO')) FROM FUNCIONARIO --> Resultado: "Se nulo, resultará no valor NÃO INFORMADO".

SumárioUse as funções para realizar as seguintes ações:Executar cálculos usando dados;Modificar itens de dados individuais;Manipular saída para grupos de linhas;Alterar formatos de data para exibição;Converter tipos de dados de coluna.

Aula 09 – Criando Funções SQL  iRate This

ObjetivoNesta aula você terá oportunidade de:Compreender como criar suas próprias funções SQL.Compreender que toda função tem de retornar um valorCriando Funções SQLVejamos a sintaxe abaixo para compreender como se dá a criação de um função:view source

print?1 CREATE [OR REPLACE] FUNCTION nome_da_função 2 [( parameter1 [ mode1] datatype1,

3 parameter2 [ mode2] datatype2, 4 . . .)]

9

Page 10: Aulas SQL 1

5 RETURN tipo_de_dado 6 IS|AS

7 Bloco PL/SQL;Exemplificando a criação de uma função, temos:view source

print?01 CREATE OR REPLACE FUNCTION FN_OBTEM_MAIOR_SALARIO 02        (P_CD_FUNCIONARIO IN FUNCIONARIO.CD_FUNCIONARIO%TYPE)

03        RETURN NUMBER 04      IS

05        V_QT_SALARIO FUNCIONARIO.QT_SALARIO%TYPE :=0; 06      BEGIN

07        SELECT MAX(QT_SALARIO) 08          INTO V_QT_SALARIO

09          FROM HISTORICO_SALARIO 10         WHERE CD_FUNCIONARIO = P_CD_FUNCIONARIO;

11      RETURN V_QT_SALARIO; 12 END FN_OBTEM_MAIOR_SALARIO;

13 /Podemos realizar as seguintes observações de acordo com o exemplo apresentado acima:view source

print?1 -- PARA DECLARAR O TIPO DE DADOS DE UMA VARIÁVEL, VOCÊ PODE: 2 -- OPÇÃO 01: DEFINIÇÃO DO TIPO A PARTIR DE UMA COLUNA

3 -- [nome da variável] [tabela].[coluna]%TYPE := [valor padrão]; 4 -- OPÇÃO 02: DEFINIÇÃO DO TIPO A PARTIR DA DEFINIÇÃO DIRETA DO TIPO DA VARIÁVEL

5-- [nome da variável] [tipo de dados] := [valor padrão];

SumárioCrie funções SQL para combinar uma ou mais funções do próprio Oracle.Utilize as funções SQL criadas por você para permitir a geração de resultados customizados;Elimine a necessidade de cláusulas IF-THEN-ELSE ao criar suas próprias funções.

Aula 10 – Otimizando Consultas SQL  iRate This

ObjetivoNesta aula o aluno terá como objetivo conhecer melhor algumas das técnicas para análise e melhoria de performance de suas consultas, logo temos a abordagem dos seguintes assuntos:Análise de consultas de consultas (incluindo o plano de execução);Criação de Índices (no momento oportuno).Analisando ConsultasAo analisarmos uma precisamos entender o comando que “explica o plano” de execução de uma consulta, logo temos:view source

print?1 EXPLAIN PLAN FOR2 <<declaração sql>>;Exemplificado abaixo, temos:view source

print?1 EXPLAIN PLAN FOR2 SELECT CD_MODALIDADE, DS_MODALIDADE FROM MODALIDADE;Entretando, temos uma forma muito mais simples quando utilizanda a ferramenta Oracle SQL Developer, logo temos:

10

Page 11: Aulas SQL 1

Executando Plano de ExplanaçãoÍndicesO que é um índice?É um objeto de esquema;É usad pelo Oracle Server para acelerar a recuperação de linhas usando um ponteiro;Pode reduzir a E/S do disco usando o método rápido de acesso a caminhos para localizar os dados rapidamente;É independente da tabela que indexa;É usado e mantido automaticamente pelo Oracle Server.Como os índices podem ser criados?Automaticamente: Um índice é criado automaticamente quando você define uma restrição PRIMARY KEY ou UNIQUE em uma definição de tabela.Manualmente: Os usuários podem criar índices não-exclusivos em colunas para acelerar o tempo de acesso às linhas.Criando um ÍndiceCrie um índice aplicando para uma ou mais colunas, conforme a sintaxe abaixo:view source

print?1 CREATE [UNIQUE] INDEX <<nome do índice>> 2 ON <<tabela>> (<<nome da coluna>>[, <<nome da coluna>>]);Exemplificando, temos a criação de um índice nã0 único sobre a tabela de MODALIDADE:view source

print?1 CREATE INDEX IN_MODALIDADE 2 ON MODALIDADE (DS_MODALIDADE);Exemplificando, temos a criação de um índice único sobre a tabela de MODALIDADE:view source

print?1 CREATE UNIQUE INDEX IN_MODALIDADE 2 ON MODALIDADE (DS_MODALIDADE);Quando Criar um Índice?Quando a cláusula for usada frequentemente na cláusula WHERE ou em uma condição de junção;Quando a coluna contiver uma ampla faixa de valores;Quando a coluna contiver um grande número de valores nulos;Quando duas ou mais colunas forem usadas juntas com frequência em uma cláusula WHERE ou em um condição de junção;Quando a tabela for grande e se esperar qeu a maioria das consultas recupere menos que 2 a 4% das linhas.Quando não Criar um Índice?Quando a tabela for pequena;Quando as colunas não fore utilizadas com frequência como uma condição na consulta;Quando se esperar que a maioria das consultas recupere que 2 a 4% das linhas;Quando a tabela for atualizada com frequência.Removendo um ÍndiceRemova um um índice utilizando a opção DROP INDEX:view source

print?1 DROP INDEX <<nome do índice>>;Exemplificando, temos a remoção de um índice independente do nome da tabela :

11

Page 12: Aulas SQL 1

view source

print?1 DROP INDEX IN_MODALIDADE;Atenção!!! Podemos observar que o nome do índice deverá ser sempre único para todo o contexto do esquema (usuário) que ele estiver associado.SumárioUtilize a cláusula EXPLAIN PLAN para descrever o custo e o tempo de execução da consulta com objetivo de identificar os gargalos e aumentar a sua performance.A criação de índices é extremamente importante para que possa acelerar a pesquisa em cenários específicos de consulta;Evite de criar índices para tabelas pequenas.

12