Introducción a Bases de Datos SQL
Introducción a Bases de Datos SQL
a) Jerárquicas. (Progress)
b) Relacionales. (Oracle, Access, Sybase…)
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.
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:
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.
slplus usuario/contraseña@nombreServicioBaseDeDatos
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:
slplusw usuario/contraseña@nombreServicioBaseDeDatos
TOAD
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
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.
• SELECT. Se trata del comando que permite realizar consultas sobre los datos de
la base de datos. Obtiene datos de la base de datos.
Normas de escritura
7
• Los comandos SQL (SELECT, INSERT,...) no pueden ser partidos por saltos de
línea antes de finalizar la instrucción.
• 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:
• Operadores arítméticos:
8
• Operadores lógicos:
(*) El operador LIKE sirve para hacer igualdades con comodines, al estilo * y ? de MS-
DOS.
Ejemplo:
9
• Operador de concatenación:
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.
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.
10
SENTENCIAS SQL SELECT BÁSICAS
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.
SELECT columnas
FROM tablas
WHERE condición
GROUP BY agrupación
HAVING condición agrupada
ORDER BY ordenación;
SELECT: se deben indicar las columnas que se desean mostrar en el resultado. Las
distintas columnas deben aparecer separadas por coma (",").
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.
COLUMNA NOMBRE
CONSTANTE NOMBRE
PSEUDOCOLUMNA NOMBRE
FUNCION SQL NOMBRE
COLUMNA as NOMBRE
CONSTANTE as NOMBRE
11
Ejemplos:
Ejemplos:
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:
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:
MAS EJEMPLOS
select *
from jobs;
13
Seleccionando Columnas
14
Asegurando Valores Únicos
La Tabla DUAL
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;
17
select first_name || ' ' || last_name, department_id
from employees
where department_id >= ALL (80,90,100);
Operadores Lógicos
18
select first_name, last_name
from employees
where first_name = 'Kelly'
or last_name = 'Smith';
Otros Operadores
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');
20
Ordenando Filas
21
select distinct 'Region ' || region_id
from countries
order by 'Region ' || region_id;
Ordenando Nulos
22
select last_name, commission_pct
from employees
where last_name like 'A%'
order by commission_pct asc nulls first;
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.
Sólo veremos las primeras (más adelante se comentan las de varias filas).
Funciones de caracteres
23
Funciones de transformación
Funciones numéricas
Redondeos
24
Matemáticas
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:
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
TO_DATE
Convierte textos en fechas. Como segundo parámetro se utilizan los códigos de formato
de fechas comentados anteriormente.
Funciones condicionales
CASE
El funcionamiento es el siguiente:
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:
Función DECODE
Ejemplo:
29
MAS EJEMPLOS
La Expresión CASE
30
Función NVL
31
Función NVL2
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 months_between('19-Abr-2005','19-Dic-2004')
from dual;
34
select sysdate as fecha_actual
from dual;
Funciones de Conversión
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
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.
select job_id
from employees
group by job_id;
37
La consulta anterior creará esta salida:
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:
ERROR en línea 1:
ORA-00979: no es una expresión GROUP BY
39
Todos esos valores se calculan para cada elemento del grupo, así la expresión:
40
Condiciones HAVING
A veces se desea restringir el resultado de una expresión agrupada, por ejemplo con:
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:
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.
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
44
select extract(year from hire_date) as año, count(*) as empleados
from employees
group by extract(year from hire_date);
HAVING
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.
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);
46
SELECT first_name, last_name, salary
FROM employees
WHERE salary < (SELECT salary
FROM employees
WHERE first_name = 'David'
AND last_name = 'Sanchez');
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:
Otros ejemplos:
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
50
Subconsultas Correlacionadas
Subconsultas Escalares
51
Subconsulta Escalar en la Cláusula SELECT
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:
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.
En el ejemplo anterior si quiere obtener una lista de los departamentos y los empleados,
se podría hacer de esta forma:
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
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:
56
Relaciones sin igualdad
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:
Sintaxis:
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:
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:
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;
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
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);
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
60
Combinaciones Externas
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;
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 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.
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:
Ejemplo:
MAS EJEMPLOS
63
Método Explicito: Especificamos la palabra clave NULL en las columnas donde queremos
insertar un valor nulo.
Actualización de registros
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 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
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;
update resumen_dept r
set ([Link], [Link]) = (select count(*), sum([Link])
from employees e
where e.department_id = r.department_id);
update employees
set department_id = 55
where department_id = 110;
El departamento 55 no existe.
Borrado de registros
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;
Hay que tener en cuenta que el borrado de un registro no puede provocar fallos de
Integridad.
MAS EJEMPLOS
Uso de Subconsultas
67
Transacciones
Para confirmar los cambios realizados durante una transacción utilizamos la sentencia
COMMIT.
Para cancelar los cambios realizados durante una transacción utilizamos la sentencia
ROLLBACK.
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:
Tabla Curso
Tabla Alumno
Tabla Matricula
71
Tabla Pago
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
Tabla Curso
Tabla Alumno
Tabla Matricula
72
Alter Table Matricula
Add Constraint PK_Matricula
Primary Key (IdCurso, IdAlumno);
Tabla Pago
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
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
2ª FK
Tabla Pago
El Valor por Defecto es el que toma una columna cuando no especificamos su valor en
una sentencia insert.
Sintaxis
74
Ejemplo
El número de vacantes por defecto para cualquier curso debe ser 20.
Sintaxis
Ejemplo
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.
En muchos casos debemos garantizar que los valores de una columna ó conjunto de
columnas de una tabla acepten solo valores únicos.
Sintaxis
Ejemplo
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
Ejemplo
77
DERECHOS Y RESTRICCIONES DE LOS USUARIOS (DCL)
Si queremos que otros usuarios puedan operar los objetos de un esquema, debemos
darle los privilegios adecuadamente.
Sintaxis
Ejemplo
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
Ejemplo
78