Está en la página 1de 13

13.2.7.

Sintaxis de SELECT
[+/-]

13.2.7.1. Sintaxis de JOIN 13.2.7.2. Sintaxis de UNION 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'] [FROM table_references [WHERE where_definition] [GROUP BY {col_name | expr | position} [ASC | DESC], ... [WITH ROLLUP]] [HAVING where_definition] [ORDER BY {col_name | expr | position} [ASC | DESC] , ...] [LIMIT {[offset,] row_count | row_count OFFSET offset}] [PROCEDURE procedure_name(argument_list)] [FOR UPDATE | LOCK IN SHARE MODE]] SELECT se usa para recibir registros seleccionados desde una o ms tablas. MySQL 5.0

incluye soporte para comandos UNION y subconsultas. Consulte Seccin 13.2.7.2, Sintaxis de UNION y Seccin 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 enSeccin 13.2.7.1, Sintaxis de JOIN.

where_definition consiste en la palabra

clave WHERE seguida por una expresin que indica la condicin o condiciones que deben satisfacer los registros para ser seleccionados.
SELECT tambin puede usarse para recuperar registros computados sin referencia a ninguna

tabla. Por ejemplo:

mysql> SELECT 1 + 1; -> 2

Todas las clusulas usadas deben darse exactamente en el orden mostrado en la descripcin de la sintaxis. Por ejemplo, una clusula HAVING debe ir tras cualquier clusula GROUP BY y antes de cualquier clusula ORDER BY .

Una select_expr puede tener un alias usando AS alias_name. El alias se usa como el nombre de columna de la expresin y puede usarse en clusulas 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 podra 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 razn, es una buena prctica poner los alias de columnas usando AS.

No se permite usar un alias de columna en una clusula WHERE, ya que el valor de columna puede no estar determinado cuando se ejecuta la clusula WHERE . Consulte Seccin A.5.4, Problemas con alias de columnas.

La clusula FROM table_references indica la tabla desde la que recibir registros. Si nombra

ms de una tabla, est realizando un join, Para informacin sobre la sintaxis de join, consulte Seccin 13.2.7.1, Sintaxis de 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

cmo escoger los indices se describe en Seccin 13.2.7.1, Sintaxis de JOIN. En MySQL 5.0, puede usar SET
max_seeks_for_key=value como alternativa

para forzar a MySQL a que realice escaneos de claves en lugar de escaneos de tabla.

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 explcitamente. 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 ambgua. Consulte Seccin 9.2, Nombres de bases de datos, tablas, ndices, columnas y alias para ejemplos de ambigedad que requieran las formas de referencia de columna ms explcitas.

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 caracterstica puramente de

compatibilidad. Otros servidores requieren esta sintaxis.

Una referencia de tabla puede tener un alias usando tbl_name AS alias_name o tbl_nam

e 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 clusula WHERE , puede usar cualquiera de las funciones que soporta MySQL, escepto para funciones agregadas (resumen). Consulte Captulo 12, Funciones y operadores.

Las columnas seleccionadas para la salida pueden ser referidas en clusulas 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, aada la palabra clave DESC (descendiente) al nombre de la columna en la clusula ORDER BY por la que

est ordenando. Por defecto es orden ascendente; puede especificarse explcitamente usando la palabra clave ASC. El uso de posiciones de columna est obsoleto ya que la sintaxis se ha eliminado del estndar SQL.

Si usa GROUP BY, los registros de salida se ordenan segn las columnas GROUP BY como si tuviera un ORDER BYpara las mismas columnas. MySQL 5.0 extiende la clusula GROUP BY para que pueda especificar ASC y DESC tras las

columnas nombradas en la clusula: 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 clusulaGROUP BY . Si no obtiene los resultados que espera de la consulta, por favor lea la descripcin de GROUP
BY enSeccin 12.10, Funciones y modificadores

para clusulas GROUP BY.

En MySQL 5.0, GROUP BY permite un modificador WITH ROLLUP . Consulte Seccin 12.10.2, Modificadores deGROUP BY.

La clusula HAVING se aplica casi al final, justo antes de que los elementos se enven al cliente, sin optimizacin. (LIMIT se aplica tras HAVING.) Antes de MySQL 5.0.2, una clusula HAVING poda referirse a cualquier columna o alias nombrado en unaselect_expr en la lista SELECT o en subconsultas externas, y para funciones agregadas. Sin embargo, el estndar SQL

requiere que HAVING debe referirse slo a columnas en la clusula GROUP BY o columnas usadas en funciones agregadas. Para acomodar ambos estndars SQL y el comportamiento especfico 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 clusula 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 clusula HAVING se refiere a una columna ambgua, se muestra una advertencia. En el siguiente comando,col2 es ambguo 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 estndar, as que si un nombre de columna HAVING se usa en unGROUP 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 clusula WHERE . Por ejemplo, no escriba lo

siguiente: mysql> SELECT col_name FROM tbl_name HAVING col_name> 0; Escriba esto en su lugar:

mysql> SELECT col_name FROM tbl_name WHERE col_name> 0;

La clusula HAVING puede referirse a funciones de agregacin, algo que no puede hacer la clusula WHERE: mysql> SELECT user, MAX(salary) FROM users -> GROUP BY user HAVING MAX(salary)>10; (Esto no funciona en versiones antiguas de MySQL.)

La clusula LIMIT puede usarse para restringir el nmero de registros retornados por el comando SELECT.LIMIT tiene uno o dos argumentos numricos, 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 tambin 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 algn nmero grande para el segundo parmetro. 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 nmero 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 rpidamente en la mquina servidor. Si quiere crear el fichero resultante en un equipo cliente distinto al equipo servidor, no puede usar SELECT ... INTO OUTFILE. En tal caso, debera usar algn 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 parteexport_options del comando consiste en las mismas clusulas FIELDS y LINES usadas con el comando LOAD DATA INFILE . Consulte Seccin 13.2.5, Sintaxis de LOAD
DATA INFILE. FIELDS ESCAPED BY controla cmo escribir

caracteres especiales. Si el carcter FIELDS


ESCAPED BY no est vaco, se usa como prefijo

para los siguientes caracteres en la salida:

El carcter FIELDS ESCAPED BY

El carcter FIELDS [OPTIONALLY]


ENCLOSED BY

El primer carcter de FIELDS TERMINATED


BY y LINES TERMINATED BY

ASCII 0 (que se escribe siguiendo el carcter de escape ASCII '0', no un byte con valor cero)

Si el carcter FIELDS ESCAPED BY est vaco, no hay ningn carcter de escape y NULL se muestra por salida como NULL, no \N. Probablemente no es buena idea especificar un carcter de escape vaco, particularmente si los valores de los campos de sus datos contienen cualqiuera de los caracteres en la lista dada. La razn de lo anterior es que debe escapar cualquier carcter 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 ms fcil visualizarlo con algunos visores. El fichero resultante no tiene que estar conforme a la sintaxis SQL, as que nada ms 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 slo un registro en el fichero, sin

ninguna terminacin de lnea o columna y sin realizar ningn proceso de escape. Esto es til si quiere almacenar un valorBLOB en un fichero. Nota: Cualquier fichero creado por INTO
OUTFILE o INTO DUMPFILE es modificable por

todos los usuarios en el equipo servidor. La razn es que el servidor MySQL no puede crear un fichero con un propietario distinto al usuario que est en ejecucin (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 clusula PROCEDURE nombra a un procedimiento que debe procesar los datos en el conjunto de resultados. Para un ejemplo, consulte Seccin 27.3.1, Procedimiento Analyse. Si usa FOR UPDATE en un motor de almacenamiento que usa bloqueo de pginas o registros, los registros examinados por la consulta se bloquean para escritura hasta el final de la transaccin actual. Usar LOCK IN SHARE MODE crea un bloqueo compartido que evita a otras transacciones actualizar o borrar los registros examinados. Consulte Seccin 15.10.5, Bloquear lecturas SELECT ... FOR
UPDATE y SELECT ... LOCK IN SHARE MODE.

Tras la palabra clave SELECT , puede usar un nmero de opciones que afectan la operacin 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 yDISTINCTROW son sinnimos 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 estndar SQL.

HIGH_PRIORITY da a SELECT prioridad ms alta

que un comando que actualice una tabla. Debe usar esto slo para consultas que son muy rpidas 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 actualizacin 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 clusulaFROM . Puede usarlo para acelerar una consulta si el optimizador hace un join con las tablas en orden no ptimo. Consulte Seccin 7.2.1, Sintaxis de EXPLAIN (Obtener informacin acerca de un SELECT). STRAIGHT_JOINtambin puede usarse en la lista table_references . Consulte Seccin 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 rpidamente 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 pequeo. En este caso, MySQL usa tablas temporales rpidas para almacenar la tabla resultante en lugar de usar ordenacin. En MySQL 5.0, esto no har falta normalmente.

SQL_CALC_FOUND_ROWS le dice a MySQL que

calcule cuntos registros habrn en el conjunto de resultados, sin tener en cuenta ninguna clusula LIMIT. El nmero de registros pueden encontrarse con SELECT FOUND_ROWS(). Consulte Seccin 12.9.3, Funciones de informacin.

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 opcin afecta a cualquier SELECT en la consulta. Consulte Seccin 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. ConsulteSeccin 5.12, La cach de consultas de MySQL. Para una consulta que use UNION o subconsultas esta opcin afecta a cualquier SELECT en la consulta.
sta es una traduccin del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL est escrito en ingls, y esta traduccin no necesariamente est tan actualizada como la versin original. Para cualquier sugerencia sobre la traduccin y para sealar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.

Copyright 1997, 2011, Oracle and/or its affiliates. All rights reserved. Legal Notices

Top / Previous / Next / Up / Table of Contents

Developer Zone
Documentation Librarian Developer Articles News & Events Forums Bugs Forge Planet MySQL Labs

Downloads
MySQL Community Server MySQL Proxy MySQL Cluster MySQL Workbench MySQL Connectors Archives Snapshots Mirrors

Documentation
MySQL Reference Manuals MySQL Workbench Expert Guides Topic Guides MySQL Cluster Other Documents MySQL University About Archives

Support
MySQL Meetups Lists Forums

Other
Legal Privacy Policy Contact Us Site Map

Principio del formulario

Final del formulario

También podría gustarte