Sintaxe SELECT
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 usandoAS nome_alias
. O alias é usado como o nome da coluna da expressão e pode ser usado com cláusulasORDER BY
ouHAVING
. 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ãoSELECT
. 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õesSELECT
: O MariaDB 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áusulaWHERE
for executada. Leia Seção A.5.4, "Problemas comalias
". - 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 "SintaxeJOIN
". 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 MariaDB, você pode dar sugestões sobre qual índice o MariaDB deve usar ao recuperar informações de uma tabela. Isto é útil se
EXPLAIN
mostrar que o MariaDB esta utilizando o índice errado da lista de índices possíveis. EspecificandoUSE INDEX (lista_indice)
você pode dizer ao MariaDB para usar somente um dos índices possíveis para encontrar registros em uma tabela. A sintaxe alternativaIGNORE INDEX (lista_indice)
pode ser usada para dizer ao MariaDB para não utilizar alguns índices particulares.Na versão 4.0.9 do MariaDB você também pode usar
FORCE INDEX
. Ele funciona comoUSE 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 deUSE/IGNORE/FORCE INDEX
.Nota:
USE/IGNORE/FORCE INDEX
afeta apenas os índices usados quando o MariaDB decide como encontrar registros na tabela e como fazer a ligação. Ele não tem efeito se um índice será usado ao resolver umORDER BY
ouGROUP BY
.No MariaDB 4.0.14 você pode usar
SET MAX_SEEKS_FOR_KEY=#
como um modo alternativo de forçar o MariaDB 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 comonomebd.nome_tabela
para especificar um banco de dados. Você pode se referir a um coluna comonome_coluna
,nome_tabela.nome_coluna
ounomebd.nome_tabela.nome_coluna
. Você não precisa especificar um prefixonome_tabla
ounomebd.nome_tabela
para referência a uma coluna em uma instruçãoSELECT
a menos a referência seja ambígua. Veja "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
eGROUP 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áusulaORDER BY
na qual você está ordenando. A ordem padrão é ascedente; ela pode ser especificada explicitamente usando a palavra-chaveASC
. - Na cláusula
WHERE
, você pode usar qualquer uma das funções suportadas pelo MariaDB. Exceto para funções de agruopamento (resumo) Leia "Funções para Uso em CláusulasSELECT
eWHERE
". - A cláusula
HAVING
pode se referir a qualquer coluna ou alias definido naexpressão_select
. Ele é aplicado no final, pouco antes dos itens serem enviados ao cliente, sem otimização.LIMIT
é aplicada depois deHAVING
.) estar na cláusulaWHERE
. 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
eALL
especificam quando registros duplicados devem ser retornados. O padrão é (ALL
), todos os registros coincidentes são retornados.DISTINCT
eDISTINCTROW
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 comSQL_
são extensões do MariaDB para SQL-99.- No MariaDB,
GROUP BY
permite um modificadorWITH ROLLUP
. Leia "ModificadoresGROUP BY
". HIGH_PRIORITY
dará uma prioridade maior aoSELECT
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 consultaSELECT 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 comGROUP BY
ouDISTINCT
para dizer ao otimizador que o conjunto de resultados terá muitas linhas. Neste caso, o MariaDB usará diretamente tabelas temporarias em disco se necessário. O MariaDB também irá, neste caso, preferir ordenar fazendo uma tabela temporária com um cahve nos elementosGROUP BY
.SQL_BUFFER_RESULT
força para que o resultado seja colocado em uma tabela temporária. Isto ajuda o MariaDB 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 MariaDB, pode ser usada comGROUP BY
ouDISTINCT
para dizer ao otimizador que o conjunto de resultados será pequeno. Neste caso, o MariaDB usa tabelas temporárias rápidas para armazenar a tabela resultante em vez de usar ordenação. Na versão 3.23 do MariaDB isto não é necessário normalmente.SQL_CALC_FOUND_ROWS
(versão 4.0.0 e acima) diz ao MariaDB para calcular quantas linhas haveriam no conjunto de resultados, desconsiderando qualquer cláusulaLIMIT
. O número de linhas pode ser recuperado comSELECT FOUND_ROWS()
. Leia "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). Leia "Como o MariaDB Otimiza CláusulasLIMIT
".SQL_CACHE
diz ao MariaDB para armazenar o resultado da consulta em um cache de consultas se você estiver utilizandoQUERY_CACHE_TYPE=2
(DEMAND
). Leia "Cache de Consultas do MariaDB". 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 MariaDB para não armazenar o resulado da consulta nesta cache de consultas. Leia "Cache de Consultas do MariaDB". No caso da consulta com UNIONs e/ou subqueries esta opção terá efeito se usada em qualquer SELECT da consulta.
- No MariaDB,
- Se você utiliza
GROUP BY
, os registros de saída serão ordenados de acordo com oGROUP BY
como se você tivesse umORDER BY
sobre todos os campos noGROUP BY
. O MariaDB tem expandido a cláusulaGROUP BY
para que você também possa especificarASC
eDESC
depois das colunas chamadas na cláusula:SELECT a,COUNT(b) FROM tabela_teste GROUP BY a DESC
- O MariaDB tem extendido o uso do
GROUP BY
para lhe permitir selecionar campos que não estão mencionados na cláusulaGROUP BY
. Se você não está conseguindo os resultados esperados ara a sua consulta, leia a descrição deGROUP BY
. Leia "Funções e Modificadores para Usar com CláusulasGROUP BY
". - A partir do MariaDB,
GROUP BY
permite um modificadorWITH ROLLUP
. Leia "ModificadoresGROUP BY
". - A cláusula
LIMIT
pode ser usada para restringir o número de linhas retornadas pela instruçãoSELECT
.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 MariaDB 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 aLIMIT 0,n
. - A forma
SELECT ... INTO OUTFILE 'nome_arquivo'
doSELECT
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égioFILE
na máquina servidora para utilizar esta forma deSELECT
.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 usarSELECT ... INTO OUTFILE
. Neste caso você deve usar algum programa cliente comomysqldump --tab
oumysql -e 'SELECT...' > outfile
para gerar o arquivo.SELECT ... INTO OUTFILE
é o complemento deLOAD DATA INFILE
; a sintaxe para a parteopções_exportação
de uma instrução consiste das mesmas cláusulasCAMPOS
eLINHAS
que são usadas com a instruçãoLOAD DATA INFILE
. Leia "SintaxeLOAD 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 paraESCAPE BY
seguido por 0 (ASCII 48
).A razão para o mostrado acima é que você
deve
escapar qualquer caracterFIELDS TERMINATED BY
,ESCAPE BY
, orLINES TERMINATED BY
para termos a segurança que o arquivo poderá ser lido de volta. É feito escape deASCII 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;
- O caracter
- Se você utilizar
INTO DUMPFILE
em vez deINTO OUTFILE
, o MariaDB 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 valorBLOB
em um arquivo. - Note que qualuqer arquivo criado por
INTO OUTFILE
eINTO DUMPFILE
serão escritos por todos os usuários no servidor! A razão é que o servidor MariaDB não pode criar um arquivo que pertence a qualquer um além do usuário que o está executando (você nunca deve executarmysqld
comoroot
). 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 "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.