terça-feira, 17 de maio de 2011

Consultas Avançadas em Mysql

Nós sabemos que no MySQL, podemos montar praticamente qualquer tipo de retorno de informação a partir de seus dados armazenados em suas tabelas, em forma de registros (ou tuplas). 

Podemos fazer consultas SELECT com JOIN, WHERE, HAVING para mudar o escopo do resultado de linhas específicas, usar GROUP BY para combinar resultados, UNION para combinar múltiplas queries. 
Mas também existem casos em que precisamos retornar alguma informação mais comum, utilizada mais frequentemente em nossos sistemas. Vamos descrever a partir de agora 6 consultas no MySQL úteis para o dia a dia de nossos softwares







1 - Idade em anos
Você tem uma data de aniversário e precisa calcular quantos anos o usuáriotem. Assume que @dateofbirth é a data: 

SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(now()) - TO_DAYS(@dateofbirth)), '%Y') + 0; 

2 - Diferença entre duas datas

Encontre a diferença entre dois valores de datas em segundos, minutos, horas e dias. Se dt1 e dt2 são valores do tipo datetime na forma "yyyy-mm-dd hh:mm:ss', o numero de segundos entre dt1 e dt2 é

UNIX_TIMESTAMP( dt2 ) - UNIX_TIMESTAMP( dt1 )

Para pegar o número de minutos, divida o resultado por 60, para o número de horas, divida por 3600 e para pegar a quantidade de dias, divida por 3600 * 24. 

3 - Exiba valores que ocorrem X vezes em uma coluna

SELECT id
FROM tbl
GROUP BY id
HAVING COUNT(*) = N;

4 - Quantidade de dias úteis entre duas datas

SELECT COUNT(*)
FROM calendar
WHERE d BETWEEN Start AND Stop
  AND DAYOFWEEK(d) NOT IN(1,7)
  AND holiday=0;
  
5 - Encontre a chave primária da tabela

SELECT k.column_name
FROM information_schema.table_constraints t
JOIN information_schema.key_column_usage k
USING (constraint_name,table_schema,table_name)
WHERE t.constraint_type='PRIMARY KEY'
  AND t.table_schema='db'
  AND t.table_name='tbl'

6 - Veja o tamanho de seu banco de dados

SELECT
  table_schema AS 'Db Name',
  Round( Sum( data_length + index_length ) / 1024 / 1024, 3 ) AS 'Db Size (MB)',
  Round( Sum( data_free ) / 1024 / 1024, 3 ) AS 'Free Space (MB)'
FROM information_schema.tables
GROUP BY table_schema ;



Nenhum comentário:

Postar um comentário