SQL PDF
SQL PDF
El lenguaje SQL
2º de ASI
1
Reconocimiento-NoComercial-CompartirIgual 2.0 España
• Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia de esta
obra.
• Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los
derechos de autor
Los derechos derivados de usos legítimos u otras limitaciones no se ven afectados por lo anterior.
Esto es un resumen legible por humanos del texto legal (la licencia completa) disponible en la siguiente
dirección de Internet:
http://creativecommons.org/licenses/by-nc-sa/2.0/es/legalcode.es
3
5.1) características y conceptos básicos
5.1.2) objetivos
SQL pretende ser un lenguaje que simula su escritura en lenguaje normal. De ahí que se le
considere un lenguaje de cuarta generación. Consta de palabras especiales y de
expresiones.
Se trata de un lenguaje que intenta agrupar todas las funciones que se le pueden pedir
a una base de datos
5
Sistemas Gestores de Bases de Datos
El lenguaje SQL
5.3.3) nota
En estos apuntes se hace referencia al SQL estándar y sobre todo al utilizado por Oracle.
6
2º de Administración de Sistemas Informáticos
Copyleft - Jorge Sánchez
5.4) DDL
5.4.1) introducción
El DDL es la parte del lenguaje que se encarga de la definición de datos.
Fundamentalmente se encarga de la creación de esquemas, tablas y vistas. Por ahora
veremos como crear tablas.
Cada usuario de una base de datos posee un esquema. El esquema suelte 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. Esos 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 su acceso por parte
de otros usuarios.
Hay que tener en cuenta que ninguna instrucción DDL puede ser anulada por
una instrucción ROLLBACK (que se verá más adelante) por lo que hay que tener
mucha precaución a la hora de utilizarlas.
7
Sistemas Gestores de Bases de Datos
El lenguaje SQL
5.4.3) creación de tablas
Ejemplo:
DESCRIBE proveedores;
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.
8
2º de Administración de Sistemas Informáticos
Copyleft - Jorge Sánchez
Indicando la tabla se añaden los datos que se especifiquen tras el apartado values en un
nuevo registro. Los valores deben corresponderse con el orden de las columnas. Si no es
así se puede indicar tras el nombre de la tabla y entre paréntesis. Ejemplo:
Descripción Tipos ANSI SQL SQL Server Oracle SQL Tipo MySQL
Texto de CHARACTER(n) CHAR(n) CHAR(n) CHAR(n)
anchura fija
CHAR(n)
Texto de CHARACTER VARCHAR(n) VARCHAR2(n) VARCHAR(n)
anchura VARYING(n)
variable
CHAR VARYING(n)
Texto de NATIONAL NCHAR(n) NCHAR(n)
anchura fija CHARACTER(n)
para
NATIONAL
9
Sistemas Gestores de Bases de Datos
El lenguaje SQL
Descripción Tipos ANSI SQL SQL Server Oracle SQL Tipo MySQL
caracteres CHAR(n)
nacionales
NCHAR(n)
Texto de NATIONAL NVARCHAR(n) NVARCHAR2(n)
anchura CHARACTER
variable para VARYING(n)
caracteres
NATIONAL CHAR
nacionales
VARYING(n)
NCHAR
VARYING(n)
Enteros INTEGER INT NUMBER(38) INT
INT INT
SMALLINT SMALL INT SMALL INT
TINY INT
Decimal de FLOAT(b) FLOAT NUMBER FLOAT(m,d)
coma variable
DOUBLE DOUBLE(m,d)
DOUBLE
PRECISSION
REAL
Decimal de NUMERIC(m,d) NUMERIC(m,d) NUMBER(m,d)
coma fija
DECIMAL(m,d) DECIMAL(m,d) DECIMAL(m,d)
Fechas DATE DATE DATE
Fecha y hora TIMESTAMP TIMESTAMP TIMESTAMP TIMESTAMP
DATETIME DATETIME
SMALLDATETIME TIME
Intervalos INTERVAL INTERVAL YEAR
Lógicos BIT BINARY BIT
BOOL
Texto gran LOB TEXT y NTEXT LONG (en TEXT,
longitud desuso) y CLOB MEDIUM TEXT
y LONG TEXT
Binario de BLOB IMAGE RAW, LONG BLOB,
gran longitud RAW MEDIUM BLOB
y LONG BLOB
BLOB
textos
Para los textos disponemos de los siguientes tipos:
VARCHAR. Para textos de longitud variable. Su tamaño depende de la base de datos
(en Oracle es de 4000)
10
2º de Administración de Sistemas Informáticos
Copyleft - Jorge Sánchez
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 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
VARCHAR, 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
Si son enteros se indican con INT (en Oracle es el tipo NUMBER seguido del tamaño) que
equivale a los long del lenguaje C. Si son decimales se elige FLOAT o DOUBLE si se desea
precisión doble (en Oracle es el tipo NUMBER a secas).
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.
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 en el
tiempo. Un ejemplo de TIMESTAMP sería ‘2/2/2004 18:34:23,34521’. En este caso 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:
11
Sistemas Gestores de Bases de Datos
El lenguaje SQL
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. Ejemplo:
cambiar de nombre
La orden RENAME permite el cambio de nombre de cualquier objeto. Sintaxis:
modificar tablas
La versátil ALTER TABLE permite hacer cambios en la estructura de una tabla.
añadir columnas
ALTER TABLE nombreTabla ADD(nombreColumna TipoDatos
[Propiedades] [,columnaSiguiente tipoDatos [propiedades]...)
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.
borrar columnas
ALTER TABLE nombreTabla DROP(columna [,columnaSiguiente,...]);
Elimina la columna indicada de manera irreversible e incluyendo los datos que contenía.
No se puede eliminar la última columna (habrá que usar DROP TABLE).
12
2º de Administración de Sistemas Informáticos
Copyleft - Jorge Sánchez
modificar columna
Permite cambiar el tipo de datos y propiedades de una determinada columna. Sintaxis:
renombrar columna
Esto permite cambiar el nombre de una columna. Sintaxis
5.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 (en las
que eso sea posible) 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:
13
Sistemas Gestores de Bases de Datos
El lenguaje SQL
Las restricciones tienen un nombre, se puede hacer que sea Oracle el que les ponga
nombre, pero entonces será críptico. Por eso es mejor ponerle uno mismo.
Los nombres de restricción no se pueden repetir para el mismo esquema, por lo que 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).
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. La otra forma (que admite
nombre) es:
valores únicos
Las restricciones de tipo UNIQUE obligan a que el contenido de uno o más campos no
puedan repetir valores. Nuevamente hay dos formas de colocar esta restricción:
En ese caso el nombre de la restricción la coloca el sistema Oracle. Otra forma es:
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.
Los campos UNIQUE son las claves candidatas de la tabla (que habrán sido detectadas
en la fase de diseño de la base de datos).
clave primaria
La clave primaria de una tabla la forman las columnas que indican a cada registro de la
misma. La clave primaria hace que los campos que la forman sean NOT NULL (sin
posibilidad de quedar vacíos) y que los valores de los campos sean de tipo UNIQUE (sin
posibilidad de repetición).
14
2º de Administración de Sistemas Informáticos
Copyleft - Jorge Sánchez
Si la clave está formada por un solo campo basta con:
Esta completa forma de crear la tabla alquiler incluye sus claves foráneas, el campo dni
hace referencia al campo dni de la tabla clientes y el campo cod_pelicula que hace
referencia al campo cod de la tabla peliculas. También hubiera bastado con indicar sólo la
tabla a la que hacemos referencia, si no se indican los campos relacionados de esa tabla, se
toma su clave principal (que es lo normal).
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 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 (sólo válida para claves de un solo campo) es:
Esta definición de clave secundario es idéntica a la anterior, sólo que no hace falta colocar
el texto FOREIGN KEY.
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:
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 esas cuatro cláusulas se podría sustituir la palabra DELETE por la palabra UPDATE,
haciendo que el funcionamiento se refiera a cuando se modifica un registro de la tabla
principal.
En la base de datos Oracle sólo se permite utilizar ON DELETE SET NULL o ON
DELETE CASCADE.
restricciones de validación
Son restricciones que dictan una condición que deben cumplir los contenidos de una
columna. Una misma columna puede tener múltiples CHECKS en su definición (se
pondrían varios CONSTRAINT seguidos, sin comas).
Ejemplo:
Para poder hacer referencia a otras columnas hay que construir la restricción de forma
independiente a la columna:
añadir restricciones
Es posible querer añadir restricciones tras haber creado la tabla. En ese caso se utiliza la
siguiente sintaxis:
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.
18
2º de Administración de Sistemas Informáticos
Copyleft - Jorge Sánchez
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:
activar restricciones
Anula la desactivación. Formato:
mostrar restricciones
El trabajo con restricciones ya se ha visto que es complejo. Por eso todas las bases de datos
suelen proporcionar una vista (o más) del diccionario de datos que permite consultar las
restricciones. En el caso de Oracle, se puede utilizar la vista del diccionario de datos
USER_CONSTRAINTS.
Esta vista permite identificar las restricciones colocadas por el usuario
(ALL_CONSTRAINTS permite mostrar las restricciones de todos los usuarios, pero sólo
está permitida a los administradores). En esa vista aparece toda la información que el
diccionario de datos posee sobre las restricciones. En ella tenemos las siguientes columnas
interesantes:
En el diccionario de datos hay otra vista que proporciona información sobre restricciones,
se trata de USER_CONS_COLUMNS, en dicha tabla se muestra información sobre las
columnas que participan en una restricción. Así si hemos definido una clave primaria
formada por los campos uno y dos, en la tabla USER_CONS_COLUMNS aparecerán dos
entradas, una para el primer campo del índice y otra para el segundo. Se indicará además
el orden de aparición en la restricción. Ejemplo (resultado de la instrucción SELECT *
FROM USER_CONS_COLUMNS):
20
5.5) DQL
5.5.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.
Ejemplos:
Πnombre, apellidos(Cliente)
21
Manual de SQL para Oracle 9i
consultas avanzadas
El renombrado es lo que permite realizar la cláusula AS, sólo que en SQL se utiliza
exclusivamente para abreviar las referencias a una tabla. Ejemplo:
5.5.3) cálculos
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:
concatenación de textos
Todas las bases de datos incluyen algún operador para encadenar textos. En SQLSERVER
es el signo & en Oracle son los signos || Ejemplo (oracle):
22
2º de Administración de Sistemas Informáticos
Copyleft - Jorge Sánchez
El resultado puede ser:
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 38 BI-38
BI 57 BI-57
5.5.4) 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:
operadores de comparación
Se pueden utilizar en la cláusula WHERE, son:
Operador Significado
> Mayor que
< Menor que
>= Mayor o igual que
<= Menor o igual que
23
Manual de SQL para Oracle 9i
consultas avanzadas
Operador Significado
= Igual
<> Distinto
!= 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.
Así la letra Ñ y las vocales acentuadas nunca quedan bien ordenadas ya que figuran
con códigos más altos. Las mayúsculas figuran antes que las minúsculas (la letra 'Z' es
menor que la 'a').
valores lógicos
Son:
Operador Significado
AND Devuelve verdadero si las
expresiones a su izquierda y
derecha son ambas verdaderas
OR Devuelve verdadero si cualquiera
de las dos expresiones a izquierda
y derecha del OR, son verdaderas
NOT Invierte la lógica de la expresión
que está a su derecha. Si era
verdadera, mediante NOT pasa a
ser falso.
Ejemplos:
BETWEEN
El operador BETWEEN nos permite obtener datos que se encuentren en un rango. Uso:
24
2º de Administración de Sistemas Informáticos
Copyleft - Jorge Sánchez
IN
Permite obtener registros cuyos valores estén en una lista:
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:
IS NULL
Devuelve verdadero si una expresión contiene un 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 cuando una determinada columna no es nula
Precedencia de operadores
A veces las expresiones que se producen en los SELECT son muy extensas y es difícil saber
que parte de la expresión se evalúa primero, por ello se indica la siguiente tabla de
precedencia (tomada de Oracle):
1 *(Multiplicar) / (dividir)
2 + (Suma) - (Resta)
25
Manual de SQL para Oracle 9i
consultas avanzadas
3 || (Concatenación)
4 Comparaciones (>, <, !=, ...)
5 IS [NOT] NULL, [NOT ]LIKE, IN
6 NOT
7 AND
8 OR
5.5.5) 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:
SELECT expresiones
FROM tabla
[WHERE condición]
ORDER BY listaDeCamposOAlias;
5.5.6) 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 reciben datos para poder operar (parámetros) y devuelven un
resultado (que depende de los parámetros enviados a la función. Los argumentos se pasan
entre paréntesis:
nombreFunción[(parámetro1[, parámetro2,...])]
Si una función no precisa parámetros (como SYSDATE) no hace falta colocar los
paréntesis.
26
2º de Administración de Sistemas Informáticos
Copyleft - Jorge Sánchez
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).
Sólo veremos las de primeras (más adelante se comentan las de varias filas).
Muestra una tabla con el contenido de ese cálculo. DUAL es una tabla interesante para
hacer pruebas.
funciones de caracteres
Función Descripción
LOWER(texto) Convierte el texto a minúsculas (funciona con los
caracteres españoles)
UPPER(texto) Convierte el texto a mayúsculas
INITCAP(texto) Coloca la primera letra de cada palabra en
mayúsculas
funciones de transformación
Función Descripción
RTRIM(texti) Elimina los espaciosa la derecha del texto
LTRIM(texto) Elimina los espacios a la izquierda que posea el
texto
TRIM(texto) Elimina los espacios en blanco a la izquierda y la
derecha del texto y los espacios dobles del
interior.
TRIM(caracteres FROM texto) Elimina del texto los caracteres indicados. Por
ejemplo TRIM('h' FROM nombre) elimina las
haches de la columna nombre que estén a la
izquierda y a la derecha
SUBSTR(texto,n[,m]) Obtiene los m siguientes caracteres del texto a
partir de la posición n (si m no se indica se cogen
desde n hasta el final).
27
Manual de SQL para Oracle 9i
consultas avanzadas
Función Descripción
LENGTH(texto) Obtiene el tamaño del texto
INSTR(texto, textoBuscado Obtiene la posición en la que se encuentra el texto
[,posInicial [, nAparición]]) buscado en el texto inicial. Se puede empezar a
buscar a partir de una posición inicial concreta e
incluso indicar el número de aparición del texto
buscado.
Ejemplo, si buscamos la letra a y ponemos 2 en
nAparición, devuelve la posición de la segunda
letra a del texto).
Si no lo encuentra devuelve 0
REPLACE(texto, textoABuscar, Buscar el texto a buscar en un determinado texto
textoReemplazo) y lo cambia por el indicado como texto de
reemplazo
funciones numéricas
redondeos
Función Descripción
ROUND(n,decimales) Redondea el número al siguiente número con el
número de decimales indicado más cercano.
ROUND(8.239,2) devuelve 8.3
TRUNC(n,decimales) Los decimales del número se cortan para que sólo
aparezca el número de decimales indicado
matemáticas
Función Descripción
MOD(n1,n2) Devuelve el resto resultado de dividir n1 entre n2
POWER(valor,exponente) Eleva el valor al exponente indicado
SQRT(n) Calcula la raíz cuadrada de n
SIGN(n) Devuelve 1 si n es positivo, cero si vale cero y -1 si
es negativo
ABS(n) Calcula el valor absoluto de n
EXP(n) Calcula en, es decir el exponente en base e del
número n
LN(n) Logaritmo neperiano de n
LOG(n) Logaritmo en base 10 de n
28
2º de Administración de Sistemas Informáticos
Copyleft - Jorge Sánchez
Función Descripción
SIN(n) Calcula el seno de n (n tiene que estar en
radianes)
COS(n) Calcula el coseno de n (n tiene que estar en
radianes)
TAN(n) Calcula la tangente de n (n tiene que estar en
radianes)
ACOS(n) Devuelve en radianes el arcocoseno de n
ASIN(n) Devuelve en radianes el arcoseno de n
ATAN(n) Devuelve en radianes el arcotangente de n
SINH(n) Devuelve el seno hiperbólico de n
COSH(n) Devuelve el coseno hiperbólico de n
TANH(n) Devuelve la tangente hiperbólica de n
Función Descripción
NVL(valor,sustituto) Si el valor es NULL, devuelve el valor sustituto;
de otro modo, devuelve valor
NVL2(valor,sustituto1, Variante de la anterior, devuelve el valor
sustituto2) sustituto1 si valor no es nulo. Si valor es nulo
devuelve el sustituto2
intervalos
Los intervalos son datos relacionados con las fechas en sí, pero que no son fechas. Hay dos
tipos de intervalos el INTERVAL DAY TO SECOND que sirve para representar días, horas,
minutos y segundos; y el INTERVAL YEAR TO MONTH que representa años y meses.
Para los intervalos de año a mes los valores se pueden indicar de estas formas:
29
Manual de SQL para Oracle 9i
consultas avanzadas
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:
Función Descripción
SYSDATE Obtiene la fecha y hora actuales
SYSTIMESTAMP Obtiene la fecha y hora actuales en formato
TIMESTAMP
30
2º de Administración de Sistemas Informáticos
Copyleft - Jorge Sánchez
calcular fechas
Función Descripción
ADDMONTHS(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
ROUND(fecha [,'formato'] Redondea la fecha al valor de aplicar el formato a
la fecha. El formato puede ser:
funciones de conversión
Oracle es capaz de convertir datos automáticamente a fin de que la expresión final tenga
sentido. En ese sentido son fáciles las conversiones de texto a número y viceversa.
Ejemplo:
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.
31
Manual de SQL para Oracle 9i
consultas avanzadas
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
DD Día en formato de dos cifras
Q Semestre
WW Semana del año
D Día de la semana (del 1 al 7)
DDD Día 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).
TO_DATE
Convierte textos en fechas. Como segundo parámetro se utilizan los códigos de formato de
fechas comentados anteriormente.
El producto cartesiano a veces es útil para realizar consultas complejas, pero en el caso
normal no lo es. necesitamos discriminar ese producto para que sólo aparezcan los
registros de las tareas relacionadas con sus empleados correspondientes. A eso se le llama
asociar (join) tablas
asociando tablas
La forma de realizar correctamente la consulta anterior (asociado las tareas con los
empleados que la realizaron sería:
Finalmente indicar que se pueden enlazar más de dos tablas a través de sus campos
relacionados. Ejemplo:
34
2º de Administración de Sistemas Informáticos
Copyleft - Jorge Sánchez
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:
CROSS JOIN
Utilizando la opción CROSS JOIN se realiza un producto cruzado entre las tablas
indicadas. Esta orden es equivalente al producto del álgebra relacional. Ejemplo:
NATURAL JOIN
Establece una relación de igualdad entre las tablas a través de los campos que tengan el
mismo nombre en ambas tablas:
JOIN USING
Permite establecer relaciones indicando qué campo (o campos) común a las dos tablas hay
que utilizar:
JOIN ON
Permite establecer relaciones cuya condición se establece manualmente, lo que permite
realizar asociaciones más complejas o bien asociaciones cuyos campos en las tablas no
tienen el mismo nombre:
36
2º de Administración de Sistemas Informáticos
Copyleft - Jorge Sánchez
Equivalencia con el álgebra relacional:
álgebra relacional:
localidades ∞ provincias
provincias.id_capital=localidades.id_localidad
relaciones externas
La última posibilidad es obtener relaciones laterales o externas (outer join). Para ello se
utiliza la sintaxis:
En este consulta además de las relacionadas, aparecen los datos de los registros de la tabla
piezas que no están en existencias. 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.
5.5.8) 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 condiciones de grupo]
[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;
37
Manual de SQL para Oracle 9i
consultas avanzadas
TI MODELO
AR 6
AR 9
AR 15
AR 20
BI 10
BI 38
Es decir es un resumen de los datos anteriores. Los datos n_almacen y cantidad no están
disponibles directamente ya que son distintos en los registros del mismo grupo. Sólo se
pueden utilizar desde funciones (como se verá ahora). Es decir esta consulta es errónea:
38
2º de Administración de Sistemas Informáticos
Copyleft - Jorge Sánchez
Función Significado
COUNT(*) Cuenta los elementos de un grupo. Se utiliza el
asterisco para no tener que indicar un nombre de
columna concreto, el resultado es el mismo para
cualquier columna
SUM(expresión) Suma los valores de la expresión
AVG(expresión) Calcula la media aritmética sobre la expresión
indicada
MIN(expresión) Mínimo valor que toma la expresión indicada
MAX(expresión) Máximo valor que toma la expresión indicada
STDDEV(expresión) Calcula la desviación estándar
VARIANCE(expresión) Calcula la varianza
Todos esos valores se calculan para cada elemento del grupo, así la expresión:
TI MODELO SUM(CANTIDAD)
AR 6 10530
AR 9 4928
AR 15 5667
AR 20 43
BI 10 363
BI 38 1740
condiciones HAVING
A veces se desea restringir el resultado de una expresión agrupada, por ejemplo con:
39
Manual de SQL para Oracle 9i
consultas avanzadas
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 efectúa una vez realizados los grupos. Se
usaría de esta forma:
1> Seleccionar las filas deseadas utilizando WHERE. Esta cláusula eliminará
columnas en base a la condición indicada
3> Se calculan los valores de las funciones de totales (COUNT, SUM, AVG,...)
5.5.9) subconsultas
Se trata de una técnica que permite utilizar el resultado de una tabla SELECT en otra
consulta SELECT. Permite solucionar problemas en los que el mismo dato aparece dos
veces.
40
2º de Administración de Sistemas Informáticos
Copyleft - Jorge Sánchez
La sintaxis es:
SELECT listaExpresiones
FROM tabla
WHERE expresión operador
(SELECT listaExpresiones
FROM tabla);
Ejemplo:
La última consulta obtiene los empleados cuyas pagas estén entre lo que gana Luis y lo que
gana Martina.
Una subconsulta que utilice los valores >,<,>=,... tiene que devolver un único valor, de
otro modo ocurre un error. Pero a veces se utilizan consultas del tipo: mostrar el sueldo y
nombre de los empleados cuyo sueldo supera al de cualquier empleado del departamento
de ventas.
La subconsulta necesaria para ese resultado mostraría los sueldos del departamento de
ventas. Pero no podremos utilizar un operador de comparación directamente ya que
compararíamos un valor con muchos valores. La solución a esto es utilizar instrucciones
especiales entre el operador y la consulta.
41
Manual de SQL para Oracle 9i
consultas avanzadas
Instrucción Significado
ANY Compara con cualquier registro de la consulta. La
instrucción es válida si hay un registro en la
subconsulta que permite que la comparación sea
cierta
ALL Compara con todos los registros de la consulta. La
instrucción resulta cierta si es cierta toda
comparación con los registros de la subconsulta
IN No usa comparador, ya que sirve para comprobar
si un valor se encuentra en el resultado de la
subconsulta
NOT IN Comprueba si un valor no se encuentra en una
subconsulta
Ejemplo:
En ese caso se obtienen los nombres de los empleados cuyos dni están en la tabla de
directivos.
uniones
La palabra UNION permite añadir el resultado de un SELECT a otro SELECT. Para ello
ambas instrucciones tienen que utilizar el mismo número y tipo de columnas. Ejemplo:
42
2º de Administración de Sistemas Informáticos
Copyleft - Jorge Sánchez
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.
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.
Se podrían hacer varias combinaciones anidadas (una unión cuyo resultado se
intersectara con otro SELECT por ejemplo), en ese caso es conveniente utilizar paréntesis
para indicar qué combinación se hace primero:
(SELECT....
....
UNION
SELECT....
...
)
MINUS
SELECT.... /* Primero se hace la unión y luego la diferencia*/
5.6) DML
5.6.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.
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
43
Manual de SQL para Oracle 9i
consultas avanzadas
defecto (DEFAULT) o bien con NULL si no se indicó valor alguno. Si algún campo tiene
restricción de tipo 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:
Ejemplo:
44
2º de Administración de Sistemas Informáticos
Copyleft - Jorge Sánchez
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. El segundo UPDATE incrementa los precios en un 16%. La expresión para el
valor puede ser todo lo compleja que se desee:
UPDATE empleados
SET puesto_trabajo=(SELECT puesto_trabajo
FROM empleados
WHERE id_empleado=12)
WHERE seccion=23;
Esta consulta coloca a todos los empleados de la sección 23 el mismo puesto de trabajo
que el empleado número 12. Este tipo de actualizaciones sólo son válidas si el subselect
devuelve un único valor, que además debe de ser compatible con la columna que se
actualiza.
Hay que tener en cuenta que las actualizaciones no pueden saltarse las reglas de
integridad que posean las tablas.
45
Manual de SQL para Oracle 9i
consultas avanzadas
Es más sencilla que el resto, elimina los registros de la tabla que cumplan la condición
indicada. Ejemplos:
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 (véase página 15, clave
secundaria o foránea) hace que no sólo se borren los registros indicados en el SELECT,
sino todos los relacionados.
5.6.5) 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.
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.
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.
46
2º de Administración de Sistemas Informáticos
Copyleft - Jorge Sánchez
5.7) vistas
5.7.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 otro lado, las vistas gastan muy poco espacio de disco
Las vistas se emplean para:
Realizar consultas complejas más fácilmente
Proporcionar tablas con datos completos
Utilizar visiones especiales de los datos
47
Manual de SQL para Oracle 9i
consultas avanzadas
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)
)
La creación de la vista del ejemplo es compleja ya que hay relaciones complicadas, pero
una vez creada la vista, se le pueden hacer consultas como si se tratara de una tabla
normal. Incluso se puede utilizar el comando DESCRIBE sobre la vista para mostrar la
estructura de los campos que forman la vista.
Además no se pueden añadir datos a una vista si en las tablas referencias en la consulta
SELECT hay campos NOT NULL que no aparecen en la consulta (es lógico ya que al añadir
el dato se tendría que añadir el registro colocando el valor NULL en el campo). Ejemplo
(sobre la vista anterior):
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).
49