Diseño de Bases de Datos y Seguridad en la Información Apuntes Oracle y SQL*Plus ',6(f2'(%$6(6'('$726<6(*85,'$'(1/$,1)250$&,Ï1 &8562 $3817(63$5$/$635È&7,&$6HU&8$75,0(675( Para cualquier consulta a la sintaxis de las órdenes SQL o SQL*PLUS puede consultarse cualquier libro de ORACLE, o los manuales gratuitos en pdf o en línea accesibles a partir de la página de la asignatura (en http://kybele.escet.urjc.es/). Para las prácticas voluntarias del primer parcial se utilizará el servidor relacional de ORACLE. El programa cliente que se utilizará será SQL*PLUS. SQL*PLUS admite las sentencias SQL propias de ORACLE más otras propias para el formateo de la salida, etc. Fundamentalmente se utilizarán los siguientes comandos de SQL*PLUS: • 3$66:25': Para cambiar el password del usuario (también puede cambiarse mediante ALTER USER). • /: ejecuta el comando SQL o PL/SQL almacenado en el buffer. • RUN: lista y ejecuta el comando SQL o PL/SQL almacenado en el buffer. • HOST comando: ejecuta un comando del SO. • LIST: lista el contenido del buffer. • @ o 67$57 fichero: ejecuta un fichero • EDIT [fichero]: edita el fichero, o bien la sentencia almacenada en el buffer. Para poder utilizar esta opción en el laboratorio el fichero auxiliar utilizado por SQL*PLUS debe estar en un directorio en el que el usuario tenga permiso de escritura. Puede cambiar el directorio por defecto en Opciones/Editfile. • DEFINE [variable[=valor]]: define o muestra el valor de variables • SPOOL [fichero|OFF]: manda la salida a fichero o deja de hacerlo. • '(6&5,%( objeto: describe una tabla, vista o sinónimo. Existen otras instrucciones útiles de edición y carga de ficheros como APPEND, CHANGE, GET, SAVE. La forma de trabajar será utilizar un editor de texto para guardar las instrucciones en un VFULSW(creación de las tablas, inserción de datos, consultas, etc.). Es conveniente incluir en el VFULSW antes de cada creación de tabla un borrado de la misma mediante la instrucción DROP TABLE tabla [CASCADE CONSTRAINTS]. De esta forma nos aseguramos que la tabla no existe, evitando errores. Mediante la opción CASCADE CONSTRAINTS nos aseguramos que la tabla se borra aunque existan dependencias entre tablas que impedirían su borrado. Aunque el lenguaje SQL admitido por ORACLE es muy similar al estándar visto en clase (SQL:1999), existen algunas diferencias que se irán descubriendo en el desarrollo de las prácticas. Las más importantes son los tipos de datos, las opciones de borrado y modificación de claves ajenas, y la creación de dominios (ORACLE no admite dominios, los cuales deberán simularse mediante CHECKs o tablas auxiliares). ORACLE admite una gran variedad de tipos de datos. Los más importantes, que serán los que fundamentalmente se utilicen en las prácticas son: • CHAR (tamaño): cadenas de caracteres de longitud fija. • VARCHAR2 (tamaño): cadenas de caracteres de longitud variable, hasta un máximo “tamaño”. • NUMBER (l,d): número de un máximo de “l” dígitos, “d” de los cuales son decimales. Grupo Kybele, http://kybele.escet.urjc.es/ Pág. 1 Diseño de Bases de Datos y Seguridad en la Información Apuntes Oracle y SQL*Plus • DATE: fecha. Probablemente sea necesario utilizar funciones de formateo de tipos, tales como to_date o to_char (véase más adelante en este mismo documento). Aunque en los manuales podrá consultarse la sintaxis completa del SQL, la sintaxis básica de la instrucción de creación de tablas es la siguiente: CREATE TABLE nombre ( columna1 tipodatos [DEFAULT valorpordefecto] [restricciones de columna1], ... columnaN tipodatos [DEFAULT valorpordefecto] [restricciones de columnaN], [restricción de tabla], ... [restricción de tabla]); Las restricciones de columna son: [CONSTRAINT nombrerestricción] -> [NOT] NULL UNIQUE/PRIMARY KEY REFERENCES tabla [(columna)] [ON DELETE CASCADE/SET NULL] CHECK (condición) [CONSTRAINT nombrerestricción] -> UNIQUE/PRIMARY KEY (columnas) FOREIGN KEY (columnas) REFERENCES tabla [(columnas)] [ON DELETE CASCADE/SET NULL] CHECK (condición) Como vemos en la sintaxis, no es obligatorio darle un nombre a las restricciones, aunque puede resultar conveniente para poder identificar posibles errores en el caso de las inserciones rechazadas por ORACLE. ORACLE sólo admite opciones en el caso de borrado de claves ajenas (a diferencia del estándar). Las únicas opciones admitidas son borrado en cascada, con puesta a nulos y restringido (que es la opción por defecto en el caso de no poner nada). Evidentemente, cuando una clave ajena tiene como opción de borrado la puesta a nulos, las columnas asociadas deberán admitir este valor. ORACLE, como todo SGBD, mantiene un catálogo que almacena datos acerca de los usuarios, tablas, privilegios, etc. Podemos acceder al catálogo por medio de vistas que pueden consultarse. Realizando una consulta a la vista ALL_CATALOG vemos todos los objetos (tablas, vistas, sinónimos) visibles por el usuario. Algunas vistas útiles son USER_TABLES, USER_VIEWS, etc. Instrucciones ALTER TABLE, INSERT, DELETE y UPDATE. La sintaxis básica es la siguiente: ALTER TABLE tabla -> ADD (columnas, restricciones de columnas y/o restricciones de tabla) MODIFY (columnas y restricciones de columnas) Grupo Kybele, http://kybele.escet.urjc.es/ Pág. 2 Diseño de Bases de Datos y Seguridad en la Información Apuntes Oracle y SQL*Plus DROP PRIMARY KEY|UNIQUE(columnas) DROP CONSTRAINT restricción DROP COLUMN columna (columnas) [DISABLE UNIQUE (columnas)/PRIMARY restricción [CASCADE];] [ENABLE UNIQUE (columnas)/PRIMARY restricción;] KEY/CONSTRAINT KEY/CONSTRAINT Para la inserción de datos usaremos la instrucción INSERT. Si no indicamos las columnas, el sistema supondrá que estamos insertando valores en todas ellas. INSERT INTO tabla/vista [(columnas)] subconsulta/VALUES (expresiones); Para el borrado usaremos la siguiente sintaxis. Si no incluimos la cláusula WHERE, se borrarán todas las filas. DELETE [FROM] tabla/vista [WHERE condición]; Para la modificación de valores se utilizará la siguiente sintaxis. Análogamente al caso anterior, si no usamos la cláusula WHERE se modificarán todas las filas. UPDATE tabla/vista SET columna=expresión|subconsulta (columnas)=subconsulta WHERE [condición]; Hay que tener en cuenta que en el caso de las vistas deberán cumplirse determinadas condiciones para permitir las inserciones, borrado y actualizaciones de las tablas base. La sintaxis básica de la orden SELECT es la siguiente: SELECT [ALL | DISTINCT] <lista-de selecciones> FROM <nombre de tabla> [alias de tabla] [,...] [WHERE <condición>] [GROUP BY <lista-de columnas> [HAVING <condición>] ] [ORDER BY <nombre de columna> [ASC | DESC] [,...] ] DISTINCT: Elimina las filas duplicadas en el resultado de la consulta. <alias de tabla>:Es un sinónimo activo sólo en el ámbito de la sentencia SELECT. Las condiciones pueden incluir operadores lógicos (AND, OR, NOT). En las condiciones podemos utilizar, entre otras, las siguientes expresiones: • < expresión1> [NOT] BETWEEN <expresión2> AND <expresión2> • <expresión> [NOT] IN (<lista-de valores>) • <nombre de columna> [NOT] LIKE ‘<string>’ [ESCAPE ‘<carácter de escape>’] Grupo Kybele, http://kybele.escet.urjc.es/ Pág. 3 Diseño de Bases de Datos y Seguridad en la Información Apuntes Oracle y SQL*Plus • <nombre de columna> IS [NOT] NULL • Expresiones con subconsulta, que permiten comparar el valor de una expresión con los resultados de una sentencia SELECT (subconsulta). De esta forma se pueden producir encadenamientos de sentencias SELECT. ORDER BY <nombre de columna> [ASC | DESC] [,...] Permite ordenar el resultado de la consulta. COMPOSICIÓN DE TABLAS. La composición (join) de tablas se produce cuando se combinan datos de dos o más tablas. Para poder realizar la composición deben existir columnas comunes a las tablas, de forma que al componer dos tablas A y B con las columnas comunes X e Y se satisface una condición del tipo A.X=B.Y o similar (utilizando otros operadores, como >, <, etc). Estas condiciones se incluyen en la condición de la claúsula WHERE. Esto puede generalizarse a más de dos tablas, por ejemplo (A.X = B.Y1) AND (B.Y2 = C.Z). En el caso de realizar una composición de una tabla consigo misma, obligatoriamente hay que emplear alias dentro de la orden SELECT que eviten los problemas de ambigüedad. Algunas de las funciones aplicables a datos de tipo carácter son: LQLWFDSFKDU Æ pone en mayúscula el primer carácter de cada cadena de caracteres. ORZHUFKDU Æ pone en minúsucla la cadena de caracteres completa UHSODFHFKDU VWU VWU Æ En la cadena de caracteres char, cada ocurrencia de str1 se reemplaza por str2 VXEVWUFKDUPQ Æ Extrae n caracteres de la cadena de caracteres char, a partir de la posición m. OHQJWKFKDU Æ Longitud de char Entre las funciones específicas para fechas tenemos: V\VGDWH Æ Fecha y hora actual ODVWBGD\ Æ último día del mes actual DGGBPRQWKVGQ Æ suma o resta n meses a partir de la fecha d PRQWKVBEHWZHHQIV Æ diferencia en meses entre la fecha f y la fecha s QH[WBGD\GGD\ Æ Fecha del día especificado (lunes, martes, ...en inglés)de la semana siguiente a d Otras funciones útiles para el tratamiento de fechas son WRBFKDU y WRBGDWH, que devuelven, respectivamente, un dato en formato carácter o fecha. El uso básico es el siguiente: WRBFKDU (expresión, plantilla) WRBGDWH (cadena, plantilla) Entre los posibles códigos a usar en la plantilla tenemos los siguientes: < Æ devuelve el último dígito del año << Æ devuelve los dos últimos dígitos del año <<< Æ devuelve los tres últimos dígitos del año <<<< Æ devuelve los cuatro últimos dígitos del año 6<($5<($5 Æ año, utilizando signo para las fechas a.C. Grupo Kybele, http://kybele.escet.urjc.es/ Pág. 4 Diseño de Bases de Datos y Seguridad en la Información Apuntes Oracle y SQL*Plus 4 Æ trimestre del año 00 Æ mes 50 Æ mes en números romanos 0RQWK Æ Nombre del mes (9 caracteres) :: Æ semana del año : Æ semana del mes ''' Æ día del año '' Æ día del mes ' Æ día de la semana '< Æ Abreviatura del nombre del día ++R++ Æ Hora del día ++ Æ hora del día utilizando las 24 0, Æ minutos 66 Æ segundos Para una consulta más detallada tanto de las funciones anteriores como de otras muchas, pueden consultarse los manuales de ORACLE accesibles desde la página de la asignatura. Por último hay que resaltar el hecho de que es posible sumar a las fechas valores de la forma: fecha+n. En este caso Oracle suma n días a la fecha, teniendo en cuenta posibles desbordamientos de meses o años. La cláusula GROUP BY se utiliza cuando se quieren realizar consultas agrupadas. Así, se puede pensar en estos conjuntos de filas como grupos, utilizándose las siguientes funciones (que también pueden ser utilizadas sin GROUP BY): • • • • avg(nombre_columna) Æ Valor medio de todos los valores de nombre_columna count(*) Æ Número de filas de la tabla max(nombre_columna) Æ Valor máximo almacenado en nombre_columna min(nombre_columna) Æ Valor mínimo almacenado en nombre_columna Ejemplo: select ciudad, avg(ventas) from clientes group by ciudad; Hay que tener en cuenta que hay que agrupar todas las columnas que no aparezcan mencionadas en la cláusula group_by. La cláusula HAVING se utiliza para especificar una condición de búsqueda de un grupo de filas. Por ejemplo: select ciudad, avg(ventas) from clientes group by ciudad having ciudad>’ t’ ; SUBCONSULTAS. Una subconsulta forma parte de una condición de búsqueda en la cláusual WHERE o HAVING. Además de las vistas en la práctica anterior, también se pueden aplicar las siguientes condiciones de búsqueda en subconsultas: Test de comparación subconsulta. Compara el valor de una expresión con el valor producido por una subconsulta y devuelve un valor true si la comparación es cierta. Operadores: >, <>, <, <=, >, >= Ejemplo: Grupo Kybele, http://kybele.escet.urjc.es/ Pág. 5 Diseño de Bases de Datos y Seguridad en la Información Apuntes Oracle y SQL*Plus SELECT nombre FROM tabla WHERE columna ! (SELECT col FROM tabla2 WHERE ...); Test de pertenencia a conjunto subconsulta. Compara un único valor de datos con una columna de valores producida por una subconsulta y devuelve un resultado true si el valor coincide con uno de los valores de la columna. Operador: IN Ejemplo: SELECT nombre FROM tabla WHERE col ,1 (SELECT col FROM tabla2 WHERE...); Test de existencia. Comprueba si una subconsulta produce alguna fila de resultados. Sólo se utiliza en subconsultas. Operador: EXISTS Ejemplo. Listar las oficinas donde haya ventas por encima de 100 SELECT nombre FROM oficina WHERE (;,676 (SELECT * FROM ventas ventas.oficina=oficina.id AND cant_ventas>100) WHERE Test de comparación cuantificada. Se utilizan cuando una subconsulta devuelve más de un valor. Compara un valor de dato con la columna de valores producidos por una subconsulta. SOME y ANY son equivalentes y se utilizan para aplicar a la consulta cada resultado de una subconsulta. ALL se utiliza para comparar el valor del test con todos los resultados de una subconsulta, si todos devuelven TRUE, entonces se ejecutará la consulta. Operadores: SOME, ANY, ALL Ejemplo. SELECT nombre FROM tabla WHERE ciudad = ANY (SELECT nombre FROM tabla2 WHERE codigo<3); Aunque las subconsultas suelen encontrarse tras la cláusula WHERE, también pueden ir tras la cláusula HAVING. Ejemplo. SELECT nombre, avg(importe) FROM ventas, pedidos WHERE ventas.idemp=pedidos.idemp AND fabrica=’ lafabrica’ GROUP BY nombre HAVING avg(impventas)> (SELECT avg(imppedidos) FROM pedidos)); VISTAS Una vista es una representación lógica de subconjuntos de datos de una o más tablas. Pueden presentarse conjuntos lógicos de combinaciones de datos creando vistas de tablas. Grupo Kybele, http://kybele.escet.urjc.es/ Pág. 6 Diseño de Bases de Datos y Seguridad en la Información Apuntes Oracle y SQL*Plus Las vistas es una tabla lógica (no física) que se basa en una tabla o en otra vista. Una vista no contiene datos en si misma, es como una ventana a través de la cual pueden verse y cambiarse datos de tablas. Las tablas sobre las que se define una vista se llaman tablas base. La vista se almacena como una sentencia SELECT en el diccionario de datos. CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW nombre_vista [(alias...)] AS subconsulta [WITH READ ONLY] Donde: OR REPLACE. Se utiliza por si la vista ya estuviera creada anteriormente. De esta forma una vista podrá ser modificada. FORCE. Crea la vista independientemente de si la tabla base existe. NOFORCE. Crea la vista sólo si la tabla base existe. Está opción es la que está por defecto. Subconsulta. Es una sentencia SELECT WITH READ ONLY. Asegura que no podrán ejecutarse operaciones DML sobre la vista. Algunas reglas para utilizar instrucciones DML en una vista No puede borrarse una fila si la vista contiene: ¾ Funciones de agrupamiento ¾ Una cláusula GROUP BY ¾ La cláusula DISTINCT No pueden modificarse datos de una vista si: ¾ Se cumple alguna de las condiciones del borrado ¾ Las columnas están definidas mediante expresiones No se pueden añadir datos a una vista si: ¾ Se cumple cualquiera de las condiciones del borrado ¾ Hay columnas NOT NULL en la tabla base que no están seleccionadas en la vista Para borrar una vista: DROP VIEW nombre_vista; Grupo Kybele, http://kybele.escet.urjc.es/ Pág. 7