SELECT [ALL | DISTINCT | DISTINCTROW ] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]select_expr
, ... [INTO OUTFILE 'file_name
'export_options
| INTO DUMPFILE 'file_name
'] [FROMtable_references
[WHEREwhere_definition
] [GROUP BY {col_name
|expr
|position
} [ASC | DESC], ... [WITH ROLLUP]] [HAVINGwhere_definition
] [ORDER BY {col_name
|expr
|position
} [ASC | DESC] , ...] [LIMIT {[offset
,]row_count
|row_count
OFFSEToffset
}] [PROCEDUREprocedure_name
(argument_list
)] [FOR UPDATE | LOCK IN SHARE MODE]]
SELECT
se usa para recibir registros
seleccionados desde una o más tablas. MySQL 5.0 incluye soporte
para comandos UNION
y subconsultas. Consulte
Sección 13.2.7.2, “Sintaxis de UNION
” y Sección 13.2.8, “Sintaxis de subconsultas”.
Cada select_expr
indicata una
columna que quiere recibir.
table_references
indicata la
tabla o tablas desde la que recibir registros. Su sintaxis
se describe en Sección 13.2.7.1, “Sintaxis de JOIN
”.
where_definition
consiste en la
palabra clave WHERE
seguida por una
expresión que indica la condición o condiciones que deben
satisfacer los registros para ser seleccionados.
SELECT
también puede usarse para recuperar
registros computados sin referencia a ninguna tabla.
Por ejemplo:
mysql> SELECT 1 + 1; -> 2
Todas las cláusulas usadas deben darse exactamente en el orden
mostrado en la descripción de la sintaxis. Por ejemplo, una
cláusula HAVING
debe ir tras cualquier
cláusula GROUP BY
y antes de cualquier
cláusula ORDER BY
.
Una select_expr
puede tener un
alias usando AS alias_name
. El alias se
usa como el nombre de columna de la expresión y puede
usarse en cláusulas GROUP BY
,
ORDER BY
, o HAVING
.
Por ejemplo:
mysql> SELECT CONCAT(last_name,', ',first_name) AS full_name -> FROM mytable ORDER BY full_name;
La palabra clave AS
es opcional cuando se
usa un alias para select_expr
. El
ejemplo precedente podría haberse escrito como:
mysql> SELECT CONCAT(last_name,', ',first_name) full_name -> FROM mytable ORDER BY full_name;
Como AS
es opcional, puede ocurrir un
sutil problema si olvida la coma entre dos expresiones
select_expr
: MySQL interpreta el
segundo como un nombre de alias. Por ejemplo, en el
siguiente comando, columnb
se tata como
un nombre de alias:
mysql> SELECT columna columnb FROM mytable;
Por esta razón, es una buena práctica poner los alias de
columnas usando AS
.
No se permite usar un alias de columna en una cláusula
WHERE
, ya que el valor de columna puede
no estar determinado cuando se ejecuta la cláusula
WHERE
. Consulte
Sección A.5.4, “Problemas con alias de columnas”.
La cláusula FROM
indica
la tabla desde la que recibir registros. Si nombra más de
una tabla, está realizando un join, Para información sobre
la sintaxis de join, consulte Sección 13.2.7.1, “Sintaxis de table_references
JOIN
”. Para
cada tabla especificada, puede opcionalmente especificar un
alias.
tbl_name
[[AS]alias
] [[USE INDEX (key_list
)] | [IGNORE INDEX (key_list
)] | [FORCE INDEX (key_list
)]]
El uso de USE INDEX
, IGNORE
INDEX
, FORCE INDEX
para dar al
optimizador pistas acerca de cómo escoger los indices se
describe en Sección 13.2.7.1, “Sintaxis de JOIN
”.
En MySQL 5.0, puede usar SET
max_seeks_for_key=
como alternativa para forzar a MySQL a que realice escaneos
de claves en lugar de escaneos de tabla.
value
Puede referirse a una tabla dentro de la base de datos
actual como tbl_name
(dentro de
la base de datos actual) , o como
db_name.tbl_name
para referirse a
una base de datos explícitamente. Puede referirse a una
columna como col_name
,
tbl_name.col_name
, o
db_name.tbl_name.col_name
. No
necesita especificar un prefijo
tbl_name
o
db_name.tbl_name
para una
referencia de columna a no ser que la referencia fuese
ambígua. Consulte Sección 9.2, “Nombres de bases de datos, tablas, índices, columnas y alias” para
ejemplos de ambigüedad que requieran las formas de
referencia de columna más explícitas.
En MySQL 5.0, puede especificar DUAL
como
nombre de tabla falso en siguaciones donde no se referencian
tablas:
mysql> SELECT 1 + 1 FROM DUAL; -> 2
DUAL
es una característica puramente de
compatibilidad. Otros servidores requieren esta sintaxis.
Una referencia de tabla puede tener un alias usando
o
tbl_name
AS
alias_name
tbl_name alias_name
:
mysql> SELECT t1.name, t2.salary FROM employee AS t1, info AS t2 -> WHERE t1.name = t2.name; mysql> SELECT t1.name, t2.salary FROM employee t1, info t2 -> WHERE t1.name = t2.name;
En la cláusula WHERE
, puede usar
cualquiera de las funciones que soporta MySQL, escepto para
funciones agregadas (resumen). Consulte
Capítulo 12, Funciones y operadores.
Las columnas seleccionadas para la salida pueden ser
referidas en cláusulas ORDER BY
y
GROUP BY
usando nombres de columnas,
alias, o posiciones. Las posiciones de columnas son enteros
y comienzan con 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 en orden inverso, añada la palabra clave
DESC
(descendiente) al nombre de la
columna en la cláusula ORDER BY
por la
que está ordenando. Por defecto es orden ascendente; puede
especificarse explícitamente usando la palabra clave
ASC
.
El uso de posiciones de columna está obsoleto ya que la sintaxis se ha eliminado del estándar SQL.
Si usa GROUP BY
, los registros de salida
se ordenan según las columnas GROUP BY
como si tuviera un ORDER BY
para las
mismas columnas. MySQL 5.0 extiende la cláusula
GROUP BY
para que pueda especificar
ASC
y DESC
tras las
columnas nombradas en la cláusula:
SELECT a, COUNT(b) FROM test_table GROUP BY a DESC
MySQL extiende el uso de GROUP BY
para
permitir seleccionar campos que no se mencionan en la
cláusula GROUP BY
. Si no obtiene los
resultados que espera de la consulta, por favor lea la
descripción de GROUP BY
en
Sección 12.10, “Funciones y modificadores para cláusulas GROUP BY
”.
En MySQL 5.0, GROUP BY
permite un
modificador WITH ROLLUP
. Consulte
Sección 12.10.2, “Modificadores de GROUP BY
”.
La cláusula HAVING
se aplica casi al
final, justo antes de que los elementos se envíen al
cliente, sin optimización. (LIMIT
se
aplica tras HAVING
.)
Antes de MySQL 5.0.2, una cláusula
HAVING
podía referirse a cualquier
columna o alias nombrado en una
select_expr
en la lista
SELECT
o en subconsultas externas, y para
funciones agregadas. Sin embargo, el estándar SQL requiere
que HAVING
debe referirse sólo a
columnas en la cláusula GROUP BY
o
columnas usadas en funciones agregadas. Para acomodar ambos
estándars SQL y el comportamiento específico de MySQL en
que es capaz de referirse a columnas en la lista
SELECT
, MySQL 5.0.2 y posteior permite a
HAVING
referirse a columnas en la lista
SELECT
, en la cláusula GROUP
BY
, en subconsultas externas y en funciones
agregadas.
Por ejemplo, el siguiente comando funciona en MySQL 5.0.2 pero produce un error en versiones aneriores:
mysql> SELECT COUNT(*) FROM t GROUP BY col1 HAVING col1 = 2;
Si la cláusula HAVING
se refiere a una
columna ambígua, se muestra una advertencia. En el
siguiente comando, col2
es ambíguo
porque se usa tanto para un alias como para un nombre de
columna:
mysql> SELECT COUNT(col1) AS col2 FROM t GROUP BY col2 HAVING col2 = 2;
Se da preferencia al comportamiento SQL estándar, así que
si un nombre de columna HAVING
se usa en
un GROUP BY
y como alias de columna en la
lista de columnas de salida, se da preferencia a la columna
en GROUP BY
.
No use HAVING
para elementos que deban
estar en la cláusula WHERE
. Por
ejemplo, no escriba lo siguiente:
mysql> SELECTcol_name
FROMtbl_name
HAVINGcol_name
> 0;
Escriba esto en su lugar:
mysql> SELECTcol_name
FROMtbl_name
WHEREcol_name
> 0;
La cláusula HAVING
puede referirse a
funciones de agregación, algo que no puede hacer la
cláusula WHERE
:
mysql> SELECT user, MAX(salary) FROM users -> GROUP BY user HAVING MAX(salary)>10;
(Esto no funciona en versiones antiguas de MySQL.)
La cláusula LIMIT
puede usarse para
restringir el número de registros retornados por el comando
SELECT
. LIMIT
tiene
uno o dos argumentos numéricos, que deben ser enteros
positivos (incluyendo cero).
Con dos argumentos, el primer argumento especifica el desplazamiento del primer registro a retornar. El desplazamiento del registro inicial es 0 (no 1):
mysql> SELECT * FROM table LIMIT 5,10; # Retrieve rows 6-15
Por compatibilidad con PostgreSQL, MySQL también soporta la
sintaxis LIMIT
.
row_count
OFFSET offset
Para recibir todos los registros de un desplazamiento hasta el final del conjunto de resultados, puede usar algún número grande para el segundo parámetro. Ete comando recibe todos los registros desde el 96th hasta el último:
mysql> SELECT * FROM table LIMIT 95,18446744073709551615;
Con un argumento, el valor especifica el número de registros a retornar desde el comienzo del conjunto de resultados:
mysql> SELECT * FROM table LIMIT 5; # Retrieve first 5 rows
En otras palabras, LIMIT n
es equivalente
a LIMIT 0,n
.
La forma SELECT ... INTO OUTFILE
'file_name'
de SELECT
escribe
los registros seleccionados en un fichero. El fichero se
crea en el equipo servidor, así que debe tener el permiso
FILE
para usar esta sintaxis. El fichero
no puede existir, que entre otras cosas evita destruir
ficheros cruciales tales como
/etc/passwd
y tablas de la base de
datos.
El comando SELECT ... INTO OUTFILE
existe
principalmente para dejarle volcar una tabla rápidamente en
la máquina servidor. Si quiere crear el fichero resultante
en un equipo cliente distinto al equipo servidor, no puede
usar SELECT ... INTO OUTFILE
. En tal
caso, debería usar algún comando como mysql -e
"SELECT ..." > file_name
en el equipo cliente
para generar el fichero.
SELECT ... INTO OUTFILE
es el complemento
de LOAD DATA INFILE
; la sintaxis para la
parte export_options
del comando consiste
en las mismas cláusulas FIELDS
y
LINES
usadas con el comando LOAD
DATA INFILE
. Consulte
Sección 13.2.5, “Sintaxis de LOAD DATA INFILE
”.
FIELDS ESCAPED BY
controla cómo escribir
caracteres especiales. Si el carácter FIELDS
ESCAPED BY
no está vacío, se usa como prefijo
para los siguientes caracteres en la salida:
El carácter FIELDS ESCAPED BY
El carácter FIELDS [OPTIONALLY] ENCLOSED
BY
El primer carácter de FIELDS TERMINATED
BY
y LINES TERMINATED BY
ASCII 0
(que se escribe siguiendo el
carácter de escape ASCII '0
', no un
byte con valor cero)
Si el carácter FIELDS ESCAPED BY
está
vacío, no hay ningún carácter de escape y
NULL
se muestra por salida como
NULL
, no \N
.
Probablemente no es buena idea especificar un carácter de
escape vacío, particularmente si los valores de los campos
de sus datos contienen cualqiuera de los caracteres en la
lista dada.
La razón de lo anterior es que debe
escapar cualquier carácter FIELDS TERMINATED
BY
, ENCLOSED BY
,
ESCAPED BY
, o LINES TERMINATED
BY
para ser capaz de volver a leer el fichero
correctamente. ASCII NUL
se escapa para
hacer más fácil visualizarlo con algunos visores.
El fichero resultante no tiene que estar conforme a la sintaxis SQL, así que nada más debe escaparse.
Este es un ejemplo que produce un fichero en formato de valores separados por comas usado por varios programas:
SELECT a,b,a+b INTO OUTFILE '/tmp/result.text' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM test_table;
Si usa INTO DUMPFILE
en lugar de
INTO OUTFILE
, MySQL escribe sólo un
registro en el fichero, sin ninguna terminación de línea o
columna y sin realizar ningún proceso de escape. Esto es
útil si quiere almacenar un valor BLOB
en un fichero.
Nota: Cualquier fichero
creado por INTO OUTFILE
o INTO
DUMPFILE
es modificable por todos los usuarios en
el equipo servidor. La razón es que el servidor MySQL no
puede crear un fichero con un propietario distinto al
usuario que está en ejecución (nunca debe ejecutar
mysqld como root
por
esta y otras razones). El fichero debe ser modificable por
todo el mundo para que pueda maminpular sus contenidos.
Una cláusula PROCEDURE
nombra a un
procedimiento que debe procesar los datos en el conjunto de
resultados. Para un ejemplo, consulte
Sección 27.3.1, “Procedimiento Analyse”.
Si usa FOR UPDATE
en un motor de
almacenamiento que usa bloqueo de páginas o registros, los
registros examinados por la consulta se bloquean para
escritura hasta el final de la transacción actual. Usar
LOCK IN SHARE MODE
crea un bloqueo
compartido que evita a otras transacciones actualizar o
borrar los registros examinados. Consulte
Sección 15.10.5, “Bloquear lecturas SELECT ... FOR UPDATE
y
SELECT ... LOCK IN SHARE MODE
”.
Tras la palabra clave SELECT
, puede usar un
número de opciones que afectan la operación del comando.
Las opciones ALL
,
DISTINCT
, and DISTINCTROW
especifican si deben retornarse los registros duplicados. Si no
se da ninguna de estas opciones, por defecto es
ALL
(se retornan todos los registros
coincidentes). DISTINCT
y
DISTINCTROW
son sinónimos y especifican que
los registros duplicados en el conjunto de resultados deben
borrarse.
HIGH_PRIORITY
,
STRAIGHT_JOIN
, y opciones que comiencen con
SQL_
son extensiones de MySQL al estándar
SQL.
HIGH_PRIORITY
da a
SELECT
prioridad más alta que un comando
que actualice una tabla. Debe usar esto sólo para consultas
que son muy rápidas y deben realizarse una vez. Una
consulta SELECT HIGH_PRIORITY
que se
realiza mientras la tabla está bloqueada para lectura se
ejectua incluso si hay un comando de actualización
esperando a que se libere la tabla.
HIGH_PRIORITY
no puede usarse con
comandos SELECT
que sean parte de una
UNION
.
STRAIGHT_JOIN
fuerza al optimizador a
hacer un join de las tablas en el orden en que se listan en
la cláusula FROM
. Puede usarlo para
acelerar una consulta si el optimizador hace un join con las
tablas en orden no óptimo. Consulte
Sección 7.2.1, “Sintaxis de EXPLAIN
(Obtener información acerca de
un SELECT
)”. STRAIGHT_JOIN
también puede usarse en la lista
table_references
. Consulte
Sección 13.2.7.1, “Sintaxis de JOIN
”.
SQL_BIG_RESULT
puede usarse con
GROUP BY
o DISTINCT
para decir al optimizador que el conjunto de resultados
tiene muchos registros. En este caso, MySQL usa directamente
tablas temporales en disco si son necesarias con una clave
en los elementos GROUP BY
.
SQL_BUFFER_RESULT
fuerza a que el
resultado se ponga en una tabla temporal . Esto ayuda a
MySQL a liberar los bloqueos de tabla rápidamente y ayuda
en casos en que tarda mucho tiempo en enviar el resultado al
cliente.
SQL_SMALL_RESULT
puede usarse con
GROUP BY
o DISTINCT
para decir al optimizador que el conjunto de resultados es
pequeño. En este caso, MySQL usa tablas temporales rápidas
para almacenar la tabla resultante en lugar de usar
ordenación. En MySQL 5.0, esto no hará falta normalmente.
SQL_CALC_FOUND_ROWS
le dice a MySQL que
calcule cuántos registros habrán en el conjunto de
resultados, sin tener en cuenta ninguna cláusula
LIMIT
. El número de registros pueden
encontrarse con SELECT FOUND_ROWS()
.
Consulte Sección 12.9.3, “Funciones de información”.
SQL_CACHE
le dice a MySQL que almacene el
resultado de la consulta en la caché de consultas si está
usando un valor de query_cache_type
de
2
o DEMAND
. Para una
consulta que use UNION
o subconsultas,
esta opción afecta a cualquier SELECT
en
la consulta. Consulte Sección 5.12, “La caché de consultas de MySQL”.
SQL_NO_CACHE
le dice a MySQL que no
almacene los resultados de consulta en la caché de
consultas. Consulte Sección 5.12, “La caché de consultas de MySQL”. Para una
consulta que use UNION
o subconsultas
esta opción afecta a cualquier SELECT
en
la consulta.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.