Вы находитесь на странице: 1из 27

6.4.1.

Sintaxe SELECT
[+/-]

6.4.1.1. Sintaxe JOIN 6.4.1.2. Sintaxe UNION


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] expresso_select,... [INTO {OUTFILE | DUMPFILE} 'nome_arquivo' opes_exportao] [FROM tabelas_ref [WHERE definio_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 expresso_select indica as colunas que voc deseja recuperar. SELECT tanbm pode

ser utilizado para retornar registros calculados sem referncia a nenhuma tabela. Por exemplo:
mysql> SELECT 1 + 1; -> 2

Todas as clusulas usada devem ser fornecidas exatamente na ordem mostrada na descrio da sintaxe. Por exemplo, uma clusula HAVING deve vir depois de qualquer clusula GROUP BY e antes de qualquer clusula ORDER BY.

Uma expresso SELECT pode utilizar um alias usando AS nome_alias. O alias usado como o nome da coluna da expresso e pode ser usado com clusulas 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 expresso 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 vrgula entre duas expresses SELECT: O MySQL interpretar o segundo como um nome de alias. Por exemplo, na seguinte instruo, columnb tratada como um nome de alias:
mysql> SELECT columna columnb FROM mytable;

No permitido utilizar um alias de coluna em uma clusula WHERE, pois o valor da coluna pode ainda no ter sido determinado quando a clusula WHERE for executada. See Seco A.5.4, Problemas com alias. A clusula FROM table_references indica a tabela de onde os registros sero retornados. Se voc indicar mais de uma tabela, voc estar realizando uma join. Para informaes sobre a sintaxe de join, veja Seco 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 verso 3.23.12 do MySQL, voc pode dar sugestes sobre qual ndice o MySQL deve usar ao recuperar informaes de uma tabela. Isto til se EXPLAIN mostrar que o MySQL esta utilizando o ndice errado da lista de ndices possveis. Especificando USE INDEX (lista_indice) voc pode dizer ao MySQL para usar somente um dos ndices possveis para encontrar registros em uma tabela. A sintaxe alternativa IGNORE INDEX (lista_indice) pode ser usada para dizer ao MySQL para no utilizar alguns ndices particulares. Na verso 4.0.9 do MySQL voc tambm 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 no houver nenhum modo de utilizar um dos ndices dados para encontrar registros nas tabelas.
USE/IGNORE/FORCE KEY sinnimo 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 ligao. Ele no 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 forar 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 no precisa especificar um prefixo nome_tabla ou nomebd.nome_tabela para referncia a uma coluna em uma

instruo SELECT a menos a referncia seja ambgua. Veja Seco 6.1.2, Nomes de Banco de dados, Tabela, ndice, Coluna e Alias, para exemplos de ambiguidade que exigem a forma mais explicita de referncia a coluna. A partir da verso 4.1.0, voc pode especificar DUAL como um nome de tabela dummy, em situaes onde nenhuma tabela for refernciada. 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 referncia 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; WHERE t1.nome = t2.nome;

mysql> SELECT t1.nome, t2.salario FROM funcionarios t1, info t2

Colunas selecionadas para sada podem ser referidas em clusulas ORCER BY e GROUP BY usando nomes de colunas, alias de colunas ou posies de colunas. As posies de colunas comeam com 1:
mysql> SELECT college, region, seed FROM tournament -> -> ->
ORDER BY region, seed; ORDER BY r, s; ORDER BY 2, 3;

mysql> SELECT college, region AS r, seed AS s FROM tournament mysql> SELECT college, region, seed FROM tournament

Para ordenar inversamente, adicione a palavra-chave DESC (descendente) ao nome da coluna na clusula ORDER BY na qual voc est ordenando. A ordem padro ascedente; ela pode ser especificada explicitamente usando a palavrachave ASC.

Na clusula WHERE, voc pode usar qualquer uma das funes suportadas pelo MySQL. Exceto para funes de agruopamento (resumo) See Seco 6.3, Funes para Uso em Clusulas SELECT e WHERE. A clusula HAVING pode se referir a qualquer coluna ou alias definido na expresso_select. Ele aplicado no final, pouco antes dos itens serem enviados ao cliente, sem otimizao. LIMIT aplicada depois de HAVING.) estar na clusula WHERE. Por exemplo, no 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 verso 3.22.5 ou posterior, voc tambm pode escrever consultar desta forma:
mysql> SELECT usuario,MAX(salario) FROM usuarios ->
GROUP BY usuario HAVING MAX(salario)>10;

Em verses mais antigas, voc pode escrever desta forma:


mysql> SELECT usuario,MAX(salario) AS soma FROM usuarios ->
group by usuario HAVING soma>10;

As opes DISTINCT, DISTINCTROW e ALL especificam quando registros duplicados devem ser retornados. O padro (ALL), todos os registros coincidentes so retornados. DISTINCT e DISTINCTROW so sinnimos e espcificam que registros duplicados no conjunto de resultados devem ser remopvidos. STRAIGHT_JOIN, HIGH_PRIORITY e opes comeando com SQL_ so extenses do MySQL para SQL-99. No MySQL 4.1.1, GROUP BY permite um modificador WITH ROLLUP. See Seco 6.3.7.2, Modificadores GROUP BY. HIGH_PRIORITY dar uma prioridade maior ao SELECT do que para uma instruo que atualizam uma tabela. Voc s deve isto para consultas que sejam rpidas e devam ser feitas imediatamente. Uma consulta SELECT HIGH_PRIORITY retornar se a tabela est bloqueada para leitura memsmo se houver uma instruo de atualizao que estiver esperando a liberao 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 necessrio. O MySQL tambm ir, neste caso, preferir ordenar fazendo uma tabela temporria com um cahve nos elementos GROUP BY. SQL_BUFFER_RESULT fora para que o resultado seja colocado em uma tabela temporria. 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 opo 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 temporrias rpidas para armazenar a tabela resultante em vez de usar ordenao. Na verso 3.23 do MySQL isto no necessrio normalmente. SQL_CALC_FOUND_ROWS (verso 4.0.0 e acima) diz ao MySQL para calcular quantas linhas haveriam no conjunto de resultados, desconsiderando qualquer clusula LIMIT. O nmero de linhas pode ser recuperado com SELECT FOUND_ROWS(). See Seco 6.3.6.2, Funes Diversas. Por favor, note que em nverses anteriores a 4.1.0 isto no funciona com LIMIT 0, o qual otimizado para retornar instantaneamente (resultando em 0 registros). See Seco 5.2.9, Como o MySQL Otimiza Clusulas 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 Seco 6.9, Cache de Consultas do MySQL. No caso da

consulta com UNIONs e/ou subqueries esta opo ter efeito se usada em qualquer SELECT da consulta. SQL_NO_CACHE diz ao MySQL para no armazenar o resulado da consulta nesta cache de consultas. See Seco 6.9, Cache de Consultas do MySQL. No caso da consulta com UNIONs e/ou subqueries esta opo ter efeito se usada em qualquer SELECT da consulta. Se voc utiliza GROUP BY, os registros de sada sero 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 clusula GROUP BY para que voc tambm possa especificar ASC e DESC depois das colunas chamadas na clusula:
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 no esto mencionados na clusula GROUP BY. Se voc no est conseguindo os resultados esperados ara a sua consulta, leia a descrio de GROUP BY. See Seco 6.3.7, Funes e Modificadores para Usar com Clusulas GROUP BY. A partir do MySQL 4.1.1, GROUP BY permite um modificador WITH ROLLUP. See Seco 6.3.7.2, Modificadores GROUP BY. A clusula LIMIT pode ser usada para restringir o nmero de linhas retornadas pela instruo SELECT. LIMIT utiliza um ou dois agumebntos numricos, que

devem ser constants inteiras. Com um argumento. o valor especifca o nmero de linhas para retornar do incio do resultado. Com dois argumentos, o primeiro especifica a posio do primeiro registro a ser retornado e o segundo especifica o nmero mximo de linhas a retornar. A posio do registro inicial 0 (no 1): Para ser compatvel 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 nmero grande como segundo parmetro:
mysql> SELECT * FROM tabela LIMIT 95,18446744073709551615; #
Recupera linhas 96-ultima.

Se um dos argumentos dado, ele indica o nmero mximo de linhas a retornar:


mysql> SELECT * FROM tabela LIMIT 5;
linhas # Recupera as primeiras 5

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 mquina servidora e no pode j existir (entre outras coisas, isto previne tabelas de banco de dados e

arquivos tais como /etc/passwd de serem destrudos). Voc deve ter o privilgio FILE na mquina servidora para utilizar esta forma de SELECT. A instruo SELECT ... INTO OUTFILE tem como inteno deixar que voc descarregue rapidamente um tabela de uma mquina servidora. Se voc quiser criar o arquivo resultante em outra mquina, diferente do servidor, voc no 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 opes_exportao de uma instruo consiste das mesmas clusulas CAMPOS e LINHAS que so usadas com a instruo LOAD DATA INFILE. See Seco 6.4.8, Sintaxe LOAD DATA INFILE.

No arquivo texto resultante, somente os seguintes coracteres so 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 razo para o mostrado acima que voc deve escapar qualquer caracter FIELDS TERMINATED BY, ESCAPE BY, or LINES TERMINATED BY para termos a segurana que o arquivo poder ser lido de volta. feito escape de ASCII 0 para facilitar a visuzlizao com alguns paginadores. Como o arquivo resultante no 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 sero escritos por todos os usurios no servidor! A razo que o servidor MySQL no pode criar um arquivo que pertence a qualquer um alm do usurio 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 contedo. Uma clusula PROCEDURE chama um procedimento que devia processar os dados em um resultado. Para um exemplo, veja Seco 14.3.1, Anlise de Procedimento. Se voc utilizar FOR UPDATE em um mecanismo de armazenamento com locks de pginas ou registros, as linhas examinadas sero travadas para escrita at o fim da transao atual.

6.4.3. Sintaxe INSERT


[+/-]

6.4.3.1. Sintaxe INSERT ... SELECT 6.4.3.2. Sintaxe INSERT DELAYED


INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] nome_tabela [(nome_coluna,...)] VALUES ((expresso | DEFAULT),...),(...),... [ ON DUPLICATE KEY UPDATE nome_coluna=expresso, ... ] or INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] nome_tabela [(nome_coluna,...)] SELECT ... or INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] nome_tabela SET nome_coluna=(expresso | DEFAULT), ... [ ON DUPLICATE KEY UPDATE nome_coluna=expresso, ... ]

INSERT insere novos registros em uma tabela existente. A forma INSERT ... VALUES da

instruo insere registros baseado em valores especificados explicitamente. A forma INSERT ... SELECT insere linhas selecionadas de outra(s) tabela(s). A forma INSERT ... VALUES com listas de mltiplos valores suportado a partir da verso 3.22.5. A sintaxe nome_coluna=expresso suportada a partir da vero 3.22.10 do MySQL.
nome_tabela a tabela na qual as linhas sero inseridas. A lista de nome das colunas ou a clusula SET indica para quais colunas a instruo especifica valor:

Se voc no especificar a lista de colunas para INSERT ... VALUES ou INSERT ... SELECT, os valores para todas as colunas na tabela devem ser fornecidos na lista VALUES() ou pelo SELECT. Se voc no souber a ordem das colunas nas tabelas, use DESCRIBE nome_tabela para descobrir. Qualquer coluna que no tiver o valor fornecido explicitamente assumir o seu valor padro. Por exemplo, se voc especificar uma lista de colunas que no definem todas as coolunas na tabela, s colunas no definidas sero atribudos o seu valor padro. Atribuio de valor padro definido em Seco 6.5.3, Sintaxe CREATE TABLE. Voc tambm pode utilizar a palavra-chave DEFAULT para atribuir o valor padro a uma coluna (Novo na verso 4.0.3. do MySQL). Fica mais fcil de se escrever

instrues INSERT que atribuem valor a apenas algumas colunas porque ele permite que voc evite escrever uma lista VALUES() incompleta (uma lista que no inclu um valor para cada coluna da tabela). De outa forma, voc teria que escrever a lista de nomes de colunas correspondentes a cada valor na lista VALUES(). MySQL sempre tem uma valor padro para todos os campos. Isto algo imposto pelo MySQL para estar apto a funcionar com tabelas transacionais e no transcaionais. Nossa viso que a verificao do contedo dos campos deve ser feita pela application and not in the database server.

Uma expresso pode se referir a qualquer coluna que tenha sida definaida anteriormente na lista de valores. Por exemplo, voc pode dizer:
mysql> INSERT INTO nome_tabela (col1,col2) VALUES(15,col1*2);

Mas no:
mysql> INSERT INTO nome_tabela (col1,col2) VALUES(col2*2,15);

Se voc especificar a palavra chave DELAYED, o servidor coloca a linha ou linhas a serem inseridas em um buffer, e o cliente que envia a instruo INSERT DELAYED ento pode contiuar. Se a tabela est ocupada, o servidor guarda a linha. Quando a tabela fica livre, ele comea a inserir linhas, verificando peridicamente para ver se h novos pedidos de leitura para a tabela. Se houver, a fila de linhas atrasadas suspensa at que a tabela fique livre de novo. Se voc especificar a palavra-chave LOW_PRIORITY, a execuo do INSERT atrasada at que nenhum outro cliente esteja lendo a tabela. Isto inclui outros clientes que comeam a ler enquanto clientes existentes j esto lendo e enquanto a instruo INSERT LOW_PRIORITY est esperando. possvel, consequentemente, para um cliente que envia uma instruo INSERT LOW_PRIORITY esperar por um tempo muito longo (ou mesmo para sempre) em um ambiente de muita leitura. ( diferente de INSERT DELAYED, que deixa o cliente continuar de uma vez. See Seco 6.4.3.2, Sintaxe INSERT DELAYED. Note que LOW_PRIORITY no deve normalmente ser usado com tabelas MyISAM ja que elas disabilitam inseres concorrentes. See Seco 7.1, Tabelas MyISAM. Se voc especificar a palavra-chave IGNORE em um INSERT com muitas linhas, quqlquer linha que duplicar uma chave PRIMARY ou UNIQUE existente em uma tabela so ignorados e no so inseridos. Se voc no especificar IGNORE, a insero abortada se houver quqlquer linhq que duplique um valor de uma chave existente. Voc pode determinar com funo mysql_info() da API C quantas linhas foram inseridas nas tabelas. Se voc especificar se uma clusula ON DUPLICATE KEY UPDATE (noca no MySQL 4.1.0), e uma linha que causasse a duplicao de um valor fosse inserida em uma chave PRIMARY ou UNIQUE, um UPDATE da linha antiga seria realizado. Por exemplo, o comando:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3) -> ON DUPLICATE KEY UPDATE c=c+1;

no caso da coluna a ser declarada como UNIQUE e ja existir o valor 1, o exemplo acima seria idntico a
mysql> UPDATE table SET c=c+1 WHERE a=1;

Nota: se a coluna b tambm for nica, o comando UPDATE seria escrito como
mysql> UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;

e se a=1 OR b=2 casasse com diversas linhas, somente uma linha ser atualizada! em geral, deve-se tentar evitar utilizar a clusula ON DUPLICATE KEY em tabelas com mltiplas chaves UNIQUE. Desde o MySQL 4.1.1 pode-se utilizar a funo VALUES(nome_coluna) para se referir ao valor da coluna na parte INSERT do comando INSERT ... UPDATE - que o valor que seria inserido se no houvesse conflitos de chaves duplicadas. Esta funo especialmente til em inseres de mltiplas linhas. Naturalmente a funo VALUES() s tem sentido em um comando INSERT ... UPDATE e retorna NULL no caso de outros comandos. Exemplo:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) -> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

O camondo acima e idntico a


mysql> INSERT INTO table (a,b,c) VALUES (1,2,3) -> ON DUPLICATE KEY UPDATE c=3; mysql> INSERT INTO table (a,b,c) VALUES (4,5,6) -> ON DUPLICATE KEY UPDATE c=9;

A utilizar ON DUPLICATE KEY UPDATE, a opo DELAYED ignorada.

Se MySQL foi configurado usando a opo DONT_USE_DEFAULT_FIELDS, instrues INSERT geram um erro a menos que voc especifique valores explicitamete para todas as colunas que exigem um valor no-NULL. See Seco 2.3.3, Opes tpicas do configure. Voc pode encontrar o valor usado por uma coluna AUTO_INCREMENT com a funo mysql_insert_id. See Seco 12.1.3.32, mysql_insert_id().

Se voc utilizar instrues INSERT ... SELECT ou INSERT ... VALUES com lista de valores mltiplos, voc pode utilizar a funo mysql_info() da API C para obter informao sobre a consulta. O formato da string de informao mostrado aqui:
Records: 100 Duplicates: 0 Warnings: 0 Duplicates indica o nmero de linhas que no puderam ser inseridas porque duplicariam alguns valores de ndices nicos existentes. Warnings indica o nmero de tentativas de

insero de um valor em uma coluna que de alguma forma estava problematico. Avisos (Warnings) podem ocorrer sob qualquer uma das seguintes condies:

Inserir NULL em uma coluna declarada com NOT NULL. A coluna definida com o seu valor padro. Definir uma coluna numrica com um valor que esteja fora da faixa permitida. O valor revertido para final apropriado da faixa. Definir uma coluna numrica com um valor como '10.34 a'. O lixo no final eliminado e a parte numrica restante inserida. Se o valor no fizer sentido como um nmero, atribuido 0 a coluna. Inserir uma string em uma coluna CHAR, VARCHAR, TEXT, ou BLOB e que exceda o tamanho mximo da coluna. O valor truncado para o tamanho mximo da coluna. Inserir um valor em uma coluna date ou time e que seja invlido para o tipo da coluna. A coluna preenchida com o valor de zero apropriado para o tipo.

Uma subquery uma instruo SELECT dentro de outra instruo. Por exemplo:
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);

No exemplo acima, SELECT * FROM t1 ... a consulta principal (ou instruo principal), e (SELECT column1 FROM t2) a subquery. Dizemos que a subquery est aninhada na consulta principal, e de fato possvel aninhar subqueries dentro de outras subqueries, a uma grande profundidade. uma subquery deve estar sempres dentro de parenteses. A partir da verso 4.1. o MySQL suporta todas as formas de subqueries e operaes que o padro SQL exige, assim como alguns recursos que so especificos do MySQL. A principal vantagem das subqueries so:

elas permitem consultas que esto estruturadas assim possvel isolar cada parte de uma instruo, elas fornecem modos alternativos de realizar operaes que, de outra forma, exigiriam joins e unions complexos, elas so, na opinio de muitas pessoas, legveis. De fato, foi a inovao das subqueries que deu s pessoas a idia original do nome SQL ``Structured Query Language''.

Com verses MySQL anteriores era necessrio evitar ou contornar as subqueries, mas as pessoas que comeam a escrever cdigo agora descobriro que subqueries so uma parte muito til do pacote de ferramentas. Aqui est uma instruo exemplo que mostra o ponto principal sobre a sintaxe de subquery como especificado pelo SQL padro e suportado no MySQL.
DELETE FROM t1 WHERE s11 > ANY (SELECT COUNT(*) /* no hint */ FROM t2 WHERE NOT EXISTS (SELECT * FROM t3 WHERE ROW(5*t2.s1,77)=

(SELECT 50,11*s1 FROM t4 UNION SELECT 50,77 FROM (SELECT * FROM t5) AS t5)));

Para as verses do MySQL anteriores a 4.1, a maioria da subqueries podem ser reescritas com sucesso usando join e outros mtodos. See Seco 6.4.2.11, Rewriting Subqueries for Earlier MySQL Versions.

6.4.5. Sintaxe DELETE


DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM table_name [WHERE definio_where] [ORDER BY ...] [LIMIT row_count] ou DELETE [LOW_PRIORITY] [QUICK] [IGNORE] table_name[.*] [, table_name[.*] ...] FROM tabelas-referentes [WHERE definio_where] ou DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM nome_tabela[.*] [, nome_tabela[.*] ...] USING tabelas-referentes [WHERE definio_where] DELETE deleta linhas de nome_tabela que satisfaam a condio dada por definio_where, e retorna o nmero de registros deletados.

Se voc exeecutar um DELETE sem clusula WHERE, todas as linhas so deletadas. Se voc o fizer no modo AUTOCOMMIT, isto ir funcionar como TRUNCATE. See Seco 6.4.6, Sintaxe TRUNCATE. No MySQL 3.23, DELETE sem uma clusula WHERE retornar zero como o nmero de registros afetados. Se voc realmente quiser saber quantos registros so deletados quando voc deletar todas as linhas mesmo sofrendo uma com a queda da velocidade, voc pode utilizar uma instruo DELETE desta forma:
mysql> DELETE FROM nome_tabela WHERE 1>0;

Note que isto muito mais lento que DELETE FROM nome_tabela sem clusula WHERE, pois ele deleta uma linha de cada vez. Se voc especificar a palavra-chave LOW_PRIORITY, a execuo do DELETE atrasda at que nenhum outro cliente esteja lendo da tabela.

Para tabelas MyISAM, Se voc especificar a palavra QUICK, o mecanismo de armazenamento no ir fundir os ndices excludos durante a deleo, o que pode aumentar a velocidade de certos tipos de deleo. A velocidade das operaes de deleo tambm pode ser afetadas pelos fatores discutidos em Seco 5.2.12, Performance das Consultas que Utilizam DELETE. A opo IGNORE faz com que o MySQL ignore todos os erros durente o processo de deleo dos registros. Erros encontrados durante o estgio de anlise so processados da maneira comum. Erros que so ignorados devido ao uso desta opo so retornados como aviso. Esta opo aparece pela primeira vez na verso 4.1.1. Em tabelas MyISAM, registros deletados so mantidos em uma lista encadeada e operes INSERT subsequentes reutilizam posies de registros antigos. Para recuperar espeos no utilizados e reduzir o tamanho do arquivo, utilize a instruo OPTIMIZE TABLE ou o utiliztrio myisamchk para reorganizar as tabelas. OPTIMIZE TABLE mais fcil, mas myisamchk mais rpido. Veja Seco 4.6.1, Sintaxe de OPTIMIZE TABLE e Seco 4.5.6.10, Otimizao de Tabelas. O primeiro formato de delo de multi-tabelas suportado a partir do MySQL 4.0.0. O segundo formato de deleo multi-tabelas suportado a partir do MySQL 4.0.2. A idia que apenas linhas coincidentes da tabelas listadas antes de FROM ou antes da clusula USING so deletadas. O efeito que voc pode deletar l;inhas de muitas tabelas ao mesmo tempo e tambm ter tabelas adicionais que so utilizadas para busca. O .* depois do nome da tabela existe apenas para ser compatvel com o Access:
DELETE t1,t2 FROM t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id ou DELETE FROM t1,t2 USING t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id

No cso acima ns deletamos linhas coincidente apenas na tabela t1 e t2. O exemplo mostra um inner join usando o operador de vrgula, mas instrues UPDATE multi-tabelas podem usar qualquer tipo de join permitida na instruo SELECT, como LEFT JOIN. Se uma clusula ORDER BY utilizada (disponvel no MySQL 4.0.0), as linhas sero deletadas naquela ordem. Isto s til se usado em conjunto com LIMIT. Por exemplo:
DELETE FROM somelog WHERE user = 'jcole' ORDER BY timestamp LIMIT 1

Isto ir deletar as entradas antigas (por timestamp) onde as linhas casam com a clusula WHERE.

A opo especfica do MySQL LIMIT row_count para DELETE diz ao servidor o nmero mximo de linhas a serem deletadas antes do controle retornar ao cliente. Isto pode ser usado para assegurar que uma comando DELETE especfico mo tomar muito tempo, Voc pode simplesmente repetir o comando DELETE at que o nmero de linhas afetadas seja menor que o valor LIMIT. No MySQL 4.0, voc pode especificar mltiplas tabelas na instruo DELETE para deletar linhas de uma ou mais tabelas dependendo de uma condio particular em vrias tabelas. No entanto voc no pode utilizar ORDER BY ou LIMIT em uma multi-tabela DELETE.

6.4.10. Sintaxe DO
DO expresso, [expresso, ...]

Executa a expresso mas no retorna nenhum resultado. Este um modo curto de SELECT expresso, expresso, mas tem a vantagem de ser rpida quando voc no se preocupa com o resultado. Ele til principalmente com funes que tem efeitos em um dos lados, como RELEASE_LOCK.

6.4.4. Sintaxe UPDATE


UPDATE [LOW_PRIORITY] [IGNORE] nome_tabela SET nome_coluna1=expr1 [, nome_coluna2=expr2 ...] [WHERE definio_where] [ORDER BY ...] [LIMIT row_count] ou UPDATE [LOW_PRIORITY] [IGNORE] nome_tabela [, nome_tabela ...] SET nome_coluna1=expr1 [, nome_coluna2=expr2 ...] [WHERE definio_where] UPDATE atualiza uma coluna em registros de tabelas existentes com novos valores. A clusula SET indica quais colunas modificar e os valores que devem ser dados. A clusula WHEREi, se dada, especifica quais linhas devem ser atualizadas. Seno todas as linhas so atualizadas. Se a clusula ORDER BY especificada, as linhas sero atualizada na ordem

especificada. Se voc especificar a palavra-chave LOW_PRIORITY, a execuo de UPDATE e atrasada at que nenhum outro cliente esteja lendo da tabela. Se voc especificar a palavra-chave IGNORE, a instruo no ser abortada memso se ns obtermos erros de chaves duplicadas durante a atualizao. Linhas que causem conflitos no sero atualizadas.

Se voc acessa um coluna de nome_tabela em uma expresso, UPDATE utiliza o valor atual da coluna. Por exemplo, a seguinte instruo define a coluna age com o valor atual mais um:
mysql> UPDATE persondata SET age=age+1;

Atribuioes UPDATE so avaliadas da esquerda para a direitat. Por exemplo, a seguinte instruo dobra a coluna age e ento a incrementa:
mysql> UPDATE persondata SET age=age*2, age=age+1;

Se voc define uma coluna ao valor que ela possui atualmente, o MySQL notar isto no ir atualiz-la.
UPDATE retorna o nmero de linhas que forma realmente alteradas. No MySQL Verso 3.22 ou posterior, a funo mysql_info() da API C retorna o nmero de linhas encontradas e atualizadas e o nmero de avisos que ocorreram durante o UPDATE.

A partir do MySQL verso 3.23, voc pode utilizar LIMIT row_count para restringir o escopo do UPDATE. Uma clusula LIMIT funciona da seguinte forma:

Antes do MySQL 4.0.13, LIMIT uma restrio que afeta as linhas. A instruo para assim que altera row_count linhas que satisfaam a clusula WHERE. Da verso 4.0.13 em diante, LIMIT uma restrio de linhas correspondentes. A instruo para assim que ela encontrar row_count linhas que satisfaam a clusula WHERE, tendo elas sido alteradas ou no.

Se uma clusula ORDER BY utilizada (disponvel no MySQL 4.0.0), as linhas sero atualizadas nesta ordem. Isto s util em conjunto com LIMIT. A partir da MySQL Verso 4.0.4, voc tambm pode realizar operaes UPDATE que cobrem mltiplas tabelas:
UPDATE items,month SET items.price=month.price WHERE items.id=month.id;

O exemplo mostra um inner join usando o operador de vrgula, mas instrues UPDATE multi-tabelas podem usar qualquer tipo de join permitida na instruo SELECT, como LEFT JOIN. Nota: voc no pode utilizar ORDER BY ou LIMIT com multi-tabelas UPDATE.

6.4.6. Sintaxe TRUNCATE


TRUNCATE TABLE nome_tabela

Na verso 3.23 TRUNCATE TABLE mapeada para COMMIT; DELETE FROM table_name. See Seco 6.4.5, Sintaxe DELETE.
TRUNCATE TABLE difere de DELETE FROM ... do seguinte modo:

Operaes truncate apagam e recriam a tabela, o que muito mais rpido que deletar registros um a um. Operaes truncate no so seguras a transao; voc irobter um erro se voc tiver uma transao ativa ou ativar um travamento de tabela. O nmero de linhas apagadas no retornado. Uma vez que o arquivo de definio nome_tabela.frm deja vlido, a tabela pode ser recriada deta forma, mesmo se o arquivo de dados ou de ndice estiver corrompido.

TRUNCATE uma extenso Oracle SQL. Esta instruo foi adicionada no MySQL 3.23.28, embora da verso 3.23.28 a 3.23.32, a palavra chave TABLE deva ser omitida.

6.4.7. Sintaxe REPLACE


REPLACE [LOW_PRIORITY | DELAYED] [INTO] nome_tabela [(nome_coluna,...)] VALUES (expresso,...),(...),... ou REPLACE [LOW_PRIORITY | DELAYED] [INTO] nome_tabela [(nome_coluna,...)] SELECT ... ou REPLACE [LOW_PRIORITY | DELAYED] [INTO] nome_tabela SET nome_coluna=expresso, nome_coluna=expresso,... REPLACE funciona exatamente como o INSERT, exceto que se um registro antigo na tabela tem o mesmo valor que um novo registro em um ndice UNIQUE ou PRIMARY KEY, o

registro antigo deletado antes que o novo registro seja inserido. See Seco 6.4.3, Sintaxe INSERT. Em outras palavras, voc no pode acessar os valores do registro antigo em uma instruo REPLACE. Em algumas verses antigas do MySQL aparentemente voc podia fazer isto, mas era um bug que j foi arrumado. Par aestar apto a utilizar REPLACE voc deve ter privilgios INSERT e DELETE para a tabela. Quando voc utilizar um comando REPLACE, mysql_affected_rows() retornar 2 se a nova linha substituir uma linha antiga. Isto porque uma linha foi inserida depois que a linha duplicada foi deletada. Este fato torna fcil determinar se REPLACE adicionou ou subsitituiu uma linha: verifique se o valor de linhas afetadas 1 (adicionado) ou 2 (substituido). Note que a menos que a tabela utilize ndices UNIQUE ou PRIMARY KEY, utilizar um comando REPLACE replace no faz sentido. Ele se torna equivalente a um INSERT, porque no existe ndice a ser usado para determinar se uma nova linha duplica outra. Seqgue aqui o algoritmo usado em mais detalhes: (Ele tambm usado com LOAD DATA ... REPLACE.

- Insere a linha na tabela - Enquanto ocorrer erro de chave duplicada para chaves primria ou nica - Reverte as chaves alteradas - Le as linha conflitantes da tabela atravs do valor da chave duplicada - Deleta as linhas conflitantes - Tenta inserir o chave primria e nica original na rvore

6.4.8. Sintaxe LOAD DATA INFILE


LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE] INTO TABLE nome_tabela [FIELDS [TERMINATED BY '\t'] [[OPTIONALLY] ENCLOSED BY ''] [ESCAPED BY '\\' ] ] [LINES [STARTING BY ''] [TERMINATED BY '\n'] ] [IGNORE nmero LINES] [(nome_coluna,...)]

A instruo LOAD DATA INFILE l linhas de uma arquivo texto para uma tabela em uma velocidade muito alta. Se a palavra-chave LOCAL especificada, ela interpretada com respeito ao fim da conexo do cliente. Quando LOCAL especificado, o arquivo lido pelo programa cliente na mquina cliente e enviada ao servidor. Se LOCAL no especificada, o arquivo deve estar localizado na mquina servidora e lida diretamente pelo servidor (LOCAL est disponvel no MySQL Verso 3.22.6 ou posterior). Por razes de segurana, ao ler arquivos textos no servidor, os arquivos devem tambm estar no diretrio de banco de dados ou serem lidos por todos. Tambm, para utilizar LOAD DATA INFILE em arquivos do servidor, voc deve ter privilgio FILE na mquina servidora. See Seco 4.3.7, Privilgios Fornecidos pelo MySQL. A partir do MySQL 3.23.49 e MySQL 4.0.2 (4.0.13 no Windows) LOCAL s funcionar se o seu servidor e o seu cliente forem habilitados para permitir isto. Por exemplo so o mysqld foi iniciado com --local-infile=0, LOCAL no ir funcionar. See Seco 4.3.4, Detalhes de Segurana com LOAD DATA LOCAL. Se voc especificar a palavra-chave LOW_PRIORITY, a execuo da instruo LOAD DATA atrasada at nenhum outro cliente estar lendo a tabela. Se voc especificar a palavra-chave CONCURRENT com uma tabela MyISAM, outras threads podem retornar dados da tabela enquanto LOAD DATA est executando. Utilizar esta

opo ir afetar o desempenho de LOAD DATA um pouco, mesmo se nenhuma outra thread utilizar a tabela ao mesmo tempo. Utilizar LOCAL ser um pouco mais lento que deixar o servidor acessar os arquivos diretamente, pois o contedo do arquivo deve ser enviado pela conexo da mquina cliente at a mquina servidora. Por outro lado, voc no precisa de ter o privilgio FILE para carregar arquivos locais. Se voc estiver utilizando uma verso do MySQL anterior a 3.23.24, voc no poder ler de um FIFO com LOAD DATA INFILE. Se voc precisar ler de um FIFO (por exemplo a sada de gunzip), utilize LOAD DATA LOCAL INFILE. Voc tambm pode carregar arquivo de dados utilizado o utilitrio mysqlimport; ele opera enviando um comando LOAD DATA INFILE para o servidor. A opo --local faz com que mysqlimport leia ao arquivo de dados a partir da mquina cliente. Voc pode especificar a opo --compress para conseguir melhor desempenho sobre redes lentas se o cliente e o servidor suportar protocolos compactados. Ao localizar arquivos na mquina servidora, o servidor utiliza as segintes regras:

Se um caminho absoluto dado, o servidor utiliza o caminho desta forma. Se um caminho relativo com um ou mais componentes dados, o servidor busca o arquivo em relao ao diretrio de dados do servidor. Se um nome de arquivo sem nenhum componente dado, o servidor procura pelo arquivo no diretorio de banco de dados do banco de dados atual.

Note que estas regras significam que um arquivo chamado ./myfile.txt lido no diretrio de dados do servidor, enquanto um arquivo chamado myfile.txt l o diretrio de dados do naco de dados atual. Por exemplo, a seguinte instruo LOAD DATA l o arquivo data.txt do diretrio de dados de db1 pois db1 o banco de dados atual, mesmo que a instruo carrega explicitamente o arquivo em uma tabela no banco de dados db2:
mysql> USE db1; mysql> LOAD DATA INFILE "data.txt" INTO TABLE db2.my_table;

As palavras-chave REPLACE e IGNORE controlam o tratamento de entrada de registros que duplicam linhas existentes em valores de chave nica. Se voc especificar REPLACE, as linhas inseridas substituiro as linhas existentes (em outras palavras, linhas que tiverem o mesmo valor de um ndice primrio ou nico como linhas existentes). See Seco 6.4.7, Sintaxe REPLACE. Se voc especificar IGNORE, registros inseridos que duplicam uma linha existente em um valor de chave nica ser ignorados. Se voc no especificar nenhuma das opes, o comportamento depende de se a palavra chave LOCAL especificada ou no. Sem LOCAL, um erro ocorre quando um valor de chave duplicada encontrado, e o resto do arquivo texto ignorado. Com LOCAL o comportamento padro o mesmo de quando IGNORE for especificado, isto porque o servidor no tem como parar no meio da operao. Se voc quiser ignorar as restries de chaves estrangeiras durante a carga voc pode faze SET FOREIGN_KEY_CHECKS=0 antes de executar LOAD DATA.

Se voc utiliza LOAD DATA INFILE em uma tabela MyISAM vazia, todos os ndices nonicos so criados em um batch separado (como em REPAIR). Isto normalmente torna LOAD DATA INFILE muito mais rpido quando voc tem diversos ndices. Normalmente isto muito rpido mas em casos extremos voc pode tornar o ndice mais rpido ainda desligando-os com ALTER TABLE .. DISABLE KEYS e usando ALTER TABLE .. ENABLE KEYS para recriar os ndices. See Seco 4.5.6, Utilizando myisamchk para Manuteno de Tabelas e Recuperao em Caso de Falhas.
LOAD DATA INFILE o complemento de SELECT ... INTO OUTFILE. See Seco 6.4.1, Sintaxe SELECT. Para gravar dados de uma tabela em um arquivo, use SELECT ... INTO OUTFILE. Para ler o arquivo de volta em uma tabela, use LOAD DATA INFILE. A sintaxe das clusulas FIELDS e LINES a mesma para ambos os comandos. Ambas as clusulas so opicionais, mas FIELDS deve preceder LINES se ambos so

especificados. Se voc especificar uma clusula FIELDS, cada uma das subclusulas (TERMINATED BY, [OPTIONALLY] ENCLOSED BY, e ESCAPED BY) tambm so opicionais, exceto pelo fato de que voc deve especificar pelo menos uma delas. Se voc no especificar uma clusula FIELDS, o padro o mesmo que se voc tivesse escrito isto:
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'

Se voc no especificar uma clusula LINES, o padro o mesmo que se voc tivesse escrito isto:
LINES TERMINATED BY '\n'

Nota: Se voc gerou o arquivo texto no Windows, voc deve alterar o mostrado acima para: LINES TERMINATED BY '\r\n' j que o Windows utiliza dois caracteres como um terminador de linha. Alguns programas como wordpad, pode usar \r como terminador de linha. Se todas as linas que voc deseja ler tem um prefixo comum que voc quer saltar, voc pode usar LINES STARTING BY prefix_string. Em outras palavras, o padro faz com que LOAD DATA INFILE funcione da seguinte maneira ao se ler uma entrada:

Procure pelo limite da linha em linhas novas. Se LINES STARTING BY prefix for usado, l at que o prefixo seja encontrado e comea a ler o caracter seguinte ao prefixo. Se a linha no inclui o prefico e;a ser saltada. Quebre a linha em campos na tabulaes. No espere que os campos estejam entre aspas. Interprete a ocorrncia de tabulaes, novas linhas ou \ precedidos por \ como caracteres literias que so parte dos valores dos campos.

Inversamente, os padres fazem SELECT ... INTO OUTFILE funcionar da seguinte forma ao escrever as sadas:

Escreva tabulaes entre os campos. No coloque campos entre aspas. Utilize \ para considerar como parte dos campos instncias de tabulao, nova linha ou \ que estejam dentro dos valores dos campos. Escreva novas linhas no fim de cada linha.

Note que para escrever FIELDS ESCAPED BY '\\', voc deve especificar duas barras invertidas para que o valor seja lido como uma nica barra invertida. A opo IGNORE nmero LINES pode ser utilizado para ignorar linhas no inicio do arquivo. Por exemplo, voc pode usar IGNORE 1 LINES para saltar uma linha de cabealho contendo nomes de colunas:
mysql> LOAD DATA INFILE "/tmp/file_name" INTO TABLE test IGNORE 1 LINES;

Quando voc utiliza SELECT ... INTO OUTFILE em conjunto com LOAD DATA INFILE para escrever os dados de um banco de dados em um arquivo e ento ler o arquivo de volta no banco de dados posteriormente, as opes para tratamento de linhas e campos para ambos os comandos devem coincidir. Seno, LOAD DATA INFILEno ir interpretar o contedo do arquivo de forma apropriada. Suponha que voc utilize SELECT ... INTO OUTFILE para escrever um arquivo com os campos separados por vrgulas:
mysql> SELECT * INTO OUTFILE 'data.txt' -> ->
FIELDS TERMINATED BY ',' FROM ...;

Para ler o arquivo delimitado com vrgula de volta, a instruo correta seria:
mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2 ->
FIELDS TERMINATED BY ',';

Se voc tentasse ler do arquivo com a instruo abaixo, no iria funcionar pois ela instrui LOAD DATA INFILE a procurar por tabulaes entre campos:
mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2 ->
FIELDS TERMINATED BY '\t';

O resultado desejado que cada linha de entrada fosse interpretada como um nico campo.
LOAD DATA INFILE pode ser usado para ler arquivos obtidos de fontes externas. Por

exemplo, um arquivo no formato dBASE ter campos separados por vrgulas e entre aspas duplas. Se as linhas no arquivo so terminadas por com uma nova linha, o comando mostardo aqui ilustra as opes do tratamento de campos e linhas que voc usaria pra carregar o arquivo. the file:
mysql> LOAD DATA INFILE 'data.txt' INTO TABLE nome_tabela -> ->
FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';

Qualquer uma das opes de tratamento de campos e linhas podem especificar uma string vazia (''). Se no for vazio, os valores de FIELDS [OPTIONALLY] ENCLOSED BY e FIELDS ESCAPED BY devem ser um caracter simples. Os valores de FIELDS TERMINATED BY e LINES TERMINATED BY podem ser mais de uma caracter. Por exemplo, para escrever linhas terminadas pelos par retorno de carro/alimentao de linha, ou para ler um arquivo contendo tais linhas, especifique uma clusula LINES TERMINATED BY '\r\n'. Por exemplo, para ler um arquivo de piadas, que so separadas com uma linha de %%, em uma tabela SQL, voc pode fazer:
CREATE TABLE jokes (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, joke TEXT NOT NULL); LOAD DATA INFILE "/tmp/jokes.txt" INTO TABLE jokes FIELDS TERMINATED BY "" LINES TERMINATED BY "\n%%\n" (joke); FIELDS [OPTIONALLY] ENCLOSED BY controla a citao dos campos. Para saida (SELECT ... INTO OUTFILE), se voc omitir a palavra OPTIONALLY, todos os campos estaro entra o caracter ENCLOSED BY. Um exemplo de tal sada (usando vrgula como

delimitador de campo) mostrado abaixo:


"1","a string","100.20" "2","a string containing a , comma","102.20" "3","a string containing a \" quote","102.20" "4","a string containing a \", quote and comma","102.20"

Se voc especificar OPTIONALLY, o caracter ENCLOSED BY s usados para delimitar campos CHAR e VARCHAR:
1,"a string",100.20 2,"a string containing a , comma",102.20 3,"a string containing a \" quote",102.20 4,"a string containing a \", quote and comma",102.20

Note que a ocorrncia de caracter ENCLOSED BY dentro do valor do campo indicado colocando um caracter ESCAPED BY antes dele. Note tambm que se voc especificar um valor ESCAPED BY vazio, possvel gerar sadas que no podero ser lidas aprorpiadamente por LOAD DATA INFILE. Por exemplo, a sada mostrada seria apareceria como a seguir se o caracter de escape fosse vazio. Observe que o segundo campo na quarta linha contm uma vrgula seguida de aspas, o que (erroneamente) parece terminar o campo:
1,"a string",100.20 2,"a string containing a , comma",102.20 3,"a string containing a " quote",102.20 4,"a string containing a ", quote and comma",102.20

Para entrada, o caracter ENCLOSED BY, se presente, ser eliminado do fim dos valores dos campos. (Isto verdade se OPTIONALLY for especificado; OPTIONALLY no tem efeito na

interpretao da entrada). A ocorrncia de caracteres ENCLOSED BY precedido pelo caracter ESCAPED BY so interpretados como parte do campo atual. Se o campo comea com o caracter ENCLOSED BY, instncias daquele caracter so reconhecidos como terminao de um valor do campo apenas se seguido pelo campo ou sequncia de linah TERMINATED BY. Para evitar ambiguidade, ocorrncias do caracter ENCLOSED BY dentro de um valor de campo pode ser duplicado e ser interpretado como uma nica instncia do caracter. Por exemplo, se ENCLOSED BY '"' for especificado, aspas sero tratadas como mostrado abaixo:
"The ""BIG"" boss" The "BIG" boss The ""BIG"" boss -> The "BIG" boss -> The "BIG" boss -> The ""BIG"" boss

FIELDS ESCAPED BY controla como escrever ou ler caracteres especiais. Se o caracter FIELDS ESCAPED BY no estivaer vazio, ele ser usado para preceder o seguinte caracter

de sada:

O caracter FIELDS ESCAPED BY O caracter FIELDS [OPTIONALLY] ENCLOSED BY O primeiro caracter dos valores FIELDS TERMINATED BY e LINES TERMINATED
BY

ASCII 0 (o que escrito seguido de um caracter de escape ASCII '0', no o byte de valor zero).

Se o caracter FIELDS ESCAPED BY estiver vazio, nenhum caracter ser ``escapado''. Provavelmente no uma boa idia especificar um caracter de escape vazio, principalmente se os valores dos campos em seus conter qualquer caracter na lista dada. Para entradas, se o caracter FIELDS ESCAPED BY no estiver vazio, as ocorrncias daquele caracter so eliminadas e o caracter seguinte tomado como parte do valor do campo. As excees so um 0 ou N ``escapado'' (por exemplo, \0 ou \N se o caracter de escape for \). Estas sequencias so interpretadas como os ASCII 0 (um byte de valor zero) e NULL. Veja abaixo as regras no tratamento de NULL. Para maiores informaes sobre a sintaxe \-escape, veja Seco 6.1.1, Literais: Como Gravar Strings e Numerais. Em certos casos, as opes de tratamento de campoe e linhas se interagem:

Se LINES TERMINATED BY uma string vazia e FIELDS TERMINATED BY no vazio, as linhas tambm sero terminadas com FIELDS TERMINATED BY. Se os valores FIELDS TERMINATED BY e FIELDS ENCLOSED BY so ambos vazios (''), um formato de linha de tamanhos fixos (sem delimitadores) utilizada. Com formato de linhas de tamanho fixo, nenhum deliitador usado entre os campos (mas voc ainda pode ter um terminador de linha). Valores de colunas so escritos e lidos usando o tamanho definido das colunas. Por exemplo, se uma coluna declarada como INT(7), os valores das colunas so escritos utilizando campos de 7 caracteres. Na sada, os valores das colunas so obtidos lendo 7 caracteres.

LINES TERMINATED BY ainda usado para separar linhas. Se uma linha no

contm todos os campos, o resto dos campos sero configurados com o seu valor padro. Se voc no tiver um terminador de linha, voc deve defini-lo com ''. Neste caso o arquivo texto deve conter todos os campos para cada linha. O formato de linhas de tamanho fixo tambm afetam o tratamento de valores NULL; veja abixo. Note que este formato no funciona se voc estiver utilizando um conjunto de caracteres mulyi-byte. O tratamento do valor NULL varia, dependendo das opes de FIELDS e LINES que voce usar:

Para os valores FIELDS e LINES padres, NULL escrito como \N para sada e \N lido como NULL para as entradas (assumindo que o caracter ESCAPED BY \). Se FIELDS ENCLOSED BY no for vazio, um campo contendo a palavra literal NULL como seu valor lido como um valor NULL (isto difere da palavra NULL entre os caracteres FIELDS ENCLOSED BY, a qual lida como a string 'NULL'). Se FIELDS ESCAPED BY for vazio, NULL escrito como a palavra NULL. Com os formatos de tamanho fixos (que acontecem quando FIELDS TERMINATED BY e FIELDS ENCLOSED BY estiverem ambos vazios), NULL escrito como uma string vazia. Note que isto faz com que os valores NULL e uma string vazia na tabela sero indistingveis quando escritas no arquivo pois elas so ambas escritas como strings vazias. Se voc precisar estar saber diferenciar as duas ao ler o arquivo de volta, voc no deve utilizar o formato de tamanho fixo.

Alguns casos no so suportados por LOAD DATA INFILE:


Linhas de tamanho fixo (FIELDS TERMINATED BY e FIELDS ENCLOSED BY vazios) e colunas BLOB ou TEXT. Se voc especificar um separador que igual ao prefixo do outro, LOAD DATA INFILE no poder interpretar a entratada apropriadamente. Por exemplo, a seguinte clusula FIELDS causaria problemas:
FIELDS TERMINATED BY '"' ENCLOSED BY '"' Se FIELDS ESCAPED BY estiver vazio, um valor de campo que contm uma ocorrncia de FIELDS ENCLOSED BY ou LINES TERMINATED BY seguido por valores FIELDS TERMINATED BY far com que LOAD DATA INFILE pare de ler um campo ou linha antes do esperado. Isto ocorre porque LOAD DATA INFILE no

pode determinar apropriadamente onde o valor de campo ou linha acaba. A oseguinte exemplo carrega todas as colunas da tablea persondata:
mysql> LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata;

Nenhuma lista de campo especificada, assim LOAD DATA INFILE espera linhas de entradas que contenha um campo para cada coluna da tabela. Os valores padres de FIELDS e LINES so usados. Se voc deseja carregar somente algumas das colunas das tabelas, especifique uma lista de campos:

mysql> LOAD DATA INFILE 'persondata.txt' ->


INTO TABLE persondata (col1,col2,...);

Voc deve especificar uma lista de campos se a ordem dos campos no arquivo de entrada diferem da ordem das colunas na tabela. Seno o MySQL no poder dizer como combinar os campos da entrada nas colunas da tabela. Se uma linha tiver poucos campos, as colunas para os quais o campo de entrada no estiverem presentes sero definidas com o valor padro. Atribuio de valor padro descrito em Seco 6.5.3, Sintaxe CREATE TABLE. Um valor de campo vazio interpretado de forma diferente de que se o valor do campo estiiver faltando:

Para tipos string, a coluna definida com uma string vazia. Para tipos numricos, a coluna definida com 0. Para tipos de data e hora, a coluna definida com o valor ``zero'' apropriado para o tipo. See Seco 6.2.2, Tipos de Data e Hora.

Note que estes so os mesmos valores que resultam se voc atribuir uma string vazia explicitamente a um tipo string, numrico, de data ou de hora em uma instruo INSERT ou UPDATE. Colunas TIMESTAMP s so definidas com a hora e data atual se houver um valor NULL para a coluna (isto , \N), ou (apenas para a primeira coluna TIMESTAMP) se a coluna TIMESTAMP esta a esquerda da lista de campos quando esta for especificada. Se uma linha de entrada tiver muitos campos, os campos extras sero ignorados e o nmero de avisos incrementado. Note que antes do MySQL 4.1.1 o aviso apenas um nmero que indica que alguma coisa deu errado. No MySQL 4.1.1 voc pode fazer SHOW WARNINGS para obter mais informaes sobre o que deu errado.
LOAD DATA INFILE considera todas as entradas como strings, assim voc no pode utiliar valores numricos para colunas ENUM ou SET do mesmo modo que voc pode com instrues INSERT. Todos os valores ENUM e SET devem ser especficados como strings!

Se voc estiver usando a API C, voc pode obter informaes sobre a consulta chamando a funo mysql_info() da API C quando a consulta LOAD DATA INFILE terminar. O formato da string de informao mostrado aqui:
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0

Avisos ocorrem sob as mesmas circuntncias que quando so inseridos via instruo INSERT (see Seco 6.4.3, Sintaxe INSERT), exceto que LOAD DATA INFILE tambm gera avisos quando houver poucos ou muitos campos na linha de entrada. Os avisos no so armazenados em nenhum local; o nmero de avisos s pode ser utilizado como uma indicao se tudo correr bem. Se voc obter avisos e quiser saber exatamente porque eles ocorreram, um modo de se fazer isto utilizar SELECT ... INTO OUTFILE em outro arquivo e campor-lo ao arquivo de entrada original. Se voc precisar que LOAD DATA leia de um pipe, voc pode utilizar o seguinte truque:

mkfifo /mysql/db/x/x chmod 666 /mysql/db/x/x cat < /dev/tcp/10.1.1.12/4711 > /nt/mysql/db/x/x mysql -e "LOAD DATA INFILE 'x' INTO TABLE x" x

Se voc estiver usando uma verso do MySQL a anterior a 3.23.25 voc s poder fazer o descrito acima com LOAD DATA LOCAL INFILE. No MySQL 4.1.1 voc pode usar SHOW WARNINGS para conseguir a lista do primeiros max_error_count avisos. See Seco 4.6.8.9, SHOW WARNINGS | ERRORS. Para mais informaes sobre a eficincia de INSERT versus LOAD DATA INFILE e a melhora na velocidade de LOAD DATA INFILE, See Seco 5.2.10, Performance das Consultas que Utilizam INSERT.

Outra fonte
MySQL

Funes de Strings do MySQL: Utilizando as funes Like, Left e Right


Tera-feira, 28/10/2003 s 03h59, por Marcos Ethur

O MySQL possui uma grande variedade de funes de manipulao de strings. Utilizando estas funes, podemos fazer praticamente qualquer tipo de consulta de manipulao de strings em um banco de dados MySQL. Esta coluna inicia uma srie dedicada s funes de strings do MySQL. Iniciaremos nosso estudo a partir de 3 delas: Like, Left e Right. A funo Like, do MySQL, faz uma busca sofisticada por uma substring dentro de uma string informada. Temos, dentro da funo LIKE, os seguintes caracteres especiais utilizados em substrings: % - Busca zero ou mais caracteres; _ - Busca somente um caractere. Vamos ver agora alguns exemplos de utilizao da funo LIKE: Exemplo 01: SELECT enome From emp Where enome like M%;

O caracter % na consulta acima indica que estamos procurando nomes que possuem a incial M. Exemplo 02: SELECT enome From emp Where enome like _a%; a%;

O caracter _ na consulta acima indica que estamos procurando nomes nos quais a letra A a segunda letra do nome. Exemplo 03: SELECT enome From emp Where enome like %a;

A consulta acima buscou nomes em que a ltima letra o caractere A. A funo Left retorna os primeiros caracteres esquerda de uma string. sintaxe: LEFT(string,tm) Exemplo de utilizao - LEFT: SELECT LEFT(enome,3) From emp;

Esta consulta retornar os 3 primeiros caracteres esquerda dos registros da coluna enome, conforme mostra a figura abaixo: A funo Right retorna os ltimos caracteres direita de uma string. sintaxe: RIGHT(string1,tm) Exemplo de utilizao RIGHT: SELECT RIGHT(enome,4) From emp;

Na prxima coluna abordaremos as funes LCASE, UCASE e STRCMP. At a prxima!


Fazer uma pesquisa atravs de dados bastante fcil quando as equaes de produzir um sim definitivo ou nenhuma situao. Pode haver momentos em que voc vai querer fazer uma pesquisa mais geral. O LIKE e NOT LIKE tem dois symobls ajudante de busca. O sublinhado _ personagem que olha para um personagem eo personagem% porcentagem que procura por zero ou mais caracteres.

$ Sql = mysql_query ("SELECT * FROM nome_tabela WHERE columnname COMO% value"); while ($ row = mysql_fetch_row ($ sql)) { echo "$ row [0] $ linha [1] $ row [2] <br />"; } A consulta s vai pegar as linhas que proporcionam um resultado TRUE acordo com a equao WHERE. A equao ser igual ao valor como mais algumas possveis caracteres extras depois. Exemplo ... $ Sql = mysql_query ("SELECT * FROM address_book ONDE last_name LIKE 'Stan%'"); while ($ row = mysql_fetch_row ($ sql)) { echo "$ row [0] $ linha [1] $ row [2] <br />"; } A consulta seria pesquisar a tabela address_book e comparar todos os dados na coluna last_name para quaisquer valores que comeam com 'Stan' e que terminam com zero ou mais caracteres depois. A busca LIKE no case sensitive, por isso vai aceitar qualquer coisa que comeam com 'stan' tambm. O loop WHILE, em seguida, imprime os resultados encontrados, se ambas as equaes so encontrados TRUE. Consultas usando o LIKE ou NOT LIKE parmetros podem ser um pouco mais lento do que uma consulta de pesquisa normal, considerando que so um amplo valor e no tirar proveito de qualquer indexao. O sublinhado e caracteres percentuais (tambm conhecido como caracteres curinga) pode ser usado na frente, no final, ou ambas as extremidades de um valor. Se voc quiser ter um sublinhado ou carter percentual realmente ser parte do valor de pesquisa, coloque um escape slash \ na frente do personagem. O curinga sublinhado pode ser usado vrias vezes para encontrar um nmero especfico de caracteres. Exemplo, este seria usado em uma equao para retornar um valor de 'Stan' mais trs personagens (uma vez que existem trs sublinhados) ... $ Sql = mysql_query ("SELECT * FROM address_book ONDE last_name LIKE 'Stan___'"); while ($ row = mysql_fetch_row ($ sql)) { echo "$ row [0] $ linha [1] $ row [2] <br />"; }

Como voc deve ter adivinhado, o parmetro NO GOSTA vai fazer o oposto do LIKE. Ela ir produzir resultados que no so como os critrios especificados