13
Programação e Sistemas de Informação Programação e Sistemas de Informação Graciano Torrão ( http://gracianotorrao.com ) MySQL MySQL O comando SELECT O comando SELECT Escola Secundária Escola Secundária D. Afonso Sanches D. Afonso Sanches Vila do Conde Vila do Conde ordenação ordenação

O comando SELECT (ordenação)

Embed Size (px)

Citation preview

Page 1: O comando SELECT (ordenação)

Programação e Sistemas de InformaçãoProgramação e Sistemas de Informação

Graciano Torrão( http://gracianotorrao.com )

MySQLMySQLO comando SELECTO comando SELECT

Escola SecundáriaEscola SecundáriaD. Afonso SanchesD. Afonso Sanches

Vila do CondeVila do Conde

ordenaçãoordenação

Page 2: O comando SELECT (ordenação)

Programação e Sistemas de InformaçãoProgramação e Sistemas de Informação

Graciano Torrão( http://gracianotorrao.com )

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

Introdução:Introdução:

Page 3: O comando SELECT (ordenação)

Programação e Sistemas de InformaçãoProgramação e Sistemas de Informação

Graciano Torrão( http://gracianotorrao.com )

#criar a tabelaCREATE 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 testeINSERT 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);

Tabelas que vamos utilizar como exemplo:Tabelas que vamos utilizar como exemplo:

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 tabelaCREATE TABLE t1(

c1 INT PRIMARY KEY,c2 VARCHAR(15) NOT NULL,c3 DECIMAL(4,2) NULL,c4 INT NULL

) TYPE=InnoDB;#inserir dados de testeINSERT 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)

Page 4: O comando SELECT (ordenação)

Programação e Sistemas de InformaçãoProgramação e Sistemas de Informação

Graciano Torrão( http://gracianotorrao.com )

Quando estamos a utilizar o comando SELECT e pretendemos obter os resultados organizados de uma determinada forma, devemos recorrer à cláusula ORDER BY.

OrdenaçãoOrdenação

A sintaxe do comando SELECT é a seguinte:

SELECT campo1, campo

2, campo

3, ..., campo

n, *

FROM tabela1, tabela

2, … tabela

k

[ORDER BY campo [ASC|DESC], campo [ASC|DESC], ...]

Page 5: O comando SELECT (ordenação)

Programação e Sistemas de InformaçãoProgramação e Sistemas de Informação

Graciano Torrão( http://gracianotorrao.com )

Basta indicar na cláusula ORDER BY qual o nome da coluna pela qual pretendemos ordenar os resultados.

Ordenação por uma coluna Ordenação por uma coluna

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)

Page 6: O comando SELECT (ordenação)

Programação e Sistemas de InformaçãoProgramação e Sistemas de Informação

Graciano Torrão( http://gracianotorrao.com )

Exemplos com a tabela t1.

Ordenação por uma coluna Ordenação por uma coluna continuaçãocontinuação

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)

Page 7: O comando SELECT (ordenação)

Programação e Sistemas de InformaçãoProgramação e Sistemas de Informação

Graciano Torrão( http://gracianotorrao.com )

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.

Ordenação por várias colunasOrdenação por várias colunas

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)

Page 8: O comando SELECT (ordenação)

Programação e Sistemas de InformaçãoProgramação e Sistemas de Informação

Graciano Torrão( http://gracianotorrao.com )

Exemplos com a tabela t1

Ordenação por várias colunas Ordenação por várias colunas continuaçãocontinuação

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)

Page 9: O comando SELECT (ordenação)

Programação e Sistemas de InformaçãoProgramação e Sistemas de Informação

Graciano Torrão( http://gracianotorrao.com )

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.

Ordenação por expressõesOrdenação por expressões

mysql> select nome, stock - codigo from Produto;+---------+----------------+| nome | stock - codigo |+---------+----------------+| batata | 27 | | cenoura | 31 | | laranja | 85 | | alho | -4 | | cebola | -12 | | couve | 82 | +---------+----------------+6 rows in set (0.00 sec)

mysql> select nome, stock - codigo as expr1 from Produto;+---------+-------+| nome | expr1 |+---------+-------+| batata | 27 | | cenoura | 31 | | laranja | 85 | | alho | -4 | | cebola | -12 | | couve | 82 | +---------+-------+6 rows in set (0.00 sec)

mysql> select nome, stock - codigo as expr1 from Produto order by expr1;+---------+-------+| nome | expr1 |+---------+-------+| cebola | -12 | | alho | -4 | | batata | 27 | | cenoura | 31 | | couve | 82 | | laranja | 85 | +---------+-------+6 rows in set (0.00 sec)

Page 10: O comando SELECT (ordenação)

Programação e Sistemas de InformaçãoProgramação e Sistemas de Informação

Graciano Torrão( http://gracianotorrao.com )

Exemplos com a tabela t1.

Ordenação por expressões Ordenação por expressões continuaçãocontinuação

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)

Page 11: O comando SELECT (ordenação)

Programação e Sistemas de InformaçãoProgramação e Sistemas de Informação

Graciano Torrão( http://gracianotorrao.com )

O tratamento que é dado ao valor NULL varia de sistema para sistema.Neste caso acontece o seguinte:

Ordenação e NULLOrdenação e NULL

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)

Page 12: O comando SELECT (ordenação)

Programação e Sistemas de InformaçãoProgramação e Sistemas de Informação

Graciano Torrão( http://gracianotorrao.com )

Eliminação de repetiçõesEliminação de repetições

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)

Por vezes torna-se necessário eliminar as linhas repetidas. Nesses casos recorremos à cláusula DISTINCT.

Page 13: O comando SELECT (ordenação)

Programação e Sistemas de InformaçãoProgramação e Sistemas de Informação

Graciano Torrão( http://gracianotorrao.com )

Dúvidas?Dúvidas?

Escola SecundáriaEscola SecundáriaD. Afonso SanchesD. Afonso Sanches

Vila do CondeVila do Conde

13

Programação e Sistemas de InformaçãoProgramação e Sistemas de Informação

Graciano Torrão( [email protected] )