Académique Documents
Professionnel Documents
Culture Documents
CENTRO DE CIÊNCIAS EXATAS E DE TECNOLOGIA
DEPARTAMENTO DE ESTATÍSTICA
INTRODUÇÃO AO SASSQL
FELIPE MARANGONI
PEDRO FERREIRA FILHO
JANEIRO 2010
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 1
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 2
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 3
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 4
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 5
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 6
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 7
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 8
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 9
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 10
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 11
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 12
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 13
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 14
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 15
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 16
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 17
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 18
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 19
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 20
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 21
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 22
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 23
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 24
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 25
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 26
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 27
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 28
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 29
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 30
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 31
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 32
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 33
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 34
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 35
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 36
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 37
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 38
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 39
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 40
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 41
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 42
OUTPUT
4. Utilizando Sub‐Funções
CÓDIGO SQL
OUTPUT PARCIAL – SCARLOS
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 43
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 44
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 45
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.
Introdução ao SAS‐SQL – Felipe Marangoni & Pedro Ferreira Filho ‐ Janeiro 2010 Página 46