13.2.10.1 SELECT .. . Declaración INTO
La SELECT ... INTO
forma de SELECT
habilita el resultado de una consulta para ser almacenado en variables o escrito en un archivo:
-
SELECT ... INTO
selecciona valores de columna y los almacena en variables.var_list
-
SELECT ... INTO OUTFILE
escribe las filas seleccionadas en un archivo. Se pueden especificar terminadores de columna y línea para producir un formato de salida específico. -
SELECT ... INTO DUMPFILE
escribe una sola fila en un archivo sin ningún formato.
Una instrucción SELECT
dada puede contener como máximo una cláusula INTO
, aunque como se muestra en la SELECT
descripción de la sintaxis (consulte la Sección 13.2.10,» Instrucción SELECT «), la INTO
puede aparecer en diferentes posiciones:
-
Antes de
FROM
. Ejemplo: -
Antes de una cláusula de bloqueo final. Ejemplo:
-
Al final de la
SELECT
. Ejemplo:
El INTO
posición al final de la declaración es compatible a partir de MySQL 8.0.20, y es la posición preferida. La posición antes de una cláusula de bloqueo está en desuso a partir de MySQL 8.0.20; espere que se elimine el soporte en af uture versión de MySQL. En otras palabras, INTO
después de FROM
pero no al final de SELECT
produce un advertencia.
Una cláusula INTO
no debe usarse en un SELECT
anidado porque tal SELECT
debe devolver su resultado al contexto externo. También existen restricciones sobre el uso de INTO
dentro de UNION
declaraciones; consulte la Sección 13.2.10.3, «Cláusula UNION».
Para la variante INTO
: var_list
-
var_list
nombra una lista de una o más variables, cada una de las cuales puede ser una variable definida por el usuario, un procedimiento almacenado o un parámetro de función , o una variable local de programa almacenada. (Dentro de una instrucciónSELECT ... INTO
preparada, solo se permiten variables definidas por el usuario; consulte la Sección 13.6.4.2, «Alcance y resolución de variables locales» .)var_list
-
Los valores seleccionados se asignan a las variables. El número de variables debe coincidir con el número de columnas. La consulta debe devolver una sola fila. Si la consulta no devuelve filas, se produce una advertencia con el código de error 1329 (
No data
) y los valores de las variables permanecen sin cambios. Si la consulta devuelve varias filas, se produce el error 1172 (Result consisted of more than one row
). Si es posible que la declaración recupere varias filas, puede usarLIMIT 1
para limitar el conjunto de resultados a una sola fila.
INTO
también se puede utilizado con una var_list
TABLE
declaración, sujeta a estas restricciones:
-
El número de las variables deben coincidir con el número de columnas de la tabla.
-
Si la tabla contiene más de una fila, debe usar
LIMIT 1
para limitar el conjunto de resultados a una sola fila.LIMIT 1
debe preceder a la palabra claveINTO
.
Un ejemplo de tal declaración se muestra aquí:
También puede seleccionar valores de una VALUES
declaración que genera una una sola fila en un conjunto de variables de usuario. En este caso, debe emplear un alias de tabla y debe asignar cada valor de la lista de valores a una variable. Cada una de las dos declaraciones que se muestran aquí es equivalente a SET @x=2, @y=4, @z=8
:
Los nombres de las variables de usuario no distinguen entre mayúsculas y minúsculas . Consulte la Sección 9.4, «Variables definidas por el usuario».
La forma SELECT ... INTO OUTFILE "
de file_name
"SELECT
escribe las filas seleccionadas en un archivo. El archivo se crea en el host del servidor, por lo que debe tener el privilegio FILE
para usar esta sintaxis. file_name
no puede ser un archivo existente, lo que, entre otras cosas, evita que se modifiquen archivos como /etc/passwd
y tablas de bases de datos. La variable de sistema character_set_filesystem
controla la interpretación del nombre del archivo.
La instrucción SELECT ... INTO OUTFILE
está destinada a permitir el volcado de una tabla en un archivo de texto en el servidor.Para crear el archivo resultante en algún otro host, SELECT ... INTO OUTFILE
normalmente no es adecuado porque no hay forma de escribir una ruta al archivo relativa al sistema de archivos del host del servidor, a menos que la ubicación del Se puede acceder al archivo en el host remoto utilizando una ruta mapeada en la red en el sistema de archivos del host del servidor.
Alternativamente, si el software cliente MySQL está instalado en el host remoto, puede utilizar un comando de cliente como mysql -e "SELECT ..." >
para generar el archivo en ese host. file_name
SELECT ... INTO OUTFILE
es el complemento de LOAD DATA
. Los valores de columna se escriben convertidos al juego de caracteres especificado en la cláusula CHARACTER SET
. Si no existe tal cláusula, los valores se descargan utilizando el juego de caracteres binary
. En efecto, no hay conversión de juego de caracteres. Si un conjunto de resultados contiene columnas en varios conjuntos de caracteres, también lo es el archivo de datos de salida y es posible que no sea posible volver a cargar el archivo correctamente.
La sintaxis de la export_options
parte de la declaración consta de la misma FIELDS
y LINES
cláusulas que se utilizan con la instrucción LOAD DATA
. Para obtener información sobre las cláusulas FIELDS
y LINES
, incluidos sus valores predeterminados y permitidos, consulte la Sección 13.2.7, «Declaración LOAD DATA» .
FIELDS ESCAPED BY
controla cómo escribir caracteres especiales. Si el carácter FIELDS ESCAPED BY
no está vacío, se usa cuando necesario para evitar la ambigüedad como prefijo que precede a los siguientes caracteres en la salida:
-
El
FIELDS ESCAPED BY
carácter -
El
FIELDS ENCLOSED BY
carácter -
El primer carácter del
FIELDS TERMINATED BY
yLINES TERMINATED BY
valores -
ASCII
NUL
(el byte de valor cero; lo que en realidad está escrito después del carácter de escape es ASCII0
, no un byte de valor cero)
El FIELDS TERMINATED BY
, ENCLOSED BY
, ESCAPED BY
, o LINES TERMINATED BY
caracteres se deben escapar para que pueda volver a leer el archivo de manera confiable. ASCII NUL
se escapa para que sea más fácil de ver con algunos buscapersonas.
El archivo resultante no necesita ajustarse a la sintaxis SQL, por lo que no es necesario escapar nada más.
Si el carácter FIELDS ESCAPED BY
está vacío, no hay caracteres de escape y NULL
se genera como NULL
, no \N
. Probablemente no sea una buena idea especificar un carácter de escape vacío, especialmente si los valores de campo de sus datos contienen alguno de los caracteres de la lista que se acaba de dar.
INTO OUTFILE
también se puede utilizar con una instrucción TABLE
cuando desee volcar todas las columnas de una tabla en una Archivo de texto. En este caso, el orden y el número de filas se pueden controlar usando ORDER BY
y LIMIT
; estas cláusulas deben preceder a INTO OUTFILE
. TABLE ... INTO OUTFILE
admite el mismo export_options
que SELECT ... INTO OUTFILE
, y está sujeto a las mismas restricciones al escribir en el sistema de archivos. Aquí se muestra un ejemplo de dicha declaración:
También puede usar SELECT ... INTO OUTFILE
con una VALUES
para escribir valores directamente en un archivo. Aquí se muestra un ejemplo:
Debe utilizar un alias de tabla; Los alias de columna también son compatibles y, opcionalmente, se pueden usar para escribir valores solo de las columnas deseadas. También puede utilizar cualquiera o todas las opciones de exportación admitidas por SELECT ... INTO OUTFILE
para formatear la salida al archivo.
Aquí hay un ejemplo que produce un archivo en el formato de valores separados por comas (CSV) utilizado por muchos programas:
Si usa INTO DUMPFILE
en lugar de INTO OUTFILE
, MySQL escribe solo una fila en el archivo, sin ninguna terminación de columna o línea y sin realizar ningún procesamiento de escape. Esto es útil para seleccionar un valor BLOB
y almacenarlo en un archivo.
Cualquier archivo creado por INTO OUTFILE
o INTO DUMPFILE
es propiedad del usuario del sistema operativo bajo cuya cuenta se ejecuta mysqld. (Nunca debe ejecutar mysqld como root
por esta y otras razones). A partir de MySQL 8.0.17, la máscara de usuario para la creación de archivos es 0640; debe tener suficientes privilegios de acceso para manipular el contenido del archivo. Antes de MySQL 8.0.17, la umask es 0666 y todos los usuarios del servidor pueden escribir en el archivo.
Si la variable de sistema secure_file_priv
se establece en un nombre de directorio no vacío, el archivo que se va a escribir debe estar ubicado en ese directorio.
En el contexto de SELECT ... INTO
declaraciones que ocurren como parte de eventos ejecutados por el Programador de eventos, los mensajes de diagnóstico (no solo errores, sino también advertencias) se escriben en el registro de errores y, en Windows, al registro de eventos de la aplicación. Para obtener información adicional, consulte la Sección 25.4.5, «Estado del programador de eventos».
A partir de MySQL 8.0.22, se proporciona soporte para la sincronización periódica de archivos de salida escritos por SELECT INTO OUTFILE
y SELECT INTO DUMPFILE
, habilitados al configurar la select_into_disk_sync
variable de sistema del servidor introducida en esa versión. El tamaño del búfer de salida y el retraso opcional se pueden establecer utilizando, respectivamente, select_into_buffer_size
y select_into_disk_sync_delay
. Para obtener más información, consulte las descripciones de estas variables del sistema.