Mysql: O comando SELECT

Você pode usar declarações com o SELECT para obter registros de uma ou mais tabelas, em um banco de dados.
Para refinar o seu resultado, é possível aninhar outras declarações ou incluir funções dentro da declaração original com o SELECT.
Neste texto, vou explicar como usar o comando SELECT do MySQL, através de diversos exemplos práticos.

Vou partir do pressuposto de que você:

Comece por conectar ao MySQL:

mysql -u root -p
Password:

Em seguida, verifique os bancos de dados disponíveis:

SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| biblio             |
| clientes           |
| mysql              |
+--------------------+
10 rows in set (0.48 sec)

No meu caso, vou usar o banco de dados clientes, onde se encontra a tabela projetos, que vou usar nos exemplos:

USE clientes;

Se você quiser, pode baixar a tabela projetos, que é usada nos exemplos deste artigo. Mas isto não é obrigatório – qualquer tabela que você tiver, poderá ser usada. Basta adaptar os exemplos ao seu caso.
Veja o código fontePara baixar a tabela, clique em show source, ao lado da “lupinha” (abaixo). Em seguida, clique no ícone view source, no canto superior direito da janela de código. Copie e cole o código na sua sessão do MySQL.

CREATE TABLE IF NOT EXISTS `projetos` (
  `id_projeto` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `id_cliente` mediumint(9) DEFAULT NULL,
  `nome_projeto` varchar(255) DEFAULT NULL,
  `data_inicio_projeto` varchar(255) DEFAULT NULL,
  `data_fim_projeto` varchar(255) DEFAULT NULL,
  `descr_projeto` text,
  `valor_projeto` mediumint(9) DEFAULT NULL,
  PRIMARY KEY (`id_projeto`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=101 ;

INSERT INTO `projetos` (`id_projeto`, `id_cliente`, `nome_projeto`, `data_inicio_projeto`, `data_fim_projeto`, `descr_projeto`, `valor_projeto`) VALUES
(2, 19, 'Daly', '25-09-2013', '09-08-2020', 'dictum mi, ac mattis', 1786199),
(3, 1, 'Morhet', '28-01-2014', '27-11-2016', 'lacus. Quisque imperdiet, erat nonummy', 2777174),
(4, 25, 'New Radnor', '02-05-2013', '02-02-2017', 'feugiat. Lorem ipsum', 1698175),
(5, 21, 'Bologna', '13-11-2013', '22-12-2021', 'in, dolor. Fusce feugiat.', 1556953),
(8, 19, 'Corbais', '07-09-2013', '03-08-2021', 'in, tempus eu,', 1288463),
(9, 23, 'Gols', '02-05-2013', '19-12-2015', 'bibendum sed, est. Nunc', 375503),
(12, 7, 'Santa Flavia', '05-08-2013', '09-04-2020', 'Proin sed turpis nec mauris', 899445),
(13, 27, 'Sobral', '19-11-2013', '16-08-2014', 'tincidunt, nunc ac mattis', 3483467),
(54, 30, 'Casacalenda', '29-11-2013', '18-05-2016', 'a, malesuada id, erat.', 234014),
(55, 20, 'Ponoka', '03-06-2013', '02-01-2020', 'Sed nunc est, mollis', 1230821),
(56, 4, 'Ponoka', '24-03-2014', '10-11-2019', 'elementum at, egestas a,', 1449375),
(57, 7, 'Fuenlabrada', '25-08-2013', '06-07-2017', 'Sed pharetra, felis eget', 2379213),
(58, 15, 'Fairbanks', '23-03-2013', '16-05-2017', 'dis parturient montes, nascetur', 682314),
(59, 27, 'Sobral', '01-10-2013', '12-01-2020', 'eu dolor egestas rhoncus. Proin', 2561842),
(60, 3, 'Boncelles', '26-11-2013', '27-09-2014', 'est ac mattis', 1079850),
(61, 30, 'Caledon', '20-06-2013', '07-05-2018', 'auctor quis, tristique ac, eleifend', 2247869),
(62, 30, 'Caledon', '21-03-2013', '16-04-2014', 'elementum purus, accumsan interdum libero', 1765979),
(63, 5, 'Wedel', '04-04-2013', '21-09-2016', 'Vestibulum ante ipsum primis in', 2474205),
(64, 25, 'Baricella', '16-12-2013', '05-09-2014', 'cubilia Curae; Donec tincidunt.', 2382058),
(65, 10, 'Neath', '29-12-2013', '24-03-2019', 'at risus. Nunc', 1422902),
(66, 1, 'Liers', '22-06-2013', '11-09-2017', 'Aliquam nec enim. Nunc', 470024),
(68, 30, 'Nellore', '25-09-2013', '17-02-2015', 'quam. Pellentesque habitant morbi tristique', 67899),
(69, 2, 'Lourdes', '28-03-2013', '14-04-2020', 'augue id ante', 2538857),
(70, 28, 'Nives', '27-08-2013', '25-12-2014', 'ante dictum mi,', 1784745),
(71, 18, 'Nives', '14-12-2013', '17-09-2021', 'montes, nascetur ridiculus mus. Donec', 1107111),
(72, 28, 'Beigem', '20-01-2014', '08-07-2018', 'lacus pede sagittis augue,', 734517),
(73, 23, 'Lourdes', '24-05-2013', '26-05-2014', 'et ultrices posuere cubilia Curae;', 3489422),
(74, 22, 'Caledon', '23-10-2013', '12-08-2017', 'Integer eu lacus.', 1845447),
(75, 4, 'Herne', '20-12-2013', '11-06-2019', 'bibendum sed, est. Nunc', 626961),
(76, 20, 'Kincardine', '20-10-2013', '02-07-2016', 'hendrerit. Donec porttitor tellus non', 1348843),
(77, 23, 'Ham-sur-Sambre', '24-05-2013', '29-03-2018', 'montes, nascetur ridiculus mus.', 1211441),
(79, 8, 'Vegreville', '08-12-2013', '15-12-2014', 'Cras eget nisi dictum augue', 1120979),
(80, 5, 'Chetwynd', '04-06-2013', '09-01-2019', 'lectus ante dictum', 58747),
(81, 23, 'Laramie', '26-11-2013', '02-06-2016', 'ut odio vel est', 504943),
(82, 24, 'Cabano', '01-08-2013', '20-12-2018', 'per inceptos hymenaeos. Mauris ut', 389426),
(83, 17, 'Warwick', '19-03-2013', '28-05-2017', 'quam, elementum at,', 2832485),
(84, 28, 'Riparbella', '31-12-2013', '14-02-2016', 'accumsan sed, facilisis', 2424741),
(85, 11, 'Sobral', '20-04-2013', '21-05-2015', 'Proin sed turpis', 428474),
(86, 3, 'Assiniboia', '26-03-2013', '14-03-2020', 'mus. Aenean eget magna.', 1050649),
(87, 28, 'Aylmer', '27-03-2013', '07-11-2017', 'congue a, aliquet', 1951523),
(89, 4, 'Moose Jaw', '19-06-2013', '04-10-2015', 'Nulla interdum. Curabitur', 3119981),
(91, 11, 'Regina', '23-03-2013', '09-08-2018', 'netus et malesuada fames ac', 1556143),
(92, 15, 'Dunstable', '09-03-2013', '27-11-2015', 'Integer sem elit,', 395861),
(93, 30, 'Schwalbach', '21-07-2013', '13-05-2017', 'nunc sit amet metus.', 2372941),
(94, 17, 'Saint-Prime', '10-04-2013', '21-10-2016', 'Donec consectetuer mauris id sapien.', 2293366),
(95, 8, 'Munich', '20-09-2013', '31-12-2016', 'cursus non, egestas', 491439),
(96, 22, 'Presteigne', '21-11-2013', '21-03-2019', 'Aliquam nec enim.', 2586221),
(97, 13, 'Caledon', '16-05-2013', '14-08-2021', 'gravida non, sollicitudin a, malesuada', 536721),
(98, 20, 'Cerchio', '12-08-2013', '15-11-2017', 'primis in faucibus orci luctus', 2559437),
(100, 25, 'Cheyenne', '10-08-2013', '01-12-2016', 'dapibus gravida. Aliquam tincidunt, nunc', 1964699);

Exemplos de uso do comando SELECT no MySQL

O exemplo mais básico de uso de uma declaração com SELECT é a usada para ver todas as colunas (os campos com seus conteúdos) de uma tabela.

SELECT * FROM projetos;

Abaixo, você pode ver o resultado do comando (clique no ícone view source, no canto superior direito, para ver melhor).

+-----+------------+------------+----------------------+--------------------+------------------+-------------------------------------------------------------------------+
| id  | id_projeto | id_cliente | nome_projeto         | data_inicio_projeto | data_fim_projeto | descr_projeto                                                           |
+-----+------------+------------+----------------------+--------------------+------------------+-------------------------------------------------------------------------+
|   1 |          1 |        557 | Macklin              | 15-09-2013         | 09-09-2014       | Lorem                                                                   |
|   2 |          2 |        863 | Kent                 | 18-06-2013         | 10-04-2014       | Lorem ipsum dolor sit amet, consectetuer                                |
|   3 |          3 |        192 | Moradabad            | 10-04-2013         | 01-05-2014       | Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Curabitur sed |
|   4 |          4 |        671 | Lithgow              | 15-07-2013         | 26-05-2014       | Lorem ipsum dolor sit amet, consectetuer                                |
|   5 |          5 |        440 | Bowden               | 14-12-2013         | 07-03-2014       | Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Curabitur sed |
+-----+------------+------------+----------------------+--------------------+------------------+-------------------------------------------------------------------------+
5 rows in set (0.14 sec)

O símbolo * significa all ou todas as colunas, neste caso.
Você pode especificar quais colunas, exatamente, deseja ver, ao descrevê-las no lugar do *.
No exemplo, abaixo, vou pedir para que apenas as colunas id_projeto e nome_projeto sejam exibidas:

SELECT id_projeto, nome_projeto FROM projetos;

E, como resultado, obtenho o seguinte:

+------------+----------------------+
| id_projeto | nome_projeto         |
+------------+----------------------+
|          1 | Macklin              |
|          2 | Kent                 |
|          3 | Moradabad            |
|          4 | Lithgow              |
|          5 | Bowden               |
+------------+----------------------+
10 rows in set (0.01 sec)

Use a função NOW() para obter a data e a hora do servidor MySQL

Obtenha a data e a hora do servidor, através da função NOW():

SELECT NOW();

Há outras funções de data e hora disponíveis para uso no MySQL, de acordo com as suas necessidades.
A função CURDATE(), (CURrrent DATE) retorna apenas a data atual:

SELECT CURDATE();

Refine os resultados da consulta com a cláusula WHERE do MySQL

Ao usar a cláusula WHERE, você indica as condições que os registros têm que satisfazer para serem selecionados.
Veja como exibir id_projetos e nome_projetos, restringindo a relação aos que têm o nome aylmer:

SELECT id_projeto, nome_projeto FROM projetos WHERE nome_projeto = "aylmer";

o que dará o seguinte resultado (para mim):

+------------+--------------+
| id_projeto | nome_projeto |
+------------+--------------+
|         43 | Aylmer       |
|         72 | Aylmer       |
+------------+--------------+
2 rows in set (0.00 sec)

Você pode buscar resultados informando um termo parcial para a busca. Veja como:

SELECT nome_projeto FROM projetos WHERE nome_projeto LIKE 'Mo%';
+--------------+
| nome_projeto |
+--------------+
| Morhet       |
| Moose Jaw    |
+--------------+
2 rows in set (0.00 sec)

O exemplo acima mostra todos nome_projeto, cujo valor comece com Mo. Você pode posicionar o % em outros lugares da string para fazer outras buscas. Experimente.
Para restringir a listagem aos projetos cujos valores superam a cifra de 2500000:

SELECT nome_projeto,valor_projeto FROM projetos WHERE valor_projeto > 2500000;
+-----------------------+---------------+
| nome_projeto          | valor_projeto |
+-----------------------+---------------+
| Morhet                |       2777174 |
| Uppingham. Cottesmore |       3483467 |
| Campbeltown           |       2561842 |
| Prince George         |       2538857 |
| Lourdes               |       3489422 |
| Warwick               |       2832485 |
| Moose Jaw             |       3119981 |
| Presteigne            |       2586221 |
| Cerchio               |       2559437 |
+-----------------------+---------------+

9 rows in set (0.00 sec)
Combine os operadores lógicos para obter resultados ainda mais precisos:

SELECT nome_projeto,valor_projeto FROM projetos WHERE valor_projeto > 2000000 AND valor_projeto < 2500000;
+--------------+---------------+
| nome_projeto | valor_projeto |
+--------------+---------------+
| Fuenlabrada  |       2379213 |
| Caledon      |       2247869 |
| Wedel        |       2474205 |
| Baricella    |       2382058 |
| Riparbella   |       2424741 |
| Schwalbach   |       2372941 |
| Saint-Prime  |       2293366 |
+--------------+---------------+
7 rows in set (0.02 sec)

Ou obter todos os nomes de projetos que sejam iguais a “Caledon” ou que comecem com as letras “Mo”:

SELECT nome_projeto FROM projetos WHERE nome_projeto LIKE 'Caledon' OR nome_projeto LIKE 'Mo%';
+--------------+
| nome_projeto |
+--------------+
| Morhet       |
| Caledon      |
| Caledon      |
| Caledon      |
| Moose Jaw    |
| Caledon      |
+--------------+
6 rows in set (0.00 sec)

Combine valores dos registros e altere a exibição do relatório, com a função CONCAT

Você pode combinar a exibição de valores com a função CONCAT, dentro de um SELECT. Ao usar este recurso, o MySQL cria um novo campo (apenas para exibição), contendo os valores concatenados/combinados.
No exemplo abaixo vou mostrar como combinar os campos nome_projeto e data_inicio_projeto dentro de um novo campo, chamado Detalhes:

SELECT id_projeto, CONCAT('projeto ', nome_projeto, ' iniciado em ', data_inicio_projeto) AS Detalhes, valor_projeto FROM projetos WHERE valor_projeto > 3000000;
+------------+------------------------------------------------------+---------------+
| id_projeto | Detalhes                                             | valor_projeto |
+------------+------------------------------------------------------+---------------+
|         13 | projeto Uppingham. Cottesmore iniciado em 19-11-2013 |       3483467 |
|         73 | projeto Lourdes iniciado em 24-05-2013               |       3489422 |
|         89 | projeto Moose Jaw iniciado em 19-06-2013             |       3119981 |
+------------+------------------------------------------------------+---------------+
3 rows in set (0.00 sec)

Para a lista não ficar muito extensa, no exemplo acima, restringi os projetos a serem exibidos aos que têm valores acima de 3000000.
A lista ficaria melhor, ainda, se as datas fossem exibidas em ordem ascendente:

SELECT id_projeto, CONCAT('projeto ', nome_projeto, ' iniciado em ', data_inicio_projeto) AS Detalhes, valor_projeto FROM projetos WHERE valor_projeto > 3000000 ORDER BY data_inicio_projeto ASC;
+------------+------------------------------------------------------+---------------+
| id_projeto | Detalhes                                             | valor_projeto |
+------------+------------------------------------------------------+---------------+
|         89 | projeto Moose Jaw iniciado em 19-06-2013             |       3119981 |
|         13 | projeto Uppingham. Cottesmore iniciado em 19-11-2013 |       3483467 |
|         73 | projeto Lourdes iniciado em 24-05-2013               |       3489422 |
+------------+------------------------------------------------------+---------------+
3 rows in set (0.00 sec)

Se quiser ler mais sobre a função CONCAT(), clique aqui.

Conte o número de registros dentro de uma tabela com a função COUNT(*)

A função COUNT() realiza a contagem do número de ocorrências dentro da tabela. No exemplo abaixo, a função é usada para contar o número de registros:

SELECT COUNT(*) FROM projetos;
+----------+
| COUNT(*) |
+----------+
|       50 |
+----------+
1 row in set (0.02 sec)

No exemplo, a seguir, vou listar os valores de data_inicio_projeto, agrupar aqueles cujos valores coincidirem e contar quantas vezes se repetem:

SELECT data_inicio_projeto,COUNT(*) FROM projetos GROUP BY data_inicio_projeto;
+---------------------+----------+
| data_inicio_projeto | COUNT(*) |
+---------------------+----------+
| 01-08-2013          |        1 |
| 01-10-2013          |        1 |
| 02-05-2013          |        2 |
| 23-03-2013          |        2 |
+---------------------+----------+
4 rows in set (0.00 sec)

No próximo exemplo, vou restringir mais ainda a lista. Ao combinar o uso de GROUP BY com a função HAVING, vou agrupar e exibir apenas os nome_projeto que se repetirem por 2 vezes ou mais:

SELECT COUNT(*) AS Contagem, nome_projeto FROM projetos GROUP BY nome_projeto HAVING Contagem >= 2;
+----------+--------------+
| Contagem | nome_projeto |
+----------+--------------+
|        4 | Caledon      |
|        2 | Lourdes      |
|        2 | Nives        |
|        2 | Ponoka       |
|        2 | Sobral       |
+----------+--------------+
5 rows in set (0.01 sec)

Altere a exibição dos nomes dos campos na tabela MySQL

Use AS para alterar os nomes de exibição dos campos para outros mais fáceis de entender.
Por diversas questões, uma delas o limite de caracteres, não é possível usar nomes muito grandes nos campos. O fato é que acabam ficando com uma nomenclatura que pode ser de difícil entendimento ou leitura.
Com a função AS, é possível melhorar isto. Veja como:

SELECT id_projeto AS 'Núm. do projeto', nome_projeto AS Projeto, data_inicio_projeto AS Início, valor_projeto AS 'Valor (R$)' FROM projetos WHERE valor_projeto > 2500000;

… e veja como isto muda o aspecto da nossa tabela:

+------------------+-------------+------------+------------+
| Núm. do projeto  | Projeto     | Início     | Valor (R$) |
+------------------+-------------+------------+------------+
|                3 | Morhet      | 28-01-2014 |    2777174 |
|               13 | Sobral      | 19-11-2013 |    3483467 |
|               59 | Campbeltown | 01-10-2013 |    2561842 |
|               69 | Lourdes     | 28-03-2013 |    2538857 |
|               73 | Lourdes     | 24-05-2013 |    3489422 |
|               83 | Warwick     | 19-03-2013 |    2832485 |
|               89 | Moose Jaw   | 19-06-2013 |    3119981 |
|               96 | Presteigne  | 21-11-2013 |    2586221 |
|               98 | Cerchio     | 12-08-2013 |    2559437 |
+------------------+-------------+------------+------------+
9 rows in set (0.00 sec)

A palavra chave AS é opcional. A declaração abaixo tem o mesmo efeito que a anterior:

SELECT id_projeto 'Núm. do projeto', nome_projeto Projeto, data_inicio_projeto Início, valor_projeto 'Valor (R$)' FROM projetos WHERE valor_projeto > 2500000;

Use LIMIT para restringir a quantidade de registros exibidos

Limite a quantidade de registros exibida na tela com a função LIMIT.
Funciona de acordo com a seguinte sintaxe: LIMIT primeiro_registro, qtd_registros.
De forma prática, para exibir os registros de 10 a 15, a declaração ficaria assim:

SELECT * FROM projetos LIMIT 10,5;
+------------+------------+--------------+---------------------+------------------+---------------------------------+---------------+
| id_projeto | id_cliente | nome_projeto | data_inicio_projeto | data_fim_projeto | descr_projeto                   | valor_projeto |
+------------+------------+--------------+---------------------+------------------+---------------------------------+---------------+
|         56 |          4 | Ponoka       | 24-03-2014          | 10-11-2019       | elementum at, egestas a,        |       1449375 |
|         57 |          7 | Fuenlabrada  | 25-08-2013          | 06-07-2017       | Sed pharetra, felis eget        |       2379213 |
|         58 |         15 | Fairbanks    | 23-03-2013          | 16-05-2017       | dis parturient montes, nascetur |        682314 |
|         59 |         27 | Campbeltown  | 01-10-2013          | 12-01-2020       | eu dolor egestas rhoncus. Proin |       2561842 |
|         60 |          3 | Boncelles    | 26-11-2013          | 27-09-2014       | est ac mattis                   |       1079850 |
+------------+------------+--------------+---------------------+------------------+---------------------------------+---------------+
5 rows in set (0.01 sec)

Opcionalmente, você pode omitir o primeiro número. O MySQL vai entender que você deseja começar do registro 0:

SELECT * FROM projetos LIMIT 5;

Use DISTINCT para filtrar informações redundantes

Obtenha apenas os valores diferentes, distintos, na sua relação com a função DISTINCT.
Esta função evita a exibição repetida de campos. Veja o exemplo de uso de uma declaração SELECT sem o DISTINCT e outra com o DISTINCT:

SELECT nome_projeto FROM projetos WHERE nome_projeto = 'Caledon';
+--------------+
| nome_projeto |
+--------------+
| Caledon      |
| Caledon      |
| Caledon      |
| Caledon      |
+--------------+
4 rows in set (0.00 sec)

… e agora, com o DISTINCT:

SELECT DISTINCT nome_projeto FROM projetos WHERE nome_projeto = 'Caledon';
+--------------+
| nome_projeto |
+--------------+
| Caledon      |
+--------------+
1 row in set (0.00 sec)

Realize operações aritméticas básicas com o comando SELECT

Experimente algumas das 4 operações básicas:

SELECT 2 * 3;
+-------+
| 2 * 3 |
+-------+
|     6 |
+-------+
1 row in set (0.00 sec)

Soma de todas os valores em uma coluna

Neste exemplo, vou mostrar a soma de todos os valores da coluna valor_projeto

SELECT SUM(valor_projeto) FROM projetos;
+--------------------+
| SUM(valor_projeto) |
+--------------------+
|           77639864 |
+--------------------+
1 row in set (0.04 sec)

Podemos usar a função AS para tornar o resultado um pouco melhor apresentável, como já vimos anteriormente:

SELECT SUM(valor_projeto) as 'Valor Total' FROM projetos;
+-------------+
| Valor Total |
+-------------+
|    77639864 |
+-------------+
1 row in set (0.03 sec)

Como calcular a média dos valores de uma coluna

Para tirar a média, há uma função chamada AVG() (average):

SELECT AVG(valor_projeto) as 'Média de valores cobrados' FROM projetos;
+----------------------------+
| Média de valores cobrados  |
+----------------------------+
|               1552797.2800 |
+----------------------------+
1 row in set (0.00 sec)

Como arredondar os valores exibidos

Use a função ROUND().
Vamos repetir o exemplo acima para ver como uma função pode aninhar outras funções e produzir um resultado mais agradável:

SELECT ROUND(AVG(valor_projeto),2) as 'Média de valores cobrados' FROM projetos;

Esta declaração faz com que o valor seja arredondado para apenas 2 decimais:

+----------------------------+
| Média de valores cobrados  |
+----------------------------+
|                 1552797.28 |
+----------------------------+
1 row in set (0.00 sec)

Simples, não é?

Como exibir valores monetários

Você já deve ter percebido que a coluna valor_projeto refere-se a um valor monetário. Nesta tabela, os valores estão em 7 dígitos, o que dificulta um pouco sua leitura.
O MySQL tem funções para formatar a exibição de diversos tipos de dados, embora esta não seja sua tarefa. Você deve usar o PHP, o Perl ou qualquer que seja a sua linguagem favorita, para realizar este trabalho.
Mas, já que estamos aqui, vou mostrar rapidamente como exibir os valores da coluna em dólares, usando a função FORMAT() no MySQL:

SELECT nome_projeto "Projeto", FORMAT(valor_projeto,2) "Valor em US$" FROM projetos WHERE valor_projeto > 2700000;
+-----------+--------------+
| Projeto   | Valor em US$ |
+-----------+--------------+
| Morhet    | 2,777,174.00 |
| Sobral    | 3,483,467.00 |
| Lourdes   | 3,489,422.00 |
| Warwick   | 2,832,485.00 |
| Moose Jaw | 3,119,981.00 |
+-----------+--------------+
5 rows in set (0.00 sec)

Use um SELECT dentro de outro SELECT

E, já que o assunto é aninhar funções… vamos ver como aninhar uma declaração SELECT em outra. Embora seja um exemplo um tanto quanto “sem sentido”, a declaração abaixo serve para ilustrar a possibilidade de que falei:

SELECT * FROM (SELECT * FROM projetos WHERE valor_projeto > 2700000) AS Tarefas WHERE id_projeto;

Como gravar o resultado de um SELECT em um arquivo do sistema

Em vez de ver o resultado na tela, você pode direcioná-lo a um arquivo, que pode ser enviado para outra pessoa ou ser trabalhado de outra forma, por outro programa. Veja como fazer isto com o SELECT INTO:

SELECT ROUND(AVG(valor_projeto),2) as 'Média de valores cobrados' INTO OUTFILE '/tmp/média_de_valores_cobrados.txt' FROM projetos;

Para obter um arquivo CSV, do tipo usado na agenda de endereços do seu smartphone – com os campos separados por vírgulas – use a opção FIELDS TERMINATED BY, tal como no exemplo abaixo:

SELECT nome_projeto, valor_projeto INTO OUTFILE '/tmp/valores.csv' FIELDS TERMINATED BY ',' FROM projetos WHERE valor_projeto > 2000000;

Se quiser ver o resultado, basta abrir o arquivo, na pasta /tmp ou em qualquer outro lugar em que você o tenha gravado. O meu ficou assim:

Morhet,2777174
Sobral,3483467
Fuenlabrada,2379213
Campbeltown,2561842
Caledon,2247869
Wedel,2474205
Baricella,2382058
Lourdes,2538857
Lourdes,3489422
Warwick,2832485
Riparbella,2424741
Moose Jaw,3119981
Schwalbach,2372941
Saint-Prime,2293366
Presteigne,2586221
Cerchio,2559437

Como selecionar um registro aleatório dentro da tabela

Para isto, há a função RAND(), com a qual é possível sortear para exibir um registro de dentro da tabela. Isto pode ser útil em casos em que você deseja exibir uma mensagem aleatória, em um site, todo dia.
Veja como ela funciona:

SELECT nome_projeto,valor_projeto,data_fim_projeto FROM projetos ORDER BY RAND() LIMIT 1;
+--------------+---------------+------------------+
| nome_projeto | valor_projeto | data_fim_projeto |
+--------------+---------------+------------------+
| Cabano       |        389426 | 20-12-2018       |
+--------------+---------------+------------------+
1 row in set (0.03 sec)

Ao executar o comando outras vezes, a tendência é que o resultado seja sempre diferente. Experimente.

Como aumentar a prioridade de uma requisição no MySQL

Use a função HIGH_PRIORITY para dar ao SELECT uma prioridade maior que as declarações para atualizar a tabela. A documentação oficial adverte para que esta opção só seja usada em tarefas rápidas e que precisem ser realizadas de uma vez.
Veja como funciona:

SELECT HIGH_PRIORITY * FROM projetos WHERE id_projeto = 12;

LEIA MAIS:

Leia outros artigos sobre MySQL

Você pode clicar nos links, ao longo do texto ou usar o quadro de busca, no canto superior do site.
Há muitos outros artigos sobre MySQL, com exemplos práticos de uso — para você adaptar e aprender mais sobre este sistema de banco de dados.

Ouça músicas no terminal com o mpg321

O mpg321 é um software livre, em modo texto, leve, que consome infimamente os recursos da sua máquina na reprodução de arquivos mp3 – tais como músicas, podcasts etc.
Para quem usa uma máquina muito antiga ou faça uso intensivo do processamento em outras atividades e não deseja que, ao reproduzir suas músicas isto atrapalhe o andamento das outras tarefas, um player em modo texto é uma ótima solução.
Neste artigo, vou mostrar as minhas opções prediletas de uso do mpg321.

Como instalar o mpg321

Não me consta qualquer versão deste software para outras plataformas além de alguns UNICES ou Linux.
Para fazer a instalação no Debian – ou em algum outro derivado, como o Ubuntu, use o apt-get:

sudo apt-get install mpg321

No Redhat ou no SuSE, use o yum:

sudo yum install mpg321

Você também pode baixar o seu código fonte, compilar e instalar o software a partir de sua página oficial: http://sourceforge.net/project/showfiles.php?group_id=36274.
Para MacOS, é possível baixar, no site do projeto uma versão apropriada: http://sourceforge.net/projects/mpg321/.

Como usar o mpg321

Segue alguns exemplos de uso, dentre os meus favoritos pro mpg321.
A maneira mais simples de usar é preceder o comando com o nome do arquivo mp3, assim:

mpg321 nome_da_musica.mp3

Para reproduzir todas os arquivos mp3 em um diretório, basta entrar nele e executar o comando assim:

cd Música/
mpg321 *.mp3

Se o diretório contiver todos os álbuns de um determinado artista organizados em vários outros subdiretórios, use a opção de recursividade:

mpg321 -B Música/

— Durante a execução, é possível passar para a música seguinte pressionando as teclas Ctrl + C.
Para encerrar o aplicativo, faça isto 2 vezes seguidas.

Você pode habilitar o teclado, para controlar o aplicativo durante sua execução. Para isto, acrescente a opção -K:

mpg321 -BK Música/

As teclas básicas de controle são as seguintes:

  • * — aumentar o volume;
  • / — diminuir o volume;
  • n — (next) avançar uma música;
  • m — (des)emudecer o aplicativo.

Se você deseja embaralhar as músicas, pode fazer isto de duas formas diferentes:

  • shuffling — Com esta opção, o mpg321 embaralha (mistura) as músicas que você especificou e as joga em uma lista, para ser reproduzida. O aplicativo pára quando termina de tocar a última da lista. Desta forma, nenhuma música vai se repetir, a menos que você peça ou tenha arquivos repetidos em seu repertório.
  • randomize — Toca músicas aleatoriamente, indefinidamente. embora algumas músicas possam se repetir, esta opção te deixa despreocupado em relação ao aplicativo – ele vai tocar enquanto você não o desligar. Esta opção é ótima para ligar um PC de baixo custo ao sistema de som de um estabelecimento.

Como usar o shuffling, combinado com a recursividade e as teclas de controle:

mpg321 -BKz Música/

Como combinar a recursividade, ativação das teclas de controle e o randomize:

mpg321 -BKZ Música/

Para ver mais informações sobre a execução dos arquivos, use o modo verboso:

mpg321 -BKzv Música/

Aumente o ganho ou volume, com -g em 50%:

mpg321 -BKz -g 50 Música/

O número pode variar entre 0 e 100. Esta opção pode ajudar a tirar aquele “algo mais” do som de sua máquina. Tenha bom senso… 😉
Para exibir a música atual na barra de título do seu terminal acrescente -x:

mpg321 -BKzx Música/
mpg321 tocando músicas recursivamente
Clique para ampliar.
SAIBA MAIS:

Palavras finais

O mpg321 surgiu da restritividade da licença proprietária do mpg123. Mesmo sendo distribuído com o código fonte e com uma licença não comercial, esta não permitia que desenvolvedores incorporassem livremente seu código a seus projetos.
A realidade atual é que ambos os softwares são livres e seguem cada qual o seu caminho. Experimente e depois decida qual o seu favorito.
Da minha parte, uso-os alternadamente. Gosto dos dois.
Divirta-se e compartilhe (este artigo, suas músicas etc… )!

Como ouvir mp3 no terminal com o mpg123

O mpg123, é o ideal para quem deseja um player mp3 leve e rápido, pra tocar suas músicas com baixíssimo consumo dos recursos da sua máquina.
Por ser em modo texto e muito simples, é ótimo para quem deseja ouvir músicas ou podcasts, poupando o processador da máquina.
Se você está trabalhando em um PC antigo ou com recursos limitados, vale a pena conhecer este apĺicativo.
mpg123 mp3 player

Download e instalação do mpg123

Por ser leve e ter um código muito enxuto e estável, o programinha roda em qualquer máquina acima de um 486.
Quem usa o Windows, pode fazer o download do programa, no site oficial: http://mpg123.org/download/win32/.
Feito o download, descompacte e execute o mpg123 que se encontra na pasta /bin.
Quem usa o Debian ou uma distro derivada (Ubuntu), pode fazer o download e a instalação com o comando:

sudo apt-get install mpg123

No Redhat ou no SuSE, use o comando yum:

yum install mpg123

Também recomendo baixar o código fonte e compilar o mpg123 — ao contrário do que possa parecer, não é complicado e você pode ter um aplicativo mais enxuto e eficiente pro seu sistema.

Como usar o mpg123

O comando mpg123 é muito simples, mas admite resolver situações das mais complexas, dada a flexibilidade com que ele pode ser usado. A melhor forma de mostrar isto é através de exemplos.
Para reproduzir uma música em mp3, use o comando desta forma:

mpg123 nome_da_musica.mp3

execução de arquivo de áudio mp3 com o o mpg123
Clique para ampliar

Se quiser tocar todas as músicas contidas em uma pasta, use esta sintaxe:

mpg123 Música/*

Você pode acrescentar a opção --loop n para repetir n vezes uma determinada reprodução:

mpg123 --loop 3 Música/* 

No exemplo acima, o player irá repetir a lista de músicas contidas no diretório Música 3 vezes. Se você usar o valor 0, o player irá repetir infinitamente.

Como misturar músicas com o mpg123

Uma das funções mais importantes em um player, para mim, é a de embaralhar as músicas. Posso ouvir um álbum mais de 2 vezes… mas nunca com as faixas tocadas na mesma ordem.
O mpg123, traz duas opções para seus usuários:
A função --shuffle ou -z, embaralha as músicas da sua seleção e cria uma nova lista para ser reproduzida.
Pode ser usada assim:

mpg123 -z Música/

A função --random ou -Z, reproduz todas as músicas que você pediu indefinidamente (até que o programa seja interrompido) de forma aleatória. Com esta opção, é possível que algumas nunca sejam tocadas e outras se repitam. É ótimo para ser usado em estabelecimentos comerciais, quando você pode disponibilizar um computador “obsoleto” só para reproduzir músicas.
O comando funciona assim:

mpg123 -Z Música/

Como usar teclas de controle da reprodução do mpg123

As teclas de controle da reprodução do mpg123 são as seguintes:

  • s ou a barra de espaço – para pausar ou dar continuidade à reprodução atual;
  • f – para pular para próxima música (forward);
  • b – para voltar ao início da música atual (begin);
  • , – (vírgula) para rebobinar
  • . – (ponto) para rodar mais rápido (fast forward);
  • – – para diminuir o volume;
  • + – para aumentar o volume;
  • h – para ver o menu de ajuda com todos os outros comandos possíveis (são muitos). Tecle h de novo para sair do menu de ajuda;
  • q – para sair do programa.

Para ativar as teclas de controle, use a opção -C:

mpg123 -C Música/*

Como executar o mpg123 no modo recursivo

É comum as pessoas criarem um diretório para cada artista e, dentro de cada diretório, um subdiretório para cada álbum – e há álbuns que se subdividem em mais de 2 subdiretórios.
O mpg123, apesar de ter muitos recursos avançados, não tem a opção de recursividade – que lhe permitiria entrar em todos os subdiretórios atrás de arquivos mp3.
Isto não é problema!
Veja como usar o comando find para criar uma lista de todas as músicas existentes no diretório Música/ e em todos os seus subdiretórios:

find Música/ -iname *.mp3 > lista.m3u

Esta declaração faz o seguinte:

  • pesquisa dentro de todos os subdiretórios de Música/, por arquivos que tenham a extensão .mp3;
  • o iname é usado para tornar a pesquisa insensível à caixa das palavras. Desta forma, a pesquisa irá capturar tanto os mp3 quanto os MP3.

Você pode ver o conteúdo da lista assim:

cat lista.m3u

Está tudo lá?! Então ouça suas músicas assim:

mpg123 --list lista.m3u

Se quiser misturar tudo:

mpg123 -z --list lista.m3u

Você pode também fazer tudo isto com apenas uma linha de comando:

find Música/ -iname *.mp3 > lista.m3u | mpg123 -z --list lista.m3u
equalizer - equalizador
Clique, para saber como usar o mpg123 com equalização.
SAIBA MAIS

Os arquivos criados com o comando find como o lista.m3u podem ser lido por outros players, presentes no seu sistema.
Se você quiser saber mais sobre como usar o comando find, leia este artigo.

Usuários com poucos recursos

O mpg123 pode rodar tranquilamente em um 486 – o mantenedor recomenda, no mínimo um Intel 80486DX4 ou um Pentium. Ainda assim, é sabido que a decodificação de áudio é um tanto voraz.
Se estiver com muito pouco recurso de sistema, pode desligar o estéreo:

mpg123 -m nome_da_musica.mp3

Isto vai reduzir a carga sobre a sua CPU, com algum sacrifício na qualidade da reprodução das suas músicas.

Executando mpg123 no servidor

Servidores podem ter muito tempo ocioso, intercalado com picos de atividades – grande número de autenticação de usuários, aumento nas requisições aos bancos de dados etc. O que pode causar paradas na execução da sua música.
Sabemos que a função do servidor, neste caso, não é tocar música pros seus ouvidos, mas você pode evitar interrupções com o aumento do buffer. Neste exemplo, o buffer é definido em 1000 Kb (ou seja, 1 Mb):

mpg123 -b 1000 Música/*

Um buffer deste tamanho, garante a reprodução de pelo menos 6 segundos de áudio, o que costuma ser suficiente.

SAIBA MAIS:

Palavras finais

Enfim, há várias outras opções que podem ser usadas, além das que eu descrevi – consulte a página do manual do programa para conhecê-las. Aqui, eu me limitei às minhas preferidas.
O mpg123, surgido em Junho de 1999, era distribuído sob uma licença não-comercial e com o código fonte. Ainda assim, era software proprietário. Este fato deu impulso ao surgimento de um “clone” 100% livre, chamado mpg321, distribuído sob a licença LGPL.
A partir de 2006, já com um novo mantenedor, uma versão nova do mpg123 foi lançada e distribuída sob a licença GNU LGPL 2.1 – o que já permite a outros desenvolvedores contribuírem livremente para a sua melhoria ou, simplesmente, incorporar seu código a outros projetos.
O mpg321 continua a existir, enquanto projeto paralelo e completamente independente e, com toda certeza, de grande qualidade. Vale a pena conhecê-lo também!
Se você tiver mais alguns exemplos de uso, sinta-se à vontade para postar nos comentários e, se achou o artigo útil, por favor compartilhe com os seus amigos.
Divirta-se!

Samsung Galaxy S3: como iniciar no modo recovery

Quem tem um aparelho destes sabe da quantidade grande de recursos que ele tem. Iniciar o seu aparelho no modo recovery pode ajudar a fazer algumas coisas além do que “foi previsto”, tal como resetar o aparelho.

Para que serve o modo recovery no meu aparelho

Segue a lista das possibilidades apresentadas pelo recovery mode:

  • dar um reset e retornar o aparelho às suas configurações de fábrica – o que apaga todos os seus dados pessoais, permitindo que você passe o aparelho pra frente, sem se preocupar com o uso que será feito dele;
  • apagar o cache e o Dalvik cache;
  • instalar atualizações;
  • instalar ROMs customizadas;
  • formatar ou reformatar partições;
  • ajustar permissões;
  • montar e desmontar partições;
  • conectar o armazenamento USB.

Embora alguns destes recursos possam ter descrições estranhas para você, entrar no modo recovery não é difícil.
Para tanto, siga o procedimento:

  • desligue o aparelho.
  • Ligue-o novamente, pressionando os 3 botões simultaneamente: Power + volume para cima + Home.
  • Para sair e reiniciar normalmente, repita este procedimento ou selecione a opção Reboot.

A opção de reset de fábrica costuma ser a primeira e é, usualmente, o único motivo de usuários comuns entrarem neste modo do seu aparelho Android.

LEIA MAIS:

O procedimento descrito, funciona em vários outros aparelhos, mesmo não sendo da marca Samsung.
Experimente e me conte como foi a sua experiência, nos comentários.

Samsung Galaxy S3: como iniciar em modo de segurança

O Samsung Galaxy SIII tem a possibilidade de entrar em diversos modos, a partir da inicialização. Cada qual tem suas funcionalidades.
O modo de segurança é muito útil, quando se tem uma situação de problemas frequentes ou instabilidades — com a possibilidade de estarem sendo causados por um aplicativo instalado pelo usuário.
Obs.: Se o que você quer é desabilitar o modo de segurança, leia o último tópico abaixo.

  • O modo normal é o que você está sempre usando;
  • O modo de download é o que te permite baixar softwares específicos e dar flash em ROMs e kernels;
  • O modo recovery, que permite dar um reset e retornar o aparelho ao seu estado recém saído da fábrica, apagando dados etc. — se vai passar o seu aparelho para outra pessoa, o modo recovery é o que você quer;
  • Adicionalmente, há um outro modo, do qual vou tratar neste rápido post: o modo de segurança (safe mode).

O que o modo de segurança faz no meu aparelho

Este modo é comumente usado como espaço de trabalho técnico em que uma série de funções são desabilitadas no aparelho para facilitar a identificação de erros — de hardware ou software.
Quando o seu aparelho inicia neste modo, todos os apps instalados são desabilitados — o objetivo disto é determinar se os problemas são causados por algum destes softwares ou pelo sistema operacional.

Como iniciar o meu aparelho no modo de segurança (safe mode)

O procedimento descrito funciona em outros aparelhos Samsung. Portanto, mesmo que o seu aparelho não seja exatamente um S3, vale a pena tentar e ver se rola…
Siga os seguintes passos:

  1. Desligue o aparelho normalmente;
  2. Aguarde alguns segundos;
  3. Ligue o aparelho;
  4. Assim que o logo Samsung aparecer, mantenha pressionada a tecla de volume para baixo, até que o aparelho inicie em Modo de Segurança.

Feito. Você vai saber que está em modo de segurança, pelo aviso que aparece na tela e pela falta de vários ícones de aplicativos que foram desabilitados.

LEIA MAIS:

No modo de segurança, ainda é possível acessar o cartão de memória, ativar o bluetooth e o wi-fi.
Para desativar o modo de segurança e voltar ao normal, basta desligar e ligar o aparelho novamente.

Como sair do modo de segurança persistente

Há situações em que o aparelho fica persistentemente iniciando no modo de segurança e não sai de jeito nenhum.
O vídeo abaixo mostra um passo a passo para resolver este problema:
.