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
SELECTpode utilizar um alias usandoAS nome_alias. O alias é usado como o nome da coluna da expressão e pode ser usado com cláusulasORDER BYouHAVING. Por exemplo:mysql>
SELECT CONCAT(primeiro_nome,' ',ultimo_nome) AS nome_completoFROM 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_nameFROM 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áusulaWHEREfor executada. Leia Seção A.5.4, "Problemas comalias". - A cláusula
FROM table_referencesindica 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
EXPLAINmostrar 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 INDEXafeta 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 BYouGROUP 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_tabelapara especificar um banco de dados. Você pode se referir a um coluna comonome_coluna,nome_tabela.nome_colunaounomebd.nome_tabela.nome_coluna. Você não precisa especificar um prefixonome_tablaounomebd.nome_tabelapara referência a uma coluna em uma instruçãoSELECTa 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
DUALcomo 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 BYeGROUP BYusando 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 BYna 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áusulasSELECTeWHERE". - A cláusula
HAVINGpode 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,DISTINCTROWeALLespecificam quando registros duplicados devem ser retornados. O padrão é (ALL), todos os registros coincidentes são retornados.DISTINCTeDISTINCTROWsão sinônimos e espcificam que registros duplicados no conjunto de resultados devem ser remopvidos. STRAIGHT_JOIN,HIGH_PRIORITYe opções começando comSQL_são extensões do MariaDB para SQL-99.- No MariaDB,
GROUP BYpermite um modificadorWITH ROLLUP. Leia "ModificadoresGROUP BY". HIGH_PRIORITYdará uma prioridade maior aoSELECTdo 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_PRIORITYretornará 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_RESULTpode ser usado comGROUP BYouDISTINCTpara 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_RESULTforç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 BYouDISTINCTpara 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_CACHEdiz 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_CACHEdiz 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 BYcomo se você tivesse umORDER BYsobre todos os campos noGROUP BY. O MariaDB tem expandido a cláusulaGROUP BYpara que você também possa especificarASCeDESCdepois 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 BYpara 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 BYpermite um modificadorWITH ROLLUP. Leia "ModificadoresGROUP BY". - A cláusula
LIMITpode ser usada para restringir o número de linhas retornadas pela instruçãoSELECT.LIMITutiliza 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-15Para 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 linhasEm outras palavras,
LIMIT né equivalente aLIMIT 0,n. - A forma
SELECT ... INTO OUTFILE 'nome_arquivo'doSELECTgrava 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/passwdde serem destruídos). Você deve ter o privilégioFILEna máquina servidora para utilizar esta forma deSELECT.A instrução
SELECT ... INTO OUTFILEtem 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 --taboumysql -e 'SELECT...' > outfilepara gerar o arquivo.SELECT ... INTO OUTFILEé o complemento deLOAD DATA INFILE; a sintaxe para a parteopções_exportaçãode uma instrução consiste das mesmas cláusulasCAMPOSeLINHASque 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 BYseguido por 0 (ASCII 48).A razão para o mostrado acima é que você
deveescapar qualquer caracterFIELDS TERMINATED BY,ESCAPE BY, orLINES TERMINATED BYpara termos a segurança que o arquivo poderá ser lido de volta. É feito escape deASCII 0para 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 DUMPFILEem 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 valorBLOBem um arquivo. - Note que qualuqer arquivo criado por
INTO OUTFILEeINTO DUMPFILEserã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 executarmysqldcomoroot). Assim o arquivo tem que poder ser gravado por todos para que você possa manipular o seu conteúdo. - Uma cláusula
PROCEDUREchama um procedimento que devia processar os dados em um resultado. Para um exemplo, veja "Análise de Procedimento". - Se você utilizar
FOR UPDATEem 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.