Vamos dar uns toques de SQL? XI
Por Pedro Gaspar para o PPLWARE
Ao longo de mais de 10 semana temos apresentado alguns conceitos e funções sobre a linguagem SQL (ver artigos relacionados). A discussão do tema por parte dos nossos leitores tem sido fantástica e a partilha de conhecimento e experiência de cada um tem contribuído para um melhor uso de determinadas funções.
Esta semana vamos aprender a agrupar informação com a função GROUP BY.
A utilização do GROUP BY permite agrupar um conjunto de informação por uma ou várias colunas.
SELECT column_name FROM TABLE_NAME WHERE column_name operator VALUE GROUP BY column_name |
Vamos a alguns exemplos.Como de costumo iremos utilizar a nossa tabela tbl_pplware que contem de momento os seguintes dados:
EXEMPLO1
Objectivo: Apresentar a soma do ano de nascimento e o numero de pessoas que existem por cada cor de cabelo.
Query:
SELECT cor_cabelo, COUNT( * ) AS total, SUM( nascimento ) AS soma FROM `tbl_pplware` GROUP BY cor_cabelo |
Num agrupamento de resultados alem de poder-mos somar o valor de resultados agrupados também poderemos escolher qual o valor maior e menor dentro desse resultado, para isso utilizamos as funções MAX() e MIN()
EXEMPLO2
Objectivo: Apresentar a idade da pessoa mais velha e da pessoa pertencente a cada morada
Query:
SELECT morada, MAX( YEAR( NOW( ) ) - nascimento ) AS maisvelho, MIN( YEAR( NOW( ) ) - nascimento ) AS maisnovo FROM `tbl_pplware` GROUP BY morada |
Resultado:
A utilização do GROUP BY é relativamente simples mas de extrema utilidade. Caso tenham alguma sugestão para próximos artigos podem deixar nos comentários. Desta forma podemos ir de encontro as vossas necessidades.
- Vamos dar uns toques em queries SQL?
- Vamos dar uns toques em queries SQL? II
- Vamos dar uns toques em queries SQL? III
- Vamos dar uns toques em queries SQL? IV
- Vamos dar uns toques de SQL? V
- Vamos dar uns toques de SQL? VI
- Vamos dar uns toques de SQL? VII
- Vamos dar uns toques de SQL? VIII
- Vamos dar uns toques de SQL? IX
- Vamos dar uns toques de SQL? X
- Cábula” do MySQL
Este artigo tem mais de um ano
Olá,
Os tutoriais estão espetaculares.
Gostava de ver um tutorial sobre o comando GROUP BY ROLLUP.
Continua com o bom trabalho.
Abraço para o pplware
Gostava se possível se alguém consegue dar-me um query para o seguinte:
Actualizar um campo chamado ‘ordem’ que vai de 1 a 10 duma tabela conteúdos, sabendo que vamos apagar o conteúdo 6.
Assim ficaria com 9 conteúdos no total e ordenado pelo campo ordem que ficava: 1,2,3,4,5,7,8,9,10.
O objectivo aqui é organizar o campo ‘ordem’ para 1,2,3,4,5,6,7,8,9 pois acabamos de apagar um registo.
A tua duvida é em MySQL ou em T-SQL?
Para MySQL não sei se existe, mas muito provavelmente existe…
Mas em T-SQL tens aqui uma solução…
–DECLARAMOS A TABELA TEMPORARIA
DECLARE @Tabela1 TABLE(Id BIGINT, Nome NVARCHAR(MAX))
–POPULAMOS COM ALGUNS DADOS DE EXEMPLO
INSERT INTO @Tabela1
SELECT 1, ‘NOME1’
UNION ALL
SELECT 2, ‘NOME2’
UNION ALL
SELECT 3, ‘NOME3’
UNION ALL
SELECT 4, ‘NOME4’
UNION ALL
SELECT 5, ‘NOME5’
UNION ALL
SELECT 6, ‘NOME6’
UNION ALL
SELECT 7, ‘NOME7’
UNION ALL
SELECT 8, ‘NOME8’
UNION ALL
SELECT 9, ‘NOME9’
UNION ALL
SELECT 10, ‘NOME10’
–VALIDAMOS A INSERÇÂO DOS DADOS
SELECT * FROM @Tabela1
–APAGAMOS A LINHA COM O ID 6
DELETE @Tabela1
WHERE Id = 6
–FAZEMOS O SELECT COM UM ROW NUMBER DE FORMA A TRAZER A ORDEM DESEJADA
SELECT ROW_NUMBER() OVER (ORDER BY Id) AS [NOVAORDEM]
,Id
,Nome
FROM @Tabela1
Será que isto te serve????
Bem, era em mysql, só falta saber esta linha :
SELECT ROW_NUMBER() OVER (ORDER BY Id) AS [NOVAORDEM]
,Id
,Nome
FROM @Tabela1
pois de resto sei como se faz. Pode ser que alguem com conhecimentos em mysql saiba….
Se entendi bem, o que pretendes é o seguinte:
Considerando como tabela de exemplo (ninja_tabela):
id(chave)
nome
ordem
tipo
– Coloquei um campo “tipo” para diferenciares entre vários itens com várias ordens;
– no campo “ordem” tens 1,2,3,4,5,6,7,8,9,10 e, como exemplo, um tipo “iogurtes”;
para apagares o registo 6 (que já sabes):
delete from ninja_tabela where ordem = 6 and tipo = ‘iogurtes’
para repores a ordem dos registos que ficam acima do que apagaste – acertar o registo de ordem 7,8,9 e 10:
update ninja_tabela ordem=ordem-1 where ordem>6 and tipo=’iogurtes’
este comando retira um valor a cada “ordem” que contenha um valor acima de 6, e apenas registos de tipo ‘iogurtes’
o 7,8,9 e 10 da “ordem” passa a 6,7,8 e 9.
Através de stored procedures ou da linguagem de programação da tua preferência, podes automatizar este processo facilmente.
É isto que pretendes? 🙂
MV
Simples e funcional.
Era mesmo isso, por vezes faço coisas bem mais difíceis e um update simples as voltas que dei sem chegar ao objectivo.
Era mesmo isso, obrigadão.
E para quando um tuturial de como criar um pequeno website para manuseamento dos dados na BD?