Bases de Datos Apuntes SQL*Plus Grupo Kybele, http://www.kybele

Anuncio
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
Descargar