Ver índice
Consultas simples y múltiples (MySQLi)

        Ocultar índice  

   Índice de contenidos
   Instalación en Windows
   Instalación en Ubuntu
   Servidores seguros
   Páginas dinámicas
   Sintaxis básica
   Operaciones
   Arrays
   Formatos de presentación
   Operadores
   Bucles
   Extraer y ord. información
   Funciones
   Ficheros externos
   Imágenes dinámicas
   Gestión de directorios
   Cookies y sesiones
   Clases y objetos
   Ficheros en formato PDF
   Bases de datos MySQL
   PHP y XML
   PDO - Bases SQLite / MySQL
   MySQL a traves de misqli
   Algo de JavaScript y AJAX


Sintaxis MySQL de selección de registros

Las sentencias de selección de registros requieren utilizar –entre otras– palabras clave como las que enumeramos a continuación. Observa que las hay dos tipos: obligatorias y opcionales. Observa también que algunas de las palabras clave son alternativas y por lo tanto, incompatibles en una misma sentencia. La inserción ha de hacerse respetando un orden tal y como se enumera aquí debajo. Si alteráramos ese orden (p. ejemplo: colocando GROUP BY antes de WHERE) se produciría un error y dejaría de ejecutarse la sentencia.

Los párrafos siguientes están organizados a dos niveles. Las intrucciones del primero de ellas tienen carácter obligatorio en la sentencia de consulta. Las del segundo, señaladas con letra cursiva, son opcionales.

Algunos ejemplos de consultas simples

Las consultas de los datos y registros contenidos en una tabla ofrecen un amplísimo abanico de posibilidades a partir de las opciones descritas anteriormente. Veamos algunas de las posibilidades.

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 este 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.

Consulta mediante procesos Ver código fuente Consulta mediante objetos Ver código fuente

Consultando sólo 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 sólo mostrando los campos indicados.

Consulta mediante procesos Ver código fuente Consulta mediante objetos Ver código fuente

Consultando sólo 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.

Consulta mediante procesos Ver código fuente Consulta mediante objetos Ver código fuente

Consultando sólo 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, utilizaríamos el criterio de ordenación señalado en segundo lugar.

Consulta mediante procesos Ver código fuente Consulta mediante objetos Ver código fuente


Consulta seleccionando registros

Utilizaremos la sentencia MySQL de esta forma

SELECT campo1, ... FROM tabla WHERE condición

que nos devolverá la lista de registros que cumplen la condición indicada. Aquí tienes un ejemplo muy sencillo.

Consulta mediante procesos Ver código fuente Consulta mediante objetos Ver código fuente

Los resultados de la sentencia SELECT

El manejo de los resultados obtenidos mediante mysqli_query o $objeto->query ofrece varias posibilidades. El bloque de información resultante de una consulta y recogido en $resultado está organizado en filas que pueden manejadas de diversas formas.

Una primera información que puede resultar muy útil e interesante es:

$num_resultados=mysqli_num_rows($resultado)
o
$num_resultados=$resultado->num_rows

En ambos casos la variables $num_resultados recogerá el número de registros (filas) obtenidos como resultado de la consulta. La primera de las opciones se utiliza cuando se gestiona la consulta mediante procesos mientras que es segundo corresponde a consultas mediante objetos.

Los valores contenidos en cada fila de los resultados pueden leerse mediante

$array=mysqli_fetch_row($resultado)
o
$array=$resultado->fetch_row()

dónde $array es un array escalar que contiene los valores del registro actual (aquel que señala el puntero interno). Los índices de este array van asociados al orden en el que están escritos los nombres de los campos dentro de la sentencia select.

Si no se indica otra cosa el puntero comienza un recorrido por el primer registro del resultado (fila 0) y en las sucedsivas llamadas a método fetch_row se va desplazando a la siguiente fila. Por eso, mediante un bucle while podemos recorriendo los diferentes registros del resultado y convirtiendo cada uno de ellos en un array escalar. Aquí tienes un ejemplo

Consulta mediante procesos Ver código fuente Consulta mediante objetos Ver código fuente

Los valores contenidos en cada fila de los resultados también pueden leerse mediante

$array=mysqli_fetch_assoc($resultado)
o
$array=$resultado->fetch_assoc()

dónde $array es un array asociativo que contiene los valores del registro actual (aquel que señala el puntero interno). Los índices de este array son los nombres de los campos dentro de la sentencia select.

Si no se indica otra cosa el puntero comienza un recorrido por el primer registro del resultado (fila 0) y en las sucedsivas llamadas a método fetch_assoc se va desplazando a la siguiente fila. Por eso, mediante un bucle while podemos recorriendo los diferentes registros del resultado y convirtiendo cada uno de ellos en un array asociativo. Aquí tienes un ejemplo

Consulta mediante procesos Ver código fuente Consulta mediante objetos Ver código fuente

Una tercera opción para ir leyendo los valores contenidos en cada fila de los resultados es la que utiliza

$objeto=mysqli_fetch_object($resultado)
o
$objeto=$resultado->fetch_object()

dónde $objeto es un objeto cuyas propiedades son los nombres de los campos incluidos en la sentencia select y el valor el resultante de la consulta para ese campo en la fila actual (aquella a la que apunta el puntero interno).

Si no se indica otra cosa el puntero comienza un recorrido por el primer registro del resultado (fila 0) y en las sucesivas llamadas a método fetch_object se va desplazando a la siguiente fila. Por eso, mediante un bucle while podemos recorriendo los diferentes registros del resultado y convirtiendo cada uno de ellos en un objeto con las propiedades descritas. Aquí tienes un ejemplo

Consulta mediante procesos Ver código fuente Consulta mediante objetos Ver código fuente

En esta nueva opción se realiza un lectura única del contenido de todas las filas

$array_bidimensional=mysqli_fetch_all($resultado)
o
$array_bidimensional=$resultado->fetch_all()

dónde $array_bidimensional es un array cuyo primer índice coincide con el número de orden (empezando por cero) de cada una de las filas del resultado y cuyo segundo índice es el número de columna entendiendo como tales cada uno de los campos incluidos en la sentencia SELECT por el orden de inclusión enla misma y contados a partir de cero.

La extracción de los diferentes valores requeriría un doble bucle de lectura. El primero nos iría posicionando en cada una de las filas del resultado (el primer índice) y el segundo bucle recorrería todos de aquella fila. Aquí tienes un ejemplo

Consulta mediante procesos Ver código fuente Consulta mediante objetos Ver código fuente

Hay situaciones en las que puede resultarnos de interés conocer únicamente los valores de alguno o algunos de los registros incluidos en el resultado de una consulta. Puede, por ejemplo, que nos interese conocer el únicamente el primer registro (o el último, o el que ocupa la posición 38) tal como aparecen en el resultado de la ejecución de la función mysqli_query o del método query() si se trata de objetos. Tanto la función mysql_fech_row() como el método fetch_row() extreaen aquel registro (fila de datos) al que señala el apuntador. Para posicionar de forma arbitrarie el apuntador de resgistros mysqli dispone las siguientes funciones:

mysqli_data_seek($resultado, posicion)

dónde $resultado es el objeto resultante de una consulta realizada por medio de la función mysqli_query() y posición es un número entero que explicita la posición (la prima posición se identifica mediante cero) a la que pretendemos orientar el apuntador de lectura de mysqli_fetch_row. El proceso podría ser similar a este:

$resultado=mysqli_query($identificador,sentencia_MySQL);    // realiza la consulta y recoge el resultado en la variable $resultado
mysqli_data_seek($resultado,posicion);    //Sitúa el apuntador en la fila señalada por posición
$fila=mysqli_fetch_row($resultado);    //Lee el registro (fila) que señala en apuntador anterior y recogiendo el resultado en el array $fila

Cuando se trata de que la programación esté orientada a objetos el método que debemos utilizar es el siguiente:

$resultado->data_seek(posicion)

dónde $resultado es el objeto resultante de una consulta realizada por medio del método $objeto->query() y posición es un número entero que explicita la posición (la prima posición se identifica mediante cero) a la que pretendemos orientar el apuntador de lectura que usará el posterior métoco fetch_row. El proceso podría ser similar a este:

$resultado=$objeto->query(sentencia_MySQL);    // el método query realiza la consulta y recoge el resultado en el nuevo objeto $resultado
$resultado->data_seek(posicion);    //Sitúa el apuntador en la fila señalada por posición
$fila=$resultado->fetch_row();    //Lee el registro (fila) que señala en apuntador anterior y recogiendo el resultado en el array $fila

Como es lógico también pueden usuarse fetch_object ó fetch_assoc en lugar del fetch_row del pseudocódigo anterior.

Consultas condicionadas

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

Operador Tipo
de campo
Sintaxis Descripción Progamación por procesos Programación orientada a objetos
Código
fuente
Ver
ejemplo
Código
fuente
Ver
ejemplo
= Numérico WHERE campo=num Selecciona los registros que contienen en el campo un valor igual a num Ver Probar Ver Probar
= Cadena WHERE campo="cadena" Selecciona los registros que contienen en el campo una cadena idéntica a cadena (*) Ver Probar Ver Probar
< Numérico WHERE campo<num Selecciona los registros que contienen en el campo un valor menor a num Ver Probar Ver Probar
< Cadena WHERE campo<"cadena" Selecciona los registros que contienen en el campo una cadena cuyos n primeros caracteres son menores que los de la cadena, siendo n el número de caracteres que contiene cadena. (**) Ver Probar Ver Probar
<= Numérico WHERE campo<=num Selecciona los registros que contienen en el campo un valor menor O igual a num Ver Probar Ver Probar
<= Cadena WHERE campo<="cadena" Selecciona los registros que contienen en el campo una cadena cuyos n primeros caracteres 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 Ver Probar
> Numérico WHERE campo>num Selecciona los registros que contienen en el campo un valor mayor a num Ver Probar Ver Probar
> Cadena WHERE campo>"cadena" Selecciona los registros que contienen en el campo una cadena cuyos n primeros caracteres son mayores que los de la cadena, siendo n el número de caracteres que contiene cadena. (**) Ver Probar Ver Probar
>= Numérico WHERE campo>=num Selecciona los registros que contienen en el campo un valor mayor o igual a num Ver Probar Ver Probar
>= Cadena WHERE campo>="cadena" Selecciona los registros que contienen en el campo una cadena cuyos n primeros caracteres 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 Ver Probar
IN Numérico
o
Cadena
WHERE campoIN (valor1,valor2..) Selecciona 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 Ver Probar
BETWEEN Numérico
o
Cadena
WHERE campo BETWEEN valor1 AND valor2 Selecciona 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 Ver Probar
IS NULL Cadena WHERE campo IS NULL Selecciona los registros en los que los valores contenidos en el campo seleccionado son NULOS Ver Probar Ver Probar
IS NOT NULL Cadena WHERE campo IS NOT NULL Selecciona los registros en los que los valores contenidos en el campo seleccionado son NO NULOS Ver Probar Ver Probar
(*) Cuando se trata de cadenas de caracteres, 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 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 Progamación por procesos Programación orientada a objetos
Código
fuente
Ver
ejemplo
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 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 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 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 Ver Probar

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

La claúsula WHERE aun tiene más opciones. 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 en esta página

Utilizando funciones sobre campos

Por medio de la sintaxis

SELECT MAX(campo1), MIN (campo2), ... FROM tabla

obtendríamos 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 tabla demo4.

Consulta mediante procesos Ver código fuente Consulta mediante objetos Ver código fuente

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

Consulta mediante procesos Ver código fuente Consulta mediante objetos Ver código fuente

<

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. 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().

Formato Descripción Sentencia MySQL Progamación
por procesos
Programación
orientada a objetos
Código
fuente
Ver
ejemplo
Código
fuente
Ver
ejemplo
%d Día del mes en formato de dos dígitos DATE_FORMAT(Nacimiento,'%d') Ver Probar Ver Probar
%e Día del mes en formato de uno ó dos dígitos DATE_FORMAT(Nacimiento,'%e') Ver Probar Ver Probar
%D Número de día seguido del sufijo en inglés DATE_FORMAT(Nacimiento,'%D') Ver Probar Ver Probar
%m Número del mes en formato de dos dígitos DATE_FORMAT(Nacimiento,'%m') Ver Probar Ver Probar
%c Número del mes en formato de uno o dos dígitos DATE_FORMAT(Nacimiento,'%c') Ver Probar Ver Probar
%M Nombre del mes (en inglés) DATE_FORMAT(Nacimiento,'%M') Ver Probar Ver Probar
%b Nombre del mes abreviado (en inglés) DATE_FORMAT(Nacimiento,'%b') Ver Probar Ver Probar
%y Número del año en formato de dos dígitos DATE_FORMAT(Nacimiento,'%y') Ver Probar Ver Probar
%Y Número del año en formato de cuatro dígitos DATE_FORMAT(Nacimiento,'%Y') Ver Probar Ver Probar
%w Número de día de la semana 0=Domingo ... 6=Sábado DATE_FORMAT(Nacimiento,'%w') Ver Probar Ver Probar
%W Nombre del día de la semana (en inglés) DATE_FORMAT(Nacimiento,'%W') Ver Probar Ver Probar
%W Nombre abreviado del día de la semana (en inglés) DATE_FORMAT(Nacimiento,'%W') Ver Probar Ver Probar
%j Número de día del año en formato de 3 dígitos DATE_FORMAT(Nacimiento,'%j') Ver Probar Ver Probar
%U Número de semana del año considerando el DOMINGO
como primer día de la semana (dos dígitos)
DATE_FORMAT(Nacimiento,'%U') Ver Probar Ver Probar
%u Número de semana del año considerando el LUNES
como primer día de la semana (dos dígitos)
DATE_FORMAT(Nacimiento,'%u') Ver Probar 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 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'

Setencias múltiples

Cuando usamos mysqli podemos ejecutar múltiples sentencias en una sola instrucción. Para ello debemos empezar encadenando las sucesivas sentencias incluyéndolas una a continuación de otra y separándolas mediante un punto y coma (;).

SELECT * FROM tabla1 ; SELECT campo1 FROM tabla2 ; DROP TABLE IF EXISTS tabla3

La ejecución de este tipo de sentencias requiere la utilización de la función:

mysqli_multi_query($conexion,sentencia_multiple)

dónde, en el caso de programación mediante procesos, $conexion es el identificador de la conexión y sentencia_multiple el una sentencia múltiple en el formato comentado en el párrafo anterior. Devuelve un valor booleano (true o false).

Cuando se trata de programación orientada a objetos es preciso recurrir al método multi_query que mediante la sintaxis:

$objeto->multi_query(sentencia_multiple)

en la que sentencia_multiple es una sentencia múltiple en el formato comentado anteriormente. Devuelve un valor booleano (true o false).

  ¡Cuidado!  

Los mensajes de error sólo se visualizan en le caso de producirse este en la ejecución de la primera de las sentencias

Sentencias que no devuelven valores

Cuando se trata de crear, borrar o modificar tablas, lo habitual es que se realice el proceso sin necesidad de visualizar ningún resultado. Esos casos, aparentemente los más simples, podrían tratarse mediante de la forma que puedes ver en el código fuente de estos dos ejemplos de creación de tres tablas.

Código fuente
mediante procesos
Código fuente
mediante objetos

Pese a incluir un condicional para advertirnos de eventuales errores solo se activaría el mensaje de error en el caso de que este se produjese en la primera de las sentencias.

Sentencias que devuelven valores

Cuando se trata de sentencias que devuelven valores como ocurre con las consultas es necesario utilizar algunas de las funciones o métodos que comentamos a continuación

$resultado=mysqli_store_result($conexion)
o
$resultado=$objeto->store_result()

Transfiere a $resultado el conjunto de resultados de la última consulta en la conexión de base de datos. En el primer caso (usando procesos) se requiere el parámetro $conexion. En el segundo supuesto (orientado a objetos) el método no requiere ningún parámetro.

$resultado=mysqli_use_result($conexion)
o
$resultado=$objeto->use_result()

Se utiliza para iniciar la recuperación de un conjunto de resultados de la última consulta ejecutada. Aunque a primera vista pueda parecer muy similar a lo anterior hay una importantísima diferencia dado que no se transfiere el conjunto completo de resultados y por lo tanto no se pueden utilizar funciones como mysqli_data_seek () para pasar a un registro en particular dentro del conjunto.

Cuando cualquiera de las opciones (store o use) se ejecuta inmediatamente después de la ejecución de un multi_query recogerá los resultado de la primera de las sentencias que contiene.

mysqli_free_result($resultado)
o
$resultado->free()

Liberan la memoria ocupada por los resultados. Como en casos anteriores la primera sentencia se utiliza cuando se programa por procesos y la segunda cuando se hace por objetos. No es estrictamente necesario utilizarlos dado que toda la memoria utilizada por los resultados asociados se libera automáticamente al finalizar la ejecución del script. Sólo tiene utilidad práctica en aquellos casos en los que las consultas devuelven una cantidad de datos muy grande.

mysqli_more_results($conexion)
o
$objeto->more_results()

Comprueba si hay algún resultado más de una consulta múltiple. Devuelve un valor booleano

mysqli_next_result($conexion)
o
$objeto->next_result()

Prepara siguiente conjunto de resultados de una llamada previa a mysqli_multi_query (), que pueden ser recuperados por mysqli_store_result () o mysqli_use_result ().

Consulta mediante procesos Ver código fuente Consulta mediante objetos Ver código fuente

Consulta mediante procesos Ver código fuente Consulta mediante objetos Ver código fuente

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

Es frecuente -podría decirse 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 debemos olvidar que una tabla puede tener una enorme cantidad de registros.

Una opción alternativa sería crear tres nuevas tablas que sólo 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 los aspirantes en esas 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). Como podrás observar hemos utilizado una sentencia múltiple para crear las tablas y posteriormente hemos hecho las inserciones de datos en cada una de ellas.

Código fuente
mediante procesos
Código fuente
mediante objetos

Una consulta conjunta de varias tablas

MySQL permite realizar consultas simultáneas 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 ligeramente la sintaxis ya que anteponemos el nombre de la tabla al del campo correspondiente 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áusula FROM 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 –hemos 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, ordena los resultados -de mayor a menor- según la suma de las tres puntuaciones.

Consulta mediante procesos Ver código fuente Consulta mediante objetos Ver código fuente