Lectura - SQL ft5
Lectura - SQL ft5
Lectura - SQL ft5
SQL (I).
DDL y DML
(3.1) notas previas
(3.1.1) versión de SQL
Aunque estos apuntes sirven como guía de uso de SQL estándar, la base de datos que se
utiliza como referencia fundamental es la base de datos Oracle. Normalmente se
indican siempre las instrucciones para Oracle y para el SQL estándar. En las partes
donde no se indique explícitamente diferencia, significará que Oracle coincide con el
estándar.
Sin embargo hay que avisar que todos los ejemplos han sido probados para Oracle,
mientras que no se puede decir lo mismo para SQL estándar. En el caso de SQL
estándar, el software PostgreSQL se ha tenido muy en cuenta ya que parece el más
respetuoso actualmente con el estándar.
No obstante debo disculparme porque es posible que muchos apartados se refieran
sólo a Oracle y sobre todo los detalles de funcionamiento y resultados no han tenido en
cuenta el estándar, sino sólo el funcionamiento de Oracle.
La razón de utilizar Oracle como base de trabajo se debe a su respeto por SQL
estándar (aunque desde luego no tan estricto como PostgreSQL), es decir que no es
excesivamente diferente; pero fundamentalmente por ser el SGBD de referencia más
importante desde hace ya muchos años. De hecho lo que Oracle aporta de novedoso en
cada versión, acaba formando parte del estándar futuro.
(81)
gestión de bases de datos
(unidad 3) SQL (I). DDL y DML
Ejemplo:
Los ejemplos sirven para escenificar una instrucción concreta, la sintaxis se utiliza para
indicar las forma de utilizar un comando.
Para indicar la sintaxis de un comando se usan símbolos especiales. Los símbolos que
utiliza este libro (de acuerdo con la sintaxis que se utiliza normalmente en cualquier
documentación de este tipo) son:
PALABRA Cuando en la sintaxis se utiliza una palabra en negrita, significa que
es una palabra que hay que escribir literalmente (aunque sin importar si en
mayúsculas o minúsculas).
texto. El texto que aparece en color normal sirve para indicar que no hay que
escribirle literalmente, sino que se refiere a un tipo de elemento que se puede
utilizar en el comando. Ejemplo:
SELECT columna FROM tabla;
El texto columna hay que cambiarlo por un nombre concreto de columna (nombre,
apellidos,...), al igual que tabla se refiere a un nombre de tabla concreto.
texto en negrita. Sirve para indicar texto o símbolos que hay que escribir de
forma literal, pero que no son palabras reservadas del lenguaje.
[ ] (corchetes). Los corchetes sirven para encerrar texto que no es obligatorio
en el comando, es decir para indicar una parte opcional.
| (barra vertical). Este símbolo (|), la barra vertical, indica opción. Las
palabras separadas con este signo indican que se debe elegir una de entre todas
las palabras.
... (puntos suspensivos) Indica que se puede repetir el texto anterior en el
comando continuamente (significaría, y así sucesivamente)
{} (llaves) Las llaves sirven para indicar opciones mutuamente exclusivas pero
obligatorias. Es decir, opciones de las que sólo se puede elegir una opción, pero
de las que es obligado elegir una. Ejemplo:
SELECT { * | columna | expresión }
FROM tabla;
(82)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
(3.2) introducción
(3.2.1) objetivos
SQL es el lenguaje fundamental de los SGBD relacionales. Se trata de uno de los
lenguajes más utilizados de la historia de la informática. Es sin duda el lenguaje
fundamental para manejar una base de datos relacional.
SQL es un lenguaje declarativo en lo que lo importante es definir qué se desea
hacer, por encima de cómo hacerlo (que es la forma de trabajar de los lenguajes de
programación de aplicaciones como C o Java). Con este lenguaje se pretendía que las
instrucciones se pudieran escribir como si fueran órdenes humanas; es decir, utilizar un
lenguaje lo más natural posible. De ahí que se le considere un lenguaje de cuarta
generación.
Se trata de un lenguaje que intenta agrupar todas las funciones que se le pueden
pedir a una base de datos, por lo que es el lenguaje utilizado tanto por administradores
como por programadores o incluso usuarios avanzados.
(83)
gestión de bases de datos
(unidad 3) SQL (I). DDL y DML
(3.2.3) funcionamiento
componentes de un entorno de ejecución SQL
Según la normativa ANSI/ISO cuando se ejecuta SQL, existen los siguientes elementos a
tener en cuenta en todo el entorno involucrado en la ejecución de instrucciones SQL:
Un agente SQL. Entendido como cualquier elemento que cause la ejecución de
instrucciones SQL que serán recibidas por un cliente SQL
Una implementación SQL. Se trata de un procesador software capaz de
ejecutar las instrucciones pedidas por el agente SQL. Una implementación está
compuesta por:
Un cliente SQL. Software conectado al agente que funciona como interfaz
entre el agente SQL y el servidor SQL. Sirve para establecer conexiones
entre sí mismo y el servidor SQL.
Un servidor SQL (puede haber varios). El software encargado de manejar
los datos a los que la instrucción SQL lanzada por el agente hace
referencia. Es el software que realmente realiza la instrucción, los datos
los devuelve al cliente.
posibles agentes SQL. posibles modos de ejecución SQL
ejecución directa. SQL interactivo
Las instrucciones SQL se introducen a través de un cliente que está directamente
conectado al servidor SQL; por lo que las instrucciones se traducen sin intermediarios y
los resultados se muestran en el cliente.
Normalmente es un modo de trabajo incómodo, pero permite tener acceso a todas
las capacidades del lenguaje SQL de la base de datos a la que estamos conectados.
ejecución incrustada o embebida
Las instrucciones SQL se colocan como parte del código de otro lenguaje que se
considera anfitrión (C, Java, Pascal, Visual Basic,...). Al compilar el código se utiliza un
precompilador de la propia base de datos para traducir el SQL y conectar la aplicación
resultado con la base de datos a través de un software adaptador (driver) como JDBC u
ODBC por ejemplo.
ejecución a través de clientes gráficos
Se trata de software que permite conectar a la base de datos a través de un cliente. El
software permite manejar de forma gráfica la base de datos y las acciones realizadas
son traducidas a SQL y enviadas al servidor. Los resultados recibidos vuelven a ser
traducidos de forma gráfica para un manejo más cómodo
ejecución dinámica
Se trata de SQL incrustado en módulos especiales que pueden ser invocados una y otra
vez desde distintas aplicaciones.
(84)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
(85)
gestión de bases de datos
(unidad 3) SQL (I). DDL y DML
(3.4) DDL
(3.4.1) introducción
El DDL es la parte del lenguaje SQL que realiza la función de definición de datos del
SGBD. Fundamentalmente se encarga de la creación, modificación y eliminación de los
objetos de la base de datos (es decir de los metadatos). Por supuesto es el encargado
de la creación de las tablas.
Cada usuario de una base de datos posee un esquema. El esquema suele tener el
mismo nombre que el usuario y sirve para almacenar los objetos de esquema, es decir
los objetos que posee el usuario.
Esos objetos pueden ser: tablas, vistas, índices y otras objetos relacionados con la
definición de la base de datos. Los objetos son manipulados y creados por los usuarios.
En principio sólo los administradores y los usuarios propietarios pueden acceder a cada
objeto, salvo que se modifiquen los privilegios del objeto para permitir el acceso a otros
usuarios.
Hay que tener en cuenta que ninguna instrucción DDL puede ser anulada por una
instrucción ROLLBACK (la instrucción ROLLBACK está relacionada con el uso de
transacciones que se comentarán más adelante) por lo que hay que tener mucha
precaución a la hora de utilizarlas. Es decir, las instrucciones DDL generan acciones que
no se pueden deshacer (salvo que dispongamos de alguna copia de seguridad).
(86)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
catálogo.esquema.objeto
(87)
gestión de bases de datos
(unidad 3) SQL (I). DDL y DML
Ejemplo:
Se puede indicar un valor por defecto para el atributo mediante la cláusula DEFAULT:
(88)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
(89)
gestión de bases de datos
(unidad 3) SQL (I). DDL y DML
Durante el resto del manual se hará referencia sólo a los tipos Oracle.
textos
Para los textos disponemos de los siguientes tipos (Oracle):
VARCHAR . Para textos de longitud variable. Su tamaño depende de la base de
datos (en Oracle es de 4000). En Oracle se llama VARCHAR2, pero es posible
seguir utilizando VARCHAR.
CHAR. Para textos de longitud fija (en Oracle hasta 2000 caracteres).
NCHAR. Para el almacenamiento de caracteres nacionales de texto fijo
NVARCHAR. Para el almacenamiento de caracteres nacionales de longitud
variable. En Oracle se llama NVARCHAR2.
En todos estos tipos se indican los tamaños entre paréntesis tras el nombre del tipo.
Conviene poner suficiente espacio para almacenar los valores. En el caso de los
VARCHAR2, no se malgasta espacio por poner más espacio del deseado ya que si el texto
es más pequeño que el tamaño indicado, el resto del espacio se ocupa.
números
En este capítulo se explican los tipos numéricos para el sistema Oracle; para SQL
estándar consultar la tabla de tipos de datos.
En Oracle, el tipo NUMBER es un formato versátil que permite representar todo tipo
de números. Su rango recoge números de entre 10-130 y 9,99999999999 * 10128. Fuera de
estos rangos Oracle devuelve un error.
Los números decimales (números de coma fija) se indican con NUMBER(p,s), donde p
es la precisión máxima y s es la escala (número de decimales a la derecha de la coma).
Por ejemplo, NUMBER (8,3) indica que se representan números de ocho cifras de
precisión y tres decimales. Los decimales en Oracle se presenta con el punto y no con
la coma.
Para números enteros se indica NUMBER(p) donde p es el número de dígitos. Eso es
equivalente a NUMBER(p,0).
Para números de coma flotante (equivalentes a los float o double de muchos
lenguajes de programación) simplemente se indica el texto NUMBER sin precisión ni
escala.
precisión y escala
La cuestión de la precisión y la escala es compleja. Para entenderla mejor, se muestran
estos ejemplos:
(90)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
En definitiva, la precisión debe incluir todos los dígitos del número (puede llegar hasta
38 dígitos). La escala sólo indica los decimales que se respetarán del número, pero si es
negativa indica ceros a la izquierda del decimal.
fechas y horas
DATE
El tipo DATE permite almacenar fechas. Las fechas se pueden escribir en formato día,
mes y año entre comillas. El separador puede ser una barra de dividir, un guión y casi
cualquier símbolo.
Para almacenar la fecha actual la mayoría de bases de datos proporcionan funciones
(como SYSDATE en Oracle) que devuelven ese valor. Las fechas no se pueden manejar
directamente, normalmente se usan funciones de conversión. En el caso de Oracle se
suele usar TO_DATE (que se detallará en el tema siguiente). Ejemplo:
TO_DATE(
TIMESTAMP
Es una extensión del anterior, almacena valores de día, mes y año, junto con hora,
minuto y segundos (incluso con decimales). Con lo que representa un instante concreto
si el formato de fecha y hora del sistema está pensado para el idioma español, el
separador decimal será la coma (y no el punto).
intervalos
Sirven para almacenar intervalos de tiempo (no fechas, sino una suma de elementos de
tiempo). En el caso de Oracle son:
INTERVAL YEAR TO MONTH
Este tipo de datos almacena años y meses. Tras la palabra YEAR se puede indicar la
precisión de los años (cifras del año), por defecto es de dos..
Para los intervalos de año a mes los valores se pueden indicar de estas formas:
(91)
gestión de bases de datos
(unidad 3) SQL (I). DDL y DML
Ejemplos:
(3.4.6) dominios
En Oracle se echa de menos una instrucción que forma parte del estándar SQL y que
permite crear dominios. Sin embargo en SQL estándar sí hay esa posibilidad y de hecho
es muy interesante. Se trata de CREATE DOMAIN:
(92)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
Ejemplo:
Esa instrucción muestra una tabla con diversas columnas, entre ellas la columna
TABLE_CATALOG indica el catálogo en el que está la tabla, TABLE_SCHEMA el
esquema en el que está la tabla y TABLE_NAME el nombre de la tabla.
Muchos SGBD respetan el estándar, pero en el caso de Oracle no. Oracle utiliza
diversas vistas para mostrar las tablas de la base de datos. En concreto USER_TABLES y
que contiene una lista de las tablas del usuario actual (o del esquema actual). Así para
sacar la lista de tablas del usuario actual, se haría:
(93)
gestión de bases de datos
(unidad 3) SQL (I). DDL y DML
DESCRIBE existencias;
Y aparecerán los campos de la tabla proveedores. Esta instrucción no es parte del SQL
estándar, pero casi es considerada así ya que casi todos los SGBD la utilizan. Un ejemplo
del resultado de la orden anterior (en Oracle) sería:
(94)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
Pero por coherencia es mejor hacerlo de la primera forma (la del estándar).
borrar contenido de tablas
Oracle dispone de una orden no estándar para eliminar definitivamente los datos de una
tabla; es la orden TRUNCATE TABLE seguida del nombre de la tabla a borrar. Hace que
se elimine el contenido de la tabla, pero no la estructura de la tabla en sí. Incluso borra
del archivo de datos el espacio ocupado por la tabla.
añadir columnas
Permite añadir nuevas columnas a la tabla. Se deben indicar su tipo de datos y sus
propiedades si es necesario (al estilo de CREATE TABLE).
Las nuevas columnas se añaden al final, no se puede indicar otra posición (hay que
recordar que el orden de las columnas no importa). Ejemplo:
Muchas bases de datos (pero no Oracle) requieren escribir la palabra COLUMN tras la
palabra ADD. Normalmente suele ser opcional
borrar columnas
Elimina la columna indicada de manera irreversible e incluyendo los datos que contenía.
No se puede eliminar la única columna de una tabla que sólo tiene esa columna (habrá
que usar DROP TABLE).
Al igual que en el caso anterior, en SQL estándar se puede escribir el texto COLUMN
tras la palabra DROP.
(95)
gestión de bases de datos
(unidad 3) SQL (I). DDL y DML
modificar columna
Permite cambiar el tipo de datos y propiedades de una determinada columna. Sintaxis:
Ejemplo:
Ejemplo:
(96)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
(3.4.10) restricciones
Una restricción es una condición de obligado cumplimiento para una o más columnas de
la tabla. A cada restricción se le pone un nombre, en el caso de no poner un nombre
(algo poco recomendable) entonces el propio Oracle le coloca el nombre que es un
mnemotécnico con el nombre de tabla, columna y tipo de restricción.
Su sintaxis general es:
Las restricciones tienen un nombre, se puede hacer que sea la base de datos la que les
ponga nombre, pero entonces sería críptico. Por eso es mejor ponerle un nombre
nosotros para que sea más fácil de recordar.
Los nombres de restricción no se pueden repetir para el mismo esquema, debemos
de buscar nombres únicos. Es buena idea incluir de algún modo el nombre de la tabla,
los campos involucrados y el tipo de restricción en el nombre de la misma. Por ejemplo
pieza_id_pk podría indicar que el campo id de la tabla pieza tiene una clave principal
(PRIMARY KEY).
Desde la empresa Oracle se aconseja la siguiente regla a la hora de poner nombre a las
restricciones:
Tres letras para el nombre de la tabla
Carácter de subrayado
Tres letras con la columna afectada por la restricción
Carácter de subrayado
Dos letras con la abreviatura del tipo de restricción. La abreviatura puede ser:
NN. NOT NULL.
PK. PRIMARY KEY
UK. UNIQUE
FK. FOREIGN KEY
CK. CHECK (validación)
Por ejemplo para hacer que la clave principal de la tabla Alumnos sea el código del
alumno, el nombre de la restricción podría ser:
alu_cod_pk
(97)
gestión de bases de datos
(unidad 3) SQL (I). DDL y DML
prohibir nulos
La restricción NOT NULL permite prohibir los nulos en una determinada tabla. Eso
obliga a que la columna tenga que tener obligatoriamente un valor para que sea
almacenado el registro.
Se puede colocar durante la creación (o modificación) del campo añadiendo la
palabra NOT NULL tras el tipo:
En ese caso el nombre le coloca la propia base de datos (en el caso de Oracle el nombre
sería algo como SY002341 por ejemplo). No es recomendable no poner nombre a las
restricciones para controlarlas mejor.
Para poner el nombre se usa:
La restricción NOT NULL es la única que sólo se puede poner seguida al nombre de la
columna a la que se aplica (la razón es que NOT NULL sólo se puede aplicar a un campo
a la vez)
valores únicos
Las restricciones de tipo UNIQUE obligan a que el contenido de una o más columnas no
puedan repetir valores. Nuevamente hay dos formas de colocar esta restricción:
La coma tras la definición del campo cod_pelicula hace que la restricción sea
independiente de ese campo. Eso obliga a que, tras UNIQUE se indique la lista de
campos. Incluso para un solo campo se puede colocar la restricción al final de la lista en
lugar de definirlo a continuación del nombre y tipo de la columna.
Significa esta instrucción (en cuanto a claves foráneas) que el campo dni se relaciona
con la columna dni de la tabla clientes.
Si el campo al que se hace referencia es la clave principal, se puede obviar el nombre
del campo:
En este caso se entiende que los campos hacen referencia a las claves principales de las
tablas referenciadas (si la relación la forma más un campo, el orden de los campos debe
de ser el mismo).
Esto forma una relación entre dichas tablas, que además obliga al cumplimiento de
la integridad referencial. Esta integridad obliga a que cualquier dni incluido en la
(99)
gestión de bases de datos
(unidad 3) SQL (I). DDL y DML
tabla alquiler tenga que estar obligatoriamente en la tabla de clientes. De no ser así el
registro no será insertado en la tabla (ocurrirá un error).
Otra forma de crear claves foráneas (útil para claves formadas por más de un
campo) es:
Si la definición de clave secundaria se pone al final hace falta colocar el texto FOREIGN
KEY para indicar en qué campos se coloca la restricción de clave foránea. En el ejemplo
anterior es absolutamente necesario que la clave principal de la tabla piezas a la que
hace referencia la clave la formen las columnas tipo y modelo y en que estén en ese
orden.
La integridad referencial es una herramienta imprescindible de las bases de datos
relacionales. Pero provoca varios problemas. Por ejemplo, si borramos un registro en la
tabla principal que está relacionado con uno o varios de la secundaria ocurrirá un error,
ya que de permitírsenos borrar el registro ocurrirá fallo de integridad (habrá claves
secundarios refiriéndose a una clave principal que ya no existe).
Por ello se nos pueden ofrecer soluciones a añadir tras la cláusula REFERENCES. Son:
ON DELETE SET NULL. Coloca nulos todas las claves secundarias relacionadas
con la borrada.
ON DELETE CASCADE. Borra todos los registros cuya clave secundaria es igual
que la clave del registro borrado.
ON DELETE SET DEFAULT. Coloca en el registro relacionado el valor por
defecto en la columna relacionada
ON DELETE NOTHING. No hace nada.
En la base de datos Oracle sólo se permite utilizar ON DELETE SET NULL u ON DELETE
CASCADE. No se admite el uso de ON UPDATE en ningún caso.
(100)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
Ejemplo:
(101)
gestión de bases de datos
(unidad 3) SQL (I). DDL y DML
Ejemplo:
CREATE TABLE ingresos(cod NUMBER(5) PRIMARY KEY,
concepto VARCHAR2(40) NOT NULL,
importe NUMBER(11,2) CONSTRAINT importe_min
CHECK (importe>0)
CONSTRAINT importe_max
CHECK (importe<8000) );
En este caso la CHECK prohíbe añadir datos cuyo importe no esté entre 0 y 8000
Para poder hacer referencia a otras columnas hay que construir la restricción de
forma independiente a la columna (es decir al final de la tabla):
La opción PRIMARY KEY elimina una clave principal (también quitará el índice UNIQUE
sobre las campos que formaban la clave. UNIQUE elimina índices únicos. La opción
CONSTRAINT elimina la restricción indicada.
La opción CASCADE hace que se eliminen en cascada las restricciones de integridad
que dependen de la restricción eliminada.
(102)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
ERROR en línea 1:
ORA-12991: se hace referencia a la columna en una restricción de multicolumna
El error se debe a que no es posible borrar una columna que forma parte de la
definición de una instrucción. La solución es utilizar CASCADE CONSTRAINT elimina las
restricciones en las que la columna a borrar estaba implicada:
desactivar restricciones
A veces conviene temporalmente desactivar una restricción para saltarse las reglas que
impone. La sintaxis es (en Oracle):
(103)
gestión de bases de datos
(unidad 3) SQL (I). DDL y DML
mostrar restricciones
SQL estándar
En SQL estándar hay dos vistas del diccionario de datos que permiten visualizar la
información sobre las restricciones aplicadas en la base de datos. Son:
INFORMATION_SCHEMA.TABLE_CONSTRAINTS
INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE.
La primera permite analizar las restricciones colocada. Devuelve una tabla con la
siguiente estructura:
(105)
gestión de bases de datos
(unidad 3) SQL (I). DDL y DML
(3.5) DML
(3.5.1) introducción
Es una de las partes fundamentales del lenguaje SQL. El DML (Data Manipulation
Language) lo forman las instrucciones capaces de modificar los datos de las tablas. Al
conjunto de instrucciones DML que se ejecutan consecutivamente, se las llama
transacciones y se pueden anular todas ellas o aceptar, ya que una instrucción DML no
es realmente efectuada hasta que no se acepta (COMMIT).
En todas estas consultas, el único dato devuelto por Oracle es el número de registros
que se han modificado.
(106)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
La tabla representa la tabla a la que queremos añadir el registro y los valores que
siguen a VALUES son los valores que damos a los distintos campos del registro. Si no se
especifica la lista de campos, la lista de valores debe seguir el orden de las columnas
según fueron creados (es el orden de columnas según las devuelve el comando
DESCRIBE).
La lista de campos a rellenar se indica si no queremos rellenar todos los campos. Los
campos no rellenados explícitamente con la orden INSERT, se rellenan con su valor por
defecto (DEFAULT) o bien con NULL si no se indicó valor alguno. Si algún campo tiene
restricción de obligatoriedad (NOT NULL), ocurrirá un error si no rellenamos el campo
con algún valor.
Por ejemplo, supongamos que tenemos una tabla de clientes cuyos campos son: dni,
nombre, apellido1, apellido2, localidad y dirección; supongamos que ese es el orden
de creación de los campos de esa tabla y que la localidad tiene como valor por defecto
Palencia y la dirección no tiene valor por defecto. En ese caso estas dos instrucciones
son equivalentes:
UPDATE tabla
SET columna1=valor1 [,columna2=valor2...]
[WHERE condición]
Se modifican las columnas indicadas en el apartado SET con los valores indicados. La
cláusula WHERE permite especificar qué registros serán modificados.
Ejemplos:
El primer dato actualiza la provincia de los clientes de Orense para que aparezca como
Ourense.
(107)
gestión de bases de datos
(unidad 3) SQL (I). DDL y DML
Es más sencilla que las anteriores, elimina los registros de la tabla que cumplan la
condición indicada. Ejemplo:
(108)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
Hay que tener en cuenta que el borrado de un registro no puede provocar fallos de
integridad y que la opción de integridad ON DELETE CASCADE hace que no sólo se
borren los registros indicados en el SELECT, sino todos los relacionados.
(3.6) transacciones
Como se ha comentado anteriormente, una transacción está formada por una serie de
instrucciones DML. Una transacción comienza con la primera instrucción DML que se
ejecute y finaliza con alguna de estas circunstancias:
Una operación COMMIT o ROLLBACK
Una instrucción DDL (como ALTER TABLE por ejemplo)
Una instrucción DCL (como GRANT)
El usuario abandona la sesión
Caída del sistema
Hay que tener en cuenta que cualquier instrucción DDL o DCL da lugar a un COMMIT
implícito, es decir todas las instrucciones DML ejecutadas hasta ese instante pasan a ser
definitivas.
(3.6.2) COMMIT
La instrucción COMMIT hace que los cambios realizados por la transacción sean
definitivos, irrevocables. Sólo se debe utilizar si estamos de acuerdo con los cambios,
conviene asegurarse mucho antes de realizar el COMMIT ya que las instrucciones
ejecutadas pueden afectar a miles de registros.
Además el cierre correcto de la sesión da lugar a un COMMIT, aunque siempre
conviene ejecutar explícitamente esta instrucción a fin de asegurarnos de lo que
hacemos.
(3.6.3) ROLLBACK
Esta instrucción regresa a la instrucción anterior al inicio de la transacción,
normalmente el último COMMIT, la última instrucción DDL o DCL o al inicio de sesión.
Anula definitivamente los cambios, por lo que conviene también asegurarse de esta
operación.
Un abandono de sesión incorrecto o un problema de comunicación o de caída del
sistema dan lugar a un ROLLBACK implícito.
(109)
gestión de bases de datos
(unidad 3) SQL (I). DDL y DML
Ejemplo:
El ejemplo crea un índice para los campos apellido1, apellido2 y nombre. Esto no es lo
mismo que crear un índice para cada campo, este índice es efectivo cuando se buscan u
ordenan clientes usando los tres campos (apellido1, apellido2, nombre) a la vez.
Se aconseja crear índices en campos que:
Contengan una gran cantidad de valores
Contengan una gran cantidad de nulos
Sean parte habitual de cláusulas WHERE, GROUP BY u ORDER BY
Seann parte de listados de consultas de grandes tablas sobre las que casi
siempre se muestran como mucho un 4% de su contenido.
(110)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
Esos índices tienen sentido si en las consultas se utilizan exactamente esas expresiones.
lista de índices
Para ver la lista de índices en Oracle se utiliza la vista USER_INDEXES. Mientras que la
vista USER_IND_COLUMNS Muestra la lista de columnas que son utilizadas por índices.
borrar índices
La instrucción DROP INDEX seguida del nombre del índice permite eliminar el índice en
cuestión.
(3.7.2) secuencias
Una secuencia sirve para generar automáticamente números distintos. Se utilizan para
generar valores para campos que se utilizan como clave forzada (claves cuyo valor no
interesa, sólo sirven para identificar los registros de una tabla). Es decir se utilizan en
los identificadores de las tablas (campos que comienzan con la palabra id), siempre y
cuando no importe qué número se asigna a cada fila.
Es una rutina interna de la base de datos la que realiza la función de generar un
número distinto cada vez. Las secuencias se almacenan independientemente de la
tabla, por lo que la misma secuencia se puede utilizar para diversas tablas.
creación de secuencias
Sintaxis:
(111)
gestión de bases de datos
(unidad 3) SQL (I). DDL y DML
Donde:
secuencia. Es el nombre que se le da al objeto de secuencia
INCREMENT BY. Indica cuánto se incrementa la secuencia cada vez que se usa.
Por defecto se incrementa de uno en uno
START WITH. Indica el valor inicial de la secuencia (por defecto 1)
MAXVALUE. Máximo valor que puede tomar la secuencia. Si no se toma
NOMAXVALUE que permite llegar hasta el 1027
MINVALUE. Mínimo valor que puede tomar la secuencia. Por defecto -1026
CYCLE. Hace que la secuencia vuelva a empezar si se ha llegado al máximo
valor.
Ejemplo:
En SQL estándar:
SELECT nextval( );
No se puede utilizar (y siempre hay tentaciones para ello) como valor para la cláusula
DEFAULT de un campo de tabla.
Su uso más habitual es como apoyo al comando INSERT (en Oracle):
(112)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
borrar secuencias
Lo hace el comando DROP SEQUENCE seguido del nombre de la secuencia a borrar.
lista de secuencias
En SQL estándar, a través de INFORMATION_SCHEMA.SEQUENCES podemos acceder a la
información sobre todas las secuencias creadas. En Oracle se hace mediante la vista
USER_SEQUENCES permite observar la lista de secuencias del usuario.
(3.7.3) sinónimos
En Oracle, un sinónimo es un nombre que se asigna a un objeto cualquiera.
Normalmente es un nombre menos descriptivo que el original a fin de facilitar la
escritura del nombre del objeto en diversas expresiones.
creación
Sintaxis:
lista de sinónimos
La vista USER_SYNONYMS permite observar la lista de sinónimos del usuario, la vista
ALL_SYNONYMS permite mostrar la lista completa de sinónimos de todos los esquemas
a los que tenemos acceso.
(113)
(4)
SQL (II).
Consultas
(4.1) consultas de datos con SQL. DQL
(4.1.1) capacidades
DQL es la abreviatura del Data Query Language (lenguaje de consulta de datos) de
SQL. El único comando que pertenece a este lenguaje es el versátil comando SELECT
Este comando permite:
Obtener datos de ciertas columnas de una tabla (proyección)
Obtener registros (filas) de una tabla de acuerdo con ciertos criterios
(selección)
Mezclar datos de tablas diferentes (asociación, join)
Realizar cálculos sobre los datos
Agrupar datos
Donde:
*. El asterisco significa que se seleccionan todas las columnas
DISTINCT. Hace que no se muestren los valores duplicados.
columna. Es el nombre de una columna de la tabla que se desea mostrar
expresión. Una expresión válida SQL
alias. Es un nombre que se le da a la cabecera de la columna en el resultado de
esta instrucción.
(115)
gestión de bases de datos
(unidad 4) SQL (II). Consultas
Ejemplos:
(4.2) cálculos
(4.2.1) aritméticos
Los operadores + (suma), - (resta), * (multiplicación) y / (división), se pueden utilizar
para hacer cálculos en las consultas. Cuando se utilizan como expresión en una consulta
SELECT, no modifican los datos originales sino que como resultado de la vista generada
por SELECT, aparece un nueva columna. Ejemplo:
Esa consulta obtiene tres columnas. La tercera tendrá como nombre la expresión
utilizada, para poner un alias basta utilizar dicho alias tras la expresión:
(116)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
El resultado sería:
AR 6 AR-6
AR 7 AR-7
AR 8 AR-8
AR 9 AR-9
AR 12 AR-12
AR 15 AR-15
AR 20 AR-20
AR 21 AR-21
BI 10 BI-10
BI 20 BI-20
BI 22 BI-22
BI 24 BI-24
En la mayoría de bases de datos, la función CONCAT (se describe más adelante) realiza
la misma función.
(4.3) condiciones
Se pueden realizar consultas que restrinjan los datos de salida de las tablas. Para ello se
utiliza la cláusula WHERE. Esta cláusula permite colocar una condición que han de
cumplir todos los registros, los que no la cumplan no aparecen en el resultado.
Ejemplo:
!= Distinto
Se pueden utilizar tanto para comparar números como para comparar textos y fechas.
En el caso de los textos, las comparaciones se hacen en orden alfabético. Sólo que es un
orden alfabético estricto. Es decir el orden de los caracteres en la tabla de códigos.
En muchas bases de datos hay problemas con la Ñ y otros símbolos nacionales (en
especial al ordenar o comparar con el signo de mayor o menor, ya que la el orden ASCII
no respeta el orden de cada alfabeto nacional). No obstante es un problema que tiende
a arreglarse en la actualidad en todos los SGBD (en Oracle no existe problema alguno)
especialmente si son compatibles con Unicode.
Ejemplos:
(4.3.3) BETWEEN
El operador BETWEEN nos permite obtener datos que se encuentren en un rango. Uso:
(118)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
(4.3.4) IN
Permite obtener registros cuyos valores estén en una lista de valores:
Obtiene piezas cuyos precios sean 3, 5 u 8 (no valen ni el precio 4 ni el 6, por ejemplo).
(4.3.5) LIKE
Se usa sobre todo con textos, permite obtener registros cuyo valor en un campo cumpla
una condición textual. LIKE utiliza una cadena que puede contener estos símbolos:
Símbolo Significado
% Una serie cualquiera de caracteres
_ Un carácter cualquiera
Ejemplos:
(4.3.6) IS NULL
Devuelve verdadero si el valor que examina es nulo:
Esa instrucción selecciona a la gente que no tiene teléfono. Se puede usar la expresión
IS NOT NULL que devuelve verdadero en el caso contrario, cuando la expresión no es
nula.
(119)
gestión de bases de datos
(unidad 4) SQL (II). Consultas
1 *(Multiplicar) / (dividir)
2 + (Suma) - (Resta)
3 || (Concatenación)
4 Comparaciones (>, <, !=, ...)
5 IS [NOT] NULL, [NOT ]LIKE, IN
6 NOT
7 AND
8 OR
(4.4) ordenación
El orden inicial de los registros obtenidos por un SELECT no guarda más que una relación
respecto al orden en el que fueron introducidos. Para ordenar en base a criterios más
interesantes, se utiliza la cláusula ORDER BY.
En esa cláusula se coloca una lista de campos que indica la forma de ordenar. Se
ordena primero por el primer campo de la lista, si hay coincidencias por el segundo, si
ahí también las hay por el tercero, y así sucesivamente.
Se puede colocar las palabras ASC O DESC (por defecto se toma ASC). Esas palabras
significan en ascendente (de la A a la Z, de los números pequeños a los grandes) o en
descendente (de la Z a la a, de los números grandes a los pequeños) respectivamente.
Sintaxis completa de SELECT (para una sola tabla):
(120)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
(4.5) funciones
(4.5.1) funciones
Todos los SGBD implementan funciones para facilitar la creación de consultas
complejas. Esas funciones dependen del SGBD que utilicemos, las que aquí se comentan
son algunas de las que se utilizan con Oracle.
Todas las funciones devuelven un resultado que procede de un determinado cálculo.
La mayoría de funciones precisan que se les envíe datos de entrada (parámetros o
argumentos) que son necesarios para realizar el cálculo de la función. Este resultado,
lógicamente depende de los parámetros enviados. Dichos parámetros se pasan entre
paréntesis. De tal manera que la forma de invocar a una función es:
nombreFunción[(parámetro1[, parámetro2,...])]
Si una función no precisa parámetros (como SYSDATE) no hace falta colocar los
paréntesis.
En realidad hay dos tipos de funciones:
Funciones que operan con datos de la misma fila
Funciones que operan con datos de varias filas diferentes (funciones de
agrupación).
En este apartado se tratan las funciones del primer tipo (más adelante se comentan las
de agrupación).
En los siguientes apartados se describen algunas de las funciones más interesantes, las
más importantes son las remarcadas con un fondo naranja más intenso.
(121)
gestión de bases de datos
(unidad 4) SQL (II). Consultas
(122)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
(124)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
El resultado es:
B
A
C
A
NVL(valor,sustituto) Si el valor es NULL, devuelve el valor sustituto;
de otro modo, devuelve valor
2
Ejemplo tomado de http://www.psoug.org/reference/string_func.html
(125)
gestión de bases de datos
(unidad 4) SQL (II). Consultas
(126)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
(127)
gestión de bases de datos
(unidad 4) SQL (II). Consultas
caracteres especiales
Nos permiten indicar caracteres que de otra forma no se pueden escribir (como el salto
de línea por ejemplo), ase les llama también secuencias de escape y proceden del
lenguaje C.
carácter significado
\t Tabulador
\n Salto de línea
\r Salto de carro
\v Tabulador vertical
\\ La propia barra
clase significado
[:alpha:] Letra
[:alnum:] Letra o número
[:blank:] Espacio o tabulador
[:cntrl:] Carácter de control
[:digit:] Número
[:graph:] Carácter visible (no valen ni espacios ni caracteres de control
[:lower:] Letra minúscula
[:print:] Carácter visible o el espacio en blanco
[:punct:] Caracteres de puntuación
[:space:] Espacios en blanco y símbolos que añaden espacios (como el
(128)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
clases significado
\d Dígito, vale cualquier dígito numérico
\D Todo menos dígito
\s Espacio en blanco
\S Cualquier carácter salvo el espacio en blanco
\w Word, carácter válido dentro de los que PHP considera para
identificar variables. Es decir, letras, números o el guion bajo.
\W Todo lo que no sea un carácter de tipo Word.
Nº de serie con una o dos letras mayúsculas, tres números, seguido de una letra un
guión y dos números:
'^[A-Z]{1,2}[0-9]{3}[A-Z]-[0-9]{2}$'
Código postal, números del 01000 al 52999 (se hacen tres grupos: del 10000 al 19999;
del 01000 al 09000; y del 51000 al 52999; de otro modo dejaríamos algún caso de más)
Función Descripción
(129)
gestión de bases de datos
(unidad 4) SQL (II). Consultas
Función Descripción
REGEXP_LIKE(texto, Devuelve verdadero si el texto cumple la
expresionRegular [,flag]) expresión regular.
El flag que se puede indicar como tercer
parámetro es una de estas letras (entrecomi-
lladas):
i. No distingue entre mayúsculas y
minúsculas
c. Distingue entre mayúsculas y
minúsculas
n. Hace que el punto represente a todos
los caractere4s excepto al salto de línea
(\n).
x. Ignora los espacios en blanco
REGEXP_COUNT(texto, Cuenta las veces que aparece la expresión
expresionRegular [,posición regular en el texto. Se puede especificar la
[,flag]]) posición en el texto desde la que empezamos a
buscar y el parámetro flag comentado
anteriormente.
REGEXP_INSTR(texto, Es una versión de la función INSTR, pero con más
expresionRegular [,posInicial [, potencia. Busca la expresión regular en el texto
nAparición [,modoPos [,flag y devuelve su posición (o cero si no la
[,subexpr]]]]])) encuentra).
Se puede empezar a buscar desde una posición
(indicando un número en el parámetro
posInicial) e incluso indicar que buscamos no la
primera aparición (que es como funciona por
defecto) sino que buscamos el número de
aparación que indiquemos en el cuarto
parámetro.
El quinto parámetro vale cero (valor por defecto)
si la posición devuelta indica el primer carácter
en el que aparece la expresión; y vale uno si la
posición devuelta es la del siguiente carácter
respecto al texto qaue cumple la expresión
regular.
flag es el parámetro comentado en la función
REGEXP_LIKE.
REGEXP_REPLACE(texto, Busca la expresión regular en el texto y
expresionRegular [, nuevoTexto reemplaza todo el texto que la cumple por el
[,posInicial [, nAparición nuevo texto indicado.
[,flag]]]]))
Si no hay nuevoTexto, entonces se eliminan los
caracteres que cumplan la expresión regular
(130)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
Función Descripción
REGEXP_SUBSTR(texto, Busca la expresión regular en el texto y extrae
expresionRegular [,posInicial [, los caracteres que cumplen la expresión. Es, por
nAparición [,flag [,subexpr]]]])) lo tanto, una versión más potente de SUBSTR.
La precisión en el caso de indicar tanto años como meses, se indica sólo en el año. En
intervalos de días a segundos los intervalos se pueden indicar como:
Esos intervalos se pueden sumar a valores de tipo DATE o TIMESTAMP para hacer
cálculos. Gracias a ello se permiten sumar horas o minutos por ejemplo a los datos de
tipo TIMESTAMP.
obtener la fecha y hora actual
Función Descripción
SYSDATE Obtiene la fecha y hora actuales
SYSTIMESTAMP Obtiene la fecha y hora actuales en formato
TIMESTAMP
calcular fechas
Función Descripción
ADD_MONTHS(fecha,n) Añade a la fecha el número de meses indicado
por n
MONTHS_BETWEEN(fecha1, Obtiene la diferencia en meses entre las dos
fecha2) fechas (puede ser decimal)
NEXT_DAY(fecha,día) Indica cual es el día que corresponde a añadir a
la fecha el día indicado. El día puede ser el texto
'Lunes', 'Martes', 'Miércoles',... (si la configura-
ción está en español) o el número de día de la
semana (1=lunes, 2=martes,...)
LAST_DAY(fecha) Obtiene el último día del mes al que pertenece
la fecha. Devuelve un valor DATE
EXTRACT(valor FROM fecha) Extrae un valor de una fecha concreta. El valor
puede ser day (día), month (mes), year (año),
etc.
GREATEST(fecha1, fecha2,..) Devuelve la fecha más moderna la lista
LEAST(fecha1, fecha2,..) Devuelve la fecha más antigua la lista
(132)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
Función Descripción
ROUND(fecha [,'formato'] Redondea la fecha al valor de aplicar el formato
a la fecha. El formato puede ser:
'YEAR' Hace que la fecha refleje el año
completo
'MONTH' Hace que la fecha refleje el mes
completo más cercano a la fecha
'HH24' Redondea la hora a las 00:00 más
cercanas
Redondea al día más cercano
TRUNC(fecha [formato]) Igual que el anterior pero trunca la fecha en
lugar de redondearla.
También ocurre eso con la conversión de textos a fechas. De hecho es forma habitual de
asignar fechas.
Pero en diversas ocasiones querremos realizar conversiones explícitas.
TO_CHAR
Obtiene un texto a partir de un número o una fecha. En especial se utiliza con fechas
(ya que de número a texto se suele utilizar de forma implícita.
fechas
En el caso de las fechas se indica el formato de conversión, que es una cadena que
puede incluir estos símbolos (en una cadena de texto):
Símbolo Significado
YY Año en formato de dos cifras
YYYY Año en formato de cuatro cifras
MM Mes en formato de dos cifras
MON Las tres primeras letras del mes
MONTH Nombre completo del mes
DY Día de la semana en tres letras
DAY Día completo de la semana
D Día de la semana (del 1 al 7)
(133)
gestión de bases de datos
(unidad 4) SQL (II). Consultas
Símbolo Significado
DD Día del mes en formato de dos cifras (del 1 al 31)
DDD Día del año
Q Semestre
WW Semana del año
AM Indicador AM
PM Indicador PM
HH12 Hora de 1 a 12
HH24 Hora de 0 a 23
MI Minutos (0 a 59)
SS Segundos (0 a 59)
SSSS Segundos desde medianoche
Posición de los separadores, donde se pongan
estos símbolos aparecerán en el resultado
Ejemplos:
Símbolo Significado
9 Posición del número
0 Posición del número (muestra ceros)
$ Formato dólar
L Símbolo local de la moneda
S Hace que aparezca el símbolo del signo
D Posición del símbolo decimal (en español, la
coma)
G Posición del separador de grupo (en español el
punto)
TO_NUMBER
Convierte textos en números. Se indica el formato de la conversión (utilizando los
mismos símbolos que los comentados anteriormente).
(134)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
TO_DATE
Convierte textos en fechas. Como segundo parámetro se utilizan los códigos de formato
de fechas comentados anteriormente.
CAST
Función muy versátil que permite convertir el resultado a un tipo concreto. Sintaxis:
CAST(expresión AS tipoDatos)
Ejemplo:
Lo interesante es que puede convertir de un tipo a otro. Por ejemplo imaginemos que
tenemos una columna en una tabla mal planteada en la que el precio de las cosas se ha
escrito en Euros. Los datos son (se muestra sólo la columna precio:
precio
La combinación de SUBSTR e INSTR es para obtener sólo los números. Incluso es posible
que haya que utilizar REPLACE para cambiar los puntos por comas (para utilizar el
separador decimal del idioma español).
(135)
gestión de bases de datos
(unidad 4) SQL (II). Consultas
Ejemplo:
SELECT
DECODE(cotizacion,1, salario*0.85,
2,salario * 0.93,
3,salario * 0.96,
salario)
FROM empleados;
Es una función muy poderosa. En su forma más fácil simplemente se indica el elemento:
SELECT XMLElement("prueba") FROM DUAL;
c1
<nombre>Vanesa</nombre>
<nombre>Luis</nombre>
<nombre>Luisa</nombre>
<nombre>Mercedes</nombre>
<nombre>Laura</nombre>
<nombre>Matías</nombre>
(136)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
<nombre>Esperanza</nombre>
Para cada persona aparece una fila y en ella el nombre dentro de un elemento llamado
nombre.
Otro ejemplo más complejo (con subelementos):
SELECT XMLElement(
"persona",
XMLElement("nombre",nombre),
XMLElement("apellido1",apellido1),
XMLElement("apellido2",apellido2)
) AS datos
FROM alumnos;
Resultado:
datos
<persona><nombre>Vanesa</nombre><apellido1>Megino</apellido1><apellido2>Sánchez</ap
ellido2></persona>
<persona><nombre>Luis</nombre><apellido1>Abadía</apellido1><apellido2>Castrourdiales</
apellido2></persona>
<persona><nombre>Luisa</nombre><apellido1>Calvo</apellido1><apellido2>Calvo</apellido2
></persona>
<persona><nombre>Mercedes</nombre><apellido1>Aragón</apellido1><apellido2>Cantor</ap
ellido2></persona>
<persona><nombre>Laura</nombre><apellido1>Albero</apellido1><apellido2>Siniestra</apel
lido2></persona>
<persona><nombre>Matías</nombre><apellido1>Hierro</apellido1><apellido2>Amo</apellido
2></persona>
<persona><nombre>Esperanza</nombre><apellido1>Castro</apellido1><apellido2>González</
apellido2></persona>
Podemos también usar cláusulas de atributos, eso es posible con XMLAttributes, otra
función que es capaz de usar atributos. Su sintaxis es:
El valor es el contenido del atributo y los alias el nombre del atributo. Sólo puede haber
una cláusula XMLAtributes dentro de una XMLElement. Ejemplo:
SELECT XMLElement(
"persona",
XMLAttributes(sexo AS "sexo",dni AS "id"),
XMLElement("nombre",nombre),
XMLElement("apellido1",apellido1),
XMLElement("apellido2",apellido2)
) AS datos FROM personas;
(137)
gestión de bases de datos
(unidad 4) SQL (II). Consultas
Resultado:
datos
<persona sexo="m" id="12030430 ">
<nombre>Vanesa</nombre><apellido1>Megino</apellido1><apellido2>Sánchez</apellido2></persona>
<persona sexo="h" id="12049558 ">
<nombre>Luis</nombre><apellido1>Abadía</apellido1><apellido2>Castrourdiales</apellido2></person
a>
<persona sexo="m" id="12080980 ">
<nombre>Luisa</nombre><apellido1>Calvo</apellido1><apellido2>Calvo</apellido2></persona>
<persona sexo="m" id="12162777 ">
<nombre>Mercedes</nombre><apellido1>Aragón</apellido1><apellido2>Cantor</apellido2></persona>
<persona sexo="m" id="12178979 "
><nombre>Laura</nombre><apellido1>Albero</apellido1><apellido2>Siniestra</apellido2></persona>
<persona sexo="h" id="12213987 ">
<nombre>Matías</nombre><apellido1>Hierro</apellido1><apellido2>Amo</apellido2></persona>
<persona sexo="m" id="12239347 ">
<nombre>Esperanza</nombre><apellido1>Castro</apellido1><apellido2>González</apellido2></person
a>
XMLForest
Se trata de una función similar a XMLElement, sólo que de uso más cómodo. Muestra
elementos XML a partir de datos de las tablas. Su sintaxis es:
datos
<NOMBRE>Vanesa</NOMBRE><AP1>Megino</AP1>
<NOMBRE>Luis</NOMBRE><AP1>Abadía</AP1>
<NOMBRE>Luisa</NOMBRE><AP1>Calvo</AP1>
<NOMBRE>Mercedes</NOMBRE><AP1>Aragón</AP1>
<NOMBRE>Laura</NOMBRE><AP1>Albero</AP1>
<NOMBRE>Matías</NOMBRE><AP1>Hierro</AP1>
<NOMBRE>Esperanza</NOMBRE><AP1>Castro</AP1>
(138)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
Se utilizan comillas dobles y alias en XMLForest para asegurar que los elementos XML
salen en minúsculas (que es lo más recomendable para XML). Aunque el resultado
saldría seguido y en una sola fila, se muestra a continuación en una forma más fácil de
leer en XML.
<listado>
<persona>
<nombre>Luisa</nombre>
<apellido1>Calvo</apellido1>
<apellido2>Calvo</apellido2>
</persona>
<persona>
<nombre>Antonio</nombre>
<apellido1>Sánchez</apellido1>
<apellido2>Fernández</apellido2>
</persona>
<persona>
<nombre>Pablo</nombre>
<apellido1>Varilla</apellido1>
<apellido2>Sánchez</apellido2>
</persona>
<persona>
<nombre>Jorge Luis</nombre>
<apellido1>Andérez</apellido1>
<apellido2>Sánchez</apellido2>
</persona>
(139)
gestión de bases de datos
(unidad 4) SQL (II). Consultas
<persona>
<nombre>Johann</nombre>
<apellido1>Mazukelle</apellido1>
<apellido2>Nburu</apellido2>
</persona>
</listado>
XMLAgg ha conseguido meter todos los elementos dentro del grupo creado, listado. Un
ejemplo más complejo sería (combinando todas las funciones anteriores y usando varias
tablas, cuya técnica se explica en el apartado (4.6)):
SELECT XMLElement(
"listado",
XMLAgg(XMLElement(
"empresa",
XMLForest(e.nombre as "nombre"),
(
SELECT XMLElement(
"trabajador",
XMLAgg(
XMLForest(
nombre as "nombre",
apellido1 as "apellido1",
apellido2 as "apellido2")
)
) FROM alumnos a
WHERE a.cif=e.cif
)
) ORDER BY e.nombre
)
)
FROM empresas e;
El resultado (mostrado de una forma más legible, porque en realidad se mostraría todo
seguido):
<listado>
<empresa>
<nombre>Class</nombre>
<trabajador>
<nombre>Matías</nombre>
<apellido1>Hierro</apellido1>
<apellido2>Amo</apellido2>
<nombre>Esperanza</nombre>
<apellido1>Castro</apellido1>
(140)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
<apellido2>González</apellido2>
</trabajador>
</empresa>
<empresa>
<nombre>FRT S. A.</nombre>
<trabajador>
<nombre>Luis</nombre>
<apellido1>Abadía</apellido1>
<apellido2>Castrourdiales</apellido2>
<nombre>Mercedes</nombre>
<apellido1>Aragón</apellido1>
<apellido2>Cantor</apellido2>
</trabajador>
</empresa>
<empresa>
<nombre>Vidrios Carmelo</nombre>
<trabajador>
<nombre>Luisa</nombre>
<apellido1>Calvo</apellido1>
<apellido2>Calvo</apellido2>
</trabajador>
</empresa>
</listado>
(141)
gestión de bases de datos
(unidad 4) SQL (II). Consultas
Finalmente indicar que se pueden enlazar más de dos tablas a través de sus campos
relacionados. Ejemplo:
(142)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
Sin embargo no siempre las tablas tienen ese tipo de relación, por ejemplo:
EMPLEADOS
Empleado Sueldo
Antonio 18000
Marta 21000
Sonia 15000
CATEGORIAS
categoría Sueldo mínimo Sueldo máximo
D 6000 11999
C 12000 17999
B 18000 20999
A 20999 80000
La forma sería:
(143)
gestión de bases de datos
(unidad 4) SQL (II). Consultas
CROSS JOIN
Utilizando la opción CROSS JOIN se realiza un producto cruzado entre las tablas
indicadas. Eso significa que cada tupla de la primera tabla se combina con cada tupla de
la segunda tabla. Es decir si la primera tabla tiene 10 filas y la segunda otras 10, como
resultado se obtienen 100 filas, resultado de combinar todas entre sí. Ejemplo:
Hay que asegurarse de que sólo son las claves principales y secundarias de las tablas
relacionadas, las columnas en las que el nombre coincide, de otro modo fallaría la
asociación y la consulta no funcionaría.
JOIN USING
Permite establecer relaciones indicando qué columna (o columnas) común a las dos
tablas hay que utilizar:
piezas.modelo=existencias.modelo);
Sólo aparecen piezas presentes en la tabla de existencias. Si hay piezas que no están en
existencias, éstas no aparecen (y si hay existencias que no están en la tabla de piezas,
tampoco salen).
Por ello se permite utilizar relaciones laterales o externas (outer join). Su sintaxis
es:
...
{LEFT | RIGHT | FULL} OUTER JOIN tabla
{ON(condición) | USING (expresion)}
...
Obtiene los datos de las piezas estén o no relacionadas con datos de la tabla de
existencias (la tabla LEFT sería piezas por que es la que está a la izquierda del JOIN).
En la consulta anterior, si el LEFT lo cambiamos por un RIGHT, aparecerán las
existencias no presentes en la tabla piezas (además de las relacionadas en ambas
tablas).
La condición FULL OUTER JOIN produciría un resultado en el que aparecen los
registros no relacionados de ambas tablas (piezas sin existencias relacionadas y
viceversa).
consultas de no coincidentes
Un caso típico de uso de las relaciones externas es el uso de consultas de no
coincidentes. Estas consultas sustituyen de forma más eficiente al operador NOT IN (se
explica más adelante) ya que permiten comprobar filas de una tabla que no están
presentes en una segunda tabla que se relaciona con la primera a través de alguna clave
secundaria.
Por ejemplo supongamos que tenemos una base de datos que posee una tabla de
empresas y otra de trabajadores de las empresas. Ambas tablas supongamos que se
relacionan a través del CIF de la empresa. Si existen empresas de las que no tenemos
ningún trabajador podremos saberlo mediante esta consulta:
(4.7) agrupaciones
Es muy común utilizar consultas en las que se desee agrupar los datos a fin de realizar
cálculos en vertical, es decir calculados a partir de datos de distintos registros.
Para ello se utiliza la cláusula GROUP BY que permite indicar en base a qué registros
se realiza la agrupación. Con GROUP BY la instrucción SELECT queda de esta forma:
SELECT listaDeExpresiones
FROM listaDeTablas
[JOIN tablasRelacionadasYCondicionesDeRelación]
[WHERE condiciones]
[GROUP BY grupos]
[HAVING condicionesDeGrupo]
[ORDER BY columnas];
En el apartado GROUP BY, se indican las columnas por las que se agrupa. La función de
este apartado es crear un único registro por cada valor distinto en las columnas del
grupo. Si por ejemplo agrupamos en base a las columnas tipo y modelo en una tabla de
existencias, se creará un único registro por cada tipo y modelo distintos:
SELECT tipo,modelo
FROM existencias
GROUP BY tipo,modelo;
(146)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
TI MODELO
AR 6
AR 9
AR 15
AR 20
BI 10
BI 38
(147)
gestión de bases de datos
(unidad 4) SQL (II). Consultas
Todas las funciones de la tabla anterior se calculan para cada elemento del grupo, así la
expresión:
SELECT tipo,modelo, cantidad, SUM(Cantidad)
FROM existencias
GROUP BY tipo,modelo;
TI MODELO SUM(CANTIDAD)
AR 6 10530
AR 9 4928
AR 15 5667
AR 20 43
BI 10 363
BI 38 1740
WHERE SUM(Cantidad)>500
*
ERROR en línea 3:
ORA-00934: función de grupo no permitida aquí
La razón es que Oracle calcula primero el WHERE y luego los grupos; por lo que esa
condición no la puede realizar al no estar establecidos los grupos.
Por ello se utiliza la cláusula HAVING, que se ejecuta una vez realizados los grupos.
Se usaría de esta forma:
(148)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
FROM existencias
WHERE tipo!='AR'
GROUP BY tipo,modelo
HAVING SUM(Cantidad)>500;
(4.8) subconsultas
(4.8.1) uso de subconsultas simples
Se trata de una técnica que permite utilizar el resultado de una tabla SELECT en otra
consulta SELECT. Permite solucionar consultas que requieren para funcionar el resultado
previo de otra consulta.
La sintaxis es:
SELECT listaExpresiones
FROM tabla
WHERE expresión OPERADOR
(SELECT listaExpresiones
FROM tabla);
(149)
gestión de bases de datos
(unidad 4) SQL (II). Consultas
La última consulta obtiene los empleados cuyas pagas estén entre lo que gana Luís
(1870 euros) y lo que gana Martina (2500) .
Las subconsultas siempre se deben encerrar entre paréntesis y se debería colocar a
la derecha del operador relacional. Una subconsulta que utilice los valores >,<,>=,...
tiene que devolver un único valor, de otro modo ocurre un error. Además tienen que
tener el mismo tipo de columna para relacionar la subconsulta con la consulta que la
utiliza (no puede ocurrir que la subconsulta tenga dos columnas y ese resultado se
compare usando una sola columna en la consulta general).
(150)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
Ejemplo:
En ese caso se obtienen los nombres de los empleados cuyos dni están en la tabla de
directivos.
Si se necesita comprobar dos columnas en una consulta IN, se hace:
(151)
gestión de bases de datos
(unidad 4) SQL (II). Consultas
Esta consulta devuelve las piezas que se encuentran en la tabla de existencias (es igual
al ejemplo comentado en el apartado subconsultas sobre múltiples valores). La consulta
contraria es :
Normalmente las consultas EXISTS se pueden realizar de alguna otra forma con los
operadores ya comentados.
(4.9.2) intersecciones
De la misma forma, la palabra INTERSECT permite unir dos consultas SELECT de modo
que el resultado serán las filas que estén presentes en ambas consultas.
Ejemplo; tipos y modelos de piezas que se encuentren sólo en los almacenes 1 y 2:
(4.9.3) diferencia
Con MINUS también se combinan dos consultas SELECT de forma que aparecerán los
registros del primer SELECT que no estén presentes en el segundo.
(152)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
(SELECT....
....
UNION
SELECT....
...
)
MINUS
SELECT.... /* Primero se hace la unión y luego la diferencia*/
Aparece el número de cada fila en la posición de la tabla. Esa función actualiza sus
valores usando subconsultas de modo que la consulta:
Puesto que la consulta SELECT edad, nombre FROM clientes ORDER BY edad DESC,
obtiene una lista de los clientes ordenada por edad, el SELECT superior obtendrá esa
lista pero mostrando el orden de las filas en esa consulta. Eso permite hacer consultas
el tipo top-n, (los n más....).
Por ejemplo para sacar el top-10 de la edad de los clientes (los 10 clientes más
mayores):
(153)
gestión de bases de datos
(unidad 4) SQL (II). Consultas
EMPLEADO JEFE
Antonio Ángel
Ángel
Eva Ángel
Carmen Eva
Andrés Eva
Carmelo Andrés
En el ejemplo se observa como un jefe puede tener otro jefe, generando una estructura
jerárquica:
En este tipo de estructuras, a veces se requieren consultas que muestren todos los
empleados de un jefe, mostrando los mandos intermedios. Se trata de una consulta que
recorre ese árbol. Este tipo de consultas posee esta sintaxis:
El apartado CONNECT permite indicar qué relación hay que seguir para recorrer el
árbol. La palabra PRIOR indica hacia dónde se dirige el recorrido. Finalmente el
apartado START indica la condición de inicio del recorrido (normalmente la condición
(154)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
que permita buscar el nodo del árbol por el que comenzamos el recorrido, es decir sirve
para indicar desde donde comenzamos. Ejemplo:
Resultado:
NOMBRE
Andrés
Eva
Ángel
Sin embargo:
Devuelve:
NOMBRE
Andrés
Carmelo
NOMBRE
Ángel
Antonio
Eva
Carmen
Andrés
Carmelo
(155)
gestión de bases de datos
(unidad 4) SQL (II). Consultas
Resultado:
LEVEL NOMBRE
1 Ángel
2 Antonio
2 Eva
3 Carmen
3 Andrés
4 Carmelo
Para esos casos disponemos de la cláusula NOCYCLE que controla los resultados
repetidos y evita esos caminos. En cualquier caso consultas en datos no jerarquizados en
forma de árbol sino en forma de grafo (como el comentado ejemplo de las redes
sociales), pueden ocupar muchísimo tiempo a Oracle por lo que no es mala idea pensar
en otra solución con ayuda de PL/SQL (lenguaje que se comenta en estos mismos
apuntes).
SELECT DISTINCT amigo FROM contactos
START WITH nombre='Ángel'
CONNECT BY NOCYCLE PRIOR amigo=nombre; -- Ahora sí
(156)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
Por cierto, el DISTINCT impide que aparezcan muchas veces las mismas personas. Ya
que pueden ser amigos de muchos de mis amigos (e incluso de muchos de los amigos de
mis amigos).
Esta consulta suma las cantidades de la tabla existencias por cada tipo y modelo
distinto. Si añadimos:
Entonces nos añade un registro para cada tipo en el que aparece la suma del total para
ese tipo. Al final mostrará un registro con el total absoluto. Es decir el resultado de esa
consulta es:
TI MODELO SUM(CANTIDAD)
AR 6 10530
AR 9 4928
AR 15 5667
AR 20 43
AR 21168
BI 10 363
BI 38 1740
BI 57 1638
BI 3741
CL 12 7000
CL 15 3068
CL 18 6612
CL 16680
EM 21 257
EM 42 534
EM 791
(157)
gestión de bases de datos
(unidad 4) SQL (II). Consultas
TI MODELO SUM(CANTIDAD)
PU 5 12420
PU 9 7682
PU 20102
TO 6 464
TO 9 756
TO 10 987
TO 12 7740
TO 16 356
TO 10303
TU 6 277
TU 9 876
TU 10 1023
TU 12 234
TU 16 654
TU 3064
75849
Se pueden unir varias columnas entre paréntesis para tratarlas como si fueran una
unidad:
(4.11.2) CUBE
Es muy similar al anterior, sólo que este calcula todos los subtotales relativos a la
consulta. Ejemplo:
Resulta:
TI MODELO SUM(CANTIDAD)
75849
5 12420
6 11271
(158)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
TI MODELO SUM(CANTIDAD)
9 14242
10 2373
12 14974
15 8735
16 1010
18 6612
20 43
21 257
38 1740
42 534
57 1638
AR 21168
AR 6 10530
AR 9 4928
AR 15 5667
AR 20 43
BI 3741
BI 10 363
BI 38 1740
BI 57 1638
CL 16680
CL 12 7000
CL 15 3068
CL 18 6612
EM 791
EM 21 257
EM 42 534
PU 20102
PU 5 12420
PU 9 7682
TO 10303
TO 6 464
TO 9 756
TO 10 987
TO 12 7740
TO 16 356
(159)
gestión de bases de datos
(unidad 4) SQL (II). Consultas
TI MODELO SUM(CANTIDAD)
TU 3064
TU 6 277
TU 9 876
TU 10 1023
TU 12 234
TU 16
(4.11.3) GROUPING
Se trata de una función que funciona con ROLLUP y CUBE y que recibe uno o más
campos e indica si la fila muestra un subtotal referido a los campos en cuestión. Si la
fila es un subtotal de esos campos pone 1, sino lo marca con 0. Ejemplo:
Sale:
(160)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
(161)
gestión de bases de datos
(unidad 4) SQL (II). Consultas
SELECT...
...
GROUP BY GROUPING SETS (listaDeCampos1) [,(lista2)...]
Las listas indican los campos por los que se realiza la agrupación. Ejemplo:
(162)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
Que mostraría un informe espectacular sobre las tablas anteriores. Así como:
(163)
gestión de bases de datos
(unidad 4) SQL (II). Consultas
Sintaxis:
Ejemplo:
Lógicamente las columnas del SELECT se tienen que corresponder con las columnas a
rellenar mediante INSERT (observar las flechas).
UPDATE empleados
SET sueldo=sueldo*1.10
WHERE id_seccion =(SELECT id_seccion FROM secciones
WHERE nom_seccion='Producción');
UPDATE empleados
SET puesto_trabajo=(SELECT puesto_trabajo
FROM empleados
WHERE id_empleado=12)
WHERE seccion=23;
(164)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
DELETE empleados
WHERE id_empleado IN
(SELECT id_empleado FROM errores_graves);
En este caso se trata de una subconsulta creada con el operador IN, se eliminarán los
empleados cuyo identificador esté dentro de la tabla de errores graves.
(4.13) vistas
(4.13.1) introducción
Una vista no es más que una consulta almacenada a fin de utilizarla tantas veces como
se desee. Una vista no contiene datos sino la instrucción SELECT necesaria para crear la
vista, eso asegura que los datos sean coherentes al utilizar los datos almacenados en las
tablas. Por todo ello, las vistas gastan muy poco espacio de disco.
Las vistas se emplean para:
Realizar consultas complejas más fácilmente, ya que permiten dividir la
consulta en varias partes
Proporcionar tablas con datos completos
Utilizar visiones especiales de los datos
Ser utilizadas como tablas que resumen todos los datos
Ser utilizadas como cursores de datos en los lenguajes procedimentales (como
PL/SQL)
(165)
gestión de bases de datos
(unidad 4) SQL (II). Consultas
Lo bueno de las vistas es que tras su creación se utilizan como si fueran una tabla.
Ejemplo:
AS
( SELECT l.id_localidad, l.nombre, l.poblacion,
n_provincia, p.nombre, p.superficie, l2.nombre,
id_comunidad, c.nombre, l3.nombre
FROM localidades l
JOIN provincias p USING (n_provincia)
JOIN comunidades c USING (id_comunidad)
JOIN localidades l2 ON (p.id_capital=l2.id_localidad)
JOIN localidades l3 ON (c.id_capital=l3.id_localidad)
);
(166)
2o curso de administración de sistemas informáticos en red
autor: Jorge Sánchez www.jorgesanchez.net
La columna TEXT de esa vista contiene la sentencia SQL que se utilizó para crear la
vista (sentencia que es ejecutada cada vez que se invoca a la vista).
(167)