SQL: Structured Query Language
O C TUB R E 2 0 2 3
Intalación de postgres
Istalar: sudo apt-get install postgresql postgresql-
contrib
Ingresar: sudo -u postgres psql
\l ver base de datos
>q salir
>Alter user postgres with password ‘xxx’
>\q salir de postgres
SQL: Strutured Query Language
Originalmente diseñado por la IBM. Estándar ANSI/ISO
SQL:1999.
SQL es el lenguaje más usado en los DBMS relacionales y
tiene varias funcionalidades:
o Lenguaje de definición (DDL):Este subconjunto del SQL sirve para
crear, eliminar y modificar las definiciones de tablas y vistas.
o Lenguaje de manipulación (DML): Este subconjunto del SQL sirve
para realizar consultas, insertar, eliminar y modificar tuplas.
o Triggers y restricciones de integridad: Los triggers son acciones
ejecutadas por el DBMS cuando ciertos cambios en la BD cumplen
las condiciones especificadas en el trigger.
SQL: Lenguaje de consulta
estructurado
o SQL embebido y SQL dinámico: El SQL embebido permite que el código SQL sea llamado
(insertado) desde un programa escrito en otro lenguaje e.g., desde C, JAVA, etc. El SQL
dinámico permite que una consulta sea construida y ejecutada en tiempo de ejecución.
o Ejecución cliente-servidor y acceso remoto a Bds. SQL provee comandos para que las
aplicaciones clientes se conecten a un servidor SQL remoto, o accedan datos a través de
una red.
o Manejo de transacciones: Comandos de SQL permiten al usuario controlar la ejecución
de una transacción.
o Seguridad: SQL provee mecanismos para controlar el acceso de usuarios a las tablas, y
vistas.
o Características avanzadas: El SQL:1999 incluye aspectos de OO (orientación a objetos),
consultas recursivas (con restricciones), apoyo a las consultas de toma de decisiones,
data mining, datos espaciales, XML, etc.
Definición de Objetos
Definición de Objetos
Se debe especificar nombre de la tabla, nombre de columnas y tipo
de datos de las columnas. Especificar si las columnas permiten
nulos.
Sintaxis:
CREATE TABLE nombre_tabla (
atributo_1 tipo_dato NOT NULL/NULL,
atributo_2 tipo_dato NOT NULL/NULL,
...
atributo_n tipo_dato NOT NULL/NULL,
primary key (atributo1,.., atributo_n),
foreign key (atributo_i) references tabla_ref(atributo_ref))
Ejemplo Creación de Tabla
CREATE TABLE estudiante CREATE TABLE inscritos
( id CHAR(9),
( rut CHAR(9),
nombre CHAR(20),
idc CHAR(20),
telefono INTEGER,
nota CHAR(10),
edad INTEGER)
PRIMARY KEY (rut, idc),
UNIQUE (nombre, edad), clave
FOREIGN KEY (rut) REFERENCES Alumnos);
CONSTRAINT clavealumno PRIMARY KEY (id));
CREATE TABLE ingreso
( id CHAR(9),
descripcion CHAR(20),
grado INTEGER);
TRUNCATE
Este comando trunca todo el contenido de una tabla.
La ventaja sobre DELETE: para borrar todo el contenido de la
tabla, es más rápido, especialmente si la tabla es muy grande.
La desventaja: solo sirve cuando se quiere eliminar
absolutamente todos los registros, no se permite la cláusula
WHERE.
Es una DDL (Lenguaje de definición), ya que internamente, el
comando truncate borra la tabla y la vuelve a crear y no ejecuta
ninguna transacción.
TRUNCATE TABLE 'TABLA_NOMBRE1'
Integridad de Datos
DEFAULT
Aplicado sólo a las instrucciones INSERT
Sólo un DEFAULT por columna
Ejemplo:
ALTER TABLE alumno
MODIFY apellido_materno DEFAULT ‘DESCONOCIDO’;
Manipulación de Objetos
C O N SU LTAS, IN S E RC I Ó N , M O DI F I C AC I ÓN Y
E L I M IN AC IÓN D E TU P L A S .
Inserción de Datos
Existen tres formas de insertar datos a una tablas
Sin conocer el orden de los atributos.
INSERT INTO Tabla (COLUMNA_1,…, COLUMNA_N) VALUES (Dato_1, …, Dato_n);
Conociendo el orden de los atributos.
INSERT INTO Tabla VALUES (Dato_1, …, Dato_n);
Obtener datos desde una consulta
INSERT INTO nombre_tabla
SELECT columnas
FROM tablas
WHERE condiciones de búsqueda;
Ejemplo de Inserción
Insertar una única tupla
INSERT INTO estudiante(rut, nombre, telefono, edad)
VALUES('153256984', 'Reyes', 2541258,25);
INSERT INTO estudiante
VALUES('153256984', 'Reyes', 2541258, 25);
Modificación de Datos
Existen dos modos:
UPDATE nombre_tabla
SET atributo_1 = valor1,
...,
atributo_n = valorn;
UPDATE tabla
SET nombre_columna = expresión
FROM tablas fuente
WHERE condiciones de búsqueda;
Eliminación de Datos
Elimina todas las tuplas o algunas de acuerdo a una condición
Existen dos modos:
DELETE
FROM nombre_tabla
WHERE restricción;
DELETE
FROM nombre_tabla
FROM tablas fuente
WHERE condiciones de búsqueda;
Primer FROM indica qué tabla será modificada
Segundo FROM especifica los criterios que modificará el
DELETE
Subconsulta determina cuales filas serán eliminadas
Ejemplo de:
creación, inserción y eliminación
CREATE TABLE estudiante(
rut CHAR(9),
nombre CHAR(15),
telefono INTEGER(9));
INSERT INTO estudiante
VALUES ('15369751k','Juan Abarca',5895684);
SELECT rut, nombre, telefono
FROM estudiante
WHERE telefono >1542548;
DELETE
FROM estudiante E
WHERE E.nombre = 'Reyes';
Consultas
Consultas
Una consulta básica tiene la forma:
SELECT [DISTINCT|ALL] lista-selección
FROM lista de tablas y/o vistas
WHERE condición
Cada consulta debe tener una cláusula SELECT y otra FROM, pero la
cláusula WHERE es opcional.
Más detalle sobre sintaxis de las consultas en:
La lista en la clausula FROM contiene una lista de nombres de tablas y/o vistas.
Cada tabla puede estar seguida por el nombre de una variable que es útil para
identificar una tabla que aparece más de una vez en una consulta
La lista-selección en la clausula SELECT es una lista de nombres para los atributos
de las tablas en la lista FROM. Cada nombre puede ser precedido por una variable
que denota la tabla a la cual pertenece el atributo, e.g. E.edad
La condición en la clausula WHERE es una combinación booleana, i.e. usando los
conectores lógicos AND, OR, NOT de condiciones de la forma expresión o expresión
donde op es uno de los operadores <, >, <=, >=, =, <>. Por ejemplo
nombre=‘Juan’ o edad<=30
La respuesta a una consulta SQL es una relación cuyos atributos corresponden a
los atributos en la clausula SELECT
Consultas
Considerar el siguiente esquema
Alumno ID Nombre Apellido Edad
1 Pedro Gómez 46
2 Juan Muñoz 25
3 Marta Figueroa 34
5 Mario González 27
Uso de DISTINCT
Supongamos la siguiente relación y la consulta:
Listar los ID de alumnos que tiene nota
Nota IDA IDC Nota
1 14 6,4 SELECT IDA IDA
1 15 5,8 FROM NOTA; 1
1
3 14 6,9
3
3 15 5,6
3
IDA
SELECT DISTINCT IDA
1
FROM NOTA; 3
Uso de DISTINCT
Supongamos la siguiente instancia de la relación INS
INS ID IDC nota
10 1 70
10 2 85
11 2 80
11 3 70
ID
10
Y la consulta 10
SELECT I.ID 11
11
FROM INSCRITOS I;
ID
SELECT DISTINCT I.ID 10
ROM INSCRITOS I; 11
Consultas Básicas
Para la unión de operadores built-in se utilizan conectores lógicos, AND (y) - OR
(o).
SELECT NOMBRE, APELLIDO, EDAD
FROM ALUMNO
WHERE EDAD>30
AND APELLIDO =‘GOMEZ’;
Nombre Apellido Edad
Pedro Gómez 46
Uso de Join
Para poder realizar consultas a más de una tabla, se deben realizar
una condición donde se igualen las clave primaria de una de ellas y
la clave foránea de la otra tabla.
SELECT columnas
FROM tabla1, tabla2
WHERE tabla1.columna = tabla2.columna
Sintaxis de Consultas en SQL
ESTUDIANTE ID NOMBRE EDAD
11 pedro 21
Ejemplo: Dado el esquema 12 luis 22
13 juan 23
ESTUDIANTES(ID,nombre,edad)
Encontrar todos los estudiantes con edad mayor a 20 años:
SELECT E.ID, E.nombre, E.edad SELECT *
FROM ESTUDIANTES E FROM ESTUDIANTES E
WHERE E.edad >20; WHERE E.edad >20;
La respuesta es:
ID NOMBRE EDAD
11 pedro 21
12 luis 22
Ejemplo
Considere el siguiente esquema:
EST(ID, nombre, edad, ciudad)
CUR(IDC, nombrec)
INS(ID, IDC, notas) y las siguientes instancias:
CUR IDC nombrec INS ID IDC nota
1 BD1 10 1 70
2 BD2 10 2 85
11 2 80
EST ID nombre edad ciudad
10 luis 20 concepción
11 pedro 21 chillán
12 antonio 23 concepción
La estrategia de evaluación de consultas (no óptima) es:
1. Computar el producto cartesiano de las tablas en la lista de la clausula FROM
2. Eliminar las tuplas en el producto cartesiano que no cumplen las condiciones
especificadas en la clausula WHERE
3. Eliminar las columnas que no aparecen en la lista de selección de la clausula
SELECT
4. Si DISTINCT aparece junto con SELECT eliminar la tuplas duplicadas
Esta estrategia es ineficiente, veremos más adelante estrategias más óptimas de
evaluación de consultas
Expresiones y cadenas de caracteres en SELECT
Cada elemento en la clausula SELECT puede ser de la forma:
expresion AS nombre columna
donde:
o expresion es cualquier expresión arimética o de cadena de caracteres para los
nombres de columnas y constantes
o nombre columna es un nombre nuevo para esa columna en el resultado de la
consulta
Ejemplo: Dado la siguiente instancia
Calcular el incremento de la categoria de los alumnos que inscribieron al
menos dos cursos
Alumnos: ICD Nombre Categoria INS: ID IDC Nota
10 luis 3 10 1 5,5
11 pedro 7 10 2 6,5
12 juan 4 11 2 6,5
SELECT A.nombre, A.categoria + 1 AS categoria
FROM ALUMNOS A, INS I, INS I2
WHERE A.ID = I.ID
AND A.ID = I2.ID
AND I.IDC <> I2.IDC;
La respuesta es: nombre categoría
Luis 4
Además, cada elemento de la condición en WHERE puede ser tan general
como por ejemplo:
SELECT A1.nombre AS nombre1, A2.nombre AS nombre2
FROM ALUMNOS A1, ALUMNOS A2
WHERE 2*A1.categoria=A2.categoria-1;
Considerando la instancia de ALUMNOS obtenemos:
Alumnos:
ICD Nombre Categoria Nombre1 nombre2
10 luis 3 luis pedro
11 pedro 7
12 juan 4
Operaciones con consultas
SQL también provee soporte para la unión, intersección y diferencia, tal como
lo hace el AR. Los comandos son, respectivamente,
o Union
o Intersects
o Except (en algunos sistemas se acepta MINUS)
Sintaxis
Consulta 1
<operador>
Consulta 2;
El resultado de todas las consultas debe tener el mismo dominio
Union
Entrega el resultado que entrega la consulta1 o que entrega la
consulta 2. Se duplican las tuplas que aparecen como resultado de
ambas consultas, a no ser que se utilice ALL
Consulta 1
UNION
Consulta 2
UNION
…
Consulta N;
Ejemplo
Esquema:
Empleado_partime(rut, nombre, edad, n°horas, salario)
Empleado_Full (rut, nombre, titulo, salario).
Es necesario conocer el nombre y rut de todos los empleados
SELECT rut, nombre
FROM Empleado_full
UNION
SELECT rut, nombre
FROM Empleado_partime;
Ejemplos
Considere el siguiente esquema:
EST(ID, nombre, edad, ciudad)
CUR(IDC, nombrec)
INS(ID, IDC, notas) y las siguientes instancias:
CUR IDC nombrec INS ID IDC nota
1 BD1 10 1 70
2 BD2 10 2 85
11 2 80
EST ID nombre edad ciudad
10 luis 20 concepción
11 pedro 21 chillán
12 antonio 23 concepción
Otra posible solución es:
SELECT E.nombre
FROM EST E
WHERE E.ciudad = 'concepcion'
UNION
SELECT E.nombre
FROM EST E
nombre
WHERE E.ciudad = 'chillan‘; pedro
luis
juan
domingo
Que produce el mismo resultado:
Intersect
Entrega el resultado que aparece en todas las consultas.
Consulta 1
INTERSECT
Consulta 2
INTERSECT
…
Consulta N
Except
Muestra la tuplas que están en el resultado de la consulta 1 pero no
están en el resultado de la consulta 2.
Consulta 1
EXCEPT
Consulta 2
Algunas consideraciones:
UNION, INTERSECT, EXCEPT se usan sobre dos tablas, estas deben ser union
compatibles, i.e., que tienen el mismo número de columnas y las columnas
tomadas en orden tienen el mismo dominio
Una consulta como la siguiente también es válida:
SELECT N.idn
FROM Navegantes N • Las tuplas repetidas producto de
WHERE N.rating = 10 una UNION son eliminadas, para
retenerlas se debe usar UNION ALL
UNION
• Lo mismo sucede para INTERSECT,
SELECT R.idn
donde para retener las tuplas
FROM Reservas R repetidas se usa INTERSECT ALL
WHERE R.idb = 104;
VISTAS
18.10.23
Vistas en SQL
Una vista es una tabla cuyas filas (tuplas) no están
almacenadas explícitamente en la BD.
Ejemplo: Considere las siguientes instancias:
INS ID IDC nota EST ID nombre ciudad
10 1 55 10 luis concepción
11 2 80 11 pedro chillán
Supongamos que se quiere conocer el nombre y los alumnos
que reprobaron el curso con código 1.
Los nombres de la clausula
CREATE ~ VIEW, se heredan.
Consulta Anidadas
Consultas Anidadas
Una consulta anidada es una consulta que tiene otra consulta
embebida dentro de ella
La segunda consulta es llamada sub-consulta
Esta sub-consulta puede, a su vez, tener una consulta anidada
Una sub-consulta generalmente aparece en la cláusula WHERE, pero
también pueden aparecer en la cláusula FROM o en la cláusula
HAVING
IN : en. Compara
contra una lista de
valores
Operadores:IN
IN: Forma una condición donde se sabe que valores exactos se deben
cumplir. Es decir verifica si un elemento esta en un conjunto dado, los
que pueden ser valores o el resultado de una consulta
SELECT columnas
FROM tablas
WHERE nombre_columna IN (valor1,.. , valorn);
SELECT Nombre, Apellido, Edad
FROM ALUMNO
WHERE Nombre IN (‘Pedro’,’Mario’);
Ejemplos
Considere el siguiente esquema:
EST(ID, nombre, edad, ciudad)
CUR(IDC, nombrec)
INS(ID, IDC, notas) y las siguientes instancias:
CUR IDC nombrec INS ID IDC nota
1 BD1 10 1 70
2 BD2 10 2 85
11 2 80
EST ID nombre edad ciudad
10 luis 20 concepción
11 pedro 21 chillán
12 antonio 23 concepción
Ejemplo
Encontrar los nombres de los navegantes que NO reservaron un bote
rojo
SELECT N.nombre
FROM Navegantes N
WHERE N.idn NOT IN (
SELECT R.idn
FROM Reservas R
WHERE R.idb IN (
SELECT B.idb
FROM Botes B
WHERE B.color = 'rojo'));
Que computan las siguientes consultas:
SELECT N.nombre
FROM Navegantes N
WHERE N.idn IN (SELECT R.idn
FROM Reservas R
WHERE R.idb NOT IN (SELECT B.idb
FROM Botes B
WHERE B.color = 'rojo'));
SELECT N.nombre
FROM Navegantes N
WHERE N.idn NOT IN (SELECT R.idn
FROM Reservas R
WHERE R.idb NOT IN (SELECT B.idb
FROM Botes B
WHERE B.color = 'rojo'));
Más ejemplos de consultas anidadas:
Encontrar los nombres de los navegantes que reservaron un bote rojo
y un bote verde
SELECT N.nombre
FROM Navegantes N, Reservas R, Botes B
WHERE N.idn = R.idn
AND R.idb = B.idb
AND B.color = 'rojo‘
AND N.idn IN ( SELECT N2.idn
FROM Navegantes N2, Botes B2, Reservas R2
WHERE N2.idn = R2.idn
AND R2.idb = B2.idb
AND B.color='verde');
Qué computa esta consulta:
SELECT N.nombre
FROM Navegantes N, Reservas R, Botes B
WHERE N.idn=R.idn
AND R.idb=B.idb
AND B.color ='rojo‘
AND N.idn NOT IN( SELECT N2.idn
FROM Navegantes N2, Botes B2, Reservas R2
WHERE N2.idn=R2.idn
AND R2.idb=B2.idb
AND B.color='verde');
Operadores: EXISTS
EXISTS: se emplean para determinar si hay o no datos en una lista de
valores.
Puede emplearse con subconsultas correlacionadas para restringir el
resultado de una consulta exterior a los registros que cumplen la
subconsulta (consulta interior).
Operadores
SELECT columnas
FROM tablas
WHERE nombre_columna EXISTS (subconsulta);
SELECT Nombre, Apellido, Edad
FROM ALUMNO
WHERE EXISTS (SELECT *
FROM Nota
WHERE alumno.Ida = Nota.Ida);
Consideraciones
El operador EXITS permite verificar si un conjunto es vacío o no, i.e., para la consulta
anterior estamos verificando que
o para cada tupla en Navegantes el set de tuplas en reserva.
o Reservas tal que R.idb=103 y R.idn = N.idn es NO vacío.
• Si no es vacío, i.e., si EXITS, entonces, quiere decir que el navegante examinado reservó un bote con
idb=103 y desplegamos su nombre.
La sub-consulta depende de la tupla en Navegantes de la consulta superior, y debe
ser re-evaluada por cada tupla en Navegantes.
La ocurrencia de Navegantes de la forma N.idn en la sub-consulta se denomina una
correlación y éstas consultas se denominan consultas correlacionadas
BETWEN: entre. Rango
de valores
.
Operadores:BETWEEN
BETWEEN: Permite seleccionar un conjunto de datos de acuerdo a un
determinado rango
SELECT columnas
FROM tablas
WHERE nombre_columna BETWEEN valor1 AND valor2;
SELECT Nombre, Apellido, Edad
FROM ALUMNO
WHERE Edad BETWEEN 20 AND 35;
SELECT Nombre, Apellido, Edad
FROM ALUMNO
WHERE sueldo_base [NOT] BETWEN [100000 AND 500000];
Los limites están
incluidos en los
rangos
LIKE: Compara string. Se
utiliza para búsquedas.
Operadores: LIKE
LIKE: Permite hacer una búsqueda basada en un patrón. Un _
representa un carácter y % n-caracteres.
SELECT columnas
FROM tablas
WHERE nombre_columna LIKE (patron);
WHERE nombre LIKE ['v%']; comienza con v
['%r']; termina con r
['%en%']; en medio en
SELECT Nombre, Apellido, Edad
FROM ALUMNO
WHERE Nombre LIKE (‘%am%’);
Generalidades
Los AND se ejecutan primero. Si se coloca esto solo, puede ocurrir que
el MER lo interprete como día o
Los paréntesis dan prioridad.
viceversa o bien arroja un error de
String = comillas sintaxis.
Númerico= sin formato, sin punto La comparación con NULL se hace:
Fecha: o col [IS] NULL
'20000320' -> SQL Server
'20-MAR-2000' -> ORACLE o col [IS NOT] NULL
o Ejemplo:
To DATE('03-02-2000','DD-MM-YYYY')
Operador ANY
x = ANY( <relation> ) es una condición booleana.
Verdadera si x es igual al meno una tupla en la
relación.
Similar, = puede ser reemplazado por cualquiera de
los operadores de comparación.
Ejemplo:
x >= ANY( <relation> )
significa que x no es la tupla mas pequeña en la
relación.
Nota: las tuplas deben tener un solo componente.
Operador ALL
Similar, x <> ALL( <relation> )
– x no es a miembro de la relación.
<> puede ser reemplazado por cualquier operador
de comparación.
Example:
x >= ALL( <relation> )
significa que no hay una tupla mas grande que x en
la relación.
Operadores de Agregación
Consultas con Agregación
SQL soporta cinco operaciones de agregación:
COUNT([DISTINCT] A): Entrega el número de valores (si se utiliza DISTINCT
valores únicos) que tiene la columna A.
SUM([DISTINCT] A): Entrega la suma de todos los valores (si se utiliza DISTINCT
valores únicos) que tiene la columna A.
AVG([DISTINCT] A): Entrega el promedio de todos los valores (si se utiliza
DISTINCT valores únicos) que tiene la columna A.
MIN([DISTINCT] A): Entrega el valor mínimo de todos los valores que tiene la
columna A.
MAX([DISTINCT] A): Entrega el valor máximo de todos los valores que tiene la
columna A.
Encontrar el nombre y la edad del navegante mayor
o SELECT N.nombre, N.edad
FROM Navegantes N
WHERE N.edad = (SELECT MAX (N2.edad)
FROM Navegantes N2);
La siguiente no es una consulta legal en SQL:
o SELECT N.nombre, MAX(N.edad)
FROM Navegantes N;
Encontrar el número total de botes
o SELECT COUNT()
FROM Botes;
Encontrar número de nombres distintos de navegantes
o SELECT COUNT(DISTINCT N.nombre)
FROM Navegantes N;
Agrupamiento
Consulta con Agregación
Hasta ahora hemos aplicado agregación sobre todas las tuplas
También podemos aplicar agregación sobre grupos de tuplas
Encontrar la edad del navegante más joven por rating
o Una forma de resolverlo sería:
SELECT MIN(N.edad)
FROM Navegantes N
WHERE N.rating =i;
con i=1, 2, etc., tendríamos que escribir tantas consultas como ratings
existan en la relación, además tendríamos que saber de antemano cuantos
ratings existen
Ejemplo: Agrupando
Sells(bar, beer, price)
Encontrar el precio promedio para cada cerveza:
SELECT beer, AVG(price)
FROM Sells
GROUP BY beer;
Ejemplo: HAVING
Sells(bar, beer, price)
Beers(name, manf), find the average price of those beers that are either
served in at least three bars or are manufactured by Pete’s.
SELECT beer, AVG(price) Grupos de cervezas con al menos 3
FROM Sells non-NULL bars y tambien grupos de
Cervezas donde Pete’s es el fabricante.
GROUP BY beer
HAVING COUNT(bar) >= 3 OR
beer IN (SELECT name Fabricadas
FROM Beers por Pete.
WHERE manf = ’Pete’);
NULL ignorados en agregación
NULL nunca contribuye a una suma, promedio, o contar, y
nunca puede ser el minimo o maximo de una columna.
Pero si no hay non-NULL valores en una columna, entonces el
resultado de la agregación es NULL.
Valores Nulos, Outer Joins y
Restricciones de Integridad
Necesidad de Valores Nulos
En la práctica, los valores de las columnas pueden ser desconocidos
Ejemplo: Consideremos la siguiente relación:
PERSONAS
ID NOMBRE EDAD NOMBRECONYUGE
11 Pedro 21 Maria
12 Luis 22 Sandra
13 Juan 20 Paola
Se desea insertar una tupla en la relación pero:
o No conocemos la edad de una persona. Que valor le asignamos al atributo EDAD?
o Que valor le asignamos al atributo NOMBRECONYUGE si la nueva persona es soltera?
Comparaciones que Emplean
Valores Nulos
Consideremos una comparación como $ Edad =20$ aplicada sobre la
instancia de PERSONAS:
PERSONAS
ID NOMBRE EDAD NOMBRECONYUGE
11 Pedro 21 Maria
12 Luis 22 Sandra
13 Juan 20 Paola
14 Enrique NULL NULL
Si se aplica a la fila de Enrique, la condición Edad =20 es verdadera o falsa?
Operaciones Booleanas con Nulos
Considerando la tupla con nulos
PERSONA(14,Enrique,null,null)
o EDAD > 20
OR
NOMBRE=Enrique es verdadero, porque NOMBRE=Enrique es verdad
o EDAD > 20
OR
NOMBRE=Pedro es desconocido porque la primera comparación es desconocido y la segunda
es falsa
En la presencia de valores nulos, debemos usar una lógica de tres valores
para los operadores AND, OR y NOT
Constructores SQL con Nulos
Algunas consideraciones importantes:
o Duplicidad de tuplas. Dos tuplas de una relación se consideran iguales si sus
correspondientes atributos tienen el mismo valor o ambas contienen nulos.
o Sin embargo, si comparamos dos valores nulos usando el símbolo de igualdad
obtenemos desconocido ( null = null es siempre desconocido)
Constructores SQL con Nulos
Los operadores aritméticos +, -, *, / retornan null si uno de los
argumentos es null
Sin embargo, los valores null pueden provocar comportamientos
inesperados de las operaciones de agregación.
Por ejemplo, COUNT(*) maneja el valor null como cualquier otro
valor.
Outer Joins
SQL soporta algunas variedades Reservas
interesantes de la operación join idn idb fecha
que aprovechan los valores nulos, 23 102 10.11.00
las que se denominan Outer Joins 22 102 10.11.00
Considere: 33 101 05.01.02
Navegantes Join_idn=idn Reservas Las tuplas de Navegantes que
no cumplen la condición del
join no aparecen en el
Navegantes
idn nombre categoria edad ciudad
resultado
22 Pedro 7 45 Concepcion
23 Andres 1 35 Stgo
33 Loreto 8 31 Concepcion
29 Natalia 7 40 Stgo
30 Esteban 4 50 Talca
Outer Joins: Left outer join
SELECT *
FROM Navegantes NATURAL LEFT OUTER JOIN RESERVAS
idn & nombre & categoria & edad & ciudad & idn & idb & fecha
22 & Pedro & 7 & 45 & Concepcion & 22 & 102 & 10.11.00
23 & andres & 1 & 35 & Stgo & 23 & 102 & 10.11.00
33 & Loreto & 8 & 31 & Concepcion & 33 & 101 & 05.01.02
29 & Natalia & 7 & 40 & Stgo & null & null & null
30 & esteban & 4 & 50 & Talca & null & null & null
Outer Joins: Right outer join
Consideremos la siguiente instancia de BD:
Reservas idn & idb & fecha Botes idb & nombreb & color
23 & 102 & 10.11.00 101 & marino & azul
22 & 102 & 10.11.00 102 & inter-lagos & rojo
33 & 101 & 05.01.02 103 & clipper & verde
104 & inter-lagos & rojo
SELECT *
FROM Reservas NATURAL RIGHT OUTER JOIN Botes
idn & idb & fecha & idb & nombreb & color
23 & 102 & 10.11.00 & 102 & inter-lagos & rojo
22 & 102 & 10.11.00 & 102 & inter-lagos & rojo
33 & 101 & 05.01.02 & 101 & marino & azul
null & null & null & 103 & clipper & verde
null & null & null & 104 & inter-lagos & rojo
Outer Joins: Full outer join
SELECT *
Reservas FROM Reservas NATURAL FULL OUTER JOIN
idn &idb & fecha Botes
23 & 102 & 10.11.00
22 & 102 & 10.11.00
idn idb fecha idb nombreb color
33 & 101 & 05.01.02
23 102 10.11.00 102 inter-lagos rojo
33 & 106 & 06.01.02
22 102 10.11.00 102 inter-lagos rojo
33 101 05.01.02 101 marino azul
Botes null null null 103 clipper verde
null null null 104 inter-lagos rojo
101 & marino & azul
33 106 06.01.02 null null null
102 & inter-lagos & rojo
103 & clipper & verde
104 & inter-lagos & rojo
Restricciones en SQL
Nos concentraremos en las siguientes restricciones:
o Restricciones simples
o Restricciones complejas
o Restricciones de dominio
Restricciones Simples
Tienen la forma:
CHECK expresión-condición
Ejemplo 1: garantizar que la categoría sea un entero en el rango $1-10$:
CREATE TABLE Navegantes(
idn INTEGER,
nombre CHAR(20),
categoria INTEGER,
edad INTEGER,
PRIMARY KEY (idn),
CHECK (categoria >= 1 AND categoria <=10));
Restricciones Complejas
Una restricción simple podría incluir una consulta sobre otra tabla, en
cuyo caso hablamos de una restricción compleja
Las restricciones son evaluadas sobre tablas que contienen tuplas
Por lo tanto, si una tabla no contiene tuplas, satisface todas sus
restricciones
Restricciones de Dominio
o Permiten definir nuevos dominios para atributos. Pueden usar restricciones simples
Un nuevo dominio es creado usando la sentencia:
o CREATE DOMAIN expression
Ejemplo:
CREATE DOMAIN categoria_val INTEGER DEFAULT 1
CHECK (VALUE >= 1 AND VALUE <=10)
INTEGER es el tipo de dominio base para categoria_val
Base de Datos Activas:
Triggers o Disparadores
Lenguajes de Programación de
SGBD
Los SGBD proporcionan lenguajes de programación:
SQL Server: Transact Sql
Oracle: PL/SQL
Postgres: PL/pgSQL
Triggers
Un trigger es un bloque de un lenguaje de programación de un
SGBD asociado a una tabla, que se ejecuta cuando una
determinada instrucción de manipulación en SQL se va a
ejecutar sobre dicha tabla.
Insert, Update, Delete.
Triggers
Un trigger: procedimiento invocado automáticamente por el
SGBD en respuesta a una cambio específico en la BD.
Una BD que tiene un conjunto de triggers asociados se denomina
Base de Datos Activa (BDA).
Un trigger
• Evento: Un cambio en la BD que activa el trigger
• Condición: Una consulta o test que se ejecuta cuando el trigger
es activado
• Acción: Un procedimiento que es ejecutado cuando el trigger
es activado y la condición es verdadera
Triggers: características
- Asociados con la Tablas: Los triggers están definidos sobre una tabla
especifica, es así como se referencia al trigger de la tabla.
- Ejecutan Automáticamente: Cada vez que se intenta realizar un insert,
update o delete en las tablas y se ha definido un trigger para una
operación en particular, el trigger se ejecuta automáticamente.
- No pueden ser llamados directamente: A diferencia de los
procedimientos Almacenados, los triggers no pueden ser llamados
directamente y tampoco pasar o aceptar parámetros.
- Es una transacción: Los triggers y las sentencias que contienen son
tratados como una transacción en particular que puede ser
deshecha (ROLLBACK). Las definiciones de los triggers pueden incluir
la cláusula ROLLBACK TRANSACTION aun sin explicitar el comienzo
de una (BEGIN TRANS)
TRIGGER: Utilizados
Mantener la integridad a bajo nivel, ellos no retornan resultados
de consultas. Una de sus principales beneficios es que ellos
pueden contener procesos de lógica muy compleja.
Cambios en Cascada en las Tablas
Por ejemplo, un trigger de eliminación sobre la tabla alumno puede eliminar todas las tuplas
coincidentes en la tabla alumno_carrera.
Definición de Errores de Usuario
La implementación de errores de usuario facilita el tratamiento de ellos y hacerlos mas comprensibles.
TRIGGER: utilización
Todas las restricciones sobre la tabla son chequeadas antes de
los triggers de las tablas
La tabla tiene la restricción de claves foráneas y es violada, el
trigger nunca se ejecuta.
Los trigger no se crean en vistas o tablas temporales, sin
embargo ellos si pueden hacer referencia a las vistas o tablas
temporales.
Los triggers contienen sentencias SQL, al igual que los
procedimientos almacenados, pero a diferencia de ellos no
debieran retornar conjunto de valores.
Sintaxis (PL/SQL)
CREATE [OR REPLACE] TRIGGER <nombre_trigger>
{BEFORE|AFTER}
{DELETE|INSERT|UPDATE [OF col1, col2, ..., colN]
[OR {DELETE|INSERT|UPDATE [OF col1, col2, ..., colN]...]} ON
<nombre_tabla>
DECLARE
-- variables locales
BEGIN
-- Sentencias
END <nombre_trigger>;
Sintaxis (Evento)
{BEFORE|AFTER}
{DELETE|INSERT|UPDATE [OF col1, col2, ..., colN]
[OR {DELETE|INSERT|UPDATE [OF col1, col2, ...,
colN]...]} ON <nombre_tabla>
La cláusula BEFORE|AFTER indica en que momento que ejecutará el
trigger, ya sea antes o después de ejecutarse la sentencia SQL que viene
dada por las cláusulas DELETE INSERT UPDATE.
La cláusula OF determina que el trigger solo se ejecutará cuando la
sentencia SQL manipule a los columnas listadas.
Sintaxis(Condición)
FOR EACH ROW [WHEN (<condicion>)]
La cláusula FOR EACH ROW indica que el trigger se
disparará cada vez que se manipula una fila de la tabla.
Si se acompaña del modificador WHEN, se establece una
restricción; el trigger solo actuará, sobre las filas que
satisfagan la condición.
Variable Old y New
Dentro del disparador con nivel de fila puede accederse a la fila
que está siendo actualmente procesada utilizando, para ello,
dos seudo-registros,
Orden de :old :old y :new. :new
disparo
INSERT No definido; todos los Valores que serán insertados
campos toman valor NULL. cuando se complete la orden.
UPDATE Valores originales de la Nuevos valores que serán escritos
fila, antes de la cuando se complete la orden.
actualización.
DELETE Valores, antes del borrado No definidos; todos los campos
de la fila. toman el valor NULL.
Ejemplo
CREATE OR REPLACE TRIGGER Corr_Empleado
BEFORE INSERT ON Empleado FOR EACH ROW --Evento
Num_emp number;
BEGIN
-- Establecer el nuevo número de Empleado
SELECT MAX(num) INTO num_emp FROM Empleado;
IF num_emp IS NULL THEN --Condición y Acción
:new.num := 1;
ELSE
:new.num := num_emp+1;
END IF;
END Corr_Empleado;
Ejemplo
set serveroutput On;--Para que muestre por pantalla
CREATE TRIGGER Mod_presupuesto
AFTER UPDATE OF sueldo ON Empleado --Evento
FOR EACH ROW WHEN :NEW.sueldo > :OLD.sueldo --Condición
begin --Acción
UPDATE Departamento
SET presupuesto = presupuesto + (:NEW.sueldo
- :OLD.sueldo)
WHERE numdepto = :OLD.numdept;
DBMS_OUTPUT.put_line(‘Se modifico Presupuesto’);
end Mod_presupuesto;