DevMedia
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Este é um post disponível para assinantes MVP
Este post também está disponível para assinantes da SQL Magazine DIGITAL
ou para quem possui Créditos DevMedia.

Clique aqui para saber como acessar este post

1) Torne-se um assinante MVP e por apenas R$ 69,90 por mês você terá acesso completo a todos os posts. Assinar MVP

2) Adquira Créditos: comprando R$ 180,00 em créditos esse post custará R$ 1,20. Comprar Créditos

post favorito     comentários
SQL Magazine 94 - Índice

Usando SQL para geração de relatórios (Recursos Básicos) - Revista SQL Magazine 94

Este artigo é parte de uma série e neste texto apresento recursos básicos, como uso de funções escalares, agrupamentos de dados, cláusulas SQL disponíveis e alguns operadores úteis. O estudo destes itens irá auxiliar o leitor iniciante em SQL a criar consultas e relatórios básicos.

[fechar]

Você não gostou da qualidade deste conteúdo?

(opcional) Você poderia comentar o que não lhe agradou?

Confirmo meu voto negativo

É consenso entre os especialistas que SQL não é a melhor linguagem para criação de consultas complexas, já que sua função principal é a recuperação e gerenciamento de dados. Apesar de estas serem uma verdade inegável, é muito comum nos depararmos com situações em que ele, o SQL, é a única ferramenta que temos à mão para criação de um relatório. Isso ocorre muitas vezes por questão de custos, já que nem sempre é economicamente viável optar pela compra de uma solução especializada. Este cenário é muito comum no dia-a-dia das empresas e, no fim das contas, somos forçados a usá-lo.

Por esta razão, eu considero importante que todo profissional de banco de dados conheça os principais recursos do SQL para atender as solicitações dos seus usuários. Neste sentido, é importante termos em mente uma definição básica ao se trabalhar com consultas SQL que é a definição de expressão SQL. A definição que temos para o termo expressão é bastante simples: uma expressão retorna um valor. Os tipos utilizados em uma expressão variam bastante, cobrindo diferentes tipos de dados como string, numeric e boolean. Na verdade, quase tudo que inserirmos depois do SELECT ou FROM em um comando SQL pode ser considerado uma expressão. Caso você queria encontrar um item ou grupo de itens em particular em seu banco de dados, você precisará fazer uso de uma ou mais condições em suas queries. Podemos definir condições em consultas SQL utilizando a cláusula where.

Esta é a primeira parte de uma série de artigos. Neste texto, apresento recursos básicos da linguagem SQL, como principais cláusulas, funções e alguns operadores. Operadores são os elementos que você utiliza dentro de expressões para definir como você quer restringir os dados retornados por uma busca. De uma forma geral, os operadores são divididos em seis grupos: aritméticos, comparação, caractere, lógico, conjunto e outros (ler Nota DevMan 2).

 O objetivo é que o leitor menos experiente aprenda aqui os conceitos básicos para que possa acompanhar os recursos mais sofisticados que serão apresentados nos próximos artigos, como a cláusula OVER e recursos programáveis, por exemplo.

Originalmente esta palestra tratava de recursos oferecidos pelo DB2, um sistema gerenciador de bancos de dados (SGBD) que é um dos grandes líderes do mercado mundial. Porém iremos priorizar nestes artigos os recursos SQL e as sintaxes que sejam padrão ANSI SQL, ou seja, que estão ou deveriam estar disponíveis em qualquer SGBD.

Tópicos discutidos neste artigo

Para começar esta série, vamos falar do uso dos seguintes recursos SQL:

·         ordenando dados;

·         usando funções escalares;

·         juntando tabelas;

·         usando funções de agregação;

·         usando cláusulas de agregação;

·         usando operador ROLLUP;

·         usando operador CUBE;

·         usando função GROUPING.

Base de dados e considerações

Para situarmos os recursos SQL que vamos estudar, é preciso ter uma base de dados como amostra. Usaremos nestes artigos uma base com dados fictícios de demanda de produtos farmacêuticos. A Figura 1 mostra o modelo desta base.

 

Assumiremos nestes artigos que o leitor já está familiarizado com declarações do tipo SELECT, conhecendo sua sintaxe básica. Feito este comentário, vamos começar o estudo.

Ordenando dados

É possível que a ordenação seja o recurso mais básico para manipulação dos dados selecionados. E como aprendemos nas primeiras aulas de SQL, isso é feito usando-se a cláusula ORDER BY.

Importante observar no plano de execução de uma consulta que a última cláusula a ser executada numa declaração de seleção de dados é exatamente o ORDER BY. Depois de definida a “listagem” que resulta da declaração SQL é feita finalmente a ordenação dos dados.

A cláusula ORDER BY oferece várias opções, como solicitar a ordenação pelo nome das colunas, ou pelo número das colunas na listagem final. Veja por exemplo, na Listagem 1,  uma declaração SELECT para retornar a lista de cidades em ordem alfabética.

 

Listagem 1. Consulta para retornar as cidades em ordem alfabética.

SELECT C.Cidade

  FROM tblCidade C

  WHERE C.fkEstado = 1

  ORDER BY C.Cidade;

--Ou

SELECT C.Cidade

  FROM tblCidade C

  WHERE C.fkEstado = 1

  ORDER BY 1;

 

Por padrão, a ordenação é sempre feita de forma ascendente. Caso se deseje a ordenação inversa, basta acrescentar o operador DESC (descendente) após a definição da(s) coluna(s) de ordenação, como mostra a Listagem 2.

 

Listagem 2. Consulta para retornar as cidades em ordem alfabética descendente.

SELECT C.Cidade

  FROM tblCidade C

  WHERE C.fkEstado = 1

  ORDER BY 1 DESC;

 

Alguns SGBDs, como DB2 e SQL SERVER, oferecem recursos para seleção das N primeiras ou N últimas linhas de uma listagem. No caso do DB2, este recurso faz parte da cláusula ORDER BY, acrescentando a expressão FETCH FIRST N ROWS ONLY. No SQL SERVER, a operação correspondente é o SELECT TOP; e o ORACLE usa uma função que falaremos na próxima seção. A Listagem 3 mostra um exemplo para retornar as 10 últimas linhas da listagem.

 

Listagem 3. Consulta para retornar as 10 primeiras linhas de uma listagem.

SELECT C.Cidade

  FROM tblCidade C

  WHERE C.fkEstado = 1

  ORDER BY 1 DESC

  FETCH FIRST 10 ROWS ONLY;

 

Como vimos nestes exemplos, a cláusula ORDER BY oferece recursos bem simples, mas que podem ser combinados, aumentando muito seu poder.

Usando funções escalares

As funções escalares fazem parte do padrão SQL e elas ajudam o desenvolvedor a manipular dados e gerar novas informações, aumentando em muito o poder da linguagem SQL.

Chamamos de funções escalares aquelas que retornam um valor simples como resultado (um “escalar”, como se diz em matemática): um número, uma cadeia de caracteres, etc. E existem várias categorias de funções escalares, tais como alfanuméricas, matemáticas, de tratamento de data/hora, de sistema.

Teoricamente, as funções podem ser usadas em quaisquer cláusulas (SELECT, FROM, WHERE, GROUP BY, HAVING e/ou ORDER BY) e em quaisquer declarações SQL (SELECT, INSERT, UPDATE e DELETE).

Um exemplo de declaração SQL usando várias funções escalares é apresentado na Listagem 4. A sintaxe da declaração usa estrutura do DB2, mas as funções FLOOR, CEILING, DAY e CASE (destacadas em azul) são padrão ANSI SQL.

 

Listagem 4. Consulta SQL usando funções escalares.

SELECT FLOOR(3.4) AS FLO,  CEILING(3.4) AS CEIL,

       DAY(‘2011/09/28’) AS CUR_DAY,

       CASE WHEN DAY(‘2011/09/28’) = 30

         THEN ‘YES’

         ELSE ‘NO’

       END AS IS_PAYDAY

  FROM SYSIBM.SYSDUMMY1;

 

Como se pode deduzir, FLOOR retorna a parte inteira do argumento da função, CEILING retorna o menor valor inteiro que seja maior que o argumento, DAY retorna o dia do mês e a função CASE faz um teste lógico e retorna um valor condicional. Veja, na Tabela 1, o resultado retornado por esta declaração.

 

FLO

CEIL

CUR_DAY

IS_PAYDAY

3

4

28

NO

Tabela 1: Resultado da consulta da Listagem 4.

 

O exemplo da Listagem 4 é meramente ilustrativo. Naturalmente podemos usar campos como argumentos das funções escalares e é nesta situação que as funções são realmente úteis. O exemplo da Listagem 5 usa a tabela de cidades, listando apenas as cidades cujo nome começa com a letra “J”.

 

Listagem 5. Consulta SQL buscando as cidades cujo nome comece com “J”.

SELECT C.Cidade

  FROM tblCidade C

  WHERE LEFT(C.Cidade, 1) = 'J'

 

Esta consulta retorna uma listagem com mais de 20 registros, com a aparência da Tabela 2.

 

CIDADE

Jacareí (SP)

Jales (SP)

Jaú (SP)

José Bonifácio (SP)

Jundiaí (SP)

Juquiá (SP)

……

Tabela 2: Resultado da consulta da Listagem 5.

 

Como havia comentado na seção anterior, o ORACLE usa uma função escalar para informar a posição de cada registro dentro de uma listagem. Esta é a função ROWNUM. Apesar da semelhança com a função analítica ROW_NUMBER(), que está disponível em diversos SGBDs, tratam-se de funções que se destinam a operações diferentes e usam sintaxes também distintas. Voltarei a falar de funções analíticas em um próximo artigo desta série. Por hora, apresentaremos na Listagem 6 como usar a função ROWNUM do ORACLE.

 

Listagem 6. Consulta para retornar as 10 primeiras linhas de uma listagem.

SELECT C.Cidade

  FROM tblCidade C

  WHERE C.fkEstado = 1 AND ROWNUM <=10

  ORDER BY 1 DESC;

Juntando tabelas

A junção de tabelas é um recurso praticamente obrigatório na linguagem SQL, uma vez que a normalização de um modelo relacional causa a separação dos dados em várias tabelas. Portanto, vamos sempre precisar juntar tabelas quando criarmos um relatório.

Uma junção SQL sempre lida com um par de tabelas. Existem vários operadores de junção, cada um com uma finalidade: INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN, etc. Normalmente usamos o INNER JOIN, que a grosso modo retorna a “intersecção” das tabelas, ou seja, apenas registros que tem correspondência nas duas tabelas serão utilizados (mais detalhes sobre junções na seção “Referências”). Veja no diagrama de Venn abaixo (Figura 2) a representação do INNER JOIN, em que a área vermelha representa os registros retornados da junção de duas tabelas.

Figura 2: Diagrama de Venn para o operador INNER JOIN

 

Vamos a um exemplo. Imagine que precisamos saber qual foi a demanda por cidade durante o ano de 2006. A Figura 1 nos mostra que precisaremos usar a tabela que informa a demanda (tblDemanda), a tabela que informa as cidades (tblCidade) e mais uma tabela intermediária que faz a ponte entre os dados de demanda e os de cidades. Isso ocorre porque a demanda não é registrada por cidade e sim por brick, que é a representação de uma região geográfica menor do que as cidades. Então é necessário usar a tabela intermediária tblBrick. A Figura 3 mostra este detalhe.

 

Figura 3: Detalhe do modelo destacando as tabelas usadas na junção

 

Portanto, quando construirmos a sentença SQL, deveremos fazer a junção das tabelas tblDemanda e tblBrick para depois fazermos a junção de tblBrick e tblCidade. Esta lógica é sempre usada para junção de tabelas. Além disso, devemos considerar também a restrição de recuperar apenas a demanda ocorrida no ano de 2006. Isso tudo resulta na declaração apresentada na Listagem 7.

 

Listagem 7. Consulta SQL para retornar a demanda por cidade em 2006.

SELECT C.Cidade, T.Data, T.ValorReal

  FROM tblDemanda T

INNER JOIN tblBrick B

  ON T.fkBrick = B.pkBrick

INNER JOIN tblCidade C

  ON B.fkCidade = C.pkCidade

  WHERE T.Data BETWEEN '2006-01-01' AND '2006-03-31'

 

Esta consulta retorna uma listagem com mais de 500 registros, como mostra a Tabela 3.

 

CIDADE

DATA

VALORREAL

Adamantina (SP)

2006-01-21.0

1.0

"

A exibição deste artigo foi interrompida

Este post está disponível para assinantes MVP.



É DBA de SQL Server & DB2. Profissional certificado IBM IT Specialist Level 2 - Expert, publica o blog wCrivelini e o podcast Databasecast. Autor convidado de diversas comunidades técnicas no Brasil e no exterior, como SQL Server [...]

O que você achou deste post?
Publicidade
Serviços

Mais posts