Você está na página 1de 12

25 Exemplos essenciais de comando select do MySQL

Se voc est usando o banco de dados MySQL, essencial que voc esteja confortvel usando o mysql em linha de comando. Neste tutorial explanarei como usar o comando MySQL select com vrios exemplos prticos.

1. Exemplo de comando Select bsico


Primeiro, conecte ao mysql via linha de comando, a partir do prompt de comando do seu sistema operacional. Os exemplos aqui informados so em terminal bash linux.
# mysql -u root -p Password:

Next, view all available databases.


mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | the20commands | | crm | | bugzilla | +--------------------+ 8 rows in set (0.00 sec)

Use o banco de dados que voc quer trabalhar. Neste exemplo, eu estou consultando o banco de dados the20commands, onde a tabela employee est localizada, a qual usada como um exemplo para todos os comandos explanados neste artigo.
mysql> USE the20commands; Database changed mysql> DESC employee;

O uso bsico do comando select visualizar linhas de uma tabela. O seguinte exemplo de comando select exibir todas as linhas da tabela employee.
mysql> SELECT * FROM employee; +-----+--------+------------+--------+ | id | name | dept | salary | +-----+--------+------------+--------+ | 100 | Thomas | Sales | 5000 | | 200 | Jason | Technology | 5500 | | 300 | Sanjay | Technology | 7000 | | 400 | Nisha | Marketing | 9500 | | 500 | Randy | Technology | 6000 |

| 501 | Ritu | Accounting | NULL | +-----+--------+------------+--------+ 6 rows in set (0.01 sec)

Ou, consulte especficas colunas especificando os nomes de colunas (ao invs de * o qual retornar todas as colunas):
mysql> SELECT name, salary FROM employee; +--------+--------+ | name | salary | +--------+--------+ | Thomas | 5000 | | Jason | 5500 | | Sanjay | 7000 | | Nisha | 9500 | | Randy | 6000 | | Ritu | NULL | +--------+--------+ 6 rows in set (0.00 sec)

2. Select from Dual Tabela Virtual


Dual uma tabela virtual. Ela realmente no existe. Mas, voc pode usar esta tabela para executar algumas atividades que no usem tabelas. Por exemplo, voc pode usar select on dual para executar operaes aritmticas como abaixo:
mysql> SELECT 2+3 FROM DUAL; +-----+ | 2+3 | +-----+ | 5| +-----+ 1 row in set (0.00 sec)

Voc tambm pode usar para exibir a data e hora corrente. A funo MySQL now() a similar para sysdate() em Oracle:
mysql> SELECT NOW() FROM DUAL; +---------------------+ | now() | +---------------------+ | 2013-09-09 10:19:21 | +---------------------+ 1 row in set (0.00 sec)

Quando voc no especifica nenhuma tabela, MySQL assumir que voc est usando dual. Os exemplos a seguir so exatamente os mesmo como os acima. Para previnir confuses, eu recomendo que voc use from dual nestas situaes para melhor compreenso e clareza.
mysql> SELECT 2+3; +-----+ | 2+3 | +-----+ | 5|

+-----+ 1 row in set (0.00 sec) mysql> SELECT NOW(); +---------------------+ | now() | +---------------------+ | 2013-09-14 09:16:45 | +---------------------+ 1 row in set (0.00 sec)

3. Condio WHERE bsica com restrio de registros


No lugar de exibir todos os registros de uma tabela, voc tambm pode usar a condio WHERE para exibir somente registros que atendem critrios especficos, como exibidos abaixo:
mysql> SELECT * FROM employee WHERE salary > 6000; +-----+--------+------------+--------+ | id | name | dept | salary | +-----+--------+------------+--------+ | 300 | Sanjay | Technology | 7000 | | 400 | Nisha | Marketing | 9500 | +-----+--------+------------+--------+ 2 rows in set (0.00 sec)

Igual a greater than > voc tambm pode usar less than=, not equal to != :
mysql> SELECT * FROM employee WHERE salary < 6000; mysql> SELECT * FROM employee WHERE salary SELECT * FROM employee WHERE salary >= 6000; mysql> SELECT * FROM employee WHERE salary = 6000; mysql> SELECT * FROM employee WHERE salary != 6000;

4. Encontrando cadeia de caracteres na condio WHERE


O exemplo anterior exibe como restringir registros baseados em condies numricas. Neste exemplo, explano como restringir registros baseados em valores de cadeias de caracteres: O exemplo busca encontrar strings que funcionam como os nmeros usando equal to = como exibido abaixo. Este exemplo exibir todos os empregados que so do departamento de tecnologia.
mysql> SELECT * FROM employee WHERE dept = 'Technology'; +-----+--------+------------+--------+ | id | name | dept | salary | +-----+--------+------------+--------+ | 200 | Jason | Technology | 5500 | | 300 | Sanjay | Technology | 7000 | | 500 | Randy | Technology | 6000 | +-----+--------+------------+--------+ 3 rows in set (0.00 sec)

Por favor, observe que este um caso de comparao que independe de caixa alta ou baixa (insensitive). Ento, o exemplo sequinte exatamente o mesmo que o comando select acima:
mysql> SELECT * FROM employee WHERE dept = 'TECHNOLOGY';

Voc pode tambm usar o != para exibir todos os empregados que no so do departamento de tecnologia como exibido abaixo:
mysql> SELECT * FROM employee WHERE dept != 'TECHNOLOGY';

Voc tambm pode executar buscas parciais de strings (cadeia de caracteres) usando a palavrachave %. O seguinte exemplo exibir todos os empregados cujo ltimo nome comea com John:
mysql> SELECT * FROM employee WHERE name LIKE 'JOHN%';

O prximo exemplo exibir todos os empregados cujos nomes finalizam com Smith:
mysql> SELECT * FROM employee WHERE name LIKE '%SMITH';

Voc tambm pode emitir o smbolo % tanto no incio como no fim da string de consulta. Neste caso, ele pesquisar pela palavra-chave em qualquer lugar da string. O prximo exibir todos os empregados que contm John em qualquer lugar de seus nomes:
mysql> SELECT * FROM employee WHERE name LIKE '%JOHN%';

5. Combinar condio WHERE usando OR e AND


Voc pode tambm usar OR, AND, NOT na condio WHERE para combinar mltiplas condies. O seguinte exemplo exibe todos os empregados que esto no departamento de tecnologia e com salrios maiores ou iguais a 6000. Isto exibir registros somente quando ambas as condies estiverem satisfeitas:
mysql> SELECT * FROM employee WHERE dept = 'TECHNOLOGY' AND salary >= 6000; +-----+--------+------------+--------+ | id | name | dept | salary | +-----+--------+------------+--------+ | 300 | Sanjay | Technology | 7000 | | 500 | Randy | Technology | 6000 | +-----+--------+------------+--------+ 2 rows in set (0.00 sec)

O mesmo que o acima mas usa a condio OR. Ento, exibir registros tantos quantos qualquer das condies forem encontradas:
mysql> SELECT * FROM employee WHERE dept = 'TECHNOLOGY' OR salary >= 6000; +-----+--------+------------+--------+ | id | name | dept | salary | +-----+--------+------------+--------+ | 200 | Jason | Technology | 5500 | | 300 | Sanjay | Technology | 7000 | | 400 | Nisha | Marketing | 9500 | | 500 | Randy | Technology | 6000 | +-----+--------+------------+--------+ 4 rows in set (0.00 sec)

6. Combine valores de coluna usando CONCAT no select


Voc pode usar a funo CONCAT no comando select para combinar valores de mltiplas colunas. O seguinte combina os campos nome e departamento (somente para exibio) como exibido abaixo:

mysql> SELECT ID, CONCAT(NAME, ' FROM ', DEPT) AS NAME, SALARY FROM employee; +-----+------------------------+--------+ | id | name | salary | +-----+------------------------+--------+ | 100 | Thomas from Sales | 5000 | | 200 | Jason from Technology | 5500 | | 300 | Sanjay from Technology | 7000 | | 400 | Nisha from Marketing | 9500 | | 500 | Randy from Technology | 6000 | | 501 | Ritu from Accounting | NULL | +-----+------------------------+--------+ 6 rows in set (0.00 sec)

7. Contar total nmero de registros


Use a funo count(*) no comando select para exibir o nmero total de registros em uma tabela:
mysql> SELECT COUNT(*) FROM employee; +----------+ | count(*) | +----------+ | 6| +----------+ 1 row in set (0.00 sec)

8. Group By no Comando Select


O comando Group By ir agrupar os registros baseados em certas condies. O seguinte exemplo exibe o total de nmeros de empregados em cada departamento:
mysql> SELECT DEPT, COUNT(*) FROM employee GROUP BY DEPT; +------------+----------+ | dept | count(*) | +------------+----------+ | Accounting | 1| | Marketing | 1| | Sales | 1| | Technology | 3| +------------+----------+ 4 rows in set (0.00 sec)

Observe que quando voc usa GROUP BY, voc pode usar certas funes para conseguir uma sada mais compreensiva. No exemplo acima, usamos comando count(*) com group by. Similarmente voc pode usar sum(), avg() etc, quando voc especificar GROUP BY.

9. Usando HAVING com GROUP BY


Quando voc usa GROUP BY, voc pode usar HAVING para restringir certos registros. No exemplo seguinte, exibe somente os departamentos onde o nmero de empregados maior que 1:
mysql> SELECT COUNT(*) AS CNT, DEPT FROM employee GROUP BY DEPT HAVING CNT > 1; +-----+------------+ | CNT | dept |

+-----+------------+ | 3 | Technology | +-----+------------+ 1 row in set (0.00 sec)

10. Definir um Alias usando a palavra-chave AS


No lugar de exibir o nome de coluna como especificado na tabela, voc pode usar um nome de sua escolha usando a palavra-chave AS. No exemplo seguinte, mesmo que o real nome da coluna ID, ele exibido como EMPID:
mysql> SELECT ID AS EMPID, NAME AS EMPNAME, DEPT AS DEPARTMENT FROM employee; +-------+---------+------------+ | EMPID | EMPNAME | DEPARTMENT | +-------+---------+------------+ | 100 | Thomas | Sales | | 200 | Jason | Technology | | 300 | Sanjay | Technology | | 400 | Nisha | Marketing | | 500 | Randy | Technology | | 501 | Ritu | Accounting | +-------+---------+------------+ 6 rows in set (0.00 sec)

Observe que AS opcional. O seguinte exemplo o mesmo que acima:


mysql> SELECT id empid, name empname, dept department FROM employee;

11. Left Join no Comando SELECT


No seguinte exemplo, o comando select combina duas tabelas, employee e department. Para combin-las, usado uma coluna comum entre estas duas tabelas, a coluna dept. A coluna Location exibida da tabela department:
mysql> SELECT employee.*, department.location FROM employee LEFT JOIN department ON ( employee.dept = department.dept ); +-----+--------+------------+--------+----------+ | id | name | dept | salary | Location | +-----+--------+------------+--------+----------+ | 100 | Thomas | Sales | 5000 | USA | | 200 | Jason | Technology | 5500 | USA | | 300 | Sanjay | Technology | 7000 | India | | 400 | Nisha | Marketing | 9500 | India | | 500 | Randy | Technology | 6000 | UK | | 501 | Ritu | Accounting | NULL | USA | +-----+--------+------------+--------+----------+

Voc tambm pode usar o alias do nome da tabela no comando JOIN como abaixo. Neste exemplo, uso E como alias para empoyee e D para department. Isto torna o comando select menor e mais fcil para ler:
mysql> SELECT E.*, d.location FROM employee AS E LEFT JOIN department AS D ON ( e.dept = d.dept );

12. Anlise de Performance usando EXPLAIN


Quando sua consulta select lenta ou o comportamento de uma maneira que voc no est entendendo, use o comando EXPLAIN, o qual exibir informaes adicionais detalhadas que o MySQL est usando internamente para executar a consulta.
mysql> EXPLAIN SELECT E.*, D.LOCATION FROM employee AS E LEFT JOIN DEPARTMENT AS D ON ( E.DEPT = D.DEPT ); +----+-------------+-------+--------+---------------+---------+---------+-----------------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+--------+---------------+---------+---------+-----------------+------+-------+ | 1 | SIMPLE | PS | ALL | NULL | NULL | NULL | NULL | 6| | | 1 | SIMPLE | P | eq_ref | PRIMARY | PRIMARY | 3 | acme.E.dept | 1 | | +----+-------------+-------+--------+---------------+---------+---------+-----------------+------+-------+ 2 rows in set (0.00 sec)

13. Fore o Select da consulta para usar um INDEX


Enquanto executando uma consulta com select e juntando duas tabelas, MySQL decidir como usar qualquer Index da melhor maneira. A seguir so algumas formas de lidar com indices no comando SELECT: USE INDEX (lista_de_indices) Este usar um dos ndices especificados para consultar os registros de uma tabela. IGNORE INDEX (lista_de_indices) este no usar os ndices especificados na consulta dos registros da tabela. FORCE INDEX (nome_do_indice) Este ir forar o MySQL usar o dado indice ainda que o MySQL pense que exista uma forma mais rpida e melhor de consultar os registros. Antes de decidir usar qualquer um dos acima, voc dever realmente entender o impacto destes comandos, assim, se voc no us-los apropriadamente, ir demorar o acesso aos dados. Os seguintes exemplos foram MySQL usar o ndice employee_emp_nm_idx para esta consulta:
mysql> SELECT * FROM employee FORCE INDEX (EMPLOYEE_EMP_NM_IDX) WHERE NAME LIKE 'JOHN%';

Para exibir todos os ndices disponveis em uma tabela particular, use o comando show index. O seguinte exemplo exibe todos os ndices disponveis na tabela employee:
mysql> SHOW INDEX FROM PROFILES; +----------+------------+-------------------------+--------------+-------------+-----------+-------------+----------+--------+------+-----------+---------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | +----------+------------+-------------------------+--------------+-------------+-----------+-------------+----------+--------+------+-----------+---------+ | employee | 0 | PRIMARY | 1 | id |A | 156 | NULL | NULL | | BTREE | | | employee | 0 | employee_emp_nm_idx | 1 | name |A | 156 | NULL | NULL | | BTREE | | +----------+------------+-------------------------+--------------+-------------+-----------+-------------+----------+--------+------+-----------+---------+

14. Classifique registros usando ORDER BY


Observe: desc a abreviao de descendente. Se voc no informar nada, ele ser ascendente. Os seguintes registros sero ordenados na ordem alfabticas baseados na coluna dept:
mysql> SELECT * FROM employee ORDER BY DEPT; +-----+--------+------------+--------+ | id | name | dept | salary | +-----+--------+------------+--------+ | 501 | Ritu | Accounting | NULL | | 400 | Nisha | Marketing | 9500 | | 100 | Thomas | Sales | 5000 | | 200 | Jason | Technology | 5500 | | 300 | Sanjay | Technology | 7000 | | 500 | Randy | Technology | 6000 | +-----+--------+------------+--------+ 6 rows in set (0.01 sec)

Note que por padro a classificao ser pela ordem ascendente. Se voc quer inverter a ordem, especifique a palavra-chave DESC depois de ORDER BY.
mysql> SELECT * FROM employee ORDER BY DEPT DESC; +-----+--------+------------+--------+ | id | name | dept | salary | +-----+--------+------------+--------+ | 200 | Jason | Technology | 5500 | | 300 | Sanjay | Technology | 7000 | | 500 | Randy | Technology | 6000 | | 100 | Thomas | Sales | 5000 | | 400 | Nisha | Marketing | 9500 | | 501 | Ritu | Accounting | NULL | +-----+--------+------------+--------+ 6 rows in set (0.00 sec)

Poder ordenar mltiplas colunas tambm, como abaixo:


mysql> SELECT * FROM employee ORDER BY DEPT, SALARY DESC;

15. Limitar o nmero de registros


Ao invs de exibir todos os registros, voc pode limitar quantos o mysql exibir usando LIMIT como abaixo:
LIMIT start_record, number_of_records

O seguinte exemplo iniciar a partir do registro nmero 0 (que o primeiro registro) e exibir 3 registros a partir dele:
mysql> SELECT * FROM employee LIMIT 0,3; +-----+--------+------------+--------+ | id | name | dept | salary | +-----+--------+------------+--------+ | 100 | Thomas | Sales | 5000 | | 200 | Jason | Technology | 5500 | | 300 | Sanjay | Technology | 7000 | +-----+--------+------------+--------+

3 rows in set (0.00 sec)

Omitindo a informao de inicio, exibir os registros a partir do default 0:


mysql> SELECT * FROM employee LIMIT 3; +-----+--------+------------+--------+ | id | name | dept | salary | +-----+--------+------------+--------+ | 100 | Thomas | Sales | 5000 | | 200 | Jason | Technology | 5500 | | 300 | Sanjay | Technology | 7000 | +-----+--------+------------+--------+ 3 rows in set (0.00 sec)

16. Limitar o nmero de registros com OFFSET


Formato:
LIMIT number_of_records OFFSET start_record

Voc tambm pode usar a palavra OFFSET, onde voc especificar o incio do registro depois da palavra OFFSET. You can also use the keyword OFFSET, where youll specify the start record after the keyword OFFSET. O exemplo seguinte exibir o total de 3 registros. Uma vez que offset especificado como 1, ele ir iniciar a partir do segundo registro:
mysql> SELECT * FROM employee LIMIT 3 OFFSET 1 +-----+--------+------------+--------+ | id | name | dept | salary | +-----+--------+------------+--------+ | 200 | Jason | Technology | 5500 | | 300 | Sanjay | Technology | 7000 | | 400 | Nisha | Marketing | 9500 | +-----+--------+------------+--------+ 3 rows in set (0.00 sec)

17. Exibir valores nicos de uma coluna


Para exibir todos os nicos valores de uma coluna, use DISTINCT. O seguinte exemplo exibir todos os nicos valores de departamento na tabela empregados:
mysql> SELECT DISTINCT DEPT FROM employee; +------------+ | dept | +------------+ | Sales | | Technology | | Marketing | | Accounting | +------------+

18. Soma de todos os valores em uma coluna


Para exibir todos os valores de uma coluna use a funo SUM(). O exemplo a seguir exibir a soma da coluna salrio para todos os empregados que so do departamento de tecnologia:
mysql> SELECT SUM(SALARY) FROM employee WHERE DEPT = 'TECHNOLOGY'; +-------------+ | sum(salary) | +-------------+ | 18500 | +-------------+ 1 row in set (0.01 sec)

19. Mdia de todos os valores em uma coluna


Para obter a mdia de todos os valores de uma coluna, use a funo AVG(). O seguinte exemplo exibe o salrio mdio de cada um em todos os departamentos. Este combina as funes GROUP BY com AVG():
mysql> SELECT DEPT,AVG(SALARY) FROM employee GROUP BY DEPT; +------------+-------------+ | dept | avg(salary) | +------------+-------------+ | Accounting | NULL | | Marketing | 9500.0000 | | Sales | 5000.0000 | | Technology | 6166.6667 | +------------+-------------+ 4 rows in set (0.03 sec)

20. SELECT dentro do comando SELECT


Este exemplo muito simples. No existe razo para fazer desta maneira. Mas lhe mostrar como voc pode usar o comando select. Neste exemplo, AS ACTION d um alias para o comando select da sub consulta. Voc precisa especificar um alias neste exemplo. O ACTION apenas um nome. Voc pode mudar isso para qualquer coisa que gostar:
mysql> SELECT * FROM (SELECT * FROM employee) AS ACTION WHERE ID

21. Salve a consulta para um arquivo


Usando SELECT INTO, voc pode salvar a sada de um comando select para um arquivo. No lugar de exibir a saida na tela, o seguinte comando armazenar a sada do comando select no arquivo /tmp/employee.txt.
mysql> SELECT * INTO OUTFILE '/tmp/employee.txt' FROM employee; Query OK, 6 rows affected (0.00 sec) # cat /tmp/employee.txt 100 Thomas Sales 5000 200 Jason Technology 5500 300 Sanjay Technology 7000

400 500 501

Nisha Marketing 9500 Randy Technology 6000 Ritu Accounting \N

Voc tambm pode gravar a sada em um arquivo delimitado por vrgula especificando o comando FIELDS TERMINATED BY:
mysql> SELECT * INTO OUTFILE '/tmp/employee1.txt' FIELDS TERMINATED BY ',' FROM employee; Query OK, 6 rows affected (0.00 sec) # cat /tmp/employee1.txt 100,Thomas,Sales,5000 200,Jason,Technology,5500 300,Sanjay,Technology,7000 400,Nisha,Marketing,9500 500,Randy,Technology,6000 501,Ritu,Accounting,\N

22. Execute uma Procedure em um arquivo


Voc tambm pode chamar uma procedure MySQL que processar os dados de sada de um comando select O seguinte exemplo executar a procedure salary_report() na sada de um comando select emitido:
mysql> SELECT ID, SALARY FROM employee PROCEDURE SALARY_REPORT();

23. Exibindo um Registro randomicamente de uma tabela


Usando o comando rand voc pode exibir um registro randmico de uma tabela. Isto pode ser til em situaes similares em que voc est exibindo randomicamente de uma tabela:
mysql> SELECT * FROM employee ORDER BY RAND() LIMIT 1; +-----+-------+------------+--------+ | id | name | dept | salary | +-----+-------+------------+--------+ | 200 | Jason | Technology | 5500 | +-----+-------+------------+--------+ 1 row in set (0.00 sec)

O mesmo comando executado outra vez, dar um diferente registro como exibido agora:
mysql> SELECT * FROM employee ORDER BY RAND() LIMIT 1; +-----+--------+-------+--------+ | id | name | dept | salary | +-----+--------+-------+--------+ | 100 | Thomas | Sales | 5000 | +-----+--------+-------+--------+ 1 row in set (0.00 sec)

Voc pode passar a data e hora corrente como intervalo usando a funo now() para o comando rand como abaixo:
mysql> SELECT * FROM employee ORDER BY RAND(NOW()) LIMIT 1; +-----+-------+-----------+--------+ | id | name | dept | salary |

+-----+-------+-----------+--------+ | 400 | Nisha | Marketing | 9500 | +-----+-------+-----------+--------+ 1 row in set (0.00 sec)

24. Comando select de alta prioridade


Quando voc usa high_priority no comando select, lhe dar uma prioridade maior para qualquer update na tabela. Seja cuidadoso quando usar este comando, pois poder tornar outros updates mais lentos. Use isto somente em situaes onde voc pode conseguir um registro muito rapidamente. Certifique-se tambm que o comando select que voc est emitidindo est bem otimizado antes de execut-lo:
mysql> SELECT HIGH_PRIORITY * FROM employee WHERE ID = 100;

25. Consistent Read no comando Select


Se voc quer um consistent read, isto , quando voc est consultando linhas de uma tabela, se voc no quer qualquer dos processos modifiquem os valores, voc precisa disponibilizar um modo de trava quando voc est lendo os registros. Se voc no entende o impacto destas palavras, voc pode por a si mesmo em situaes difieis se voc tentar usar estes em uma tabela grade. O sequinte comando no permitir nenhum outra sesso MySQL modificar os registros que esto sendo consultados por esta declarao select at que ele leia todos os seus registros conforme seu critrio:
mysql> SELECT * FROM employee WHERE ID = 100 LOCK IN SHARE MODE;

Note que voc tamb pode emitir FOR UPDATE como exibido abaixo, o qual ir bloquear outras sesses que tentem fazer SELECT LOCK in SHARE MODE at que esta transao acabe:
mysql> SELECT * FROM employee WHERE ID = 100 FOR UPDATE;