Esta parte do curso tratará de como extrair informações do banco de dados. Recomendo que as 4 seções abaixo sejam estudadas em cinco dias, no mínimo. Dois dias para "Selecionando Registros", um dia para "Junção de Tabelas", dois para "Agrupando Registros" e "Trabalhando com Conjuntos". Não se afobem, a qualidade é mais importante que o tempo, demorem o tempo que for necessário para compreender.

    Selecionando Registros

      • Compreendenda o que é uma tabela, uma linha e uma coluna.
      • Também é usual se falar em arquivo, registro e campo para dizer a mesma coisa.
      • Ao lado temos a representação da tabela ALUNO.
      • CODALUNO identifica o aluno. É a chave primária. Neste caso, é um número inteiro.
      • VARCHAR são para armazenar caracteres e números, DATE para datas e horas, INTEGER para valores inteiros como quantidades ou códigos, DOUBLE PRECISION para números com decimais como dinheiro e percentuais e taxas.
      • NOT NULL indica que aquela informação/coluna/campo não pode ser omitida.

    • 01. Seleciona tudo do aluno (todas as informações de todos os alunos).

      SELECT * FROM aluno

    • 02. Seleciona código e nome de todos os alunos.

      SELECT codaluno, nome FROM aluno

    • 03. Seleciona código e nome apenas do aluno com código 27.

      SELECT codaluno, nome FROM aluno WHERE codaluno=27

    • 04. Seleciona os alunos com data de nascimento ou de término do segundo grau incorretos.

      SELECT * FROM aluno WHERE nascdata > escoladata

    • 05. Seleciona código e nome de todos os alunos que possuem "PIC" em qualquer parte do nome. O símbolo de percentual funciona como um coringa.

      SELECT codaluno, nome FROM aluno WHERE nome LIKE "%PIC%"

    • 06. Seleciona todos os alunos que nasceram entre 01/03/1975 e 31/03/1975.

      SELECT codaluno, nome FROM aluno WHERE nascdata BETWEEN “01-MAR-1975” AND “31-MAR-1975”

    • 07. Faz a mesma coisa. Note que o AND do exemplo anterior faz parte do filtro condicional de BETWEEN e, no caso abaixo, o AND liga duas condicionais.

      SELECT codaluno, nome FROM aluno WHERE nascdata >= “01-MAR-1975” AND nascdata <= “31-MAR-1975”

    • 08. Seleciona todos os alunos que o nome do pai começa com “MARCOS” ou termine com “MORENO”

      SELECT * FROM aluno WHERE pai "%MORENO" OR PAI LIKE "MARCOS%"

    • 09. Seleciona todos os alunos de Amapá, Distrito Federal e Roraima.

      SELECT * FROM aluno WHERE IDENTIDADEESTADO IN ("AP","DF",”RR”)

    • 10. Seleciona todos os alunos em que o nome do pai começa com “MARCOS” e termina com “MORENO”.

      SELECT * FROM aluno WHERE pai IN (SELECT pai FROM aluno WHERE pai LIKE “MARCOS%MORENO”)

    • 11. Seleciona todos os alunos sem pai.

      SELECT * FROM aluno WHERE pai IS NULL

    • 12. Descarta os alunos sem pai. O operador NOT pode ser utilizado em todos os exemplos.

      SELECT * FROM aluno WHERE NOT pai IS NULL

    • 13. Adivinhe o que faz a consulta abaixo.

      SELECT * FROM aluno WHERE sexo="F" AND estadocivil<>"C" AND nascdata>"01/01/1975" AND escoladata < nascdata+365*17 AND nascdata < escoladata

    Junção de duas Tabelas

      • CODALUNO é uma chave estrangeira.
      • Usa-se esse código para buscar outras informações sobre o aluno.
      • Existe uma linha ligando as duas tabelas. Elas estão relacionadas.
      • Um aluno pode ter várias matrículas. Mas uma matrícula tem apenas um aluno.

    • 01. Junta as tabelas aluno de matricula pelo codaluno e mostra o ra e nome dos alunos selecionados. Repare que o ra vem da matricula e o nome de aluno.

      SELECT ra, nome FROM aluno, matricula WHERE aluno.codaluno=matricula.codmatricula

    • 02. Seleciona o ra e o nome dos alunos matriculados em 2003 em turismo. Como sei que o código de turismo é 1? Isso foi convencionado no sistema acadêmico.

      SELECT ra, nome FROM aluno, matricula WHERE aluno.codaluno=matricula.codmatricula AND anoletivoatual=2003 AND codcurso=1

    • 03. Uma outra forma de fazer a mesma coisa, mas mostrando todos os matriculados. JOIN significa juntar, ON indica como serão juntados. Observe que, se o aluno não tiver uma matricula, ele não aparecerá na lista.

      SELECT ra, nome FROM aluno JOIN matricula ON matricula.codaluno=aluno.codaluno

    • 03. Idem, mas quando o aluno não estiver matriculado, será listado apenas o nome. OUTER JOIN significa que um dos lados não é obrigatório. LEFT indica que a tabela à esquerda é obrigatória, que deve sempre existir na relação.

      SELECT ra, nome FROM aluno LEFT OUTER JOIN matricula ON matricula.codaluno=aluno.codaluno

    Agrupando Registros

    • 01. Conta o número de alunos.

      SELECT count(*) FROM aluno

    • 02. Conta o número de matrículas ativas em 2003.

      SELECT count(*) FROM matricula WHERE anoletivoatual=2003 AND status="A"

    • 03. Calcula o valor previsto a receber em parcelas referentes a março de 2003.

      SELECT sum(valor-desconto) FROM finparcelas WHERE tipoparc="M" AND anoref=2003 AND mesbase=3 AND vcto >= "today" AND pago IS NOT NULL

    • 04. Calcula o total em atraso de março de 2003.

      SELECT sum(valor) FROM finparcelas WHERE tipoparc="M" AND anoref=2003 AND mesbase=3 AND vcto < "today" AND pago IS NULL

    • 05. Calcula a mensalidade média paga em março de 2003.

      SELECT avg(pago) FROM finparcelas WHERE tipoparc="M" AND anoref=2003 AND mesbase=3

    • 06. Calcula o valor total pago entre janeiro e março de 2003.

      SELECT sum(pago) FROM finparcelas WHERE pgto BETWEEN "01/01/2003" AND "03/31/2003"

    • 07. Seleciona os Estados em que houveram nascimentos de alunos. Todos os Estados de nascimento sem repetição.

      SELECT DISTINCT nascestado FROM aluno

    • 08. Seleciona todos os estados em que houveram nascimentos e a quantidade de nascimento por Estado.

      SELECT nascestado,count(*) FROM aluno GROUP BY nascestado

    • 09. Idem, ordenado Estados por ordem alfabética.

      SELECT nascestado,count(*) FROM aluno GROUP BY nascestado ORDER BY nascestado

    • 10. Idem, eliminando Estados com mais de 5 nascimentos.

      SELECT nascestado,count(*) FROM aluno GROUP BY nascestado HAVING count(*) <= 5 ORDER BY nascestado

    • 11. Idem, renomeando count(*) para total e mostrando antes os com maior incidencia de nascimentos.

      SELECT nascestado,count(*) total FROM aluno GROUP BY nascestado HAVING count(*) <= 5 ORDER BY total DESC

    • 12. Seleciona o ra, nome, número de parcelas atrasadas e a soma dessas parcelas, ordenando pelo nome do aluno.

      SELECT ra,nome,count(*),sum(valor) FROM aluno alu JOIN matricula mat ON alu.codaluno=mat.codaluno JOIN finparcelas par ON par.codmatricula=mat.codmatricula WHERE pago IS NULL AND vcto < "today" GROUP BY ra,nome ORDER BY nome

    Trabalhando com Conjuntos

      SQL (Structured Query Language ou Linguagem de Consulta Estruturada) é uma linguagem padrão utilizada em vários RDBMS (Relational Database Management System, Sistemas Gerenciadores de Bancos de Dados Relacionais). RDBMS são programas que rodam geralmente em um outro computador na rede, onde estão armazenados os bancos de dados, recebem os comandos SQL de outros programas localizados em outras máquinas e respondem. Ele gerencia várias solicitações. São exemplos de RDBMS: Oracle, Interbase, Microsoft SQL Server, IBM DB/2 e muitos outros. Por ser uma linguagem, é razoavel imaginar que cada fabricante fale SQL com um sotaque peculiar. Por exemplo, LEFT OUTER JOIN existe apenas no Interbase. Existem três comandos muito úteis que fazem com que duas consultas tornem uma apenas: UNION, INTERSECT e MINUS. Infelizmente, o Interbase entende apenas o primeiro. Os exemplos abaixo são meramente ilustrativos.

    • O UNION junta o resultado de duas consultas.

      SELECT nome FROM aluno UNION SELECT nome FROM funcionario

    • O INTERSECT mostra apenas os registros que as duas consultas têm em comum. No caso, os alunos que possuem o mesmo nome que um funcionário.

      SELECT nome FROM aluno INTERSECT SELECT nome FROM funcionario

    • Por fim, o MINUS retorna todos os registros da primeira consulta menos os da segunda. No caso, todos os alunos que são apenas alunos, que não são funcionários.

      SELECT nome FROM aluno MINUS SELECT nome FROM funcionario

      E assim finalizamos a primeira parte desse curso.