Está en la página 1de 5

Consultas en tablas

Sintaxis MySQL de
Consultar los registros de una tabla
selección de registros
Las consultas de los datos y registros contenidos en una tabla ofrecen un amplísimo
abanico de posibilidades a partir de las opciones que tienes descritas al margen. Veamos
Las sentencias de selección de
registros requieren utilizar -entre algunas de las posibilidades.
otras- palabras clave como las que
enumeramos a continuación. La consulta más simple
Observa que hay dos tipos:
obligatorias y opcionales, y que Si utilizamos la sentencia
algunas de las palabras clave son SELECT * FROM tabla
alternativas y por lo tanto,
incompatibles en una misma
sentencia. 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 este ejemplo, verás que aparecen
El uso de estas palabras clave
ordenados por el valor autonumérico del campo Contador lo cual, como ves, resulta
requiere que sean insertadas en un
coherente con la afirmación anterior.
determinado orden tal y como se
enumera aquí debajo.

Si alteráramos ese orden (p. Ver código fuente Ejecutar la consulta


ejemplo: colocando GROUP BY
antes de WHERE) nos daría un
error y no se ejecutaría la
Consultando sólo algunos campos
sentencia.
Ahora utilizaremos la sentencia
SELECT
SELECT campo1,campo2, ... FROM tabla
Es la primera palabra de la
sentencia de búsqueda y tiene
carácter obligatorio. y tendremos como resultado una lista completa, por el mismo orden que la anterior, pero
sólo mostrando los campos indicados.
[STRAIGHT_JOIN]

Es una palabra clave de uso Ver código fuente Ejecutar la consulta


opcional (la marcamos con
corchetes para indicar su condición
de opcional) que fuerza al ¡Cuidado!
optimizador MySQL a organizar las
tablas en el mismo orden en el que En los comentarios contenidos en estos ejemplos puedes ver la forma en la que
han sido especificados los campos mysql_fetch_row y mysql_fetch_array tratan los índices escalares de los resultados que
en la cláusula FORM. producen los SELECT de MySQL.
Los valores de los índices se asignan a los contenidos de los campos por el mismo orden en
Sirve para mejorar -en casos muy
concretos- la velocidad de gestión el que estos se escriben en la sentencia SELECT. El campo1 (primero que se escribe) será
de tablas de gran tamaño. recogido por el elemento de índice cero del array, el campo2 será recogido con índice uno y
así sucesivamente
[SQL_BIG_RESULT]

Es una cláusula opcional que se Consultando sólo algunos campos y limitando la salida a n registros
usa para indicar al optimizador que
el resultado va a tener una gran
cantidad de registros. Ahora utilizaremos la sentencia
SELECT campo1,campo2, ... FROM tabla LIMIT (n, m)
En ese caso, MySQL utilizará
tablas temporales cuando sea
necesario para optimizar la y tendremos como resultado una lista que contendrá m registros a partir del n+1, por el
velocidad de gestión de la mismo orden que la anterior, y mostrando los campos indicados.
información.

Esta cláusula también puede ser


Ver código fuente Ejecutar la consulta
utilizada dentro de GROUP BY.

[SQL_BUFFER_RESULT]
Consultando sólo algunos campos y ordenando la salida
Es opcional y su finalidad es la de
forzar a MySQL a tratar el Utilizaremos la sentencia MySQL de esta forma
resultado en un fichero temporal.
SELECT campo1,campo2, ... FROM tabla ORDER BY campo_n [ASC|DESC],
Ese tratamiento ayuda a MySQL a campo_m [ASC|DESC]
liberar recursos más rápidamente
y es de gran utilidad (siempre
desde el punto de vista de la y tendremos como resultado una lista ordenada por el primero de los campos indicados
rapidez) cuando es necesario un en ORDER BY, y en caso de coincidencia de valores en ese campo, utilizaríamos el
largo proceso de cálculo antes de criterio de ordenación señalado en segundo lugar.
enviar los resultados al cliente.

[HIGH_PRIORITY] Ver código fuente Ejecutar la consulta


Esta cláusula, opcional da
prioridad al comando SELECT Consulta seleccionando registros
sobre otros comandos que
simultáneamente pudieran estar
intentando acceder a la tabla para Utilizaremos la sentencia MySQL de esta forma
escribir en ella (añadir o modificar SELECT campo1, ... FROM tabla WHERE condición
registros).

Si esta opción está activa, los que nos devolverá la lista de registros que cumplen la condición indicada. Aquí
intentos de escritura que pudieran tienes un ejemplo muy sencillo.
producirse de forma simultánea
deberían esperar al final de este
proceso para ejecutarse. Ver código fuente Ejecutar la consulta
campo1, campo2, ...
La claúsula WHERE permite un variado abanico de condiciones, que trataremos de
Tienen carácter obligatorio y resumir aquí. Algunos de ellas son los siguientes:
señalan los campos de la tabla
que deben incluirse en la consulta.
Tipo Código Ver
Operador Sintaxis Descripción
de campo fuente ejemplo
La función SELECT sólo devolverá
información de aquellos campos Selecciona los registros
que estén enumerados aquí. que contienen en el
= Numérico WHERE campo=num
campo un valor igual a
Ver Probar

Si se desea que la consulta num


incluya a todos campos bastará Selecciona los registros
con incluir en esta posición un *, que contienen en el
que es el carácter comodín que
= Cadena WHERE campo="cadena"
campo una cadena
Ver Probar

indica a MySQL que se desea idéntica a cadena (*)


incluir todos los campos en la Selecciona los registros
consulta. que contienen en el
< Numérico WHERE campo<num
campo un valor menor
Ver Probar
Los campos numéricos tienen la a num
opción de llevar asociadas
Selecciona los registros
funciones MySQL que devuelven que contienen en el
información estadística. campo una cadena
cuyos n primeros
Algunas de esas funciones son las caracteres son
siguientes: < Cadena WHERE campo<"cadena"
menores que los de la
Ver Probar
cadena, siendo n el
número de caracteres
■ MAX(campo..)
que contiene cadena.
Devuelve el valor máximo (**)
de ese campo en todos los
registros de la tabla, salvo Selecciona los registros
que tenga la opción GROUP que contienen en el
<= Numérico WHERE campo<=num
campo un valor menor
Ver Probar
BY, en cuyo caso devolverá
O igual a num
el máximo de cada grupo, o
cuando tenga activada la Selecciona los registros
opción WHERE, en cuyo que contienen en el
caso la función sólo será campo una cadena
cuyos n primeros
aplicada a los registros que
caracteres son
resulten de tal filtrado. menores que los de la
cadena, siendo n el
MIN(campo..)

<= Cadena WHERE campo<="cadena" número de caracteres Ver Probar
Idéntica a la anterior en que contiene cadena y
cuanto a criterios de añade respecto al caso
selección, esta función anterior la opción de
devuelve el mínimo. que en caso de que
ambos valores fueran
■ AVG(campo..) iguales también los
Devuelve el valor promedio presentaría (**)
de todos los registros Selecciona los registros
numéricos seleccionados que contienen en el
con los mismos criterios del > Numérico WHERE campo>num
campo un valor mayor
Ver Probar
caso anterior. a num
Selecciona los registros
■ SUM(campo..)
que contienen en el
Devuelve la suma de los campo una cadena
valores del campo y sigue cuyos n primeros
idénticos criterios de caracteres son
selección de campos que en > Cadena WHERE campo>"cadena"
mayores que los de la
Ver Probar
los casos anteriores. cadena, siendo n el
número de caracteres
■ STDDEV(campo..) que contiene cadena.
Devuelve la estimación de (**)
la desviación típica de la Selecciona los registros
población. que contienen en el
>= Numérico WHERE campo>=num
campo un valor mayor
Ver Probar
■ COUNT(campo..) o igual a num
Cuenta los valores no
Selecciona los registros
nulos del campo indicado. que contienen en el
campo una cadena
En el caso de aplicar estas cuyos n primeros
funciones, el resultado de la caracteres son
mayores que los de la
consulta contiene una sola línea,
cadena, siendo n el
salvo que active la opción GROUP
>= Cadena WHERE campo>="cadena" número de caracteres Ver Probar
BY, en cuyo caso devolverá tantas que contiene cadena y
líneas como grupos resulten. añade respecto al caso
anterior la opción de
FROM tabla que en caso de que
ambos valores fueran
Esta expresión -que aunque no iguales también los
tiene carácter obligatorio podría presentaría (**)
tomarse como tal– indica a MySQL
Selecciona los registros
el nombre de la tabla en el que que contienen en el
debe efectuarse la consulta. campo valores que
Numérico coinciden con alguno de
WHERE definicion WHERE campoIN (valor1,
IN o
valor2..)
los especificados dentro Ver Probar
Cadena del paréntesis. Cuando
Esta instrucción tiene carácter se trata de valores no
opcional y su utilidad es la de numéricoz han de ir
filtrar la consulta estableciendo los entre comillas
criterios de selección de los
Selecciona los registros
registros que debe devolver. en los que los valores
contenidos en el campo
Si se omite WHERE, la consulta seleccionado están
devolverá todos los registros de la comprendidos en el
tabla. intervalo valor1
(mínimo) – valor2
En la parte derecha tienes Numérico (máximo) incluyendo en
WHERE campo BETWEEN
información sobre la manera de BETWEEN o la selección ambos Ver Probar
valor1 AND valor2
definir los criterios de selección Cadena extremos.
de esta opción. Cuando los contenidos
de los campos son
GROUP BY definicion cadenas sigue los
mismos criterios que se
Tiene carácter opcional y su indican para los demás
finalidad es la de presentar los operadores de
resultados de la consulta comparación
Selecciona los registros
agrupados según el criterio en los que los valores
establecido en su definición. IS NULL Cadena WHERE campo IS NULL
contenidos en el campo
Ver Probar
seleccionado son NULOS
Resulta de gran utilidad cuando se
pretende obtener valores Selecciona los registros
estadísticos de los registros que en los que los valores
cumplen determinadas IS NOT NULL Cadena WHERE campo IS NOT NULL contenidos en el campo Ver Probar
seleccionado son NO
condiciones (las condiciones del NULOS
agrupamiento).
(*) Cuando se trata de cadenas de caracteres, el concepto menor que significa anterior en la
ORDER BY definicion ordenación de los caracteres según su código ASCII y mayor que significa posterior en esa misma
ordenación.
También tiene carácter opcional y (**) La discriminación de Mayúsculas/Minúsculas dependerá del tipo de campo.
su utilidad es la de presentar la Recuerda que los tipo BLOB hacen esa discriminación, mientras que los de tipo TEXT son insensibles a
Mayúsculas/Minúsculas.
información de la consulta
ordenada por los contenidos de
uno o varios campos.
Cuando se trata de comparar cadenas MySQL dispone de una potente instrucción
Siempre tiene como opción (LIKE) que permite establecer los criterios de selección a toda o parte de la cadena. Su
complementaria de que en cada sintaxis contempla distintas posibilidades utilizando dos comodines>: % (que se
campo utilizado para la comporta de forma similar al (*) en las búsquedas de Windows) y _ (de comportamiento
ordenación puede establecerse similar a (?) en Windows). Aquí tienes algunas de sus posibilidades:
uno de estos criterios ASC
(ascendente, es el valor por
defecto) o DESC. Código Ver
Sintaxis Descripción
fuente ejemplo
Si no se establece ningún orden, Selecciona todos los registros que contengan la
los resultados de la consulta WHERE campo LIKE '%cadena%' cadena en el campo indicado sea cual fuere su Ver Probar
aparecerán en el mismo orden en posición
el que fueron añadidos los Selecciona todos los registros en los que el campo
registros. WHERE campo LIKE 'cadena%' indicado que contengan la cadena exactamente al Ver Probar
principio del campo
LIMIT m, n
Selecciona todos los registros en los que el campo
WHERE campo LIKE '%cadena' indicado que contengan la cadena exactamente al Ver Probar
Esta cláusula es opcional y
final del campo
permite establecer cuántos y
cuáles registros han de Selecciona todos los registros en los que el primer
presentarse en la salida de la caracter del campo puede ser cualquiera pero los
consulta. WHERE campo LIKE '_cadena%' siguientes han de ser exactamente los indicados en Ver Probar
cadena pudiendo ir seguidos de cualesquiera otros
Por ejemplo: LIMIT 4, 8 indicaría a caracteres
MySQL que la consulta debería
mostrar OCHO registros contados El comodín (_) puede ir tanto al principio como al final y puede repetirse tantas veces
a partir del quinto (sí, el quinto como sea necesario. Seria correcto LIKE '___es%' y también LIKE 'a___es%' así
porque LIMIT considera el primer
como: LIKE '%a___es'.
registro como CERO).

El criterio límite se aplica sobre los Como ves, un montón de posibilidades.


resultados de la salida, es decir,
sobre los resultados Aun tiene más opciones WHERE ya que acepta múltiples condiciones vinculadas por
seleccionados, ordenados y los operadores lógicos AND, OR, NOT o sus sintaxis equivalentes: &&, || y !.
filtrados siguiendo los criterios
establecidos por las cláusulas El comportamiento de estos operadores es idéntico al descrito para sus homónimos de
anteriores. PHP. ¿Los recuerdas?... Aquí los tienes... por si acaso.

Si se escribe como un solo Un ejemplo de sintaxis puede ser:


parámetro (LIMIT k), MySQL lo
interpretará como que k es el WHERE (campo1=valor AND campo2 LIKE '_cadena%)
segundo de ellos y que el primero
es CERO, es decir:
LIMIT 0, k Utilizando funciones sobre campos
Recuento de resultados
La sintaxis
PHP dispone de dos funciones que SELECT MAX(campo1), MIN (campo2), ... FROM tabla
permiten conocer el número de
registros de la tabla afectados por
una sentencia MySQL. 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.
mysql_num_rows ($c ) Aquí tienes un ejemplo que determina todos los valores de esos estadísticos aplicados al
campo Contador de nuestra famosa tabla demo4.
Esta función devuelve un valor
numérico que recoge el número de
Aquí está el ejemplo
registros que cumplen las
condiciones establecidas en una
consulta. Sólo es válido para
Ver código fuente Ejecutar la consulta
sentencia tipo SELECT

mysql_affected_rows($c )
Aplicando la opción GROUP BY
En este caso la función devuelve
también el número de registros Tal como señalamos al margen, las funciones anteriores pueden aplicarse a grupos de
afectados, pero sólo en el caso de registros seleccionados mediante un criterio GROUP BY (nombre del campo)
que la sentencia MySQL haya
producido modifi- caciones en los En este ejemplo obtendremos los mismos parámetros estadísticos que en el anterior,
contenidos de la tabla. Es decir,
pero ahora agrupados por sexo, lo que significaría que obtendremos dos filas de
sólo recoge resultados de
sentencias que: añaden,
resultados. Aquí tienes el ejemplo
modifican o borran registros.
Ver código fuente Ejecutar la consulta
Manejo de fechas en las
Como habrás podido observar, la opción SELECT tiene un sinfín de posibilidades.
consultas

MySQL dispone de algunas Creación de tablas a partir de la consulta de otra tabla


cláusulas de gestión de fechas que
pueden tener una gran utilidad a la Es frecuente -podría decirse que es lo habitual- relacionar tablas mediante campos
hora de gestionar consultas. Son
con idéntico contenido.
las siguientes:

DATE_FORMAT( campo,formato) 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
Las diferentes opciones de formato astronautas, pongamos por caso.
las tienes en la tabla de la
derecha. Es importante tener en Supongamos también, que la selección va a constar de tres pruebas que serán
cuenta que la sintaxis correcta es
juzgadas y calificadas por tres tribunales distintos.
%Y (sin espacio) ya que si hubiera
un espacio % Y interpretaría la
Una primera opción sería crear tres tablas -una para cada tribunal- e incluir en ellas
letra Y como un texto a incluir.
todos los datos de cada uno de los individuos.
CURDATE()
Esa opción es factible pero no es ni la más cómoda, ni tampoco es la más rápida ni la
Dentro de DATE_FORMAT se que menos espacio de almacenamiento necesita. No debemos olvidar que una tabla
puede incluir -en vez del nombre puede tener una enorme cantidad de registros.
del campo- una cadena en la que
se indique una fecha en formato Una opción alternativa sería crear tres nuevas tablas que sólo contuvieran dos
YYYY-MM-DD hh:mm:ss. Puedes campos cada una. Por ejemplo el campo DNI y el campo Calificación.
verlo en los ejemplos. De igual
modo es posible sustituir el Como quiera que el campo DNI ha de contener los mismos valores en las cuatro
nombre del campo -o la cadena- tablas y además es un campo único podrían crearse las nuevas tablas y luego copiar en
por la función CURDATE() que cada una de ellas todos los DNI de la tabla original.
recoge la fecha actual del
sistema (únicamente día, mes y Nos garantizaría que no habría errores en los DNI y además nos garantizaría que se
año). A efectos de horas, minutos
incluyeran todos los aspirantes en esas nuevas tablas.
y segundos CURDATE() va a
tomar el mediodía de la fecha
Aquí tienes el código fuente de un script que crea esas tres tablas (a las que hemos
actual.
llamado demodat1, demodat2 y demodat3.
CURTIME()
Ver código fuente
Se comporta de forma similar a
CURDATE().
Crear las tablas
Devuelve la hora actual del anteriores
sistema que alberga el servidor
MySQL en formato hh:mm:ss

CURRENT_TIMESTAMP() Una consulta conjunta de varias tablas


Se comporta de forma similar a
CURDATE(). MySQL permite realizar consultas simultáneas en registros situados en varias tablas.

Devuelve la fecha y hora actual del Para ese menester se usa la siguiente sintaxis:
sistema en formato YYYY-MM-DD
hh:mm:ss SELECT tabla1.campo1, tabla2.campo2, ... FROM tabla1, tabla2
NOW()
en la que, como ves, modificamos ligeramente la sintaxis ya que anteponemos el
Es un alias de nombre de la tabla al del campo correspondiente separando ambos nombres por un
CURRENT_TIMESTAMP().
punto, con lo cual no hay posibilidad de error de identificación del campo incluso
mysql_result($resultado,num, cuando campos de distinta tabla tengan el mismo nombre.
campo)
Otra innovación -respecto a los ejemplos anteriores- es que detrás de la cláusula
Esta función PHP permite obtener FROM escribimos los nombres de todas las tablas que está usando SELECT.
un solo campo de uno solo de los
registros obtenidos como resultado A partir de ahí se pueden establecer todo tipo de relaciones para las sentencias
de una consulta MySQL. 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
El parámetro $resultado es la
siempre la sintaxis nombre_tabla.nombre_campo.
variable que recoge en resultado
obtenido de la ejecución de
A modo de ejemplo -hemos procurado comentarlo línea a línea- aquí tienes un script
mysql_query de forma idéntica a
PHP que hace una consulta conjunta de las tablas demo4, demodat1, demodat2 y
como lo hacíamos en otras
consultas. 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, ordena los resultados -
El valor num es un número entero de mayor a menor- según la suma de las tres puntuaciones.
que indica el número de fila de la
que queremos extraer el valor
contenido en uno de sus campos. Ver código fuente Ejecutar la consulta

El valor campo indica el número


del campo que tratamos de Formatos de fechas en consultas MySQL
extraer. Este número (la primera
posición siempre es cero) indica el
número de orden del campo tal Los formatos soportados por la función DATE_FORMAT format son los siguientes:
como está especificado en la
sentencia SELECT. Si en esta Formato Descripción Sintaxis Ver código Ver ejemplo
sentencia se incluyera * (extraer
Día del mes en formato de dos
todos los campos) consideraría el %d DATE_FORMAT(Nacimiento,'%d') Ver Probar
dígitos
orden en el que está creada la
estructura de la tabla que los Día del mes en formato de uno ó
%e DATE_FORMAT(Nacimiento,'%e') Ver Probar
contiene. dos dígitos
Número de día seguido del sufijo en
Este es el código fuente de un %D DATE_FORMAT(Nacimiento,'%D') Ver Probar
inglés
ejemplo comentado y este un Número del mes en formato de dos
enlace de prueba del script. %m DATE_FORMAT(Nacimiento,'%m') Ver Probar
dígitos
Número del mes en formato de uno Ver Probar
%c DATE_FORMAT(Nacimiento,'%c')
o dos dígitos
%M Nombre del mes (en inglés) DATE_FORMAT(Nacimiento,'%M') Ver Probar
Nombre del mes abreviado (en
%b DATE_FORMAT(Nacimiento,'%b') Ver Probar
inglés)
Número del año en formato de dos
%y DATE_FORMAT(Nacimiento,'%y') Ver Probar
dígitos
Número del año en formato de
%Y DATE_FORMAT(Nacimiento,'%Y') Ver Probar
cuatro dígitos
Número de día de la semana
%w DATE_FORMAT(Nacimiento,'%w') Ver Probar
0=Domingo ... 6=Sábado
Nombre del día de la semana (en
%W DATE_FORMAT(Nacimiento,'%W') Ver Probar
inglés)
Nombre abreviado del día de la
%W DATE_FORMAT(Nacimiento,'%W') Ver Probar
semana (en inglés)
Número de día del año en formato
%j DATE_FORMAT(Nacimiento,'%j') Ver Probar
de 3 dígitos
Número de semana del año
considerando el DOMINGO como
%U DATE_FORMAT(Nacimiento,'%U') Ver Probar
primer día de la semana (en
formato de dos dígitos)
Número de semana del año
considerando el LUNES como primer
%u DATE_FORMAT(Nacimiento,'%u') Ver Probar
día de la semana (en formato de
dos dígitos)
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
Hora con dos dígitos (formato 0 a
%H DATE_FORMAT($fecha,'%H')
24 horas)
Hora con uno ó dos dígitos (formato
%k DATE_FORMAT($fecha,'%k')
0 a 24 horas)
Hora con dos dígitos (formato 0 a
%h DATE_FORMAT($fecha,'%h')
12 horas)
Hora con uno ó dos dígitos (formato
%I DATE_FORMAT($fecha,'%I')
0 a 12 horas)
%i Minutos con dos dígitos DATE_FORMAT($fecha,'%i')
%s Segundos con dos dígitos DATE_FORMAT($fecha,'%s')
Hora completa (HH:mm:ss) en
Ver Probar
%r formato de 12 horas indicando AM ó DATE_FORMAT($fecha,'%r')
PM
Hora completa (HH:mm:ss) en
%T DATE_FORMAT($fecha,'%T')
formato de 24 horas
Incluye el texto que se indica detrás
% texto DATE_FORMAT($fecha,'% texto')
del %
Añade AM ó PM dependiendo de la
%p DATE_FORMAT($fecha,'%p')
Hora
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'

Ejercicio nº 41

En esta actividad debes elaborar varios scripts –puedes llamarlos ejercicio41_1.php,


etcétera– que permitan realizar consultas en la base de datos que has creado en el ejercicio
nº 38.
Previamente, tendrías que añadirle datos, bien manualmente o bien modificando el ejemplo
de generación de registros aleatorios que hemos incluido en la página anterior.

Ejercicio nº 42

Construye una nueva tabla –tabla2– con los mismos campos que tu tabla1 pero añadiendo
el carácter de clave principal al campo que recoge el DNI, con lo cual podrás impedir que
puedan repetirse dos alumnos con el mismo DNI.
A partir de ella, crea tablas auxiliares (transfiriendo los datos de tabla1) –de calificaciones
de materias, por ejemplo– que contengan dos campos: DNI y calificación.
Por último, tendrías que crear todo lo necesario para que el profesor de cada materia,
pudiera insertar sus calificaciones y, además, crea un documento final que permita visualizar
simultáneamente las calificaciones del alumno en todas la materias.

Anterior Indice Siguiente

También podría gustarte