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. Show 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. Relacionado: Guia Completa de MVC Anatomia de uma tabelaA 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.
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. Saiba mais: Seja um mestre SQL Entendendo relacionamentos entre tabelasRelacionamentos 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 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 consultasEstudada 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. Saiba mais: Cursos de Banco de Dados Figura 1. Sintaxe SQL para a execuç�o de consultasA 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 consultasPara os exemplos, ser�o utilizadas as tabelas CLIENTE e FONE, apresentadas na primeira parte do tutorial. SELECT * FROM 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 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 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 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 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 tabelasEm 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:
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. Figura 1. Produto cartesiano entre as tabelas CLIENTE e FONERemoç�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. Figura 2. Estrutura que corresponde � realidade dos dados do banco de dadosA 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. Figura 3. Estrutura cujas linhas correspondem aos requisitos (cl�usula WHERE) do Exemplo 06Finalmente, s�o mostrados apenas os campos declarados na cl�usula SELECT (ver Figura 4). Figura 4. Resultado final da consultaSELECT nome, sexo, fone FROM CLIENTE, FONE WHERE CLIENTE.codigo=FONE.codigo and tipo=�celular� 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 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� 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 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 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 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 subconsultasNo 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) 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�) 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) 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) 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) 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) 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�esEstudamos 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
Saiba mais sobre MVC ;)
|