Bases de Datos Apuntes SQL*Plus Bases de Datos APUNTES PARA EL MANEJO DE SQL*Plus 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 en internet (por ejemplo, en http://www.lc.leidenuniv.nl/awcourse/oracle/server.920/a96540/toc.htm y en http://tahiti.oracle.com/). El programa cliente SQL*PLUS admite las sentencias SQL de ORACLE más otras propias para el formateo de la salida, etc. Fundamentalmente se utilizarán los siguientes comandos de SQL*PLUS: • PASSWORD: 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 START fichero: ejecuta un fichero • EDIT [fichero]: edita el fichero, o bien la sentencia almacenada en el buffer. Para poder utilizar esta opción 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. • DESCRIBE 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 script (creación de las tablas, inserción de datos, consultas, etc.). Es conveniente incluir en el script 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, existen algunas diferencias. 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 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. • 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] Grupo Kybele, http://www.kybele.es/ Pág. 1 Bases de Datos Apuntes SQL*Plus 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) | DROP PRIMARY KEY|UNIQUE(columnas) | DROP CONSTRAINT restricción | DROP COLUMN columna | (columnas) | [DISABLE UNIQUE (columnas)/PRIMARY KEY/CONSTRAINT restricción [CASCADE];] [ENABLE UNIQUE (columnas)/PRIMARY KEY/CONSTRAINT restricción;] 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. Grupo Kybele, http://www.kybele.es/ Pág. 2 Bases de Datos Apuntes SQL*Plus 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>’] • <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: initcap(char) Æ pone en mayúscula el primer carácter de cada cadena de caracteres. lower (char) Æ pone en minúsucla la cadena de caracteres completa replace(char, str1, str2) Æ En la cadena de caracteres char, cada ocurrencia de str1 se reemplaza por str2 substr(char,m,n) Æ Extrae n caracteres de la cadena de caracteres char, a partir de la posición m. length(char) Æ Longitud de char Entre las funciones específicas para fechas tenemos: sysdate Æ Fecha y hora actual last_day Æ último día del mes actual add_months(d,n) Æ suma o resta n meses a partir de la fecha d months_between(f,s) Æ diferencia en meses entre la fecha f y la fecha s next_day(d,day) Æ 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 to_char y to_date, que devuelven, respectivamente, un dato en formato carácter o fecha. El uso básico es el siguiente: to_char (expresión, plantilla) to_date (cadena, plantilla) Entre los posibles códigos a usar en la plantilla tenemos los siguientes: Y Æ devuelve el último dígito del año YY Æ devuelve los dos últimos dígitos del año YYY Æ devuelve los tres últimos dígitos del año YYYY Æ devuelve los cuatro últimos dígitos del año SYEAR, YEAR Æ año, utilizando signo para las fechas a.C. Q Æ trimestre del año MM Æ mes RM Æ mes en números romanos Month Æ Nombre del mes (9 caracteres) WW Æ semana del año W Æ semana del mes DDD Æ día del año DD Æ día del mes D Æ día de la semana Grupo Kybele, http://www.kybele.es/ Pág. 3 Bases de Datos Apuntes SQL*Plus DY Æ Abreviatura del nombre del día HH o HH12 Æ Hora del día HH24 Æ hora del día utilizando las 24 MI Æ minutos SS Æ segundos Para una consulta más detallada tanto de las funciones anteriores como de otras muchas, pueden consultarse los manuales de ORACLE. 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: 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 IN (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 EXISTS (SELECT * FROM ventas cant_ventas>100) Grupo Kybele, http://www.kybele.es/ WHERE ventas.oficina=oficina.id AND Pág. 4 Bases de Datos Apuntes SQL*Plus 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. 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://www.kybele.es/ Pág. 5