:: DEVELOPER ZONE
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.
© 1995-2005 MySQL AB. All rights reserved.
