Anda di halaman 1dari 20

Bases de datos y sistemas de informacin

Tema 5: Lenguaje de acceso a bases de datos SQL


Contenido: 5.1 Introduccin 5.2 Sentencias DML 5.2.1 Select 5.2.2 Insert, Delete y Update 5.2.3 Recursividad 5.3 Sentencias DDL 5.4 Sentencias DAL 5.5 SQL y el lgebra relacional

Tema 5: El lenguajes de acceso a bases de datos SQL


5.1 Introduccin Este tema se dedica al estudio de lenguajes de acceso a base de datos relacional SQL. En realidad al hablar de SQL se est hablando de un lenguaje que contiene instrucciones de los 3 grupos de lenguajes de bases de datos de los que hablamos en el tema introductorio. Consultar y modificar datos. DML: Data Manipulation Language. Definir la base de datos. DDL: Data Definition Language Controlar el acceso (seguridad). DAL: Data Access Language

A diferencia de los estudiados en el tema de los lenguajes formales, stos no son formales e incluyen caractersticas no contempladas en aqullos. Algunos lenguajes: ISBL. Casi equivalente al lgebra relacional. QUEL. Lenguaje del clculo de tuplas. QBE. Lenguaje del clculo de dominios. SQL. Lenguaje relacional estndar de facto superconjunto del lgebra relacional. DATALOG: Lenguaje de acceso basado en programacin lgica. XQUERY: Lenguaje basado en el modelo jerrquico no relacional- usado para realizar consultas sobre XML. Este tema se dedica en particular a SQL, un estndar para bases de datos relacionales: ltima versin SQL1999 que se utiliza en multitud de SGBD . Nosotros vamos a fijarnos en la versiones de ORACLE (SQL*PLUS), Access y MySql

5.2 Sentencias DML


SQL contempla 4 sentencias de este tipo:

5-1

Bases de datos y sistemas de informacin

Select para consultas, (4.2.1) Insert para aadir filas (4.2.2) Delete para borrar filas (4.2.3) Update para modificar filas (4.2.4)

5.2.1 Sentencia SELECT


Forma bsica de SELECT

SELECT lista_de_atributos FROM lista de tablas WHERE condicin; Ej. Seleccionar los cdigos de proyecto en los que trabaja el empleado con dni4 SELECT codigoPr FROM distribucin WHERE dniEmp = 4; CodigoPr P1 P2 P3 P4 - La parte WHERE es opcional, pero la parte SELECT y FROM son obligatorias
Conjunto de datos seleccionados.

Ej. DNI trabajadores que trabajan entre 10 y 20 horas en algn proyecto SELECT DNIEmp FROM distribucin WHERE horas>=10 AND horas <=20; DNIEMP 1 2 4 1 3 5 4 5 Observacin Las consultas SQL trabajan con multiconjuntos en lugar de con conjuntos. Se permite repetir valores. Ventajas: - Eficiencia - El usuario puede querer los valores repetidos
5-2

Bases de datos y sistemas de informacin

- Funciones de agrupacin Para trabajar con conjuntos se utiliza DISTINCT SELECT DISTINCT DNIEmp FROM distribucin WHERE horas>=10 AND horas <=20; dniemp 1 2 4 3 5 - Para seleccionar todos los atributos se usa un * en lugar de lista de atributos SELECT * FROM programadores WHERE DNI=4; - Los atributos pueden ser expresiones SELECT DNIEmp, Horas/10 FROM distribucin; - En ORACLE existe una tabla especial vaca, DUAL que se puede usar para evaluar expresiones SELECT 3*4 FROM dual; 3*4 ---- --12 - En ORACLE se pueden renombrar las cabeceras de las columnas de la salida de una consulta: SELECT codigoPr Cdigo Proyecto, DniEmp DNI Empleado FROM distribucin;
Condiciones simples (WHERE)

Las condiciones pueden ser Conjunciones (AND) O disyunciones (OR) de coondiciones booleanas simples. Condiciones booleanas simples: - De comparacin entre valores =,>, >=, <, <=, <> - De similitud entre cadenas de caracteres columna LIKE patrn SELECT nombre FROM analistas

5-3

Bases de datos y sistemas de informacin

WHERE nombre LIKE Te% ; { empieza por Te } SELECT nombre FROM analistas WHERE nombre LIKE _ _ a% ; { El tercer carcter es una a } - comprobacin de NULL columna IS NULL columna IS NOT NULL SELECT * FROM analistas WHERE telfono IS NULL; - Pertenencia a conjuntos de valores columna IN (v1,v2,....,vn) Consultas de varias tablas Nombres y direcciones de los programadores que trabajan en el proyecto P2 SELECT nombre, direccin FROM programadores, distribucin, WHERE DNIEmp = DNI AND CodigoPr = P2; Nombres y direcciones de los empleados que son a la vez programadores y analistas SELECT analistas.nombre, analistas.direccin FROM analistas, programadores WHERE analistas.DNI = programadores.DNI; Nombre Programadores que trabajan en algn proyecto que esta dirigido por un programador. SELECT Trabajador.nombre, Trabajador.direccin FROM programadores Trabajador, distribucin, programadores Director, proyectos WHERE distribucin.DNIEmp = Trabajador.DNI AND proyectos.codigo = distribucin.codigoPr AND Director.DNI = proyectos.DNIDir;
Subconsultas. Operaciones entre conjuntos.

- subconsultas - operaciones entre conjuntos - EXISTS Ej: SELECT EmpDNI FROM distribucin WHERE horas IN (10,20,30)
5-4

Bases de datos y sistemas de informacin

Las consultas se pueden ver como conjuntos. Ej Proyectos que trabaja o dirige el empleado de DNI 4 SELECT DISTINCT proyectos.Codigo FROM proyectos,distribucin WHERE proyectos.DNIDIr = 4 OR ( distribucin.codigoPr = proyectos.codigo AND distribucin.DNIEmp = 4) Otra: SELECT DISTINCT proyectos.codigo FROM proyectos WHERE proyectos.DNIDIr = 4 OR proyectos.codigo IN ( SELECT distribucin.codigoPr FROM distribucin WHERE distribucin.DNIEmp = 4)

Subconsulta

Si la subconsulta devuelve un slo valor se puede tratar como si fuera un valor simple en lugar de un conjunto. Proyectos de Jacinto SELECT * FROM distribucin WHERE distribucin.DNIEmp = (SELECT DNI FROM programadores WHERE Nombre=Jacinto); Si hubiera dos Jacintos --> ERROR!

- Funciones de Conjunto: UNION, INTERSECT y MINUS Nombres de todos los empleados: Con lo que hemos visto hasta ahora NO se puede (SELECT Nombre FROM programadores) UNION (SELECT Nombre FROM analistas)

Obs - No aparecen repetidos, si se quieren repetidos habra que poner UNION ALL Se requiere:

5-5

Bases de datos y sistemas de informacin

- Los selects necesitan tener el mismo nmero de columnas - Las columnas tienen que ser del mismo tipo

EXISTS, NOT EXISTS En una condicin (WHERE) - EXISTS subsonsulta: Cierto si la subconsulta devuelve alguna fila Falso e.o.c. - Not Exists subconsulta: Cierto si la consulta no devuelve ningn valor Falso e.o.c. Programadores que trabajan ms de 10 horas en algn proyecto SELECT Nombre FROM programadores WHERE exists (SELECT CodigoPr FROM distribucin WHERE distribucin.DNIEmp = programadores.DNI AND Distribucin.horas > 10) Programadores que no trabajan en ningn proyecto SELECT Nombre FROM programadores WHERE not exists (SELECT CodigoPr FROM distribucin WHERE distribucin.DNIEmp = programadores.DNI)
Clusula ORDER BY

SELECT * FROM distribucin WHERE horas > 10 ORDER BY horas CodigoPr DNIEmp Horas P4 4 20 P3 5 30 P3 3 40 P1 2 40 SELECT * FROM distribucin WHERE horas > 10 ORDER BY horas desc, CodigoPr CodigoPr DNIEmp Horas P1 2 40 P3 3 40 P3 5 30
5-6

Bases de datos y sistemas de informacin

P4 SUM AVG MAX MIN COUNT

20

Clusula GROUP BY

SELECT COUNT(*) FROM programadores 4 SELECT COUNT(CodigoPr) FROM distribucin 10 SELECT COUNT(DISTINCT codigoPr) FROM distribucin 4 SELECT SUM(horas) FROM distribucin SUM(horas) -- --- - - - - 180 SELECT CodigoPr, SUM(horas) FROM distribucin GROUP BY CodigoPr Trabajadores que trabajan un total de mas de 20 horas SELECT DNIEMP, SUM(horas) FROM distribucin GROUP BY DNIEmp HAVING SUM(horas)>20

Nombres y total de horas de los programadores que trabajan en mas de 2 proyectos diferentes.
SELECT programadores.Nombre, distribucin.DNIEMp, SUM(distribucin.horas) FROM distribucin, programadores WHERE programadores.DNI = distribucin.DNIEMp GROUP BY distribucin.DNIEmp, programadores.nombre HAVING COUNT ((distribucin.CdigoPr)) >= 2 ORDER BY SUM(distribucin.horas)

Vistas Creacin de tablas virtuales. No existen en la realidad sino que se refieren a consultas en otras tablas Nombres de los programadores que trabajan ms horas que la media

5-7

Bases de datos y sistemas de informacin

CREATE VIEW DNIHoras(DNI, horas) AS SELECT DNIEMp, SUM(horas) FROM distribucin GROUP BY DNIEMP; CREATE VIEW NombreHoras(nombre,horas) AS SELECT programadores.nombre, DNIHoras.horas FROM programadores, distribucin WHERE programadores.Dni = distribucin.DNIEmp; CREATE VIEW MediaHoras(media) AS SELECT AVG(horas) FROM NombreHoras; SELECT N.Nombre FROM NombreHoras WHERE horas > (SELECT media FROM MediaHoras);

Condiciones con ANY, ALL Se trata de condiciones que se pueden utilizar en las secciones where y/o having y cuya sintaxis es de la forma Expr op ALL (subconsulta) O Expr op ANY (subconsulta) El operador puedes ser cualquier operador relacional: >, <, >=, <=, =, <> La condicin se cumple si se verifica la relacin entre el valor de la expresin Expr y todos (ALL) o algn (ANY) de los valores de la subconsultas. Ejemplo: DNI del empleado (o empleados si son varios) que trabaja(n) ms horas:
CREATE VIEW DNIHoras(DNI, horas) AS SELECT DNIEMp, SUM(horas) FROM distribucin GROUP BY DNIEMP; CREATE view RESULTADO(DNI,horas) AS Select * from DNIHORAS Where horas >=all (select horas from DNIHoras);

Otra forma de hacer la vista resultado:


CREATE view RESULTADO(DNI,horas) AS Select * from DNIHORAS Where horas = (select max(horas) from DNIHoras);

5-8

Bases de datos y sistemas de informacin

Observacin Las funciones de agrupacin se pueden aplicar a subconsultas siempre y cuando estas tengan una sola expresin en su parte select y sta sea de tipo numrico. Condiciones con DECODE, IIF, CASE DECODE, IIF y CASE son distintos nombres para sentencias de tipo condicional. Ejemplo: Obtener un listado con el nombre y si trabaja menos de 8 horas la palabra 'poco' y en otro caso la palabra 'mucho. La segunda columna debe llamarse Trabaja select nombre, if(horas<8,'poco','mucho') 'Trabaja' from DNIHorasNombre; Ejemplo: Queremos un listado con el formato Analistas 2 Programadores 3

Select sum(If(esAnalista,1,0)) Analistas, sum(if(esProgramador,1,0)) Programadores From empleados;

Sentencia JOIN (Reunin de relaciones) - Reuniones condicionales y reuniones naturales - Varias formas de reunin externa Estas operaciones adicionales se usan a menudo como subconsultas dentro de la clusula from. - Interna: en el resultado slo participan tuplas que satisfacen la condicin - Externa: tambin participan las tuplas que no satisfacen la condicin
Reunin interna (inner join)

prstamo inner join prestatario on prstamo.nmero-prstamo = prestatario.nmero-prstamo Relaciones: prstamo nombre-sucursal nmero-prstamo importe Centro P-170 600.000 Moralzarzal P-230 800.000 Navacerrada P-260 340.000 prestatario nombre-cliente nmero-prstamo Santos P-170

5-9

Bases de datos y sistemas de informacin

Gmez Lpez Resultado: nombresucursal Centro Moralzarzal nmeroprstamo P-170 P-230

P-230 P-155

importe

nombrecliente 600.000 Santos 800.000 Gmez

nmeroprstamo P-170 P-230

- Reunin zeta (|><|) de las relaciones prstamo y prestatario, donde la condicin de reunin es prstamo.nmero-prstamo = prestatario.nmero-prstamo. - Atributos del resultado: Atributos del lado izquierdo, Atributos del lado derecho. - El atributo nmero-prstamo aparece dos veces. - Renombramiento: clusula as prstamo inner join prestatario on prstamo.nmero-prstamo = prestatario.nmero-prstamo as ps (sucursal, nmero-prstamo, importe, cliente, nmero-prstamo-cliente)
Reunin externa por la izquierda (left outer join)

prstamo left outer join prestatario on prstamo.nmero-prstamo = prestatario.nmero-prstamo Clculo: 1- Reunin interna, como se vio anteriormente. 2- Para cada tupla t de la unin interna, perteneciente a la relacin del lado izquierdo (prstamo) que no encaje con ninguna tupla de la relacin del lado derecho (prestatario), se aade al resultado de la reunin, una tupla r, con nulos por la derecha. nombresucursal Centro Moralzarzal Navacerrada nmeroprstamo P-170 P-230 P-260 importe 600.000 800.000 340.000 nombre-cliente Santos Gmez null nmeroprstamo P-170 P-230 null

Reunin externa por la derecha (right outer join)

prstamo right outer join prestatario on prstamo.nmero-prstamo = prestatario.nmero-prstamo

5-10

Bases de datos y sistemas de informacin

Reunin externa completa (full outer join)

prstamo full outer join prestatario on prstamo.nmero-prstamo = prestatario.nmero-prstamo nombre-sucursal Centro Moralzarzal Navacerrada null nmeroprstamo P-170 P-230 P-260 null importe 600.000 800.000 340.000 null nombre-cliente Santos Gmez null Lpez nmeroprstamo P-170 P-230 null P-155

Reunin natural (natural join)

prstamo natural inner join prestatario Resultado: nombre-sucursal Centro Moralzarzal nmero-prstamo P-170 P-230 importe 600.000 800.000 nombrecliente Santos Gmez

- Es similar a inner join ... on ... cuando la condicin del on es una conjuncin de igualdades de los atributos comunes - Diferencia: el atributo nmero-prstamo aparece slo una vez. - Es equivalente cuando se hace la proyeccin sobre el conjunto (sin elementos repetidos) de todos los atributos de ambas relaciones. - Se aplica a todos los tipos de reuniones. - La condicin using se usa en las reuniones naturales para especificar los atributos comunes sobre los que se realiza la reunin.
Resumen

Tipos de reunin inner join left outer join right outer join full outer join

Condiciones de reunin natural on <predicado> using (A1,...,An)

5.2.2 Sentencias INSERT, DELETE y UPDATE

5-11

Bases de datos y sistemas de informacin

Estas sentencias permiten la modificacin de datos. Con INSERT se agregan tuplas a las tablas, con DELETE se borran y con UPDATE se cambian los valores de tuplas existentes. Sentencia INSERT La sintaxis bsica de la sentencia INSERT permite insertar una tupla de valores en una tabla. La tupla de valores se escribe como una lista de valores (que deben coincidir con el tipo de los campos de la tabla en el orden que estn definidos) separada por comas y encerrada entre parntesis. La sintaxis bsica es:
INSERT INTO NombreTabla VALUES NuevaTupla

Ej. Insertar programador


INSERT INTO Programadores VALUES (8,Pepe Prez,Pico, 8, 918888888);

Tambin es posible obtener los datos mediante una consulta SELECT que acte como proveedor de datos. Por ejemplo, en el caso ms simple:
INSERT INTO Programadores SELECT 8,Pepe Prez,Pico, 8, 918888888;

Otro ejemplo ms general obtendra datos de otra tabla:


INSERT INTO Programadores SELECT * FROM Programadores nuevos;

Sentencia DELETE A continuacin se muestra la sintaxis de la clusula DELETE:


DELETE * FROM NombreTabla WHERE Condicin;

Con esta sentencia se borran las tuplas de la tabla NombreTabla que cumplan la condicin Condicin. La parte WHERE es opcional y, si no se especifica, se borran todas las tuplas de la tabla (lo cual es equivalente a WHERE TRUE). Ej. Borrar programador
DELETE * FROM Programadores WHERE DNI=8;

Si se emite la siguiente consulta se borraran todos los programadores de la tabla Programadores (al menos, todos aquellos cuya eliminacin no viole las restricciones de integridad referencial).
DELETE * FROM Programadores;

La clusula WHERE admite consultas anidadas, como en el siguiente ejemplo, que borra todos los programadores cuya direccin se encuentre en la tabla Direcciones a borrar. Ej. Borrar programadores segn Direcciones a borrar
DELETE * FROM Programadores

5-12

Bases de datos y sistemas de informacin WHERE Programadores.Direccin IN (SELECT Direccin FROM [Direcciones a borrar]);

Si es necesario borrar tuplas segn los valores simultneos de dos campos, cabra escribir una consulta basada en la idea del ejemplo anterior como la siguiente:
DELETE * FROM Programadores WHERE (Programadores.Nombre, Programadores.Direccin) IN (SELECT Nombre, Direccin FROM [Nombres y direcciones a borrar]);

Sin embargo, muchos SGBD no permite tuplas en la condicin WHERE (la norma SQL:1999 s lo especifica). Hay que reescribir la consulta haciendo uso de la clusula EXISTS. Ej. Borrar programadores segn Nombres y direcciones a borrar
DELETE * FROM Programadores WHERE EXISTS (SELECT * FROM [Nombres y direcciones a borrar] WHERE Programadores.Nombre = [Nombres y direcciones a borrar].Nombre AND Programadores.Direccin = [Nombres y direcciones a borrar].Direccin);

Sentencia UPDATE La sentencia UPDATE permite modificar los valores de los atributos de las tuplas que cumplan una determinada condicin.
UPDATE tabla SET atributo1 = valor1, ...., atributon = valorn WHERE condicin;

La parte WHERE es opcional y, si no se especifica, se modifican todas las tuplas de la tabla (lo cual es equivalente a WHERE TRUE). En el siguiente ejemplo se modifica la direccin del programador cuyo DNI es 8. Ej. Modificar programador UPDATE Programadores SET Direccin = 'Puerta del Sol' WHERE DNI = 8; Al igual que la sentencia DELETE, en la clusula WHERE se admiten consultas anidadas, como en el siguiente ejemplo, que modifica todos los programadores cuya especialidad se encuentre en la tabla Nombres y direcciones a modificar. Ej. Modificar programadores segn Nombres y direcciones a modificar
UPDATE Programadores SET Salario = Salario*1.1 WHERE EXISTS (SELECT * FROM [Nombres y direcciones a modificar] WHERE Programadores.Nombre = [Nombres y direcciones a modificar].Nombre AND Programadores.Direccin = [Nombres y direcciones a modificar].Direccin);

5-13

Bases de datos y sistemas de informacin

5.2.3 Recursividad
Recursividad en SQL:1999

La norma SQL:1999 soporta una forma limitada de recursividad usando la clusula with recursive. En particular permite slo recursividad lineal (slo una relacin recursiva en la clusula FROM). Adems, la estratificacin se requiere no slo para la negacin sino tambin para las agregaciones [GUW02]. Ej: Dada la relacin jefes(empl, jefe), encontrar cada par (X,Y) tal que X tenga como jefe directo a Y. En este ejemplo se parte del empleado 2.
with recursive empleados(empl, jefe) as ( select empl, jefe from jefes where empl=2 union select empleados.empl, empleados.jefe from jefes, empleados where jefes.jefe=empleados.empl ) select * from empleados

Para la siguiente instancia de la tabla jefes:

jefes empl jefe 1 0 2 1 7 1 9 1 3 2 4 2 8 7 10 9 12 9 11 10 5 4 6 4 create table jefes(empl int, jefe int); insert into jefes values(1,0);

5-14

Bases de datos y sistemas de informacin

insert into jefes values(2,1); insert into jefes values(7,1); insert into jefes values(9,1); insert into jefes values(3,2); insert into jefes values(4,2); insert into jefes values(8,7); insert into jefes values(10,9); insert into jefes values(12,9); insert into jefes values(11,10); insert into jefes values(5,4); insert into jefes values(6,4); El resultado de la consulta es: empl jefe 2 1 3 2 4 2 5 4 6 4 Debido a la primera limitacin indicada, no es posible obtener todos los jefes, tanto directos como indirectos con una consulta como: with empleados(empl, jefe) as ( select root.empl, root.jefe from jefes root where empl=2 union all select sub.empl, sub.jefe from empleados sub, empleados super where sub.jefe = super.empl
)

select * from empleados Ntese el uso de dos relaciones recursivas en la clusula FROM. El resultado debera ser: empl jefe 2 1 3 2 3 1 4 2 4 1 5 4 5 2 5 1

5-15

Bases de datos y sistemas de informacin

6 6 6

4 2 1

Las vistas deben satisfacer las condiciones descritas a continuacin. Una vista V se puede considerar definida por una expresin EV que, dado un conjunto de hechos I, devuelve un conjunto de hechos EV (I) para la relacin V. Dado un conjunto de vistas R (definidas en cualquier lenguaje), se puede definir una funcin inferir (R,I) que devuelva I U V R EV(I). Una vista V es montona si, dado cualquier par de conjuntos de hechos I1 e I2, tales que I1 I2, entonces EV (I1) EV (I2), donde EV es la expresin utilizada para definir V. Anlogamente, se dice que la funcin inferir es montona si I1 I2 => inferir (R,I1) inferir (R,I2) Si inferir es montona, dado un conjunto de hechos I0 que es un subconjunto de hechos verdaderos, se puede asegurar que todos los hechos del conjunto inferir (R,I0) son verdaderos. Las expresiones del lgebra relacional que utilizan los operadores , , x, |x|, , o son montonas. Las vistas recursivas se pueden definir utilizando dichas expresiones. Sin embargo, las expresiones relacionales que utilizan el operador no son montonas. Ej: sean jefe1 y jefe2 relaciones con el mismo esquema que la relacin jefe. Dadas I1 = { jefe1 (Arteaga, Benzoaga), jefe1 (Benzoaga, Erejalde), jefe2 (Arteaga, Benzoaga)} I2 = { jefe1 (Arteaga, Benzoaga), jefe1 (Benzoaga, Erejalde), jefe2 (Arteaga, Benzoaga), jefe2 (Benzoaga, Erejalde)} Considrese la expresin jefe1 jefe2. El resultado de la expresin I1 anterior es (Benzoaga,Erejalde), mientras que el resultado de la expresin I2 es la relacin vaca. Se cumple que I1 I2. Segn la definicin, la expresin no es montona. Las expresiones que se definen utilizando los operadores de agrupacin del lgebra relacional extendida tampoco son montonas.
Recursividad en Oracle

Oracle tambin proporciona recursividad lineal en las denominadas consultas jerrquicas. Sirven fundamentalmente para realizar recorridos en profundidad de rboles. Las consultas jerrquicas permiten seleccionar filas en orden jerrquico usando las clusulas: START WITH START_CONDITION CONNECT BY CONNECT_CONDITION La clusula START WITH permite especificar las filas que son races en la jerarqua (puede haber ms de una raz).

5-16

Bases de datos y sistemas de informacin

La clusula CONNECT BY especifica la relacin que existe entre las filas padre e hijo en la jerarqua. Se usa el operador unario PRIOR para obtener la fila padre de la fila actual. Se puede usar tambin la clusula WHERE para restringir las filas devueltas por la consulta. Oracle ejecuta las consultas jerrquicas siguiendo los pasos siguientes: Selecciona las filas raz de la jerarqua, que son las que cumplen START_CONDITION. Selecciona las filas hijo de cada fila raz. Las filas hijo son aquellas filas de la tabla que satisfacen la condicin CONNECT_CONDITION, con respecto a alguna de las filas raz. Pueden ser condiciones complejas pero no pueden incluir subconsultas. Selecciona generaciones sucesivas de filas hijo. Oracle selecciona en primer lugar los hijos de las filas del apartado 2, y despus los hijos de estos hijos y as sucesivamente (recorre la jerarqua en profundidad). Si la consulta contiene una clusula WHERE, se eliminan todas las filas de la jerarqua que no satisfacen la condicin del WHERE. La condicin se evala para cada fila de la tabla de manera individual y no se eliminan los hijos de una fila que no cumpla la condicin del WHERE. select empl, jefe from jefes connect by prior empl = jefe start with empl = 1; Para conocer el nivel de la jerarqua se dispone automticamente de la pseudocolumna level. Con ella se puede conocer fcilmente el nivel en la jerarqua de cada empleado: select empl, jefe, level from jefes connect by prior empl = jefe start with empl = 1;

5.3 Sentencias DDL


Es parte del lenguaje SQL, pero ya lo hemos estudiado en el tema 3, por lo que no lo repetimos aqu.

5.4 Sentencias DAL


Permiten especificar directivas de control de acceso a los recursos. El control de acceso se especifica por usuario: del sistema operativo o del SGBD. Recursos y privilegios Recursos: Tablas, campos, vistas y dominios. Privilegios: Derechos de acceso de un usuario a los recursos. Los privilegios estn caracterizados por: - El recurso al que se refiere.
5-17

Bases de datos y sistemas de informacin

- El usuario que concede el privilegio. - El usuario que lo recibe. - La accin permitida sobre el recurso. - Si el privilegio se puede transmitir por el usuario al que se le ha concedido. Usuario administrador de la base de datos: _system. Privilegios: - insert - update - delete - select - references. Ej: Integridad referencial. - usage. Aplicado sobre los dominios, permiten usar dominios en la definicin del esquema de una tabla. Comandos para la concesin y revocacin de privilegios
Concesin

Sintaxis general: grant Privilegio on Recurso to Usuarios [with grant option] Concede el privilegio Privilegio sobre el recurso Recurso a los usuarios Usuarios, permitiendo a su vez que los usuarios Usuarios puedan propagarlo a otros. En lugar de Privilegio se puede especificar all privileges. Ej: grant select on Distribucin to UsuarioInvitado. grant Privilegio on Recurso to Usuarios [with grant option]
Revocacin

Sintaxis general: revoke Privilegio on Recurso from Usuarios [restrict|cascade] Privilegio puede ser cualquiera de los listados anteriormente ms grant option. restrict|cascade se refieren a la revocacin de los permisos propagados a otros usuarios. Papeles (Oracle) Un papel es una coleccin de permisos. Los papeles se asignan a usuarios. CREATE ROLE NombrePapel GRANT SELECT ON Distribucin TO NombrePapel

5.5 SQL y el lgebra relacional


- Unin T = RS INSERT INTO T (SELECT * FROM R) UNION (SELECT * FROM S); De otra forma: INSERT INTO T SELECT * FROM R; INSERT INTO T SELECT * FROM S;

5-18

Bases de datos y sistemas de informacin

- Diferencia de conjuntos T =RS En primer lugar se hace la unin R S , y despus: DELETE FROM T WHERE (A1,...,An) IN (SELECT * FROM S); - Interseccin T = R S = R (R S ) - Producto cartesiano T = R1 L Rk INSERT INTO T SELECT * FROM R1,..., Rk; - Proyeccin T = i1 ,K,ik ( R ) INSERT INTO T SELECT R.Ai1,..., R.Aik FROM R; - Seleccin T = ' ( R) INSERT INTO T SELECT * FROM R WHERE ;

donde es una expresin equivalente a , en la que se sustituye los operadores lgicos (AND, ...) por los correspondientes del lgebra relacional ( , K ).

- Reunin zeta (|><|) T = R >< ' S INSERT INTO T SELECT * FROM R INNER JOIN S ON ; - Equirreunin (|><|) Igual que la reunin zeta, pero slo con la relacin de igualdad en . - SELECT SELECT Ri1.A1,..., Rir.Ar FROM R1,..., Rk WHERE ; Es equivalente a la expresin del lgebra relacional: Ri 1 . A1 ,K,Rir . Ar ( ' ( R1 L Rk )) Conclusin: no hay que olvidar que lo que se expresa en SQL son operaciones del lgebra relacional. Adems en SQL se pueden expresar consultas que no resultan expresables en lgebra relacional: las consultas que utilizan operaciones de agregacin y las consultas jerrquicas.

5-19

Bases de datos y sistemas de informacin

5-20

Anda mungkin juga menyukai