O documento discute o comando SELECT no MySQL, incluindo ordenação de resultados por coluna única ou múltiplas colunas, ordenação por expressões, tratamento de valores nulos e remoção de repetições usando a cláusula DISTINCT. Ele fornece exemplos usando duas tabelas, Produto e t1.
1. MySQL
O comando SELECT
ordenação
Escola Secundária
D. Afonso Sanches
Vila do Conde
Graciano Torrão
( http://gracianotorrao.com )
Programação e Sistemas de Informação
2. Introdução:
Ordenação por uma coluna
Ordenação por várias colunas
Selecção de expressões
Ordenação por posição
Ordenação e NULL
Eliminação de repetições
Graciano Torrão
( http://gracianotorrao.com )
Programação e Sistemas de Informação
3. Tabelas que vamos utilizar como exemplo:
#criar a tabela
CREATE TABLE Produto
(
codigo INT NULL PRIMARY KEY AUTO_INCREMENT,
nome VARCHAR(15) NOT NULL,
preco DECIMAL(4,2) NOT NULL,
stock SMALLINT NOT NULL
) TYPE=InnoDB;
#inserir dados de teste
INSERT INTO Produto (nome, preco, stock) VALUES
('batata', 32.30, 40),
('cenoura', 12, 45),
('laranja', 11.3, 100),
('alho', 1, 12),
('cebola', 1332.50, 5),
('couve', 13.00, 100);
mysql> select * from Produto;
+--------+---------+-------+-------+
| codigo | nome
| preco | stock |
+--------+---------+-------+-------+
|
1 | batata | 32.30 |
40 |
|
2 | cenoura | 12.00 |
45 |
|
3 | laranja | 11.30 |
100 |
|
4 | alho
| 1.00 |
12 |
|
5 | cebola | 99.99 |
5 |
|
6 | couve
| 13.00 |
100 |
+--------+---------+-------+-------+
6 rows in set (0.00 sec)
#criar a tabela
CREATE TABLE t1
(
c1 INT PRIMARY KEY,
c2 VARCHAR(15) NOT NULL,
c3 DECIMAL(4,2) NULL,
c4 INT NULL
) TYPE=InnoDB;
#inserir dados de teste
INSERT INTO t1 VALUES
(3, "joana", 3, 1),
(1, "carla", 3, NULL),
(2, "ana", 4.8, 7),
(6, "maria", 3, NULL),
(4, "catarina", 3, 2),
(5, "margarida", 67.4, NULL),
(7, "isabel", 3.2, 0);
mysql> select * from t1;
+----+-----------+-------+------+
| c1 | c2
| c3
| c4
|
+----+-----------+-------+------+
| 1 | carla
| 3.00 | NULL |
| 2 | ana
| 4.80 |
7 |
| 3 | joana
| 3.00 |
1 |
| 4 | catarina | 3.00 |
2 |
| 5 | margarida | 67.40 | NULL |
| 6 | maria
| 3.00 | NULL |
| 7 | isabel
| 3.20 |
0 |
+----+-----------+-------+------+
7 rows in set (0.00 sec)
Graciano Torrão
( http://gracianotorrao.com )
Programação e Sistemas de Informação
4. Ordenação
Quando estamos a utilizar o comando SELECT e pretendemos obter os resultados organizados
de uma determinada forma, devemos recorrer à cláusula ORDER BY.
A sintaxe do comando SELECT é a seguinte:
SELECT campo1, campo2, campo3, ..., campon, *
FROM tabela1, tabela2, … tabelak
…
[ORDER BY campo [ASC|DESC], campo [ASC|DESC], ...]
Graciano Torrão
( http://gracianotorrao.com )
Programação e Sistemas de Informação
5. Ordenação por uma coluna
Basta indicar na cláusula ORDER BY qual o nome da coluna pela qual pretendemos ordenar os
resultados.
mysql> select * from Produto order by stock;
+--------+---------+-------+-------+
| codigo | nome
| preco | stock |
+--------+---------+-------+-------+
|
17 | cebola | 99.99 |
5 |
|
16 | alho
| 1.00 |
12 |
|
13 | batata | 32.30 |
40 |
|
14 | cenoura | 12.00 |
45 |
|
15 | laranja | 11.30 |
100 |
|
18 | couve
| 13.00 |
100 |
+--------+---------+-------+-------+
6 rows in set (0.00 sec)
mysql> select nome from Produto order by nome asc;
+---------+
| nome
|
+---------+
| alho
|
| batata |
| cebola |
| cenoura |
| couve
|
| laranja |
+---------+
6 rows in set (0.00 sec)
mysql> select * from Produto order by stock;
+--------+---------+-------+-------+
| codigo | nome
| preco | stock |
+--------+---------+-------+-------+
|
17 | cebola | 99.99 |
5 |
|
16 | alho
| 1.00 |
12 |
|
13 | batata | 32.30 |
40 |
|
14 | cenoura | 12.00 |
45 |
|
15 | laranja | 11.30 |
100 |
|
18 | couve
| 13.00 |
100 |
+--------+---------+-------+-------+
6 rows in set (0.00 sec)
mysql> select nome from Produto order by nome desc;
+---------+
| nome
|
+---------+
| laranja |
| couve
|
| cenoura |
| cebola |
| batata |
| alho
|
+---------+
6 rows in set (0.00 sec)
Graciano Torrão
( http://gracianotorrao.com )
Programação e Sistemas de Informação
6. Ordenação por uma coluna
continuação
Exemplos com a tabela t1.
mysql> select * from t1 order by c3 asc;
+----+-----------+-------+------+
| c1 | c2
| c3
| c4
|
+----+-----------+-------+------+
| 1 | carla
| 3.00 | NULL |
| 3 | joana
| 3.00 |
1 |
| 4 | catarina | 3.00 |
2 |
| 6 | maria
| 3.00 | NULL |
| 7 | isabel
| 3.20 |
0 |
| 2 | ana
| 4.80 |
7 |
| 5 | margarida | 67.40 | NULL |
+----+-----------+-------+------+
7 rows in set (0.00 sec)
mysql> select c2 from t1 order by c2;
+-----------+
| c2
|
+-----------+
| ana
|
| carla
|
| catarina |
| isabel
|
| joana
|
| margarida |
| maria
|
+-----------+
7 rows in set (0.00 sec)
mysql> select * from t1 order by c3 desc;
+----+-----------+-------+------+
| c1 | c2
| c3
| c4
|
+----+-----------+-------+------+
| 5 | margarida | 67.40 | NULL |
| 2 | ana
| 4.80 |
7 |
| 7 | isabel
| 3.20 |
0 |
| 1 | carla
| 3.00 | NULL |
| 3 | joana
| 3.00 |
1 |
| 4 | catarina | 3.00 |
2 |
| 6 | maria
| 3.00 | NULL |
+----+-----------+-------+------+
7 rows in set (0.00 sec)
mysql> select c2 from t1 order by c2 desc;
+-----------+
| c2
|
+-----------+
| maria
|
| margarida |
| joana
|
| isabel
|
| catarina |
| carla
|
| ana
|
+-----------+
7 rows in set (0.00 sec)
Graciano Torrão
( http://gracianotorrao.com )
Programação e Sistemas de Informação
7. Ordenação por várias colunas
Quando a ordenação se pretende por mais do que uma coluna, basta ir acrescentanto à cláusula
ORDER BY os nomes das colunas pelos quais se irão fazer as várias subordenações.
mysql> select stock, nome from Produto order by stock, nome;
+-------+---------+
| stock | nome
|
+-------+---------+
|
5 | cebola |
|
12 | alho
|
|
40 | batata |
|
45 | cenoura |
|
100 | couve
|
|
100 | laranja |
+-------+---------+
6 rows in set (0.00 sec)
mysql> select stock, nome from Produto order by stock, nome desc;
+-------+---------+
| stock | nome
|
+-------+---------+
|
5 | cebola |
|
12 | alho
|
|
40 | batata |
|
45 | cenoura |
|
100 | laranja |
|
100 | couve
|
+-------+---------+
6 rows in set (0.00 sec)
Graciano Torrão
( http://gracianotorrao.com )
Programação e Sistemas de Informação
8. Ordenação por várias colunas
continuação
Exemplos com a tabela t1
mysql> select c3, c2 from t1 order by c3, c2;
+-------+-----------+
| c3
| c2
|
+-------+-----------+
| 3.00 | carla
|
| 3.00 | catarina |
| 3.00 | joana
|
| 3.00 | maria
|
| 3.20 | isabel
|
| 4.80 | ana
|
| 67.40 | margarida |
+-------+-----------+
7 rows in set (0.00 sec)
mysql> select c3, c2 from t1 order by c3, c2 desc;
+-------+-----------+
| c3
| c2
|
+-------+-----------+
| 3.00 | maria
|
| 3.00 | joana
|
| 3.00 | catarina |
| 3.00 | carla
|
| 3.20 | isabel
|
| 4.80 | ana
|
| 67.40 | margarida |
+-------+-----------+
7 rows in set (0.00 sec)
Graciano Torrão
( http://gracianotorrao.com )
Programação e Sistemas de Informação
9. Ordenação por expressões
Nem sempre desejamos obter os resultados ordenados a partir de uma coluna existente mas de um
qualquer cálculo que realizamos (expressão).
Nesse caso a ordenação será feita pela coluna resultante da expressão avaliada.
mysql> select nome, stock - codigo from Produto;
+---------+----------------+
| nome
| stock - codigo |
+---------+----------------+
| batata |
27 |
| cenoura |
31 |
mysql> select nome, stock - codigo as expr1 from Produto;
| laranja |
85 |
+---------+-------+
| alho
|
-4 |
| expr1 |
| cebola | nome
|
-12 |
+---------+-------+
| couve
|
82 |
| batata |
27 |
+---------+----------------+
6 rows in | cenoura |
set (0.00 sec) 31 |
select nome, stock - codigo as expr1 from Produto order by expr1;
| laranja mysql>85 |
|
+---------+-------+
| alho
|
-4 |
| cebola || nome
-12 | | expr1 |
| couve +---------+-------+
|
82 |
| cebola
-12 |
+---------+-------+ |
|set (0.00 |sec) -4 |
alho
6 rows in
| batata |
27 |
| cenoura |
31 |
| couve
|
82 |
| laranja |
85 |
+---------+-------+
6 rows in set (0.00 sec)
Graciano Torrão
( http://gracianotorrao.com )
Programação e Sistemas de Informação
10. Ordenação por expressões
continuação
Exemplos com a tabela t1.
mysql> select c3, 2 * c3 as dobro from t1 order by dobro;
+-------+--------+
| c3
| dobro |
+-------+--------+
| 3.00 |
6.00 |
| 3.00 |
6.00 |
| 3.00 |
6.00 |
| 3.00 |
6.00 |
| 3.20 |
6.40 |
| 4.80 |
9.60 |
| 67.40 | 134.80 |
+-------+--------+
7 rows in set (0.00 sec)
mysql> select c1, c2 from t1 order by c1 - c3;
+----+-----------+
| c1 | c2
|
+----+-----------+
| 5 | margarida |
| 2 | ana
|
| 1 | carla
|
| 3 | joana
|
| 4 | catarina |
| 6 | maria
|
| 7 | isabel
|
+----+-----------+
7 rows in set (0.00 sec)
Graciano Torrão
( http://gracianotorrao.com )
Programação e Sistemas de Informação
11. Ordenação e NULL
O tratamento que é dado ao valor NULL varia de sistema para sistema.
Neste caso acontece o seguinte:
mysql> select * from t1;
+----+-----------+-------+------+
| c1 | c2
| c3
| c4
|
+----+-----------+-------+------+
| 1 | carla
| 3.00 | NULL |
| 2 | ana
| 4.80 |
7 |
| 3 | joana
| 3.00 |
1 |
| 4 | catarina | 3.00 |
2 |
| 5 | margarida | 67.40 | NULL |
| 6 | maria
| 3.00 | NULL |
| 7 | isabel
| 3.20 |
0 |
+----+-----------+-------+------+
7 rows in set (0.00 sec)
mysql> select * from t1 order by c4 asc;
+----+-----------+-------+------+
| c1 | c2
| c3
| c4
|
+----+-----------+-------+------+
| 1 | carla
| 3.00 | NULL |
| 5 | margarida | 67.40 | NULL |
| 6 | maria
| 3.00 | NULL |
| 7 | isabel
| 3.20 |
0 |
| 3 | joana
| 3.00 |
1 |
| 4 | catarina | 3.00 |
2 |
| 2 | ana
| 4.80 |
7 |
+----+-----------+-------+------+
7 rows in set (0.00 sec)
mysql> select * from t1 order by c4 desc;
+----+-----------+-------+------+
| c1 | c2
| c3
| c4
|
+----+-----------+-------+------+
| 2 | ana
| 4.80 |
7 |
| 4 | catarina | 3.00 |
2 |
| 3 | joana
| 3.00 |
1 |
| 7 | isabel
| 3.20 |
0 |
| 1 | carla
| 3.00 | NULL |
| 5 | margarida | 67.40 | NULL |
| 6 | maria
| 3.00 | NULL |
+----+-----------+-------+------+
7 rows in set (0.00 sec)
Graciano Torrão
( http://gracianotorrao.com )
Programação e Sistemas de Informação
12. Eliminação de repetições
Por vezes torna-se necessário eliminar as linhas repetidas. Nesses casos recorremos à cláusula
DISTINCT.
mysql> select * from Postal;
+--------+---------------+
| codigo | localidade
|
+--------+---------------+
|
1000 | LISBOA
|
|
1100 | LISBOA
|
|
1200 | LISBOA
|
|
1500 | LISBOA
|
|
2000 | SANTAREM
|
|
2300 | TOMAR
|
|
3000 | COIMBRA
|
|
4000 | PORTO
|
|
4100 | PORTO
|
|
4200 | PORTO
|
|
4480 | VILA DO CONDE |
|
9000 | FUNCHAL
|
+--------+---------------+
12 rows in set (0.01 sec)
mysql> select all localidade
from Postal;
+---------------+
| localidade
|
+---------------+
| LISBOA
|
| LISBOA
|
| LISBOA
|
| LISBOA
|
| SANTAREM
|
| TOMAR
|
| COIMBRA
|
| PORTO
|
| PORTO
|
| PORTO
|
| VILA DO CONDE |
| FUNCHAL
|
+---------------+
12 rows in set (0.00 sec)
mysql> select distinct
localidade from Postal;
+---------------+
| localidade
|
+---------------+
| LISBOA
|
| SANTAREM
|
| TOMAR
|
| COIMBRA
|
| PORTO
|
| VILA DO CONDE |
| FUNCHAL
|
+---------------+
7 rows in set (0.00 sec)
Graciano Torrão
( http://gracianotorrao.com )
Programação e Sistemas de Informação
13. Dúvidas?
Escola Secundária
D. Afonso Sanches
Vila do Conde
Graciano Torrão
13
( graciano.torrao@gmail.com )
( http://gracianotorrao.com )
Programação e Sistemas de Informação