Vous êtes sur la page 1sur 8

SELECT

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 \
[ASC | DESC], ... [WITH ROLLUP]]
[HAVING where_definition]
[ORDER BY \
[ASC | DESC] ,...]
[LIMIT \]
[PROCEDURE procedure_name(argument_list)]
[FOR UPDATE | LOCK IN SHARE MODE]]

SELECT se usa para recuperar filas selecionadas de una o ms tablas. El soporte para
sentencias UNION y subconsultas est disponible a partir de MySQL 4.0 y 4.1,
respectivamente.
Cada select_expr indica una columna que se quiere recuperar.
table_references indica la tabla o tablas de las que se recuperan filas.
Su sintaxis se describe en .
where_definition consiste de la palabra clave WHERE seguida por una
expresin que indica la condicin o condiciones que las filas deben
satisfacer para ser seleccionadas.
SELECT puede usarse tambin para recuperar filas calculadas sin referencia a
ninguna tabla. Por ejemplo:
mysql> SELECT 1 + 1;
-> 2

Todas las clasulas usadas deben darse en el mismo orden exacto que se muestra en la
descripcin de la sintaxis. Por ejemplo, la clusula HAVING debe estar despus de
cualquier clusula GROUP BY y antes de cualquier clusula ORDER BY.
Una select_expr puede usar alias mediante AS nombre_alias. El alias
se usa como un nombre de columna en expresiones y puede usarse por
las clasulas ORDER BY o HAVING. Por ejemplo:

mysql> SELECT CONCAT(apellido,', ',nombre) AS


nombre_completo
FROM mitabla ORDER BY nombre_completo;

La palabra clave AS es opcional cuando se define un alias en


unaselect_expr. El ejemplo anterior se puede escribir como:
mysql> SELECT CONCAT(apellido,', ',nombre)
nombre_completo
FROM mitabla ORDER BY nombre_completo;

Debido a que AS es opcional, puede ocurrir un problema si se olvida la


coma entre dos select_expr: MySQL interpreta el segundo como un
alias. Por ejemplo, en la sentencia siguiente, columnab se trata como un
alias:
mysql> SELECT columna columnab FROM mitabla;

No est permitido usar un alias en una clusula WHERE, porque el


valor de la columna puede que no est determinado todava cuando la
clusula WHERE es ejecutada.
La clusula FROM table_references indica las tablas desde las que se
recuperarn filas. Si se nombra ms de una tabla, se realiza una unin
(). Para cada tabla especificada, opcionalmente se puede especificar un
alias.
table_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


proporcionar al optimizador pistas sobre cmo elegir ndices se describe
en la sintaxis de . En MySQL 4.0.14, se puede usar como una alternativa
para forzar a MySQL a elegir un recorrido secuencial por clave en lugar
de un recorrido secuencial de la tabla.
Desde la versin 3.23.12 de MySQL, se pueden obtener pistas sobre qu
ndice debe usar
Se puede hacer referencia a una tabla con el nombre de la tabla
"tbl_name" (dentro de la base de datos actual), o con la especificacin
completa incluyendo la base de datos "dbname.tbl_name". Tambin se
puede hacer referencia a una columna como "col_name",
"tbl_name.col_name", o "db_name.tbl_name.col_name". No es
necesario especificar un prefijo "tbl_name" o "db_name.tbl_name"
para referenciar una columna en una sentencia SELECT a no ser que la
referencia pueda resultar ambigua.

Desde la versin 4.1.0, se puede especificar DUAL como nombre de


una tabla vaca, en situaciones en las que no haya tablas definidas.
mysql> SELECT 1 + 1 FROM DUAL;
-> 2

Esta es una caracterstica aadida slo por compatibilidad. Ciertos


servidores requieren esa sintaxis.

Se puede definir un alias a una referencia de tabla mediante tbl_name


[AS] 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, se puede usar cualquiera de las funciones


soportadas por MySQL, excepto funciones las de reunin (resumen).
Las columnas seleccionadas pueden ser referenciadas a
clasulasORDER BY y GROUP BY usando nombres de columna, alias de
columna o posiciones de columna. Las posiciones de columna son
enteros que empiezan en 1:
mysql> SELECT college, region, seed FROM tournament
->
mysql> SELECT
tournament
->

college,

region

AS

r,

seed

AS

FROM

ORDER BY r, s;

mysql> SELECT college, region, seed FROM tournament


->

ORDER BY region, seed;

ORDER BY 2, 3;

Para ordenar en orden inverso se aade la palabra


clave DESC(descendente) al nombre de la columna en la
clusula ORDER BY en la que se est ordenando. Por defecto el orden es
ascendente, pero puede ser especificado explcitamente por la palabra
clave ASC. El uso de posiciones de columna est desaconsejado ya que
esa sintaxis ha sido eliminada de SQL estndar.
Si se usa GROUP BY, la filas de salida sern ordenadas de acuerdo con
elGROUP BY como si se hubiese usado ORDER BY sobre los campos
delGROUP BY. MySQL ha extendido la clusula GROUP BY a partir de
la versin 3.23.34 de modo que se puede especificar
tambin ASC y DESCdespus de los nombres de columna en la clusula:

SELECT a,COUNT(b) FROM test_table GROUP BY a DESC

MySQL ha extendido el uso de GROUP BY para permitir seleccionar


campos que no se han mencionado en la clusula GROUP BY. Si no se
obtiene el resultado esperado de la consulta, leer la descripcin
deGROUP BY.
A partir de MySQL 4.1.1, GROUP BY permite el modificador WITH
ROLLUP.
La clusula HAVING se aplica cerca del final, justo antes de que los
resultados se enven al cliente, sin optimizaciones. (LIMIT se aplica
despus de HAVING). Antes de MySQL 5.0.2, una clusula HAVING se
puede referir a cualquier columna o alias en la select_expr de
listaSELECT o en las subconsultas exteriores, y a las funciones
agregadas. SQL estndar requiere que HAVING debe hacer deferencia
slo a columnas en la clusula GROUP BY o columnas usadas en
funciones agregadas. Para permitir ambos comportamientos, el de SQL
estndar y el especfico de MySQL, que permite referirse a columnas en
la listaSELECT, a partir de MySQL 5.0.2 se permite que HAVING se
refiera a columnas en la lista SELECT, columnas en la clusula GROUP
BY, columnas en subconsultas exteriores, y a funciones agregadas. Por
ejemplo, la siguiente sentencia funciona en MySQL 5.0.2, pero produce
un error en versiones anteriores:
mysql> SELECT COUNT(*) FROM t GROUP BY col1 HAVING col1 =
2;

Si la clusula HAVING se refiere a una columna que es ambigua, se


produce un aviso. En la sentencia siguiente, col2 es ambiguo porque se
usa tanto como un alias y como un nombre de columna:
mysql> SELECT COUNT(col1) AS col2 FROM t GROUP BY col2
HAVING col2 = 2;

Se da preferencia al comportamiento de SQL estndar, as que si un


nombre de columna en un HAVING se usa en un GROUP BY y como un
alias de columna en la lista de columnas de salida, se toma
preferentemente la columna en GROUP BY.
No se debe usar HAVING para items para los que se pueda usar una
clusula WHERE. Por ejemplo, no escribir esto:
mysql> SELECT col_name FROM tbl_name HAVING col_name > 0;

Sino esto:
mysql> SELECT col_name FROM tbl_name WHERE col_name > 0;

La clusula HAVING se puede referir a funciones agregadas, a las que


una clusula WHERE no puede:

mysql> SELECT user, MAX(salary) FROM users


->

GROUP BY user HAVING MAX(salary)>10;

Sin embargo, esto no funciona en servidores antiguos de MySQL


(anteriores a la versin 3.22.5). En su lugar, se puede usar un alias de
columna en la lista SELECT y referirse al alias en la clusula HAVING:
mysql> SELECT user, MAX(salary) AS max_salary FROM users
->
GROUP BY user HAVING max_salary>10;

La clusula LIMIT puede ser usada para limitar a que el nmero de


filas devuelto por la sentencia SELECT. LIMIT toma uno o dos
argumentos numricos, que deben ser constantes enteras. Con dos
argumentos, el primero especifica el desplazamiento de la primera fila a
devolver, el segundo especifica el mximo nmero de filas a devolver. El
desplazamiento de la fila inicial es 0 (no 1):
mysql> SELECT * FROM table LIMIT 5,10;
6-15

# Recupera filas

Por compatibilidad con PostgreSQL, MySQL tambin soporta la


sintaxis:LIMIT row_count OFFSET offset. Para recuperar todas las filas
a partir de un desplazamiento concreto hasta el final del conjunto de
resultados, se puede usar un nmero muy grande como segundo
parmetro. Esta sentencia recupera todas las filas a partir de la 96 hasta
el final:
mysql> SELECT * FROM table LIMIT 95,18446744073709551615;

Con un argumento, el valor especifica el nmero de filas a devolver


desde el principio del conjunto de resultados.
mysql> SELECT * FROM table LIMIT 5;
rows

# Retrieve first 5

En otras palabras, LIMIT n equivale a LIMIT 0,n.


El formato SELECT ... INTO OUTFILE 'file_name' de SELECT escribe
las filas seleccionadas en un fichero. El fichero se crea en el host del
servidor, de modo que se debe poseer el privilegio FILE para usar esta
sintaxis.El fichero no debe existir previamente, entre otras cosas, esto
previene que tablas de la base de datos y otros ficheros como
`/etc/passwd' puedan ser destruidos. La sentencia SELECT ... INTO
OUTFILE est pensada para permirtir un volcado muy rpido de una
tabla en la mquina del servidor. Si se quiere crear el fichero resultado
en algn otro host, no se puede usar SELECT ... INTO OUTFILE. En ese
caso se debe usar en su lugar algn otro programa en el cliente
comomysql -e "SELECT ..." > outfile en el ordenador cliente para
generar el fichero. SELECT ... INTO OUTFILE es el complemento de la

sintaxis para la parte export_options de la sentencia es la misma que


para
las
clasulas FIELDS y LINES que
se
usan
con
la
sentencia . FIELDS SCAPED BY controla el modo en que se escriben los
caracteres especiales. Si el carcter de FIELDS ESCAPED BY no es
vaco, se usar como prefijo para los siguientes caracteres en la salida:
o
El carcter ESCAPED BY.
o
El carcter FIELDS [OPTIONALLY] ENCLOSED BY.
o
El primer carcter de los valores FIELDS TERMINATED
BY yLINES TERMINATED BY.
o

ASCII 0 (que actualmente se escribe seguido del carcter


de escape ASCII `0', no un byte de valor cero.

Si el cacter FIELDS ESCAPED BY se deja vaco, no se escapa ningn


carcter y NULL se muestra como NULL, no \N. Probablemente no sea
una buena idea especificar un carcter de escape vaco, sobre todo si
existen valores de columnas en los datos que contengan cualquiera de
los caracteres de la lista dada. El motivo de esto es que que se debe
escapar cualquier carcter FIELDS TERMINATED BY, ESCAPED
BY o LINES TERMINATED BY para que sea posible leer el fichero ms
tarde. El carcter ASCII NUL se escapa para que sea ms fcil
visualizarlo. Como el fichero resultante no tiene que seguir la sintaxis
SQL, no es necesario escapar nada ms. He aqu un ejemplo para
obtener un fichero en formato de valores separados con comas usado
por muchos 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 se usa INTO DUMPFILE en lugar de INTO OUTFILE, MySQL slo


escribir una fila en el fichero, sin tabulaciones o terminadores y sin
realizar ningn proceso de escapado. Esto es prctico si se quiere
almacenar un valor BLOB en un fichero.
Nota: Cualquier fichero creado por INTO OUTFILE y INTO
DUMPFILEdebe tener permiso de escritura para todos los usuarios en
el servidor. El motivo es que el servidor MySQL no puede crear un
fichero cuyo dueo sea alguien diferente que el usuario que hace la
consulta (nunca se debe ejecutar MySQL como root). De modo que el
fichero debe tener permiso de escritura para todo el mundo para que se
pueda manejar su contenido.
Una clusula PROCEDURE nombra a un procedimiento que debe
procesar los datos en el conjunto de resultados.
Si se usa FOR UPDATE en un proceso de almacenamiento con bloqueo
de pgina o de filas, las filas examinadas estarn bloquedas para
escritura hasta el final de la operacin actual. Usando IN SHARE
MODEactiva el bloqueo de compartir que evita que otras transacciones
puedan actualizar o borrar las filas examinadas.

A continuacin de la palabra clave SELECT, se pueden aadir determinadas opciones


que afectan al funcionamiento de la sentencia.
Las opciones ALL, DISTINCT y DISTINCTROW especifican si las filas duplicadas
deben ser devueltas. Si no se da ninguna de estas opciones, por defecto se usa ALL(se
devuelven todas las filas coincidentes). DISTINCT y DISTINCTROW son sinnimos y
especifican que las filas duplicadas en el conjunto de resultados deben ser eliminadas.
HIGH_PRIORITY, STRAIGHT_JOIN y las opciones que empiezan con SQL_ son
extensiones MySQL al SQL estndar.
HIGH_PRIORITY dar a SELECT mayor prioridad que a sentencias que
actualicen una tabla. Slo se debe usar para consultas que sean muy rpidas y deban
ser hechas inmediatamente. Una consulta SELECT HIGH_PRIORITY que se realice
mientras la tabla est bloqueada para lectura se realizar aunque exista una sentencia
de actualizacin que est esperando a que la table deje de estar
bloqueada.HIGH_PRIORITY no se puede usar con sentecias SELECT que sean parte
de unaUNION.
STRAIGHT_JOIN fuerza el optimizador a unir tablas en el orden en que han sido
listadas en la clusula FROM. Se puede usar para mejorar la velocidad de una consulta
si el optimizador une las tablas en un orden no ptimo.
Consultar .STRAIGHT_JOIN tambin puede ser usado en la lista de table_references.
Ver
SQL_BIG_RESULT puede ser usada con GROUP BY o DISTINCT para informar al
optimizador que el conjunto resultados puede contener muchas filas. En ese caso,
MySQL podr usar directametne tablas temporales en disco si es necesario. MySQL
puede tambin, en este caso, optar por ordenar una tabla temporal con una clave
dentro de los elementos GROUP BY.
SQL_BUFFER_RESULT fuerza que el resultado sea colocado en una tabla
temporal. Esto ayuda a MySQL a librerar bloqueos en tablas ms rpidamente y ayuda
en casos donde toma mucho tiempo en enviar los datos al cliente.
SQL_SMALL_RESULT, puede usarse con GROUP BY o DISTINCT para informar
al optimizador que el resultado ser pequeo. En ese caso, MySQL usa tablas
temporales rpidas para almecenar la tabla resultado en lugar de usar ordenamiento. A
partir de MySQL 3.23 esto normalmente no es necesario.
SQL_CALC_FOUND_ROWS (versin 4.0.0 y siguientes) indica a MySQL que
calcule cuntas filas contendr el conjunto de resultados, ignorando cualquier
clusula LIMIT. El nmero de filas puede recuperarse con SELECTFOUND_ROWS().
Con versiones anteriores a la 4.1.0 esto no funcionar junto conLIMIT 0, ya que est
optimizado de modo que regrese instantaneamente (resultando un nmero de filas
igual a cero).
SQL_CACHE dice a MySQL que almacene el resultado de la consulta en un cach si
se usa un valor 2 o DEMAND para QUERY_CACHE_TYPE. Para una consulta que
use UNION o subconsultas, esta opcin tendr efecto al ser usada en
cualquierSELECT de la consulta.
SQL_NO_CACHE indica a MySQL que no almacene el resultado de la consulta en
el cach de consulta. Para una consulta que use UNION o subconsultas, esta opcin
tendr efecto al ser usada en cualquier SELECT de la consulta.
Buscar en:
Buscar
suministrado por FreeFind

Con Clase

Comentarios de los usuarios (1)

jorge
2012-12-07 02:19:11
Tengo un problema con una impresion....
disee un reporte que contiene un maestro y detalles...
en la parte del detalle requiero hace un 8 columnas pero mi table solotiene una columna es
decir
la tabla de detalle es
id
folio
estatus
en los folio se capturan los numeros
tabla maestro:
operacion: 8
clave: 450
Calificacion: roca
tabla detalle
folios acumulados
8256
8265
8296
8269
requiero que mi reporte salga de esta manera:
tabla maestro:
operacion: 8
clave: 450
Calificacion: roca
tabla detalle
folios acumulados
8256 8265 8296 8269
Marzo de 2005, Salvador Pozo Coronado, salvador@conclase.net

Vous aimerez peut-être aussi