0% encontró este documento útil (0 votos)
4 vistas78 páginas

Introducción a Bases de Datos SQL

El documento presenta un curso básico sobre SQL y bases de datos, explicando qué es una base de datos, sus tipos y funciones, así como el modelo relacional. Se detalla el lenguaje SQL, su historia, estructura, y las sentencias básicas como SELECT, además de las normas de escritura y operadores. También se mencionan herramientas como SQL*Plus y TOAD para la gestión y visualización de datos en bases de datos Oracle.
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
4 vistas78 páginas

Introducción a Bases de Datos SQL

El documento presenta un curso básico sobre SQL y bases de datos, explicando qué es una base de datos, sus tipos y funciones, así como el modelo relacional. Se detalla el lenguaje SQL, su historia, estructura, y las sentencias básicas como SELECT, además de las normas de escritura y operadores. También se mencionan herramientas como SQL*Plus y TOAD para la gestión y visualización de datos en bases de datos Oracle.
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Curso SQL Básico

INTRODUCCIÓN A LAS BASES DE DATOS. EL MODELO RELACIONAL

¿Qué es una base de datos?

Una base de datos es un programa residente en memoria, que se encarga de gestionar


todo el tratamiento de entrada, salida, protección y elaboración de la información de
interés del usuario.

Tipos de bases de datos

Desde el punto de vista de la organización lógica:

a) Jerárquicas. (Progress)
b) Relacionales. (Oracle, Access, Sybase…)

Desde el punto de vista de número de usuarios:

a) Monousuario (dBase, Access, Paradox…)


b) Multiusuario cliente/servidor (Oracle, Sybase…)

Oracle es una base de datos relacional para entornos cliente/servidor.

Funciones de las bases de datos

a) Permitir la introducción de datos por parte de los usuarios (o programadores).


b) Salida de datos.
c) Almacenamiento de datos.
d) Protección de datos (seguridad).
e) Elaboración de datos.

Básicamente, la comunicación del usuario-programador con la base de datos se hace a


través de un lenguaje denominado SQL: Structured Query Laguage (Lenguaje
estructurado de consultas)

1
En un sistema de bases de datos relacional, la información se organiza en forma de
tablas.

Columnas

Filas

Una tabla es una estructura lógica que sirve para almacenar los datos de un mismo tipo
(desde el punto de vista conceptual). Almacenar los datos de un mismo tipo no significa
que se almacenen sólo datos numéricos, o sólo datos alfanuméricos. Desde el punto de
vista conceptual esto significa que cada entidad se almacena en estructuras separadas.
Por ejemplo: la entidad empleado se almacena en estructuras diseñadas para ese tipo de
entidad, como la tabla EMPLOYEES. Así, cada entidad, tendrá una estructura (tabla)
pensada y diseñada para ese tipo de entidad.

Una tabla se compone de campos o columnas, que son conjuntos de datos del mismo
tipo (desde el punto de vista físico). Ahora cuando decimos “del mismo tipo” queremos
decir que los datos de una columna son de todos del mismo tipo: numéricos,
alfanuméricos, fechas…

Cada entidad almacenada dentro de la tabla recibe el nombre de registro o fila. Así si la
tabla EMPLOYEES almacena 1.000 empleados, se dice que la tabla EMPLOYEES contiene
1.000 registros o filas.

Una o más columnas cuyo contenido es único dentro de la tabla y puede ser usado para
identificar filas, se denomina Clave Primaria.

Una o más columnas de una tabla que existe como clave primaria en otra tabla, se
denomina Clave Foránea. Los nombres de las columnas de las claves foráneas no
tienen que ser iguales a los nombres de las columnas de las claves primarias.

2
La información en una tabla puede relacionarse con la información que se encuentra en
otra.

Modelo Entidad-Relación de las tablas del Curso

3
ACCESO Y VISUALIZACIÓN DE DATOS. Inicio de una Sesión SQL, herramientas

SQL*Plus
Para poder escribir sentencias SQL al servidor Oracle, éste incorpora la herramienta
SQL*Plus. Toda instrucción SQL que el usuario escribe, es verificada por este programa.
Si la instrucción es válida es enviada a Oracle, el cual enviará de regreso la respuesta a
la instrucción; respuesta que puede ser transformada por el programa SQL*Plus para
modificar su salida.
Para que el programa SQL*Plus funcione en el cliente, el ordenador cliente debe haber
sido configurado para poder acceder al servidor Oracle. En cualquier caso al acceder a
Oracle con este programa siempre preguntará por el nombre de usuario y contraseña.
Estos son datos que tienen que nos tiene que proporcionar el administrador (DBA) de la
Base de datos Oracle.
Para conectar mediante SQL*Plus podemos ir a la línea de comandos y escribir el texto
sqlplus. A continuación aparecerá la pantalla:

En esa pantalla se nos pregunta el nombre de usuario y contraseña para acceder a la


base de datos (información que deberá indicarnos el administrador o DBA). Tras indicar
esa información conectaremos con Oracle mediante SQL*Plus, y veremos aparecer el
símbolo:

SQL>

Tras el cual podremos comenzar a escribir nuestros comandos SQL. Ese símbolo puede
cambiar por un símbolo con números 1, 2, 3, etc.; en ese caso se nos indica que la
instrucción no ha terminado y la línea en la que estamos.

Otra posibilidad de conexión consiste en llamar al programa SQL*Plus indicando


contraseña y base de datos a conectar. El formato es:

slplus usuario/contraseña@nombreServicioBaseDeDatos

Ejemplo: slplus usr1/miContra@[Link]

En este caso conectamos con SQL*Plus indicando que somos el usuario usr1 con
contraseña miContra y que conectamos a la base de datos inicial de la red [Link].

El nombre de la base de datos no tiene porqué tener ese formato, habrá que conocer
como es el nombre que representa a la base de datos como servicio de red en la red en
la que estamos.

4
Versión gráfica de SQL*Plus

Oracle incorpora un programa gráfico para Windows para utilizar SQL*Plus. Se puede
llamar a dicho programa desde las herramientas instaladas en el menú de programas de
Windows, o desde la línea de programas escribiendo sqlplusw. Al llamarle aparece esta
pantalla:

Como en el caso anterior, se nos solicita el nombre de usuario y contraseña. La cadena


de Host es el nombre completo de red que recibe la instancia de la base de datos a la
que queremos acceder en la red en la que nos encontramos.
También podremos llamar a este entorno desde la línea de comandos utilizando la
sintaxis comentada anteriormente. En este caso:

slplusw usuario/contraseña@nombreServicioBaseDeDatos

TOAD

TOAD es una aplicación informática de desarrollo SQL y administración de base de datos,


considerada una herramienta útil para los Oracle DBAs (administradores de base de
datos). Está ahora disponible para las siguientes bases de datos: Oracle Database,
Microsoft SQL Server, IBM DB2, y MySQL.

5
Al ejecutarse se nos solicita el nombre de usuario y contraseña. La Database es el
nombre completo de red que recibe la instancia de la base de datos a la que queremos
acceder en la red en la que nos encontramos.

Una vez conectados accedemos a un editor donde podemos escribir nuestras sentencias
SQL, mostrándose los resultados en la parte inferior de la pantalla.

Este va a ser el editor que vamos a utilizar a partir de ahora en este curso.

6
LENGUAJE ESTRUCTURADO DE CONSULTAS SQL

Historia del lenguaje SQL

El nacimiento del lenguaje SQL data de 1970 cuando E. F. Codd publica su libro: "Un
modelo de datos relacional para grandes bancos de datos compartidos". Ese libro
dictaría las directrices de las bases de datos relacionales. Apenas dos años después IBM
(para quien trabajaba Codd) utiliza las directrices de Codd para crear el Standard
English Query Language (Lenguaje Estándar Inglés para Consultas) al que se
le llamó SEQUEL. Más adelante se le asignaron las siglas SQL (aunque en inglés se
siguen pronunciando SEQUEL, en español se le llama esecuele).
Poco después se convertía en un estándar en el mundo de las bases de datos avalado
por los organismos ISO y ANSI. Aún hoy sigue siendo uno de los estándares más
importantes de la industria informática.
Actualmente el último estándar es el SQL del año 1999 que amplió el anterior estándar
conocido como SQL 92. El SQL de Oracle es compatible con el SQL del año 1999 e
incluye casi todo lo dictado por dicho estándar.

Estructura del lenguaje SQL

• SELECT. Se trata del comando que permite realizar consultas sobre los datos de
la base de datos. Obtiene datos de la base de datos.

• DML, Data Manipulation Language (Lenguaje de manipulación de datos).


Modifica filas (registros) de la base de datos. Lo forman las instrucciones INSERT,
UPDATE y DELETE.

• DDL, Data Definition Language (Lenguaje de definición de datos). Permiten


modificar la estructura de las tablas de la base de datos. Lo forman las
instrucciones CREATE, ALTER, DROP, RENAME y TRUNCATE.

• Instrucciones de transferencia. Administran las modificaciones creadas por las


instrucciones DML. Lo forman las instrucciones ROLLBACK, COMMIT y
SAVEPOINT.

• DCL, Data Control Language (Lenguaje de control de datos). Administran


los derechos y restricciones de los usuarios. Lo forman las instrucciones GRANT y
REVOKE.

Normas de escritura

• En SQL no se distingue entre mayúsculas y minúsculas. Da lo mismo como se


escriba.

• El final de una instrucción lo calibra el signo del punto y coma.

7
• Los comandos SQL (SELECT, INSERT,...) no pueden ser partidos por saltos de
línea antes de finalizar la instrucción.

• Se pueden tabular líneas para facilitar la lectura si fuera necesario.

• Los comentarios en el código SQL comienzan por /* y terminan por */. Para
comentar una línea se pueden usar también dos guiones --.

Operadores SQL

Ya hemos visto anteriormente qué tipos de datos se pueden utilizar en Oracle. Y siempre
que haya datos, habrá operaciones entre ellos, así que ahora se describirán qué
operaciones y con qué operadores se realizan:

Los operadores se pueden dividir en dos conjuntos:

o Aritméticos: utilizan valores numéricos


o Lógicos (o booleanos o de comparación): utilizan valores booleanos o
lógicos.
o Concatenación: para unir cadenas de caracteres.

• Operadores arítméticos:

Retornan un valor numérico

8
• Operadores lógicos:

Retornan un valor lógico (verdadero o falso)

(*) El operador LIKE sirve para hacer igualdades con comodines, al estilo * y ? de MS-
DOS.

Existen los siguientes comodines:


%: Conjunto de N caracteres
_: Un solo carácter

Ejemplo:

Las siguientes condiciones retornan TRUE


'significado’ LIKE 's_gn%fi%d_'
'pepe' LIKE 'pep%' (todos los que empiecen por 'pep')
'pepote' LIKE 'pep%'
'pepote' LIKE 'pe%te' (todos los que empiecen por 'pe' y terminen por 'te')
'pedrote' LIKE 'pe%te'

9
• Operador de concatenación:

Retornan una cadena de caracteres


Símbolo Significado Ejemplo

Oracle puede hacer una conversión automática cuando se utilice este operador con
valores numéricos:
10 || 20 = '1020'

Este proceso de denomina CASTING y se puede aplicar en todos aquellos casos en que
se utiliza valores numéricos en puesto de valores alfanuméricos o incluso viceversa.

La ausencia de valor: NULL

Todo valor (sea del tipo que sea) puede contener el valor NULL que no es más que la
ausencia de valor.

Así que cualquier columna (NUMBER, VARCHAR2, DATE…) puede estar a NULL.
Una operación retorna NULL si cualquiera de los operandos es NULL.
Para comprobar si un valor es NULL se utiliza el operador IS NULL o IS NOT NULL.

Tipos de Datos en Oracle

10
SENTENCIAS SQL SELECT BÁSICAS

La sentencia SELECT es la encargada de la recuperación (selección) de datos, con


cualquier tipo de condición, agrupación u ordenación.

Una sentencia SELECT retorna un result set (conjunto de resultados), por lo que podrá
ser aplicada en cualquier lugar donde se espere un result set.

La sintaxis básica es:

SELECT columnas
FROM tablas
WHERE condición
GROUP BY agrupación
HAVING condición agrupada
ORDER BY ordenación;

Todas las cláusulas son opcionales excepto SELECT y FROM.

A continuación vamos a hacer una descripción breve de cada cláusula:

SELECT: se deben indicar las columnas que se desean mostrar en el resultado. Las
distintas columnas deben aparecer separadas por coma (",").

Opcionalmente pueden ser nombradas con el nombre de su tabla ó alias utilizando la


sintaxis:

TABLA/[Link]

Si se quieren introducir todas las columnas se podrá incluir el carácter *, o bien TABLA.*
Existe la posibilidad de sustituir los nombres de columnas por constantes (1, 'pepe' o '1-
may-2000'), expresiones, pseudocolumnas o funciones SQL.

A toda columna, constante, pseudocolumna o función SQL, se le puede cualificar con un


nombre adicional:

COLUMNA NOMBRE
CONSTANTE NOMBRE
PSEUDOCOLUMNA NOMBRE
FUNCION SQL NOMBRE

También se puede utilizar la palabra ‘as’:

COLUMNA as NOMBRE
CONSTANTE as NOMBRE

Si se incluye la cláusula DISTINCT después de SELECT, se suprimirán aquellas filas del


resultado que tenga igual valor que otras.

11
Ejemplos:

SELECT FIRST_NAME NOMBRE, EMAIL AS CORREO


SELECT EMPLOYEES.FIRST_NAME, LAST_NAME
SELECT *
SELECT DEPARTMENTS.*
SELECT 1, DEPARTMENT_NAME
SELECT 1+1-3*5/5.4, DEPARTMENT_NAME
SELECT EMAIL, ROWNUM
SELECT TRUNC(TO_DATE('01/01/2010', 'DD/MM/YYYY') + 1) MI_FUNCION
SELECT DISTINCT *
SELECT DISTINCT FIRST_NAME, DEPARTMENT_ID
SELECT FIRST_NAME || ' ' || LAST_NAME

FROM: se indican el(los) result set(s) que interviene(n) en la consulta. Normalmente se


utilizan tablas, pero se admite cualquier tipo result set (tabla, select, vista…).
Si apareciese más de una tabla, deben ir separadas por coma.
Al igual que a las columnas, también se puede cualificar a las tablas TABLA NOMBRE
Oracle tiene definida una tabla especial, llamada DUAL, que se utiliza para consultar
valores que no dependen de ningún result set.

SELECT (1+1.1*3/5)-1-2 FROM DUAL;


SELECT SYSDATE FROM DUAL;

Ejemplos:

FROM EMPLOYEES EMP


FROM EMPLOYEES E, DEPARTMENTS D
FROM DUAL
FROM (SELECT FIRST_NAME, EMALI FROM EMPLOYEES) A

WHERE: indica qué condiciones debe cumplirse para que una fila entre dentro del result
set retornado.
Para construir las condiciones se podrán utilizar todos los operadores lógicos vistos
anteriormente.
Es posible construir condiciones complejas uniendo dos o más condiciones simples a
través de los operadores lógicos AND y OR.

Ejemplos:

WHERE EMPLOYEES.LAST_NAME = 'Martinez'


WHERE [Link] IS NULL
WHERE SALARY BETWEEN '10000' AND '20000'
WHERE ((EMAIL IS NULL) AND (FIRTS_NAME IN ('Elena', 'Jose'))
WHERE ((SALARY >= 10000) OR (LAST_NAME LIKE 'Mar%'))

GROUP BY: La expresión GROUP BY se utiliza para agrupar valores que es necesario
procesar como un grupo.
Por ejemplo, puede darse el caso de necesitar procesar todos los salarios por tipo de
trabajo, para ver su total, el máximo, mínimo, etc. Para estos casos se haría un SELECT
agrupando por JOB_ID.

12
Un SELECT con GRUOP BY es equivalente a un SELECT DISTINCT, siempre y cuando en
el SELECT no aparezcan funciones de grupo. Trataremos con más profundidad este tipo
de consultas más adelante.

HAVING: Se utiliza para aplicar condiciones sobre agrupaciones. Sólo puede aparecer si
se ha incluido la cláusula GROUP BY.
Trataremos con más profundidad este tipo de consultas más adelante.

ORDER BY: Se utiliza para ordenar las filas del result set final.
Dentro de esta cláusula podrá aparecer cualquier expresión que pueda aparecer en el
SELECT, es decir, pueden aparecer columnas, pseudocolumnas, constantes (no tiene
sentido, aunque está permitido), expresiones y funciones SQL. Como característica
adicional, se pueden incluir números en la ordenación, que serán sustituidos por la
columna correspondiente del SELECT en el orden que indique el número.
Después de cada columna de ordenación se puede incluir una de las palabras reservadas
ASC o DESC, para hacer ordenaciones ASCendentes o DESCendentes. Por defecto, si no
se pone nada se hará ASC.

Ejemplos:

ORDER BY FIRST_NAME ASC


ORDER BY FIRST_NAME DESC, LAST_NAME DES, SALARY ASC
ORDER BY SALARY
ORDER BY 1, SALARY, 2
ORDER BY TRUNC(HIRE_DATE)
ORDER BY 1.1+3-5/44.3 -- no tiene sentido ordenar por una cte.

MAS EJEMPLOS

Consulta del contenido de una Tabla

select *
from jobs;

13
Seleccionando Columnas

select job_title, min_salary


from jobs;

Alias para Nombres de Columnas

select job_title as Titulo, min_salary as "Salario Mínimo",


max_salary Salario_Máximo
from jobs;

14
Asegurando Valores Únicos

select distinct department_id


from employees;

La Tabla DUAL

select sysdate, user


from dual;

Operadores de Comparación. Limitando las Filas

select first_name || ' ' || last_name, department_id


from employees
where department_id = 90;

15
select first_name || ' ' || last_name, commission_pct
from employees
where commission_pct <> .35;

select first_name || ' ' || last_name, commission_pct


from employees
where commission_pct < .15;

select first_name || ' ' || last_name, commission_pct


from employees
where commission_pct > .35;

16
select first_name || ' ' || last_name, commission_pct
from employees
where commission_pct <= .15;

select first_name || ' ' || last_name, commission_pct


from employees
where commission_pct >= .35;

select first_name || ' ' || last_name, department_id


from employees
where department_id <= ANY (10,15,20,25);

17
select first_name || ' ' || last_name, department_id
from employees
where department_id >= ALL (80,90,100);

Operadores Lógicos

select first_name, department_id


from employees
where not (department_id >= 30);

select first_name, salary


from employees
where last_name = 'Smith'
and salary > 7500;

18
select first_name, last_name
from employees
where first_name = 'Kelly'
or last_name = 'Smith';

Otros Operadores

select first_name, last_name, department_id


from employees
where department_id in (10, 20, 90);

select first_name, last_name, salary


from employees
where salary between 5000 and 6000;

19
select e.first_name, e.last_name, e.department_id
from employees e
where exists (select 1
from departments d
where d.department_id = e.department_id
and d.department_name = 'Administracion');

select last_name, department_id


from employees
where department_id is null;

select first_name, last_name


from employees
where first_name like 'Su%'
and last_name not like 'S%';

select first_name, last_name


from employees
where first_name like '_u%'
and last_name not like 'S%';

20
Ordenando Filas

select first_name, last_name


from employees
where department_id = 90
order by first_name;

select first_name || ' ' || last_name "Employee Name"


from employees
where department_id = 90
order by last_name;

select first_name, hire_date, salary, manager_id mid


from employees
where department_id in (110,100)
order by mid asc, salary desc, hire_date;

21
select distinct 'Region ' || region_id
from countries
order by 'Region ' || region_id;

select first_name, hire_date, salary, manager_id mid


from employees
where department_id in (110,100)
order by 4, 2, 3;

Ordenando Nulos

select last_name, commission_pct


from employees
where last_name like 'A%'
order by commission_pct asc;

22
select last_name, commission_pct
from employees
where last_name like 'A%'
order by commission_pct asc nulls first;

FUNCIONES SIMPLES DE FILA

Oracle incorpora una serie de instrucciones que permiten realizar cálculos avanzados, o
bien facilitar la escritura de ciertas expresiones. 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.

Las hay de dos tipos:


• Funciones que operan con una sola fila
• Funciones que operan con varias filas.

Sólo veremos las primeras (más adelante se comentan las de varias filas).

Funciones de caracteres

Conversión del texto a mayúsculas y minúsculas

23
Funciones de transformación

Funciones numéricas

Redondeos

24
Matemáticas

Funciones de trabajo con nulos


Permiten definir valores a utilizar en el caso de que las expresiones tomen el valor nulo.

Funciones de fecha

Las fechas se utilizan muchísimo en todas las bases de datos. Oracle proporciona dos
tipos de datos para manejar fechas, los tipos DATE y TIMESTAMP. En el primer caso se
almacena una fecha concreta incluyendo hasta los segundos, y en el segundo caso se
almacena hasta las fracciones de segundo.
Hay que tener en cuenta que a los valores de tipo fecha se les pueden sumar números y
se entendería que esta suma es de días. Si tiene decimales entonces se suman días,
horas, minutos y segundos. La diferencia entre dos fechas también obtiene un número
de días.

25
Obtener la fecha y hora actual

Calcular fechas

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:

SELECT 5+'3' FROM DUAL /*El resultado es 8 */


SELECT 5 || '3' FROM DUAL /* El resultado es 53 */

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.

26
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):

Números

Para convertir números a textos se usa está función cuando se desean características
especiales. En ese caso en el formato se pueden utilizar estos símbolos:

27
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.

Funciones condicionales

CASE

Es una instrucción incorporada a la versión 9 de Oracle que permite establecer


condiciones de salida (al estilo if-then-else de muchos lenguajes). Sintaxis:

CASE expresión WHEN valor1 THEN resultado1


[ WHEN valor2 THEN resultado2 ....
...
ELSE resultadoElse
]
END

El funcionamiento es el siguiente:

1. Se evalúa la expresión indicada.

2. Se comprueba si esa expresión es igual al valor del primer WHEN, de ser así se
devuelve el primer resultado (cualquier valor excepto nulo).

28
3. Si la expresión no es igual al valor 1, entonces se comprueba si es igual que el
segundo. De ser así se escribe el resultado 2. De no ser así se continua con el
siguiente WHEN
4. El resultado indicado en la zona ELSE sólo se escribe si la expresión no vale ningún
valor de los indicados.

Ejemplo:

SELECT COMMISSION_PCT, SALARY,


CASE COMMISSION_PCT WHEN 0.1 THEN SALARY*2
WHEN 0.2 THEN SALARY*1.5
WHEN 0.3 THEN SALARY*1.2
ELSE SALARY
END SALARIO_FINAL
FROM EMPLOYEES;

SELECT COMMISSION_PCT, SALARY,


CASE NVL(COMMISSION_PCT, 0) WHEN 0.1 THEN SALARY*2
WHEN 0.2 THEN SALARY*1.5
WHEN 0.3 THEN SALARY*1.2
WHEN 0 THEN SALARY*3
ELSE SALARY
END SALARIO_FINAL
FROM EMPLOYEES;

Función DECODE

Similar a la anterior pero en forma de función. Se evalúa una expresión y se colocan a


continuación pares valor, resultado de forma que si la expresión equivale al valor, se
obtiene el resultado indicado. Se puede indicar un último parámetro con el resultado a
efectuar en caso de no encontrar ninguno de los valores indicados. Sintaxis:

DECODE(expresión, valor1, resultado1


[,valor2, resultado2,...]
[,valorPordefecto])

Ejemplo:

SELECT COMMISSION_PCT, SALARY,


DECODE(COMMISSION_PCT , 0.1, SALARY*2,
0.2, SALARY*1.5, 0.3, SALARY*1.2, SALARY) SALARIO_FINAL
FROM EMPLOYEES;

SELECT COMMISSION_PCT, SALARY,


DECODE(NVL(COMMISSION_PCT, 0) , 0.1, SALARY*2,
0.2, SALARY*1.5, 0.3, SALARY*1.2, 0, SALARY*3, SALARY) SALARIO_FINAL
FROM EMPLOYEES;

Este ejemplo es idéntico al utilizado para la instrucción CASE.

29
MAS EJEMPLOS

La Expresión CASE

select country_name, region_id,


case region_id
when 1 then 'Europa'
when 2 then 'America'
when 3 then 'Asia'
else 'Otro'
end as continente
from countries
where country_name like 'I%';

select first_name, department_id, salary,


case
when salary < 6000 then 'Bajo'
when salary < 10000 then 'Regular'
when salary >= 10000 then 'Alto'
end as Categoría
from employees
where department_id <= 30
order by first_name;

30
Función NVL

select first_name, salary, commission_pct,


(salary + salary*commission_pct) as neto
from employees;

select first_name, salary, commission_pct,


(salary + salary * nvl(commission_pct, 0)) as neto
from employees;

31
Función NVL2

select first_name, salary, commission_pct, nvl2(commission_pct, salary + salary *


commission_pct, salary) as neto
from employees;

Funciones para Caracteres

select upper(first_name || ' ' || last_name) nombre


from employees
where department_id = 30;

32
select ' ' || first_name || ' ',
trim(' ' || first_name || ' '),
substr(first_name, 2, 3),
length (first_name)
from employees;

select first_name,
lower(first_name),
replace(lower(first_name), 'a', 'A'),
instr(lower(first_name), 'a'),
instr(lower(first_name), 'a', 1, 2)
from employees;

Funciones Numéricas

select first_name,
commission_pct,
round(commission_pct, 1),
trunc(commission_pct, 1),
salary,
sqrt(salary)
from employees
where commission_pct is not null;

33
Funciones de Fecha

select sysdate as Hoy, add_months(sysdate,3) as TresMesesDespues


from dual;

select sysdate as Hoy, extract(year from sysdate) as Año


from dual;

select sysdate as Hoy, extract(month from sysdate) as Mes


from dual;

select sysdate as Hoy, extract(day from sysdate) as Día


from dual;

select sysdate as Hoy, last_day(sysdate) as fin_del_mes,


last_day(sysdate) + 1 as proxino_mes
from dual;

select months_between('19-Abr-2005','19-Dic-2004')
from dual;

34
select sysdate as fecha_actual
from dual;

Funciones de Conversión

select to_char(sysdate, 'DD/MM/YYYY HH24:MI:SS') fecha_1,


to_char(sysdate, 'DD/MM/YYYY') fecha_2,
to_char(sysdate, 'Day, Month YYYY') fecha_3,
to_char(sysdate, 'Day, Month YYYY','NLS_DATE_LANGUAGE=English') fecha_4,
to_char(sysdate, 'Day, DD "de" MONTH "de" YYYY') fecha_5
from dual;

select to_char(15.6789,'99,999.00'), to_char(45.78634,'00,000.00'),


to_char(346.4567,'L99,999.00')
from dual;

select to_date('15-01-2005','DD-MM-YYYY')
from dual;

select to_number('15.45','999.99')
from dual;

35
Sys_Connect_By_Path

select first_name, last_name, employee_id, manager_id,


sys_connect_by_path(last_name, '/') Path
from employees
start with first_name = 'Alfredo' and last_name = 'Hernandez'
connect by prior employee_id = manager_id;

36
CONSULTAS AGRUPADAS. Totalizando Datos y Funciones de Grupo

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 columnas
FROM tablas
WHERE condición
GROUP BY agrupación
HAVING condición agrupada
ORDER BY ordenación;

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 la columna job_id en la tabla de


employees, se creará un único registro por cada job_id distinto:

select job_id
from employees
group by job_id;

Si la tabla de employees sin agrupar es:

37
La consulta anterior creará esta salida:

Para ver más claro lo que está ocurriendo:

select job_id, count(*) as total


from employees
group by job_id
order by count(*) desc

38
Es decir es un resumen de los datos anteriores. Los datos first_name, last_name, email,
salary, etc. 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:

select job_id, salary


from employees
group by job_id;

ERROR en línea 1:
ORA-00979: no es una expresión GROUP BY

Lo interesante de la creación de grupos es las posibilidades de cálculo que ofrece.


Para ello se utilizan funciones que permiten trabajar con los registros de un grupo.
Estas funciones se llaman funciones de grupo:

39
Todos esos valores se calculan para cada elemento del grupo, así la expresión:

SELECT job_id, SUM(salary)


FROM employees
GROUP BY job_id;

Obtiene este resultado:

Se suman los salarios para cada grupo.

40
Condiciones HAVING

A veces se desea restringir el resultado de una expresión agrupada, por ejemplo con:

SELECT job_id, SUM(salary)


FROM employees
WHERE SUM(salary) > 10000
GROUP BY job_id;

Pero Oracle devolvería este error:

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:

SELECT job_id, SUM(salary)


FROM employees
GROUP BY job_id
HAVING SUM(salary) > 10000;

Eso no implica que no se pueda usar WHERE. Esta expresión sí es válida:

SELECT job_id, SUM(salary)


FROM employees
WHERE salary > 5000
GROUP BY job_id
HAVING SUM(salary) > 10000;

41
En definitiva, el orden de ejecución de la consulta marca lo que se puede utilizar con
WHERE y lo que se puede utilizar con HAVING:

Pasos en la ejecución de una instrucción de agrupación por parte del gestor de bases de
datos:

1. Seleccionar las filas deseadas utilizando WHERE. Esta cláusula eliminará columnas
en base a la condición indicada.

2. Se establecen los grupos indicados en la cláusula GROUP BY

3. Se calculan los valores de las funciones de totales (COUNT, SUM, AVG,...)

4. Se filtran los registros que cumplen la cláusula HAVING

5. El resultado se ordena en base al apartado ORDER BY.

MAS EJEMPLOS

AGV

select avg(salary)
from employees
where department_id = 30;

42
COUNT

select count(*)
from departments;

MAX

select max(salary)
from employees
where department_id = 80;

MIN

select min(salary)
from employees
where department_id = 80;

SUM

select sum(salary)
from employees
where department_id = 80;

43
GROUP BY

select department_id as Depart, count(*) as Empleados


from employees
group by department_id;

select department_id as Departamento, job_id as puesto, count(*) as Empleados


from employees
where department_id in (50,80)
group by department_id, job_id;

44
select extract(year from hire_date) as año, count(*) as empleados
from employees
group by extract(year from hire_date);

HAVING

select department_id as Departamento, count(*) as Empleados


from employees
group by department_id
having count(*) > 10;

select job_id as Puesto, count(*) as Empleados


from employees
group by job_id
having count(*) = 1;

45
SUBCONSULTAS

Otro aspecto de fácil diseño y uso que muestra una vez más las posibilidades de SQL son
las Subconsultas.

Una Subconsulta es aquella consulta de cuyo resultado depende otra consulta, llamada
principal, y se define como una sentencia SELECT que está incluida en la orden WHERE
de la consulta principal. Una Subconsulta, a su vez, puede contener otra Subconsulta y
así hasta un máximo de 16 niveles.

Las particularidades de las Subconsultas son:

1. Su resultado no se visualiza, sino que se pasa a la consulta principal para su


comprobación.

2. Puede devolver un valor único o una lista de valores y en dependencia de esto se


debe usar el operador del tipo correspondiente.

3. Se puede colocar el SELECT dentro de las cláusulas WHERE, HAVING o FROM. El


operador puede ser >,<,>=,<=,!=, =, IN, ANY, ALL.

4. Puede contener una sola columna, que es lo más común, o varias columnas. Este
último caso se llama Subconsulta con columnas múltiples. Cuando dos o más columnas
serán comprobadas al mismo tiempo, deben encerrarse entre paréntesis.

La sintaxis es:

SELECT listaExpresiones
FROM tabla
WHERE expresión operador (SELECT listaExpresiones
FROM tabla);

Expliquemos como se construye una Subconsulta con el siguiente ejemplo, donde


necesitamos saber ¿Qué personas cobran menos que el salario de una persona en
concreto?. Para ello, diseñemos una Subconsulta que busque el salario de la persona con
la que queremos comparar a los demás, y una consulta principal que muestre las
personas que cobran menos que el salario encontrado por la Subconsulta.

46
SELECT first_name, last_name, salary
FROM employees
WHERE salary < (SELECT salary
FROM employees
WHERE first_name = 'David'
AND last_name = 'Sanchez');

Lógicamente el resultado de la Subconsulta debe incluir el campo que estamos


analizando.

Se pueden realizar esas Subconsultas las veces que haga falta:

47
SELECT first_name, last_name, salary
FROM employees
WHERE salary <= (SELECT salary
FROM employees
WHERE first_name = 'David'
AND last_name = 'Sanchez')
AND salary >= (SELECT salary
FROM employees
WHERE first_name = 'Laura'
AND last_name = 'Vidal')

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. Esas instrucciones son:

48
Ejemplo:

SELECT first_name, last_name, salary


FROM employees
WHERE salary >= ALL (SELECT salary
FROM employees)

Esa consulta obtiene el empleado que más cobra.

Otros ejemplos:

select first_name, last_name, salary


from employees
where job_id in (select job_id
from jobs
where min_salary >= 10000)

En ese caso se obtienen los nombres de los empleados cuyos empleos están en la tabla
de trabajos con un salario mínimo mayor o igual que una cantidad.

49
select first_name, last_name, salary
from employees
where (job_id, salary) in (select job_id, min_salary
from jobs)

MAS EJEMPLOS

Subconsultas de Solo una Fila

select last_name, first_name, salary


from employees
where salary = (select max(salary) from employees);

Subconsultas de Múltiples Filas

select first_name, last_name, department_id


from employees
where department_id in (select department_id
from employees
where first_name = 'Elena');

50
Subconsultas Correlacionadas

select first_name, last_name, department_id, salary


from employees e1
where [Link] = (select max([Link])
from employees e2
where e2.department_id = e1.department_id);

Subconsultas Escalares

Retornan exactamente una columna y una sola fila.

Subconsulta Escalar en una Expresión CASE

select city, country_id,


(case when country_id in (select country_id
from countries
where country_name = 'India') then 'Indian'
else 'Non-Indian'
end) as "India?"
from locations
where city like 'B%';

51
Subconsulta Escalar en la Cláusula SELECT

select d.department_id, d.department_name,


(select max([Link])
from employees e
where e.department_id = d.department_id) as "Salario Maximo"
from departments d;

Subconsultas Escalares en la Cláusula ORDER BY

select country_id, city, state_province


from locations l
order by (select country_name
from countries c
where c.country_id = l.country_id);

52
Combinaciones especiales
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:

select country_name as nombre


from countries
UNION
select city as nombre
from locations

El resultado es una tabla que contendrá nombres de países y de ciudades. Es decir,


UNION crea una sola tabla con registros que estén presentes en cualquiera de las
consultas. Si están repetidas sólo aparecen una vez, para mostrar los duplicados se
utiliza UNION ALL en lugar de la palabra UNION.

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.

53
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*/

CONSULTAS MULTITABLAS

Es más que habitual necesitar en una consulta datos que se encuentran distribuidos en
varias tablas. Las bases de datos relacionales se basan en que los datos se distribuyen
en tablas que se pueden relacionar mediante un campo. Ese campo es el que permite
integrar los datos de las tablas.

Por ejemplo si disponemos de una tabla de Departamentos cuya clave es el


departamento_id y otra tabla de Empleados que se refiere a empleados por
departamentos, es seguro (si el diseño está bien hecho) que en la tabla de Empleados
aparecerá el departamento_id del departamento para saber a qué departamento
pertenece un empleado.

Producto cruzado o cartesiano de tablas

En el ejemplo anterior si quiere obtener una lista de los departamentos y los empleados,
se podría hacer de esta forma:

SELECT d.department_id, d.department_name, e.first_name, e.department_id


FROM departments d, employees e;

54
La sintaxis es correcta ya que, efectivamente, en el apartado FROM se pueden indicar
varias tablas separadas por comas. Pero eso produce un producto cruzado, aparecerán
todos los registros de los departamentos relacionados con todos los registros de
empleados.

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 los departamentos, relacionadas con sus empleados correspondientes. A
eso se le llama asociar (join) tablas.

Asociando tablas

La forma de realizar correctamente la consulta anterior (asociando los departamentos


con los empleados:

SELECT e.first_name, e.last_name, e.department_id, d.department_id,


d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id

Nótese que se utiliza la notación [Link] para evitar la ambigüedad, ya que el


mismo nombre de campo se puede repetir en ambas tablas.

Al apartado WHERE se le pueden añadir condiciones encadenándolas con el operador


AND. Ejemplo:

55
SELECT e.first_name, e.last_name, e.department_id, d.department_id,
d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id
AND e.first_name = 'Elena';

Finalmente indicar que se pueden enlazar más de dos tablas a través de sus campos
relacionados.

Ejemplo:

SELECT e.first_name, e.last_name, e.department_id, d.department_id,


d.department_name, [Link]
FROM employees e, departments d, locations l
WHERE e.department_id = d.department_id
AND d.location_id = l.location_id;

56
Relaciones sin igualdad

A las relaciones descritas anteriormente se las llama relaciones en igualdad (equijoins),


ya que las tablas se relacionan a través de campos que contienen valores iguales en dos
tablas.

A veces esto no ocurre, en las tablas:

Empleados

Categorias

Podríamos averiguar la categoría a la que pertenece cada empleado, pero estas tablas
poseen una relación que ya no es de igualdad.

57
La forma sería:

SELECT a.first_name, a.last_name, [Link], b.grade_level, b.lowest_sal,


b.highest_sal
FROM employees a, job_grades b
WHERE [Link] between b.lowest_sal and b.highest_sal;

Obtener registros no relacionados

En el ejemplo visto anteriormente de los departamentos y los empleados. Podría ocurrir


que un empleado no tuviera asignado un departamento todavía, con lo que habría
empleados que no aparecerían en la consulta al no tener un departamento relacionado.
La forma de conseguir que salgan todos los registros de una tabla aunque no estén
relacionados con los de otra es realizar una asociación lateral o unión externa (también
llamada outer join). En esas asociaciones, el signo (+) indica que se desean todos los
registros de la tabla estén o no relacionados.

Sintaxis:

SELECT tabla1.columna1, tabla1.columna2,....


tabla2.columna1, tabla2.columna2,...
FROM tabla1, tabla2
WHERE [Link](+)=[Link]

Eso obtiene los registros relacionados entre las tablas y además los registros no
relacionados de la tabla2. Se podría usar esta otra forma:

SELECT tabla1.columna1, tabla1.columna2,....


tabla2.columna1, tabla2.columna2,...
FROM tabla1, tabla2
WHERE [Link]=[Link](+)

En ese caso salen los relacionados y los de la primera tabla que no estén relacionados
con ninguno de la segunda.

58
Sintaxis SQL 1999

En la versión SQL de 1999 se ideó una nueva sintaxis para consultar varias tablas. La
razón fue separar las condiciones de asociación respecto de las condiciones de selección
de registros. La sintaxis completa es:

SELECT tabla1.columna1, tabl1.columna2,...


tabla2.columna1, tabla2.columna2,... FROM tabla1
[CROSS JOIN tabla2]|
[NATURAL JOIN tabla2]|
[JOIN tabla2 USING(columna)]|
[JOIN tabla2 ON ([Link]=[Link])]|
[LEFT|RIGHT|FULL OUTER JOIN tabla2 ON
([Link]=[Link])]

Se describen sus posibilidades

CROSS JOIN

Utilizando la opción CROSS JOIN se realiza un producto cruzado entre las tablas
indicadas

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:

SELECT *
FROM EMPLOYEES
NATURAL JOIN DEPARTMENTS;

En el ejemplo anterior se obtienen los registros de empleados relacionados en


departamentos 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:

SELECT *
FROM EMPLOYEES
JOIN DEPARTMENTS USING(manager_id, department_id);

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:

SELECT *
FROM EMPLOYEES
JOIN DEPARTMENTS ON(EMPLOYEES.manager_id = DEPARTMENTS.manager_id AND
EMPLOYEES.department_id = DEPARTMENTS.department_id);

59
Relaciones Externas

La última posibilidad es obtener relaciones laterales o externas (OUTER JOIN). Para ello
se utiliza la sintaxis:

SELECT *
FROM EMPLOYEES
LEFT OUTER JOIN DEPARTMENTS
ON(EMPLOYEES.manager_id = DEPARTMENTS.manager_id AND
EMPLOYEES.department_id = DEPARTMENTS.department_id);

En esta consulta además de las relacionadas, aparecen los empleados no relacionados


con departamentos. Si el LEFT lo cambiamos por un RIGHT, aparecerán los
departamentos no presentes en empleados.

La condición FULL OUTER JOIN produciría un resultado en el que aparecen los registros
no relacionados de ambas tablas.

MAS EJEMPLOS

Consultas Simples

select c.country_name, r.region_name, r.region_id


from countries c, regions r
where c.region_id = r.region_id;

select l.location_id, [Link], d.department_name


from locations l, departments d
where l.location_id = d.location_id
and l.country_id <> 'US';

60
Combinaciones Externas

select c.country_name, [Link]


from countries c, locations l
where c.country_id = l.country_id (+)
and c.country_name like 'A%';

select e.employee_id, e.last_name, d.department_id, d.department_name


from employees e full outer join departments d
on e.department_id = d.department_id;

select e.employee_id, e.last_name, d.department_id, d.department_name


from employees e, departments d
where e.department_id(+) = d.department_id
union
select e.employee_id, e.last_name, d.department_id, d.department_name
from employees e, departments d
where e.department_id = d.department_id(+);

select *
from employees e, departments d
where e.department_id = d.department_id(+)
and d.department_id is null;

61
select *
from employees e, departments d
where e.department_id (+) = d.department_id
and e.department_id is null;

MODIFICANDO DATOS (DML)

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 con la sentencia commit. Para
rechazarlas se realiza con la sentencia rollback.

En todas estas consultas, el único dato devuelto por Oracle es el número de registros
que se han modificado.

Inserción de datos

La adición de datos a una tabla se realiza mediante la instrucción INSERT. Su sintaxis


fundamental es:

INSERT INTO tabla [(listaDeCampos)]


VALUES (valor1 [,valor2 ...])

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).

62
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 tipo NOT NULL, ocurrirá un error si no rellenamos el campo con algún
valor. Los tipos de datos de los campos y de los valores deben ser compatibles.

Relleno de registros a partir de filas de una consulta

Hay un tipo de consulta, llamada de adición de datos, que permite rellenar datos de una
tabla copiando el resultado de una consulta.

Ese relleno se basa en una consulta SELECT que poseerá los datos a añadir.
Lógicamente el orden de esos campos debe de coincidir con la lista de campos indicada
en la instrucción INSERT. Sintaxis:

INSERT INTO tabla (campo1, campo2,...)


SELECT campoCompatibleCampo1, campoCompatibleCampo2,...
FROM tabla(s)
[...otras cláusulas del SELECT...]

Ejemplo:

INSERT INTO clientes2010 (dni, nombre, localidad, direccion)


SELECT dni, nombre, localidad, direccion
FROM clientes2009
WHERE problemas = 0;

MAS EJEMPLOS

Inserciones una Sola Fila

insert into departments(department_id, department_name, manager_id, location_id)


values(300, 'Departamento 300', 100, 1800);

Insertando Filas con Valores Nulos

Método Implícito: Se omiten las columnas que aceptan valores nulos.

insert into departments(department_id, department_name)


values(301, 'Departamento 301');

63
Método Explicito: Especificamos la palabra clave NULL en las columnas donde queremos
insertar un valor nulo.

insert into departments


values(302, 'Departamento 302', NULL, NULL);

Insertando Valores Especiales

insert into employees (employee_id, first_name, last_name, email, phone_number,


hire_date, job_id, salary, commission_pct, manager_id, department_id)
values(250, 'Gustavo', 'Coronel', 'GCORONEL', '511.481.1070',
sysdate, 'FI_MGR', 14000, NULL, 102, 100);

insert into employees


values(251, 'Ricardo', 'Marcelo', 'RMARCELO', '511.555.4567', to_date('FEB 4,
2005', 'MON DD, YYYY'), 'AC_ACCOUNT', 11000, NULL, 100, 30);

Copiando Filas Desde Otra Tabla

create table test


(
id number(6) primary key,
name varchar2(20),
salary number(8,2)
);

insert into test (id, name, salary)


select employee_id, first_name, salary
from employees
where department_id = 30;

Actualización de registros

La modificación de los datos de los registros lo implementa la instrucción UPDATE.

Sintaxis:

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.

64
Ejemplos:

UPDATE departments SET department_name = 'Sistemas de Informacion'


WHERE department_name = 'Informatica';

UPDATE employees SET salary = salary*1.16;

El primer dato actualiza el nombre de un departamento. El segundo UPDATE incrementa


los salarios en un 16%. La expresión para el valor puede ser todo lo compleja que se
desee:

UPDATE employees SET hire_date = NEXT_DAY(SYSDATE,'Martes')


WHERE department_id is null;

Incluso se pueden utilizar subconsultas:

UPDATE employees
SET job_id = (SELECT job_id
FROM employees
WHERE employee_id = 101)
WHERE department_id = 60;

Esta consulta coloca a todos los empleados del departamento 60 el mismo puesto de
trabajo que el del empleado número 101. 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.

MAS EJEMPLOS

Actualizando una Columna de una Tabla


update employees
set salary = salary * 1.10;

Seleccionando las Filas a Actualizar


update employees
set department_id = 80
where employee_id = 251;

65
Actualizando Columnas con Subconsultas

update employees
set department_id = (select department_id from employees
where employee_id = 203),
salary = (select max_salary from jobs
where jobs.job_id = employees.job_id)
where employee_id = 250;

Actualizando Varias Columnas con una Subconsulta

create table resumen_dept


(
department_id number(4) primary key,
emps number(4),
planilla number(10,2)
);

insert into resumen_dept (department_id)


select department_id from departments;

update resumen_dept r
set ([Link], [Link]) = (select count(*), sum([Link])
from employees e
where e.department_id = r.department_id);

Error de Integridad Referencial

update employees
set department_id = 55
where department_id = 110;

El departamento 55 no existe.

Borrado de registros

Se realiza mediante la instrucción DELETE:

DELETE [FROM] tabla


[WHERE condición]

Es más sencilla que el resto, elimina los registros de la tabla que cumplan la condición
indicada.

66
Ejemplos:

delete departments
where department_id = 10;

DELETE FROM employees


WHERE department_id NOT IN (SELECT department_id FROM departments);

Hay que tener en cuenta que el borrado de un registro no puede provocar fallos de
Integridad.

MAS EJEMPLOS

Eliminar Todas la Filas de una Tabla

delete from test;

Seleccionando las Filas a Eliminar

create table copia_emp as


select * from employees;

delete from copia_emp


where employee_id = 190;

delete from copia_emp


where department_id = 50;

Uso de Subconsultas

Delete from copia_emp c


where [Link] = (select j.max_salary
from jobs j
where j.job_id = c.job_id);

Error de Integridad Referencial

delete from departments


where department_id = 50;

67
Transacciones

Una transacción es un grupo de acciones (update, insert, delete) que hacen


transformaciones consistentes en las tablas preservando la consistencia de la base de
datos. Una base de datos está en un estado consistente si obedece todas las
restricciones de integridad definidas sobre ella. Los cambios de estado ocurren debido a
actualizaciones, inserciones, y eliminaciones de información. Por supuesto, se quiere
asegurar que la base de datos nunca entre en un estado de inconsistencia. Sin embargo,
durante la ejecución de una transacción, la base de datos puede estar temporalmente en
un estado inconsistente. El punto importante aquí es asegurar que la base de datos
regresa a un estado consistente al fin de la ejecución de una transacción.

Confirmación de una transacción

Para confirmar los cambios realizados durante una transacción utilizamos la sentencia
COMMIT.

Cancelar una transacción

Para cancelar los cambios realizados durante una transacción utilizamos la sentencia
ROLLBACK.

Opcionalmente existe la sentencia SAVEPOINT para establecer puntos de transacción.

La sintaxis de SAVEPOINT es:

SAVEPOINT nombre_de_punto;

A la hora de hacer un ROLLBACK o un COMMIT se podrá hacer hasta cierto punto con la
sintaxis:

COMMIT TO nombre_de_punto;
ROLLBACK TO nombre_de_punto;

68
Si terminamos la sesión con una transacción pendiente, Oracle consultará el parámetro
AUTOCOMMIT, y si éste está a TRUE, se hará COMMIT, si está FALSE se hará ROLLBACK.

69
CREACIÓN DE UN ESQUEMA DE BASE DE DATOS (DDL)

Caso a Desarrollar
El siguiente modelo trata de una empresa que ofrece cursos de extensión, los
participantes tienen la libertad de matricularse sin ninguna restricción, y pueden tener
facilidades de pago.

Modelo Lógico

Modelo Físico

70
Creación de Tablas

Sintaxis:

Create Table NombreTabla(


Columna1 Tipo1 [ NULL | NOT NULL ],
Columna2 Tipo2 [ NULL | NOT NULL ],
Columna2 Tipo2 [ NULL | NOT NULL ],
. . .
. . .
);

Tabla Curso

CREATE TABLE Curso (


IdCurso CHAR(4) NOT NULL,
NomCurso VARCHAR2(40) NOT NULL,
Vacantes NUMBER(2) NOT NULL,
Matriculados NUMBER(2) NOT NULL,
Profesor VARCHAR2(40) NULL,
PreCurso NUMBER(8,2) NOT NULL
);

Tabla Alumno

CREATE TABLE Alumno (


IdAlumno NUMBER(5) NOT NULL,
NomAlumno VARCHAR2(40) NOT NULL,
Direccion VARCHAR2(40) NOT NULL,
Telefono VARCHAR2(40) NULL
);

Tabla Matricula

CREATE TABLE Matricula (


IdCurso CHAR(4) NOT NULL,
IdAlumno NUMBER(5) NOT NULL,
Fecha DATE NOT NULL,
Precio NUMBER(8,2) NOT NULL,
Cuotas NUMBER(2) NOT NULL,
Nota NUMBER(4,2) NULL
);

71
Tabla Pago

CREATE TABLE Pago (


IdCurso CHAR(4) NOT NULL,
IdAlumno NUMBER(5) NOT NULL,
Cuota SMALLINT NOT NULL,
Fecha DATE NOT NULL,
Importe NUMBER(8,2) NOT NULL
);

Restricción Primary Key (PK)

La restricción Primary Key se utiliza para definir la clave primaria de una tabla, en el
siguiente cuadro se especifica la(s) columna(s) que conforman la PK de cada tabla.

Sintaxis

Alter Table NombreTabla


Add Constraint PK_NombreTabla
Primary Key ( Columna1, Columna2, . . . );

Tabla Curso

Alter Table Curso


Add Constraint PK_Curso
Primary Key (IdCurso);

Tabla Alumno

Alter Table Alumno


Add Constraint PK_Alumno
Primary Key (IdAlumno);

Tabla Matricula

72
Alter Table Matricula
Add Constraint PK_Matricula
Primary Key (IdCurso, IdAlumno);

Tabla Pago

Alter Table Pago


Add Constraint PK_Pago
Primary Key (IdCurso, IdAlumno, Cuota);

Restricción Foreign Key (FK)

La restricción Foreign Key se utiliza para definir la relación entre dos tablas, en el
siguiente cuadro se especifica la(s) columna(s) que conforman la FK de cada tabla.

Sintaxis

Alter Table NombreTabla


Add Constraint FK_NombreTabla_TablaReferenciada
Foreign Key ( Columna1, Columna2, . . . )
References TablaReferenciada;

Es necesario que en la tabla referenciada esté definida la PK, por que la relación se crea
entre la PK de la tabla referenciada y las columnas que indicamos en la cláusula Foreign
Key.

73
Tabla Matricula

1ª FK

La primera FK de esta tabla es IdCurso y la tabla referenciada es Curso, el script para


crear esta FK es el siguiente:

Alter table Matricula


Add Constraint FK_Matricula_Curso
Foreign Key (IdCurso)
References Curso (IdCurso);

2ª FK

Alter table Matricula


Add Constraint FK_Matricula_Alumno
Foreign Key (IdAlumno)
References Alumno (IdAlumno);

Tabla Pago

Alter table Pago


Add Constraint FK_Pago_Matricula
Foreign Key (IdCurso, IdAlumno)
References Matricula (IdCurso, IdAlumno);

Restricción Default (Valores por Defecto)

El Valor por Defecto es el que toma una columna cuando no especificamos su valor en
una sentencia insert.

Sintaxis

Alter Table NombreTabla


Modify ( NombreColumna Default Expresión );

74
Ejemplo

El número de vacantes por defecto para cualquier curso debe ser 20.

Alter Table Curso


Modify (Vacantes default 20);

Restricción NOT NULL (Nulidad de una Columna)

Es muy importante determinar la nulidad de una columna, y es muy importe para el


desarrollador tener esta información a la mano cuando crea las aplicaciones.

Sintaxis

Alter Table NombreTabla


Modify ( NombreColumna [NOT] NULL );

Ejemplo

En la tabla alumno, la columna Telefono no debe aceptar valores nulos.

Alter Table Alumno


Modify (Telefono NOT NULL);

Vemos ahora la definición de la tabla.

insert into alumno


values(10001, 'Ricardo Marcelo', 'Ingeniería', NULL);

75
El mensaje de error claramente nos indica que no se puede insertar valores nulos en la
columna TELEFONO, de la tabla ALUMNO, que se encuentra en el esquema CURSO.

Restricción Unique (Valores Únicos)

En muchos casos debemos garantizar que los valores de una columna ó conjunto de
columnas de una tabla acepten solo valores únicos.

Sintaxis

Alter Constraint NombreTabla


Add Constraint U_NombreTabla_NombreColumna
Unique ( Columna1, Columna2, . . . );

Ejemplo

No puede haber dos alumnos con nombres iguales.

Alter Table alumno


Add Constraint U_Alumno_NomAlumno
Unique (NomAlumno);

Para probar la restricción insertemos datos.

Insert Into Alumno


Values( 10001, 'Sergio Matsukawa', 'San Miguel', '456-3456' );

Insert Into Alumno


Values( 10002, 'Sergio Matsukawa', 'Los Olivos', '521-3456' );

El mensaje de error del segundo insert nos indica que está violando el constraint de tipo
unique de nombre U_ALUMNO_NOMALUMNO en el esquema CURSO.

76
Restricción Check (Reglas de Validación)

Las reglas de validación son muy importantes porque permiten establecer una condición
a los valores que debe aceptar una columna.

Sintaxis

Alter Table NombreTabla


Add Constraint CK_NombreTable_NombreColumna
Check ( Condición );

Ejemplo

El precio de un curso no puede ser cero, ni menor que cero.

Alter Table Curso


Add Constraint CK_Curso_PreCurso
Check (PreCurso > 0);

Probemos el constraint ingresando datos.

Insert Into Curso


Values( 'C002', '[Link]', 20, 7, 'Ricardo Marcelo', -400.00 );

Al intentar ingresar un curso con precio negativo, inmediatamente nos muestra el


mensaje de error indicándonos que se está violando la regla de validación.

77
DERECHOS Y RESTRICCIONES DE LOS USUARIOS (DCL)

Asignar Privilegios a Usuarios

Si queremos que otros usuarios puedan operar los objetos de un esquema, debemos
darle los privilegios adecuadamente.

Sintaxis

Grant Privilegio On Objeto To Usuario;

Ejemplo

Por ejemplo, el usuario scott necesita consultar la tabla curso.

Grant Select On Curso To Scott;

Quitar Privilegios a Usuarios

Si queremos quitar privilegios a otros usuarios para que dejen de operar los objetos de
un esquema, debemos quitarle los privilegios previamente dados adecuadamente.

Sintaxis

Revoke Privilegio On Objeto From Usuario;

Ejemplo

Por ejemplo, el usuario scott ya no necesita consultar la tabla curso.

Revoke Select On Curso From Scott;

78

También podría gustarte