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.