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_countOFFSEToffset}] [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_referencesJOIN”. 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
            tbl_name AS
            alias_nametbl_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_nameFROMtbl_nameHAVINGcol_name> 0;
Escriba esto en su lugar:
mysql> SELECTcol_nameFROMtbl_nameWHEREcol_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.

