[Ir al menú de PHP]
Consultas en tablas

Sintaxis MySQL de selección de registros

MySQL puede utilizar en sus sentencias de selección de registros -entre otras- las palabras clave que enumeramos a continuación.
Algunas de ellas son obligatorias, otras son opcionales, otras son incompatibles entre sí (alternativas, solo puede elegirse una).

En el uso de estas instrucciones es totalmente imprescindible mantener la secuencia tal y como se enumera aquí debajo.

Si alteráramos ese orden (p. ejemplo: colocando GROUP BY antes de WHERE) nos daría un error y no se ejecutaría la sentencia.

SELECT

Es la primera palabra de la sentencia de búsqueda y tiene carácter obligatorio.

STRAIGHT_JOIN

Es una palabra clave de uso opcional que fuerza al optimizador MySQL a organizar las tablas en el orden en el que han sido especificados los campos en la claúsula FORM.
Sirve para mejorar -en casos muy concretos- la velocidad de gestión de tablas de gran tamaño.

SQL_BIG_RESULT

Es una clausula opcional cuya utilidad es indicar al optimizador que el resultado tendrá una gran cantidad de registros.

En ese caso, MySQL utilizará tablas temporales, cuando sea necesario, para optimizar la velocidad de gestión de la información.

Esta clausula también puede ser utilizada dentro de GROUP BY.

SQL_BUFFER_RESULT

Es opcional y su finalidad es la de forzar a MySQL a tratar el resultado en un fichero temporal.

Ese tratamiento ayuda a MySQL a liberar recursos más rapidamente y es de gran utilidad (siempre desde el punto de vista de la rapidez) cuando es necesario un largo proceso de cálculo antes de enviar los resultados al cliente.

HIGH_PRIORITY

Esta cláusula, opcional daría al comando SELECT prioridad sobre otros comandos que simultaneamente pudieran estar intentando acceder a la tabla para escribir en ella (añadir registros o modificarlos).

Si esta opción está activa, los intentos simultáneos de escritura deberían esperar al final de este proceso para ejecutarse.

DISTINCT

Mediante esta cláusula, insertada inmediatamente después de SELECT se impide que, se muestren valores repetidos en los registros de una tabla. Si hubiera varios registros iguales solo mostrarían una vez. Dos registros serían considerados iguales cuando coincidieran los valores de todos los campos incluidos en la consulta.

campo1, campo2, ...

Tienen carácter obligatorio y señalan los campos de la tabla que deben incluirse en la consulta.

La función SELECT solo devolverá información de aquellos campos que estén enumerados aquí.

Si se desea que la consulta incluya todos campos bastará con incluir en esta posición un * que es el carácter comodín que indica a MySQL que se desea incluir todos los campos en la consulta.

Los campos numéricos tienen la opción de llevar asociadas funciones MySQL que devuelven información estadística.
Algunas de esas funciones son estas: En el caso de aplicar estas funciones, el resultado de la consulta contiene una sola línea, salvo que active la opción GROUP BY en cuyo caso devolverá tantas líneas como grupos resulten.

FROM tabla

Esta expresión -que aunque no tiene carácter totalmente obligatorio- podría tomarse como tal (yo la calificaría de voluntariamente obligatoria) indica a MySQL el nombre de la tabla en el que debe efectuarse la consulta.

WHERE definicion

Esta instrucción tiene carácter opcional y su utilidad es la de filtrar la consulta estableciendo en la definición los criterios de selección de los registros que debe devolver la consulta.

Si se omite, MySQL interpretará que se pretende efectuar la consulta sobre todos los registros.

En la parte derecha tienes información sobre la manera de definir los criterios de selección de esta opción.

GROUP BY definicion

Tiene carácter opcional y su finalidad es la de presentar los resultados de la consulta agrupados siguiendo el criterio establecido en la definición.

Resulta de gran utilidad cuando se pretende obtener valores estadísticos de los registros que cumplen determinadas condiciones (las condiciones establecidas en el agrupamiento.

ORDER BY definicion

También tiene caracter opcional y su utilidad es la de presentar la información de la consulta ordenada por los contenidos de uno o varios campos.

Siempre tiene como opción complementaria de que en cada campo utilizado para la ordenación puede establecerse uno de estos criterios ASC (ascendente, es el valor por defecto) o DESC.

Si no se establece ningún orden, la resultados de la consulta aparecerán por el mismo orden en el que fueron añadidos los registros.

LIMIT m, n

Esta clausula es opcional y permite establecer cuantos y cuales registros han de presentarse en la salida de la consulta.

Por ejemplo: LIMIT 4, 8 indicaría a MySQL que la consulta debería mostrar OCHO registros contados a partir del quinto (si, el quinto porque LIMIT considera el primer registro como CERO).

El criterio límite se aplica sobre los resultados de la salida, es decir, sobre los resultados seleccionados, ordenados y filtrados siguiendo los criterios establecidos por las cláusulas anteriores.

Si se escribe como un solo parámetro (LIMIT k), MySQL lo interpretará que k es el segundo de ellos y que el primero es CERO, es decir:
LIMIT 0, k

Manejo de fechas en las consultas

MySQL dispone de algunas cláusulas de gestión de fechas que pueden tener una gran utilidad a la hora de gestionar consultas. Son las siguientes:

DATE_FORMAT( campo,formato)

Las diferentes opciones de formato las tienes en la tabla de la derecha. Es importante tener en cuenta que la sintaxis correcta es %Y (sin espacio) ya que si hubiera un espacio % Y interpretaría la letra Y como un texto a incluir.

CURDATE()

Dentro de DATE_FORMAT se puede incluir -en vez del nombre del campo- una cadena en la que se indique una fecha en formato YYYY-MM-DD hh:mm:ss. Puedes verlo en los ejemplos. De igual modo es posible sustituir el nombre del campo -o la cadena- por la función CURDATE() que recoge la fecha actual del sistema (únicamente día, mes y año). A efectos de horas, minutos y segundos CURDATE() va a tomar el mediodía de la fecha actual.

CURTIME()

Se comporta de forma similar a CURDATE().

Devuelve la hora actual del sistema que alberga el servidor MySQL en formato hh:mm:ss

CURRENT_TIMESTAMP()

Se comporta de forma similar a CURDATE().

Devuelve la fecha y hora actual del sistema en formato YYYY-MM-DD hh:mm:ss

NOW()

Es un alias de
CURRENT_TIMESTAMP().

mysql_result($resultado,num, campo)

Esta función PHP permite obtener un solo campo de uno solo de los registros obtenidos como resultado de una consulta MySQL.

El parámetro $resultado es la variable que recoge en resultado obtenido de la ejecuación de mysql_query de forma idéntica a como lo hacíamos en otras consultas.

El valor num es un número entero que indica el número de fila de la que queremos extraer el valor contenido en uno de sus campos.

El valor campo indica el número del campo que tratamos de extraer. Este número (la primera posición siempre es cero) indica el número de orden del campo tal como está especificado en la sentencia SELECT. Si en esta sentencia se incluyera * (extraer todos los campos) consideraría el orden en el que está creada la estructura de la tabla que los contiene.

Este es el código fuente de un ejemplo comentado y este un enlace de prueba del script.

 
 


Manejando consultas

Las consultas de una tabla ofrecen un amplisímo abanico de posibilidades a partir de las opciones que tienes descritas al margen. Aquí tienes algunos ejemplos de ello, aplicados a la tabla demo4 que hemos creado en las páginas anteriores.


La consulta más simple

Si utilizamos la sentencia
SELECT * FROM tabla
obtendremos información sobre todos los campos (*) y la salida estará en el mismo orden en el que fueron añadidos los datos. Si visualizas es ejemplo, verás que aparecen ordenados por el valor autonumérico del campo Contador lo cual -como ves- resulta coherente con la afirmación anterior.
Ver código fuente Ejecutar la consulta


Consultando solo algunos campos

Ahora utilizaremos la sentencia
SELECT campo1,campo2, ... FROM tabla
y tendremos como resultado una lista completa, por el mismo orden que la anterior, pero solo mostrando los campos indicados.
Ver código fuente Ejecutar la consulta


Consultando registros con algunos algunos campos distintos

Ahora utilizaremos la sentencia
SELECT DISTINCT campo1,campo2, ... FROM tabla
y tendremos como resultado una lista completa de resultados en los que no habrá dos resultados en los que coincidan conjuntamente los valores de campo1 y campo2. Podrían repetirse cada uno de ellos independientemente pero no de forma conjunta.
Ver código fuente Ejecutar la consulta


Consultando solo algunos campos y limitando la salida a n registros

Ahora utilizaremos la sentencia
SELECT campo1,campo2, ... FROM tabla LIMIT (n, m)
y tendremos como resultado una lista que contendrá m registros a partir del n+1, por el mismo orden que la anterior, y mostrando los campos indicados.
Ver código fuente Ejecutar la consulta


Consultando solo algunos campos y limitando la salida a los n primeros registros

Ahora utilizaremos la sentencia
SELECT TOP N campo1,campo2, ... FROM tabla
y tendremos como resultado una lista que contendrá m registros a partir del n+1, por el mismo orden que la anterior, y mostrando los campos indicados.
Ver código fuente Ejecutar la consulta


Consultando solo algunos campos y ordenando la salida

Utilizaremos la sentencia MySQL de esta forma
SELECT campo1,campo2, ... FROM tabla ORDER BY campo_n [ASC|DESC], campo_m [ASC|DESC]
y tendremos como resultado una lista ordenada por el primero de los campos indicados en ORDER BY y en caso de coincidencia de valores en ese campo sería cuando utilizara el criterio de ordenación señalado en segundo lugar.
Ver código fuente Ejecutar la consulta


Consulta seleccionando registros

Utilizaremos la sentencia MySQL de esta forma
SELECT campo1, ... FROM tabla WHERE condicion
que nos devolverá la lista de registros que cumplen la condición indicada. Aquí tienes un ejemplo muy sencillo.
Ver código fuente Ejecutar la consulta

La claúsula WHERE permite un variado abanico de condiciones, de los que trataremos de resumir aquí. Algunos de ellos son los siguientes:

Operador Tipo
de campo
Sintaxis Descripción Código
fuente
Ver
ejemplo
= Numérico WHERE campo=num Seleciona los registros que contienen en el campo un valor igual a num Ver Probar
= Cadena WHERE campo="cadena" Seleciona los registros que contienen en el campo un cadena idéntica a cadena (*) Ver Probar
< Numérico WHERE campo<num Seleciona los registros que contienen en el campo un valor menor a num Ver Probar
< Cadena WHERE campo<"cadena" Seleciona los registros que contienen en el campo un cadena cuyos n primeros caracters son menores que los de la cadena, siendo n el número de caracteres que contiene cadena. (**) Ver Probar
<= Numérico WHERE campo<=num Seleciona los registros que contienen en el campo un valor menor O igual a num Ver Probar
<= Cadena WHERE campo<="cadena" Seleciona los registros que contienen en el campo un cadena cuyos n primeros caracters son menores que los de la cadena, siendo n el número de caracteres que contiene cadena y añade respecto al caso anterior la opción de que en caso de que ambos valores fueran iguales también los presentaría (**) Ver Probar
> Numérico WHERE campo>num Seleciona los registros que contienen en el campo un valor mayor a num Ver Probar
> Cadena WHERE campo>"cadena" Seleciona los registros que contienen en el campo un cadena cuyos n primeros caracters son mayores que los de la cadena, siendo n el número de caracteres que contiene cadena. (**) Ver Probar
>= Numérico WHERE campo>=num Seleciona los registros que contienen en el campo un valor mayor O igual a num Ver Probar
>= Cadena WHERE campo>="cadena" Seleciona los registros que contienen en el campo un cadena cuyos n primeros caracters son mayores que los de la cadena, siendo n el número de caracteres que contiene cadena y añade respecto al caso anterior la opción de que en caso de que ambos valores fueran iguales también los presentaría (**) Ver Probar
IN Numérico
o
Cadena
WHERE campoIN (valor1,valor2..) Seleciona los registros que contienen en el campo valores que coinciden con alguno de los especificados dentro del paréntesis. Cuando se trata de valores no numéricoz han de ir entre comillas Ver Probar
BETWEEN Numérico
o
Cadena
WHERE campo BETWEEN valor1 AND valor2 Seleciona los registros en los que los valores contenidos en el campo seleccionado están comprendidos en el intervalo valor1 (mínimo) – valor2 (máximo) incluyendo en la selección ambos extremos.
Cuando los contenidos de los campos son cadenas sigue los mismos criterios que se indican para los demás operadores de comparación
Ver Probar
IS NULL Cadena WHERE campo IS NULL Seleciona los registros en los que los valores contenidos en el campo seleccionado son NULOS Ver Probar
IS NOT NULL Cadena WHERE campo IS NOT NULL Seleciona los registros en los que los valores contenidos en el campo seleccionado son NO NULOS Ver Probar
(*) Cuando se trata de cadenas de carácteres, el concepto menor que significa anterior en la ordenación de los caracteres según su código ASCII y mayor que significa posterior en esa misma ordenación.
(**) La discriminación de Mayúsculas/Minúsculas dependerá del tipo de campo.
Recuerda que los tipo BLOB si hacen esa discriminación, mientras que los de tipo TEXT son insensibles a Mayúsculas/Minúsculas.


Cuando se trata de comparar cadenas MySQL dispone de una potente instrucción (LIKE) que permite establecer los criterios de selección a toda o parte de la cadena. Su sintaxis contempla distintas posibilidades utilizando dos comodines>: % (que se comporta de forma similar al (*) en las búsquedas de Windows) y _ (de comportamiento similar a (?) en Windows). Aquí tienes algunas de sus posibilidades:

Sintaxis Descripción Código
fuente
Ver
ejemplo
WHERE campo LIKE '%cadena%' Selecciona todos los registros que contengan la cadena en el campo indicado sea cual fuere su posición Ver Probar
WHERE campo LIKE 'cadena%' Selecciona todos los registros en los que el campo indicado que contengan la cadena exactamente al principio del campo Ver Probar
WHERE campo LIKE '%cadena' Selecciona todos los registros en los que el campo indicado que contengan la cadena exactamente al final del campo Ver Probar
WHERE campo LIKE '_cadena%' Selecciona todos los registros en los que el primer caracter del campo puede ser cualquiera pero los siguientes han de ser exactamente los indicados en cadena pudiendo ir seguidos de cualesquiera otros caracteres Ver Probar

El comodín (_) puede ir tanto al principio como al final y puede repetirse tantas veces como sea necesario. Seria correcto LIKE '___es%' y también LIKE 'a___es%' así como: LIKE '%a___es'.

Como ves, un mogollón de posibilidades...

Aun tiene más opciones WHERE ya que acepta múltiples condiciones vinculadas por los operadores lógicos AND, OR, NOT o sus sintaxis equivalentes: &&, || y !.

El comportamiento de estos operadores es idéntico al descrito para sus homónimos de PHP. ¿Los recuerdas?... Aquí los tienes... por si acaso.

Un ejemplo de sintaxis podría ser: WHERE (campo1=valor AND campo2 LIKE '_cadena%)


Utilizando funciones sobre campos

La sintaxis
SELECT MAX(campo1), MIN (campo2), ... FROM tabla
nos devolvería UNA SOLA FILA cuyos valores serían los resultados de la aplicación de las funciones a todos los registros del campo indicado.
Aquí tienes un ejemplo que determina todos los valores de esos estadísticos aplicados al campo Contador de nuestra famosa tabla demo4.

Es momento de entonar el mea culpa... ya que ese campo no es nada significativo pero es el único numérico de esa tabla y a estas alturas de la película... me da pereza modificar la tabla. Espero que no me condenes al fuego eterno por ello... :-)

Aquí está el ejemplo


Ver código fuente Ejecutar la consulta

Aplicando la opción GROUP BY

Tal como señalamos al margen las funciones anteriores pueden aplicarse a grupos de registros seleccionados mediante un criterio GROUP BY (nombre del campo)

En este ejemplo, obtendremos los mismos parámetros estadísticos que en el anterior, pero ahora agrupados por sexo lo que significaría que obtendremos dos filas de resultados. Aquí tienes el ejemplo


Ver código fuente Ejecutar la consulta

Como habrás podido observar, la opción SELECT permite todo... menos casarse... :-)

¡¡Que la disfrutes...!!

Creación de tablas a partir de la consulta de otra tabla

No es un infrecuente -yo diría yo que es lo habitual- relacionar tablas mediante campos con idéntico contenido.

Supongamos que entre los individuos de nuestra tabla demo4 se pretende establecer un proceso de selección para elegir entre ellos un número determinado de... astronautas, pongamos por caso... :-)

Supongamos también, que la selección va a constar de tres pruebas que serán juzgadas y calificadas por tres tribunales distintos.

Una primera opción sería crear tres tablas -una para cada tribunal- e incluir en ellas todos los datos de cada uno de los individuos.

Esa opción es factible pero no es ni la más cómoda, ni tampoco es la más rápida ni la que menos espacio de almacenamiento necesita. No olvides que una tabla puede tener una enorme cantidad de registros.

Una opción alternativa sería crear tres nuevas tablas que solo contuvieran dos campos cada una. Por ejemplo el campo DNI y el campo Calificación.

Como quiera que el campo DNI ha de contener los mismos valores en las cuatro tablas y además es un campo único podrían crearse las nuevas tablas y luego copiar en cada una de ellas todos los DNI de la tabla original.

Nos garantizaría que no habría errores en los DNI y además nos garantizaría que se incluyeran todos en esa nuevas tablas.

Aquí tienes el código fuente de un script que crea esas tres tablas (a las que hemos llamado demodat1, demodat2 y demodat3.


Ver código fuente

Una consulta conjunta de varias tablas

MySQL permite realizar consultas simúltaneas en registros situados en varias tablas.

Para ese menester se usa la siguiente sintaxis:

SELECT tabla1.campo1, tabla2.campo2, ... FROM tabla1, tabla2

en la que, como ves, modificamos un pelín la sintaxis ya que anteponemos el nombre de la tabla al del campo correspondientes separando ambos nombres por un punto con lo cual no hay posibilidad de error de identificación del campo incluso cuando campos de distinta tabla tengan el mismo nombre.

Otra innovación -respecto a los ejemplos anteriores- es que detrás de la cláusulaFROM escribimos los nombres de todas las tablas que está usando SELECT.

A partir de ahí se pueden establecer todo tipo de relaciones para las sentencias WHERE, ORDER BY y GROUP BY utilizando para ello campos de cualquiera de las tablas sin otra particularidad más que... poner cuidado al aludir a los campos.. utilizando siempre la sintaxis nombre_tabla.nombre_campo.

A modo de ejemplo -he procurado comentarlo línea a línea- aquí tienes un script PHP que hace una consulta conjunta de las tablas demo4, demodat1, demodat2 y demodat3 y nos presenta una tabla con los datos personales y las puntuaciones de las tres pruebas así como las suma de puntos de las tres y además de ordena los resultados -de mayor a menor- según la suma de las tres puntuaciones.


Ver código fuente Ejecutar la consulta

Formatos de fechas en consultas MySQL

Los formatos soportados por la función DATE_FORMAT format son los siguientes:

Formato Descripción Sintaxis Ver código Ver ejemplo
%d Día del mes en formato de dos dígitos DATE_FORMAT(Nacimiento,'%d') Ver Probar
%e Día del mes en formato de uno ó dos dígitos DATE_FORMAT(Nacimiento,'%e') Ver Probar
%D Número de día seguido del sufijo en inglés DATE_FORMAT(Nacimiento,'%D') Ver Probar
%m Número del mes en formato de dos dígitos DATE_FORMAT(Nacimiento,'%m') Ver Probar
%c Número del mes en formato de uno o dos dígitos DATE_FORMAT(Nacimiento,'%c') Ver Probar
%M Nombre del mes (en inglés) DATE_FORMAT(Nacimiento,'%M') Ver Probar
%b Nombre del mes abreviado (en inglés) DATE_FORMAT(Nacimiento,'%b') Ver Probar
%y Número del año en formato de dos dígitos DATE_FORMAT(Nacimiento,'%y') Ver Probar
%Y Número del año en formato de cuatro dígitos DATE_FORMAT(Nacimiento,'%Y') Ver Probar
%w Número de día de la semana 0=Domingo ... 6=Sábado DATE_FORMAT(Nacimiento,'%w') Ver Probar
%W Nombre del día de la semana (en inglés) DATE_FORMAT(Nacimiento,'%W') Ver Probar
%W Nombre abreviado del día de la semana (en inglés) DATE_FORMAT(Nacimiento,'%W') Ver Probar
%j Número de día del año en formato de 3 dígitos DATE_FORMAT(Nacimiento,'%j') Ver Probar
%U Número de semana del año considerando el DOMINGO como primer día de la semana (en formato de dos dígitos) DATE_FORMAT(Nacimiento,'%U') Ver Probar
%u Número de semana del año considerando el LUNES como primer día de la semana (en formato de dos dígitos) DATE_FORMAT(Nacimiento,'%u') Ver Probar
La fecha para los ejemplos siguientes la extraemos de una variable del tipo:
$fecha="2005-10-12 14:23:42"
ya que la tabla no contiene campos de fecha que incluyan horas, minutos y segundos
%H Hora con dos dígitos (formato 0 a 24 horas) DATE_FORMAT($fecha,'%H') Ver Probar
%k Hora con uno ó dos dígitos (formato 0 a 24 horas) DATE_FORMAT($fecha,'%k')
%h Hora con dos dígitos (formato 0 a 12 horas) DATE_FORMAT($fecha,'%h')
%I Hora con uno ó dos dígitos (formato 0 a 12 horas) DATE_FORMAT($fecha,'%I')
%i Minutos con dos dígitos DATE_FORMAT($fecha,'%i')
%s Segundos con dos dígitos DATE_FORMAT($fecha,'%s')
%r Hora completa (HH:mm:ss) en formato de 12 horas indicando AM ó PM DATE_FORMAT($fecha,'%r')
%T Hora completa (HH:mm:ss) en formato de 24 horas DATE_FORMAT($fecha,'%T')
% texto Incluye el texto que se indica detrás del % DATE_FORMAT($fecha,'% texto')
%p Añade AM ó PM dependiendo de la Hora DATE_FORMAT($fecha,'%p')
Se pueden combinar a voluntad varias opciones utilizando una sintaxis de este tipo:
'% Hoy es: %d - %m - %Y % es %W % estamos en el mes de %M % <br>y van transcurridos %j % dias de este año.<br>Son las %r'



Sugerir a un/a amig@ Envíame tus comentarios
Anterior
Indice
Siguiente