1. Curso PHP Thales-CICA
1. Introducción a las bases de datos.
Definición 1. Una base de datos es un conjunto de datos que
pertenecen al mismo contexto almacenados sistemáticamente para
su uso posterior.
Definición 2. Una base de datos es un conjunto de información
estructurada en registros y almacenada en un soporte electrónico
legible desde un ordenador. Cada registro constituye una unidad
autónoma de información que puede estar a su vez estructurada en
diferentes campos o tipos de datos que se recogen en dicha base de
datos.
1.1 Modelo de base de datos.
Es básicamente una "descripción" de algo conocido como contenedor
de datos (algo en donde se guarda la información), así como de los
métodos para almacenar y recuperar información de esos
contenedores.
Los modelos de datos no son cosas físicas: son abstracciones que
permiten la implementación de un sistema eficiente de base de
datos; por lo general se refieren a algoritmos y conceptos
matemáticos.
Algunos modelos con frecuencia utilizados en las bases de datos:
Modelo jerárquico, modelo de red, modelo orientado a objetos,
modelo documental y modelo relacional.
1.1.1 Bases de datos jerárquicas.
Éstas son bases de datos que, como su nombre indica, almacenan su
información en una estructura jerárquica. En este modelo los datos
se organizan en una forma similar a un árbol, con un nodo principal
llamado raíz del que cuelgan nodos hijos (hojas).
Una de las principales limitaciones de este modelo es su incapacidad
de representar eficientemente la redundancia de datos.
1
2. Curso PHP Thales-CICA
1.1.2 Bases de datos de red.
Se diferencia del modelo jerárquico en la modificación del concepto
de nodo: se permite que un mismo nodo tenga varios padres
(posibilidad no permitida en el modelo jerárquico).
Fue una gran mejora con respecto al modelo jerárquico, ya que
ofrecía una solución eficiente al problema de redundancia de datos;
pero, aun así, la dificultad que significa administrar la información
en una base de datos de red ha significado que sea un modelo
utilizado en su mayoría por programadores más que por usuarios
finales.
1.1.3 Bases de datos orientadas a objeto.
Este modelo, bastante reciente, y propio de los modelos informáticos
orientados a objetos, trata de almacenar en la base de datos los
objetos completos (estado y comportamiento).
Una base de datos orientada a objetos es una base de datos que
incorpora todos los conceptos importantes del paradigma de objetos:
Encapsulamiento, herencia y polimorfismo.
En bases de datos orientadas a objetos, los usuarios pueden definir
operaciones sobre los datos como parte de la definición de la base de
datos.
1.1.4 Bases de datos documentales.
Permiten la indexación a texto completo, y en líneas generales
realizar búsquedas más potentes.
2
3. Curso PHP Thales-CICA
1.1.5 Bases de datos relacionales.
Este modelo considera la base de datos como una colección de
relaciones. De manera simple, una relación representa una tabla, en
que cada fila (tupla) representa una colección de valores que
describen una entidad del mundo real.
En este modelo, el lugar y la forma en que se almacenen los datos no
tienen relevancia Esto tiene la considerable ventaja de que es más
fácil de entender y de utilizar para un usuario esporádico de la base
de datos. La información puede ser recuperada o almacenada
mediante "consultas" que ofrecen una amplia flexibilidad y poder
para administrar la información.
2. Diseño de bases de datos relacionales.
El primer paso para crear una base de datos, es planificar el tipo de
información que se quiere almacenar en la misma, teniendo en
cuenta dos aspectos: la información disponible y la información que
necesitamos.
La planificación de la estructura de la base de datos, en particular de
las tablas, es vital para la gestión efectiva de la misma. El diseño de
la estructura de una tabla consiste en una descripción de cada uno
de los campos que componen el registro y los valores o datos que
contendrá cada uno de esos campos.
Los campos son los distintos tipos de datos que componen la tabla.
La definición de un campo requiere: el nombre del campo, el tipo de
campo, el ancho del campo, etc.
Un mismo problema de almacenamiento de información se puede
afrontar con diferentes esquemas de bases de datos.
La calidad de un esquema estará determinada por el
comportamiento o reacción a determinadas operaciones de
manipulación (actualización, inserción y borrado).
Nosotros en este curso no abarcaremos todos los conceptos de
bases de datos (dependencias funcionales, formas normales).
Simplemente veremos algunos ejemplos de diseños e intentaremos
que nuestros diseños cumplan que sus datos no sean redundantes.
3
4. Curso PHP Thales-CICA
Concepto de redundancia de datos.
Diremos que unos datos son redundantes cuando en una misma base
de datos los datos aparecen en más de una tabla.
Ejemplo:
Supongamos que tenemos una empresa que gestiona un almacén.
Y que el gerente que sabe poco de bases de datos nos entrega el
siguiente diseño:
- Una tabla clientes que contendrá los datos del cliente:
Nombre, apellidos, dirección, ciudad y país.
- Una tabla de proveedores:
Nombre proveedor, dirección empresa, ciudad y país.
- Una tabla de productos:
Nombre del proveedor, dirección empresa, ciudad, país, nombre
del producto, stock y precio.
- Una tabla de factura:
Nombre cliente, apellidos cliente, dirección, ciudad, país, nombre
del producto, cantidad vendida, precio
Lo primero que tenemos que corregir es la redundancia de datos
existente en la factura, para ello crearemos un identificador (DNI) en
la tabla clientes y usaremos ese identificador para hacer referencia
al cliente en la tabla factura:
- Una tabla clientes que contendrá los datos del cliente:
DNI, nombre, apellidos, dirección, ciudad y país.
- Una tabla de factura:
DNI cliente, nombre del producto, cantidad vendida, precio.
Con ello hemos eliminado los datos redundantes de nombre, apellido,
dirección, ciudad y país que ahora no aparecerán en la factura.
Si queremos conocer esos datos en la factura simplemente
observaremos el DNI cliente y buscaremos ese dni en la tabla
clientes.
4
5. Curso PHP Thales-CICA
Lo mismo hacemos con los datos redundantes del proveedor de la
tabla productos, con lo que nuestras tablas quedarían así:
- Una tabla clientes que contendrá los datos del cliente:
DNI, nombre, apellidos, dirección, ciudad y país.
- Una tabla de proveedores:
IdProveedor, Nombre proveedor, dirección empresa, ciudad y
país.
- Una tabla de productos:
Idproveedor, nombre del producto, stock y precio.
- Una tabla de factura:
DNI cliente, nombre del producto, cantidad vendida, precio
( Si el nombre del proveedor es único se podía haber utilizado
este como identificador o clave)
Aún tenemos un dato redundante...el precio del producto, así que
haremos un idproducto:
- Una tabla clientes que contendrá los datos del cliente:
DNI, nombre, apellidos, dirección, ciudad y país.
- Una tabla de proveedores:
IdProveedor, Nombre proovedor, dirección empresa, ciudad y
país.
- Una tabla de productos:
Idproducto, Idproveedor, nombre del producto, stock y precio.
- Una tabla de factura:
DNI cliente, idproducto, cantidad vendida.
Ahora si analizamos bien las tablas nos encontraríamos con un
problema en el diseño de la tabla factura... ¿como se yo que
productos van en una factura? Ahora mismo solo dispongo de los
campos dnicliente, idproducto y la cantidad... pero ese cliente ha
podido comprar varias veces y por tanto tener más de una factura ....
o también ha podido comprar más de un producto en la misma
compra.
5
6. Curso PHP Thales-CICA
Tendríamos que generar 2 nuevas tablas, una tabla que relacione
cada cliente con un idfactura y otra tabla que relaciona un idfactura
con el idproducto y la cantidad:
- Una tabla clientes que contendrá los datos del cliente:
DNI, nombre, apellidos, dirección, ciudad y país.
- Una tabla de proveedores:
IdProveedor, Nombre proveedor, dirección empresa, ciudad y
pais.
- Una tabla de productos:
Idproducto, Idproveedor, nombre del producto, stock y precio.
- Una tabla de facturas:
dnicliente, idfactura
- Una tabla factura
idfactura, idproducto, cantidad vendida.
Si nos fijamos la tabla facturas no tiene identificador, si nos hiciera
falta a la hora de programar podríamos insertar uno.
El idfactura de la tabla factura es un id que se repetirá en la tabla,
para conocer los productos que pertenecen a una determinada
factura buscaremos las apariciones de ese id en la tabla factura
obteniendo así sus productos y cantidad vendida asociados, para
conocer el cliente de la factura simplemente consultaremos la tabla
facturas.
Ya hemos eliminado la redundancia de datos y hemos resuelto el
problema de la factura. Podríamos seguir haciendo modificaciones
en las tablas para hacerlas mas eficientes pero no es nuestro
objetivo.
Como hemos visto el diseño de la bases de datos no es algo fácil de
hacer, hay que dedicarle tiempo a estudiar las necesidades del
problema y encontrar un diseño que minimice el tamaño de la base
de datos, sea un diseño compacto y que además no complique en
exceso la programación posterior de la aplicación que trabaje con
ella.
Nos llevaría mucho tiempo explicar toda la teoría de bases de datos.
Si alguien quiere ampliar conocimientos en el tema en la biografía
hemos añadido enlaces interesantes sobre el tema.
6
7. Curso PHP Thales-CICA
3. SQL.
El SQL (Structured Query Language) es un lenguaje estándar que
nos permite comunicarnos con la base de datos.
Una sentencia SQL es como una frase con la que decimos lo que
queremos obtener y de donde obtenerlo.
Todas las sentencias empiezan con una palabra reservada que indica
la acción a realizar, seguido del resto de cláusulas, algunas
obligatorias y otras opcionales.
Comentemos los conceptos mas importantes de SQL que nos
permitirán realizar operaciones sencillas, para realizar operaciones
más complejas tendremos que profundizar en el estudio del
lenguaje.
Comandos DDL (Definición de datos):
CREATE. Crea una tabla o una base de datos.
Su sintaxis es: CREATE TABLE nombre_tabla ;
CREATE DATABASE nombre_base_de_datos ;
DROP. Elimina una tabla o una base de datos.
Su sintaxis es: DROP TABLE nombre_tabla ;
DROP DATABASE nombre_base_de_datos ;
ALTER. Modifica la estructura de una tabla. Añadiendo o
eliminando una columna según usemos add o drop.
Su sintaxis es: ALTER TABLE ADD nombre_columna tipo_de_dato
ALTER TABLE DROP COLUMN nombre_columna
Comandos MDL (Manipulación de datos):
INSERT. Nos permite insertar datos en la base de datos.
Su sintaxis es: INSERT INTO nombre_tabla VALUES (valor1,v2...)
INSERT INTO clientes VALUES ( ‘pepe’,’martin’,43,’228765435L’)
7
8. Curso PHP Thales-CICA
SELECT. Nos permite hacer una selección en la base de datos.
Su sintaxis es: SELECT nombres_columnas_a_mostrar FROM
nombre_de_tablas ( Clausula WHERE )
Podemos:
- Usar todas las columnas de la tabla: SELECT * FROM clientes
- Elegir determinadas columnas de la tabla:
SELECT nombre, apellidos FROM clientes
- Elegir todos los campos de varias tablas:
SELECT * FROM clientes , empleados
- Elegir algunos campos de algunas tablas:
SELECT clientes.nombre, pais.ciudad apellidos
FROM clientes , pais
( Usamos nombre_tabla.nombre_columna)
Existe la opción DISTINCT que nos permite eliminar elementos
repetidos de una selección.
SELECT DISTINCT nombre , apellido FROM clientes, vendedores
UPDATE. Nos permite actualizar los datos de la base de datos.
Su sintaxis es: UPDATE nombre_tabla SET nombre_columna =
nuevo_valor WHERE Condición
Una condicion simple puede ser: nombre_columna LIKE ‘valor’
Podemos modificar el valor de una columna
UPDATE Cliente SET Nombre = 'Ramon' WHERE Apellido LIKE
“Martin”
o modificar el valor de varias columnas
UPDATE Cliente SET Nombre = 'Ramon' , telefono = 637453783
WHERE dni LIKE ‘232332323G’
8
9. Curso PHP Thales-CICA
Clausula WHERE. Sirve para establecer las condiciones de que
datos se manipularan.
Su sintaxis: WHERE columna operador valor
Lista de operadores:
= Igualdad
LIKE Igualdad para cadenas
<> Desigualdad
> Mayor que
< Menor que
>= Mayor o igual que
<= Menor o igual que
BETWEEN Entre un rango de valores
Los valores de las cadenas se ponen entre cadenas dobles o simples,
los valores numéricos no.
SELECT nombre , precio FROM producto WHERE precio > ‘300’
Error
SELECT nombre , precio FROM producto WHERE precio > 300
Correcto , mostraría el nombre del producto y el precio de aquellos
cuyo precio fuese superior a 300.
SELECT * FROM producto WHERE precio BETWEEN 300 AND 400
devuelve los productos cuyo precio está entre 300 y 400
Utilizaremos los operadores AND y OR para construir condiciones
mas complejas.
SELECT nombre , precio FROM producto WHERE precio > 300
AND nombre LIKE ‘a%’
Mostraría el nombre y el precio de los productos cuyo precio es
superior a 300 y su nombre empieza por a
SELECT nombre , precio FROM producto WHERE precio > 300
AND nombre LIKE ‘%a’
Mostraría el nombre y el precio de los productos cuyo precio es
superior a 300 o que su nombre termina por a
9
10. Curso PHP Thales-CICA
Clausula IN. Evita hacer usos reiterados de OR cuando queremos
que un valor valga cualquiera de un rango de valores.
SELECT nombre FROM cliente WHERE pais IN (‘España’,
‘Portugal’, ‘Brasil’, ‘Italia’)
Devulve los nombres de los clientes asociados a uno de esos paises
Alias Sirve para renombrar columnas. Nos es muy útil cuando tengo
columnas de diferentes tablas con el mismo nombre.
SELECT clientes.nombre AS nombre_cliente ,vendedores.nombre
AS nombre_vendedores from clientes,vendedores
Order by. Sirve para ordenar una selección. Ascendentemente ASC
o descendentemente DESC.
SELECT * from clientes ORDER BY nombre ASC
Se pueden ordenar por varios campos también
SELECT * from clientes ORDER BY nombre , apellidos DESC
Para probar si los comandos sql son correctos o no podemos utilizar
la herramienta PhPMyAdmin descrita en temas anteriores.
10
11. Curso PHP Thales-CICA
Será un método rápido para depurar errores
( no existe la tabla )
( comando sql con error sintáctico,
se escribe select y no selet )
(la tabla está vacia por lo que no devolverá datos)
A veces hacemos consultas incorrectas creyendo q devolverán un
resultado pero devuelven otro, es conveniente comprobar con el
phpmyadmin que el resultado devuelto es el adecuado.)
11
13. Curso PHP Thales-CICA
4. Funciones php para trabajar con mysql.
mysql_connect.
Def. Es la primera función que tendremos que utilizar antes de
realizar cualquier operación en la base de datos pues es la que nos
abre una conexión con el sistema de base de datos.
Sintaxis. int mysql_connect ( $hostname , $usuario , $password )
La función nos devolverá un entero que va a ser el identificador de la
conexión, este entero tendremos que suministrárselo a las
operaciones que manipulan la base de datos como veremos mas
adelante. Nosotros por convenio guardaremos ese identificador del
enlace en la variable link.
Ejemplo. $link = mysql_connect (“localhost”,”root”,”contraseña” );
mysql_close.
Def. Cierra una conexión con la base de datos, la conexión viene
identificada por el link suministrado a la función.
Si no se especifica un identificador de conexión, se asume le de la
última conexión abierta.
Sintaxis. int mysql_close ( $link )
Devuelve true(1) si se ha cerrado sin ningún problema, de lo
contrario devuelve false(0).
mysql_select_db.
Def. Selecciona la base de datos con la que vamos a trabajar.
Sintaxis. int mysql_select_db ( $nombre_base_de_datos , $link)
13
14. Curso PHP Thales-CICA
mysql_list_dbs.
Def. Nos sirve para conocer las bases de datos disponibles en un
servidor de bases de datos.
Sintaxis. $lista_db = mysql_list_dbs( $link) ;
$lista_db será un puntero de resultado, para imprimir las bd
tendremos que:
- opcion1. Usar la función mysql_fetch_object que devuelve una fila
de resultado como un objeto.
Dentro de la fila de resultado me interesa sólo el nombre de la base
de datos , por lo tanto solo accedo al campo Database de la fila.
- opcion2. Obtener el numero de bases de datos encontradas con la
función mysql_num_rows e ir obteniendo los nombres de las bases
de datos a partir del puntero resultado con mysql_db_name, función
que dado un puntero resultado de bases de datos y un indice
devuelve el nombre de la base de datos asociada.
Ejemplo. Imprimir la lista de bases de datos disponibles en el
servidor
$link = mysql_connect('localhost', 'usuario', 'pass'); //conexión
$lista_db = mysql_list_dbs($link); // puntero a resultado
opcion1:
while ($row = mysql_fetch_object($lista_db)) // recorro
{
echo $row->Database."<br>"; //imprimo nombre de la bd
}
opcion2:
$i = 0;
$num_db = mysql_num_rows($lista_db); //numero de bd
while ($i < $num_db)
{ // mientras queden bd
echo mysql_db_name($lista_db, $i) . "<br>"; // imprimo
$i++;
}
14
15. Curso PHP Thales-CICA
mysql_num_rows.
Def. Devuelve el número de filas de un resultado.
mysql_num_fields.
Def. Devuelve el número de campos de un resultado.
mysql_list_tables.
Def. Nos sirve para conocer las tablas de una base de datos
Sintaxis. $result = mysql_list_tables($nombre_bd);
Ejemplo.
$result = mysql_list_tables($nombre_bd);
while ($row = mysql_fetch_array($result))
{
echo "Tabla: “.$row[0].”<br>";
}
mysql_fetch_array.
Def. Anteriormente vimos la funcion mysql_fetch_object, esta función
es igual que la anterior con la diferencia que esta devuelve una array
en lugar de un objeto. Con el objeto sólo podemos acceder a los
datos por el nombre del campo, con el array podemos además
acceder por el indice.
Esta función distingue mayuscula y minuscula en los campos .
Sintaxis. array mysql_fetch_array ($puntero_resultado)
15
16. Curso PHP Thales-CICA
mysql_query.
Def. Nos sirve para hacer las manipulaciones de una base de datos.
Esta base de datos es la referenciada por $link, si no se suministra
$link se opera sobre la base de datos con la que se abrió el último
enlace.
Sintaxis. $result = mysql_query($query , $link)
Esta función devuelve un recurso, en este caso un recurso.
Para calcular el tipo de un recurso utilizamos la función get_resource
type($recurso).
Ejemplo.
$sql= ”SELECT * FROM clientes WHERE nombre LIKE 'luis' “;
$result = mysql_query($sql,$link);
if (!$result)
{
echo “Hubo un error:”.mysql_error());
}
Siempre guardaremos la consulta a realizar en la variable $sql.
(Recordemos que conviene comprobar el correcto funcionamiento,
tanto de sintaxis como de resultado esperado ejecutándola en el
phpmyadmin).
Si se produce un error en la función mysql_query se devuelve false,
es posible saber que error se ha producido, para ello hacemos uso de
la función mysql_error, que devuelve una cadena con el mensaje de
error de la última operación mysql.
mysql_result.
Def. Devuelve los datos de un resultado.
Sintaxis. int mysql_result ( $result, $fila )
int mysql_result ( $result, $fila , $campo) //campo asociativo
16
17. Curso PHP Thales-CICA
Ejemplo.
$sql = “ SELECT name as nombre FROM client “;
$result = mysql_query($sql,$link);
echo mysql_result($result, 2,nombre); // Imprime el empleado 2do
// del resultado
Las llamadas a mysql_result() no deben mezclarse con llamadas a las
otras sentencias que trabajan con un identificador de resultado.
Nota: Si en la consulta utilizamos un alias, deberemos utilizar ese
alias para acceder al campo y no el nombre del campo de la tabla.
mysql_free_result.
Def. Libera la memoria de la variable que contiene el resultado,
usaremos $result para contener este resultado.
Sintaxis. int mysql_free_result($result)
mysql_close.
Def. Cierra una conexión.
Sintaxis. Int mysql_close($link)
Además de estos comandos de mysql existen los llamados comandos
mysqli , pertenecientes a una versión mejorada de mysql.
Basicamente se encuentran versiones mejoradas de las funciones ya
descritas y algunas nuevas funciones.
Podeis encontrar una lista de las funciones en el siguiente enlace:
http://es.php.net/manual/es/ref.mysqli.php
17
18. Curso PHP Thales-CICA
Bibliografía de bases de datos
Date, C.J., Introducción a los Sistemas de Bases de Datos, 7ª Edición,
Addison Wesley, 2001.
Elmasri-Navathe, Fundamentos de Sistemas de Bases de Datos, 3ª
Edición, Addison Wesley, 2000.
Korth, H., A. Silberschatz, Fundamentos de Bases de Datos, 4ª
Edición, McGraw-Hill, 2002.
Gardarin, G., Dominar las Bases de Datos, Ediciones Gestión 2000,
1993.
http://es.wikipedia.org
http://www.tejedoresdelweb.com/307/article-65413.html
Bibliografía de SQL
http://www.w3schools.com/sql/
http://desarrolloweb.com/articulos/262.php?manual=9
http://www.aulaclic.es/sql/f_sql.htm
http://www.unav.es/cti/manuales/Intro_SQL/indice.html
Bibliografía de funciones mysql de php
http://www.php.net/manual/es/ref.mysql.php
18