Artigo SQL Magazine 1 - Guia rápido da SQL

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
Confirmar voto
0
 (7)  (0)

Neste artigo veremos os principais parâmetros do comando SELECT, a principal forma de recuperar dados através da SQL.

Esse artigo faz parte da revista SQL Magazine edição 01. Clique aqui para ler todos os artigos desta edição

Guia rápido da SQL

 

Alinguagem SQL é sucinta e ao mesmo tempo poderosa. Através de um idioma de fácil entendimento, a SQL permitiu a padronização na forma de comunicar os aplicativos front-ends com os diversos bancos de dados disponíveis. Neste artigo veremos os principais parâmetros do comando SELECT, a principal forma de recuperar dados através da SQL.

 

COMANDO SELECT

A SQL foi criada com o objetivo de padronizar os comandos de manipulação de dados em SGBD’s. Hoje em dia, apesar da linguagem possuir uma quantidade considerável de extensões e implementações proprietárias, pode-se afirmar que a meta foi alcançada. A maior parte do código SQL escrito nas aplicações se encontra no formato “puro”, conhecido como ANSI. O sucesso da SQL trouxe uma produtividade interessante para a manipulação de banco de dados. Conhecendo bem a linguagem é possível acessar os recursos básicos de qualquer banco relacional, como Oracle, SQL Server ou MySQL, sem praticamente nenhuma mudança.

Veremos neste artigo um pequeno guia de referência para os parâmetros do comando SELECT, um dos mais importantes da linguagem SQL.

 

 

SELECT SIMPLES

O comando SELECT permite recuperar os dados de um objeto do banco, como uma tabela, uma view e, em alguns casos, uma stored procedure (alguns bancos de dados permitem a criação de procedimentos que retornam valor). A sintaxe mais básica do comando é:

 

   SELECT

FROM

 

Exemplo:

 

SELECT CODIGO, NOME FROM CLIENTES;

SELECT * FROM CLIENTES;

 

O caracter “*” representa todos os campos. Apesar de prática, esta máscara não é muito utilizada, pois, para o SGBD, é mais rápido receber o comando com todos os campos explicitados. O uso do * obriga o servidor a consultar quais são os campos antes de efetuar a busca dos dados, criando mais um “passo” no processo.

 

 

COMANDO WHERE

A cláusula Where permite ao comando SQL passar condições de filtragem, Veja o exemplo:

 

SELECT CODIGO, NOME FROM CLIENTES

WHERE CODIGO = 10;

 

SELECT CODIGO, NOME FROM CLIENTES

WHERE UF = ‘RJ’

        

SELECT CODIGO, NOME FROM CLIENTES

WHERE CODIGO >= 100 AND CODIGO <=500;

 

SELECT CODIGO, NOME FROM CLIENTES

WHERE UF=’MG’ OR UF = ‘SP’

 

Os parênteses, corretamente utilizados, dão mais poder a consulta:

 

SELECT CODIGO, NOME FROM CLIENTES

WHERE UF = ‘RJ’  OR  (UF=’SP’ AND ATIVO=’N’);

 

Neste comando, todos os clientes do Rio de Janeiro e apenas os clientes inativos de São Paulo seriam capturados.

 

SELECT CODIGO, NOME FROM CLIENTES

WHERE (ENDERECO IS NULL) OR (CIDADE IS NULL)

 

Aqui todos os clientes que não possuem endereco ou cidade cadastrados serão selecionados.

 

FILTRO DE TEXTO

 

SELECT CODIGO, NOME FROM FUNCIONARIO

WHERE DEPARTAMENTO=’VENDAS’;

 

SELECT CODIGO FROM CLIENTES

WHERE NOME > “K”;

 

Para busca parcial de strings, o SELECT fornece o operador LIKE:

 

SELECT CODIGO, NOME FROM CLIENTES

WHERE NOME LIKE “MARIA*”;

 

Neste comando, todos os clientes cujo nome iniciam com Maria serão retornados. Se quisermos retornar os nomes que contenham “MARIA”  também no meio, podemos alterar para:

 

SELECT CODIGO, NOME FROM CLIENTES

WHERE NOME LIKE “*MARIA*”

 

O uso da máscara no início e no fim da string fornece maior poder de busca, mas causa considerável perda de performance. Este recurso deve ser utilizado com critério.

Nota: Em alguns bancos de dados a máscara de fitro não é representada pelo caracter “*”. Consulte a referência do banco utilizado para verificar o caracter correto.

Por padrão, a SQL diferencia caixa baixa de caixa alta. Para eliminar essa diferença, utilize a função UPPER:

 

SELECT CODIGO, NOME FROM CLIENTES

WHERE  UPPER(NOME) LIKE “MARIA*SILVA*”

 

ORDENAÇÃO

A ordenação pode ser definida com o comando ORDER BY. Assim como no comando WHERE, o campo de ordenação não precisa estar listado como campo de visualização:

 

SELECT CODIGO, NOME FROM CLIENTES

ORDER BY NOME

 

SELECT CODIGO, NOME FROM CLIENTES

ORDER BY UF, NOME

 

A inclusão da palavra DESC garante a ordenação invertida:

 

SELECT CODIGO, NOME FROM CLIENTES

ORDER BY NOME DESC

 

SELECT CODIGO, NOME FROM CLIENTES

ORDER BY UF DESC, NOME

 

JUNÇÃO DE TABELAS

O SELECT permite juntar duas ou mais tabelas no mesmo resultado. Isso pode ser feito de várias formas:

 

SELECT CLIENTES.CODIGO, CLIENTES.NOME, PEDIDOS.DATA, PEDIDOS.VALOR

FROM CLIENTES, PEDIDOS

WHERE CLIENTES.CODIGO = PEDIDOS.CODCLIENTE

 

Nesta linha as tabelas relacionadas CLIENTES e PEDIDOS são unificada através do campo chave, em uma operação de igualdade. Repare que o nome dos campos passam a ser prefixados pelo nome das tabelas, resolvendo duplicidades. Uma versão resumida desta comando pode ser:

 

SELECT A.CODIGO, A.NOME, B.DATA, B.VALOR 

FROM CLIENTES A, PEDIDOS B

WHERE A.CODIGO = B.CODCLIENTE 

 

O uso de aliases no código SQL torna a manutenção mais simples.

No comando abaixo temos várias tabelas unificadas em uma mesma cláusula:

 

SELECT A.CODIGO, A.NOME, B.DATA, B.VALOR, C.QTD, D.DESCRICAO

FROM CLIENTES A, PEDIDOS B, ITENS C, PRODUTOS D

WHERE

   A.CODIGO = B.CODCLIENTE AND

   B.CODIGO = C.CODPEDIDO AND

   C.CODPRODUTO = D.CODIGO

 

Neste comando unificamos as tabelas relacionadas CLIENTES, PEDIDOS, ITENS e PRODUTOS. Veja mais alguns exemplos:

 

SELECT A.CODIGO, A.NOME, B.DATA, B.VALOR 

FROM CLIENTES A, PEDIDOS B

WHERE A.CODIGO = B.CODCLIENTE

AND A.UF= ‘RJ’

 

SELECT A.CODIGO, A.NOME, B.DATA, B.VALOR 

FROM CLIENTES A, PEDIDOS B

WHERE A.CODIGO = B.CODCLIENTE

AND UF = ‘RJ’  OR  (UF=’SP’ AND ATIVO=’N’);

 

SELECT A.CODIGO, A.NOME, B.DATA, B.VALOR 

FROM CLIENTES A, PEDIDOS B

WHERE A.CODIGO = B.CODCLIENTE  

ORDER BY A.UF, A.NOME

 

Observe que a junção através da igualdade de campos traz como resultado somente os registros que possuem referência nas duas tabelas. Observe o comando abaixo:

 

SELECT A.CODIGO, A.DESCRICAO, B.DESCRICAO

FROM PRODUTOS A , COMPONENTES B

WHERE A.CODIGO = B.CODPRODUTO

 

Os produtos que não possuem componentes não são selecionados. Caso seja necessário criar uma listagem incluindo também os registros que não possuem correspondência, deve-se utilizar o comando JOIN.

 

COMANDO JOIN

A junção de tabelas no comando SELECT também pode ser feita com o comando JOIN. Este comando deve ser utilizado com a palavra reservada INNER ou com a palavra OUTER:

INNER         - Semelhante ao uso do operador “=” na junção de tabelas. Aqui, os registros sem correspondências não são incluídos. Esta cláusula é opcional e pode ser omitida no comando JOIN.

OUTER – Os registros que não se relacionam também são exibidos. Neste caso, é possível definir qual tabela será incluída na seleção, mesmo não tendo correspondência.    

Para exemplificar, temos as tabelas abaixo:

 

PRODUTOS

CODIGO

DESCRICAO

CATEGORIA

1

MARTELO

1

2

CHAVE DE FENDA

1

3

CHAVE DE FENDA ELETRICA

2

4

DESMAGNETIZADOR

2

5

PARAFUSO

 

 

COMPONENTES

CODIGO

CODPRODUTO

DESCRICAO

QTD

1

3

ADAPTADOR CF

1

2

4

CABO MOD A1

2

2

4

CABO MOD B2

1

 

CATEGORIA

CODIGO

DESCRICAO

1

FERRAMENTA A1

2

FERRAMENTA B1

3

FERRAMENTA C1

4

FERRAMENTA D1

 

Observe os exemplos e o resultado produzido:

 

SELECT A.CODIGO, A.DESCRICAO, B.DESCRICAO, B.QTD

FROM PRODUTOS A

INNER JOIN COMPONENTES B

ON (A.CODIGO = B.CODPRODUTO)

 

Resultado:

CODIGO

DESCRICAO

DESCRICAO

QTD

3

CHAVE DE FENDA ELETRICA

ADAPTADOR CF

1

4

DESMAGNETIZADOR

CABO MOD A1

2

4

DESMAGNETIZADOR

CABO MOD B2

1

 

 

Este comando pode ser escrito na versão resumida abaixo:

 

SELECT A.CODIGO, A.DESCRICAO, B.DESCRICAO

FROM PRODUTOS A

JOIN COMPONENTES B

ON (A.CODIGO = B.CODPRODUTO)

 

Como mostrado no resultado, os produtos que não possuem componentes não são incluídos na seleção.

 

SELECT A.CODIGO, A.DESCRICAO, B.DESCRICAO , B.QTD

FROM PRODUTOS A

LEFT OUTER  JOIN COMPONENTES B

ON (A.CODIGO = B.CODPRODUTO)

 

Resultado:

CODIGO

DESCRICAO

DESCRICAO

QTD

1

MARTELO

 

 

2

CHAVE DE FENDA

 

 

3

CHAVE DE FENDA ELETRICA

ADAPTADOR CF

1

4

DESMAGNETIZADOR

CABO MOD A1

2

4

DESMAGNETIZADOR

CABO MOD B2

1

5

PARAFUSO

 

 

 

Neste comando todos os produtos serão incluídos na seleção, independente de possuirem um componente. Observe que a palavra LEFT se refere a primeira tabela no relacionamento. O mesmo comando poderia ser descrito na forma:

 

SELECT A.CODIGO, A.DESCRICAO, B.DESCRICAO

FROM COMPONENTES A

RIGHT OUTER JOIN PRODUTOS B

ON ( A.CODIGO = B.CODPRODUTO )

 

A ordem das tabelas foi invertida, mas o resultado é o mesmo. Observe mais alguns exemplos:

 

SELECT A.CODIGO, A.DESCRICAO, B.DESCRICAO , B.QTD

FROM PRODUTOS A

JOIN COMPONENTES B

ON ( A.CODIGO = B.CODPRODUTO )

WHERE A.CATEGORIA=1

 

Resultado:

CODIGO

DESCRICAO

DESCRICAO

QTD

 

SELECT A.CODIGO, A.DESCRICAO, B.DESCRICAO

FROM PRODUTOS A

JOIN COMPONENTES B

ON (A.CODIGO = B.CODPRODUTO )

WHERE A.CATEGORIA=1 OR A.CATEGORIA=2

ORDER BY A.CATEGORIA, A.DESCRICAO

 

Resultado:

CODIGO

DESCRICAO

DESCRICAO

QTD

3

CHAVE DE FENDA ELETRICA

ADAPTADOR CF

1

4

DESMAGNETIZADOR

CABO MOD A1

2

4

DESMAGNETIZADOR

CABO MOD B2

1

 

FULL OUTER JOIN

Podemos ainda combinar o uso de INNER e OUTER através do comando FULL OUTER JOIN. Neste caso, todos os registros das duas tabelas envolvidas serão exibidos, tendo ou não relacionamento. Observe:

 

SELECT A.CODIGO, A.DESCRICAO, B.DESCRICAO

FROM PRODUTOS A

FULL OUTER JOIN CATEGORIA B

ON ( A.CATEGORIA = B.CODIGO )

ORDER BY A.DESCRICAO

 

CODIGO

DESCRICAO

CATEGORIA

1

MARTELO

FERRAMENTA A1

2

CHAVE DE FENDA

FERRAMENTA A1

3

CHAVE DE FENDA ELETRICA

FERRAMENTA B1

4

DESMAGNETIZADOR

FERRAMENTA B1

5

PARAFUSO

 

 

 

FERRAMENTA C1

 

 

FERRAMENTA D1

 

 

UNION

Existe ainda uma Segunda forma de juntar tabelas com o comando SELECT. Através do parâmetro UNION, é possível “colar” o conteúdo de duas tabelas. Veja o exemplo:

 

SELECT CODIGO, NOME FROM CLIENTES

UNION

SELECT CODIGO, NOME FROM FUNCIONARIOS

 

O resultado deste comando é a listagem de todos os clientes e a listagem dos funcionários, dentro do mesmo result set. Repare que no comando JOIN a união é horizontal e no UNION a união é vertical.

Por default, os registros duplicados são eliminados na cláusula UNION. No exemplo anterior, se tivéssemos um cliente com mesmo nome e código de um funcionário, apenas o registro da primeira tabela seria exibido. Para incluir todos os registros, independente de duplicidade, utilize a palavra ALL:

 

SELECT CODIGO, NOME FROM CLIENTES

UNION ALL

SELECT CODIGO, NOME FROM FUNCIONARIOS

 

FUNÇÕES DE AGRUPAMENTO

São cinco as funções básicas de agrupamento:

AVG: Retorna a média do campo especificado:

 

SELECT AVG(VALOR) FROM PEDIDOS;

 

MIN/MAX/SUM: Respectivamente, retorna o menor valor, o maior e o somatório de um grupo de registros:

 

SELECT MIN(VALOR) FROM PEDIDOS;

 

SELECT MAX(VALOR) FROM PEDIDOS;

 

SELECT AVG(VALOR) FROM PEDIDOS;

 

COUNT: Retorna a quantidade de itens da seleção:

 

SELECT COUNT(CODIGO) FROM CLIENTES;

 

AGRUPAMENTO

Um poderoso recurso do comando SELECT é o parâmetro GROUP BY. Através dele podemos retornar informações agrupadas de um conjunto de registros, estabelecendo uma condição de agrupamento. É um recurso muito utilizado na confecção de relatórios. Para exemplificar, temos as tabelas CLIENTES e PEDIDOS:

 

CLIENTES

CODIGO

NOME

1

Gustavo Viegas

2

Vinicius Andrade

3

Rosangela Mattos

 

PEDIDOS

CODIGO

CODCLIENTE

DATA

VALOR

1

1

01/10/2002

500

2

1

02/10/2002

100

3

2

01/10/2002

600

4

3

05/10/2002

100

5

3

10/10/2002

300

6

3

11/10/2002

80

 

SELECT CODCLIENTE, MAX(VALOR)

FROM PEDIDOS

GROUP BY CODCLIENTE

 

O comando acima retorna o maior valor de pedido de cada cliente. Observe o resultado:

 

CODCLIENTE

MAX(VALOR)

1

500

2

600

3

300

 

SELECT CODCLIENTE, COUNT(*)

FROM PEDIDOS

GROUP BY CODCLIENTE

 

Aqui vemos quantos pedidos foram feitos por cada cliente. Veja o resultado:

 

CODCLIENTE

COUNT(*)

1

2

2

1

3

3

 

HAVING

Através do comando HAVING podemos filtrar a cláusula GROUP BY. Observe o comando abaixo:

 

SELECT CODCLIENTE, COUNT(*)

FROM PEDIDOS

GROUP BY CODCLIENTE

HAVING COUNT(*) >= 2

 

Resultado:

CODCLIENTE

COUNT(*)

1

2

3

3

 

Somente os clientes com 2 ou mais pedidos serão selecionados. Repare que o HAVING é utilizado, geralmente, com alguma função de agrupamento. Para filtros normais, pode-se utilizar o comando WHERE. Observe o exemplo abaixo:

 

SELECT CODCLIENTE, COUNT(*)

FROM PEDIDOS

WHERE DATA > ‘06/10/2002’

GROUP BY CODCLIENTE

HAVING COUNT(*) >= 2

 

CODCLIENTE

COUNT(*)

3

2

 

Repare que o cliente número 3 apresentou apenas dois pedidos, visto que o primeiro não possui data maior que 6/10.

 

NOTA:

A formatação no uso de campos do tipo DATE pode sofrer alterações de acordo com o banco utilizado. Consulte o manual de referência do mesmo para maiores detalhes.

 

Conclusão

O uso correto do comando SELECT fornece uma poderosa interface de filtro. Utilizando sempre a sintaxe padrão, o desenvolvedor conta com maior independência de plataforma, pois o SQL ANSI é compreendido pelos principais bancos de dados. Existem ainda funções especiais e funções de conversão, que serão abordados em futuras edições da SQL Magazine. Para maior eficiência no uso do SELECT, é desejável também o bom planejamentos dos índices do banco. Para maiores informações a respeito do uso de índices, leia a matéria de Everson Ramos, publicada nesta edição. Espero que este artigo introdutório sirva de consulta em seus projetos!

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?