0% encontró este documento útil (0 votos)
21 vistas

SQL: Structured Query Language: O C Tub R E 2 0 2 3

El documento describe cómo instalar PostgreSQL y explica conceptos básicos de SQL como la creación de tablas, inserción, modificación y eliminación de datos, y consultas. SQL es un lenguaje estándar ampliamente usado para interactuar con bases de datos relacionales.
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
21 vistas

SQL: Structured Query Language: O C Tub R E 2 0 2 3

El documento describe cómo instalar PostgreSQL y explica conceptos básicos de SQL como la creación de tablas, inserción, modificación y eliminación de datos, y consultas. SQL es un lenguaje estándar ampliamente usado para interactuar con bases de datos relacionales.
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 90

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;

También podría gustarte