Академический Документы
Профессиональный Документы
Культура Документы
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.
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 |
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)
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)
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;
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%';
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)
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)
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.
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 );
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 | | +----------+------------+-------------------------+--------------+-------------+-----------+-------------+----------+--------+------+-----------+---------+
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)
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 | +-----+--------+------------+--------+
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)
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
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)
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;