Como ordenar o resultado de uma consulta no MySQL (Cláusula ORDER BY)

Para você entender melhor este post, você precisa ter uma boa noção de como fazer consultas em uma tabela do MySQL. Sabendo disso, vamos começar a melhorar a nossa consulta, ordenando de acordo com as colunas, sejam ela de forma crescente ou decrescente.

A nossa sintaxe utilizada juntamente com o SELECT é o “ORDER BY“:

SELECT nomedascolunas FROM nomedatabel ORDER BY nomedacoluna ASC/DESC;

Então vamos aos exemplos. Supondo que eu queira fazer uma consulta numa tabela chamada “clientes” e quero pegar somente os nomes e número de telefones deles, mas que seja ordenado pelo nome de forma crescente, ou seja, de A até Z, devemos executar o seguinte SQL:

SELECT nome,telefone FROM `clientes` ORDER BY nome;

Você deve ter percebido que na sintaxe que eu passei, estou informando logo após o nome da coluna para botar ASC ou DESC, mas que não botei neste comando de exemplo. Realmente não botei pelo simples fato de, por padrão, o MySQL já realiza a consulta de forma crescente, mas que não atrapalha em nada você acrescentar o ASC no final do comando, ficando assim:

SELECT nome,telefone FROM `clientes` ORDER BY nome ASC;

O resultado seria esse:

Ana | 1111-1111
André | 3333-3333
Antônio | 2222-2222
Diego | 4444-4444
Diogo | 5555-5555
João | 8888-8888
José | 7777-7777
Maria | 6666-6666
...

Caso a gente queira fazer o inverso na ordenação dos dados, ou seja, fazer a consulta de forma decrescente (de Z até A), devemos utilizar o DESC:

SELECT nome,telefone FROM `clientes` ORDER BY nome DESC;

O resultado seria esse:

Maria
José
João
Diogo
Diego
Antônio
André
Ana
...

Agora que já aprendemos como ordenar uma coluna, vamos ver como faremos para ordenar duas delas.

Suponha que temos a seguinte tabela “FUNCIONÁRIOS”:

  • id_funcionario
  • id_setor
  • nome

Queremos fazer uma consulta para pegar os nomes ordenados de forma crescente, mas separados por setor também de forma crescente pelo id_setor:

SELECT id_setor,nome FROM `funcionarios` ORDER BY `id_setor` ASC,`nome` ASC;

O resultado seria isso:

ID_SETOR | NOME
1 | Antônio
1 | Diego
1 | Marcelo
2 | Maria
2 | Maurício
2 | Ricardo
2 | Tiago
3 | João
3 | José
3 | Tânia
4 | Ana
4 | Antônio
5 | Josefa
5 | Victor

Caso você queira, pode alterar a ordem de cada coluna, elas não precisam ser necessariamente a mesma. Veja outros exemplos:

SELECT id_setor,nome FROM `funcionarios` ORDER BY `id_setor` ASC,`nome` DESC;
SELECT id_setor,nome FROM `funcionarios` ORDER BY `id_setor` DESC,`nome` DESC;
SELECT id_setor,nome FROM `funcionarios` ORDER BY `id_setor` DESC,`nome` ASC;

Espero que tenha sido útil e bem claro nas explicações. Um abraço. Não deixe de comentar e dar seu voto! 🙂

id_setor,nome

Sou bacharel em Sistemas de Informação pela Estácio de Sá (Alagoas), especialista em Gestão Estratégica da Tecnologia da Informação pela Univ. Gama Filho (UGF) e pós-graduando em Gestão da Segurança da Informação pela Univ. do Sul de Santa Catarina (UNISUL). Certificações que possuo: EC-Council CEH, CompTIA (Security+, CySA+ e Pentest+), EXIN (EHF e ISO 27001), MCSO, MCRM, ITIL v3. Tenho interesse por todas as áreas da informática, mas em especial em Gestão e Governança de TI, Segurança da Informação e Ethical Hacking.

11 Responses to “Como ordenar o resultado de uma consulta no MySQL (Cláusula ORDER BY)”

  1. amilton mario disse:

    Bom dia diogo

    entendi muito bem com a sua explicação esta muito clara e simples ,
    agora por favor da-me uma ajuda tenho um formulario simples com nome,telefone,provincia email pretendo que os dados sejam enviados no meu email da gmail , pode me ajudar neste sentido , ja vi muitas dicas não funciona , mas como tu tens umas explicações simples e claras estou confiante que a tua ajuda será boa .

    aguardo tua ajuda

    amilton

    abraço

  2. joannes disse:

    Preciso de uma grande ajuda com php. Sou novo em programação orientado a objetos, com ajuda de algumas pessoas tenho conseguido fazer um site onde trabalho de patrimônio, e tentado seguir umas regras de programação sempre que posso.

    Tenho visto alguns exemplos de como ordenar colunas, mas não consigo colocar no meu, pois tenho procurado seguir conselhos de algumas pessoas na área de PHP e deixado meu site legalzinho, mas não vejo como colocar certo código dentro do meu, que são por meio de referência e parâmetros, mas certas coisas ainda tenho dificuldade ai da que parecer ser pouco, segue abaixo um pouco do meu código.

    em controllers list.php

    query(‘DELETE FROM usuarios WHERE id=’.$id);
    if ($sqli->error) {
    // exibe o erro na tela:
    $msg[]=’Falha ao deletar cadastro: ‘ . $sqli->error . ”;
    } else {
    $msg[]=’Remoção efetuada com sucesso!’;
    }
    }

    // apagar vários
    if (isset($_POST[‘sel’])) {
    $result = $sqli->query(‘DELETE FROM usuarios WHERE id in(‘ . implode(‘, ‘, $_POST[‘sel’]) . ‘)’);
    // verificar se houve algum erro:
    if ($sqli->error) {
    // exibe o erro na tela:
    $msg[]=’Falha ao deletar cadastro: ‘ . $sqli->error . ”;
    }
    }

    $result = $sqli->query(‘SELECT id, nome, email, senha, situacoe_id,niveis_acesso_id,created, modified FROM usuarios order by id’);

    Tentei algumas forma de como ordenar como sugere o artigo Tablesorter: Plugin jQuery para ordenar tabelas, mas não sei como ele não ordena, o código que coloquei esta sem as modificações que fiz.

    Espero que me ajudem, pois ate agora ninguém me deu uma luz sobre isso.

    • Diego Macêdo disse:

      Olá Joannes! Pelo seu SQL, você está ordenando pelo “id” e por padrão ele vai ordenar de forma crescente. Ou seja, de acordo com o que for sendo cadastro na sua tabela, ele vai colocando no final da lista. Se quiser inverter a ordem, altere o SQL assim: “SELECT id, nome, email, senha, situacoe_id,niveis_acesso_id,created, modified FROM usuarios order by id DESC”.

      • joannes disse:

        Bom dia Diego Macêdo, dessa forma eu sei fazer, mas minha chefe pediu para que possa ser feita com clique, em qualquer colunas, não tenho certeza se será feito do lado do servidor ou cliente, talvez seja do lado do servidor, então me dê um help, pois tenho pedido ajuda em outros lugares mas as pessoas não tem me ajudado.

        desde já agradeço

  3. Sefo Assane disse:

    Sou estudante e tenho um trabalho a fazer podem me ajudar.
    O trabalho é o seguinte:

    1. Apresente todos os registros da tabela cliente e
    ordene por nome (a-z);
    2. Apresentar listagem do nome e da cidade de todos
    clientes da província de Zambézia;
    3. Apresentar nome e saldo dos clientes com valores na
    conta entre 10.000,00 e 30.000,00;
    4. Apresentar nome e saldo dos clientes com saldo vais
    elevado do banco;
    5. Apresentação de uma listagem ordenada por nomes
    de clientes, mostrando a relação de contas que cada
    um possui e seus respectivos valores.~
    6. Listagem todas as contas existentes do cliente
    “ISCIM”. Na listagem deve constar o nome do
    cliente, o numero da conta e seu valor
    correspondente.
    7. Apresentar os nomes dos clientes e a data de
    movimento de todas as contas do mês de setembro de
    2015. A listagem deve ser apresentada na ordem
    cronológica de movimento.
    8. Apresentação do nome dos clientes e de todas as
    contas que efectuaram movimento no mês de outubro
    de qualquer ano.

    Muito Obrigado

  4. Wescley disse:

    olá ele orgazina tudo certinho no mysql mais na minha pagina php ainda continua desorganizado poderia me ajudar?

  5. Marcelino disse:

    Muito Obrigado!

  6. Josiane disse:

    Meu problema é o seguinte, eu preciso buscar no banco os últimos X registros.
    Ok, eu coloco um ORDER BY id DESC LIMIT x
    Só que na hora de exibir os resultados, eu preciso apresentá-los na ordem inversa, ou seja, preciso apresentar o resultado na ordem ASC.

    Quando faço um loop com o mysql_fetch_array, os registros aparecem na ordem DESC.

    Se eu fizer a pesquisa na ordem ASC, como preciso apresentar, eu não consigo pegar os últimos registros, mas sim os primeiros.

    Alguma sugestão?

    • Daniel disse:

      Se você tem uma chave primaria com INT em AUTO INCREMENTO faz uma consulta pelo maior id da tabela e faz um WHERE limitando aos últimos registros e usa o ORDER BY id ASC para listar certinho

    • Celso disse:

      SELECT temp.*
      FROM
      (SELECT
      *
      FROM locais
      ORDER BY id_local DESC
      LIMIT 3) as temp
      ORDER BY temp.id_local

Deixe um comentário para amilton mario Cancelar resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *