13.2.10.1 SELECT .. . Instrução INTO
A SELECT ... INTO
forma de SELECT
permite um resultado de consulta a ser armazenado em variáveis ou gravado em um arquivo:
-
SELECT ... INTO
seleciona os valores da coluna e os armazena em variáveis.var_list
-
SELECT ... INTO OUTFILE
grava as linhas selecionadas em um arquivo. Terminadores de coluna e linha podem ser especificados para produzir um formato de saída específico. -
SELECT ... INTO DUMPFILE
grava uma única linha em um arquivo sem qualquer formatação.
Uma determinada instrução SELECT
pode conter no máximo uma INTO
cláusula, embora conforme mostrado pela SELECT
descrição da sintaxe (consulte a Seção 13.2.10,” Instrução SELECT “), a INTO
pode aparecer em posições diferentes:
-
Antes de
FROM
. Exemplo: -
Antes de uma cláusula de bloqueio final. Exemplo:
-
No final do
SELECT
. Exemplo:
O INTO
a posição no final da instrução é suportada no MySQL 8.0.20 e é a posição preferida. A posição antes de uma cláusula de bloqueio está obsoleta no MySQL 8.0.20; espera-se que o suporte seja removido em af versão original do MySQL. Em outras palavras, INTO
após FROM
, mas não no final do SELECT
produz um aviso.
Uma INTO
cláusula não deve ser usada em uma SELECT
aninhada porque tal SELECT
deve retornar seu resultado para o contexto externo. Também existem restrições ao uso de INTO
dentro de UNION
instruções; consulte a Seção 13.2.10.3, “Cláusula UNION”.
Para a variante INTO
: var_list
-
var_list
nomeia uma lista de uma ou mais variáveis, cada uma das quais pode ser uma variável definida pelo usuário, procedimento armazenado ou parâmetro de função , ou variável local do programa armazenado. (Dentro de uma instruçãoSELECT ... INTO
preparada, apenas variáveis definidas pelo usuário são permitidas; consulte a Seção 13.6.4.2, “Escopo e resolução da variável local” .)var_list
-
Os valores selecionados são atribuídos às variáveis. O número de variáveis deve corresponder ao número de colunas. A consulta deve retornar uma única linha. Se a consulta não retornar nenhuma linha, ocorrerá um aviso com o código de erro 1329 (
No data
) e os valores das variáveis permanecerão inalterados. Se a consulta retornar várias linhas, ocorrerá o erro 1172 (Result consisted of more than one row
). Se for possível que a instrução possa recuperar várias linhas, você pode usarLIMIT 1
para limitar o conjunto de resultados a uma única linha.
INTO
também pode ser usado com uma instrução var_list
TABLE
, sujeita a estas restrições:
-
O número de as variáveis devem corresponder ao número de colunas da tabela.
-
Se a tabela contiver mais de uma linha, você deve usar
LIMIT 1
para limitar o conjunto de resultados a uma única linha.LIMIT 1
deve preceder aINTO
palavra-chave.
Um exemplo de tal declaração é mostrado aqui:
Você também pode selecionar valores de uma declaração VALUES
que gera uma única linha em um conjunto de variáveis de usuário. Nesse caso, você deve empregar um alias de tabela e atribuir cada valor da lista de valores a uma variável. Cada uma das duas instruções mostradas aqui é equivalente a SET @x=2, @y=4, @z=8
:
Os nomes das variáveis do usuário não diferenciam maiúsculas de minúsculas . Consulte a Seção 9.4, “Variáveis definidas pelo usuário”.
A forma SELECT ... INTO OUTFILE "
de file_name
"SELECT
grava as linhas selecionadas em um arquivo. O arquivo é criado no host do servidor, portanto, você deve ter o privilégio FILE
para usar esta sintaxe. file_name
não pode ser um arquivo existente, o que, entre outras coisas, impede que arquivos como /etc/passwd
e tabelas de banco de dados sejam modificados. A variável do sistema character_set_filesystem
controla a interpretação do nome do arquivo.
A instrução SELECT ... INTO OUTFILE
tem como objetivo permitir o dump de uma tabela em um arquivo de texto no host do servidor.Para criar o arquivo resultante em algum outro host, SELECT ... INTO OUTFILE
normalmente não é adequado porque não há maneira de gravar um caminho para o arquivo relativo ao sistema de arquivos do host do servidor, a menos que a localização do O arquivo no host remoto pode ser acessado usando um caminho mapeado pela rede no sistema de arquivos do host do servidor.
Alternativamente, se o software do cliente MySQL estiver instalado no host remoto, você pode usar um comando do cliente como mysql -e "SELECT ..." >
para gerar o arquivo nesse host. file_name
SELECT ... INTO OUTFILE
é o complemento de LOAD DATA
. Os valores da coluna são gravados e convertidos no conjunto de caracteres especificado na cláusula CHARACTER SET
. Se nenhuma cláusula estiver presente, os valores são despejados usando o conjunto de caracteres binary
. Na verdade, não há conversão de conjunto de caracteres. Se um conjunto de resultados contém colunas em vários conjuntos de caracteres, o arquivo de dados de saída também contém, e pode não ser possível recarregar o arquivo corretamente.
A sintaxe para a export_options
parte da instrução consiste na mesma FIELDS
e LINES
cláusulas que são usadas com a instrução LOAD DATA
. Para obter informações sobre as cláusulas FIELDS
e LINES
, incluindo seus valores padrão e permitidos, consulte a Seção 13.2.7, “Instrução LOAD DATA” .
FIELDS ESCAPED BY
controla como escrever caracteres especiais. Se o FIELDS ESCAPED BY
caractere não estiver vazio, ele será usado quando necessário para evitar ambigüidade como um prefixo que precede os seguintes caracteres na saída:
-
O
FIELDS ESCAPED BY
caractere -
O
FIELDS ENCLOSED BY
caractere -
O primeiro caractere do
FIELDS TERMINATED BY
eLINES TERMINATED BY
valores -
ASCII
NUL
(o byte com valor zero; o que é realmente escrito após o caractere de escape é ASCII0
, não um byte com valor zero)
O FIELDS TERMINATED BY
, ENCLOSED BY
, ESCAPED BY
, ou LINES TERMINATED BY
caracteres devem ser escapados para que você possa ler o arquivo de volta com segurança. ASCII NUL
é escapado para facilitar a visualização com alguns pagers.
O arquivo resultante não precisa estar em conformidade com a sintaxe SQL, portanto, nada mais precisa ser escapado.
Se o caractere FIELDS ESCAPED BY
estiver vazio, nenhum caractere será escapado e NULL
será gerado como NULL
, não \N
. Provavelmente não é uma boa ideia especificar um caractere de escape vazio, principalmente se os valores de campo em seus dados contiverem qualquer um dos caracteres da lista fornecida.
INTO OUTFILE
também pode ser usado com uma instrução TABLE
quando você deseja despejar todas as colunas de uma tabela em um arquivo de texto. Nesse caso, a ordem e o número de linhas podem ser controlados usando ORDER BY
e LIMIT
; essas cláusulas devem preceder INTO OUTFILE
. TABLE ... INTO OUTFILE
oferece suporte ao mesmo export_options
que SELECT ... INTO OUTFILE
e está sujeito às mesmas restrições ao gravar no sistema de arquivos. Um exemplo de tal declaração é mostrado aqui:
Você também pode usar SELECT ... INTO OUTFILE
com uma declaração VALUES
para escrever valores diretamente em um arquivo. Um exemplo é mostrado aqui:
Você deve usar um alias de tabela; aliases de coluna também são suportados e podem ser usados opcionalmente para gravar valores apenas das colunas desejadas. Você também pode usar qualquer uma ou todas as opções de exportação suportadas por SELECT ... INTO OUTFILE
para formatar a saída para o arquivo.
Aqui está um exemplo que produz um arquivo no formato de valores separados por vírgula (CSV) usado por muitos programas:
Se você usar INTO DUMPFILE
em vez de INTO OUTFILE
, o MySQL grava apenas uma linha no arquivo, sem nenhuma coluna ou terminação de linha e sem realizar nenhum processamento de escape. Isso é útil para selecionar um valor BLOB
e armazená-lo em um arquivo.
Qualquer arquivo criado por INTO OUTFILE
ou INTO DUMPFILE
é propriedade do usuário do sistema operacional sob cuja conta o mysqld é executado. (Você nunca deve executar o mysqld como root
por este e outros motivos.) A partir do MySQL 8.0.17, o umask para criação de arquivo é 0640; você deve ter privilégios de acesso suficientes para manipular o conteúdo do arquivo. Antes do MySQL 8.0.17, o umask é 0666 e o arquivo pode ser escrito por todos os usuários no host do servidor.
Se a variável de sistema secure_file_priv
for definida como um nome de diretório não vazio, o arquivo a ser gravado deve estar localizado nesse diretório.
No contexto de SELECT ... INTO
instruções que ocorrem como parte de eventos executados pelo Programador de eventos, as mensagens de diagnóstico (não apenas erros, mas também avisos) são gravadas no log de erros e, no Windows, para o log de eventos do aplicativo. Para obter informações adicionais, consulte a Seção 25.4.5, “Event Scheduler Status”.
A partir do MySQL 8.0.22, o suporte é fornecido para a sincronização periódica de arquivos de saída gravados por SELECT INTO OUTFILE
e SELECT INTO DUMPFILE
, ativados pela configuração da variável de sistema do servidor select_into_disk_sync
introduzida nessa versão. Tamanho do buffer de saída e atraso opcional podem ser definido usando, respectivamente, select_into_buffer_size
e select_into_disk_sync_delay
. Para obter mais informações, consulte as descrições dessas variáveis de sistema.