Upload
julio-kblera-de-barros
View
638
Download
2
Embed Size (px)
Citation preview
UUNNIIVVEERRSSIIDDAADDEE FFEEDDEERRAALL DDEE SSÃÃOO CCAARRLLOOSS
CCEENNTTRROO DDEE CCIIÊÊNNCCIIAASS EEXXAATTAASS EE DDEE TTEECCNNOOLLOOGGIIAA
DDEEPPAARRTTAAMMEENNTTOO DDEE EESSTTAATTÍÍSSTTIICCAA
IINNTTRROODDUUÇÇÃÃOO AAOO SSAASSSSQQLL
FFEELLIIPPEE MMAARRAANNGGOONNII
PPEEDDRROO FFEERRRREEIIRRAA FFIILLHHOO
JJAANNEEIIRROO 22001100
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 1
1. Introdução
Structure Query Language ou SQL é uma sublinguagem que nos possibilita trabalhar e
relacionar grandes bases de dados de forma simples, rápida e flexível. Devido às grandes
vantagens em utilizá‐la, diversas companhias como IBM, Microsoft, Sybase ou Oracle a
adotaram em seus produtos.
Este manual utilizará o SAS – Statistical Analisys System, um software estatístico que
também trabalha com este tipo de linguagem através do procedimento PROC SQL.
1.1 Porquê aprender PROC SQL Diferentemente das linguagens procedurais, SQL é uma linguagem declarativa, ou seja,
uma consulta SQL especifica a forma do resultado e não o caminho para se chegar a ele. Desta
maneira, a simples utilização do PROC SQL ao invés do SAS Data steps (Ambiente Natural do
SAS) eliminará diversos passos e procedimentos em seu programa.
Alem disso, também disponibiliza Procedures para criar, modificar, relacionar ou
eliminar bancos, produzir relatórios ou mesmo permitir uma maior segurança das informações
presentes nos Data Sets.
2. Criando Uma Biblioteca Pessoal Primeiramente, utilizando o SAS Data step, criaremos uma Biblioteca em um diretório
especificado pelo programador, onde armazenaremos todos os bancos de dados e arquivos
referentes ao mesmos. Criar uma biblioteca significa especificar um local de armazenamento
qualquer no computador do usuário, onde todos os bancos de dados ficarão salvos e poderão
ser acessados através do SAS.
No exemplo a seguir, criamos uma biblioteca chamada DADOS, em que todos os
arquivos nela salvos, serão armazenados na área de trabalho do programador.
SAS DATA STEP
LIBNAME DADOS 'C:\Felipe Marangoni\Desktop\SQL - Arquivos'; RUN;
Por default, o SAS já disponibiliza uma biblioteca chamada WORK, porem qualquer
banco de dados armazenados nela será temporário e será apagado ao encerrarmos a
respectiva sessão SAS. Podemos visualizar a criação da biblioteca DADOS dentro do diretório
Libraries.
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 2
3. Trabalhando com um conjunto de dados
Para as diversas funções do PROC SQL, utilizaremos um banco de dados referente ao
processo seletivo 2008 da UFSCar.
Data Sets: As diversas funções disponibilizadas no SQL encontram‐se em palavras reservadas de
programação.
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 3
3.1 Ordenando OUTPUT de acordo com uma Variável Podemos então, verificar o conteúdo lido de qualaquer uma das Tabelas: CÓDIGO SQL
PROC SQL; SELECT INSCRICAO, SEXO, CAMPUS FROM DADOS.GERAL ORDER BY INSCRICAO; QUIT;
É possível validar esta operação através dos comandos VALIDATE ou NOEXEC, usados
apenas para conferir se a sintaxe encontra‐se correta sem que o todo o procedimento seja
executado.
CÓDIGO SQL
PROC SQL; VALIDATE SELECT INSCRICAO, SEXO, CAMPUS FROM DADOS.GERAL ORDER BY INSCRICAO;
QUIT; CÓDIGO SQL
PROC SQL NOEXEC; SELECT INSCRICAO, SEXO, CAMPUS FROM DADOS.GERAL ORDER BY INSCRICAO;
QUIT;
OUTPUT PARCIAL
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 4
Verificamos que o resultado é apresentado de forma ordenada por número de
inscrição, e com apenas as variáveis especificadas. Podemos ainda ordenar a tabela através da
posição ordinal em que a variável se encontra dentro do SELECT. Se for mantida a variável
Inscricao na primeira posição, obteremos o mesmo resultado ao utilizarmos o valor 1, como
vemos a seguir.
CÓDIGO SQL
PROC SQL; SELECT INSCRICAO, SEXO, CAMPUS FROM DADOS.GERAL ORDER BY 1; QUIT;
OUTPUT PARCIAL
3.2 Agrupando OUTPUT de acordo com uma Variável Podemos agrupar o banco de dados de acordo com alguma variável de interesse.
Como exemplos, utilizaremos a variável Cidade, em GERAL.
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 5
CÓDIGO SQL
PROC SQL; SELECT INSCRICAO, ISENTO, CIDADE FROM DADOS.GERAL GROUP BY CIDADE; QUIT;
OUTPUT PARCIAL
É possível verificar que os indivíduos encontram‐se distribuídos de acordo com as
cidades de origem.
3.3 Utilizando Operações com Escalares Os operadores escalares disponíveis são:
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 6
Considerando que o total de pontos possíveis é 190, podemos criar uma nova variável
chamada Aproveitamento através da multiplicação de TPontos por 100/190 (em valores
percentuais).
CÓDIGO SQL
PROC SQL; SELECT INSCRICAO, TPONTOS, TPONTOS*(100/190) AS APROVEITAMENTO FROM DADOS.GERAL; QUIT;
OUTPUT PARCIAL
Alem disso, é possível refinar a busca utilizando a ordenação e o agrupamento em
conjunto.
3.4 Voltando ao Ambiente Natural SAS No exemplo acima, criamos uma nova variável cujo conteúdo não existia
anteriormente. Caso haja interesse, é possível voltar a trabalhar com esta variável utilizando
SAS Data step.
3.4.1 ODS LISTING
A partir do comando ODS do PROC SQL, será obtido um novo banco que chamaremos de
APTOTAL, armazenado na biblioteca WORK do SAS.
CÓDIGO SQL
ODS LISTING CLOSE; ODS OUTPUT SQL_Results = APTOTAL; PROC SQL; SELECT INSCRICAO, TPONTOS*(100/190) AS APROVEITAMENTO FROM DADOS.GERAL; QUIT;
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 7
ODS OUTPUT CLOSE; ODS LISTING;
WORK.APTOTAL
Como não especificamos a biblioteca, por default o arquivo ficará gravado na
biblioteca temporária Work do SAS.
3.7.4 Modificando Tabelas e Variáveis No exemplo abaixo, verificamos que é possível modificar características de uma
variável como o formato, tipo, descrição, dentre outras opções.
CÓDIGO SQL
PROC SQL; ALTER TABLE DADOS.SEXO MODIFY SX CHAR(1) LABEL='Descricao';
QUIT;
DADOS.SEXO
Verifica‐se que existem diversos operadores e funções que nos auxiliam a trabalhar
com um banco de dados. Na tabela abaixo, podemos visualizar todos eles.
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 8
3.4.2 Criando uma tabela através do comando CREATE TABLE Podemos voltar também ao ambiente natural SAS através do comando CREATE TABLE
de uma forma ainda mais simplificada. Verificaremos que o resultado será idêntico ao do
exemplo anterior.
CÓDIGO SQL
PROC SQL; CREATE TABLE APTOTAL2 AS SELECT INSCRICAO, TPONTOS*(100/190) AS APROVEITAMENTO FROM DADOS.GERAL;
QUIT;
WORK.APTOTAL2
3.5 Inserindo Novas Observações Existem alguns comandos que permitem que novas linhas ou observações sejam
inseridas no banco de dados de forma manual.
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 9
3.5.1 Função INSERT através do comando SET Através da função INSERT é possivel inserir observações manualmente através da
digitação dos dados. Deve‐se ressaltar que esta é uma forma indicada para a inclusão de
apenas poucas observações.
CÓDIGO SQL
PROC SQL; INSERT INTO DADOS.CAMPUS SET CAMPUS = 4, CC = 'Campinas';
QUIT;
3.5.2 Função INSERT através do comando VALUES É possível também inserir diretamente toda uma linha através da função VALUES,
como visto no exemplo a seguir.
CÓDIGO SQL
PROC SQL;
INSERT INTO DADOS.CAMPUS VALUES (5,'Araraquara');
QUIT;
3.6 Removendo Linhas O comando DELETE possibilita a remoção de uma ou mais linhas de uma determinada
tabela. Para a seleção das linhas a serem deletadas, pode‐se trabalhar conjuntamente com
operadores lógicos dentro da função WHERE.
CÓDIGO SQL
PROC SQL; DELETE FROM DADOS.CAMPUS WHERE CAMPUS GE 4;
QUIT;
3.7Alterando Colunas através do comando ALTER TABLE Através do comando ALTER TABLE, é possível alterar uma tabela, modificando,
adicionando ou transformando variáveis.
3.7.1 Adicionando uma nova variável
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 10
CÓDIGO SQL
PROC SQL; ALTER TABLE DADOS.CAMPUS ADD CODIGO CHAR(2);
QUIT;
DADOS.CAMPUS
3.7.2 Trabalhando com os recursos conjuntamente
Dentro de um único procedure, podemos trabalhar com diversos operadores de forma
seqüencial. No exemplo a seguir, observa‐se que são executadas diversas funções dentro de
um único PROC SQL.
CÓDIGO SQL
PROC SQL; ALTER TABLE DADOS.GERAL ADD APTOTAL NUM MODIFY TPONTOS FORMAT=INT8.2, APTOTAL FORMAT=PERCENT8.2; UPDATE DADOS.GERAL SET APTOTAL = TPONTOS/190; SELECT INSCRICAO, TPONTOS, APTOTAL FROM DADOS.GERAL;
QUIT;
OUTPUT
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 11
3.7.3 Excluindo Variáveis ou Tabelas CÓDIGO SQL
PROC SQL; ALTER TABLE DADOS.CAMPUS DROP CODIGO;
QUIT;
4. Verificando o Conteúdo de um Banco CÓDIGO SQL
PROC SQL; DESCRIBE TABLE DADOS.GERAL;
RUN; LOG
4.1 Identificando Dados Duplicados Em um conjunto de dados como este, que possui mais de 26 mil observações, é de se
esperar que existam colunas com informações iguais. A partir do comando DISTINCT, é possível
selecionar cada uma das informações, sem necessidade de repeti‐las, tendo uma visão geral do
conteúdo de uma específica variável.
CÓDIGO SQL
PROC SQL; SELECT DISTINCT OP1 FROM DADOS.GERAL;
QUIT; OUTPUT PARCIAL
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 12
4.2 Identificando dados únicos Outra possibilidade é a de encontrar valores que não se repetem no Data Set, o que
muitas vezes é de grande utilidade para o programador, como veremos a seguir.
CÓDIGO SQL:
PROC SQL; SELECT UNIQUE CIDADE FROM DADOS.GERAL; QUIT;
OUTPUT PARCIAL
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 13
Neste caso, o comando UNIQUE permite ao programador identificar variações de uma
mesma cidade, ou mesmo erros de digitação, podendo assim fazer as devidas modificações.
5. Operadores Lógicos e Funções
Podemos utilizar operadores e funções para definir dados específicos de um banco ou
relacionar tabelas a partir de uma variável em comum.
CÓDIGO SQL
PROC SQL; SELECT DISTINCT OP1 FROM DADOS.GERAL WHERE OP1 >= 137 and op1 <= 151; QUIT;
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 14
OUTPUT
CÓDIGO SQL
PROC SQL; SELECT INSCRICAO, CIDADE, SEXO, TPONTOS FROM DADOS.GERAL WHERE SEXO EQ 2 AND (TPONTOS GE 155 AND TPONTOS LE 160)
GROUP BY CIDADE; QUIT;
OUTPUT
6. Trabalhando com Duas ou Mais Bases Não é difícil nos depararmos com uma situação em que as informações desejadas
encontram‐se espalhadas por diferentes bases de dados. Uma questão muito comum é a
necessidade de se trabalhar e interagir com todos estes data sets simultaneamente. A seguir,
caminharemos por diferentes bancos de dados de uma forma simplificada, utilizando algumas
das funções já vistas inicialmente.
Neste primeiro caso, repetiremos o exemplo acima, trabalhando com o banco Geral e
buscando no banco Sexo, a variável SX que corresponde ao formato da variável SEXO. Vale
destacar que é necessário existir uma variável em comum em ambos os data sets que
diferencie as informações (foreign key) que neste caso será SEXO.
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 15
CÓDIGO SQL
ODS LISTING CLOSE; ODS OUTPUT SQL_Results = NOVODATA; PROC SQL;
SELECT GERAL.INSCRICAO, GERAL.CIDADE, SEXO.SX, GERAL.TPONTOS FROM DADOS.GERAL, DADOS.SEXO WHERE GERAL.SEXO = SEXO.SEXO;
QUIT; ODS OUTPUT CLOSE; ODS LISTING;
OUTPUT
Podemos observar que neste novo banco “NOVODATA” conterá as duas informações
conjuntamente, que até então estavam separadas. Ao se trabalhar com ambos os data sets, se
obtêm uma saída muito mais informativa, já que o código relativo a variável em questão é
substituído pelo seu respectivo formato.
Desta forma, podemos ter uma grande diversidade de aplicações:
CÓDIGO SQL PROC SQL; SELECT GERAL.INSCRICAO, GERAL.SEXO, GERAL.CAMPUS, GERAL.OP1 FROM DADOS.GERAL, DADOS.SEXO, DADOS.CAMPUS, DADOS.CURSO WHERE GERAL.SEXO = SEXO.SEXO;
QUIT; OUTPUT PARCIAL
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 16
CÓDIGO SQL PROC SQL; SELECT GERAL.INSCRICAO, GERAL.OP1, CURSO.NOME_CURSO, ISENCAO.SN FROM DADOS.GERAL, DADOS.CURSO, DADOS.ISENCAO WHERE GERAL.OP1 >= 137 and GERAL.OP1 <= 151 AND GERAL.OP1 = CURSO.OP1 AND GERAL.ISENTO = ISENCAO.ISENTO ORDER BY GERAL.OP1;
QUIT;
OUTPUT PARCIAL
2.8.2 Combinando bancos Existem diversas opções para junções de dois ou mais bancos de dados. A seguir
veremos algumas possibilidades de concatenações de forma bem simplificada.
2.8.2.1 Concatenando utilizando a função LEFT Ao utilizarmos a opção LEFT, ao unirmos duas tabelas, àquela que dispormos à
esquerda, logo após o comando FROM, será completamente selecionada. No caso da tabela à
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 17
direita, apenas as observações ligadas pela variável chave comum em ambas as tabelas é que
serão selecionadas.
CÓDIGO SQL
PROC SQL; SELECT * FROM DADOS.TAB1 LEFT JOIN DADOS.TAB2 ON TAB1.X = TAB2.X;
QUIT; OUTPUT
2.8.2.2 Concatenando utilizando a função RIGHT Da mesma forma que no exemplo anterior, ao utilizarmos o comando RIGHT, o
resultado será parecido, porem com a tabela que estava do lado direto, logo após o comando
FROM.
CÓDIGO SQL
PROC SQL; SELECT * FROM DADOS.TAB1 RIGHT JOIN DADOS.TAB2 ON TAB1.X = TAB2.X;
QUIT; OUTPUT
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 18
2.8.2.3 Concatenando utilizando a função FULL Ao utilizarmos a função FULL, todas as observações serão selecionadas e dispostas de forma a manter a igualdade da variável chave. CÓDIGO SQL
PROC SQL; SELECT * FROM DADOS.TAB1 FULL JOIN DADOS.TAB2 ON TAB1.X = TAB2.X;
QUIT; OUTPUT
2.8.2.3 Concatenando utilizando a função COALESCE Podemos ainda conseguir o mesmo resultado do exemplo anterior, aplicando a função
COALESCE, excluindo a variável X que aparece duas vezes.
CÓDIGO SQL
PROC SQL; SELECT COALESCE(TAB1.X,TAB2.X), A, B FROM DADOS.TAB1 FULL JOIN DADOS.TAB2 ON TAB1.X = TAB2.X;
QUIT; OUTPUT
2.8.2.3 Junção de Tabelas através do operador EXCEPT Através do operador EXCEPT, serão selecionadas as observações únicas da primeira
tabela, ou seja, que estejam presente na primeira tabela e não estejam na segunda. Para
exemplificação, passaremos a trabalhar com novas tabelas.
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 19
CÓDIGO SQL
PROC SQL; SELECT * FROM DADOS.TAB3 EXCEPT SELECT * FROM DADOS.TAB4;
QUIT;
OUTPUT
Caso utilizemos EXCEPT ALL, observações repetidas no primeiro banco e que não estejam
contidas no segundo, serão preservadas.
CÓDIGO SQL
PROC SQL; SELECT * FROM DADOS.TAB3 EXCEPT ALL SELECT * FROM DADOS.TAB4;
QUIT;
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 20
OUTPUT
Se utilizarmos ainda a função CORR, todas as observações repetidas e uma mesma variável
e em ambos os bancos serão excluídas, sejam elas acompanhadas de informações diferentes
de outras variáveis ou não. Desta maneira, apenas serão mantidas as observações realmente
únicas no primeiro banco.
CÓDIGO SQL
PROC SQL; SELECT * FROM DADOS.TAB3 EXCEPT CORR SELECT * FROM DADOS.TAB4;
QUIT; OUTPUT
2.8.2.4 Junção de Tabelas através do operador INTERSECT
O operador INTERSECT permite que selecionemos linhas que pertençam em ambas as
tabelas.
CÓDIGO SQL
PROC SQL; SELECT * FROM DADOS.TAB3 INTERSECT SELECT * FROM DADOS.TAB4;
QUIT; OUTPUT
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 21
Assim como no primeiro caso, as opções ALL e CORR também poderão ser utilizadas.
2.8.2.5 Junção de Tabelas através do operador UNION
O operador UNION fará a junção completa das tabelas, excluindo apenas as linhas
duplicadas.
CÓDIGO SQL
PROC SQL; SELECT * FROM DADOS.TAB3 UNION SELECT * FROM DADOS.TAB4;
QUIT; OUTPUT
2.8.2.5 Junção de Tabelas através do operador OUTER UNION
O operador OUTER UNION concatenará as duas tabelas, uma abaixo da outra, sem que
nenhuma linha seja excluída. Utilizando a opção CORR, verifica‐se a união da variável em
comum.
CÓDIGO SQL
PROC SQL; SELECT * FROM DADOS.TAB3 OUTER UNION SELECT * FROM DADOS.TAB4;
QUIT;
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 22
OUTPUT
CÓDIGO SQL
PROC SQL; SELECT * FROM DADOS.TAB3 OUTER UNION CORR SELECT * FROM DADOS.TAB4;
QUIT; OUTPUT
2.9 Utilizando referencia em um mesmo SELECT
Criando uma nova coluna com referência a outra calculada em um mesmo SELECT. CÓDIGO SQL
PROC SQL; SELECT INSCRICAO, TPONTOS, CIDADE, TPONTOS/190 AS APROVEITAMENTO, CALCULATED APROVEITAMENTO*100 AS PORCENTAGEM format=inter8.2 FROM DADOS.GERAL ORDER PORCENTAGEM DESC;
QUIT;
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 23
OUTPUT PARCIAL
É ainda possível, colocar na forma de porcentagem diretamente, excluindo uma linha de programação e otimizando o processo. CÓDIGO SQL
PROC SQL; SELECT INSCRICAO, TPONTOS, CIDADE, TPONTOS/190 AS APROVEITAMENTO format=percent8.2 FROM DADOS.GERAL ORDER BY APROVEITAMENTO DESC;
QUIT;
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 24
OUTPUT PARCIAL
2.10 Identificando Não‐Missing CÓDIGO SQL PROC SQL; SELECT INSCRICAO, TPONTOS, COALESCE(ISENTO) FROM DADOS.GERAL;
QUIT;
OUTPUT
2.11 Inserindo uma coluna de referência Através da função MONOTONIC( ) é possível adicionar uma coluna ao OUTPUT que
contenha uma seqüência ordenada, como referência à posição das observações nas linhas.
CÓDIGO SQL PROC SQL; SELECT MONOTONIC() AS Numero_Linha, GERAL.INSCRICAO, CAMPUS.CC FROM DADOS.GERAL, DADOS.CAMPUS WHERE GERAL.CAMPUS = CAMPUS.CAMPUS;
QUIT;
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 25
OUTPUT PARCIAL
Existe ainda a possibilidade de se acrescentar esta coluna através do comando NUMBER, como vemos a seguir. CÓDIGO SQL PROC SQL NUMBER; SELECT GERAL.INSCRICAO, CAMPUS.CC FROM DADOS.GERAL, DADOS.CAMPUS WHERE GERAL.CAMPUS = CAMPUS.CAMPUS;
QUIT; OUTPUT PARCIAL
2.12 Estatísticas Descritivas no SQL O procedure SQL é também uma ferramenta excelente para a criação de bancos de
dados que contenha informações descritivas de outros data sets. Isto é possível através de
uma gama de funções disponíveis que permitem cálculos, estatísticas descritivas e resumos em
geral.
Na tabela a seguir é possível visualizar essas funções.
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 26
Podemos então obter o número de cursos disponíveis através da função COUNT
aplicado à variável Nome_Curso ou OP1.
CÓDIGO SQL PROC SQL; SELECT COUNT(NOME_CURSO) AS Numero_de_Cursos FROM DADOS.CURSO;
QUIT;
OUTPUT
Podemos ainda trabalhar conjuntamente as estatísticas descritivas e as funções acima
exemplificadas.
CÓDIGO SQL
PROC SQL; SELECT MAX(TPONTOS) AS Melhor_Desempenho, MIN(TPONTOS) AS Menor_Desempenho FROM DADOS.GERAL WHERE OP1 EQ 151;
QUIT;
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 27
OUTPUT
CÓDIGO SQL
PROC SQL; SELECT MEAN(TPONTOS*(100/190)) AS Media, STD(TPONTOS*(100/190)) AS Variancia, T(TPONTOS*(100/190)) AS T,
MEAN(TPONTOS*(100/190))/(STD(TPONTOS*(100/190))/N(TPONTOS)**(1/2)) AS Est_Teste
FROM DADOS.GERAL; QUIT;
OUTPUT
Alem da possibilidade de aplicar as funções a todo o conjunto de valores, é possível
obter o mesmo resultado em subconjuntos, simultaneamente. No exemplo a seguir, calcula‐se
a média em cada um dos campus.
CÓDIGO SQL
PROC SQL; SELECT CAMPUS, AVG(GERAL.TPONTOS)AS Medias FROM DADOS.GERAL GROUP BY CAMPUS;
QUIT;
OUTPUT
2.13 Predicados Os predicados são indicados quando desejamos comparar duas condições ou
expressões.
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 28
2.13.1 Selecionando um Grupo de Valores Vimos anteriormente que é possível selecionar um intervalo específico de dados
através da utilização de operadores lógicos. O comando BETWEEN é uma simplificação de uma
destas operações.
CÓDIGO SQL
PROC SQL; SELECT INSCRICAO, ISENTO, TPONTOS FROM DADOS.GERAL WHERE TPONTOS BETWEEN 20 AND 21 ORDER BY TPONTOS DESC;
QUIT;
OUTPUT
2.13.2 Selecionando valores nulos CÓDIGO SQL
PROC SQL; SELECT INSCRICAO, ISENTO, TPONTOS FROM DADOS.GERAL WHERE TPONTOS IS NULL;
QUIT;
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 29
SAS LOG
2.13.2 Selecionando valores não nulos Similarmente ao exemplo anterior, podemos aplicar a função NOT IS NULL ou IS NOT
NULL para selecionar os valores diferentes de zero de nosso conjunto de dados.
CÓDIGO SQL
PROC SQL; SELECT INSCRICAO, ISENCAO.SN, TPONTOS, SEXO.SX FROM DADOS.GERAL, DADOS.ISENCAO, DADOS.SEXO WHERE TPONTOS IS NOT NULL AND GERAL.CAMPUS = 1 AND GERAL.SEXO = 1 AND GERAL.SEXO = SEXO.SEXO AND OP1 = 137 AND TPONTOS GT 140 AND GERAL.ISENTO = ISENCAO.ISENTO;
QUIT;
OUTPUT
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 30
2.13.2 Aplicando a Função LIKE Através desta função, é possível selecionar informações que contenham uma parte
específica de texto. No exemplo a seguir, selecionaremos apenas as cidades que começam
com a palavra “SAO”.
CÓDIGO SQL
PROC SQL; SELECT DISTINCT CIDADE FROM DADOS.GERAL WHERE CIDADE LIKE 'SAO%'; ORDER BY CIDADE;
QUIT; OUTPUT PARCIAL
Já neste próximo exemplo, o objetivo é obter as cidades que contenham a palavra
“SAO”, não importando em que parte.
CÓDIGO SQL
PROC SQL; SELECT DISTINCT CIDADE FROM DADOS.GERAL WHERE CIDADE LIKE '%SAO%'; ORDER BY CIDADE;
QUIT;
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 31
OUTPUT PARCIAL
Outra opção é obtermos informações que começam com uma determinada letra,
podendo fixar o número máximo de caracteres através do comando underline “_”. No
exemplo abaixo, desejamos obter os cursos que começam por “E” e que sejam constituídos de
no máximo mais 10 outras letras quaisquer.
CÓDIGO SQL
PROC SQL; SELECT NOME_CURSO FROM DADOS.CURSO WHERE NOME_CURSO LIKE 'E__________';
QUIT; OUTPUT
Variações desta mesma ferramenta nos permitem uma infinidade de opções. Abaixo,
obteremos palavras cuja quarta letra seja “a”, sem restrições às demais.
CÓDIGO SQL
PROC SQL; SELECT NOME_CURSO FROM DADOS.CURSO WHERE NOME_CURSO LIKE '___a%';
QUIT;
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 32
OUTPUT
2.13.3 Função CONTAINS
Esta função assemelha‐se muito à função LIKE, em que nos permite selecionar dados
que contenham determinados trechos ou características, em qualquer parte do texto. O
resultado abaixo também pode ser conseguido utilizando “?” no lugar de CONTAINS.
CÓDIGO SQL
PROC SQL;
SELECT NOME_CURSO FROM DADOS.CURSO WHERE NOME_CURSO CONTAINS 'tec';
QUIT;
CÓDIGO SQL PROC SQL;
SELECT NOME_CURSO FROM DADOS.CURSO WHERE NOME_CURSO ? 'tec';
QUIT; Outra possibilidade é utilizando “%” antes e após o trecho desejado. CÓDIGO SQL
PROC SQL; SELECT NOME_CURSO FROM DADOS.CURSO WHERE NOME_CURSO LIKE '%tec%';
QUIT; OUTPUT
2.13.3 Função SOUNDS‐LIKE
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 33
A função SOUNDS‐LIKE cujo operador é dado por (=*) é uma ferramenta muito
interessante. Ela permite que encontremos pequenas variações de uma palavra, cuja
gramática ou mesmo fonética seja semelhante.
CÓDIGO SQL
PROC SQL; SELECT CIDADE FROM DADOS.GERAL WHERE CIDADE =* 'SANTA BARBARA D´OESTE';
QUIT; OUTPUT PARCIAL
2.13.3 Verificando a Existência de um Valor
Através da função EXISTS, é possível verificar se dados de um terminando data sets
possui informações guardadas em outro determinando banco. No exemplo a seguir,
verificaremos quais observações da tabela GERAL possui informações referentes à variável
Campus presente na tabela CAMPUS.
CÓDIGO SQL
PROC SQL; SELECT INSCRICAO, ISENTO, CAMPUS FROM DADOS.GERAL G WHERE EXISTS (SELECT * FROM DADOS.CAMPUS C WHERE G.CAMPUS = C.CAMPUS);
QUIT;
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 34
OUTPUT PARCIAL
Percebe‐se que todas as observações do banco foram selecionadas, já que todas
possuem o valor da variável Campus.
2.14 Operações Condicionais Outra função muito interessante é a CASE, que permite a inclusão de condições às
operações executadas dentre da função SELECT. Como exemplo, calcularemos o
aproveitamento dos cursos, levando em consideração um total de pontos igual a 190, com
exceção da Música, que devido à prova de aptidão, possui um total de 220 pontos.
CÓDIGO SQL
PROC SQL; SELECT OP1 'CURSOS', CASE OP1 WHEN 22 THEN MEAN(TPONTOS*(100/230)) ELSE MEAN(TPONTOS*(100/190)) END "APROVEITAMENTOS" FROM DADOS.GERAL GROUP BY OP1;
QUIT;
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 35
OUTPUT PARCIAL
2.14 Inserindo um texto CÓDIGO SQL
PROC SQL; SELECT OP1 'CURSOS', 'O aproveitamento é:', CASE OP1 WHEN 22 THEN MEAN(TPONTOS*(100/230)) ELSE MEAN(TPONTOS*(100/190)) END "APROVEITAMENTOS" FROM DADOS.GERAL GROUP BY OP1;
QUIT; OUTPUT PARCIAL
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 36
2.15 Operador IN O operador IN é uma simplificação do operador WHERE. No exemplo abaixo,
realizaremos funções idênticas utilizando os dois operadores.
CÓDIGO SQL
PROC SQL; SELECT OP1 'Cursos', INSCRICAO 'Número de Inscrição', SEXO 'Sexo' FROM DADOS.GERAL WHERE INSCRICAO = 1209892 OR INSCRICAO = 1000373 OR INSCRICAO = 1210041;
QUIT; CÓDIGO SQL
PROC SQL; SELECT OP1 'Cursos', INSCRICAO 'Número de Inscrição', SEXO 'Sexo' FROM DADOS.GERAL WHERE INSCRICAO IN (1209892,1000373,1210041);
QUIT; OUTPUT
Alem disso, podemos acrescentar a função NOT como forma de exclusão de uma
particularidade em questão.
CÓDIGO SQL
PROC SQL; SELECT CC 'Campus', Campus 'Número de Inscrição' FROM DADOS.CAMPUS WHERE CC NOT IN ('Araras','Sorocaba');
QUIT;
OUTPUT
2.16 A Função HAVING
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 37
O comando HAVING, assim como WHERE, determina quais linhas de determinada tabela
serão selecionadas. Porem a função WHERE deve ser utilizada antes que um o comando
GROUP ocorra, já que ela é aplicada em linhas. No caso da ferramenta HAVING, isso não é
necessário, já que é aplicado diretamente aos grupos de dados.
No exemplo abaixo verificamos que o comando HAVING será usado após o comando
GROUP.
CÓDIGO SQL
PROC SQL; SELECT OP1, MAX(TPONTOS) 'Máximo', AVG(TPONTOS) 'Média', MIN(TPONTOS) 'Mínimo', COUNT(TPONTOS) 'Numero de Inscritos' FROM DADOS.GERAL GROUP BY OP1 HAVING AVG(TPONTOS) GE 80;
QUIT;
OUTPUT
Podemos ainda trabalhar conjuntamente com as funções HAVING e WHERE como
vemos no exemplo abaixo.
CÓDIGO SQL
PROC SQL; SELECT CURSO.NOME_CURSO 'Curso', AVG(TPONTOS) 'Média', STD(TPONTOS) 'Desvio Padrão', RANGE(TPONTOS) 'Amplitude' FROM DADOS.GERAL, DADOS.CURSO WHERE GERAL.OP1 = CURSO.OP1 GROUP BY CURSO.NOME_CURSO HAVING AVG(TPONTOS) LE 60;
QUIT;
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 38
OUTPUT
2.17 Trabalhando com Caracteres
Existem uma infinidade de possibilidades quando trabalhamos com variáveis categóricas.
Nos exemplos a seguir, veremos algumas das aplicações e operações disponíveis através da
linguagem SQL.
2.17 Concatenando duas variáveis categóricas CÓDIGO SQL
PROC SQL; SELECT CIDADE, CAMPUS.CC, CIDADE || "," || CAMPUS.CC AS NOVA_VARIAVEL FROM DADOS.GERAL, DADOS.CAMPUS WHERE GERAL.CAMPUS = CAMPUS.CAMPUS;
QUIT;
OUTPUT PARCIAL
2.17.2 Tamanho de um String
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 39
CÓDIGO SQL
PROC SQL; SELECT NOME_CURSO, LENGTH(NOME_CURSO) AS TAMANHO FROM DADOS.CURSO;
QUIT;
OUTPUT PARCIAL
3 Trabalhando com PROC SQL utilizando MACROS Uma grande vantagem ao se utilizar SQL é a possibilidade de criar uma interface com a
linguagem SAS MACRO. Esta implementação permite ao programador customizar operações e
estender as capacidades do procedimento SQL.
Uma macro é basicamente um procedimento que busca resumir um trecho repetitivo de
código em um conjunto de operações cuja única diferença se dá pelo padrão de entrada, que
mudará para cada uma das implementações que realizará.
3.1 Criando Tabelas simultaneamente através de Macros
Inicialmente, prepararemos um novo conjunto de dados CATEG, criando novas
variáveis que servirão como parâmetros para a nova Macro. Teremos como objetivo a criação
de quatro tabelas que conterão as variáveis INSCRICAO, CIDADE e TPONTOS alem da variável
única a cada uma delas: SEXO, ISENTO, CAMPUS, MAT.
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 40
CÓDIGO SQL
ODS LISTING CLOSE; ODS OUTPUT SQL_Results = DADOS.CATEG; PROC SQL;
SELECT INSCRICAO, CIDADE, TPONTOS, SEXO AS V1, ISENTO AS V2, CAMPUS AS V3, MAT AS V4 FROM DADOS.GERAL;
QUIT; ODS OUTPUT CLOSE; ODS LISTING;
A seguir, criaremos uma Macro chamada MACRO1 que produzira quatro tabelas para
cada uma das variáveis V1, V2, V3 e V4.
CÓDIGO SQL
%MACRO MACRO1; %DO i=1 %TO 4;
PROC SQL; SELECT INSCRICAO, CIDADE, TPONTOS, V&i FROM DADOS.CATEG WHERE (TPONTOS GE 155 AND TPONTOS LE 160) ORDER BY V&i; QUIT;
%end; %mend MACRO1; %MACRO1;
OUTPUT
TABELA 1 TABELA 2
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 41
TABELA 3 TABELA 4
3.2 Criando Tabelas específicas através de uma Macro ‐ Função Podemos ainda criar macros na forma de funções cujos parâmetros sejam definidos
pelo programador, de acordo com seu interesse. Diferentemente do exemplo anterior, esse
tipo de macro retornará apenas a tabela para qual foi designada, dependendo do argumento
fornecido.
3.2.1 Macros de um parâmetro: CÓDIGO SQL
%MACRO FORMAT(VAR); %IF %UPCASE(&VAR) = SEXO %THEN %DO;
PROC SQL; SELECT INSCRICAO 'Inscrição', TPONTOS 'Total de Pontos', CIDADE 'Cidade', SX 'Sexo' FROM DADOS.GERAL, DADOS.SEXO WHERE GERAL.SEXO = SEXO.SEXO ORDER BY TPONTOS DES
%END; %ELSE %IF %UPCASE(&VAR) = ISENTO %THEN %DO;
PROC SQL; SELECT INSCRICAO 'Inscrição', TPONTOS 'Total de Pontos', CIDADE 'Cidade', SN 'Possui Isenção' FROM DADOS.GERAL, DADOS.ISENCAO; WHERE GERAL.SEXO = ISENCAO.ISENTO ORDER BY TPONTOS DES
%END; %ELSE %IF %UPCASE(&VAR) = CAMPUS %THEN %DO;
PROC SQL; SELECT INSCRICAO 'Inscrição', TPONTOS 'Total de Pontos', CIDADE 'Cidade', CC 'Campus' FROM DADOS.GERAL, DADOS.CAMPUS;
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 42
WHERE GERAL.SEXO = CAMPUS.CAMPUS ORDER BY TPONTOS DES
%END; %ELSE %IF %UPCASE(&VAR) = MAT %THEN %DO;
PROC SQL; SELECT INSCRICAO 'Inscrição', TPONTOS 'Total de Pontos', CIDADE 'Cidade', MATRICULADOS 'ESTÁ MATRICULADO' FROM DADOS.GERAL, DADOS.MATRICULADOS; WHERE GERAL.SEXO = MATRICULADOS.MAT ORDER BY TPONTOS DES
%END; %ELSE %DO; %PUT Variável Não Válida!; QUIT; %END; %MEND FORMAT; %FORMAT(SEXO);
OUTPUT PARCIAL
3.2.2 Utilizando mais de um parâmetro
CÓDIGO SQL
%MACRO AGRUP(LIB, TAB, GROUP); PROC SQL;
SELECT &GROUP, MAX(TPONTOS) 'Máximo', AVG(TPONTOS) 'Média', MIN(TPONTOS) 'Mínimo', COUNT(TPONTOS) 'Numero de Inscritos' FROM &LIB..&TAB GROUP BY &GROUP HAVING AVG(TPONTOS) GE 80;
QUIT; %MEND AGRUP; %AGRUP(DADOS,GERAL,SEXO);
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 43
OUTPUT
4. Utilizando Sub‐Funções CÓDIGO SQL ODS LISTING CLOSE; ODS OUTPUT SQL_Results = DADOS.SCARLOS; PROC SQL; SELECT INSCRICAO, TPONTOS, CC, NOME_CURSO FROM DADOS.GERAL, DADOS.CAMPUS, DADOS.CURSO WHERE GERAL.CAMPUS = CAMPUS.CAMPUS AND GERAL.OP1 = CURSO.OP1 AND GERAL.OP1 = 61; QUIT; ODS OUTPUT CLOSE; ODS LISTING; ODS LISTING CLOSE; ODS OUTPUT SQL_Results = DADOS.SOROCABA; PROC SQL; SELECT INSCRICAO, TPONTOS, CC, NOME_CURSO FROM DADOS.GERAL, DADOS.CAMPUS, DADOS.CURSO WHERE GERAL.CAMPUS = CAMPUS.CAMPUS AND GERAL.OP1 = CURSO.OP1 AND GERAL.OP1 = 63; QUIT; ODS OUTPUT CLOSE;
ODS LISTING; OUTPUT PARCIAL – SCARLOS
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 44
OUTPUT ‐ SOROCABA
CÓDIGO SQL
PROC SQL; SELECT * FROM DADOS.SCARLOS WHERE TPONTOS >
(SELECT AVG(TPONTOS) FROM DADOS.SOROCABA) ORDER BY TPONTOS ASC;
QUIT;
OUTPUT PARCIAL ‐ SOROCABA
4.1 Utilizando as funções ANY e ALL em Sub‐Querys Através da função ANY, podemos selecionar valores que satisfaçam qualquer uma das
restrições fixadas pelo programador. Na tabela abaixo, pode‐se visualizar isto com maior
clareza.
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 45
CÓDIGO SQL
PROC SQL; SELECT INSCRICAO, NOME_CURSO, CC, TPONTOS FROM DADOS.GERAL, DADOS.CAMPUS, DADOS.CURSO WHERE GERAL.OP1 = CURSO.OP1 AND GERAL.CAMPUS = CAMPUS.CAMPUS AND GERAL.OP1 EQ 61 AND TPONTOS > ANY (SELECT AVG(TPONTOS) FROM DADOS.GERAL WHERE OP1 BETWEEN 62 AND 64 GROUP BY OP1) ORDER BY TPONTOS ASC;
QUIT; OUTPUT PARCIAL
De forma similar, podemos utilizar a função ALL para obter resultados parecidos. Na
tabela abaixo, pode‐se observar qual o retorno encontrado ao aplicar a função.
CÓDIGO SQL
PROC SQL; SELECT INSCRICAO, NOME_CURSO, CC, TPONTOS FROM DADOS.GERAL, DADOS.CAMPUS, DADOS.CURSO
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 46
WHERE GERAL.OP1 = CURSO.OP1 AND GERAL.CAMPUS = CAMPUS.CAMPUS AND GERAL.OP1 EQ 61 AND TPONTOS > ALL (SELECT AVG(TPONTOS) FROM DADOS.GERAL WHERE OP1 BETWEEN 62 AND 64 GROUP BY OP1) ORDER BY TPONTOS ASC;
QUIT; OUTPUT PARCIAL
Referências Bibliográficas: Lafler, K. P. (2004) – PROC SQL: Beyond the Basics Using SAS, SAS Institute Inc. Prairie, K. ( 2005) – The Essential PROC SQL Handbook for SAS Users, SAS Institute Inc.