mysql.h


UNION

SELECT ...
UNION [ALL | DISTINCT]
SELECT ...
  [UNION [ALL | DISTINCT]
   SELECT ...]

UNION se usa para combinar los resultados de varias sentencias SELECT en un único conjunto de resultados. UNION está disponible a partir de MySQL 4.0.0.

Las columnas seleccionadas listadas en las posiciones correspondientes para cada sentencia SELECT deben ser del mismo tipo. (Por ejemplo, la primera columna seleccionada por la primera sentencia debe ser del mismo tipo que la primera columna seleccionada por las otras sentencias.) En los resultados devueltos se usarán los nombres de columna usados en la primera sentecia SELECT.

Las sentencias SELECT son sentencias de selección normales, pero con las siguientes restricciones:

  • Sólo la última sentencia SELECT puede tener una cláusula INTO OUTFILE.
  • No se puede usar HIGH_PRIORITY con las sentencias SELECT que formen parte de una UNION. Si se especifica para el primer SELECT, no tendrá efecto. Si se hace para cualquier sentencia SELECT subsiguiente, se producirá un error de sintaxis.

Si no se usa la palabra clave ALL para la UNION, todas las filas devueltas serán únicas, igual que si se hubiese especificado DISTINCT para el conjunto de resultados total. Si se especifica ALL, se obtendrán todas las filas coincidentes de todas las sentencias SELECT.

La palabra clave DISTINCT es una palabra opcional (introducida en MySQL 4.0.17). No hace nada, pero se admite en la sintaxis tal como se requiere en SQL estándar.

Antes de MySQL 4.1.2, no era posible mezclar UNION ALL y UNION DISTINCT en la misma consulta. Si se usa ALL para una UNION, se usará para todas ellas. A partir de MySQL 4.1.2, los tipos de UNION mezclados se tratan como si una unión DISTINCT anulara cualquier unión ALL a su izquierda. Una unión DISTINCT se puede producir explícitamente usando UNION DISTINCT o sencillamente UNION sin las palabras DISTINCT o ALL a continuación.

Si se quiere usar una cláusula ORDER BY o LIMIT para ordenar o limitar el resultado completo de una UNION, hay que poner entre paréntesis cada sentencia SELECT individual y colocar el ORDER BY o LIMIT después de la última. El ejemplo siguiente usa ambas cláusulas:

(SELECT a FROM tbl_name WHERE a=10 AND B=1)
UNION
(SELECT a FROM tbl_name WHERE a=11 AND B=2)
ORDER BY a LIMIT 10;

Este tipo de ORDER BY no puede usar referencias de columna que incluyan un nombre de tabla (esto es, nombres en el formato tbl_name.col_name). En su lugar, hay que proporcionar un alias de columna en la primera sentencia SELECT y referirse al alias en la cláusula ORDER BY, o si no referirse a la columna en el ORDER BY usando su posición. (Es preferible un alias ya que el uso de posiciones de columna está desaconsejado.)

Para aplicar ORDER BY o LIMIT a un SELECT individual, hay que colocar la cláusula dentro del paréntesis que contiene el SELECT:

(SELECT a FROM tbl_name WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM tbl_name WHERE a=11 AND B=2 ORDER BY a LIMIT 10);

Los tipos y longidudes de las columnas en el conjunto de resultados de una UNION tienen en cuenta los valores recuperados por todas las sentencias SELECT. Antes de MySQL 4.1.1, una limitación de UNION es que sólo los valores del primer SELECT se usan para determinar los tipos y longitudes de las columnas del resultado. Esto puede producir valores truncados, por ejemplo, el primer SELECT devuelve valores más cortos que el segundo:

mysql> SELECT REPEAT('a',1) UNION SELECT REPEAT('b',10);
+---------------+
| REPEAT('a',1) |
+---------------+
| a             |
| b             |
+---------------+

Esta limitación se ha eliminado desde MySQL 4.1.1:

mysql> SELECT REPEAT('a',1) UNION SELECT REPEAT('b',10);
+---------------+
| REPEAT('a',1) |
+---------------+
| a             |
| bbbbbbbbbb    |
+---------------+