Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Taller de Bases de Datos PDF
Taller de Bases de Datos PDF
DOCENTE
L.I. JOSE HERNANDEZ
RODRIGUEZ
INSTITUTO TECNOLOGICO SUPERIOR DE ACAYUCAN
Temario
1 Introducción al Sistema Manejador de Base de Datos (DBMS)
1.1 Conceptos.
1.2 Características del DBMS
3.3.1 Subconsultas.
3.3.2 Operadores JOIN.
3.4 Agregación GROUP BY, HAVING.
3.5 Funciones de conjunto de registros COUNT, SUM, AVG, MAX, MIN
4 Control de Transacciones.
4.1 Propiedades de la transacción.
4.2 Grados de consistencia.
4.3 Niveles de aislamiento.
4.4 Instrucciones COMMIT y ROLLBACK.
5 Vistas
5.1 Definición y objetivo de las vistas.
5.2 Instrucciones para la administración de vistas.
6 Seguridad.
6.1 Esquemas de autorización.
6.2 Instrucciones GRANT y REVOKE.
UNIDAD UNO
Introducción al Sistema Manejador de Base de Datos (DBMS)
1.1 Conceptos
ISC
El lenguaje de definición de datos (DDL) es utilizado para describir todas las
estructuras de información y los programas que se usan para construir, actualizar e
introducir la información que contiene una base de datos.
Los sistemas de base de datos se diseñan para gestionar grandes cantidades de información. La
gestión de datos implica tanto la definición de estructuras para almacenar la información como
la provisión de mecanismos para la manipulación de la información. Además, deben
proporcionar la fiabilidad de la información almacenada, a pesar de las caídas del sistema o
intentos de acceso sin autorización.
Los sistemas de bases de datos se aplican en: La banca, líneas aéreas, universidades,
Transacciones de tarjetas de crédito, telecomunicaciones, finanzas, ventas, producción y recursos
humanos.
ISC
Un SGBD debe proporcionar un mecanismo que garantice que sólo los usuarios
autorizados pueden acceder a la base de datos. La protección debe ser contra accesos
no autorizados, tanto intencionados como accidentales.
Un 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
ISC
los datos almacenados. Se puede considerar como otro modo de proteger la base de
datos, pero además 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.
ACTIVIDADES DE APRENDIZAJE
Instalar el DBMS
EVALUACION
Examen 40 %
Taller de Base de Datos
Participación 20 %
Investigación 20 %
Trabajo equipo e-r 10 % (En rotafolios)
Ejercicios de Repaso 10 %
100 %
OTROS RECURSOS
Recurso uno:
Cuadro Comparativo de algunos DBMS.
Ver anexos
Tipos de datos en Mysql
ISC
Recurso Dos:
Instalación de AppServ
Que es AppServ?
Es un software que permite la instalación en nuestro entorno Windows, de los siguientes paquetes:
Taller de Base de Datos
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 próxima versión de AppServ.
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)
4) En este punto debemos elegir los componentes que vamos a instalar, como ves aparecen marcados los cuatro elementos
disponibles (apache, mysql, php, phpmyadmin) si bien puedes desmarcar alguno, es mejor instalar tod os para tener completo
tu equipo de testeo y desarrollo Web, le damos siguiente (Next)
ISC
Taller de Base de Datos
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
6) Configuración MySQL, en este punto debemos prestar atención, ya que debemos indicar el Password, para el usuario
principal de la base de datos, lo escribimos 2 veces !! Activamos Enable Innodb, ya que de lo contrario no podemos utilizar e ste
tipo de tablas que serán de uso en este semestre.
ISC
Taller de Base de Datos
Por tanto el usuario será root, que es por y tu Contraseña 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 instalación, 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.
En este punto si vas a tu navegador, puedes poner, http://localhost y debe mostrarse tal como muestra la imagen. Salvo las
versiones que el tuyo puede ser mas nuevo.
ISC
Taller de Base de Datos
En la configuración Standard usando c:\AppServ la ubicación 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();
?>
http://localhost/pruebas/test.php
Recurso Tres:
Lista de Ejercicios
ISC
Taller de Base de Datos
UNIDAD DOS
Lenguaje de Definición de Datos (DDL)
Para mostrar las bases de datos existentes en nuestro sistema se usa la sentencia SHOW
DATABASES
Para seleccionar una base de datos se usa el comando USE, que no es exactamente una
sentencia SQL, sino más bien de una opción de MySQL
mysql > USE prueba ;
Da tabase changed
mysql >
Podemos consultar cuántas tablas y qué nombres tienen en una base de datos, usando la
sentencia SHOW TABLES
Taller de Base de Datos
Valores nulos: Al definir cada columna podemos decidir si podrá o no contener valores nulos.
La opción 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 también se puede definir, opcionalmente, un valor por
defecto. El valor por defecto se asignará de forma automática a una columna cuando no se
especifique un valor determinado al añadir 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.
Por ejemplo, si queremos que el valor por defecto para población sea 5000, podemos crear la
tabla como:
mysql >CREATE TABLE ciudad2(nombre CHAR(20) NOT NULL, pobla cion INT NULL DEFAULT 5000);
Query OK, 0 rows affected (0.09 sec)
Claves primaria: También se puede definir una clave primaria sobre una columna, usando la
palabra clave KEY o PRIMARY KEY.
Sólo 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 explícita, MySQL
ISC
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)
Taller de Base de Datos
Usar NOT NULL PRIMARY KEY equivale a PRIMARY KEY, NOT NULL KEY o sencillamente KEY.
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 automáticamente, tomando el valor más alto de esa
columna y sumándole 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 combinación 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)
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;
Además de los comandos: Create database, use, create table, show database y show tables,
también son DLL’s: ALTER TABLE y DROP
Alter table
Alter table clientes change apaterno apaterno Cambia el tipo de dato o nombre de la
varchar(50); columna
Alter table clientes add index (apellido_paterno) Pone como columna indexada a
apellido_paterno
Alter table Clientes add primary key (id_clientes)
Hace de id_clientes la llave primaria
Drop
Taller de Base de Datos
Alter table clients drop Primary Key Borra una clave primaria (en una tabla solo
existe una llave primaria por eso no se
pone el nombre de la columna)
2.2.1 Integridad.
DEFINICION: Se refiere a la corrección 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
Pueden añadirse datos no válidos 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 añade un
pedido de un producto sin ajustar la cantidad disponible para vender.
Varios tipos diferentes de restricciones de integridad de datos suelen encontrarse en las bases
de datos relaciónales, incluyendo:
Datos requeridos: Algunas columnas en una base de datos deben contener un valor de
dato válido 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 restricción de valores únicos.
Las restricciones de integridad de entidad aseguran que la clave primaria identifique
unívocamente a cada entidad representada en la base de datos.
Integridad referencial: Una clave secundaria (externa o foránea) en una base de datos
relacional enlaza cada fila de la tabla hijo que contiene la clave foránea con la fila de la tabla
padre que contiene el valor de clave primaria correspondiente. El DBMS pu ede ser preparado
para forzar esta restricción de clave foránea/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 cómo manejar la supresión de filas que son referenciadas mediante otras filas.
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 inserción de una nueva fila hijo: Cuando se inserta una nueva fila en la tabla hijo,
su valor de clave foránea debe coincidir con uno de los valores de clave primaria en la
tabla padre. Si el valor de clave foránea no coincide con ninguna clave primaria, la
inserción de la fila corromperá la base de datos, ya que habrá un hijo sin un padre (un
huérfano). Observe que insertar una fila en la tabla padre nunca representa un
problema; simplemente se convierte en un padre sin hijos.
2. La actualización de la clave foránea en una fila hijo: Esta es una forma diferente del
problema anterior. Si la clave foránea 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á huérfana.
3. La supresión de una fila padre: Si una fila de la tabla padre, que tiene uno o más hijos
se suprime, las filas hijo quedarán huérfanas. Los valores de clave f oránea en estas filas
ya no se corresponderán con ningún 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 después de la supresión.
4. La actualización 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 quedarán huérfanos, puesto que sus claves forá neas
ya no corresponden con ningún valor de clave primaria.
InnoDB no crea de manera automática índices en las claves foráneas o en las claves
referenciadas, así que debemos crearlos de manera explícita. Los índices son necesarios para
que la verificación de las claves foráneas sea más rápida. A continuación se muestra como
definir las dos tablas de ejemplo con una clave foránea.
Por ejemplo, la creación de la clave foránea en la tabla venta que se mostró anteriormente pudo
haberse hecho de la siguiente manera con el uso de una sentencia ALTER TABLE:
INDEX (id_cliente)
) TYPE = INNODB;
Una vez que hemos creado las tablas, vamos a insertar algunos datos que nos sirvan para
demostrar algunos conceptos importantes:
En este momento no hay ningún 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:
El hecho es que MySQL no nos permite insertar este registro, ya que el cliente cuyo id_cliente es
3 no existe. La restricción de clave foránea asegura que nuestros datos mantienen su
integridad. Sin embargo, ¿qué sucede cuando eliminamos algún 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)
Debido a nuestra restricción de clave foránea, 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
mantiene la integridad de nuestros datos. Sin embargo existe una forma en la cuál podríamos
hacer que la sentencia DELETE se ejecute de cualquier manera, y la veremos brevemente, pero
primero necesitamos saber cómo eliminar (quitar) una clave foránea.
No podemos sólo eliminar una restricción de clave foránea como si fuera un índice ordinario.
Veamos que sucede cuando lo intentamos.
ISC
Para eliminar la clave foránea se tiene que especificar el ID que ha sido generado y asignado
internamente por MySQL a la clave foránea. En este caso, se puede usar la sentencia SHOW
CREATE TABLE para determinar dicho ID.
En nuestro ejemplo, la restricción tiene el ID 0_22 (es muy probable que este valor sea
diferente en cada caso).
Con las restricciones de clave foránea podemos eliminar un registro de la tabla cliente y a la vez
eliminar un registro de la tabla venta usando sólo una sentencia DELETE. Esto es llamado
eliminación en cascada, en donde todos los registros relacionados son eliminados de acuerdo a
las relaciones de clave foránea. Una alternativa es no eliminar los registros relacionados, y
poner el valor de la clave foránea a NULL (asumiendo que el campo puede tener un valor nulo).
En nuestro caso, no podemos poner el valor de nuestra clave foránea id_cliente en la tabla
venta, ya que se ha definido como NOT NULL. Las opciones estándar cuando se elimina un
registro con clave foránea son:
ON DELETE RESTRICT
ON DELETE NO ACTION
ON DELETE SET DEFAULT
ON DELETE CASCADE
ON DELETE SET NULL
ISC
ON DELETE SET DEFAULT actualmente no funciona en MySQL - se supone que pone el valor de
la clave foránea al valor por omisión (DEFAULT) que se definió al momento de crear la tabla.
Si se especifica ON DELETE SET NULL, las filas en la tabla hijo son actualizadas
automáticamente poniendo en las columnas de la clave foránea el valor NULL. Si se especifica
una acción SET NULL, debemos asegurarnos de no declarar las columnas en la tabla como NOT
NULL.
Vamos a ver como están nuestros registros antes de ejecutar la sentencia DELETE:
ON UPDATE CASCADE
ON UPDATE SET NULL
ON UPDATE RESTRICT
Vamos a ver un ejemplo, pero antes que nada, tenemos que eliminar la restricción de clave
foránea (debemos usar el ID específico de nuestra tabla).
Ahora está lista la clave foránea para una actualización en cascada. Este es el ejemplo:
+------------+------------+----------+
| id_factura | id_cliente | cantidad |
+------------+------------+----------+
| 1 | 1 | 23 |
| 3 | 2 | 81 |
+------------+------------+----------+
2 rows in set (0.00 sec)
Un ejemplo más
Queda como ejercicio al lector verificar que a partir de este diagrama se genera un código SQL
similar al mostrado a continuación, que nos sirve para la creación de las tablas con sus
correspondientes definiciones de claves foráneas:
Un índice de base de datos se crea para una columna o grupo de columnas. La figura siguiente
muestra un índice (XCNOMBRE) basado en la columna CNOMBRE de la tabla CURSO.
Observemos que el índice, a diferencia de la tabla CURSO, representa valores CNOMBRE en
orden. Además, el índice es pequeño en relación con el tamaño de la tabla. Por lo tanto, es,
probablemente, más fácil que el sistema busque el índice para localizar un registro con un valor
CNOMBRE dado, a que explore toda la tabla en busca de ese valor. Por ejemplo, el índice
XCNOMBRE podría ser muy útil al sistema cuando ejecute la siguiente sentencia SELECT.
T33 HEDONISMO
RACIONALISMO
DESVENTAJAS: P22
Taller de Base de Datos
P44 SOLIPSISMO
El primero corresponde a las claves primarias, que como vimos, también se pueden crear en la
parte de definición de columnas.
mysql > CREATE TABLE ciudad4 (nombre CHAR(20) NOT NULL, pobla cion INT NULL DEFAULT 5000, PRIMARY KEY (nombre));
Pero esta forma tiene más opciones, por ejemplo, entre los paréntesis 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)) ;
O su equivalente:
mysql > CREATE TABLE mi tabla 3(id INT, nombre CHAR(19), KEY (nombre));
mysql > CREATE TABLE mi tabla 4(id INT, nombre CHAR(19), INDEX (nombre(4)));
Este ejemplo usará sólo los cuatro primeros caracteres de la columna 'nombre' para crear el
índice.
ISC
El tercero permite definir índices con claves únicas, también sobre una columna, sobre varias o
sobre partes de columnas. Para definir índices con claves únicas se usa la opción UNIQUE.
La diferencia entre un índice único y uno normal es que en los únicos no se permite la inserción
de filas con claves repetidas. La excepción 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
Taller de Base de Datos
tomar valores NULL. Tanto los índices normales como los de claves únicas sí pueden tomar
valores NULL.
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));
Recurso Cuatro:
Tipos de datos en Mysql
Al diseñar nuestras tablas tenemos que especificar el tipo de datos y tamaño que podrá
almacenar cada campo. Básicamente mysql admite dos tipos de datos: números y cadenas de
caracteres. Junto a estos dos grandes grupos, se admiten otros tipos de datos especiales:
formatos de fecha, etc.
ISC
Datos Numéricos: En este tipo de campos solo pueden almacenarse números, positivos o
negativos, enteros o decimales, en notación hexadecimal, científica o decimal.
Los tipos numéricos 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 numéricos pueden además usar el atributo ZEROFILL en cuyo caso los números se
completaran hasta la máxima anchura disponible con ceros (column age INT(5) zerofill =>
Taller de Base de Datos
TINYINT es un número entero con rango de valores válidos desde -128 a 127. Si se configura
como unsigned (sin signo), el rango de valores es de 0 a 255
SMALLINT, para números enteros, con rango desde -32768 a 32767. Si se configura como
unsigned, 0 a 65535.
FLOAT (m,d) representa números decimales. Podemos especificar cuantos dígitos (m) pueden
utilizarse (término también conocido como ancho de pantalla), y cuantos en la parte decimal
(d). Mysql redondeará el decimal para ajustarse a la capacidad.
DOUBLE Número de coma flotante de precisión doble. Es un tipo de datos igual al anterior cuya
única diferencia es el rango numérico que abarca
Caracteres O Cadenas
CHAR Este tipo se utiliza para almacenar cadenas de longitud fija. Su longitud abarca desde 1 a
ISC
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
máximo de longitud que le hallamos asignado, aunque el tamaño del dato sea menor
(añadiendo espacios adicionales que sean precisos). Mientras que VARCHAR solo almacena la
longitud del dato, permitiendo que el tamaño de la base de datos sea menor. Eso si, el acceso a
los datos CHAR es más rápido que VARCHAR.
No pueden alternarse columnas CHAR y VARCHAR en la misma tabla. Mysql cambiará las
Taller de Base de Datos
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 mayúsculas y
minúsculas, y BLOB si distingue.
Varios
DATE para almacenar fechas. El formato por defecto es YYYY MM DD desde 0000 00 00 a 9999
12 31.
DATETIME Combinación de fecha y hora. El rango de valores va desde el 1 de enero del 1001 a
las 0 horas, 0 minutos y 0 segundos al 31 de diciembre del 9999 a las 23 horas, 59 minutos y 59
segundos. El formato de almacenamiento es de año-mes-dia horas:minutos:segundos
TIME almacena una hora. El rango de horas va desde -838 horas, 59 minutos y 59 segundos a
838, 59 minutos y 59 segundos. El formato de almacenamiento es de 'HH:MM:SS'
YEAR almacena un año. El rango de valores permitidos va desde el año 1901 al año 2155. El
ISC
campo puede tener tamaño dos o tamaño 4 dependiendo de si queremos almacenar el año con
dos o cuatro dígitos.
SET un campo que puede contener ninguno, uno ó varios valores de una lista. La lista puede
tener un máximo de 64 valores.
ENUM es igual que SET, pero solo se puede almacenar uno de los valores de la lista
Taller de Base de Datos
Recurso Cinco:
Ejercicios de práctica
Realizar la siguiente base de datos llamada BIBLIOTECA
UNIDAD TRES
Consultas y Lenguaje de Manipulación de Datos (DML)
DELETE.
o Insert
La forma más directa de insertar una fila nueva en una tabla es mediante una sentencia
INSERT. En la forma más simple de esta sentencia debemos indicar la tabla a la que queremos
añadir filas, y los valores de cada columna. Las columnas de tipo cadena o fechas deben estar
entre comillas sencillas o dobles, para las columnas numéricas esto no es imprescindible,
Taller de Base de Datos
Otra opción consiste en indicar una lista de columnas para las que se van a suministrar
ISC
valores. A las columnas que no se nombren en esa lista se les asigna el valor por defecto. Este
sistema, además, 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,
'París'), (3500000, 'Berlín');
Query OK, 3 rows affected (0.05 sec)
Records: 3 Duplicates: 0 Warnings: 0
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)
Una vez más, a las columnas para las que no indiquemos valores se les asignarán sus
valores por defecto. También podemos hacer esto usando el valor DEFAULT.
Para las sintaxis que lo permiten, podemos observar que cuando se inserta más de una
fila en una única sentencia, obtenemos un mensaje desde MySQL que indica el número de filas
afectadas, el número de filas duplicadas y el número de avisos. Para que una fila se considere
duplicada debe tener el mismo valor que una fila existente para una clave principal o para una
clave única. En tablas en las que no exista clave primaria ni índices de clave única no tiene
sentido hablar de filas duplicadas. Es más, en esas tablas es perfectamente posible que existan
ISC
Por ejemplo, en mitabla5 tenemos una clave única sobre la columna 'nombre':
mysql> INSERT INTO mitabla5 (id, nombre) VALUES (1, 'Carlos'), (2, 'Felipe'),(3,
'Antonio'),(4, 'Carlos'),(5, 'Juan');
ERROR 1062 (23000): Duplicate entry 'Carlos' for key 1
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 opción que podemos usar para los casos de claves
Taller de Base de Datos
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 población en caso de repetición:
o Update
Podemos modificar valores de las filas de una tabla usando la sentencia UPDATE. En su
forma más simple, los cambios se aplican a todas las filas, y a las columnas que especifiquemos.
Podemos, del mismo modo, actualizar el valor de más de una columna, separándolas en
la sección SET mediante comas:
mysql> UPDATE ciudad5 SET clave=clave+10, poblacion=poblacion*0.97;
Query OK, 4 rows affected (0.05 sec)
Rows matched: 4 Changed: 4 Warnings: 0
| 12 | París | 8730000 |
| 13 | Berlín | 3395000 |
| 14 | Roma | 7760000 |
+-------+--------+-----------+
4 rows in set (0.00 sec)
Pero no tenemos por qué actualizar todas las filas de la tabla. Podemos limitar el número
de filas afectadas de varias formas. La primera es mediante la cláusula WHERE. Usando e sta
Taller de Base de Datos
cláusula podemos establecer una condición. Sólo las filas que cumplan esa condición serán
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
En este caso sólo hemos aumentado la población de las ciudades cuyo nombre sea
'Roma'. Las condiciones pueden ser más complejas. Existen muchas funciones y operadores que
se pueden aplicar sobre cualquier tipo de columna, y también podemos usar operadores
booleanos como AND u OR. Veremos esto con más detalle en otros capítulos.
Otra forma de limitar el número de filas afectadas es usar la cláusula LIMIT. Esta
cláusula permite especificar el número 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
primeras filas.Esta cláusula se puede combinar con WHERE, de modo que sólo las 'n' primeras
filas que cumplan una determinada condición se modifiquen.
La cláusula LIMIT se suele asociar a la cláusula ORDER BY. Por ejemplo, si queremos
modificar la fila con la fecha más 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)
Taller de Base de Datos
Si queremos modificar la fila con la fecha más 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
o Delete
Para eliminar filas se usa la sentencia DELETE. La sintaxis es muy parecida a la de
UPDATE:
Pero es más frecuente que sólo queramos eliminar ciertas filas que cumplan
determinadas condiciones. La forma más normal de hacer esto es usar la cláusula WHERE:
mysql> DELETE FROM ciudad5 WHERE clave=2;
Query OK, 1 row affected (0.05 sec)
Taller de Base de Datos
También podemos usar las cláusulas LIMIT y ORDER BY del mismo modo que en la
sentencia UPDATE, por ejemplo, para eliminar las dos ciudades con más población:
mysql> DELETE FROM ciudad5 ORDER BY poblacion DESC LIMIT 2;
Query OK, 2 rows affected (0.03 sec)
La forma más sencilla es la que hemos usado hasta ahora, consiste en pedir todas las
columnas y no especificar condiciones.
Taller de Base de Datos
Pero podemos usar una lista de columnas, y de ese modo sólo se mostrarán esas
columnas:
mysql> SELECT nombre FROM gente;
+---------+
| nombre |
+---------+
| Fulano |
| Mengano |
| Tulano |
| Pegano |
+---------+
4 rows in set (0.00 sec)
Vemos que podemos usar funciones, en este ejemplo hemos usando la función SIN para calcular el seno de
π/2.
También 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 |
Taller de Base de Datos
+---------+------------+------------------------------------+
| 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 |
+-----+
Ya que podemos elegir sólo algunas de las columnas de una tabla, es posible que se
produzcan filas repetidas, debido a que hayamos excluido las columnas únicas. Por ejemplo,
añadamos las siguientes filas a nuestra tabla:
mysql> INSERT INTO gente VALUES ('Pimplano', '1978-06-15'),
-> ('Frutano', '1985-04-12');
Query OK, 2 rows affected (0.03 sec)
Records: 2 Duplicates: 0 Warnings: 0
ISC
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 sólo existen dos opciones, ya que las dos
últimas: DISTINCT y DISTINCTROW son sinónimos.
La otra alternativa es usar DISTINCT, que hará que sólo 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 selección, que consistía en
seleccionar filas de una relación que cumplieran determinadas condiciones.
Lo que es más útil de una base de datos es la posibilidad de hacer consultas en función
de ciertas condiciones. Generalmente nos interesará saber qué filas se ajustan a determinados
parámetros. Por supuesto, SELECT permite usar condiciones como parte de su sintaxis, es
decir, para hacer selecciones. Concretamente mediante la cláusula WHERE, veamos algunos
ejemplos:
| Pegano | 1993-02-10 |
+--------+------------+
2 rows in set (0.00 sec)
mysql> SELECT * FROM gente WHERE fecha>="1986-01-01" AND fecha < "2000-01-01";
+--------+------------+
| nombre | fecha |
+--------+------------+
| Pegano | 1993-02-10 |
+--------+------------+
1 row in set (0.00 sec)
Between
Select cnombre, cno, cdescrip from curso where cnombre between “ES” and “ESZ”
Select * from pedidos where fechapedido between “1989-10-01” and “1989-12-31”;
Select cno, ctarifa from curso where ctarifa not between 50 and 400;
In
Select fnombre, fnumdep, fdept from claustro where fnumdep is not null
Select nombre from ventas where oficinarep is not null
Taller de Base de Datos
UNION
Permite combinar resultados de dos o más 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;
Hasta ahora todas las consultas que hemos usado se refieren sólo a una tabla, pero
también 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
composición.
Insertemos:
mysql> INSERT INTO personas2 (nombre, fecha) VALUES ("Fulanito", "1956 -12-
14"),("Menganito", "1975-10-15"),("Tulanita", "1985-03-17"),("Fusganita", "1976-08-25");
Query OK, 4 rows affected (0.09 sec)
Records: 4 Duplicates: 0 Warnings: 0
| 3 | Tulanita | 1985-03-17 |
| 4 | Fusganita | 1976-08-25 |
+----+-----------+------------+
4 rows in set (0.00 sec)
mysql> INSERT INTO telefonos2 (id, numero) VALUES (1, "123456789"),(1, "145654854"),(1,
"152452545"),(2, "254254254"),(4, "456545654"),(4, "441415414");
Query OK, 6 rows affected (0.06 sec)
Records: 6 Duplicates: 0 Warnings: 0
+-----------+---------+
| 123456789 | 1 |
| 145654854 | 1 |
| 152452545 | 1 |
| 254254254 | 2 |
| 456545654 | 4 |
| 441415414 | 4 |
+-----------+---------+
6 rows in set (0.00 sec)
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 cláusula 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 |
Ejemplo:
Combina tabla pedido y clientes (que se separan por coma en la cláusula from)
mostrando el numero de pedido y su importe y el numero de cliente y su límite de credito,
utilizando para la combinación la columna clie de la tabla pedidos y la columna numclie de la
tabla clientes:
Taller de Base de Datos
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 instrucción SQL. Las subconsultas proporcionan una forma
natural y eficiente de manejar las solicitudes de consultas que se expresan en términos 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 condición. Parece razonable que la instrucción SELECT que expresa la
consulta pueda ser como:
El valor ??? se debe rellenar y debe ser igual a la suma de las cuotas de los
representantes asignados a la oficina en cuestión. ¿Cómo 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 quedaría de la siguiente manera.
Select sum(cuota) from representantes where oficina_rep=21
Pero sería poco eficaz tener que escribir esta consulta, escribir los resultados y escribir
ISC
en la consulta anterior la cantidad correcta. ¿Cómo se pueden poner los resultados de esta
consulta en la consulta anterior en lugar de los signos de interrogación? 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 añade la oficina a los resultados de la
consulta principal. Al trabajar juntas, la consulta principal y la subconsulta expresan la solicitud
Taller de Base de Datos
CONCEPTO DE SUBCONSULTA
La subconsulta se encierra entre paréntesis; sin embargo tiene la forma familiar de una
instrucción SELECT, con una clausula FROM y clausulas opcionales WHERE, GROUP BY y
HAVING
Comparación en subconsultas
Ejemplos:
3. Listar todos los productos del fabricante ACI para los que su Stock esta por encima del
stock del producto ACI-41004
Select descripción, stock from productos where id_fab = “ACI” and stock > (select
stock from productos where id_fab=”ACI” and id_producto= “41004”)
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
ISC
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 están por encima de sus
objetivos
Select nombre from representantes where oficina_rep in (select oficina from
Taller de Base de Datos
Listar los representantes que no trabajan en oficinas dirigidas por Leon Freire
(empleado 108)
Select nombre from representantes where oficina_rep not in (select oficina from
oficinas where jef = 108)
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 “30-
jun-90”)
Listar los representantes cuyas cuotas son iguales o superiores al objetivo de la oficina
de ventas de los ángeles
Tabla OFICINAS
+---------+-------------+--------+-----+----------+--------+
| Oficina | Ciudad | Region | Dir | Objetivo | Ventas |
+---------+-------------+--------+-----+----------+--------+
ISC
+---------+---------------+------+------------+------------+------------+----------+--------+--------+
| Numempl | Nombre | Edad | Oficinarep | Titulo | Contrato | Director | Cuota | Ventas |
+---------+---------------+------+------------+------------+------------+----------+--------+--------+
| 101 | Dan Roberts | 45 | 11 | Rep Ventas | 1986 -10-20 | 104 | 257143 | 305673 |
| 102 | Sue Smith | 48 | 21 | Rep Ventas | 1986 -12-12 | 108 | 333333 | 474050 |
Taller de Base de Datos
| 103 | Paul Cruz | 29 | 11 | Rep Ventas | 1987 -03-01 | 104 | 235715 | 286775 |
| 104 | Bob Smith | 33 | 11 | Dir Ventas | 1987 -05-19 | 106 | 171428 | 142594 |
| 105 | Bill Adams | 37 | 13 | Rep Ventas | 1988 -02-12 | 104 | 333333 | 367911 |
| 107 | Nancy Angelli | 49 | 22 | Rep Ventas | 1988 -11-14 | 108 | 285714 | 186042 |
| 108 | Larry Fitch | 62 | 21 | Dir Ventas | 1989 -10-12 | 106 | 333333 | 361865 |
| 109 | Mary Jones | 31 | 11 | Rep Ventas | 1999 -10-12 | 106 | 285714 | 392725 |
| 11 | Matías Clark | 35 | 15 | Dir Ventas | 1990 -07-25 | 108 | 100000 | 0 |
| 0 | 35 | 11 | 0 | NULL | 0000 -00-00 | 1990 | 103 | 15 |
+---------+---------------+------+------------+------------+------------+----------+--------+--------+
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 |
+---------+-------------------+---------+---------------+
Tabla PEDIDOS
+-----------+-------------+------+-----+-----+----------+------+---------+
| Numpedido | Fechapedido | Clie | Rep | Fab | Producto | Cant | Importe |
+-----------+-------------+------+-----+-----+----------+------+---------+
| 112963 | 1989-12-17 | 2103 | 105 | ACI | 41004 | 28 | 3276 |
| 112983 | 1989-12-27 | 2103 | 105 | ACI | 41004 | 6 | 702 |
| 112987 | 1989-12-31 | 2103 | 105 | ACI | 4100Y | 11 | 27500 |
| 112997 | 1990-01-08 | 2124 | 107 | BIC | 41003 | 1 | 652 |
| 113003 | 1990-01-25 | 2108 | 109 | IMM | 779C | 3 | 5625 |
| 113007 | 1990-01-08 | 2112 | 108 | IMM | 773C | 3 | 2925 |
ISC
+-------+------------+-------------------+--------+-------------+
| Idfab | Idproducto | Descripcion | Precio | Existencias |
+-------+------------+-------------------+--------+-------------+
| ACI | 41001 | Artφculo Tipo 1 | 55 | 277 |
| ACI | 41002 | Artφculo Tipo 2 | 76 | 167 |
| ACI | 41003 | Artφculo Tipo 3 | 107 | 207 |
| ACI | 41004 | Artφculo 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 |
SELECT NombreM FROM Materia WHERE creditos=‟8‟ and clave in(SELECT clave FROM cursa
WHERE NControl=‟97310211‟;
Obtener el número de control del alumno que tenga alguna calificación igual a 100
SELECT DISTINC(NControl) FROM Cursa WHERE Calif=‟100‟;
Un JOIN de dos tablas es una combinación entre las mismas basada en la coincidencia
exacta(u otro tipo de comparación) de dos columnas, una de cada tabla. El JOIN forma parejas
de filas haciendo coincidir los contenidos de las columnas relacionadas.
Ejemplo: Visualizar la información 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;
Composiciones internas
Todas las composiciones que hemos visto hasta ahora se denominan composiciones
internas. Para hacer una composición interna se parte de un producto cartesiano y se eliminan
aquellas tuplas que no cumplen la condición de la composición.
cumpla.
referencia_tabla, referencia_tabla
referencia_tabla [INNER | CROSS] JOIN referencia_tabla [condición]
La coma y JOIN son equivalentes, y las palabras INNER y CROSS son opcionales.
La condición en la cláusula ON puede ser cualquier expresión válida para una cláusula
WHERE, de hecho, en la mayoría de los casos, son equivalentes.
La cláusula USING nos permite usar una lista de atributos que deben ser iguales en las
dos tablas a componer.
Siguiendo con el mismo ejemplo, la condición más lógica para la composición interna
entre personas2 y teléfonos2 es la igualdad entre el identificador de persona en la primera
tabla y el atributo persona en la segunda:
En cualquier caso, la salida sólo contiene las tuplas que emparejan a personas con sus
números de teléfono. Las tuplas correspondientes a personas que no tienen ningún número no
aparecen, como por ejemplo las correspondientes a "Tulanita".
Para las personas con varios números, se repiten los datos de la persona para cada
número, por ejemplo con "Fulanito" o "Fusganita".
Podemos hacer esto a partir de una composición general, eligiendo todas las columnas
menos las repetidas:
+----+-----------+------------+-----------+
6 rows in set (0.00 sec)
También podemos definir alias para las tablas, y conseguir una consulta más compacta:
ISC
Pero tenemos una sintaxis alternativa mucho mejor para hacer composiciones internas
naturales:
Taller de Base de Datos
Por ejemplo:
Composiciones externas
Para hacer una composición externa se toman las tuplas de una de las tablas una a una y
se combinan con las tuplas de la otra.
Como norma general se usa un índice para localizar las tuplas de la segunda tabla que
ISC
cumplen la condición, y para cada tupla encontrada se añade 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.
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.
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)
mysql> INSERT INTO tabla1 VALUES (5, "Juan"), (6, "Pedro"), (7, "José"), (8,
"Fernando");
Query OK, 4 rows affected (0.06 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> INSERT INTO tabla2 VALUES(3, 30), (4, 40), (5, 50), (6, 60);
Query OK, 5 rows affected (0.05 sec)
Records: 5 Duplicates: 0 Warnings: 0
Se puede ver que aparecen dos filas con valores NULL, para los id 7 y 8.
+----+--------+----+--------+
2 rows in set (0.06 sec)
La sintaxis es equivalente:
Es lo mismo usar una composición derecha de las tablas tabla1 y tabla2 que una
composición izquierda de las tablas tabla2 y tabla1. Es decir, la consulta anterior es equivalente
a esta otra:
+----+----------+------+--------+
| 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)
También es posible realizar la operación de álgebra relacional unión 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.
Las condiciones para que se pueda crear una unión son las mismas que vimos al estudiar
el álgebra relacional: las relaciones a unir deben tener el mismo número de atributos, y además
deben ser de dominios compatibles.
Podemos crear una unión de las tres tablas, a pesar de que los nombres y tamaños de
algunas columnas sean diferentes:
| 12 | tuerca M5 | 87 |
| 1 | tornillo M3x12 | 22 |
| 11 | tuerca M3 | 22 |
| 20 | varilla 10 | 23 |
| 21 | varilla 12 | 32 |
+----+----------------+----------+
11 rows in set (0.00 sec)
Con ALL se muestran todas las filas, aunque estén repetidas, con DISTINCT sólo se
muestra una copia de cada fila:
| 11 | tuerca M3 |
| 12 | tuerca M5 |
| 20 | varilla 10 |
| 21 | varilla 12 |
+----+----------------+
9 rows in set (0.00 sec)
+----+----------------+
| 1 | tornillo M3x12 |
| 2 | tornillo M3x15 |
| 3 | tornillo M4x25 |
| 4 | tornillo M5x30 |
| 10 | tuerca M4 |
| 11 | tuerca M3 |
| 12 | tuerca M5 |
| 1 | tornillo M3x12 |
| 11 | tuerca M3 |
| 20 | varilla 10 |
| 21 | varilla 12 |
Taller de Base de Datos
+----+----------------+
11 rows in set (0.00 sec)
GROUP BY
Permite combinar en un único registro los registros con valores idénticos en la lista de
campos especificada
Es posible agrupar filas en la salida de una sentencia SELECT según los distintos valores
de una columna, usando la cláusula GROUP BY. Esto, en principio, puede parecer redundante,
ya que podíamos hacer lo mismo usando la opción DISTINCT. Sin embargo, la cláusula GROUP
BY es más potente:
+---------+------------+
| Mengano | 1978-06-15 |
| Fulano | 1985-04-12 |
| Pegano | 1993-02-10 |
| Tulano | 2001-12-02 |
+---------+------------+
4 rows in set (0.00 sec)
HAVING
| Madrid | 25 |
+--------+------------------+
2 rows in set (0.00 sec)
Ejemplos:
SELECT Avg (Calif) FROM Cursa WHERE NCotrol IN (SELECT Ncontrol FROM Alumno WHERE
NombreA=‟Salvador Chávez‟);
ACTIVIDADES DE APRENDIZAJE
DBMS.
EVALUACION
Examen Práctico 60 %
Participación 10 %
Laboratorio 30 %
100 %
OTROS RECURSOS
ISC
Taller de Base de Datos
Unidad Cuatro
Control de Transacciones.
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 lógica de trabajo
Cuando una transacción finaliza con éxito, se graba (COMMIT). Si fracasa, se restaura el
estado anterior (ROLLBACK)
Y además:
o Aislamiento: Los efectos de una transacción no se ven en el exterior hasta que esta
finaliza.
o Persistencia: Una vez finalizada la transacción los efectos perduran en la BD.
los cambios que han sido realizados por las consultas que han sido ejecutadas hasta el
momento.
Vamos a ejecutar algunas consultas para ver como trabajan las transacciones. Lo
primero que tenemos que hacer es crear una tabla del tipo InnoDB e insertar algunos datos.
Para crear una tabla InnoDB, procedemos con el código SQL estándar CREATE TABLE,
pero debemos especificar que se trata de una tabla del tipo InnoDB (TYPE= InnoDB). Esto es
aplicable a cualquier tipo de tabla, pero cuando no se especifica nada, MySQL supone que se
Taller de Base de Datos
mysql> CREATE TABLE innotest (campo INT NOT NULL PRIMARY KEY) TYPE = InnoDB;
Query OK, 0 rows affected (0.10 sec)
mysql> INSERT INTO innotest VALUES(1);
Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO innotest VALUES(2);
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO innotest VALUES(3);
Query OK, 1 row affected (0.04 sec)
mysql> SELECT * FROM innotest;
+-------+
| campo |
+-------+
| 1 |
| 2 |
| 3 |
+-------+
3 rows in set (0.00 sec)
mysql> BEGIN;
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO innotest VALUES(4);
Query OK, 1 row affected (0.00 sec)
+-------+
4 rows in set (0.00 sec)
mysql> ROLLBACK;
Query OK, 0 rows affected (0.06 sec)
| campo |
+-------+
| 1 |
| 2 |
| 3 |
+-------+
3 rows in set (0.00 sec)
Si queremos que la transacción se lleve a cabo pondremos COMMIT
El Nivel de Aislación (Isolation Level) tiene que ver con serializabilidad. A veces serializabilidad
estricta puede ser demasiado exigente Violaciones de Serializabilidad permitidos:
Lectura Sucia: Transacción T1 realiza una actualización de una tupla. T2 lee la tupla
actualizada pero poco despues T1 termina con un Rollback (Abort). T2 ha visto
información que no existe.
Lectura no repetible: Transacción T1 lee una tupla. T2 actualiza la misma tupla.T1
vuelve a leer la tupla ahora con diferente valor
Fantasmas: T1 lee todas las tuplas que satisfacen una condición. T2 inserta una tupla
que también satisface. T1 repite la lectura y aparece una tupla nueva(fantasma)
begin: define el inicio de una unidad de trabajo indivisible (puede ser implícito al ejecutar una
operación de categoría transaction-initiating)
commit: marca el término normal de la transacción, todos los cambios deben quedar reflejados
en forma definitiva en la BD y se liberan todos los locks (si los hubieran)
rollback: marca una situación anormal que hace necesario deshacer el camino recorrido
Ejemplo:
mysql> BEGIN;
mysql> INSERT INTO t SET name = 'William';
mysql> INSERT INTO t SET name = 'Wallace';
mysql> COMMIT;
mysql> SELECT * FROM t;
+---------+
| name |
+---------+
| Wallace |
| William |
+---------+
ISC
mysql> BEGIN;
mysql> INSERT INTO t SET name = 'Gromit';
mysql> INSERT INTO t SET name = 'Wallace';
ERROR 1062: Duplicate entry 'Wallace' for key 1
mysql> ROLLBACK;
mysql> SELECT * FROM t;
+---------+
| name |
+---------+
| Wallace |
| William |
+---------+
Taller de Base de Datos
BEGIN
SAVEPOINT A;
SAVEPOINT B;
SAVEPOINT C;
ROLLBACK TO B;
SELECT * FROM student WHERE last_name = 'Norbu';
ISC
ROLLBACK TO A;
SELECT last_name FROM student WHERE last_na me = 'Tashi';
COMMIT;
END;
Panorámica de InnoDB
En MySQL 5.0, InnoDB viene incluido por defecto en las distribuciones binarias. El instalador
Windows Essentials configura a InnoDB como el tipo de base de datos MySQL por defecto en
Windows.
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 más
de 1TB de datos en InnoDB, y otros sitios manejan una carga promedio de 800 inserciones y
ISC
InnoDB se publica bajo la misma licencia GNU GPL Versión 2 (de Junio de 1991) que MySQL.
Para más información sobre el licenciamiento de MySQL, consulte
http://www.mysql.com/company/legal/licensing/.
Taller de Base de Datos
Ejemplo:
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> begin;
Query OK, 0 rows affected (0.00 sec)
| 4 | compas |
+-------+--------+
1 row in set (0.00 sec)
mysql> rollback;
Query OK, 0 rows affected (0.06 sec)
| 4 | compas |
+-------+--------+
2 rows in set (0.00 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
ISC
mysql> savepoint a;
Query OK, 0 rows affected (0.00 sec)
mysql> savepoint b;
Taller de Base de Datos
mysql> rollback to a;
Query OK, 0 rows affected (0.00 sec)
EVALUACION
Examen Práctico 60 %
Participación 10 %
Laboratorio 30 %
100 %