85 Php. Consultas En Tablas
Upcoming SlideShare
Loading in...5
×
 

85 Php. Consultas En Tablas

on

  • 3,305 views

 

Statistics

Views

Total Views
3,305
Views on SlideShare
3,305
Embed Views
0

Actions

Likes
1
Downloads
31
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    85 Php. Consultas En Tablas 85 Php. Consultas En Tablas Document Transcript

    • 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 s 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..) s <= 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 s 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 s 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 s 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 s 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