DML
SELECT cidade, temp_min, temp_max, prcp, data, localizacao FROM clima, cidades WHERE cidade = nome;
UPDATE
As linhas existentes podem ser atualizadas utilizando o comando UPDATE. Suponha ter sido descoberto que as leituras de temperatura realizadas após 28 de novembro de 1994 estão todas 2 graus mais altas. Os dados podem ser atualizados da seguinte maneira:
UPDATE clima SET temp_max = temp_max - 2, temp_min = temp_min - 2 WHERE data > '1994-11-28';
Agora vejamos o novo estado dos dados:
SELECT * FROM clima;
cidade | temp_min | temp_max | prcp | data
----------------+----------+----------+------+------------
São Francisco | 46 | 50 | 0.25 | 1994-11-27
São Francisco | 41 | 55 | 0 | 1994-11-29
Hayward | 35 | 52 | | 1994-11-29
(3 linhas)
DELETE
As linhas podem ser excluídas da tabela através do comando DELETE. Suponha que não estamos mais interessados no clima de Hayward. Então podemos executar comando a seguir para excluir estas linhas da tabela
DELETE FROM clima WHERE cidade = 'Hayward';
e todos os registros de clima pertencentes a Hayward serão removidos. Agora vejamos o novo estado dos dados:
SELECT * FROM clima; cidade | temp_min | temp_max | prcp | data --------------+----------+----------+------+------------ São Francisco | 46 | 50 | 0.25 | 1994-11-27 São Francisco | 41 | 55 | 0 | 1994-11-29 (2 linhas)
Deve-se tomar cuidado com comandos na forma
DELETE FROM nome_da_tabela;
porque, sem uma qualificação, o comando DELETE remove todas as linhas da tabela, deixando-a vazia. O sistema não solicita confirmação antes de realizar esta operação.
INNER JOIN
Para se mostrar dados de mais de uma tabela, é necessário usar a instrução INNER JOIN, que adiciona tabelas para visualização utilizando a chave estrangeira.
SELECT nometab1, nometab2 FROM tab2 INNER JOIN tab1 ON (tab2.idtab = tab1.idtab);
Operadores
- Existem 4 operadores SQL que operam sobre todos os tipos de dados:
- Operador: Significado
- ---------------------
- BETWEEN ..AND.. : Entre dois valores
- IN(lista) : Corresponde a qualquer valor da lista
- LIKE : Cadeia de caracteres que satisfaz uma condição
- IS NULL : É um valor nulo
- Exemplos:
- SELECT Nome, Cargo, Cod_Depar
- FROM Empregado
- WHERE Cargo='Secretario';
- SELECT Nome, N_Superior
- FROM Empregado
- WHERE N_Superior IN (7902,7566,7788);
- SELECT Nome
- FROM Empregado
- WHERE Nome LIKE 'S%';
- SELECT Nome, N_Superior
- FROM Empregado
- WHERE N_Superior IS NULL;
- SELECT Nome, Ordenado
- FROM Empregado
- WHERE Ordenado NOT BETWEEN 100000 AND 200000;
Group By
- Na linguagem SQL é possível obter resultados baseados em grupos de tuplas, assim, existem funções de grupo que operam sobre conjuntos de tuplas
- O comando GROUP BY é utilizado para dividir as tuplas de uma tabela em grupos menores
- Algumas das funções de grupo são:
- AVG(n): Valor médio de n
- COUNT(expr): Número de vezes que a expressão toma um valor
- MAX(expr): Valor máximo de expr
- MIN(expr): Valor mínimo de expr
- SUM(n): Soma dos valores de n
- Expr indica os argumentos que podem ser do tipo CHAR, Number ou DATE
- Todas as funções de grupo, à exceção de COUNT(*), ignoram os valores nulos
- Torna-se ainda importante destacar que as funções de grupo por si só tratam todos as tuplas de uma tabela como um grupo.
- Exemplos:
- SELECT AVG(Ordenado)
- FROM Empregado;
- SELECT MIN(Ordenado)
- FROM Empregado
- WHERE Cargo='secretario';
- SELECT Cargo, AVG(Ordenado) MediaDeOrdenado
- FROM Empregado
- GROUP BY Cargo;
- SELECT Cargo, Cod_Depar, AVG(Ordenado) MédiaDeOrdenado
- FROM Empregado
- GROUP BY Cod_Depar, Cargo
- ORDER BY Cod_Depar;
- SELECT Cargo, MAX(Ordenado) MaxDeOrdenado
- FROM Empregado
- GROUP BY Cargo
- HAVING MAX(Ordenado) >= 300000;
Having x Where
- A cláusula WHERE é utilizada para fazer filtros em colunas
- Já a cláusula HAVING também permite que façamos filtros, mas não em colunas como a WHERE e sim em coluna que estejam sendo agregadas
- Por exemplo:
- SELECT TIPO_CLIENTE , COUNT(TIPO_CLIENTE)
- FROM CLIENTE
- WHERE TIPO_CLIENTE <> 'VIP'
- HAVING COUNT(TIPO_CLIENTE) > 2
- GROUP BY TIPO_CLIENTE
- A instrução SELECT acima retorna os tipos dos clientes e quantos de cada tipo de cliente existem na tabela CLIENTE desde que haja mais de dois clientes com o mesmo tipo
- Somente os tipos de cliente que não forem iguais a 'VIP' serão considerados.
- Principais diferenças entre WHERE e HAVING em um SELECT
- Vejamos um exemplo, como a consulta:
select dt_venda as 'Data', avg(total_venda) as 'Média' from tb_venda where dt_venda <> '2008-05-01' and dt_venda <> '2008-05-03' and dt_venda <> '2008-05-05' group by dt_venda
- Produz o mesmo resultado que :
select dt_venda as 'Data', avg(total_venda) as 'Média' from tb_venda group by dt_venda having dt_venda <> '2008-05-01' and dt_venda <> '2008-05-03' and dt_venda <> '2008-05-05'
- Entretanto, a consulta:
select dt_venda as 'Dia', sum(total_venda) as 'Total' from tb_venda where sum(total_venda) > 3000 group by dt_venda
- Não substitui:
select dt_venda as 'Dia', sum(total_venda) as 'Total' from tb_venda group by dt_venda having sum(total_venda) > 3000
- Embora tenham comportamentos semelhantes (a cláusula WHERE e a cláusula HAVING destinam-se a filtrar resultados), elas também tem suas diferenças.
- A primeira diferença refere-se a ordem em que são processadas.
- Enquanto a cláusula WHERE filtra as linhas antes de agrupar, a cláusula HAVING filtra as linhas após o agrupamento (entenda-se agrupamento a presença de funções como SUM, COUNT, etc e a cláusula GROUP BY).
- Isso já leva a uma diferença de desempenho, uma vez que na esmagadora maioria das vezes, filtrar os resultados o mais cedo possível é melhor.
- Qual seria a utilidade de selecionar registros, agrupá-los e depois descartá-los ?
- A segunda diferença refere-se a possibilidades de filtros.
- Enquanto a cláusula WHERE limita-se a filtrar resultados simples, a cláusula HAVING possibilita filtros com bases em funções agregadas.
- Não é possível por exemplo colocar filtros na cláusula WHERE usando funções como COUNT, SUM, AVG, etc e nem utilizar operadores como SOME, ANY e ALL.
- Embora tenha funcionado no seu exemplo
- isso é sem dúvida uma agressão ao padrão ANSI e essa construção deve ser evitada a qualquer custo.
- A primeira diferença refere-se a ordem em que são processadas.
- Via de regra pode-se fazer o seguinte:
- Filtros de linhas referenciando campos não agregados devem ser feitos na cláusula WHERE
- Filtros de linhas referenciando campos agregados devem ser feitos na cláusula HAVING
- Não utilize uma cláusula para realizar filtros da outra
Exercícios
- 21. Relacione os registros de Estados com Cidade
- 22. Inclua na tabela Eventos, registros coletados na Web para:
- Rio de Janeiro
- São Paulo
- 23. Exclua um evento qualquer colocando data como data e hora como condição
- 24. Altere o valor de todos os preços de todos os eventos em 5%
- 25. Altere o valor dos preços de todos os eventos em 5% para São Paulo
- 26. Altere a data de qualquer evento de Uberlândia postergando 3 dias
- 27. Exclua o Estado de Minas Gerais da tabela Estados
- 28. Mostre os eventos sobre rock
- 29. Mostre os eventos numa faixa de valores
- 30. Mostre os eventos e o clima da cidade que sediará o evento
- 31. Mostre os eventos das seguintes cidades: São Paulo, Rio de Janeiro e Curitiba
- 32. Mostre os eventos agrupados por cidade
- 33. Mostre os eventos agrupados por cidade com preço inferior a R$ 100,00
- 34. Calcule a média de preço de todos os eventos
- 35. Calcule a média de preço dos eventos de São Paulo
- 36. Calcule o evento de menor preço em São Paulo ou Rio de Janeiro
- 37. Mostre todos os eventos com o nome da Cidade e Estado
- 38. Mostre todos os eventos ordenados por data com o nome da Cidade e Estado
- 39. Mostre todos os eventos ordenados por data e agrupados por Cidade
- 40. Mostre todos os eventos ordenados por Preço e agrupados por Estado