SELECT [STRAIGHT_JOIN]
       [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
       [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] [HIGH_PRIORITY]
       [DISTINCT | DISTINCTROW | ALL]
    expressão_select,...
    [INTO {OUTFILE | DUMPFILE} 'nome_arquivo' opções_exportação]
    [FROM tabelas_ref
      [WHERE definição_where]
      [GROUP BY {inteiro_sem_sinal | nome_col | formula} [ASC | DESC], ...
        [WITH ROLLUP]]
      [HAVING where_definition]
      [ORDER BY {inteiro_sem_sinal | nome_coluna | formula} [ASC | DESC], ...]
      [LIMIT [offset,] row_count | row_count OFFSET offset]
      [PROCEDURE nome_procedimento(lista_argumentos)]
      [FOR UPDATE | LOCK IN SHARE MODE]]
        SELECT é utilizado para retornar registros
        selecionados de uma ou mais tabelas. Cada
        expressão_select indica as colunas que você
        deseja recuperar. SELECT tanbém pode ser
        utilizado para retornar registros calculados sem referência a
        nenhuma tabela. Por exemplo:
      
mysql> SELECT 1 + 1;
         -> 2
        Todas as cláusulas usada devem ser fornecidas exatamente na
        ordem mostrada na descrição da sintaxe. Por exemplo, uma
        cláusula HAVING deve vir depois de qualquer
        cláusula GROUP BY e antes de qualquer
        cláusula ORDER BY.
      
            
            
            Uma expressão SELECT pode utilizar um
            alias usando AS nome_alias. O alias é
            usado como o nome da coluna da expressão e pode ser usado
            com cláusulas ORDER BY ou
            HAVING. Por exemplo:
          
mysql> SELECT CONCAT(primeiro_nome,' ',ultimo_nome) AS nome_completo
    FROM minha_tabela ORDER BY nome_completo;
            A palavra chave AS é opcional quando se
            utiliza alias em uma expressão SELECT. O
            exemplo anterior poderia ser escrito assim:
          
mysql> SELECT CONCAT(last_name,', ',first_name) full_name
    FROM mytable ORDER BY full_name;
            Como AS é opcional, pode ocorrer um
            problema se você esquecer a vírgula entre duas expressões
            SELECT: O MySQL interpretará o segundo
            como um nome de alias. Por exemplo, na seguinte instrução,
            columnb é tratada como um nome de alias:
          
mysql> SELECT columna columnb FROM mytable;
            Não é permitido utilizar um alias de coluna em uma
            cláusula WHERE, pois o valor da coluna
            pode ainda não ter sido determinado quando a cláusula
            WHERE for executada. See
            Secção A.5.4, “Problemas com alias”.
          
            
            
            
            
            
            
            
            A cláusula FROM table_references indica
            a tabela de onde os registros serão retornados. Se você
            indicar mais de uma tabela, você estará realizando uma
            join. Para informações sobre a sintaxe de join, veja
            Secção 6.4.1.1, “Sintaxe JOIN”. Para cada tabela especificada, você
            pode, opcionalmente, especificar um alias.
nome_tabela [[AS] alias] [[USE INDEX (lista_indice)] | [IGNORE INDEX (lista_indice)] | FORCE INDEX (lista_indice)]]
            Como na versão 3.23.12 do MySQL, você pode dar sugestões
            sobre qual índice o MySQL deve usar ao recuperar
            informações de uma tabela. Isto é útil se
            EXPLAIN mostrar que o MySQL esta
            utilizando o índice errado da lista de índices possíveis.
            Especificando USE INDEX (lista_indice)
            você pode dizer ao MySQL para usar somente um dos índices
            possíveis para encontrar registros em uma tabela. A sintaxe
            alternativa IGNORE INDEX (lista_indice)
            pode ser usada para dizer ao MySQL para não utilizar alguns
            índices particulares.
          
            Na versão 4.0.9 do MySQL você também pode usar
            FORCE INDEX. Ele funciona como
            USE INDEX (lista_indice) mas ele assume
            que uma varredura em uma tabelas é MUITO cara. Em outras
            palavras, uma varredura só será usada se não houver
            nenhum modo de utilizar um dos índices dados para encontrar
            registros nas tabelas.
          
            USE/IGNORE/FORCE KEY é sinônimo de
            USE/IGNORE/FORCE INDEX.
          
            Nota:
            USE/IGNORE/FORCE INDEX afeta apenas os
            índices usados quando o MySQL decide como encontrar
            registros na tabela e como fazer a ligação. Ele não tem
            efeito se um índice será usado ao resolver um
            ORDER BY ou GROUP BY.
          
            No MySQL 4.0.14 você pode usar SET
            MAX_SEEKS_FOR_KEY=# como um modo alternativo de
            forçar o MySQL a preferir a busca em chaves em vez de
            varrer a tabela.
          
            Você pode se referir a uma tabela como
            nome_tabela (dentro do banco de dados
            atual) ou como nomebd.nome_tabela para
            especificar um banco de dados. Você pode se referir a um
            coluna como nome_coluna,
            nome_tabela.nome_coluna ou
            nomebd.nome_tabela.nome_coluna. Você
            não precisa especificar um prefixo
            nome_tabla ou
            nomebd.nome_tabela para referência a uma
            coluna em uma instrução SELECT a menos
            a referência seja ambígua. Veja
            Secção 6.1.2, “Nomes de Banco de dados, Tabela, Índice, Coluna e Alias”, para exemplos de ambiguidade
            que exigem a forma mais explicita de referência a coluna.
          
            A partir da versão 4.1.0, você pode especificar
            DUAL como um nome de tabela dummy, em
            situações onde nenhuma tabela for referênciada. Este é
            um recurso puramente para compatibilidade, alguns outros
            servidores exijem esta sintaxe.
          
mysql> SELECT 1 + 1 FROM DUAL;
         -> 2
            
            
            Pode se definir um alias fazendo referência a uma tabela
            utilizando nome_tabela [AS] nome_alias:
          
mysql>SELECT t1.nome, t2.salario FROM funcionarios AS t1, info AS t2->WHERE t1.nome = t2.nome;mysql>SELECT t1.nome, t2.salario FROM funcionarios t1, info t2->WHERE t1.nome = t2.nome;
            Colunas selecionadas para saída podem ser referidas em
            cláusulas ORCER BY e GROUP
            BY usando nomes de colunas, alias de colunas ou
            posições de colunas. As posições de colunas começam com
            1:
          
mysql>SELECT college, region, seed FROM tournament->ORDER BY region, seed;mysql>SELECT college, region AS r, seed AS s FROM tournament->ORDER BY r, s;mysql>SELECT college, region, seed FROM tournament->ORDER BY 2, 3;
            Para ordenar inversamente, adicione a palavra-chave
            DESC (descendente) ao nome da coluna na
            cláusula ORDER BY na qual você está
            ordenando. A ordem padrão é ascedente; ela pode ser
            especificada explicitamente usando a palavra-chave
            ASC.
          
            Na cláusula WHERE, você pode usar
            qualquer uma das funções suportadas pelo MySQL. Exceto
            para funções de agruopamento (resumo) See
            Secção 6.3, “Funções para Uso em Cláusulas SELECT e
      WHERE”.
          
            A cláusula HAVING pode se referir a
            qualquer coluna ou alias definido na
            expressão_select. Ele é aplicado no
            final, pouco antes dos itens serem enviados ao cliente, sem
            otimização. LIMIT é aplicada depois de
            HAVING.) estar na cláusula
            WHERE. Por exemplo, não escreva isto:
          
mysql> SELECT nome_col FROM nome_tabela HAVING nome_col > 0;
Escreva assim:
mysql> SELECT nome_col FROM nome_tabela WHERE nome_col > 0;
Na versão 3.22.5 ou posterior, você também pode escrever consultar desta forma:
mysql>SELECT usuario,MAX(salario) FROM usuarios->GROUP BY usuario HAVING MAX(salario)>10;
Em versões mais antigas, você pode escrever desta forma:
mysql>SELECT usuario,MAX(salario) AS soma FROM usuarios->group by usuario HAVING soma>10;
            As opções DISTINCT,
            DISTINCTROW e ALL
            especificam quando registros duplicados devem ser
            retornados. O padrão é (ALL), todos os
            registros coincidentes são retornados.
            DISTINCT e DISTINCTROW
            são sinônimos e espcificam que registros duplicados no
            conjunto de resultados devem ser remopvidos.
          
            STRAIGHT_JOIN,
            HIGH_PRIORITY e opções começando com
            SQL_ são extensões do MySQL para
            SQL-99.
          
                
                No MySQL 4.1.1, GROUP BY permite um
                modificador WITH ROLLUP. See
                Secção 6.3.7.2, “Modificadores GROUP BY”.
              
                HIGH_PRIORITY dará uma prioridade
                maior ao SELECT do que para uma
                instrução que atualizam uma tabela. Você só deve
                isto para consultas que sejam rápidas e devam ser
                feitas imediatamente. Uma consulta SELECT
                HIGH_PRIORITY retornará se a tabela está
                bloqueada para leitura memsmo se houver uma instrução
                de atualização que estiver esperando a liberação da
                tabela.
              
                SQL_BIG_RESULT pode ser usado com
                GROUP BY ou
                DISTINCT para dizer ao otimizador que
                o conjunto de resultados terá muitas linhas. Neste
                caso, o MySQL usará diretamente tabelas temporarias em
                disco se necessário. O MySQL também irá, neste caso,
                preferir ordenar fazendo uma tabela temporária com um
                cahve nos elementos GROUP BY.
              
                SQL_BUFFER_RESULT força para que o
                resultado seja colocado em uma tabela temporária. Isto
                ajuda o MySQL a liberar as travas de tabelas mais cedo e
                ajudará nos casos onde ele levá muito tempo para
                enviar o conjunto de resultado ao cliente.
              
                SQL_SMALL_RESULT, uma opção
                especifica do MySQL, pode ser usada com GROUP
                BY ou DISTINCT para dizer
                ao otimizador que o conjunto de resultados será
                pequeno. Neste caso, o MySQL usa tabelas temporárias
                rápidas para armazenar a tabela resultante em vez de
                usar ordenação. Na versão 3.23 do MySQL isto não é
                necessário normalmente.
              
                SQL_CALC_FOUND_ROWS (versão 4.0.0 e
                acima) diz ao MySQL para calcular quantas linhas
                haveriam no conjunto de resultados, desconsiderando
                qualquer cláusula LIMIT. O número
                de linhas pode ser recuperado com SELECT
                FOUND_ROWS(). See
                Secção 6.3.6.2, “Funções Diversas”.
              
                Por favor, note que em nversões anteriores a 4.1.0 isto
                não funciona com LIMIT 0, o qual é
                otimizado para retornar instantaneamente (resultando em
                0 registros). See Secção 5.2.9, “Como o MySQL Otimiza Cláusulas LIMIT”.
              
                SQL_CACHE diz ao MySQL para armazenar
                o resultado da consulta em um cache de consultas se
                você estiver utilizando
                QUERY_CACHE_TYPE=2
                (DEMAND). See
                Secção 6.9, “Cache de Consultas do MySQL”. No caso da consulta com
                UNIONs e/ou subqueries esta opção terá efeito se
                usada em qualquer SELECT da consulta.
              
                SQL_NO_CACHE diz ao MySQL para não
                armazenar o resulado da consulta nesta cache de
                consultas. See Secção 6.9, “Cache de Consultas do MySQL”. No caso da
                consulta com UNIONs e/ou subqueries esta opção terá
                efeito se usada em qualquer SELECT da consulta.
              
            
            Se você utiliza GROUP BY, os registros
            de saída serão ordenados de acordo com o GROUP
            BY como se você tivesse um ORDER
            BY sobre todos os campos no GROUP
            BY. O MySQL tem expandido a cláusula
            GROUP BY para que você também possa
            especificar ASC e DESC
            depois das colunas chamadas na cláusula:
          
SELECT a,COUNT(b) FROM tabela_teste GROUP BY a DESC
            O MySQL tem extendido o uso do GROUP BY
            para lhe permitir selecionar campos que não estão
            mencionados na cláusula GROUP BY. Se
            você não está conseguindo os resultados esperados ara a
            sua consulta, leia a descrição de GROUP
            BY. See
            Secção 6.3.7, “Funções e Modificadores para Usar com Cláusulas GROUP
        BY”.
          
            A partir do MySQL 4.1.1, GROUP BY permite
            um modificador WITH ROLLUP. See
            Secção 6.3.7.2, “Modificadores GROUP BY”.
          
            A cláusula LIMIT pode ser usada para
            restringir o número de linhas retornadas pela instrução
            SELECT. LIMIT utiliza
            um ou dois agumebntos numéricos, que devem ser constants
            inteiras.
          
Com um argumento. o valor especifíca o número de linhas para retornar do início do resultado. Com dois argumentos, o primeiro especifica a posição do primeiro registro a ser retornado e o segundo especifica o número máximo de linhas a retornar. A posição do registro inicial é 0 (não 1):
            Para ser compatível com o PostgreeSQL, o MySQL suporta a
            sintaxe: LIMIT row_count OFFSET offset.
          
mysql> SELECT * FROM tabela LIMIT 5,10;  # Recupera linhas 6-15
Para recuperar todos os registros de um determinado offset até um fim do resultado você pode usar um número grande como segundo parâmetro:
mysql> SELECT * FROM tabela LIMIT 95,18446744073709551615; # Recupera linhas 96-ultima.
Se um dos argumentos é dado, ele indica o número máximo de linhas a retornar:
mysql> SELECT * FROM tabela LIMIT 5;     # Recupera as primeiras 5 linhas
            Em outras palavras, LIMIT n é
            equivalente a LIMIT 0,n.
          
            
            A forma SELECT ... INTO OUTFILE
            'nome_arquivo' do SELECT grava
            os registros selecionados em um arquivo. O arquivo é criado
            na máquina servidora e não pode já existir (entre outras
            coisas, isto previne tabelas de banco de dados e arquivos
            tais como /etc/passwd de serem
            destruídos). Você deve ter o privilégio
            FILE na máquina servidora para utilizar
            esta forma de SELECT.
          
            A instrução SELECT ... INTO OUTFILE tem
            como intenção deixar que você descarregue rapidamente um
            tabela de uma máquina servidora. Se você quiser criar o
            arquivo resultante em outra máquina, diferente do servidor,
            você não deve usar SELECT ... INTO
            OUTFILE. Neste caso você deve usar algum programa
            cliente como mysqldump --tab ou
            mysql -e "SELECT..." > outfile para
            gerar o arquivo.
          
            SELECT ... INTO OUTFILE é o complemento
            de LOAD DATA INFILE; a sintaxe para a
            parte opções_exportação de uma
            instrução consiste das mesmas cláusulas
            CAMPOS e LINHAS que
            são usadas com a instrução LOAD DATA
            INFILE. See Secção 6.4.8, “Sintaxe LOAD DATA INFILE”.
          
            No arquivo texto resultante, somente os seguintes coracteres
            são escritos com o caracter ESCAPE BY:
          
                O caracter ESCAPE BY
              
                O primeiro caracter em FIELDS TERMINATED
                BY
              
                O primeiro caracter em LINES TERMINATED
                BY
              
            Adicionalmente, ASCII 0 é convertido
            para ESCAPE BY seguido por 0
            (ASCII 48).
          
            A razão para o mostrado acima é que você
            deve escapar qualquer caracter
            FIELDS TERMINATED BY, ESCAPE
            BY, or LINES TERMINATED BY para
            termos a segurança que o arquivo poderá ser lido de volta.
            É feito escape de ASCII 0 para facilitar
            a visuzlização com alguns paginadores.
          
Como o arquivo resultante não tem que estar em conformidade com a sintaxe SQL, nada mais precisa ser seguido de caraceres de escape.
Aqui segue um exemplo de como se obter um arquivo no formato usado por muitos programas antigos.
SELECT a,b,a+b INTO OUTFILE "/tmp/result.text" FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY "\n" FROM tabela_teste;
            
            Se você utilizar INTO DUMPFILE em vez de
            INTO OUTFILE, o MySQL só irá escrever
            um linha no arquivo, sem nenhum terminador de linha ou
            colunas e sem realizar nenhum processo de escape. Ele é
            útil se você quiser armazenar um valor
            BLOB em um arquivo.
          
            Note que qualuqer arquivo criado por INTO
            OUTFILE e INTO DUMPFILE serão
            escritos por todos os usuários no servidor! A razão é que
            o servidor MySQL não pode criar um arquivo que pertence a
            qualquer um além do usuário que o está executando (você
            nunca deve executar mysqld como
            root). Assim o arquivo tem que poder ser
            gravado por todos para que você possa manipular o seu
            conteúdo.
          
            Uma cláusula PROCEDURE chama um
            procedimento que devia processar os dados em um resultado.
            Para um exemplo, veja Secção 14.3.1, “Análise de Procedimento”.
          
            Se você utilizar FOR UPDATE em um
            mecanismo de armazenamento com locks de páginas ou
            registros, as linhas examinadas serão travadas para escrita
            até o fim da transação atual.
          
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.

