O comando SELECT (ordenação)

  • Published on
    09-Jul-2015

  • View
    974

  • Download
    0

Embed Size (px)

Transcript

<p>MySQLO comando SELECT</p> <p>Escola SecundriaD. Afonso SanchesVila do Conde</p> <p>ordenao</p> <p>Ordenao por uma coluna</p> <p>Ordenao por vrias colunas</p> <p>Seleco de expresses</p> <p>Ordenao por posio</p> <p>Ordenao e NULL</p> <p>Eliminao de repeties</p> <p>Introduo:</p> <p>#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;</p> <p>#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);</p> <p>Tabelas que vamos utilizar como exemplo:</p> <p>mysql&gt; 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)</p> <p>#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);</p> <p>mysql&gt; 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)</p> <p>Quando estamos a utilizar o comando SELECT e pretendemos obter os resultados organizados de uma determinada forma, devemos recorrer clusula ORDER BY.</p> <p>Ordenao</p> <p>A sintaxe do comando SELECT a seguinte:</p> <p>SELECT campo1, campo2, campo3, ..., campon, *FROM tabela1, tabela2, tabelak[ORDER BY campo [ASC|DESC], campo [ASC|DESC], ...]</p> <p>Basta indicar na clusula ORDER BY qual o nome da coluna pela qual pretendemos ordenar os resultados.</p> <p>Ordenao por uma coluna </p> <p>mysql&gt; 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)</p> <p>mysql&gt; select nome from Produto order by nome asc;+---------+| nome |+---------+| alho | | batata | | cebola | | cenoura | | couve | | laranja | +---------+6 rows in set (0.00 sec)</p> <p>mysql&gt; 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)</p> <p>mysql&gt; select nome from Produto order by nome desc;+---------+| nome |+---------+| laranja | | couve | | cenoura | | cebola | | batata | | alho | +---------+6 rows in set (0.00 sec)</p> <p>Exemplos com a tabela t1.</p> <p>Ordenao por uma coluna continuao </p> <p>mysql&gt; 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)</p> <p>mysql&gt; select c2 from t1 order by c2;+-----------+| c2 |+-----------+| ana | | carla | | catarina | | isabel | | joana | | margarida | | maria | +-----------+7 rows in set (0.00 sec)</p> <p>mysql&gt; 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)</p> <p>mysql&gt; select c2 from t1 order by c2 desc;+-----------+| c2 |+-----------+| maria | | margarida | | joana | | isabel | | catarina | | carla | | ana | +-----------+7 rows in set (0.00 sec)</p> <p>Quando a ordenao se pretende por mais do que uma coluna, basta ir acrescentanto clusula ORDER BY os nomes das colunas pelos quais se iro fazer as vrias subordenaes.</p> <p>Ordenao por vrias colunas</p> <p>mysql&gt; 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)</p> <p>mysql&gt; 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)</p> <p>Exemplos com a tabela t1</p> <p>Ordenao por vrias colunas continuao </p> <p>mysql&gt; 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)</p> <p>mysql&gt; 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)</p> <p>Nem sempre desejamos obter os resultados ordenados a partir de uma coluna existente mas de um qualquer clculo que realizamos (expresso).Nesse caso a ordenao ser feita pela coluna resultante da expresso avaliada. </p> <p>Ordenao por expresses</p> <p>mysql&gt; 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)</p> <p>mysql&gt; 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)</p> <p>mysql&gt; 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)</p> <p>Exemplos com a tabela t1. </p> <p>Ordenao por expresses continuao </p> <p>mysql&gt; 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)</p> <p>mysql&gt; 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)</p> <p>O tratamento que dado ao valor NULL varia de sistema para sistema.Neste caso acontece o seguinte:</p> <p>Ordenao e NULL</p> <p>mysql&gt; 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)</p> <p>mysql&gt; 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)</p> <p>mysql&gt; 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)</p> <p>Eliminao de repeties</p> <p>mysql&gt; 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)</p> <p>mysql&gt; 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)</p> <p>mysql&gt; select distinct localidade from Postal;+---------------+| localidade |+---------------+| LISBOA | | SANTAREM | | TOMAR | | COIMBRA | | PORTO | | VILA DO CONDE | | FUNCHAL | +---------------+7 rows in set (0.00 sec)</p> <p>Por vezes torna-se necessrio eliminar as linhas repetidas. Nesses casos recorremos clusula DISTINCT.</p> <p>Dvidas?</p> <p>Escola SecundriaD. Afonso SanchesVila do Conde</p> <p>Programao e Sistemas de Informao</p> <p>Graciano Torro( graciano.torrao@gmail.com )</p> <p>Faa clique para editar o formao do texto do ttulo</p> <p>Faa clique para editar o formato do texto do destaqueSegundo nvel de destaqueTerceiro nvel de destaqueQuarto nvel de destaqueQuinto nvel de destaqueSexto nvel de destaqueStimo nvel de destaqueOitavo nvel de destaqueNono nvel de destaque</p> <p>Programao e Sistemas de Informao</p> <p>Graciano Torro</p> <p>( http://gracianotorrao.com )</p>