Como comparar a quantidade de numeros de cpf no sql

Neste artigo voc� ter� a oportunidade de aprender a usar a linguagem SQL para execuç�o de consultas e subconsultas. Ser�o apresentados os conceitos necess�rios para a realizaç�o de consultas atrav�s de um encadeamento especialmente preparado para tornar interessante o seu aprendizado.

Os Sistemas Gerenciadores de Bancos de Dados Relacionais (SGBDr) s�o o principal mecanismo de suporte ao armazenamento de dados e recuperaç�o de informaç�es utilizadas em diversas aplicaç�es. Em um SGBD, os dados do banco de dados s�o mantidos em tabelas, o que torna imprescind�vel o conhecimento dessa estrutura.

Anatomia de uma tabela

A tabela � uma estrutura matricial composta por linhas e colunas. Na pr�tica, cada linha representa um objeto do neg�cio e cada coluna representa uma caracter�stica dele. Por exemplo, a Tabela 1 (CLIENTE) representa um cadastro de clientes. Cada cliente possui c�digo, nome, sexo, CPF, data de nascimento e sal�rio.

#CODIGO NOME SEXO CPF NASCIMENTO SALARIO
1 Alcides Masculino 111222333-44 1/12/1975 R$ 7.000,00
2 Cristiano Masculino 222333444-55 12/3/1970 R$ 7.000,00
3 Cristiane Feminino 333444555-66 20/7/1977 R$ 1.500,00
4 Marcos Masculino 1111234333-44 19/8/1989 R$ 3.500,00
5 Joice Feminino 222444555-66 20/7/2001 R$ 2.500,00

Tabela 1. Cliente

As linhas de uma tabela s�o conhecidas por registros ou tuplas. J� as colunas, por campos ou atributos. No desenho, a primeira linha representa os nomes das colunas.

Dica SQL. Em express�es SQL, � poss�vel referenciar o conte�do de qualquer coluna atrav�s da convenç�o NomeTabela.NomeColuna. Por exemplo, para referenciar o campo CPF da tabela CLIENTE, pode-se usar CLIENTE.CPF. A maioria dos SGBDs permite que o usu�rio omita o nome da tabela, exigindo apenas a sintaxe completa no caso da exist�ncia de colunas com mesmo nome.

Na pr�tica, a construç�o de um banco de dados envolve a criaç�o de diversas tabelas relacionadas. O relacionamento entre tabelas ocorre atrav�s do uso de um mecanismo denominado chave estrangeira. Para maiores detalhes sobre relacionamentos entre tabelas.

Entendendo relacionamentos entre tabelas

Relacionamentos entre tabelas ajudam a manter �ntegros os dados do banco de dados. Para aprender sobre o mecanismo de relacionamento, � interessante estudar as definiç�es de chave prim�ria e de chave estrangeira:

  • A chave prim�ria serve para identificar de forma �nica cada linha de uma tabela. Para isso, � utilizada uma coluna ou uma combinaç�o de colunas da pr�pria tabela. Quando uma chave prim�ria � escolhida, o pr�prio SGBD se encarrega de realizar as verificaç�es necess�rias para manter a integridade dos dados (a chave prim�ria n�o pode conter valor nulo). Por exemplo, no modelo composto pelas Tabelas 1 e 2, a chave prim�ria da tabela

    CLIENTE

    � o campo C�digo e a da tabela

    FONE

    � representada pelos campos C�digo, Fone e Tipo.
  • A chave estrangeira serve para realizar ligaç�es entre tabelas. Tais ligaç�es, ou relacionamentos, s�o essenciais para ajudar a manter �ntegros os dados do banco de dados. Por exemplo, na tabela

    FONE

    o campo C�digo representa a chave estrangeira. Na pr�tica, a tabela FONE depende da tabela

    CLIENTE

    . Sendo assim, para que determinado telefone seja cadastrado, � necess�rio que exista um cliente correspondente na tabela

    CLIENTE

    . Neste caso, um cliente pode n�o ter telefone (cliente Pedro) ou pode possuir v�rios (cliente Alcides, por exemplo).

#CODIGO #FONE #TIPO
1 34569789 residencial
1 99009988 celular
3 88223456 celular
4 23459899 residencial
2 87789009 celular

Tabela 2. Fone

A vantagem da linguagem SQL reside no fato dela ser declarativa, ou seja, todo o esforço de codificaç�o de nossa parte � resumido na escrita de solicitaç�es que s�o submetidas ao SGBD, n�o importando (pelo menos se n�o pensarmos em otimizaç�o de consultas) a forma que o mesmo utilizar� para recuperar as informaç�es.

Uma sintaxe para consultas

Estudada a composiç�o de uma tabela e ciente da import�ncia das chaves prim�ria e estrangeira na manutenç�o da integridade dos dados do banco de dados, � chegada a hora de conhecer os principais comandos utilizados para a realizaç�o de consultas. Para isso, observe o c�digo presente na Figura 1, camisa bastante utilizada por diversos leitores desta revista.

Como comparar a quantidade de numeros de cpf no sql
Figura 1. Sintaxe SQL para a execuç�o de consultas

A Figura 1 representa a sintaxe SQL utilizada pela maioria dos SGBD. Observe o significado de cada comando:

SELECT [DISTINCT | ALL] {*|table.*|[table].field1}

Esta linha serve para apresentar ao usu�rio as colunas (field) especificadas;

As colunas podem existir em alguma tabela, ou podem ser calculadas atrav�s do uso de alguma funç�o especial (AVG, SUM, COUNT, etc);

As linhas resultantes de uma consulta podem apresentar mesmo conte�do. Utiliza-se DISTINCT para remover linhas repetidas. Para que sejam apresentadas linhas iguais, utiliza-se opç�o ALL. Na pr�tica, esta opç�o � utilizada como padr�o na maioria dos SGBDs;

table.* indica a recuperaç�o de todas (*) as colunas de determinada tabela da consulta. Para recuperar apenas determinado atributo, substitui-se o * pelo nome da coluna [table].field1.

Nesta linha s�o declaradas as tabelas envolvidas na consulta;

Em consultas envolvendo v�rias tabelas, � necess�rio indicar os campos que fazem parte do relacionamento para que o SGBD possa recuperar corretamente as informaç�es.

� interessante notar que o nome de qualquer tabela pode ser virtualmente modificado, principalmente para facilitar a escrita das consultas.

Aqui s�o declarados os mecanismos (conjunto de condiç�es e filtros) necess�rios � obtenç�o da informaç�o;

� poss�vel compor diversos crit�rios de filtro, usando-se para esse fim uma combinaç�o de operadores l�gicos (AND, OR, NOT), subconsultas, operadores de pesquisa em cadeia de caracteres, funç�es de data, entre outros;

Em consultas envolvendo v�rias tabelas, pode-se estabelecer a condiç�o de ligaç�o entre elas.

[GROUP BY groupfieldlist]

Esta opç�o � utilizada para agrupar informaç�es em uma consulta;

Em groupfieldlist declara-se um conjunto de atributos os quais o SGBD considerar� um grupo;

Quando utilizado em conjunto com funç�es de agregaç�o (por exemplo, AVG e SUM), os resultados dessas funç�es s�o calculados para cada grupo declarado em groupfieldlist.

De maneira semelhante � WHERE, esta opç�o serve para realizar filtros na consulta;

Os filtros realizados por HAVING s�o executados ap�s a operaç�o de grupamento ter sido executada. Neste caso, � poss�vel utilizar funç�es de agregaç�o como crit�rios de filtro.

[ORDER BY field1 [ASC | DESC]

� utilizada para ordenar o resultado da consulta;

� poss�vel escolher, para cada coluna, o tipo de ordenaç�o (ascendente ou descendente);

A maioria dos SGBD utiliza como padr�o a ordenaç�o ascendente, neste caso tornando desnecess�ria a declaraç�o do crit�rio ASC.

Nesta parte, realizamos uma breve revis�o sobre conceitos do mundo relacional de dados, al�m da apresentaç�o de uma sintaxe SQL para recuperaç�o de informaç�o.

Praticando consultas

Para os exemplos, ser�o utilizadas as tabelas CLIENTE e FONE, apresentadas na primeira parte do tutorial.

SELECT * FROM CLIENTE

Exemplo 01. Listar todas as informaç�es da tabela CLIENTE

Coment�rio: neste caso, o * substitui a declaraç�o de todos os campos da tabela CLIENTE. Outra forma de realizar esta consulta �:

SELECT CLIENTE.* FROM CLIENTE

� poss�vel tamb�m escrever a consulta da seguinte forma, renomeando (virtualmente) a tabela CLIENTE:

SELECT C.* FROM CLIENTE C

Exemplo 02. Listar o nome e a data de nascimento de todos os clientes

SELECT nome, nascimento FROM CLIENTE

Aqui, bastou inserir na cl�usula SELECT os campos correspondentes � informaç�o pedida. Outra forma de realizar esta consulta �:

SELECT CLIENTE.nome, CLIENTE.nascimento FROM CLIENTE

Ou mesmo:

SELECT C.nome, C.nascimento FROM CLIENTE C

Exemplo 03. Listar o nome e o CPF dos clientes do sexo masculino

SELECT nome, cpf FROM CLIENTE WHERE sexo=�masculino�

Neste caso, utilizou-se o filtro sexo=�masculino� para retornar apenas os indiv�duos do sexo masculino.

SELECT nome, cpf FROM CLIENTE WHERE sexo=�masculino� ORDER BY nome DESC

Exemplo 04. Ordenar a listagem anterior por nome, de forma decrescente

Aproveitou-se a soluç�o anterior adicionando-se apenas a cl�usula de ordenaç�o de acordo com a descriç�o do problema.

SELECT nome, salario FROM CLIENTE WHERE sexo=�masculino� and salario < 3000

Exemplo 05. Listar o nome e o sal�rio dos clientes do sexo masculino que ganham menos de R$ 3000

Aqui, tornou-se necess�rio o uso da express�o l�gica de conjunç�o (and), para poder recuperar os clientes do sexo masculino (sexo=�masculino�) que ganham menos de R$ 3000 (salario < 3000). A express�o l�gica (and) faz com que o SGBD retorne apenas as linhas que obedecem as duas condiç�es simultaneamente.

Recuperando informaç�es de v�rias tabelas

Em diversas situaç�es, existe a necessidade da execuç�o de consultas cujos campos est�o localizados em tabelas diferentes. Neste caso, al�m de declarar as tabelas, � necess�rio indicar que elas est�o relacionadas para que o SGBD possa recuperar as informaç�es de forma coerente. H� duas formas de realizar esta tarefa:

  • Declarar as tabelas na cl�usula

    FROM

    , indicando o relacionamento na cl�usula WHERE, ou;
  • Declarar as tabelas e indicar o tipo de relacionamento na cl�usula FROM. Esta abordagem ser� estudada em outra oportunidade.

Para o Exemplo 06, temos:

SELECT nome, fone FROM CLIENTE, FONE WHERE CLIENTE.codigo=FONE.codigo and tipo=�residencial�

Na cl�usula FROM, foram declaradas as tabelas que possuem os campos (nome e fone) que devem aparecer no resultado. Na cl�usula WHERE, CLIENTE.codigo=FONE.codigo representa o relacionamento entre as tabelas CLIENTE e FONE. Atrav�s desse trecho de c�digo o SGBD filtra os registros que correspondem �s informaç�es corretas de cada cliente. J� o c�digo tipo=�residencial� solicita ao SGBD que sejam recuperados apenas os telefones residenciais.

Na realidade, nessas situaç�es o SGBD comumente realiza os seguintes passos:

Execuç�o da operaç�o de produto cartesiano entre as tabelas. Isto significa combinar cada linha da tabela CLIENTE com cada linha da tabela FONE, resultando numa estrutura que possui todas as colunas existentes nas tabelas envolvidas, e quantidade de linhas igual ao produto das linhas de cada tabela (no exemplo, 5 x 5 = 25 linhas). A Figura 1 representa esta situaç�o.

Como comparar a quantidade de numeros de cpf no sql
Figura 1. Produto cartesiano entre as tabelas CLIENTE e FONE

Remoç�o das linhas que n�o correspondem � realidade do banco de dados. Observe que as linhas realçadas em cinza representam informaç�es incorretas. Na pr�tica, devem permanecer na tabela apenas as linhas cujos valores do campo c�digo s�o id�nticos (CLIENTE.codigo=FONE.codigo � linhas marcadas da Figura 1), configurando a situaç�o apresentada na Figura 2.

Como comparar a quantidade de numeros de cpf no sql
Figura 2. Estrutura que corresponde � realidade dos dados do banco de dados

A cl�usula tipo=�residencial� considera apenas os telefones que s�o do tipo residencial (as linhas marcadas na Figura 2 s�o descartadas). Neste caso, temos o resultado intermedi�rio apresentado na Figura 3.

Como comparar a quantidade de numeros de cpf no sql
Figura 3. Estrutura cujas linhas correspondem aos requisitos (cl�usula WHERE) do Exemplo 06

Finalmente, s�o mostrados apenas os campos declarados na cl�usula SELECT (ver Figura 4).

Como comparar a quantidade de numeros de cpf no sql
Figura 4. Resultado final da consulta

SELECT nome, sexo, fone FROM CLIENTE, FONE WHERE CLIENTE.codigo=FONE.codigo and tipo=�celular�

Exemplo 07. Listar o nome, o sexo e o fone celular dos clientes

Esta soluç�o � semelhante � do exemplo 6, sendo adicionado o campo sexo e modificado o campo tipo (tipo=�celular�) para recuperar apenas os clientes que possuem celular.

Nesta parte, foram apresentados diversos exemplos de consultas utilizando a linguagem SQL. Na �ltima parte desse tutorial, estudaremos exemplos mais complexos, envolvendo funç�es de agregaç�o e subconsultas.

Funç�es de agregaç�o e elaboraç�o de subconsultas.

SELECT COUNT(*) FROM CLIENTE

Exemplo 01. Listar a quantidade de clientes

O comando count serve para contabilizar o n�mero de linhas de uma consulta. No exemplo, count(*) retornou o n�mero de linhas da tabela CLIENTE que, nesse contexto, representa o n�mero de clientes.

SELECT COUNT(*) FROM CLIENTE WHERE sexo=�feminino�

Exemplo 02. Listar a quantidade de clientes do sexo feminino

Trata-se de uma soluç�o semelhante � do exemplo 1. Apenas foi adicionada a cl�usula WHERE com um filtro que recupera as linhas correspondentes �s pessoas do sexo feminino (sexo=�feminino�).

SELECT AVG(salario) FROM CLIENTE

Exemplo 03. Obter a m�dia de sal�rio dos clientes

Esta � uma soluç�o simples. Bastou a utilizaç�o da funç�o que calcula a m�dia (avg) a partir de um conjunto de valores (neste caso, o campo sal�rio da tabela CLIENTE). Uma alternativa pode ser vista na Nota 1.

� poss�vel renomear virtualmente qualquer coluna resultante de uma consulta. Este procedimento � �til para deixar o c�digo mais organizado e coerente. Dessa forma, � poss�vel reescrever a soluç�o do Exemplo 03 da seguinte maneira:

SELECT AVG(salario) as MediaSalarial FROM CLIENTE

Exemplo 04. Obter a m�dia salarial por sexo

SELECT sexo, AVG(salario) as MediaSalarialSexo FROM CLIENTE GROUP BY sexo

Esta soluç�o � semelhante � do exemplo 10. Aqui, foi adicionado o campo (sexo) na cl�usula GROUP BY para que o resultado fosse calculado para o sexo masculino e para o feminino.

SELECT (SELECT COUNT(*) FROM CLIENTES WHERE sexo=�masculino�) AS QtdeHomens, (SELECT COUNT(*) FROM CLIENTES WHERE sexo=�feminino�) AS QtdeMulheres

Exemplo 05. Mostrar, em uma linha, a quantidade de clientes do sexo masculino e a quantidade de clientes do sexo feminino

O interessante desta soluç�o � que podemos exibir resultados, dos mais simples aos mais complexos, em uma �nica linha. Para isso, basta declarar um SELECT principal separando, em seguida, por v�rgula, cada subconsulta que gera determinada informaç�o.

Praticando subconsultas

No dia-a-dia, os desenvolvedores codificam consultas que n�o dependem diretamente de alguma tabela, mas do resultado de uma ou de diversas consultas. Este procedimento � comumente chamado de subconsulta. Na pr�tica, o SGBD realiza a subconsulta e o resultado serve como par�metro de entrada para a consulta principal. Observe os exemplos de 06 a 07.

Note que para sabermos o nome dos clientes sem telefone, � necess�rio termos certeza de que n�o existe ocorr�ncia do c�digo do cliente na tabela FONE. Em situaç�es desse tipo, pode-se utilizar o operador (not) in. Observe:

SELECT nome FROM CLIENTE WHERE codigo not in (SELECT codigo FROM FONE)

Exemplo 06. Obter o nome dos clientes que n�o possuem telefone

Neste caso, o SGBD primeiramente recupera os c�digos dos clientes da tabela FONE (SELECT c�digo FROM FONE). Este resultado serve como par�metro de entrada para a consulta principal, que recupera apenas os clientes sem telefone (clientes cujo c�digo n�o aparece na subconsulta).

SELECT nome, salario FROM CLIENTE WHERE salario > (SELECT avg(salario) FROM CLIENTE WHERE SEXO=�MASCULINO�)

Exemplo 07. Obter o nome e o sal�rio dos clientes que ganham mais que a m�dia salarial masculina

Aqui, o SGBD primeiramente calcula a m�dia salarial dos clientes do sexo masculino (subconsulta). O resultado � comparado com o sal�rio de cada cliente, sendo retornadas apenas as informaç�es dos que ganham mais que a m�dia salarial masculina.

SELECT nome FROM CLIENTE WHERE salario = (SELECT max(salario) FROM CLIENTE)

Exemplo 08. Listar o(s) cliente(s) que ganha(m) o maior sal�rio

Neste caso, o SGBD calcula o maior sal�rio atrav�s da utilizaç�o do operador max na subconsulta (SELECT max(sal�rio) from CLIENTE). Este resultado � comparado com o sal�rio de cada cliente, sendo exibidos apenas os que ganham o correspondente ao maior sal�rio.

SELECT count(*) as QteCliente FROM CLIENTE WHERE salario > (SELECT min(salario) FROM CLIENTE)

Exemplo 09. Verificar quantos clientes ganha(m) mais que o(s) cliente(s) de menor sal�rio

Aqui, a subconsulta recupera o menor sal�rio da tabela CLIENTE. Este sal�rio serve como par�metro de comparaç�o para a consulta principal, que contabiliza o n�mero de clientes que ganham mais que este sal�rio.

SELECT nome, sexo FROM CLIENTE WHERE nascimento = (SELECT max(nascimento) FROM CLIENTE)

Exemplo 10. Listar o nome e o sexo do cliente mais novo

Observe que neste caso a subconsulta recupera a maior (mais recente) data de nascimento, dentre as cadastradas na tabela CLIENTE. Este resultado serve como par�metro de entrada para a consulta principal, que retorna o cliente mais novo (podendo ser mais de um cliente).

SELECT nome, sexo FROM CLIENTE WHERE nascimento = (SELECT min(nascimento) FROM CLIENTE)

Exemplo 11. Listar o nome do cliente mais velho

De forma semelhante ao exemplo 10, a subconsulta recupera a data de nascimento mais antiga. Neste caso, o cliente que tiver nascido nesta data, � o que aparecer� no resultado (podendo ser mais de um cliente).

Conclus�es

Estudamos neste tutorial os componentes da estrutura utilizada pelos SGBD para o armazenamento dos dados (tabela). Aprendemos que as tabelas s�o relacionadas atrav�s do mecanismo conhecido por chave estrangeira. Vimos tamb�m uma sintaxe SQL para consulta aos dados armazenados em um banco de dados, consolidando o aprendizado atrav�s de diversos exemplos.

Links �teis sobre MVC

  • O que � MVC?:

    MVC � atualmente o padr�o arquitetural mais utilizado no desenvolvimento web, portanto seu conhecimento � fundamental para a construç�o de projetos bem estruturados.

  • Spring MVC: Construa aplicaç�es responsivas com Bootstrap:

    Desenvolva aplicaç�es responsivas integrando o framework web da Spring com o Bootstrap, uma das bibliotecas de front-end mais conhecidas.

  • ASP.NET MVC:

    Neste Guia de Refer�ncia voc� encontrar� o conte�do que precisa para aprender a desenvolver aplicaç�es web com o framework ASP.NET MVC e a linguagem C#.

Saiba mais sobre MVC ;)

  • JSF - JavaServer Faces:

    Neste Guia de Refer�ncia voc� encontrar� todo o conte�do que precisa para conhecer o JSF, especificaç�o Java que traz conceitos do padr�o MVC e que facilita a construç�o de interfaces web utilizando componentes.

  • CRUD em PHP e MVC com Busca e Paginaç�o:

    Aprenda a implementar uma busca, paginaç�o e convers�o monet�ria em PHP e MVC.

  • Como implementar o MVC em PHP:

    O padr�o MVC � amplamente utilizado no desenvolvimento de aplicaç�es web, e saber implement�-lo � importante para trabalhar de forma eficiente com frameworks como CodeIgniter e Laravel, bem como para desenvolver projetos sem depender dessas soluç�es de terceiros.