Академический Документы
Профессиональный Документы
Культура Документы
ISC
V SEMESTRE
PAG. 2
Temario
1 Introduccin al Sistema Manejador de Base de Datos (DBMS) 1.1 Conceptos. 1.2 Caractersticas del DBMS 2 Lenguaje de Definicin de Datos (DDL) 2.1 Creacin de base de datos. 2.2 Creacin de tablas. 2.2.1 Integridad. 2.2.2 Integridad referencial declarativa. 2.3 Creacin de ndices 3 Consultas y Lenguaje de Manipulacin de Datos (DML) 3.1 Instrucciones INSERT, UPDATE, DELETE. 3.2 Consultas Bsicas SELECT, WHERE y funciones a nivel de registro. 3.3 Consultas sobre mltiples tablas. 3.3.1 Subconsultas. 3.3.2 Operadores JOIN. 3.4 Agregacin GROUP BY, HAVING. 3.5 Funciones de conjunto de registros COUNT, SUM, AVG, MAX, MIN 4 Control de Transacciones. 4.1 Propiedades de la transaccin. 4.2 Grados de consistencia. 4.3 Niveles de aislamiento. 4.4 Instrucciones COMMIT y ROLLBACK. 5 Vistas 5.1 Definicin y objetivo de las vistas. 5.2 Instrucciones para la administracin de vistas. 6 Seguridad. 6.1 Esquemas de autorizacin. 6.2 Instrucciones GRANT y REVOKE. 7 Introduccin al SQL Procedural. 7.1 Procedimientos almacenados. 7.2 Disparadores (Triggers).
ISC
V SEMESTRE
PAG. 3
UNIDAD UNO
Introduccin al Sistema Manejador de Base de Datos (DBMS)
Objetivo Educacional: El estudiante conocer los elementos y caractersticas principales del DBMS a utilizar en el curso.
ISC
1.1 Conceptos
Consiste en una coleccin de datos interrelacionados y un conjunto de programas para acceder a dichos datos.
La coleccin de datos, normalmente se denomina base de datos, contiene informacin relevante para una empresa.
Su objetivo primordial es: Proporcionar una forma de almacenar y recuperar la informacin de una bd de manera que sea tanto practica como eficiente Se compone de un lenguaje de definicin de datos (DDL: Data Definition Language), de un lenguaje de manipulacin de datos (DML: Data Manipulation Language) y de un lenguaje de consulta (SQL: Structured Query Language). El lenguaje de definicin de datos (DDL) es utilizado para describir todas las estructuras de informacin y los programas que se usan para construir, actualizar e introducir la informacin que contiene una base de datos. El lenguaje de manipulacin de datos (DML) es utilizado para escribir programas que crean, actualizan y extraen informacin de las bases de datos. El lenguaje de consulta (SQL) es empleado por el usuario para extraer informacin de la base de datos. El lenguaje de consulta permite al usuario hacer requisiciones de datos sin tener que escribir un programa, usando instrucciones como el SELECT, el PROJECT y el JOIN. Compilado por L.I. JHR V SEMESTRE PAG. 4
ISC
Taller de Base de Datos
Un SGBD
Un
SGBD debe proporcionar un mecanismo que asegure que la base de datos se actualice correctamente cuando varios usuarios la estn actualizando concurrentemente. Uno de los principales objetivos de los SGBD es el permitir que varios usuarios tengan acceso concurrente a los datos que comparten. El SGBD se debe encargar de que estas interferencias no se produzcan en el acceso simultneo.
V SEMESTRE
PAG. 5
Un
SGBD debe proporcionar un mecanismo que garantice que slo los usuarios autorizados pueden acceder a la base de datos. La proteccin debe ser contra accesos no autorizados, tanto intencionados como accidentales. SGBD debe proporcionar los medios necesarios para garantizar que tanto los datos de la base de datos, como los cambios que se realizan sobre estos datos, sigan ciertas reglas. La integridad de la base de datos requiere la validez y consistencia de los datos almacenados. Se puede considerar como otro modo de proteger la base de datos, pero adems de tener que ver con la seguridad, tiene otras implicaciones. La integridad se ocupa de la calidad de los datos. Normalmente se expresa mediante restricciones, que son una serie de reglas que la base de datos no puede violar. base de datos de modo efectivo. Dichas herramientas deben proporcionar.
Un
ISC
V SEMESTRE
PAG. 6
ACTIVIDADES DE APRENDIZAJE
Realizar una comparacin de las caractersticas de varios DBMSs. Discutir las ventajas y desventajas de los DBMS revisados. Buscar el proceso y requerimientos de instalacin del DBMS que ha de utilizarse en el curso. Instalar el DBMS
ISC
EVALUACION
Examen Participacin Investigacin Trabajo equipo e-r Ejercicios de Repaso 40 % 20 % 20 % 10 % (En rotafolios) 10 % 100 %
OTROS RECURSOS
Recurso 1. Cuadro Comparativo de algunos DBMS Recurso 2. Instalacin de AppServ Recurso 3. Lista de ejercicios
V SEMESTRE
PAG. 7
Recurso uno:
Cuadro Comparativo de algunos DBMS. Ver anexos Tipos de datos en Mysql
ISC
Recurso Dos:
Instalacin de AppServ
Que es AppServ? Es un software que permite la instalacin en nuestro entorno Windows, de los siguientes paquetes:
Apache Web Server (versin 2.2.3) Lenguaje PHP (versin 5 o 4) Base de datos MySQL (versin 5.0.24) Manejador de base de datos phpMyAdmin (versin 2.9.0.2) Esto es lo que incluye el actual paquete AppServ 2.5.7, es obvio pero vale la pena recordar que como esta formado por 4 paquetes (apache, php, Mysql, phpMyAdmin), cada uno sigue lanzando nuevas versiones, que podemos instalar por separado o esperar la prxima versin de AppServ. Como instalar AppServ 1) Damos doble click en el icono del instalado. Aparece la imagen que vemos debajo, recuerda que la versin puede ser ms nueva cuando t intentes ;). Debemos dar, siguiente (next).
V SEMESTRE
PAG. 8
ISC
3) En este punto, debemos elegir en cual de nuestros discos duros y en que carpeta vamos a instalar el AppServ, por defecto e s c:\AppServ, como muestra la imagen lo dejemos as, y le damos siguiente (Next)
V SEMESTRE
PAG. 9
ISC
5) En este punto debes indicar el nombre del servidor y el email del administrador del sistema, ponemos localhost y email root@localhost.com, respectivamente, el puerto 80. Clic en siguiente
V SEMESTRE
PAG. 10
ISC
Por tanto el usuario ser root, que es por y tu Contrasea que acabas de escribir, eso lo usaras para abrir la base desde tus programas PHP o cuando entre al MYSQL, por eso es importante recordar. Le damos siguiente (Next) 7) Para culminar la instalacin, como indica la imagen, podemos elegir si al finalizar ya comenzara a funcionar el Server Apache y el servidor de base de datos MySQL, lo dejamos marcado y le damos finalizar (Finish), listo hemos terminado.
V SEMESTRE
PAG. 11
ISC
En la configuracin Standard usando c:\AppServ la ubicacin que equivale a http://localhost es c:\AppServ\www por tanto si creas una carpeta pruebas dentro de www, quedand asi: c:\AppServ\www\pruebas, y dentro un archivo llamados test.php con el siguiente contenido: <?php echo phpinfo(); ?> Este archivo se ejecutara en tu navegador llamando lo as: http://localhost/pruebas/test.php
V SEMESTRE
PAG. 12
Recurso Tres:
Lista de Ejercicios
ISC
V SEMESTRE
PAG. 13
UNIDAD DOS
Lenguaje de Definicin de Datos (DDL)
Objetivo Educacional: Crear una base de datos, y definir su esquema en SQL.
ISC
Taller de Base de Datos
DDL (Data Definition Language) Lenguaje de definicin de datos. Es el lenguaje que se usa para crear bases de datos y tablas, y para modificar sus estructuras, as como los permisos y privilegios. Este lenguaje trabaja sobre unas tablas especiales llamadas diccionario de datos. DML (Data Manipulation Language) lenguaje de manipulacin de datos. Es el que se usa para modificar y obtener datos desde las bases de datos. SQL engloba ambos lenguajes DDL+DML, ya que ambos forman parte del conjunto de sentencias de SQL.
Para mostrar las bases de datos existentes en nuestro sistema se usa la sentencia SHOW DATABASES
mysql > SHOW DATABASES; +--------------------+ | Database | +--------------------+ | mysql | | prueba | | tes t | +--------------------+ 3 rows in set (0.00 sec)
Para seleccionar una base de datos se usa el comando USE, que no es exactamente una sentencia SQL, sino ms bien de una opcin de MySQL
mysql > USE prueba ; Da tabase changed mysql >
V SEMESTRE
PAG. 14
ISC
Taller de Base de Datos
mysql > CREATE TABLE gente (nombre VARCHAR(40), fecha DATE); Query OK, 0 rows affected (0.53 sec)
Podemos consultar cuntas tablas y qu nombres tienen en una base de datos, usando la sentencia SHOW TABLES
mysql > SHOW TABLES; +------------------+ | Tables _in_prueba | +------------------+ | gente | +------------------+ 1 row in set (0.01 sec)
La sintaxis para definir columnas es: nombre_col tipo [NOT NULL | NULL] [DEFAULT valor_por_defecto] [[PRIMARY] KEY] [COMMENT 'string'] [definicin_referencia] [AUTO_INCREMENT]
Valores nulos: Al definir cada columna podemos decidir si podr o no contener valores nulos. La opcin por defecto es que se permitan valores nulos, NULL, y para que no se permitan, se usa NOT NULL. Por ejemplo:
mysql >CREATE TABLE ciudad1(nombre CHAR(20) NOT NULL, pobla cion INT NULL); Query OK, 0 rows affected (0.98 sec)
Valores por defecto: Para cada columna tambin se puede definir, opcionalmente, un valor por defecto. El valor por defecto se asignar de forma automtica a una columna cuando no se especifique un valor determinado al aadir filas. Si una columna puede tener un valor nulo, y no se especifica un valor por defecto, se usar NULL como valor por defecto. En el ejemplo anterior, el valor por defecto para poblacion es NULL. Compilado por L.I. JHR V SEMESTRE PAG. 15
Claves primaria: Tambin se puede definir una clave primaria sobre una columna, usando la palabra clave KEY o PRIMARY KEY. Slo puede existir una clave primaria en cada tabla, y la columna sobre la que se define una clave primaria no puede tener valores NULL. Si esto no se especifica de forma explcita, MySQL lo har de forma automtica. Por ejemplo, si queremos crear un ndice en la columna nombre de la tabla de ciudades, crearemos la tabla as:
mysql > CREATE TABLE ciudad3 (nombre CHAR(20) NOT NULL PRIMARY KEY, poblacio n INT NULL DEFAULT 5000); Query OK, 0 rows affected (0.20 sec) mysql > CREATE TABLE ciudad3 (nombre CHAR(20) NOT NULL, pobla cion INT NULL DEFAULT 5000, PRIMARY KEY(nombre)); Query OK, 0 rows affected (0.20 sec)
ISC
Usar NOT NULL PRIMARY KEY equivale a PRIMARY KEY, NOT NULL KEY o sencillamente KEY. Columnas autoincrementadas: En MySQL tenemos la posibilidad de crear una columna autoincrementada, aunque esta columna slo puede ser de tipo entero. Si al insertar una fila se omite el valor de la columna autoincr ementada o si se inserta un valor nulo para esa columna, su valor se calcula automticamente, tomando el valor ms alto de esa columna y sumndole una unidad. Esto permite crear, de una forma sencilla, una columna con un valor nico para cada fila de la tabla. Generalmente, estas columnas se usan como claves primarias 'artificiales'. MySQL est optimizado para usar valores enteros como claves primarias, de modo que la combinacin de clave primaria, que sea entera y autoincrementada es ideal para usarla como clave primaria artificial:
mysql > CREATE TABLE ciudad5 (cla ve INT AUTO_INCREMENT PRIMARY KEY, nombre CHAR(20) NOT NULL,pobla cion INT NULL DEFAULT 5000); Query OK, 0 rows affected (0.11 sec)
Comentario: Adicionalmente, al crear la tabla, podemos aadir un comentario a cada columna. Este comentario sirve como informacin adicional sobre alguna caracterstica especial de la columna, y entra en el apartado de documentacin de la base de datos:
mysql > CREATE TABLE ciudad6(cla ve INT AUTO_INCREMENT PRIMARY KEY COMMENT 'Cla ve principal ',nombre CHAR(50) NOT NULL, pobla cion INT NULL DEFAULT 5000); Query OK, 0 rows affected (0.08 sec) mysql > show full columns from ciudad6;
V SEMESTRE
PAG. 16
Cambia el tipo de dato o nombre de la columna Cambia el nombre de la tabla Elimina una columna Aade una columna Pone como columna indexada a apellido_paterno Hace de id_clientes la llave primaria
ISC
Taller de Base de Datos
Alter table tabla_clie drop domicilio; Alter table tabla_clie add nombre varchar(30) Alter table clientes add index (apellido_paterno) Alter table Clientes add primary key (id_clientes)
Drop Drop table NombreTabla; Drop database NombreBd; Drop index apaterno on clientes
Elimina una tabla Elimina toda la base de datos Le quita la indexacin a la columna apaterno Borra una clave primaria (en una tabla solo existe una llave primaria por eso no se pone el nombre de la columna)
V SEMESTRE
PAG. 17
2.2.1 Integridad.
DEFINICION: Se refiere a la correccin y completitud de los datos en una BD. Cuando los contenidos de una BD se modifican con sentencias INSERT, DELETE o UPDATE, la integridad de los datos almacenados puede perderse de muchas maneras diferentes. Por ejemplo:
ISC
Taller de Base de Datos
Pueden aadirse datos no vlidos a la base de datos, tales como un pedido que espec ifica un producto no existente. Pueden modificarse datos existentes tomando un valor incorrecto, como por ejemplo si se reasigna un vendedor a una oficina no existente. Los cambios a la base de datos pueden perderse debido a un error del sistema o a un fallo en el suministro de potencia. Los cambios pueden ser aplicados parcialmente, como por ejemplo si se aade un pedido de un producto sin ajustar la cantidad disponible para vender. Una funcin importante de un DBMS (sistema gestor de la base de datos) re lacional es preservar la integridad de los datos almacenados en la mayor medida posible Para preservar la consistencia y correccin de los datos almacenados, un DBMS relacional impone generalmente una o ms restricciones de integridad de datos. Estas res tricciones restringen los valores que pueden ser insertados en la base de datos o creados mediante una actualizacin de la base de datos. Varios tipos diferentes de restricciones de integridad de datos suelen encontrarse en las bases de datos relacinales, incluyendo: Datos requeridos: Algunas columnas en una base de datos deben contener un valor de dato vlido en cada fila, es decir, no se permite que contengan valores NULL o que falten. Pueden especificarse columnas requeridas cuando se crea un tabla, en cuyo caso, el DBMS impedir los valores NULL en esas columnas. Chequeo de validez: Cada columna de una base de datos tiene un dominio, o sea, un conjunto de valores que son legales para esa columna. El DBMS puede ser preparado para impedir otros valores de datos en estas columnas. Integridad de entidad: La clave primaria de una tabla debe contener un valor nico en cada fila, diferente de los valores de todas las filas restantes. Los valores duplicados son ilegales y el DBMS puede ser preparado para forzar esta restriccin de valores nicos. Las restricciones de integridad de entidad aseguran que la clave primaria identifique unvocamente a cada entidad representada en la base de datos. Compilado por L.I. JHR V SEMESTRE PAG. 18
ISC
Taller de Base de Datos
Integridad referencial: Una clave secundaria (externa o fornea) en una base de datos relacional enlaza cada fila de la tabla hijo que contiene la clave fornea con la fila de la tabla padre que contiene el valor de clave primaria correspondiente. El DBMS pu ede ser preparado para forzar esta restriccin de clave fornea/clave primaria. Las restricciones de integridad referencial aseguran que las relaciones entre entidades en la base de datos se preserven durante las actualizaciones. En particular, la integridad referencial debe incluir reglas que indiquen cmo manejar la supresin de filas que son referenciadas mediante otras filas. Problemas de integridad referencial Existen cuatro tipos de actualizaciones de bases de datos que pueden corromper la integridad referencial de las relaciones padre/hijo de una base de datos. 1. La insercin de una nueva fila hijo: Cuando se inserta una nueva fila en la tabla hijo, su valor de clave fornea debe coincidir con uno de los valores de clave primaria en la tabla padre. Si el valor de clave fornea no coincide con ninguna clave primaria, la insercin de la fila corromper la base de datos, ya que habr un hijo sin un padre (un hurfano). Observe que insertar una fila en la tabla padre nunca representa un problema; simplemente se convierte en un padre sin hijos. 2. La actualizacin de la clave fornea en una fila hijo: Esta es una forma diferente del problema anterior. Si la clave fornea se modifica mediante una sentencia UPDATE, el nuevo valor deber coincidir con un valor de clave primaria en la tabla padre. En caso contrario la fila actualizada ser hurfana. 3. La supresin de una fila padre: Si una fila de la tabla padre, que tiene uno o ms hijos se suprime, las filas hijo quedarn hurfanas. Los valores de clave f ornea en estas filas ya no se correspondern con ningn valor de clave primaria en la tabla padre. Observe que suprimir una fila de la tabla hijo nunca representa un problema; el padre de esta fila simplemente tendr un hijo menos despus de la supresin. 4. La actualizacin de la clave primaria en una fila padre: Esta es una forma diferente del problema anterior. Si la clave primaria de una fila en la tabla padre se modifica, todos los hijos actuales de esa fila quedarn hurfanos, puesto que sus claves for neas ya no corresponden con ningn valor de clave primaria.
V SEMESTRE
PAG. 19
ISC
Taller de Base de Datos
1. Crear ambas tablas del tipo InnoDB. 2. Usar la sintaxis FOREIGN KEY(campo_fk) REFERENCES nombre_tabla (nombre_campo) 3. Crear un ndice en el campo que ha sido declarado clave fornea. InnoDB no crea de manera automtica ndices en las claves forneas o en las claves referenciadas, as que debemos crearlos de manera explcita. Los ndices son necesarios para que la verificacin de las claves forneas sea ms rpida. A continuacin se muestra como definir las dos tablas de ejemplo con una clave fornea.
CREATE TABLE cliente(id_cliente INT NOT NULL,nombre VARCHAR(30), PRIMARY KEY (id_cliente)) TYPE = INNODB; CREATE TABLE venta(id_factura INT NOT NULL,id_cliente INT NOT NULL,cantidad INT,PRIMARY KEY(id_factura), FOREIGN KEY (id_cliente) REFERENCES cliente(id_cliente)) TYPE = INNODB;
Las columnas correspondientes en la clave fornea y en la clave referenciada deben tener tipos de datos similares para que puedan ser comparadas sin la necesidad de hacer una conversin de tipos. El tamao y el signo de los tipos enteros debe ser el mismo. En las columnas de tipo caracter, el tamao no tiene que ser el mismo necesariamente. Por ejemplo, la creacin de la clave fornea en la tabla venta que se mostr anteriormente pudo haberse hecho de la siguiente manera con el uso de una sentencia ALTER TABLE:
CREATE TABLE venta ( id_factura INT NOT NULL, id_cliente INT NOT NULL, cantidad INT, PRIMARY KEY(id_factura),
V SEMESTRE
PAG. 20
La integridad referencial se puede comprometer bsicamente en tres situaciones: cuando se est insertando un nuevo registro, cuando se est eliminando un registro, y cuando se est actualizando un registro. La restriccin de clave fornea que hemos definido se asegura que cuando un nuevo registro sea creado en la tabla venta, ste debe tener su correspondiente registro en la tabla cliente.
ISC
Taller de Base de Datos
Una vez que hemos creado las tablas, vamos a insertar algunos datos que nos sirvan para demostrar algunos conceptos importantes:
mysql> INSERT INTO cliente VALUES(1,'Juan Penas'); Query OK, 1 row affected (0.05 sec) mysql> INSERT INTO cliente VALUES(2,'Pepe el toro'); Query OK, 1 row affected (0.05 sec) mysql> INSERT INTO venta VALUES(1,1,23); Query OK, 1 row affected (0.03 sec) mysql> INSERT INTO venta VALUES(3,2,81); Query OK, 1 row affected (0.03 sec)
En este momento no hay ningn problema, sin embargo, vamos a ver que sucede cuando intentamos insertar un registro en la tabla venta que se refiera a un cliente no existente cuyo id_cliente es 3:
mysql> INSERT INTO venta VALUES(2,3,39); ERROR 1216: Cannot add or update a child row: a foreign key constraint fails
El hecho es que MySQL no nos permite insertar este registro, ya que el cliente cuyo id_cliente es 3 no existe. La restriccin de clave fornea asegura que nuestros datos mantienen su integridad. Sin embargo, qu sucede cuando eliminamos algn registro?. Vamos a agregar un nuevo cliente, y un nuevo registro en la tabla venta, posteriormente eliminaremos el registro de nuestro tercer cliente:
mysql> INSERT INTO cliente VALUES(3,'Pepe pecas'); Query OK, 1 row affected (0.05 sec) mysql> INSERT INTO venta VALUES(2,3,39); Query OK, 1 row affected (0.05 sec) mysql> DELETE FROM cliente WHERE id_cliente=3; ERROR 1217: Cannot delete or update a parent row: a foreign key constraint fails
Debido a nuestra restriccin de clave fornea, MySQL no permite que eliminemos el registro de cliente cuyo id_cliente es 3, ya que se hace referencia a ste en la tabla venta. De nuevo, se Compilado por L.I. JHR V SEMESTRE PAG. 21
ISC
Taller de Base de Datos
mysql> ALTER TABLE venta DROP FOREIGN KEY; ERROR 1005: Can't create table '.test#sql-228_4.frm' (errno: 150)
Para eliminar la clave fornea se tiene que especificar el ID que ha sido generado y asignado internamente por MySQL a la clave fornea. En este caso, se puede usar la sentencia SHOW CREATE TABLE para determinar dicho ID.
mysql> SHOW CREATE TABLE venta; +--------+-----------------------------------------------------+ | Table | Create Table | +--------+-----------------------------------------------------+ | venta | CREATE TABLE 'venta' ( | | | 'id_factura' int(11) NOT NULL default '0', | | | 'id_cliente' int(11) NOT NULL default '0', | | | 'cantidad' int(11) default NULL, | | | PRIMARY KEY ('id_factura'), | | | KEY 'id_cliente' ('id_cliente'), | | | CONSTRAINT '0_22' FOREIGN KEY ('id_cliente') | | | REFERENCES 'cliente' ('id_cliente') ) TYPE=InnoDB | +-------+------------------------------------------------------+ 1 row in set (0.00 sec)
En nuestro ejemplo, la restriccin tiene el ID 0_22 (es muy probable que este valor sea diferente en cada caso).
mysql> ALTER TABLE venta DROP FOREIGN KEY 0_22; Query OK, 3 rows affected (0.23 sec) Records: 3 Duplicates: 0 Warnings: 0
ISC
Taller de Base de Datos
Si se especifica ON DELETE CASCADE, y una fila en la tabla padre es eliminada, entonces se eliminarn las filas de la tabla hijo cuya clave fornea sea igual al valor de la clave referenciada en la tabla padre. Esta accin siempre ha estado disponible en MySQL. Si se especifica ON DELETE SET NULL, las filas en la tabla hijo son actualizadas automticamente poniendo en las columnas de la clave fornea el valor NULL. Si se especifica una accin SET NULL, debemos asegurarnos de no declarar las columnas en la tabla como NOT NULL. A continuacin se muestra un ejemplo de eliminacin en cascada:
mysql> ALTER TABLE venta ADD FOREIGN KEY(id_cliente)REFERENCES cliente(id_cliente) ON DELETE CASCADE; Query OK, 3 rows affected (0.23 sec) Records: 3 Duplicates: 0 Warnings: 0
Vamos a ver como estn nuestros registros antes de ejecutar la sentencia DELETE:
mysql> SELECT * FROM cliente; +------------+--------------+ | id_cliente | nombre | +------------+--------------+ | 1 | Juan Penas | | 2 | Pepe el toro | | 3 | Pepe pecas | +------------+--------------+ 3 rows in set (0.00 sec)
V SEMESTRE
PAG. 23
ISC
Taller de Base de Datos
mysql> DELETE FROM cliente WHERE id_cliente=3; Query OK, 1 row affected (0.05 sec) mysql> SELECT * FROM venta; +------------+------------+----------+ | id_factura | id_cliente | cantidad | +------------+------------+----------+ | 1 | 1 | 23 | | 3 | 2 | 81 | +------------+------------+----------+ 2 rows in set (0.00 sec) mysql> SELECT * FROM cliente; +------------+--------------+ | id_cliente | nombre | +------------+--------------+ | 1 | Juan Penas | | 2 | Pepe el toro | +------------+--------------+ 2 rows in set (0.00 sec)
Con la eliminacin en cascada, se ha eliminado el registro de la tabla venta al que estaba relacionado Pepe Pecas.
V SEMESTRE
PAG. 24
NOTA: Se debe especificar ON DELETE antes de ON UPDATE, ya que de otra manera se recibir un error al definir la restriccin. Ahora est lista la clave fornea para una actualizacin en cascada. Este es el ejemplo:
mysql> SELECT * FROM venta; +------------+------------+----------+ | id_factura | id_cliente | cantidad | +------------+------------+----------+ | 1 | 1 | 23 | | 3 | 2 | 81 | +------------+------------+----------+ 2 rows in set (0.00 sec) mysql> UPDATE cliente SET id_cliente=10 WHERE id_cliente=1; Query OK, 1 row affected (0.05 sec) Rows matched: 1 Changed: 1 Warnings: 0
ISC
mysql> SELECT * FROM venta; +------------+------------+----------+ | id_factura | id_cliente | cantidad | +------------+------------+----------+ | 1 | 10 | 23 | | 3 | 2 | 81 | +------------+------------+----------+ 2 rows in set (0.00 sec)
En este caso, al actualizar el valor de id_cliente en la tabla cliente, se actualiza de manera automtica el valor de la clave fornea en la tabla venta. Esta es la actualizacin en cascada.
V SEMESTRE
PAG. 25
ISC
Queda como ejercicio al lector verificar que a partir de este diagrama se genera un cdigo SQL similar al mostrado a continuacin, que nos sirve para la creacin de las tablas con sus correspondientes definiciones de claves forneas: Considerar que se desean hacer eliminaciones y actualizaciones en cascada, y que en la tabla poema_libro la clave primaria est formada por ambos campos (id_poema y id_libro).
CREATE TABLE libro ( id_libro INT NOT NULL, titulo VARCHAR(100) NULL, precio NUMERIC(5,2) NULL, PRIMARY KEY(id_libro) ) TYPE=InnoDB; CREATE TABLE escritor ( id_escritor INT NOT NULL, nombre VARCHAR(30) NULL, apellidos VARCHAR(40) NULL, direccion VARCHAR(100) NULL, PRIMARY KEY(id_escritor) ) TYPE=InnoDB;
V SEMESTRE
PAG. 26
ISC
V SEMESTRE
PAG. 27
TABLA CURSO
CNO C22 T44 C55 C33 P11 T33 P33 CNOMBRE ESTRUCTURA DE DATOS COMUNISMO ARQ. ORDENADORES MA T. DISCRETAS EMPIRISMO HEDONISMO EXIS TENCIALISMO CIRCUTOS DIGITALES
ISC
C44
FUNDAMENTALIS MO T12 Acceso directo a un registro especificado INTRODUC. A LOS CC. Ordenacin C11
DESVENTAJAS:
P22 P44
RACIONALISMO SOLIPSISMO
Espacio de disco usado por el ndice ESCOLAS TICISMO T11 Costos de actualizacin
C66 BASE DE DATOS REL
Tenemos tres tipos de ndices. El primero corresponde a las claves primarias, que como vimos, tambin se pueden crear en la parte de definicin de columnas. La sintaxis para definir claves primarias es: definicin_columnas | PRIMARY KEY (index_nombre_col,...)
mysql > CREATE TABLE ciudad4 (nombre CHAR(20) NOT NULL, pobla cion INT NULL DEFAULT 5000, PRIMARY KEY (nombre));
Pero esta forma tiene ms opciones, por ejemplo, entre los parntesis podemos especificar varios nombres de columnas, para construir claves primarias compuestas por varias columnas:
mysql > CREATE TABLE mi tabla 1 (id1 CHAR(2) NOT NULL, id2 CHAR(2) NOT NULL, texto CHAR(30),PRIMARY KEY (id1, id2));
El segundo tipo de ndice permite definir ndices sobre una columna, sobre varias, o sobre partes de columnas. Para definir estos ndices se usan indistintamente las opciones KEY o INDEX.
mysql > CREATE TABLE mi tabla 2(id INT, nombre CHAR(19), INDEX (nombre)) ;
V SEMESTRE
PAG. 28
ISC
Taller de Base de Datos
Este ejemplo usar slo los cuatro primeros caracteres de la columna 'nombre' para crear el ndice. El tercero permite definir ndices con claves nicas, tambin sobre una columna, sobre varias o sobre partes de columnas. Para definir ndices con claves nicas se usa la opcin UNIQUE. La diferencia entre un ndice nico y uno normal es que en los nicos no se permite la insercin de filas con claves repetidas. La excepcin es el valor NULL, que s se puede repetir.
mysql > CREATE TABLE mi tabla 5 (id INT, nombre CHAR(19), UNIQUE (nombre));
Una clave primaria equivale a un ndice de clave nica, en la que el valor de la clave no puede tomar valores NULL. Tanto los ndices normales como los de claves nicas s pueden tomar valores NULL. Por lo tanto, las definiciones siguientes son equivalentes:
mysql > CREATE TABLE mi tabla 6(id INT, nombre CHAR(19) NOT NULL, UNIQU E (nombre)); mysql > CREATE TABLE mi tabla 7(id INT, nombre CHAR(19), PRIMARY KEY (nombre));
V SEMESTRE
PAG. 29
Recurso Cuatro:
Tipos de datos en Mysql
Al disear nuestras tablas tenemos que especificar el tipo de datos y tamao que podr almacenar cada campo. Bsicamente mysql admite dos tipos de datos: nmeros y cadenas de caracteres. Junto a estos dos grandes grupos, se admiten otros tipos de datos especiales: formatos de fecha, etc. Datos Numricos: En este tipo de campos solo pueden almacenarse nmeros, positivos o negativos, enteros o decimales, en notacin hexadecimal, cientfica o decimal. Los tipos numricos tipo integer admiten los atributos SIGNED y UNSIGNED indicando en el primer caso que pueden tener valor negativo, y solo positivo en el segundo. Los tipos numricos pueden adems usar el atributo ZEROFILL en cuyo caso los nmeros se completaran hasta la mxima anchura disponible con ceros (column age INT(5) zerofill => valor 23 se almacenar como 00023) BIT o BOOL, para un nmero entero que puede ser 0 1 TINYINT es un nmero entero con rango de valores vlidos desde -128 a 127. Si se configura como unsigned (sin signo), el rango de valores es de 0 a 255 SMALLINT, para nmeros enteros, con rango desde -32768 a 32767. Si se configura como unsigned, 0 a 65535. MEDIUMINT para nmeros enteros; el rango de valores va desde -8.388608 a 8388607. Si se configura como unsigned, 0 a 16777215 INT para almacenar nmeros enteros, en un rango de -2147463846 a 2147483647. Si configuramos este dato como unsigned, el rango es 0 a 4294967295 BIGINT nmero entero con rango de valores desde -9223372036854775808 a 9223372036854775807. Unsigned, desde 0 a 18446744073709551615. FLOAT (m,d) representa nmeros decimales. Podemos especificar cuantos dgitos (m) pueden utilizarse (trmino tambin conocido como ancho de pantalla), y cuantos en la parte decimal (d). Mysql redondear el decimal para ajustarse a la capacidad.
ISC
V SEMESTRE
PAG. 30
DOUBLE Nmero de coma flotante de precisin doble. Es un tipo de datos igual al anterior cuya nica diferencia es el rango numrico que abarca DECIMAL almacena los nmeros como cadenas. Caracteres O Cadenas
ISC
Taller de Base de Datos
CHAR Este tipo se utiliza para almacenar cadenas de longitud fija. Su longitud abarca desde 1 a 255 caracteres. VARCHAR Al igual que el anterior se utiliza para almacenar cadenas, en el mismo rango de 1 255 caracteres, pero en este caso, de longitud variable. Un campo CHAR ocupar siempre el mximo de longitud que le hallamos asignado, aunque el tamao del dato sea menor (aadiendo espacios adicionales que sean precisos). Mientras que VARCHAR solo almacena la longitud del dato, permitiendo que el tamao de la base de datos sea menor. Eso si, el acceso a los datos CHAR es ms rpido que VARCHAR. No pueden alternarse columnas CHAR y VARCHAR en la misma tabla. Mysql cambiar las columnas CHAR a VARCHAR. Tambin cambia automticamente a CHAR si usamos VARCHAR con valor de 4 o menos. TINYTEXT, TINYBLOB para un mximo de 255 caracteres. La diferencia entre la familia de datatypes text y blob es que la primera es para cadenas de texto plano (sin formato) y case insensitive (sin distinguir maysculas o minsculas) mientras que blob se usa para objetos binarios: cualquier tipo de datos o informacin, desde un archivo de texto con todo su formato (se diferencia en esto de el tipo Text) hasta imgenes, archivos de sonido o video TEXT y BLOB se usa para cadenas con un rango de 255 - 65535 caracteres. La diferencia entre ambos es que TEXT permite comparar dentro de su contenido sin distinguir maysculas y minsculas, y BLOB si distingue.
MEDIUMTEXT, MEDIUMBLOB textos de hasta 16777215 caracteres. LONGTEXT, LONGBLOB, hasta mximo de 4.294.967.295 caracteres
Varios DATE para almacenar fechas. El formato por defecto es YYYY MM DD desde 0000 00 00 a 9999 12 31. DATETIME Combinacin de fecha y hora. El rango de valores va desde el 1 de enero del 1001 a Compilado por L.I. JHR V SEMESTRE PAG. 31
ISC
Taller de Base de Datos
YEAR almacena un ao. El rango de valores permitidos va desde el ao 1901 al ao 2155. El campo puede tener tamao dos o tamao 4 dependiendo de si queremos almacenar el ao con dos o cuatro dgitos. SET un campo que puede contener ninguno, uno varios valores de una lista. La lista puede tener un mximo de 64 valores. ENUM es igual que SET, pero solo se puede almacenar uno de los valores de la lista
V SEMESTRE
PAG. 32
Recurso Cinco:
Realizar la siguiente base de datos llamada BIBLIOTECA
Ejercicios de prctica
Libro(ClaveLibro, Ttulo, Idioma, Formato, Categora, ClaveEditorial) Tema(ClaveTema, Nombre) Autor(ClaveAutor, Nombre) Editorial(ClaveEditorial, Nombre, Direccin, Telfono) Ejemplar(ClaveLibro, NmeroOrden, Edicin, Ubicacin) Socio(ClaveSocio, Nombre, Direccin, Telfono, Categora) Prstamo(ClaveSocio, ClaveLibro, NmeroOrden, Fecha_prstamo, Fecha_devolucin, Notas) Trata_sobre(ClaveLibro, ClaveTema) Escrito_por(ClaveLibro, ClaveAutor) los tipos para las columnas:
ISC
Col umna Cla veLibro Ti tulo Idioma Formato Ca tegoria(libro) Cla veTema Nombre(tema ) Cla veAutor Nombre(autor) Cla veEdi torial Nombre(edi torial) Di recci on(edi torial) Telefono(edi torial) NumeroOrden
Tipo INT VARCHAR(60) VARCHAR(15) VARCHAR(15) CHAR SMALLINT VARCHAR(40) INT VARCHAR(60) SMALLINT VARCHAR(60) VARCHAR(60) VARCHAR(15) SMALLINT
Edi cion Ubi ca cion Cla veSocio Nombre(socio) Di recci on(s ocio) Telefono(socio) Ca tegoria(soci o) Fecha _pres tamo
Fecha_devolucion Notas
DATE BLOB
V SEMESTRE
PAG. 33
ISC
Examen 50% ( 2 partes. 1parte el lunes 20%, 2 parte el martes 30%) Ejercicios de tareas 15% Ejercicios de practica 15% Practicas de laboratorio 20% Examen el dia lunes 6 de octubre Entrega de ejercicios lunes 6 Entrega de ejercicios de practica lunes 6
V SEMESTRE
PAG. 34
UNIDAD TRES
Consultas y Lenguaje de Manipulacin de Datos (DML)
Objetivo Educacional: Consultar y manipular los datos de una base de datos.
ISC
Taller de Base de Datos
Si no necesitamos asignar un valor concreto para alguna columna, podemos asignarle el valor por defecto indicado para esa columna cuando se cre la tabla, usando la palabra DEFAULT:
mysql> INSERT INTO ciudad2 VALUES ('Perillo', DEFAULT); Query OK, 1 row affected (0.03 sec)
V SEMESTRE
PAG. 35
En este caso, como habamos definido un valor por defecto para poblacin de 5000, se asignar ese valor para la fila correspondiente a 'Perillo'. Otra opcin consiste en indicar una lista de columnas para las que se van a suministrar valores. A las columnas que no se nombren en esa lista se les asigna el valor por defecto. Este sistema, adems, permite usar cualquier orden en las columnas, con la ventaja, con respecto a la anterior forma, de que no necesitamos conocer el orden de las columnas en la tabla pa ra poder insertar datos:
mysql> INSERT INTO ciudad5 (poblacion,nombre) VALUES (7000000, 'Madrid'), (9000000, 'Pars'), (3500000, 'Berln'); Query OK, 3 rows affected (0.05 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM ciudad5; +-------+--------+-----------+ | clave | nombre | poblacion | +-------+--------+-----------+ | 1 | Madrid | 7000000 | | 2 | Pars | 9000000 | | 3 | Berln | 3500000 | +-------+--------+-----------+ 3 rows in set (0.03 sec)
ISC
Cuando creamos la tabla "ciudad5" definimos tres columnas: 'clave', 'nombre' y 'poblacion' (por ese orden). Ahora hemos insertado tres filas, en las que hemos omitido la clave, y hemos alterado el orden de 'nombre' y 'poblacion'. El valor de la 'clave' se calcula automticamente, ya que lo hemos definido como auto-incrementado. Existe otra sintaxis alternativa, que consiste en indicar el valor para cada columna:
mysql> INSERT INTO ciudad5 SET nombre='Roma', poblacion=8000000; Query OK, 1 row affected (0.05 sec) mysql> SELECT * FROM ciudad5; +-------+--------+-----------+ | clave | nombre | poblacion | +-------+--------+-----------+ | 1 | Madrid | 7000000 | | 2 | Pars | 9000000 | | 3 | Berln | 3500000 | | 4 | Roma | 8000000 | +-------+--------+-----------+ 4 rows in set (0.03 sec)
V SEMESTRE
PAG. 36
ISC
Taller de Base de Datos
Si intentamos insertar dos filas con el mismo valor de la clave nica se produce un error y la sentencia no se ejecuta. Pero existe una opcin que podemos usar para los casos de claves duplicadas: ON DUPLICATE KEY UPDATE. En este caso podemos indicar a MySQL qu debe hacer si se intenta insertar una fila que ya existe en la tabla. Las opciones son limitadas: no podemos insertar la nueva fila, sino nicamente modificar la que ya existe. Por ejemplo, en la tabla 'ciudad3' podemos usar el ltimo valor de poblacin en caso de repeticin:
mysql> INSERT INTO ciudad3 (nombre, poblacion) VALUES('Madrid', 7000000); Query OK, 1 rows affected (0.02 sec) mysql> INSERT INTO ciudad3 (nombre, poblacion) VALUES ('Pars', 9000000), ('Madrid', 7200000) ON DUPLICATE KEY UPDATE poblacion=VALUES(poblacion); Query OK, 3 rows affected (0.06 sec) Records: 2 Duplicates: 1 Warnings: 0
mysql> SELECT * FROM ciudad3; +--------+-----------+ | nombre | poblacion | +--------+-----------+ | Madrid | 7200000 | | Pars | 9000000 | +--------+-----------+ 1 rows in set (0.00 sec)
En este ejemplo, la segunda vez que intentamos insertar la fila correspondiente a 'Madrid' se usar el nuevo valor de poblacin. Si en lugar de VALUES(poblacion) usamos poblacin el nuevo valor de poblacin se ignora. Tambin podemos usar cualquier expresin: Compilado por L.I. JHR V SEMESTRE PAG. 37
ISC
o Update Podemos modificar valores de las filas de una tabla usando la sentencia UPDATE. En su forma ms simple, los cambios se aplican a todas las filas, y a las columnas que especifiquemos. UPDATE [LOW_PRIORITY] [IGNORE] tbl_name SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition] [ORDER BY ...] [LIMIT row_count] Por ejemplo, podemos aumentar en un 10% la poblacin de todas las ciudades de la tabla ciudad3 usando esta sentencia:
mysql> UPDATE ciudad3 SET poblacion=poblacion*1.10; Query OK, 5 rows affected (0.15 sec) Rows matched: 5 Changed: 5 Warnings: 0 mysql> SELECT * FROM ciudad3; +---------+-----------+ | nombre | poblacion | +---------+-----------+ | Berln | 6600000 | | Londres | 11000000 | | Madrid | 7920000 | | Pars | 10120000 | | Roma | 10450000 | +---------+-----------+
V SEMESTRE
PAG. 38
ISC
Taller de Base de Datos
En este ejemplo hemos incrementado el valor de la columna 'clave' en 10 y disminuido el de la columna 'poblacion' en un 3%, para todas las filas. Pero no tenemos por qu actualizar todas las filas de la tabla. Podemos limitar el nmero de filas afectadas de varias formas. La primera es mediante la clusula WHERE. Usando e sta clusula podemos establecer una condicin. Slo las filas que cumplan esa condicin sern actualizadas:
mysql> UPDATE ciudad5 SET poblacion=poblacion*1.03 WHERE nombre='Roma'; Query OK, 1 row affected (0.05 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> SELECT * FROM ciudad5; +-------+--------+-----------+ | clave | nombre | poblacion | +-------+--------+-----------+ | 11 | Madrid | 6790000 | | 12 | Pars | 8730000 | | 13 | Berln | 3395000 | | 14 | Roma | 7992800 | +-------+--------+-----------+ 4 rows in set (0.00 sec)
En este caso slo hemos aumentado la poblacin de las ciudades cuyo nombre sea 'Roma'. Las condiciones pueden ser ms complejas. Existen muchas funciones y operadores que se pueden aplicar sobre cualquier tipo de columna, y tambin podemos usar operadores booleanos como AND u OR. Veremos esto con ms detalle en otros captulos. Otra forma de limitar el nmero de filas afectadas es usar la clusula LIMIT. Esta clusula permite especificar el nmero de filas a modificar:
mysql> UPDATE ciudad5 SET clave=clave-10 LIMIT 2; Query OK, 2 rows affected (0.05 sec) Rows matched: 2 Changed: 2 Warnings: 0
V SEMESTRE
PAG. 39
ISC
Taller de Base de Datos
En este ejemplo hemos decrementado en 10 unidades la columna clave de las dos primeras filas.Esta clusula se puede combinar con WHERE, de modo que slo las 'n' primeras filas que cumplan una determinada condicin se modifiquen. Sin embargo esto no es lo habitual, ya que, si no existen claves primarias o nicas, el orden de las filas es arbitrario, no tiene sentido seleccionarlas usando slo la clusula LIMIT. La clusula LIMIT se suele asociar a la clusula ORDER BY. Por ejemplo, si queremos modificar la fila con la fecha ms antigua de la tabla 'gente', usaremos esta sentencia:
mysql> UPDATE gente SET fecha="1985-04-12" ORDER BY fecha LIMIT 1; Query OK, 1 row affected, 1 warning (0.03 sec) Rows matched: 1 Changed: 1 Warnings: 1 mysql> SELECT * FROM gente; +---------+------------+ | nombre | fecha | +---------+------------+ | Fulano | 1985-04-12 | | Mengano | 1978-06-15 | | Tulano | 2000-12-02 | | Pegano | 1993-02-10 | +---------+------------+ 4 rows in set (0.00 sec)
Si queremos modificar la fila con la fecha ms reciente, usaremos el orden inverso, es decir, el descendente:
mysql> UPDATE gente SET fecha="2001-12-02" ORDER BY fecha DESC LIMIT 1; Query OK, 1 row affected (0.03 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> SELECT * FROM gente; +---------+------------+ | nombre | fecha | +---------+------------+ | Fulano | 1985-04-12 | | Mengano | 1978-06-15 | | Tulano | 2001-12-02 | | Pegano | 1993-02-10 | +---------+------------+ 4 rows in set (0.00 sec)
Cuando exista una clave primaria o nica, se usar ese orden por defecto, si no se especifica una clusula ORDER BY. Compilado por L.I. JHR V SEMESTRE PAG. 40
ISC
Taller de Base de Datos
mysql> DELETE FROM ciudad3; Query OK, 5 rows affected (0.05 sec)
De este modo se eliminan todas las filas de la tabla. Pero es ms frecuente que slo queramos eliminar ciertas filas que cumplan determinadas condiciones. La forma ms normal de hacer esto es usar la clusula WHERE:
mysql> DELETE FROM ciudad5 WHERE clave=2; Query OK, 1 row affected (0.05 sec) mysql> SELECT * FROM ciudad5; +-------+--------+-----------+ | clave | nombre | poblacion | +-------+--------+-----------+ | 1 | Madrid | 6790000 | | 13 | Berln | 3395000 | | 14 | Roma | 7992800 | +-------+--------+-----------+ 3 rows in set (0.01 sec)
Tambin podemos usar las clusulas LIMIT y ORDER BY del mismo modo que en la sentencia UPDATE, por ejemplo, para eliminar las dos ciudades con ms poblacin:
mysql> DELETE FROM ciudad5 ORDER BY poblacion DESC LIMIT 2; Query OK, 2 rows affected (0.03 sec) mysql> SELECT * FROM ciudad5; +-------+--------+-----------+ | clave | nombre | poblacion | +-------+--------+-----------+ | 13 | Berln | 3395000 | +-------+--------+-----------+ 1 row in set (0.00 sec)
V SEMESTRE
PAG. 41
ISC
Mediante la sentencia SELECT es posible hacer una proyeccin de una tabla, seleccionando las columnas de las que queremos obtener datos. En la sintaxis que hemos mostrado, la seleccin de columnas corresponde con la parte "expresion_select". En el ejemplo anterior hemos usado '*', que quiere decir que se muestran todas las columnas. Pero podemos usar una lista de columnas, y de ese modo slo se mostrarn esas columnas:
mysql> SELECT nombre FROM gente; +---------+ | nombre | +---------+ | Fulano | | Mengano | | Tulano | | Pegano | +---------+ 4 rows in set (0.00 sec)
V SEMESTRE
PAG. 42
Las expresiones_select no se limitan a nombres de columnas de tablas, pueden ser otras expresiones, incluso aunque no correspondan a ninguna tabla:
mysql> SELECT SIN(3.1416/2), 3+5, 7*4; +------------------+-----+-----+ | SIN(3.1416/2) | 3+5 | 7*4 | +------------------+-----+-----+ | 0.99999999999325 | 8 | 28 | +------------------+-----+-----+ 1 row in set (0.00 sec)
ISC
Taller de Base de Datos
Vemos que podemos usar funciones, en este ejemplo hemos usando la funcin SIN para calcular el seno de /2.
Tambin podemos aplicar funciones sobre columnas de tablas, y usar esas columnas en expresiones para generar nuevas columnas:
mysql> SELECT nombre, fecha, DATEDIFF(CURRENT_DATE(),fecha)/365 FROM gente; +---------+------------+------------------------------------+ | nombre | fecha | DATEDIFF(CURRENT_DATE(),fecha)/365 | +---------+------------+------------------------------------+ | Fulano | 1985-04-12 | 19.91 | | Mengano | 1978-06-15 | 26.74 | | Tulano | 2001-12-02 | 3.26 | | Pegano | 1993-02-10 | 12.07 | +---------+------------+------------------------------------+ 4 rows in set (0.00 sec)
Aprovechemos la ocasin para mencionar que tambin es posible asignar un alias a cualquiera de las expresiones select. Esto se puede hacer usando la palabra AS, aunque esta palabra es opcional:
mysql> SELECT nombre, fecha, DATEDIFF(CURRENT_DATE(),fecha)/365 AS edad -> FROM gente; +---------+------------+-------+ | nombre | fecha | edad | +---------+------------+-------+ | Fulano | 1985-04-12 | 19.91 | | Mengano | 1978-06-15 | 26.74 | | Tulano | 2001-12-02 | 3.26 | | Pegano | 1993-02-10 | 12.07 | +---------+------------+-------+ 4 rows in set (0.00 sec)
Podemos hacer:
mysql> SELECT 2+3 "2+3"; +-----+ | 2+3 | +-----+ | 5 | +-----+
V SEMESTRE
PAG. 43
ISC
Taller de Base de Datos
mysql> SELECT fecha FROM gente; +------------+ | fecha | +------------+ | 1985-04-12 | | 1978-06-15 | | 2001-12-02 | | 1993-02-10 | | 1978-06-15 | | 1985-04-12 | +------------+ 6 rows in set (0.00 sec
Vemos que existen dos valores de filas repetidos, para la fecha "1985 -04-12" y para "1978-06-15". La sentencia que hemos usado asume el valor por defecto (ALL) para el grupo de opciones ALL, DISTINCT y DISTINCTROW. En realidad slo existen dos opciones, ya que las dos ltimas: DISTINCT y DISTINCTROW son sinnimos. La otra alternativa es usar DISTINCT, que har que slo se muestren las filas diferentes:
mysql> SELECT DISTINCT fecha FROM gente; +------------+ | fecha | +------------+ | 1985-04-12 | | 1978-06-15 | | 2001-12-02 | | 1993-02-10 | +------------+ 4 rows in set (0.00 sec)
Otra de las operaciones del lgebra relacional era la seleccin, que consista en seleccionar filas de una relacin que cumplieran determinadas condiciones. Lo que es ms til de una base de datos es la posibilidad de hacer consultas en funcin de ciertas condiciones. Generalmente nos interesar saber qu filas se ajustan a determinados parmetros. Por supuesto, SELECT permite usar condiciones como parte de su sintaxis, es decir, para hacer selecciones. Concretamente mediante la clusula WHERE, veamos algunos ejemplos:
V SEMESTRE
PAG. 44
ISC
Taller de Base de Datos
Diaz Jimnez Alonso Tellez Select Select Select Select Select Select Select Select
Renombrando columnas:
distinct Alojamiento From empleado; * from curso where ctarifa <150; * from curso where cnombre>=Racionalismo; ciudad, ventas, objetivo from oficinas where ventas > objetivo; nombre, ventas, cuota from repventas where numempl= 105; * from personal order by enombre dept, cargo, esueldo from personal order by dept, esueldo desc; ciudad, regios, ventas from oficinas order by region, ciudad;
Con condiciones:
Select ciudad, region, ventas-objetivo as SUPERHABIT from oficinas; Select ciudad, region, ventas-objetivo SUPERHABIT from oficinas;
Select nombre from repventas where contrato<1988-01-01; Select * from oficinas where ventas<0.8*objetivo; Select * from oficinas where dir<>108;
V SEMESTRE
PAG. 45
In
ISC
Select * from curso where ctarifa in(12,50,75,90,100,500); Select * from curso where ctarifa not in(12,50 ,75,90,100,500); Select * from repventas where oficinarep in (11,13,22); Select numpedido, fechapedido, importe from pedidos where fechapedido not in(199001-04, 1990-01-11, 1990-01-18, 1990-01-05);
Like
Is null
* from curso where cdesp like pa% empresa, limitecredito from clientes where empresa like s% * from clientes where limitecredito not like 20000; * from clientes where limitecredito <> 20000;
Select fnombre, fnumdep, fdept from claustro where fnumdep is not null Select nombre from ventas where oficinarep is not null
UNION Permite combinar resultados de dos o ms consultas en una nica tabla. Por ejemplo, visualizar todos los salarios de todo el personal y del claustro de la facultad en una nica tabla:
Select esueldo from personal UNION select fsueldo from claustro;
Lista todos los productos cuyo precio unitario excede de 2000 o con importe de pedido superior a 30000
Select idfab, idproducto from productos where precio >2000 UNION select distinct fab, producto from pedidos where importe > 30000;
3.3 Consultas sobre mltiples tablas. Hasta ahora todas las consultas que hemos usado se refieren slo a una tabla, pero tambin es posible hacer consultas usando varias tablas en la misma sentencia SELECT. Esto nos permite realizar otras dos operaciones de lgebra relacional: el producto cartesiano y la composicin.
V SEMESTRE
PAG. 46
ISC
El producto cartesiano de dos tablas son todas las combinaciones de todas las filas de las dos tablas. Usando una sentencia SELECT se hace proyectando todos los atributos de ambas tablas. Los nombres de las tablas se indican en la clusula FROM separados con comas:
mysql> SELECT * FROM personas2,telefonos2; +----+-----------+------------+-----------+----+ | id | nombre | fecha | numero | id | +----+-----------+------------+-----------+----+ | 1 | Fulanito | 1956-12-14 | 123456789 | 1 | | 2 | Menganito | 1975-10-15 | 123456789 | 1 | | 3 | Tulanita | 1985-03-17 | 123456789 | 1 | | 4 | Fusganita | 1976-08-25 | 123456789 | 1 | | 1 | Fulanito | 1956-12-14 | 145654854 | 1 | | 2 | Menganito | 1975-10-15 | 145654854 | 1 | | 3 | Tulanita | 1985-03-17 | 145654854 | 1 | | 4 | Fusganita | 1976-08-25 | 145654854 | 1 | | 1 | Fulanito | 1956-12-14 | 152452545 | 1 | | 2 | Menganito | 1975-10-15 | 152452545 | 1 | | 3 | Tulanita | 1985-03-17 | 152452545 | 1 | | 4 | Fusganita | 1976-08-25 | 152452545 | 1 | | 1 | Fulanito | 1956-12-14 | 254254254 | 2 | | 2 | Menganito | 1975-10-15 | 254254254 | 2 | | 3 | Tulanita | 1985-03-17 | 254254254 | 2 |
V SEMESTRE
PAG. 47
ISC
Taller de Base de Datos
Las consultas multitablas o JOINS, tambin denominadas combinaciones o composiciones, permiten recuperar datos de dos tablas o mas segn las relaciones lgicas entre ellas. Ejemplo: Combina tabla pedido y clientes (que se separan por coma en la clusula from) mostrando el numero de pedido y su importe y el numero de cliente y su lmite de credito, utilizando para la combinacin la columna clie de la tabla pedidos y la columna numclie de la tabla clientes:
Select numpedido, clie=numclie; importe, empresa, limitecredito from pedidos, clientes where
3.3.1 Subconsultas.
Una subconsulta es una consulta dentro de otra. El SGBD usa los resultados de la subconsulta para determinar los resultados de la consulta de alto nivel que contiene a la subconsulta. En las formas mas simples de una subconsulta, esta aparece dentro de una clausula WHERE o HAVING de otra instruccin SQL. Las subconsultas proporcionan una forma natural y eficiente de manejar las solicitudes de consultas que se expresan en trminos de los resultados de otras. Listar las oficinas en las que el objetivo de ventas exceda la suma de las cuotas de cada representante. La solicitud pide una lista de oficinas de la tabla OFICINAS donde el valor de la columna OBJETIVO cumple alguna condicin. Parece razonable que la instruccin SELECT que expresa la consulta pueda ser como: Compilado por L.I. JHR V SEMESTRE PAG. 48
El valor ??? se debe rellenar y debe ser igual a la suma de las cuotas de los representantes asignados a la oficina en cuestin. Cmo puede especificarse ese valor en la consulta? (suponga que el numero de oficina es 21) entonces la consulta para la suma de las cuotas de una oficina quedara de la siguiente manera.
Select sum(cuota) from representantes where oficina_rep=21
ISC
Taller de Base de Datos
Pero sera poco eficaz tener que escribir esta consulta, escribir los resultados y escribir en la consulta anterior la cantidad correcta. Cmo se pueden poner los resultados de esta consulta en la consulta anterior en lugar de los signos de interrogacin? As:
Select ciudad from oficinas where objetivo > ( Select sum(cuota) from repventas where oficinarep=oficina)
Para cada oficina, la consulta interna(la subconsulta) calcula la suma de las cuotas de los representantes que trabajan en esa oficina. La consulta externa (la consulta principal) compara el objetivo de la oficina con el total calculado y decide si aade la oficina a los resultados de la consulta principal. Al trabajar juntas, la consulta principal y la subconsulta expresan la solicitud original y recuperan los datos solicitados de la base de datos. CONCEPTO DE SUBCONSULTA La subconsulta se encierra entre parntesis; sin embargo tiene la forma familiar de una instruccin SELECT, con una clausula FROM y clausulas opcionales WHERE, GROUP BY y HAVING Comparacin en subconsultas Ejemplos: 1. Listar los representantes cuyas cuotas son iguales o superiores al objetivo de la oficina de ventas de Almera
Select nombre from repventas where cuota >= (select objetivo from oficinas where ciudad= los angeles and oficinarep=oficina);
3. Listar todos los productos del fabricante ACI para los que su Stock esta por encima del stock del producto ACI-41004 Compilado por L.I. JHR V SEMESTRE PAG. 49
Pertenencias a conjuntos (IN) El test de pertenencia a conjuntos (IN) en subconsultas es una forma modificada del test de pertenencia a conjuntos simples. Compara un unico valor de datos con una columna de valores de datos producidos por una subconsulta y devuelve un resultado TRUE si el valor de los datos coincide con uno de los valores de la columna. Este test se usa cuando es necesario comparar un valor de la fila que se est comprobando con un conjunto de valores producido por una subconsulta. Ejemplo: Listar todos los representantes que trabajan en oficinas que estn por encima de sus objetivos
ISC
where
oficina_rep
in
(select
oficina
from
La subconsulta produce un conjunto de nmeros de oficina donde las ventas son superiores a sus objetivos. La consulta principal comprueba a continuacin cada fila de la tabla representantes para determinar si un representante en concreto trabaja en una oficina con uno de estos nmeros Listar los representantes que no trabajan en oficinas dirigidas por Leon Freire (empleado 108)
Select nombre from oficinas where jef = 108) representantes where oficina_rep not in (select oficina from
Listar todos los clientes que han formulado pedidos de zapatos de ACI(fabricante ACI, numeros de producto comienzan en 4100) entre enero y junio de 1990
Select empresa from clientes where n um_cli in (select distinct cliente from pedidos where fab= ACI and producto like 4100% and fecha_pedido between 01-ene- 90 and 30jun-90)
V SEMESTRE
PAG. 50
ISC
Tabla REPVENTAS
+---------+---------------+------+------------+------------+------------+----------+--------+--------+ | Numempl | Nombre | Edad | Oficinarep | Titulo | Contrato | Director | Cuota | Ventas |
+---------+---------------+------+------------+------------+------------+----------+--------+--------+ | 101 | Dan Roberts 102 | Sue Smith 103 | Paul Cruz 104 | Bob Smith 105 | Bill Adams | | | | | 45 | 48 | 29 | 33 | 37 | 49 | 62 | 31 | 35 | 11 | 11 | Rep Ventas | 1986 -10-20 | 21 | Rep Ventas | 1986 -12-12 | 11 | Rep Ventas | 1987 -03-01 | 11 | Dir Ventas | 1987 -05-19 | 13 | Rep Ventas | 1988 -02-12 | 22 | Rep Ventas | 1988 -11-14 | 21 | Dir Ventas | 1989 -10-12 | 11 | Rep Ventas | 1999 -10-12 | 15 | Dir Ventas | 1990 -07-25 | 0 | NULL | 0000 -00-00 | 104 | 257143 | 305673 | 108 | 333333 | 474050 | 104 | 235715 | 286775 | 106 | 171428 | 142594 | 104 | 333333 | 367911 | 108 | 285714 | 186042 | 106 | 333333 | 361865 | 106 | 285714 | 392725 | 108 | 100000 | 1990 | 103 | 0 | 15 |
| | | | | | | | |
107 | Nancy Angelli | 108 | Larry Fitch 109 | Mary Jones 11 | Matas Clark 0 | 35 | | | |
+---------+---------------+------+------------+------------+------------+----------+--------+--------+
Tabla CLIENTES
+---------+------------------+---------+---------------+ | Numclie | Empresa | Repclie | Limitecredito | +---------+------------------+---------+---------------+ | 2101 | Jones Mfg. | 102 | 65000 | | 2106 | Fred Lewis Corp. | 102 | 65000 | | 2109 | Chen Associates | 103 | 25000 | | 2111 | JCP Inc. | 103 | 50000 | | 2112 | Zetacorp | 108 | 50000 | | 2113 | Ian Schmidt | 104 | 20000 | | 2114 | Orion Corp. | 102 | 20000 | | 2117 | J.P. Sinclair | 102 | 35000 | | 2118 | Midwest Systems | 108 | 60000 | | 2120 | Rico Enterprises | 102 | 50000 | | 2121 | QMA Assoc. | 103 | 45000 | | 2123 | Carter Sons | 102 | 40000 | | 2124 | Peter Brothers | 102 | 40000 | | 2127 | Intercorp | 109 | 60000 | +---------+-------------------+---------+---------------+
V SEMESTRE
PAG. 51
ISC
Tabla PRODUCTOS
+-------+------------+-------------------+--------+-------------+ | Idfab | Idproducto | Descripcion | Precio | Existencias | +-------+------------+-------------------+--------+-------------+ | ACI | 41001 | Artculo Tipo 1 | 55 | 277 | | ACI | 41002 | Artculo Tipo 2 | 76 | 167 | | ACI | 41003 | Artculo Tipo 3 | 107 | 207 | | ACI | 41004 | Artculo Tipo 4 | 117 | 139 | | ACI | 4100X | Ajustador | 25 | 37 | | ACI | 4100Y | Extractor | 2750 | 25 | | ACI | 4100Z | Montador | 2500 | 28 | | BIC | 41003 | Manivela | 652 | 3 | | BIC | 41089 | Retn | 225 | 78 | | BIC | 41672 | Plate | 180 | 0 | | FEA | 112 | Cubierta | 148 | 115 | | FEA | 114 | Bancada Motor | 243 | 15 | | IMM | 773C | Riostra 1/2 Tm | 975 | 28 | | IMM | 775C | Riostra 1-Tm | 1425 | 5 | | IMM | 779C | Riostra 2-Tm | 1875 | 9 | | IMM | 878H | Soporte Riostra | 54 | 223 | | IMM | 887P | Perno Riostra | 250 | 24 | | IMM | 887X | Retenedor Riostra | 475 | 32 | | QSA | XK47 | Reductor | 355 | 38 | | QSA | XK48 | Reductor | 134 | 203 |
V SEMESTRE
PAG. 52
Obtener el nombre de la materia que cursa el alumno con nmero de control 97310211 con crditos igual a ocho.
ISC
Obtener el nmero de control del alumno que tenga alguna calificacin igual a 100
SELECT DISTINC(NControl) FROM Cursa WHERE Calif=100;
Un JOIN de dos tablas es una combinacin entre las mismas basada en la coincidencia exacta(u otro tipo de comparacin) de dos columnas, una de cada tabla. El JOIN forma parejas de filas haciendo coincidir los contenidos de las columnas relacionadas. Ejemplo: Visualizar la informacin de las tablas curso y departamento para que los valores de CDEPT en curso coinciden con los valores de DEPT en departamento;
Select * from curso, departamento where cdept=Dep;
Recordemos que se trata de un producto cartesiano restringido, las tuplas que se emparejan deben cumplir una determinada condicin. En el lgebra relacional slo hemos hablado de composiciones en general. Sin embargo, en SQL se trabaja con varios tipos de composiciones.
V SEMESTRE
PAG. 53
ISC
La coma y JOIN son equivalentes, y las palabras INNER y CROSS son opcionales. La condicin en la clusula ON puede ser cualquier expresin vlida para una clusula WHERE, de hecho, en la mayora de los casos, son equivalentes. La clusula USING nos permite usar una lista de atributos que deben ser iguales en las dos tablas a componer. Siguiendo con el mismo ejemplo, la condicin ms lgica para la composicin interna entre personas2 y telfonos2 es la igualdad entre el identificador de persona en la primera tabla y el atributo persona en la segunda:
V SEMESTRE
PAG. 54
ISC
En cualquier caso, la salida slo contiene las tuplas que emparejan a personas con sus nmeros de telfono. Las tuplas correspondientes a personas que no tienen ningn nmero no aparecen, como por ejemplo las correspondientes a "Tulanita". Para las personas con varios nmeros, se repiten los datos de la persona para cada nmero, por ejemplo con "Fulanito" o "Fusganita". Composicin interna natural Consiste en una proyeccin sobre un producto cartesiano restringido. Es decir, slo elegimos determinadas columnas de ambas tablas, en lugar de seleccionar todas. Podemos hacer esto a partir de una composicin general, eligiendo todas las columnas menos las repetidas:
mysql> SELECT personas2.id,nombre,fecha,numero FROM personas2, telefonos2 WHERE personas2.id=telefonos2.id; +----+-----------+------------+-----------+ | id | nombre | fecha | numero | +----+-----------+------------+-----------+ | 1 | Fulanito | 1956-12-14 | 123456789 | | 1 | Fulanito | 1956-12-14 | 145654854 | | 1 | Fulanito | 1956-12-14 | 152452545 | | 2 | Menganito | 1975-10-15 | 254254254 | | 4 | Fusganita | 1976-08-25 | 456545654 | | 4 | Fusganita | 1976-08-25 | 441415414 |
V SEMESTRE
PAG. 55
Como la columna id existe en ambas tablas estamos obligados a usar el nombre completo para esta columna. En este caso hemos optado por personas2.id, pero hubiese sido igual usar telefonos2.id. Tambin podemos definir alias para las tablas, y conseguir una consulta ms compacta:
ISC
Taller de Base de Datos
Pero tenemos una sintaxis alternativa mucho mejor para hacer composiciones internas naturales: referencia_tabla NATURAL JOIN referencia_tabla Por ejemplo:
mysql> SELECT * FROM personas2 NATURAL JOIN telefonos2; +----+-----------+------------+-----------+ | id | nombre | fecha | numero | +----+-----------+------------+-----------+ | 1 | Fulanito | 1956-12-14 | 123456789 | | 1 | Fulanito | 1956-12-14 | 145654854 | | 1 | Fulanito | 1956-12-14 | 152452545 | | 2 | Menganito | 1975-10-15 | 254254254 | | 4 | Fusganita | 1976-08-25 | 456545654 | | 4 | Fusganita | 1976-08-25 | 441415414 | +----+-----------+------------+-----------+ 6 rows in set (0.02 sec)
V SEMESTRE
PAG. 56
ISC
Taller de Base de Datos
Como norma general se usa un ndice para localizar las tuplas de la segunda tabla que cumplen la condicin, y para cada tupla encontrada se aade una fila a la tabla de salida. Si no existe ninguna tupla en la segunda tabla que cumpla las condiciones, se combina la tupla de la primera con una nula de la segunda. En nuestro ejemplo se tomara la primera tupla de personas2, con un valor de id igual a 1, y se busca en la tabla telefonos2 las tuplas con un valor de id igual a 1. Lo mismo para la segunda tupla, con id igual a 2. En la tercera el id es 3, y no existe ninguna tupla en telefonos2 con un valor de id igual a 3, por lo tanto se combina la tupla de personas2 con una tupla de telefonos2 con todos los atributos igual a NULL. Por ejemplo:
mysql> SELECT * FROM personas2 LEFT JOIN telefonos2 USING(id); +----+-----------+------------+-----------+------+ | id | nombre | fecha | numero | id | +----+-----------+------------+-----------+------+ | 1 | Fulanito | 1956-12-14 | 123456789 | 1 | | 1 | Fulanito | 1956-12-14 | 145654854 | 1 | | 1 | Fulanito | 1956-12-14 | 152452545 | 1 | | 2 | Menganito | 1975-10-15 | 254254254 | 2 | | 3 | Tulanita | 1985-03-17 | NULL | NULL | (1) | 4 | Fusganita | 1976-08-25 | 456545654 | 4 | | 4 | Fusganita | 1976-08-25 | 441415414 | 4 | +----+-----------+------------+-----------+------+ 7 rows in set (0.05 sec)
La quinta fila (1), tiene valores NULL para numero e id de telefonos2, ya que no existen tuplas en esa tabla con un valor de id igual a 3. Las sintaxis para composiciones externas son: referencia_tabla LEFT [OUTER] JOIN referencia_tabla [join_condition] referencia_tabla NATURAL LEFT [OUTER] JOIN referencia_tabla Compilado por L.I. JHR V SEMESTRE PAG. 57
ISC
Taller de Base de Datos
La palabra OUTER es opcional. Existen dos grupos de composiciones externas: izquierda y derecha, dependiendo de cual de las tablas se lea en primer lugar.
Composicin externa izquierda En estas composiciones se recorre la tabla de la izquierda y se buscan tuplas en la de la derecha. Se crean usando la palabra LEFT (izquierda, en ingls). Las sintaxis para la composicin externa izquierda es: referencia_tabla LEFT [OUTER] JOIN referencia_tabla [condicin] Veamos un ejemplo. Para empezar, crearemos un par de tablas:
mysql> CREATE TABLE tabla1 (id INT NOT NULL, nombre CHAR(10),PRIMARY KEY (id)); Query OK, 0 rows affected (0.42 sec) mysql> CREATE TABLE tabla2 (id INT NOT NULL, numero INT, PRIMARY KEY(id)); Query OK, 0 rows affected (0.11 sec)
V SEMESTRE
PAG. 58
ISC
Taller de Base de Datos
Se puede ver que aparecen dos filas con valores NULL, para los id 7 y 8. En contraposicin, una composicin interna dar esta salida:
mysql> SELECT * FROM tabla1 JOIN tabla2 USING(id); +----+--------+----+--------+ | id | nombre | id | numero | +----+--------+----+--------+ | 5 | Juan | 5 | 50 | | 6 | Pedro | 6 | 60 | +----+--------+----+--------+ 2 rows in set (0.06 sec)
Composicin externa derecha En este caso se recorre la tabla de la derecha y se buscan tuplas que cumplan la condicin en la tabla izquierda. La sintaxis es equivalente: referencia_tabla LEFT [OUTER] JOIN referencia_tabla [condicin] Usando las mismas tablas que en el ejemplo anterior:
mysql> SELECT * FROM tabla1 RIGHT JOIN tabla2 USING(id); +------+--------+----+--------+ | id | nombre | id | numero | +------+--------+----+--------+ | NULL | NULL | 3 | 30 | | NULL | NULL | 4 | 40 | | 5 | Juan | 5 | 50 | | 6 | Pedro | 6 | 60 | +------+--------+----+--------+ 4 rows in set (0.00 sec)
V SEMESTRE
PAG. 59
ISC
Taller de Base de Datos
Por supuesto, tambin podemos hacer composiciones externas naturales: referencia_tabla NATURAL LEFT [OUTER] JOIN referencia_tabla referencia_tabla NATURAL RIGHT [OUTER] JOIN referencia_tabla El problema es que si existen tuplas aadidas con respecto a la composicin interna, no se eliminar ninguna columna. Los mismos ejemplos anteriores, como composiciones naturales externas seran:
mysql> SELECT * FROM tabla1 NATURAL LEFT JOIN tabla2; +----+----------+------+--------+ | id | nombre | id | numero | +----+----------+------+--------+ | 5 | Juan | 5 | 50 | | 6 | Pedro | 6 | 60 | | 7 | Jos | NULL | NULL | | 8 | Fernando | NULL | NULL | +----+----------+------+--------+ 4 rows in set (0.00 sec) mysql> SELECT * FROM tabla1 NATURAL RIGHT JOIN tabla2; +------+--------+----+--------+ | id | nombre | id | numero | +------+--------+----+--------+ | NULL | NULL | 3 | 30 | | NULL | NULL | 4 | 40 | | 5 | Juan | 5 | 50 | | 6 | Pedro | 6 | 60 | +------+--------+----+--------+ 4 rows in set (0.00 sec)
Tambin es posible realizar la operacin de lgebra relacional unin entre varias tablas o proyecciones de tablas. Para hacerlo se usa la sentencia UNION que permite combinar varias sentencias SELECT para crear una nica tabla de salida.
V SEMESTRE
PAG. 60
ISC
Taller de Base de Datos
mysql> CREATE TABLE stock2 ( -> id INT NOT NULL, -> nombre VARCHAR(40), -> cantidad SMALLINT, -> PRIMARY KEY (id)); Query OK, 0 rows affected (0.16 sec) mysql> CREATE TABLE stock3 ( -> id INT NOT NULL, -> nombre VARCHAR(35), -> numero MEDIUMINT, -> PRIMARY KEY (id)); Query OK, 0 rows affected (0.08 sec) mysql> INSERT INTO stock1 VALUES -> (1, "tornillo M3x12", 100), -> (2, "tornillo M3x15", 120), -> (3, "tornillo M4x25", 120), -> (4, "tornillo M5x30", 200); Query OK, 4 rows affected (0.03 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> INSERT INTO stock2 VALUES -> (10, "tuerca M4", 120), -> (11, "tuerca M3", 100), -> (12, "tuerca M5", 87); Query OK, 3 rows affected (0.05 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> INSERT INTO stock3 VALUES -> (20, "varilla 10", 23), -> (1, "tornillo M3x12", 22), -> (21, "varilla 12", 32), -> (11, "tuerca M3", 22); Query OK, 4 rows affected (0.03 sec) Records: 4 Duplicates: 0 Warnings: 0
Podemos crear una unin de las tres tablas, a pesar de que los nombres y tamaos de algunas columnas sean diferentes:
V SEMESTRE
PAG. 61
ISC
Taller de Base de Datos
El resultado se puede ordenar usando ORDER BY y tambin podemos seleccionar un nmero limitado de filas mediante LIMIT:
mysql> (SELECT * FROM stock1) UNION -> (SELECT * FROM stock2) UNION -> (SELECT * FROM stock3) ORDER BY id LIMIT 6; +----+----------------+----------+ | id | nombre | cantidad | +----+----------------+----------+ | 1 | tornillo M3x12 | 100 | | 1 | tornillo M3x12 | 22 | | 2 | tornillo M3x15 | 120 | | 3 | tornillo M4x25 | 120 | | 4 | tornillo M5x30 | 200 | | 10 | tuerca M4 | 120 | +----+----------------+----------+ 6 rows in set (0.00 sec)
Con ALL se muestran todas las filas, aunque estn repetidas, con DISTINCT slo se muestra una copia de cada fila:
mysql> SELECT id,nombre FROM stock1 UNION -> SELECT id,nombre FROM stock2 UNION -> SELECT id,nombre FROM stock3; +----+----------------+ | id | nombre | +----+----------------+ | 1 | tornillo M3x12 | | 2 | tornillo M3x15 | | 3 | tornillo M4x25 | | 4 | tornillo M5x30 | | 10 | tuerca M4 |
V SEMESTRE
PAG. 62
ISC
3.4 Agregacin GROUP BY, HAVING. GROUP BY Permite combinar en un nico registro los registros con valores idnticos en la lista de campos especificada Es posible agrupar filas en la salida de una sentencia SELECT segn los distintos valores de una columna, usando la clusula GROUP BY. Esto, en principio, puede parecer redundante, ya que podamos hacer lo mismo usando la opcin DISTINCT. Sin embargo, la clusula GROUP BY es ms potente:
mysql> SELECT fecha FROM gente GROUP BY fecha; +------------+ | fecha | +------------+ | 1978-06-15 | | 1985-04-12 | | 1993-02-10 | | 2001-12-02 | +------------+ 4 rows in set (0.00 sec)
V SEMESTRE
PAG. 63
ISC
Taller de Base de Datos
Pero la diferencia principal es que el uso de la clusula GROUP BY permite usar funciones de resumen o reunin. Por ejemplo, la funcin COUNT(), que sirve para contar las filas de cada grupo:
mysql> SELECT fecha, COUNT(*) AS cuenta FROM gente GROUP BY fecha; +------------+--------+ | fecha | cuenta | +------------+--------+ | 1978-06-15 | 2 | | 1985-04-12 | 2 | | 1993-02-10 | 1 | | 2001-12-02 | 1 | +------------+--------+ 4 rows in set (0.00 sec)
HAVING Es similar al where. La clusula where determina que registros se seleccionan. De forma parecida, una vez que los registros se agrupan con la clusula group by, la clusula having determina que registros se van a mostrar. Utilice la clusula where para eliminar registros que no desea que se agrupen mediante la clusula group by. La clusula HAVING permite hacer selecciones en situaciones en las que no es posible usar WHERE. Veamos un ejemplo completo:
V SEMESTRE
PAG. 64
mysql> CREATE TABLE muestras ( -> ciudad VARCHAR(40), -> fecha DATE, -> temperatura TINYINT); Query OK, 0 rows affected (0.25 sec) mysql> mysql> INSERT INTO muestras (ciudad,fecha,temperatura) VALUES -> ('Madrid', '2005-03-17', 23), -> ('Pars', '2005-03-17', 16), -> ('Berln', '2005-03-17', 15), -> ('Madrid', '2005-03-18', 25), -> ('Madrid', '2005-03-19', 24), -> ('Berln', '2005-03-19', 18); Query OK, 6 rows affected (0.03 sec) Records: 6 Duplicates: 0 Warnings: 0 mysql> SELECT ciudad, MAX(temperatura) FROM muestras -> GROUP BY ciudad HAVING MAX(temperatura)>16; +--------+------------------+ | ciudad | MAX(temperatura) | +--------+------------------+ | Berln | 18 | | Madrid | 25 | +--------+------------------+ 2 rows in set (0.00 sec)
ISC
Ejemplos: Obtener el nmero de alumnos que existen en la carrera de Ingeniera en Sistemas Computacionales.
SELECT Count (*) FROM Alumno WHERE especialidad=ISC;
V SEMESTRE
PAG. 65
ISC
ACTIVIDADES DE APRENDIZAJE
Conocer y aplicar comandos para realizar consultas bsicas y de mltiples tablas. Consultar y manipular bases de datos ya existentes. Insertar, actualizar y borrar datos individuales y en conjunto. Desarrollar ejercicios de consulta, manipulacin y agregacin de datos utilizando el DBMS.
EVALUACION
60 % 10 % 30 % 100 %
V SEMESTRE
PAG. 66
OTROS RECURSOS
ISC
V SEMESTRE
PAG. 67
Objetivo Educacional: Aplicar las propiedades de las transacciones y analizar como afectan a las aplicaciones.
ISC
Taller de Base de Datos
4.1 Propiedades de la transaccin. Qu es una transaccin? Secuencia de operaciones que se ejecutan completamente o bien no se realizan. o No puede quedarse en un estado intermedio. o Ej: una transferencia entre dos cuentas no puede quedarse en un estado intermedio: O se deja el dinero en la primera cuenta o en la segunda, pero no se puede sacar el dinero de la primera cuenta, que falle algo en ese momento y no entregarlo en la segunda. Es una secuencia de una o varias instrucciones de SQL que forman conjuntamente una unidad lgica de trabajo Cuando una transaccin finaliza con xito, se graba (COMMIT). Si fracasa, se restaura el estado anterior (ROLLBACK)
Propiedades de una transaccin: o Atomicidad: Se realizan o todas las instrucciones o ninguna. o Correccin (Preservacin consistencia): La transaccin siempre deja la BD en un estado consistente (Si no lo hace puede ser por errores lgicos o fsicos) Y adems: o Aislamiento: Los efectos de una transaccin no se ven en el exterior hasta que esta finaliza. o Persistencia: Una vez finalizada la transaccin los efectos perduran en la BD.
V SEMESTRE
PAG. 68
ISC
V SEMESTRE
PAG. 69
ISC
Taller de Base de Datos
mysql> SELECT * FROM innotest; +-------+ | campo | +-------+ | 1 | | 2 | | 3 | | 4 | +-------+ 4 rows in set (0.00 sec)
Si en este momento ejecutamos un ROLLBACK, la transaccin no ser completada, y los cambios realizados sobre la tabla no tendrn efecto.
mysql> ROLLBACK; Query OK, 0 rows affected (0.06 sec) mysql> SELECT * FROM innotest; +-------+ | campo | +-------+ | 1 | | 2 | | 3 | +-------+ 3 rows in set (0.00 sec)
4.3 Niveles de aislamiento. El Nivel de Aislacin (Isolation Level) tiene que ver con serializabilidad. A veces serializabilidad estricta puede ser demasiado exigente Violaciones de Serializabilidad permitidos: Lectura Sucia: Transaccin T1 realiza una actualizacin de una tupla. T2 lee la tupla actualizada pero poco despues T1 termina con un Rollback (Abort). T2 ha visto informacin que no existe. Lectura no repetible: Transaccin T1 lee una tupla. T2 actualiza la misma tupla.T1 vuelve a leer la tupla ahora con diferente valor Compilado por L.I. JHR V SEMESTRE PAG. 70
ISC
Taller de Base de Datos
4.4 Instrucciones COMMIT y ROLLBACK . SQL acoge las transacciones de base de datos mediante dos instrucciones de procesamiento de transacciones de SQL: COMMIT: La instruccin COMMIT seala la conclusin con xito de una transaccin. Indica al SGBD que la transaccin se ha completado; se han ejecutado todas las instrucciones que conforman la transaccin, y la base de datos es autoconsistente. ROLLBACK: La instruccin ROLLBACK seala el fracaso de una transaccin. Indica al SGBD que el usuario no desea completar la transaccin; en lugar de ello, el SGBD debe volverse atrs de las modificaciones realizadas en las BD durante la transaccin. En efecto, el SGBD devuelve la base de datos a su estado previo al comienzo de la transaccin. Tres operaciones fundamentales: begin: define el inicio de una unidad de trabajo indivisible (puede ser implcito al ejecutar una operacin de categora transaction-initiating) commit: marca el trmino normal de la transaccin, todos los cambios deben quedar reflejados en forma definitiva en la BD y se liberan todos los locks (si los hubieran) rollback: marca una situacin anormal que hace necesario deshacer el camino recorrido ya sea desde el inicio o desde un punto definido anteriormente (Savepoint) dependiendo de esto se liberar todos los locks o solamente aquellos tomados desde el savepoint en cuestin
Ejemplo: mysql> CREATE TABLE t (name CHAR(20), UNIQUE (name)) TYPE = INNODB;
V SEMESTRE
PAG. 71
ISC
V SEMESTRE
PAG. 72
ISC
Taller de Base de Datos
ROLLBACK TO A; SELECT last_name FROM student WHERE last_na me = 'Tashi'; COMMIT; END;
Panormica de InnoDB
InnoDB dota a MySQL de un motor de almacenamiento transaccional (conforme a ACID) con capacidades de commit (confirmacin), rollback (cancelacin) y recuperacin de fallas. InnoDB realiza bloqueos a nivel de fila y tambin proporciona funciones de lectura consistente sin bloqueo al estilo Oracle en sentencias SELECT. Estas caractersticas incrementan el rendimiento y la capacidad de gestionar mltiples usuarios simultneos. No se necesita un bloqueo escalado en InnoDB porque los bloqueos a nivel de fila ocu pan muy poco espacio. InnoDB tambin soporta restricciones FOREIGN KEY. En consultas SQL, an dentro de la misma consulta, pueden incluirse libremente tablas del tipo InnoDB con tablas de otros tipos. InnoDB se dise para obtener el mximo rendimiento al procesar grandes volmenes de datos. Probablemente ningn otro motor de bases de datos relacionales en disco iguale su eficiencia en el uso de CPU. A pesar de estar totalmente integrado con el servidor MySQL, el motor de almacenamiento InnoDB mantiene su propio pool de almacenamiento intermedio para tener un cache de datos e ndices en la memoria principal. InnoDB almacena sus tablas e ndices en un espacio de tablas, el cual puede consistir de varios ficheros (o particiones disco). Esto difiere de, por e jemplo, el motor MyISAM, donde cada tabla se almacena empleando ficheros separados. Las tablas InnoDB pueden ser de cualquier tamao, an en sistemas operativos donde el tamao de los ficheros se limita a 2GB.
V SEMESTRE
PAG. 73
ISC
Taller de Base de Datos
InnoDB se utiliza en muchos grandes sitios de bases de datos que necesitan alto rendimiento. El famoso sitio de noticias de Internet Slashdot.org corre sobre InnoDB. Mytrix, Inc. almacena ms de 1TB de datos en InnoDB, y otros sitios manejan una carga promedio de 800 inserciones y actualizaciones por segundo en InnoDB.
InnoDB se publica bajo la misma licencia GNU GPL Versin 2 (de Junio de 1991) que MySQL. Para ms informacin sobre el licenciamiento de MySQL, consulte http://www.mysql.com/company/legal/licensing/.
Ejemplo:
mysql> create database x; Query OK, 1 row affected (0.20 sec) mysql> use x Database changed mysql> create table transac (clave int primary key, nombre varchar (20)) type= i nnodb; Query OK, 0 rows affected, 1 warning (0.38 sec) mysql> select * from transac; Empty set (0.00 sec) mysql> insert into transac values(4, "compas"), (2,"lapiz"); Query OK, 2 rows affected (0.08 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> select * from transac; +-------+--------+ | clave | nombre | +-------+--------+ | 2 | lapiz | | 4 | compas | +-------+--------+ 2 rows in set (0.00 sec)
V SEMESTRE
PAG. 74
ISC
Taller de Base de Datos
mysql> select * from transac; +-------+--------+ | clave | nombre | +-------+--------+ | 4 | compas | +-------+--------+ 1 row in set (0.00 sec) mysql> rollback; Query OK, 0 rows affected (0.06 sec) mysql> select * from transac; +-------+--------+ | clave | nombre | +-------+--------+ | 2 | lapiz | | 4 | compas | +-------+--------+ 2 rows in set (0.00 sec) mysql> commit; Query OK, 0 rows affected (0.00 sec) mysql> select * from transac; +-------+--------+ | clave | nombre | +-------+--------+ | 2 | lapiz | | 4 | compas | +-------+--------+ 2 rows in set (0.00 sec) mysql> delete from transac where clave=2; Query OK, 1 row affected (0.03 sec) mysql> select * from transac; +-------+--------+ | clave | nombre | +-------+--------+ | 4 | compas | +-------+--------+ 1 row in set (0.00 sec) mysql> rollback; Query OK, 0 rows affected (0.00 sec)
V SEMESTRE
PAG. 75
mysql> select * from transac; +-------+--------+ | clave | nombre | +-------+--------+ | 4 | compas | +-------+--------+ 1 row in set (0.00 sec) mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> insert into transac values(6, "ooooo"), (2,"lapiz"); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> savepoint a; Query OK, 0 rows affected (0.00 sec) mysql> delete from transac where clave=4; Query OK, 1 row affected (0.02 sec)
ISC
Taller de Base de Datos
mysql> savepoint b; Query OK, 0 rows affected (0.00 sec) mysql> update transac set nombre='rrrrr'where clave=2; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from transac; +-------+--------+ | clave | nombre | +-------+--------+ | 2 | rrrrr | | 6 | ooooo | +-------+--------+ 2 rows in set (0.00 sec) mysql> rollback to a; Query OK, 0 rows affected (0.00 sec) mysql> select * from transac; +-------+--------+ | clave | nombre | +-------+--------+ | 2 | lapiz | | 4 | compas | | 6 | ooooo | +-------+--------+ 3 rows in set (0.00 sec)
V SEMESTRE
PAG. 76
ISC
Taller de Base de Datos
Aplicar el concepto de transaccin. Realizar ejercicios donde utilice los diferentes grados de consistencia y niveles de aislamiento. Realizar prcticas donde se evale como afecta al desempeo el nivel de aislamiento de la transaccin. Realizar prcticas donde se observe la recuperacin de las diferentes fallas de una transaccin. Realizar prcticas donde se presenten deadlocks.
EVALUACION
60 % 10 % 30 % 100 %
V SEMESTRE
PAG. 77