Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Antologia TBD 1 PDF
Antologia TBD 1 PDF
DE BASES DE DATOS
UNIDAD I. LENGUAJE
DE DEFINICIÓN DE
DATOS
1.1. INSTALACIÓN DE UN SISTEMA GESTOR DE BASE DE
DATOS (SGBD)
La regla general para determinar el tamaño de la memoria virtual depende del tamaño de
memoria RAM instalada. Si su sistema tiene menos de 4 GB de RAM por lo general el
espacio de intercambio debe ser de al menos dos veces este tamaño. Si usted tiene más de
8 GB de memoria RAM instalada puede considerar usar el mismo tamaño como espacio de
intercambio. Cuanta más memoria RAM tenga instalada, es menos probable usar el espacio
de intercambio, a menos que tenga un proceso inadecuado.
INVESTIGAR
Buscar y seleccionar en distintas fuentes de información los requisitos y características de
distintos SGBD (Oracle, MYSQL, INFORMIX, SQLServer, DB2, PostgreSQL y MongoDB)
Realizar un cuadro comparativo donde se agregue la información encontrada acerca de los
distintos SGBD agregando la opinión personal acerca de las ventajas y desventajas de cada
uno de ellos
Usando como fuente de información el libro Fundamentos de Base de Datos del autor
Silberschatz, Korth y Sudarshan capítulo I, resuelva el siguiente cuestionario
¿Cuáles son las inconvenientes de un sistema gestor de base de datos?
Indique los pasos importantes para configurar una base de datos para una empresa
dada.
Explique la diferencia entre independencia de datos física y lógica.
Explique cinco responsabilidades del Sistema Gestor de la Base de Datos.
Para cada responsabilidad explique qué pasaría de no asumir la responsabilidad.
¿Cuáles son las cinco funciones principales del administrador de la base de datos?
Indique 5 aplicaciones que usted perciba que se usa una base de datos para
almacenar datos persistentes
El producto requerido es una entrada con la fecha de realización en su bloc de notas
________________________________________________________________________
Requerimiento Valor
Arquitectura del Intel x86 (desde Windows 2000 hasta seven) o Linux x86
sistema (Debian, Mandriva, Novell, Red Hat y Ubuntu )
Estos puertos son usados por defecto por Oracle Database XE
1521: Oracle database listener
2030: Oracle Services para Microsoft Transaction Server
8080: Puerto para Oracle XML DB y la inteface gráfica de usuario Oracle Database XE
Instalación de Oracle Database XE en Windows
Doble clic sobre el icono o el archivo setup.exe en ambos casos con privilegios de
administrador. Pulse sobre el botón de siguiente para iniciar la instalación.
Acepte los términos de acuerdo de licencia
Verifique los requerimientos de espacio y si los cumple pulse aceptar. Considere un Giga
más para almacenamiento.
Para futuros accesos usted puede pulsar botón de inicio, todos los programas, base de datos
10g Express Edition o el icono en su escritorio denominado Base de Datos
Similar a Oracle procederemos a crear un usuario administrador para evitar usar root.
Seleccione User Administration y presione el botón New User
Introduzca los datos solicitados. Es necesario dar privilegios al usuario (Scheme Privileges),
sin mayores explicaciones otorgue todos y pulse el botón Apply Changes.
1.3. Configuración del SGBD
Durante el proceso de instalación configuraremos el arranque de MySQL, password de root,
puerto TCP/IP
Tipo de configuración
Indicaremos el tipo de servidor de MySQL Server que queramos dar al equipo en el que se
instala marcaremos una de las tres opciones:
1. Developer Machine: Marcaremos esta opción si en el equipo donde hemos instalado
MySQL Server se utiliza también para otras aplicaciones. MySQL Server utilizará la
memoria mínima necesaria.
2. Server Machine: Equipo compartido con algunas aplicaciones (no demasiadas). Con
esta opción MySQL Server utilizará un nivel medio de memoria.
3. Dedicated MySQL Server Machine: Seleccione esta opción sólo si queremos utilizar
el equipo como un servidor dedicado exclusivamente a MySQL. Con esta opción
MySQL Server utilizará el máximo de memoria disponible. Se obtendrá un
rendimiento elevado pero el equipo sólo servirá para MySQL.
En nuestro caso marcaremos "Developer Machine" (utilizará un bajo de memoria para su
funcionamiento, ya que nuestra máquina trabajará con otras aplicaciones), y pulsaremos clic
sobre el botón para continuar.
Password de root
Indicar si queremos que el asistente de configuración de MySQL Server cree un servicio de
Windows o un archivo de proceso por lotes (.bat). Aquí podremos utilizar el método que más
nos convenga para iniciar MySQL Server, cada uno tiene sus ventajas e inconvenientes. El
más "profesional" es "Install As Windows Service", pues podremos indicar el modo de inicio:
manual, automático, etc. también podremos deshabilitarlo o reiniciarlo desde otras
aplicaciones en caso necesario.
Si marcamos esta opción deberemos indicar el nombre que se le dará al servicio en "Service
Name", en nuestro caso, puesto que el nombre que aparece por defecto "MySQL56"
El archivo de configuración se llama my.ini (Windows) o my.cnf (linux) la localización exacta
depende de su instalación. Recomiendo respaldarlo. Dado que se puede modificar
manualmente
Alguna de las opciones de interés es
max_connections
Cantidad máxima de sesiones simultáneas que el servidor MySQL permite. Una de estas
conexiones será reservada para un usuario con Privilegios de root para permitir que el
administrador inicia sesión, incluso si
alcanzado el límite de conexiones
Si usted espera que una gran cantidad de usuarios al mismo tiempo, entonces usted debe
pensar en servidores de alto desempeño. Como regla general un servidor eFront típico
podría manejar entre 200 y 300 usuarios concurrentes (Un usuario concurrente solicita una
página durante los últimos 5 minutos). Con un servidor web de gama alta con 32 GB de
RAM, discos SCSI y un procesador de gama alta es posible duplicar este n úmero. Separar el
servidor web del servidor de base de datos y tener 32 GB y discos SCSI en ambos de ellos
puede triplicar este número y acercarse a 2.000 usuarios concurrentes.
El uso de la replicación debe ser sencilla y necesitaría con cambios mínimos del código a
implementar (se debe modificar el manejo de las escrituras y lecturas en eFront. Estas son
funciones centralizadas que pueden sintonizarse en el mismo lugar).
max_connections = 2... ∞
query cache size
Caché de consultas se utiliza para almacenar en caché los resultados de SELECT y después
devolverlos sin la ejecución de la misma consulta una vez más. Tener la consulta en Caché
habilitado puede resultar en mejoras significativas de velocidad, si se tienen muchas
consultas idénticas donde raramente vez cambian.
query_cache_size= = 0... ∞
Para consultar el estado de la memoria use la sentencia
SHOW STATUS LIKE '%cache%’;
El resultado depende de query_cache_size y la memoria física de su equipo
El esquema de una base de datos (en inglés, Database Schema) describe la estructura de
una Base de datos, en un lenguaje formal soportado por un Sistema administrador de Base
de datos (DBMS). En una Base de datos Relacional, el Esquema define sus tablas, sus
campos en cada tabla y las relaciones entre cada campo y cada tabla.
Por otro lado MySQL presenta dos esquemas information_schema y MySQL ambos guardan
información sobre privilegios y procedimientos del gestor y no deben ser eliminados.
Sintaxis básica para crear una base de datos en Oracle (No aplica en Oracle express)
CREATE DATABASE nombre_baseDatos
Oracle
Una tabla es un sistema de elementos de datos (atributo - valores) que se organizan que
usando un modelo vertical - columnas (que son identificados por su nombre)- y horizontal
filas. Una tabla tiene un número específico de columnas, pero puede tener cualquier número
de filas. Cada fila es identificada por los valores que aparecen en un subconjunto particular
de la columna que se ha identificado por una llave primaria.
Una tabla de una base de datos es similar en apariencia a una hoja de cálculo, en cuanto a
que los datos se almacenan en filas y columnas. Como consecuencia, normalmente es
bastante fácil importar una hoja de cálculo en una tabla de una base de datos. La principal
diferencia entre almacenar los datos en una hoja de cálculo y hacerlo en una base de datos
es la forma de organizarse los datos.
A nivel de tabla: Refieren a una o a varias columnas, donde cada columna se define
individualmente.
Cantidad de
Una tabla puede tener un máximo de 254 columnas.
Columnas:
Del examen de la sintaxis de la sentencia Create Table se pueden concluir que necesitamos
conocer los distintos tipos de columna y las distintas restricciones que se pueden imponer al
contenido de las columnas.
Existen varios tipos de datos en SQL. De esta manera, cada columna puede albergar una
información de naturaleza distinta. Los tipos de datos más comunes y sus características en
Oracle Express (10 Y 11g) se resumen en la siguiente tabla. Las versiones de Oracle
comercial soportan una gama mucho más amplia de tipos de datos.
SELECT DBMS_LOB.substr(campo,
DBMS_LOB.getlength(campo), 1)
FROM tablaprueba;
Almacena datos de tipo carácter alfanumérico de longitud
CHAR
fija, con un tamaño máximo de 2000. caracteres
201
Sebastian Vettel Red Bull Racing
0
200
Jenson Button Brawn GP
9
200
Lewis Hamilton McLaren
8
200
Kimi Raikkonen Ferrari
7
200
Fernando Alonso Renault
6
200
Fernando Alonso Renault
5
200
Michael Schumacher Ferrari
4
200
Michael Schumacher Ferrari
3
200
Michael Schumacher Ferrari
2
200
Michael Schumacher Ferrari
1
200
Michael Schumacher Ferrari
0
CREATE TABLE f1 (
year INTEGER PRIMARY KEY,
campeon CHAR(30),
escuderia CHAR(20)
);
Tablas Temporales
Oracle permite la creación de tablas temporales para mantener datos propios y exclusivos a
una sesión Oracle determinada. Estos datos permanecerán en el sistema sólo durante el
tiempo que dure la transacción o sesión involucrada. No obstante, al igual que para las tablas
permanentes, la definición de las tablas temporales se almacena en las tablas del sistema.
La siguiente sintaxis permite crear una tabla temporal personal para cada sesión. Eso
significa que los datos no se comparten entre sesiones y se eliminan al final de la misma.
CREATE GLOBAL TEMPORARY TABLE [ schema. ]table (
nombreColumna tipoDato [DEFAULT expresión] [NOT NULL],
[,nombre_columna tipo_dato [DEFAULT expresión]
[restricción_columna] ...
|restricción_tabla];
ON COMMIT { DELETE | PRESERVE } ROWS ]
[ physical_properties ]
Con la opción ON COMMIT DELETE ROWS se borran los datos cada vez que se hace
COMMIT en la sesión.
Con la opción ON PRESERVE DELETE ROWS los datos no se borran hasta el final de la
sesión.
Sus ventajas son varias, la información contenida en ella esta solo disponible para la sesión
actual, cualquier inserción, borrado, actualización solo se refleja en la sesión activa.
Muchas funcionalidades de cualquier tabla normal se mantienen en ella, como triggers a nivel
tabla, vistas, índices, exportar e importar (claro solo la definición de la tabla).
(DROP) Eliminación
Cuando una tabla ya no es útil y no vamos a volver a necesitarla debe ser borrada. Esta
operación se puede realizar con el comando DROPTABLE.
Esto produce que las restricciones de la tabla detalle se borren antes de borrar la tabla
maestra. PURGE evita que los objetos borrados se vayan a la papelera
Oracle permite modificar las restricciones definidas para una tabla. Esto puede llevar a
“inconsistencia” de los datos ya introducidos en la base de datos. Por ello, Oracle tiene
definidos mecanismos para modificación de los datos ya existentes.
La opción ADD ... NOT NULL sólo será posible si la tabla está vacía.
La opción MODIFY ... NOT NULL sólo podrá realizarse cuando la tabla
no contenga ninguna fila con valor nulo en la columna en cuestión.
Considere el ejemplo Propietario - Automóvil, bajo el criterio de hacienda del Gobierno del
Estado de Veracruz, México. Modificaremos el ejemplo para añadir el atributo color.
ALTER TABLE automovil
ADD(color CHAR(15) NOT NULL);
Es factible modificar una tabla añadiendo o eliminando restricciones, en este caso para el
ejemplo anterior el comando a utilizar será
MySQL
MySQL soporta varios motores de almacenamiento que tratan con distintos tipos de tabla.
Los motores de almacenamiento de MySQL incluyen algunos que tratan con tablas
transaccionales y otros que no lo hacen:
MyISAM trata tablas no transaccionales. Proporciona almacenamiento y recuperación de
datos rápida, así como posibilidad de búsquedas fulltext.MyISAM se soporta en todas
las configuraciones MySQL, y es el motor de almacenamiento por defecto a no ser que tenga
una configuración distinta a la que viene por defecto con MySQL.
El motor de almacenamiento MEMORY proporciona tablas en memoria. El motor de
almacenamiento MERGE permite una colección de tablas MyISAM idénticas ser tratadas
como una simple tabla. Como MyISAM, los motores de almacenamiento MEMORY y MERGE
tratan tablas no transaccionales y ambos se incluyen en MySQL por defecto.
Nota: El motor de almacenamiento MEMORY anteriormente se conocía como HEAP.
Los motores de almacenamiento InnoDB y BDB proporcionan tablas transaccionales. BDB
se incluye en la distribución binaria MySQL-Max en aquellos sistemas operativos que la
soportan. InnoDB también se incluye por defecto en todas las distribuciones binarias de
MySQL 5.0 . En distribuciones fuente, puede activar o desactivar estos motores de
almacenamiento configurando MySQL a su gusto.
El motor de almacenamiento EXAMPLE es un motor de almacenamiento 'tonto' que no
hace nada. Puede crear tablas con este motor, pero no puede almacenar datos ni
recuperarlos. El objetivo es que sirva como ejemplo en el código MySQL para ilustrar cómo
escribir un motor de almacenamiento. Como tal, su interés primario es para desarrolladores.
NDB Cluster es el motor de almacenamiento usado por MySQL Cluster para
implementar tablas que se particionan en varias máquinas. Está disponible en distribuciones
binarias MySQL-Max 5.0. Este motor de almacenamiento está disponible para linux, Solaris, y
Mac OS X. Los autores mencionan que se añadirá soporte para este motor de
almacenamiento en otras plataformas, incluyendo Windows en próximas versiones.
El motor de almacenamiento ARCHIVE se usa para guardar grandes cantidades de datos sin
índices con una huella muy pequeña.
El motor de almacenamiento CSV guarda datos en archivos de texto usando formato de
valores separados por comas.
El motor de almacenamiento FEDERATED se añadió en MySQL 5.0.3. Este motor guarda
datos en una base de datos remota. En esta versión sólo funciona con MySQL a través de la
API MySQL C Client. En futuras versiones, será capaz de conectar con otras fuentes de datos
usando otros drivers o métodos de conexión clientes.
La versión 5 de MySQL crea por defecto tablas innoDB que permiten el manejo de integridad
referencial, transacciones. Al igual que las tablas regulares de oracle. Para saber si el gestor
de base de datos de MySQL que tenemos las soporta es necesario ejecutar la siguiente
sentencia.
Si nuestro gestor soporta por defecto las tablas innodb las sentencias para crear las tablas
previamente mostradas serán exactamente igual a las de oracle. En caso contrario se
muestra la sintaxis correspondiente
CREATE TABLE f1 (
year INTEGER PRIMARY KEY,
campeon CHAR(30),
escuderia CHAR(20)
) ENGINE = InnoDB;
Comando Describe
MySQL proporciona este comando que resulta útil para conocer la estructura de una tabla,
las columnas que la forman y su tipo y restricciones. La sintaxis es la siguiente DESCRIBE
nombreTabla.
DESCRIBE estados;
El comando SHOW TABLES muestra las tablas dentro de una base de datos y SHOW
CREATE TABLES muestra la estructura de creación de la tabla.
Tablas temporales
Las tablas temporales solo existen mientras la sesión está viva . Si se corre este
código en un script de PHP ( Cualquier otro lenguaje), la tabla temporal se destruirá
automáticamente al termino de la ejecución de la página. Si no específica MEMORY, la tabla
se guardará por defecto en el disco.
Este tipo de tabla solo puede ser usada por el usuario que la crea.
Si creamos una tabla que tiene el mismo nombre que una existente en la base de datos, la
que existe quedará oculta y trabajaremos sobre la temporal.
Modificación
Esta operación se puede realizar con el comando ALTER TABLE. Para usar ALTER TABLE,
necesita permisos ALTER, INSERT y CREATE para la tabla. La sintaxis para MySQL es:
alter_specification:
ADD [COLUMN] column_definition [FIRST | AFTER col_name ]
| ADD [COLUMN] (column_definition,...)
| ADD INDEX [index_name] [index_type] (index_col_name,...)
| ADD [CONSTRAINT [symbol]]
PRIMARY KEY [index_type] (index_col_name,...)
| ADD [CONSTRAINT [symbol]]
UNIQUE [index_name] [index_type] (index_col_name,...)
| ADD [FULLTEXT|SPATIAL] [index_name] (index_col_name,...)
| ADD [CONSTRAINT [symbol]]
FOREIGN KEY [index_name] (index_col_name,...)
[reference_definition]
| ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
| CHANGE [COLUMN] old_col_name column_definition
[FIRST|AFTER col_name]
| MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]
| DROP [COLUMN] col_name
| DROP PRIMARY KEY
| DROP INDEX index_name
| DROP FOREIGN KEY fk_symbol
| DISABLE KEYS
| ENABLE KEYS
| RENAME [TO] new_tbl_name
| ORDER BY col_name
| CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
| [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name]
| DISCARD TABLESPACE
| IMPORT TABLESPACE
| table_options
Considere el ejemplo Propietario - Automóvil, bajo el criterio de hacienda del Gobierno del
Estado de Veracruz, México. Modificaremos el ejemplo para añadir el atributo color según la
sintaxis MySQL
Puede ejecutar múltiples cláusulas ADD, ALTER, DROP, y CHANGE en un único comando
ALTER TABLE. Esta es una extensión MySQL al estándar SQL, que permite sólo una de
cada cláusula por comando ALTER TABLE.
Integridad referencial
Una vez definida la estructura de datos del modelo relacional, pasamos a estudiar las reglas
de integridad, es decir que los datos almacenados en dicha estructura deben cumplir ciertas
características para garantizar que son correctos. Al definir cada atributo sobre un dominio se
impone una restricción sobre el conjunto de valores permitidos para cada atributo.
A este tipo de restricciones se les denomina restricciones de dominios. Hay además dos
reglas de integridad muy importantes que se deben cumplir en todas las bases de datos
relacionales y en todos sus estados o instancias (las reglas se deben cumplir todo el tiempo).
Estas reglas son la regla de integridad de entidades y la regla de integridad referencial.
Antes de definirlas, es preciso conocer el concepto de nulo.
Restricciones de dominios
Imponen una limitación al conjunto de valores permitidos para los atributos en las relaciones.
Permitiendo restringir los valores que puede tomar un atributo respecto a su dominio, por
ejemplo EDAD >= 18.
Nulos
Cuando en una tupla un atributo es desconocido, se dice que es nulo. Un nulo no representa
el valor cero ni la cadena vacía, éstos son valores que tienen significado. El nulo implica
ausencia de información, bien porque al insertar la tupla se desconocía el valor del atributo, o
bien porque para dicha tupla el atributo no tiene sentido.
Ya que los nulos no son valores, deben tratarse de modo diferente, lo que causa problemas
de implementación en los SGBD relacionales.
ORACLE: El optimizador necesita saber que una columna no es NOT NULL, y sin este
conocimiento, se limita a elegir un plan de ejecución inferior al óptimo.
SQL SERVER: NULL no es estrictamente una restricción, pero se puede especificar de la
misma forma que NOT NULL. La restricción se puede usar para las columnas calculadas sólo
si se especifica también PERSISTED.
MySQL 5.02 Si la columna puede tener NULL como valor, la columna se define con una
cláusula DEFAULT NULL explícita. En caso contrario no define DEFAULT explícito.
Restricción UNIQUE
En un índice UNIQUE todos los valores en el índice deben ser distintos. Ocurre un error si
intenta añadir un nuevo registro con una clave que coincida con un registro existente. La
excepción es que una columna en el índice puede contener valores NULL múltiples
Cláusula check
-- MySQL
CREATE TABLE proveedores (
idProveedor INTEGER(4),
nombreProveedor CHAR(50),
CONSTRAINT pkProveedores PRIMARY KEY (idProveedor),
CONSTRAINT dom_idProveedor
CHECK (idProveedor BETWEEN 100 AND 9999),
CONSTRAINT dom_nombreProveedor
CHECK (nombreProveedor = UPPER(nombreProveedor))
) ENGINE = InnoDB;
-- Oracle
CREATE TABLE proveedores (
idProveedor NUMBER(4),
nombreProveedor CHAR(50),
CONSTRAINT pkProveedores PRIMARY KEY (idProveedor),
CONSTRAINT dom_idProveedor
CHECK (idProveedor BETWEEN 100 AND 9999),
CONSTRAINT dom_nombreProveedor
CHECK (nombreProveedor = UPPER(nombreProveedor))
);
-- MySQL y Oracle
Una PRIMARY KEY es una llave única donde todas las columnas de la clave deben
definirse como NOT NULL. Si no se declaran explícitamentecomo NOT NULL, el gestor las
declara implícitamente. Una tabla puede tener sólo una PRIMARY KEY
La primera regla de integridad se aplica a las claves primarias de las relaciones base: ninguno
de los atributos que componen la clave primaria puede ser nulo.
Por definición, una clave primaria es un identificador irreducible que se utiliza para identificar
de modo único las tuplas. Irreducible significa que ningún subconjunto de la clave primaria
sirve para identificar otra tupla. Los campos que conforman una llave primaria son por defecto
no nulas.
Nótese que esta regla sólo se aplica a las relaciones base y a las claves primarias, no a las
claves alternativas.
La segunda regla de integridad se aplica a las claves ajenas o foraneas: si en una relación
hay alguna clave ajena, sus valores deben coincidir con valores de la clave primaria a la que
hace referencia, o bien, deben ser completamente nulos.
Por lo tanto, para cada clave ajena de la base de datos habrá que contestar a tres preguntas:
Regla de los nulos: Los campos involucrados en llaves primarias son por definición no
nulos.
Regla de borrado: ¿Qué ocurre si se intenta borrar la tupla referenciada por la clave ajena?
o Restringir: no se permite borrar la tupla referenciada.
o Propagar: se borra la tupla referenciada y se propaga el borrado a las tuplas que la referencian
mediante la clave ajena - borrado en cascada-.
o Anular: se borra la tupla referenciada y las tuplas que la referenciaban ponen a nulo la clave ajena
(sólo si acepta nulos) - SET NULL-.
Regla de modificación: ¿Qué ocurre si se intenta modificar el valor de la clave primaria de
la tupla referenciada por la clave ajena?
o Restringir: no se permite modificar el valor de la clave primaria de la tupla referenciada.
o Propagar: se modifica el valor de la clave primaria de la tupla referenciada y se propaga la
modificación a las tuplas que la referencian mediante la clave ajena. Oracle no permite la
modificación en cascada.
o Anular: se modifica la tupla referenciada y las tuplas que la referenciaban ponen a nulo la clave
ajena (sólo si acepta nulos).
ejemplo:
DROP TABLE IF EXISTS empleado, departamento;
Versión Oracle
3. SET NULL. Pondrá los campos del registro hijo a null. Note que la clave ajena debe
permitir el valor nulo.
Sintaxis
CONSTRAINT FK_columna
FOREIGN KEY (columna1, columna2, ... columna_n)
REFERENCES TablaReferenciada (columna1, columna2, ... columna_n)
ON DELETE SET NULL
Reglas de negocio
Toda aplicación trata de reflejar parte del funcionamiento del mundo real, para automatizar
tareas que de otro modo serían llevadas a cabo de modo más ineficiente, o bien no podrían
realizarse. Para ello, es necesario que cada aplicación refleje las restricciones que existen en
el negocio dado, de modo que nunca sea posible llevar a cabo acciones no válidas. A las
reglas que debe seguir la aplicación para garantizar se les denomina reglas de negocio.
La integridad de los datos es la propiedad que asegura que información dada es correcta, al
cumplir ciertas aserciones.
Las restricciones de integridad aseguran que la información contenida en una base de datos
es correcta.
Las restricciones de integridad son propiedades de la base de datos que se deben satisfacer
en cualquier momento.
Tanto Oracle y MySql son sistemas de gestión de base de datos (SGBD) relacional que
permite la definición de restricciones de integridad dentro del diseño de su base de datos al
ser creada.
Añadiendo código adicional para verificar y asegurar que se cumplen las restricciones
(Mecanismos declarativos: Procedure o Trigger
Declarando las restricciones como parte del esquema de la base de datos.
Donde:
En el manual de referencia de SQL usted podrá encontrar información sobre las reglas de
formación de expresiones lógicas de SQL.
Los CONSTRAINT pueden ser agregados a una tabla previamente creada, o eliminados de
una tabla existente. Para tal fin se pueden utilizar dos variaciones del comando ALTER
TABLE, cuya sintaxis a continuación se indica:
Permitirá agregar una o más CONSTRAINT a la tabla existente en la base de datos. Cada
uno de los CONSTRAINT que se añaden a la tabla seguirán las convenciones sintácticas de
la cláusula <table_constraint>.
Por ejemplo, si se elimina un CONSTRAINT de clave primaria de una tabla A bajo modalidad
CONSTRAINT entonces se eliminarán losCONSTRAINT de clave foránea que referencien a
A.
SOBRE LÍMITES
ORACLE impone los siguientes límites en lo que respecta a los objetos descritos en esta
sección:
El número máximo de columnas que pueden constituir una clave primaria, una clave alterna o
una clave foránea es de 16.
La sentencia INSERT permite agregar nuevas filas de datos a las tablas existentes.
Está sentencia tiene como sintaxis genérica.
Para insertar datos en una relación, se específica la tupla que se desea insertar o
se formula una consulta cuyo resultado sea el conjunto de tuplas que se desea
insertar. Obviamente, los valores de los atributos de las tuplas que se inserten deben
pertenecer al dominio de los atributos. De igual modo, las tuplas insertadas deben
ser de la aridad -número de atributos- correcta.
Tabla: Departamento
idDepartament Departament
Ciudad
o o
1 Ventas Veracruz
2 Ventas Xalapa
3 Cobranza Veracruz
4 Cobranza Xalapa
5 Credito Orizaba
6 Credito Veracruz
7 Credito Xalapa
Por ejemplo:
En este caso los valores se asignarán a cada una de las columnas mencionadas por
posicionamiento relativo.
Es necesario que por lo menos se asignen valores a todas aquellas columnas que
no admiten valores nulos en la tabla (NOT NULL).
Por ejemplo:
INSERT INTO empleado (idempleado, rfc, nombreempleado, oficio, cargo,
jefe, ingreso, salario, comision, idDepartamento) VALUES (12,
'ROTL790411FRT', 'ROMERO TERRENOS, LUIS', 'Ingeniero', 'Director', NULL,
'01/01/2006', 7000,0.2,4);
INSERT INTO empleado (idempleado, rfc, nombreempleado, oficio, cargo,
jefe, ingreso, salario, comision, idDepartamento) VALUES (5,
'NACA6411116TY', 'NAVARRO CARDOZA, ALEJANDRO', 'LAE', 'Gerente', 12,
'05/05/2004', 5000, 0.15, 2);
INSERT INTO empleado (idempleado, rfc, nombreempleado, oficio, cargo,
jefe, ingreso, salario, comision, idDepartamento) VALUES
(8,'ADRC6908085T4','ADAME RAMIREZ, CARLOS','LAE','Gerente', 12,
'11/05/2005', 5000, 0.15, 3);
INSERT INTO empleado (idempleado, rfc, nombreempleado, oficio, cargo,
jefe, ingreso, salario, comision, idDepartamento) VALUES (1,
'PECJ65030265T', 'PEREZ CARMONA, JUAN','Mecanico', 'Vendedor', 5,
'01/01/2002', 3000, 0.1, 1);
INSERT INTO empleado (idempleado, rfc, nombreempleado, oficio, cargo,
jefe, ingreso, salario, comision, idDepartamento) VALUES (2,
'GAZP721012RGR', 'GARCIA ZARATE, PEDRO', 'Chofer', 'Chofer', 5,
'05/06/2003', 3500, 0, 1);
INSERT INTO empleado (idempleado, rfc, nombreempleado, oficio, cargo,
jefe, ingreso, salario, comision, idDepartamento) VALUES
(3,'MOME89011068A', 'MORALEZ MORALES, ELIZABETH', 'Secretaria',
'Secretaria', 5, '5/08/2008', 3000, 0, 2);
INSERT INTO empleado (idempleado, rfc, nombreempleado, oficio, cargo,
jefe, ingreso, salario, comision, idDepartamento) VALUES
(4,'ZAVJ840612XYZ','ZARATE VALERIO, JUANA','Sin oficio', 'Vendedor', 5,
'4/01/2009', 2000,0.1,2);
INSERT INTO empleado (idempleado, rfc, nombreempleado, oficio, cargo,
jefe, ingreso, salario, comision, idDepartamento) VALUES
(6,'OLTF841123TYS','OLIVEROS TORRES, FANNY','Secretaria', 'Secretaria', 8,
'01/01/2009', 3000, 0, 3);
INSERT INTO empleado (idempleado, rfc, nombreempleado, oficio, cargo,
jefe, ingreso, salario, comision, idDepartamento) VALUES
(7,'CESS700313TRG','CEDILLO SALAS,SERGIO', 'Electrico', 'Cobrador', 8,
'10/07/2006', 4200, 0, 3);
INSERT INTO empleado (idempleado, rfc,nombreempleado, oficio, cargo, jefe,
ingreso, salario, comision, idDepartamento) VALUES (9, 'HEGZ781111YTD',
'HERNANDEZ GARCIA, ZAIDA', 'Finanzas', 'Gestor', 12, '01/01/2006', 6000, 0,
4);
INSERT INTO empleado (idempleado, rfc, nombreempleado, oficio, cargo,
jefe, ingreso, salario, comision, idDepartamento) VALUES (10,
'ROCR820506RGT', 'ROSALDO CASTRO, ROXANA', 'Finanzas', 'Gestor', 12,
'01/01/2006', 5000, 0, 4);
INSERT INTO empleado (idempleado, rfc, nombreempleado, oficio, cargo,
jefe, ingreso, salario, comision, idDepartamento) VALUES (11,
'RORP890911RFT', 'ROSAS RAMOS, PETRA', 'Secretaria', 'Secretaria', 12,
'01/01/2006',3500,0,4);
2.2. UPDATE
SQL ofrece el constructor CASE, que puede usarse para formular actualizaciones
dependientes. Por ejemplo;
Borrará todas las filas que cumplan la condición especificada en la cláusula WHERE. Si esta
cláusula se omite, se borrarán todas las filas de la tabla. DELETE borra todas las filas de una
tabla, pero no la definición de la tabla del diccionario. Esta es una diferencia con la sentencia
DROP TABLE, que elimina el contenido de la tabla y la definición de la misma.
Obsérvese que cada comando DELETE sólo opera sobre una relación. Si se desea borrar
tuplas de varias relaciones es necesario utilizar una orden DELETE por cada relación.
La consulta
La consulta
TRUNCATE
TRUNCATE TABLE nombre_tabla;
2.4. SELECT
La cláusula SELECT seguida de la descripción de lo que se desea ver, los nombres de las
columnas a seleccionar. Esta parte es obligatoria.
La cláusula FROM seguida de la especificación de las tablas de las que se han de obtener los
datos. Esta parte es obligatoria.
La cláusula WHERE seguida por un criterio de selección, una condición. Esta parte es
opcional.
La cláusula ORDER BY seguida por el criterio de ordenación. Esta parte es opcional.
Una primera aproximación a la sintaxis de la sentencia SELECT puede mostrarnos la
siguiente expresión:
Selección de columnas
Las columnas a seleccionar se enumeran sin más en la cláusula SELECT. Para seleccionar
todas las columnas use el carácter asterisco ' *'.
Cuando se consulta una base de datos, los nombres de las columnas se usan como
cabeceras de presentación. Si éste resulta demasiado largo, corto o críptico, puede
cambiarse con la misma sentencia SQL de consulta, creando un alias de columna
Cláusula FROM
La cláusula FROM define las tablas de las que se van a seleccionar las columnas.
Se puede añadir al nombre de las tablas el usuario propietario de las mismas de la forma
usuario.tabla. De esta manera podemos distinguir entre las tablas de un usuario y
otro.
Oracle siempre considera como prefijo el nombre del propietario de las tablas, aunque no se
lo indiquemos. De esta forma dos o más usuarios pueden tener tablas que se llamen igual sin
que surjan conflictos. Si quisiéramos acceder a las filas de la tabla departamento del usuario
epacheco, (además de tener privilegios de lectura sobre esa tabla) deberíamos escribir la
siguiente sentencia SQL:
También se puede asociar un alias a las tablas para abreviar los nombres de las tablas. Un
ejemplo se puede ver en la sentencia SQL siguiente:
La sentencia SELECT recupera todas las columnas o un subconjunto de ellas de una tabla.
Esto afecta a todas las filas de la tabla, a menos que especifiquemos una condición en la
cláusula WHERE.
Esta condición regresa todas las filas que cumplen dicha condicional. La complejidad del
criterio de búsqueda es prácticamente ilimitada, y en él se pueden combinar operadores de
diversos tipos con funciones de columnas, componiendo expresiones más o menos
complejas.
En este ejemplo, se utiliza el operador lógico OR en la cláusula WHERE para localizar los
empleados que son chofer o secretaria. La consulta y la tabla resultados se muestra a
continuación.
La condición BETWEEN indica los puntos extremos del rango, por lo cual el resultado incluirá
también a todos los empleados cuyo salario esté entre 2,500 y 5,000 pesos.
Cláusula ORDER BY
En general, las filas de la tabla resultados de una consulta SQL, no están ordenadas por
ningún criterio particular. Sin embargo podemos garantizar que los resultados de la consulta
queden ordenados utilizando la cláusula ORDER BY en la instrucción SELECT. La cláusula
ORDER BY está compuesta por una lista de identificadores de columna según los cuales hay
que ordenar los resultados, separados por comas.
SELECT temporada,
campeon,
ganador,
perdedor,
subcampeon
FROM campeonesNBA
ORDER BY temporada DESC
CREATE TABLE IF NOT EXISTS campeonesNBA (
temporada char(10) NOT NULL,
campeon char(30) NOT NULL,
subcampeon char(30) NOT NULL,
ganador int(11) NOT NULL,
perdedor int(11) NOT NULL,
mvp char(40) default NULL,
entrenador char(30) default NULL,
equipo char(30) default NULL,
PRIMARY KEY (temporada)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Volcar la base de datos para la tabla campeonesNBA
--
Cláusula DISTINCT
Cuando se realiza una consulta sobre una tabla en la que se extrae información de varias
columnas, puede ocurrir que, si no incluimos la/s columna/s que forman la clave principal,
obtengamos filas repetidas en la respuesta.
SELECT nombreEmpleado,
TRUNC(MONTHS_BETWEEN(SYSDATE, ingreso)/12) AS antiguedad
FROM empleado
ORDER BY antiguedad DESC, nombreEmpleado;
SELECT nombreEmpleado,
(YEAR(CURDATE()) - YEAR(ingreso))
- (RIGHT(CURDATE(), 5) < RIGHT(ingreso,5)) AS antiguedad
FROM empleado
ORDER BY antiguedad DESC, nombreEmpleado;
Expresión CASE
La expresión CASE permite utilizar la lógica IF-THEN-ELSE en sentencias SQL sin tener que
invocar procedimientos. Esta expresión se incluye a partir de la versión Oracle9i Server y
MySQL 5.
SELECT campos,
CASE expresión WHEN Comparación_1 THEN return_expresión_1
[ WHEN Comparación_2 THEN return_expresión_2
WHEN Comparación_n THEN return_expresión_n
ELSE else_expresión]
END
FROM tabla
Expresión es opcional. (ie: Comparación_1, Comparación_2, ... Comparación_n) deben ser
del mismo tipo y son evaluadas en el orden que se listan y regresara return_expresión de la
primera Comparación que regresa TRUE, si ninguna expresión es evaluada como TRUE se
regresa el valor declarado en el ELSE.
SELECT nombreEmpleado,
CASE
WHEN TRUNC(MONTHS_BETWEEN(SYSDATE, ingreso)/12) = 10 THEN
'Estimulo 10 años'
WHEN TRUNC(MONTHS_BETWEEN(SYSDATE, ingreso)/12) = 6 THEN 'Estimulo 6
años'
ELSE ''
END AS Estimulo
FROM empleado
ORDER BY nombreEmpleado
SELECT nombreEmpleado,
CASE
WHEN (YEAR(CURDATE()) - YEAR(ingreso))
- (RIGHT(CURDATE(), 5) < RIGHT(ingreso,5)) = 10 THEN 'Estimulo 10 años'
WHEN (YEAR(CURDATE()) - YEAR(ingreso))
- (RIGHT(CURDATE(), 5) < RIGHT(ingreso,5)) = 6 THEN 'Estimulo 6 años'
ELSE ''
END AS Estimulo
FROM empleado
ORDER BY nombreEmpleado
2.6. GROUP BY
La cláusula GROUP BY combina los registros con valores idénticos en la lista de campos
especificada en un único registro. Para cada registro se puede crear un valor agregado si se
incluye una función SQL agregada como por ejemplo SUM o COUNT, en la instrucción
SELECT. Su sintaxis es:
En la cláusula GROUP BY se colocan las columnas por las que vamos a agrupar. Y en la
cláusula HAVING filtra los registros una vez agrupados.
Cláusula Descripción
WHERE Filtra las filas
Los valores NULL en los campos de GROUP BY se agrupan y no se omiten. Sin embargo,
los valores NULL no se calculan en ninguna función de agregado SQL.
Se presenta un error debido a que cuando se utiliza GROUP BY, las columnas implicadas en
el SELECT y que no aparezcan en la cláusula GROUP BY deben tener una función de
agrupamiento. En otras palabras, la columna nombreEmpleado debe tener una
función de agrupamiento que actúe sobre ella ( MAX, MIN, SUM, COUNT, AVG). De no
ser posible, deberá aparecer dicha columna a la cláusula GROUP BY.
Ejemplo: Considere los alumnos inscritos en las materias que imparto durante Enero Junio
2011 en el ITSX La siguiente consulta obtiene el número de alumnos por género y materia.
USE alumnosITSX;
--
-- Volcar la base de datos para la tabla 'alumnosITSX'
--
-- Consulta
Ejemplo: Para ser campeón de la NBA hay que ganar cuatro partidos de siete. El
ejemplo muestra el número de juegos necesarios para ser campeón de 1946 a 2011.
--
-- Volcar la base de datos para la tabla campeonesNBA
--
HAVING
La cláusula HAVING se utiliza para especificar una condición, se comporta como WHERE,
con la diferencia que HAVING se aplica a grupos y no a tuplas (registros). Es decir HAVING
filtra los registros agrupados.
200 420,00
AUDI-A4
7 0
200 115,00
BMW-323
0 0
199
MALIBU 32,000
8
200
STRATUS-RT 97,500
5
200 185,00
CHRYSLER 300-C
5 0
200 150,00
FUSION
6 0
CUTLASS 199
25,000
EUROSPORT 2
200 135,00
CIVIC COUPE
6 0
200
CIVIC LS-4L 89,000
4
200
PLATINA 65,000
5
200
PLATINA 60,000
4
200
ALTIMA 92,000
3
200 179,00
ALTIMA
7 0
200 105,00
ALTIMA
5 0
200
PEUGEOT 206 XR 65,000
6
199
VW SEDAN 25,000
8
Calcule el promedio por año para todas las marcas a partir del 2003.
SELECT year,
TO_CHAR(AVG(precio),'999,999.22') media
FROM carros
GROUP BY year
HAVING year > 2002
ORDER BY year;
Todos los ejemplos ejecutados hasta ahora tienen una limitación significativa, es decir todas
las columnas incluidas en la tabla resultados provienen de una misma tabla.
La verdadera potencia del SQL se alcanza cuando combinamos el contenido de más de una
tabla. Suponga que desea conseguir una lista con los empleados y los departamentos para
los que trabajan. Esta información está repartida en las dos tablas empleado y
departamento.
Así, podríamos intentar una consulta que seleccionara el campo nombre de la tabla
empleado y el nombre del departamento. Y aquí surge el primer problema, ¿cómo
distinguimos entre dos columnas que llamándose igual, pertenecen a tablas distintas?
El uso de alias para las tablas incluidas en el FROM o en las columnas del SELECT
permite evitar la ambigüedad, el alias se separa por un espacio.
Reglas de Combinación:
Pueden combinarse tantas tablas como se desee.
El criterio de combinación puede estar formado por más de una pareja de columnas.
En la cláusula SELECT pueden citarse columnas de ambas tablas, condicionen o no la
combinación.
Si hay columnas con el mismo nombre en las distintas tablas, deben identificarse
especificando la tabla de procedencia o utilizando un alias de tabla.
Es necesario incluir una clasula WHERE que asocie las tablas mediante las correspondientes
llaves
Para lograr el resultado correcto necesitamos asociar un disco con el nombre del artista que
lo interpreta. Y esto se puede hacer si añadimos la condición en la cual idArtista el mismo
valor en la fila de la tabla disco que en la fila correspondiente de la tabla artista.
Ejemplo: Considere el siguiente Modelo físico relacional. Que descibe las relaciones
existentes para el torneo apertura 2009 del futbol Mexicano de 1era división.
Ejemplo: Generar un listado con los nombres de todos los jugadores del América que
jugaron como porteros durante el torneo Apertura 2009.
SELECT E.nombreEquipo,
J.nombre Nombre,
P.nombrePosicion Posicion
FROM equipo E, posicion P, jugador J
WHERE (J.idEquipo = E.idEquipo) AND ( J.idEquipo = 1)
AND (J.idPosicion = 1)
AND (P.idPosicion = J.idPosicion) AND (J.jj >0 )
ORDER BY J.nombre
2.8. Subconsultas
Una subconsulta es una instrucción SELECT anidada dentro de una sentencia SELECT,
SELECT...INTO, INSERT...INTO,DELETE, o UPDATE o dentro de otra subconsulta.
Una subconsulta, a su vez, puede contener otra subconsulta y así hasta un máximo de 16
niveles. Las particularidades de las subconsultas son:
Ejemplo: Nombres de los jugadores que han participado más que el promedio, equipo y
posición durante un torneo
Las columnas de la clausula WHERE de la consulta principal deben estar agrupadas por
paréntesis.
Las columnas encerradas entre paréntesis deben coincidir en número y tipo de datos con
los datos que devuelve la subconsulta.
Se puede utilizar una subconsulta para insertar valores en una tabla en el momento de la
creación de la misma.
Ejemplo: Crear una tabla con los datos de los jugadores que participan más que el promedio
y su desviación:
Especificar la columna de cada tabla que debe usarse para la combinación. Una condición de
combinación específica una clave externa de una tabla y su clave asociada en otra tabla.
Relación padre - hija.
Especificar un operador lógico (=, <>, etc.) para usarlo en los valores de comparación de las
columnas
Es una operación que combina registros de dos tablas en una base de datos relacional que
resulta en una nueva tabla (temporal) llamada tabla de JOIN. En el lenguaje de consulta SQL
hay dos tipos de JOIN: INNER y OUTER.
Como caso especial, una tabla (tabla base, vista o una tabla JOIN) puede realizar la
operación JOIN sobre ella misma. Esto se conoce como self-JOIN.
Ejemplo: Jugadores que participaron con el Cruz Azul durante el torneo Apertura 2011,
minutos jugados y partidos en los que participo (JJ)
Ejemplo: Jugadores por posición del Cruz Azul que participaron al menos un minuto en el
Apertura 2011
Left outer join produce el conjunto completo de registros de la tabla Equipos, con los
registros coincidentes (si están disponibles) en la tablaJugadores. Si no hay coincidencia, el
lado derecho contendrá NULL.
Note que la integridad referencial de la tabla Jugadores, no permite que los deportistas no
esten asignados a un Equipo.
Full outer join produce el conjunto de todos los registros en las tablas Departamento y
Empleado, con registros coincidentes en ambos lados cuando sea posible. Si no hay
coincidencia, el lado que falta contendrá null.
2.10. Vistas
Una vista es una tabla virtual cuyo contenido está definido por una consulta..
Una vista es sencillamente un objeto de base de datos que presenta datos de tablas. Se trata
de una consulta SQL que está permanentemente almacenada en la Base de datos y a la que
se le asigna un nombre, de modo que los resultados de la consulta almacenada son visibles
a través de la vista, y SQL permite acceder a estos resultados como si fueran de hecho una
tabla real en la base de datos.
Las tablas y las vistas comparten el mismo espacio de nombres en la base de datos, por lo
tanto, una base de datos no puede contener una tabla y una vista con el mismo nombre.
Las vistas suelen utilizarse para centrar, simplificar y personalizar la percepción de la base de
datos para cada usuario. Las vistas pueden emplearse como mecanismos de seguridad, que
permiten a los usuarios obtener acceso a los datos por medio de la vista, pero no les
conceden el permiso de obtener acceso directo a las tablas subyacentes de la vista. Las
vistas se pueden utilizar para realizar particiones de datos y para mejorar el rendimiento
cuando se copian, se importan y se exportan datos.
Mediante vistas es posible presentar datos de distintos servidores. Por ejemplo, para
combinar datos de distintos servidores remotos o en un servidor de múltiples procesadores,
cada uno de los cuales almacenan datos para una región distinta de su organización, puede
crear consultas distribuidas o paralelas aumentando la eficiencia de las consultas.
Ahora solo tenemos que hacer una consulta para obtener la vista correspondiente.
SELECT * FROM america;
Ejemplo: En el futbol se conoce como Caballo de Hierro a los deportistas que jugaron los 90
minutos en todos los partidos de un campeonato. Y Considerando que en el torneo de
Apertura 2011 se disputaron 17 fechas en la fase regular. La vista que define a estos
futbolistas es la siguiente.
Ahora solo tenemos que hacer una consulta para obtener la vista correspondiente.
Ejemplo. El cual modificará la vista caballo de hierro con los jugadores que no recibieron
amonestaciones.
Actualización de vistas
Para que la vista sea de solo lectura, usaremos la cláusula WITH READ ONLY (Oracle).
Observe que esta opción no soporta la cláusula ORDER BY
La cláusula CHECK OPTION evita que sean insertados o modificados registro que no
sean posteriormente incluidos en la vista mediante la sentencia WHERE.
Entidad Población
Tamaulipas 3,268,554
Sinaloa 2,767,761
Coahuila de
2,748,391
Zaragoza
Hidalgo 2,665,018
Sonora 2,662,480
Tabasco 2,238,603
Yucatán 1,955,577
Querétaro 1,827,937
Morelos 1,777,227
Durango 1,632,934
Zacatecas 1,490,668
Aguascalientes 1,213,445
Tlaxcala 1,169,936
Nayarit 1,084,979
Campeche 822,441
Colima 650,555
Con la cláusula CHECK OPTION cada vez que se trata de hacer una violación de la
condición dentro del WHERE obtendremos un error ORA-01402. Que error le regresa
MySQL
La sentencia DROP VIEW permite borrar una vista de la base de datos. Su sintaxis se
presenta a continuación:
El objetivo de la creación de usuarios es establecer una cuenta segura y útil, que tenga los
privilegios adecuados y los valores por defecto apropiados
Para acceder a los datos en una BD Oracle, se debe tener acceso a una cuenta en esa BD.
Cada cuenta debe tener una palabra clave o password asociada. Una cuenta en una BD
puede estar ligada con una cuenta de sistema operativo. Los passwords son fijados cuando
se crea un usuario y pueden ser alterados por el DBA o por el usuario mismo. La BD
almacena una versión encriptada del password en una tabla del diccionario llamada
dba_users. Si la cuenta en la BD está asociada a una cuenta del sistema operativo puede
evitarse la comprobación del password, dándose por válida la comprobación de la identidad
del usuario realizada por el SO.
Un nombre de usuario de 30 caracteres o menos, sin caracteres especiales y que inicie con
una letra.
Un método de autentificación, el más común es un password pero Oracle 10G soporta otros
métodos como biometric, certificado y autentificacion por medio de token.
Un tablespace de default, el cuál es donde el usuario va a poder crear sus objetos por defecto.
Ojo, no porque tenga un tablespace de default va a significar que puede crear objetos, o una
quota de espacio. Estos permisos se asignan de forma separada.
Un tablespace temporal, donde el usuario pueda crear sus objetos temporales y hacer ordenar
las consultas.
Un perfil de usuario, es decir las restricciones o privilegios de su cuenta.
Lo que puede hacer un usuario logeado a la base de datos depende de los permisos que
tenga asignados ya sea directamente ( GRANT) como sobre algún rol que tenga asignado
(CREATE ROLE).
El perfil que tenga asignado influye en los recursos del sistema de los que dispone un
usuario a la hora de ejecutar Oracle (CREATE PROFILE).
USE mysql;
Borrar usuarios
Tanto Oracle como MySQL permiten eliminar usuarios mediante la sentencia DROP USER,
con una sintaxis similar
CASCADE borra todos los objetos del esquema del usuario Oracle antes de borrar el
usuario. Si el esquema contiene tablas, Oracle borrará todos las tablas y automáticamente
eliminará cualquier restricción de integridad referencial referida a claves primarias o únicas
en otros esquemas
Comando GRANT
Se utiliza para crear usuarios y concederle privilegios. La sintaxis general del comando
GRANT es la siguiente:
Lo que está dentro de los paréntesis son opcionales, y los paréntesis no hay que ponerlos.
Es importantísimo que al final poner el ';' después de poner cada línea pulsar 'intro', pues si
hay algún error mysql nos indicará en que línea está el error.
Una vez creados los usuarios será necesario dotarlos de privilegios para que puedan realizar
operaciones específicas en la base de datos. Estos privilegios suelen clasificarse en
privilegios del sistema (operaciones que afectan a todo el sistema) y privilegios de objeto
(tablas, vistas, etc.). Para conocer los privilegios y su sintaxis es necesario consultar los
manuales de referencia de su SGBD.
Las sentencias GRANT y REVOKE permiten a los administradores de SGBD crear cuentas
de usuario, conceder y revocar derechos de esas cuentas.
La información sobre cuentas MySQL se almacena en las tablas de la base de datos mysql.
Los privilegios pueden ser concedidos en varios niveles:
Nivel global
Los privilegios globales se aplican a todas las bases de datos de un servidor dado. Estos
privilegios se almacenan en la tabla mysql.user.
GRANT ALL ON *.* y REVOKE ALL ON *.*
Conceden y revocan sólo privilegios globales.
Los privilegios de base de datos se aplican a todos los objetos en una base de datos dada.
Estos privilegios se almacenan en las tablas mysql.dby mysql.host.
GRANT ALL ON db_name.* y REVOKE ALL ON db_name.*
Otorgan y revocan sólo privilegios de base de datos.
Nivel de tabla
Los privilegios de tabla se aplican a todas las columnas de una tabla dada. Estos privilegios
se almacenan en la tabla mysql.tables_priv.
GRANT ALL ON db_name.tbl_name y REVOKE ALL ON db_name.tbl_name
Conceden y revocan únicamente privilegios de tabla.
Nivel de columna
Los privilegios de columna se aplican a una columna individual en una tabla dada. Estos
privilegios se almacenan en la tabla mysql.columns_priv. Cuando se usa REVOKE, se
deben especificar las mismas columnas que cuando se concedieron los privilegios.
Nivel de procedimiento
mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM usuario [, usuario] ...
Un rol es una colección de privilegios del sistema y de objetos que se otorgan a usuarios y a
otras tareas. Oracle dispone de muchos roles predeterminados mientras que MySQL no los
soporta.
El rol CONNECECT permite al usuario conectarse a la base de datos, crear tablas, vistas,
secuencias, sinónimos y otros objetos en el esquema asociado.
El rol RESOURCE permite al usuario utilizar los recursos típicos para la programación de
aplicaciones (clusters, disparadores, paquetes, funciones, etc.)
El rol DBA, típico de los administradores, permite al usuario realizar cualquier función de
base de datos y disponer de cualquier privilegio
Desde el punto de vista del usuario la interacción con la base de datos se lleva a cabo
mediante operaciones con significado en el modelo semántico (por ejemplo, una
transferencia de fondos en un banco).
Desde el punto de vista de la base de datos estas operaciones pueden estar formadas por
varias operaciones elementales (por ejemplo, quitar fondos de una cuenta y añadírselos a
otra)
Se llama Transacción a una colección de operaciones que forman una unidad lógica de
trabajo en una BD realizada por una o más sentencias SQL estrechamente relacionadas.
Una transacción es una unidad de la ejecución de un programa que lee y escribe datos a y
desde la Base de Datos. Puede consistir en varias operaciones de acceso a la base de
datos. Una Transacción está delimitada por instrucciones de inicio transacción y fin
transacción (la transacción consiste en todas las operaciones que se ejecutan entre inicio
transacción y fin transacción).
El concepto de transacción se desarrolló para atender los casos en los que el estado
resultante de la base de datos depende del éxito completo en una serie de operaciones. Este
concepto vio la luz debido a que varias operaciones sucesivas pueden modificar el resultado
de operaciones anteriores. En esos casos, si alguna operación produce un error, el estado
resultante puede ser indeterminado.
Para solucionar este problema, las transacciones agrupan una serie de operaciones de
manera que es posible garantizar la integridad del resultado final. O todas las operaciones se
ejecutan con éxito y se confirman (se escriben en la base de datos), o toda la transacción se
considera no realizada. La acción de cancelar una transacción se denomina deshacer la
transacción. Deshacer una transacción permite anular los cambios y recuperar el estado de
la base de datos previo a la transacción.
Por ejemplo, en una transacción bancaria automatizada, si un banco transfiere dinero desde
la cuenta A a la cuenta B, la retirada de fondos de A y el depósito en B deben producirse con
éxito para procesar los fondos correctamente, de lo contrario la transacción entera debe
cancelarse.
Éxito Fracaso
Una unidad lógica de trabajo debe exhibir cuatro propiedades, conocidas como propiedades
ACID (atomicidad, coherencia, aislamiento y durabilidad),
para ser calificada como transacción.
Coherencia: Asegura que los datos que observamos no cambian (por otros usuarios) hasta
que acabemos la Transacción.
Después de terminar una Transacción la Base de datos no viola ninguna de sus reglas:
valores obligatorios, claves únicas, etc.
Más aún, si varias transacciones, se ejecutan concurrentemente, los resultados deben ser los
mismos que si ellas se hubieran ejecutado secuencialmente. Esto se conoce como
seriabilidad debido a que su resultado es la capacidad de volver a cargar los datos iniciales y
reproducir una serie de transacciones para finalizar con los datos en el mismo estado en que
estaban después de realizar transacciones originales.
Durabilidad: Si el sistema falla no debe permitir que se pierdan las operaciones realizadas
por Tx ya confirmadas.
Inicio de transacción
Cuando no hay ya una transacción en progreso, y se ejecuta una sentencia LDD o LMD
(interactivamente o dentro de una aplicación)
Sentencia COMMIT
Una sentencia COMMIT marca el final de una transacción correcta, implícita o definida por el
usuario. COMMIT hace que todas las modificaciones efectuadas sobre los datos desde el
inicio de la transacción sean parte permanente de la base de datos, y además, libera los
recursos mantenidos por la conexión. Su sintaxis es la siguiente:
Sentencia SAVEPOINT
Esta sentencia permite crear un punto de restauración dentro de una transacción, es decir,
un punto al que podremos retroceder deshaciendo todo lo hecho deshaciendo todo lo hecho
desde él en adelante. Su sintaxis es la siguiente
SAVEPOINT nombrePuntoRestauración;
Sentencia ROLLBACK
Señala el final sin éxito de una transacción, elimina todas las modificaciones de datos
realizadas desde el inicio de la transacción y también libera los recursos que retiene la
transacción. Su sintaxis es la siguiente:
Los siguientes son los aspectos más importantes relacionados con el procesamiento de
transacciones:
Las transacciones especifican un nivel de aislamiento que define el grado en que se debe
aislar una transacción de las modificaciones de recursos o datos realizadas por otras
transacciones. Los niveles de aislamiento se describen en cuanto a los efectos secundarios
de la simultaneidad que se permiten, como las lecturas desfasadas o ficticias.
El nivel de aislamiento para una sesión SQL establece el comportamiento de los bloqueos
para las instrucciones SQL.
Lectura sucia. Las sentencias SELECT son ejecutadas sin realizar bloqueos, pero podría
usarse una versión anterior de un registro. Por lo tanto, las lecturas no son consistentes al
usar este nivel de aislamiento.
Lectura no repetible. Una transacción vuelve a leer datos que previamente había leído y
encuentra que han sido modificados o eliminados por una transacción cursada.
Lectura fantasma. Una transacción vuelve a ejecutar una consulta, devolviendo un conjunto
de registros que satisfacen una condición de búsqueda y encuentra que otros registro que
satisfacen la condición han sido insertadas por otra transacción cursada.
Los niveles de aislamiento SQL son definidos basados en si ellos permiten a cada uno de los
eventos definidos anteriormente. Es interesante notar que el estándar SQL no impone un
esquema de cierre específico o confiere por mandato comportamientos particulares, pero
más bien describe estos niveles de aislamiento en términos de estos teniendo muchos
mecanismos de cierre/coincidencia, que dependen del evento de lectura.
No repetible Fantasma
Sucia
Lectura no comprometida Sí Sí Sí
Lectura comprometida No Sí Sí
Lectura repetible No No Sí
Secuenciable No No No
Según el estándar SQL 1992, SQL Server y MySQL permiten todos estos niveles, Oracle
sólo permite la lectura comprometida y secuenciable. Los niveles se pueden establecer en
ambos para cada transacción. Sin embargo esto no es necesariamente cierto.
El estándar SQL trataba de establecer los niveles de aislamiento que permitirían a varios
grados de consistencia para querys ejecutadas en cada nivel de aislamiento. Las lecturas
repetibles "REPEATABLE READ" es el nivel de aislamiento que garantiza que un query un
resultado consistente.
Ejemplo básico en MySQL precio del dólar con respecto al peso 1995 al 2012.
Utilice el script BD0505.sql
Fecha Precio
2012/02/01 13.0077
2012/02/02 12.8900
2012/02/03 12.8038
2012/02/07 12.7120
2012/02/08 12.6472
2012/02/09 12.6833
2012/02/10 12.7200
Lecturas consistentes
Por default, las tablas InnoDB ejecutan un lectura consistente (consistent read). Esto
significa que cuando una sentencia SELECT es ejecutada, MySQL regresa los valores
presentes en la base de datos hasta la transacción más reciente que ha sido completada. Si
alguna transacción está en progreso, los cambios hechos por alguna sentencia INSERT o
UPDATE no serán reflejados. Sin embargo, existe una excepción: las transacciones abiertas
si pueden ver sus propios cambios. Para demostrar esto, necesitamos establecer dos
conexiones al servidor MySQL.
Observe el caso feliz de las transacciones. Sin violaciones de integridad referencial u otra
clase de errores
Cliente 1 Cliente 2
SET AUTOCOMMIT = 0 SET AUTOCOMMIT = 0
INSERT INTO dolar INSERT INTO dolar
VALUES('2012-02-01', 13.0077); VALUES('2012-02-07', 12.7120);
INSERT INTO dolar INSERT INTO dolar
VALUES('2012-02-02', 12.8900); VALUES('2012-02-08', 12.6472);
INSERT INTO dolar INSERT INTO dolar
VALUES('2012-02-03', 12.8038); VALUES('2012-02-09', 12.6833);
SELECT * FROM dolar WHERE INSERT INTO dolar
VALUES('2012-02-10', 12.7200);
fecha >= '2012/02/01'; SELECT * FROM dolar WHERE
fecha >= '2012/02/01';
Por defecto, MySQL se ejecuta con el modo autocommit activado. Esto significa que en
cuanto ejecute un comando que actualice (modifique) una tabla, MySQL almacena la
actualización en disco.
Si usa tablas transaccionales (como InnoDB o BDB), puede desactivar el modo autocommit
con el siguiente comando: SET AUTOCOMMIT = 0;
Tras deshabilitar el modo autocommit poniendo la variable AUTOCOMMIT a cero, debe usar
COMMIT para almacenar los cambios en disco o ROLLBACK si quiere ignorar los cambios
hechos desde el comienzo de la transacción.
START TRANSACTION
?
1 CREATE TABLE resumen (
2 year INTEGER,
3 mes INTEGER,
4 promedio DECIMAL(8,4),
5 PRIMARY KEY (year, mes)
6 )engine = innodb;
Cliente 1 Cliente 2
START
TRANSACTION;
SELECT @prom:=
AVG(precio) FROM
dolar
WHERE YEAR(fecha) =
2011 AND
MONTH(fecha) = 1;
INSERT INTO
resumen VALUES
(2011, 1, @prom);
SELECT * FROM
resumen;
COMMIT;
Los triggers constituyen una potente herramienta para mantener la integridad de la base de
datos, ya que pueden llevar a cabo cualquier acción que sea necesaria para el
mantenimiento de dicha integridad.
Los triggers pueden llamar a otros procedimientos y disparar otros triggers, pero no admiten
parámetros y no pueden ser invocados desde otros procedimientos.
La ejecución del disparador puede ser antes (before) o después (after) de llevar a cabo la
sentencia disparadora. Es posible especificar condiciones adicionales para la ejecución del
disparador (restrictores).
Dado que una sentencia disparadora puede afectar una o más filas de una tabla, es
necesario especificar si se quiere que el disparador se ejecute para cada una de las filas
afectadas o para el bloque en general.
?
1 CREATE TRIGGER NombreTrigger
2 BEFORE Insert ON NombreTabla ….
?
1 CREATE TRIGGER NombreTrigger
2 AFTER Insert ON NombreTabla
La sintaxis de un disparador es
1
CREATE [OR REPLACE] TRIGGER nombre
2
{BEFORE | AFTER | INSTEAD OF} // Temporalidad del Evento
3
{INSERT | DELETE | UPDATE [OF <lista de columnas>]} ON <tabla>
4
[FOR EACH ROW] //Granularidad
5
[WHEN condición]
6
[DECLARE //Declaración de variables
7 . . .]
8 BEGIN
9 cuerpo del trigger
10 [EXCEPTION
11 . . .]
END
12
Estas variables se utilizan del mismo modo que cualquier otra variable, con la salvedad de
que no es necesario declararlas, son de tipo %ROWTYPE y contienen una copia del registro
antes (OLD) y después (NEW) de la acción SQL (INSERT, UPDATE, DELETE) que ha
ejecutado el trigger. Utilizando esta variable podemos acceder a los datos que se están
insertando, actualizando o borrando.
La siguiente tabla resume los valores regresados por estos seudoregistros en diferentes
eventos
Seudoregistros
Evento
:OLD :NEW
ife CHAR(13),
);
nPrestamo NUMBER(5),
ife CHAR(13),
monto NUMBER(8) NOT NULL CHECK(monto > 0 AND monto <= 100000),
);
nPago NUMBER,
F_Pago DATE,
);
BEGIN
END;
INSERT INTO deudor VALUES (1234567890123,'Jorge Pérez García', 'Algun lugar del
mundo','9340664');
Al especificar el tipo de dato del parámetro no debemos especificar la longitud del tipo.
Los parámetros pueden ser de entrada (IN), de salida (OUT) o de entrada salida (IN OUT). El
valor por defecto es IN, y se toma ese valor en caso de que no especifiquemos nada.
MySQL
Modificando procedimientos almacenados en MySQL
MySQL no proporciona la habilidad de modificar el contenido de un procedimiento
almacenados. Dado que el comando ALTER PROCEDURE, solo puede modificar algunas
caracteristicas del procedimiento. Si es necesario cambiar el código SQL, La mejor
alternativa es borra dicho procedimiento.
Eliminando procedimientos almacenados en MySQL
Use el comando DROP PROCEDURE.
Sintaxis
Donde:
nombre: es el nombre del parámetro.
tipo: es cualquier tipo de dato de los provistos por MySQL.
5.3. Cursores
Los cursores se utilizan para manejar las sentencias SELECT. Un cursor está formado por
un conjunto de registros devueltos por una instrucción SQL del tipo SELECT. Desde un
punto de visto interno a la base de datos, los cursores son segmentos de memoria utilizados
para realizar operaciones con los registros devueltos tras ejecutar una sentencia SELECT.
Reciben el nombre de cursores implícitos, cuando la sentencia SELECT regresa solo un
registro. Para procesar instrucciones SELECT que devuelvan más de una fila, son
necesarios cursores explícitos combinados con una estructura de bloque.
Un cursor admite el uso de parámetros. Los parámetros deben declararse junto con el cursor.
Cursores implícitos
Se utilizan cuando la sentencia SELECT devuelve un solo registro. En cada cursor implicito
debe existir palabra reservada INTO.
Las variables que reciben los datos devueltos por el cursor tienen que contienen el mismo
tipo de dato que las columnas de la tabla.
Importante poner un delimitador nuevo, (suele ser ";") ya que si no se cambia toma el punto y
coma como delimitador, es decir que seria el final del procedimiento o función (Línea 2).
El comando DECLARE (línea 5) sirve para declarar variables locales y cursores. Solo
funcionan dentro de procedimientos inmediatamente del BEGIN.
DELIMITER $$
CREATE PROCEDURE dirige (IN _Pelicula CHAR(40),
OUT _Director CHAR(50))
BEGIN
DECLARE _Dirige CURSOR FOR
SELECT a.NombreActor
FROM actua ac, rol r, pelicula p, actor a
WHERE ac.idActor = a.idActor
AND ac.idPelicula = p.idPelicula
AND ac.idRol = r.idRol
AND r.NombreRol = 'Director'
AND p.NombrePelicula = _Pelicula;
OPEN _Dirige;
FETCH _Dirige INTO _Director;
CLOSE _Dirige;
END$$
DELIMITER ;
-- Llamada al procedimiento
CALL dirige('Contrabando', @Quien);
SELECT @Quien;
DECLARE
nombreDirector CHAR(50);
BEGIN
SELECT a.NombreActor INTO nombreDirector
FROM actua ac, rol r, pelicula p, actor a
WHERE ac.idActor = a.idActor
AND ac.idPelicula = p.idPelicula
AND ac.idRol = r.idRol
AND r.NombreRol = 'Director'
AND p.NombrePelicula = 'Contrabando';
dbms_output.put_line('El director de Contrabando es: ' ||
nombreDirector);
END;
Cursores explícitos:
Se utilizan cuando la sentencia SELECT puede devolver varios registros. También se pueden
utilizar en consultas que devuelvan un solo registro por razones de eficiencia con respecto a
los cursores implícitos, eficiencia que mejorará especialmente si el cursor explícito se tiene
que ejecutar varias veces dentro del bloque de código.
Un cursor explícito tiene que ser definido previamente como cualquier otra variable
cursores explícitos admiten el uso de parámetros. Los parámetros deben declararse junto
con el cursor.
Ejemplo: BD_Reloj_checador
Iniciaremos creando las siguientes tablas
ADO .NET responde a las siglas de Microsoft ActiveX Data Objects de la plataforma .NET, y
es una mejora evolutiva de la tecnología ADO. Realmente es una evolución más en las
tecnologías de acceso a la información.
En este capítulo se comparan las tecnologías ADO y ADO.NET, se describen y detallan los
objetos más importantes de la tecnología, el objeto DataSet y los proveedores de acceso a
datos. Se profundizará sobre el objeto DataSet describiendo los objetos DataTable,
DataColumn, etc. En cuanto a los proveedores de acceso a datos se describirá el proveedor
para SQL Server y el proveedor para OLE DB.
Requisitos de la plataforma ADO.NET
Para utilizar los proveedores de datos de SQL Server .NET y OLE DB .NET se necesita la
instalación de la versión 2.6 o superior de Microsoft Data Access Components. Para utilizar
ADO.NET en las aplicaciones se ha de incluir el namespace System.Data.
Los objetos más importantes de la tecnología ADO son el objeto RecordSet, el objeto
Command y el objeto Connection.