You are on page 1of 211

SISTEMAS

GESTORES DE
BASES DE DATOS
I.E.S. MARCOS ZARAGOZA
SQL
INTRODUCCIÓN
 SQL fue desarrollado inicialmente por IBM como
lenguaje de consulta de su SGBD DB2, en 1970
 Es un lenguaje no procedimental (indica qué
datos se desea manipular, pero no de qué
manera hacerlo)
 Hay dos organizaciones, ANSI e ISO que tratan
de favorecer la estandarización del lenguaje, no
obstante, cada fabricante de SGBDs aporta sus
propias características

3
INTRODUCCIÓN
 SQL significa Structured Query Language
(Lenguaje Estructurado de Consulta)
 SQL incluye soporte para los lenguajes:
 DDL: Lenguaje de Definición de Datos.
 DML: Lenguaje de Manipulación de Datos.
 DCL: Lenguaje de Control de Datos.
 SQL no se limita únicamente a realizar
consultas sobre los datos almacenados

4
INTRODUCCIÓN
 SQL permite:
 Definición
de datos
 Recuperación de datos
 Manipulación de datos
 Altas, Bajas y Modificaciones
 Control de acceso a datos
 Compartición de datos entre usuarios concurrentes
 Integridad de datos

5
INTRODUCCIÓN
 Características:
 Independencia entre proveedores
 Portabilidad
 Estandarización SQL
 Fundamento relacional
 Estructura de alto nivel similar al inglés
 Consultas interactivas
 Acceso a bases de datos desde lenguajes de
programación
 Múltiples vistas de datos
 Arquitectura cliente/servidor

6
Reglas del SQL ANSI
Carácter coincidente Access SQL ANSI SQL

Un carácter cualquiera ? _ (subrayado)

Cero o más caracteres * %

El estándar ANSI/ISO especifica que:


 Los nombres SQL deben contener de 1 a 18
caracteres, comenzar con una letra, y que no pueden
contener espacios o caracteres de puntuación
especiales, exceptuando el guión de subrayado.
7
Nombres de tabla y de columna
 Pepe.Productos: Hace referencia a la
tabla Productos de la que el usuario Pepe
es propietario.
 Productos.Clave: Hace referencia al
atributo Clave de la tabla Productos. Es
necesario poner el alias de la tabla
cuando hay atributos en distintas tablas
que tienen el mismo nombre.

8
Constantes
 Numéricas: Se escriben directamente.
Por ejemplo:
 Real: 234,45.
 Entero: 234
 Alfanuméricas: Se escriben entre
comillas preferentemente simples.
 Fechas: Se escriben entre comillas
preferentemente simples.

9
Componentes de SQL
 El lenguaje SQL está compuesto por:
 Comandos
 Cláusulas
 Operadores
 Funciones de agregado

10
Sentencias DDL
Comando Descripción

CREATE Para crear nuevas tablas, campos e


índices
DROP Para eliminar tablas e índices

ALTER Para modificar las tablas agregando


campos o cambiando la definición de
los campos.

11
Sentencias DML
SELECT Para consultar registros de la base de
datos que satisfagan un criterio
determinado
INSERT Para cargar lotes de datos en la base
de datos en una única operación.
UPDATE Para modificar los valores de los
campos y registros especificados
DELETE Para eliminar registros de una tabla
de una base de datos
12
Cláusulas
FROM Para especificar la tabla de la cual se van
a seleccionar los registros
WHERE Para especificar las condiciones que
deben reunir los registros que se van a
seleccionar
GROUP BY Para separar los registros seleccionados
en grupos específicos
HAVING Para expresar la condición que debe
satisfacer cada grupo
ORDER BY Para ordenar los registros seleccionados
de acuerdo con un orden específico

13
Operadores Lógicos
Operador Uso

AND “Y" lógico. Evalua dos condiciones y


devuelve un valor de verdad sólo si
ambas son ciertas.
OR “O" lógico. Evalúa dos condiciones y
devuelve un valor de verdar si alguna
de las dos es cierta.
NOT Negación lógica. Devuelve el valor
contrario de la expresión.
14
Operadores de comparación
< Menor que
> Mayor que
<> Distinto de
<= Menor ó Igual que
>= Mayor ó Igual que
= Igual que
BETWEEN Utilizado para especificar un intervalo de
valores.
LIKE Utilizado en la comparación de un modelo
IN Utilizado para especificar registros de una
base de datos
15
Funciones de agregado
AVG Utilizada para calcular el promedio de los
valores de un campo determinado

COUNT Utilizada para devolver el número de


registros de la selección
SUM Utilizada para devolver la suma de todos los
valores de un campo determinado

MAX Utilizada para devolver el valor más alto de


un campo especificado
MIN Utilizada para devolver el valor más bajo de
un campo especificado

16
Tipos de datos estándar (I)
Tipo de Datos Tamañ Descripción
o
BINARY 1 byte Para consultas sobre tabla adjunta de
productos de bases de datos que definen un
tipo de datos Binario.
BIT 1 byte Valores Si/No ó True/False
BYTE 1 byte Un valor entero entre 0 y 255.
COUNTER 4 bytes Un número incrementado automáticamente
(Autonumérico) (de tipo Long)
CURRENCY 8 bytes Un entero escalable entre
(Moneda) 922.337.203.685.477,5808 y
922.337.203.685.477,5807.

17
Tipos de datos estándar (II)
Tipo de Tamaño Descripción
Datos
DATETIME 8 bytes Un valor de fecha u hora entre los años 100 y
9999.
SINGLE 4 bytes Un valor en punto flotante de precisión simple
con un rango de -3.402823*1038 a
-1.401298*10-45 para valores negativos,
1.401298*10-45 a 3.402823*1038 para valores
positivos, y 0.
DOUBLE 8 bytes Un valor en punto flotante de doble precisión
con un rango de -1.79769313486232*10308 a
-4.94065645841247*10-324 para valores
negativos, 4.94065645841247*10-324 a
1.79769313486232*10308 para valores
positivos, y 0.
18
Tipos de datos estándar (III)
Tipo de Datos Tamaño Descripción

SHORT 2 bytes Un entero corto entre -32,768 y 32,767.

LONG ó 4 bytes Un entero largo entre -2,147,483,648 y


INTEGER 2,147,483,647.

LONGTEXT 1 byte por De cero a un máximo de 1.2 gigabytes.


carácter (MEMO)
LONGBINAR Según se De cero 1 gigabyte. Utilizado para
Y necesite objetos OLE.

TEXT 1 byte por De cero a 255 caracteres


CHAR carácter
VARCHAR 1 byte por Longitud variable
carácter 19
Sinónimos de tipos de datos (I)
Tipo de Dato Sinónimos
BINARY VARBINARY
BIT BOOLEAN
LOGICAL
LOGICAL1
YESNO
BYTE INTEGER1
COUNTER AUTOINCREMENT
CURRENCY MONEY
DATETIME DATE
TIME
TIMESTAMP

20
Sinónimos de tipos de datos (II)
Tipo de Dato Sinónimos
SINGLE FLOAT4
IEEESINGLE
REAL
DOUBLE FLOAT
FLOAT8
IEEEDOUBLE
NUMBER
NUMERIC

SHORT INTEGER2
SMALLINT

21
Sinónimos de tipos de datos (III)
Tipo de Dato Sinónimos
LONG INT
INTEGER
INTEGER4
LONGBINAR GENERAL
Y OLEOBJECT
LONGTEXT LONGCHAR
MEMO
NOTE
TEXT ALPHANUMERIC
CHAR
CHARACTER
STRING
VARCHAR

22
Creación de bases
de datos
El lenguaje DDL
 Además de la manipulación de datos, que
se realiza por medio del lenguaje DML,
con SQL se puede definir la propia
estructura de la Base de Datos
 Esto se realiza mediante el DDL
 Así como el DML está bastante
estandarizado, respecto al DDL, va a
haber muchas dependencias respecto al
SGBD que se esté utilizando
24
El lenguaje DDL
 El núcleo del DDL está basado en tres
cláusulas de SQL
 CREATE, que define y crea un objeto de la
base de datos
 DROP, que elimina un objeto existente en la
base de datos
 ALTER, que modifica la definición de un
objeto de la base de datos

25
Creación y borrado de una BBDD

Dependiendo del SGBD utilizado, puede


variar:
CREATE DATABASE Nombre_de_la_Base_de_Datos
 Crea una base de datos con el nombre
indicado.
DROP DATABASE Nombre_de_la_Base_de_Datos
 Borra una Base de Datos que previamente está
cerrada (CLOSE).
USE Nombre_de_la_Base_de_Datos
 Abre la base de datos.

26
Creación de una tabla
 Se realiza mediante la sentencia CREATE
TABLE.La sintaxis básica es la siguiente:
CREATE TABLE nombre_tabla
(
atributo tipo(tamaño)[DEFAULT valor] [Índice],
[NOT NULL]

atributo …… ,
atributo ……
); 27
Creación de una tabla
 nombre_tabla: Es el nombre que tomará la
tabla en la BBDD
 atributo: Es el nombre de una de las
columnas.
 En la definición de la tabla se pueden crear tantas
columnas como sea necesario
 El nombre de columna debe empezar por un carácter

alfabético
 tipo(tamaño): es la indicación del tipo de
dato que la columna podrá contener y su
longitud.
28
Creación de una tabla
 cláusula_defecto: indica el valor de
defecto que tomará la columna si no se le
asigna uno explícitamente en el momento en
que se crea la línea.
 La sintaxis que hay que usar es la siguiente:
DEFAULT { valor | NULL }
 vínculos_de_columna: son vínculos de
integridad que se aplican a cada atributo
concreto. Pueden ser:
 NOT NULL, que indica que la columna no puede
tomar el valor NULL.
29
Creación de una tabla
 vínculos_de_columna: (continuación)
 PRIMARY KEY, que indica que la columna es la clave
primaria de la tabla.
 UNIQUE: indica que no se admiten duplicados para ese
campo
 Una definición de referencia (clave ajena) con la forma:
REFERENCES Nom_tabla(clave)
[ON DELETE
{NO ACTION | CASCADE | SET DEFAULT
| SET NULL }]
[ON UPDATE
{NO ACTION | CASCADE | SET DEFAULT
| SET NULL }]
30
Creación de una tabla
 vínculos_de_columna: (continuación)
CHECK (expresión_condicional)
Ejemplo: CHECK (PRECIO<1000)
 vínculo_de_tabla: son vínculos de
integridad que se pueden referir a más
columnas de la tabla. Estos pueden ser:
 PRIMARY KEY (columna1 [, columna2,…])
para crear claves primarias compuestas de más de
una columna.
 FOREIGN KEY (columna1 [, columna2, …])
definiciones_de_referencia
para crear claves ajenas de más de una columna

31
Creación de una tabla en Informix
Ejemplos:
CREATE TABLE Publicacion (
ID INTEGER PRIMARY KEY,
Tipo CHAR(18) NOT NULL);

CREATE TABLE Libro (


ID INTEGER PRIMARY KEY REFERENCES Publicacion(ID),
Titulo VARCHAR(160) NOT NULL,
Editor INTEGER NOT NULL REFERENCES Editor(ID),
Volumen VARCHAR(16),
Serie VARCHAR(160),
Edicion VARCHAR(16),
Mes_publicacion CHAR(3),
Anyo_publicacion INTEGER NOT NULL,
Comentario VARCHAR(255));

CREATE TABLE Autor (


IDPublicacion INTEGER REFERENCES Publicacion(ID),
IDPersona INTEGER REFERENCES Persona(ID),
PRIMARY KEY (IDPublicacion, IDPersona));

32
Ejemplo de creación de tabla:
CREATE TABLE Colegios
( Num_Colegio INTEGER NOT NULL PRIMARY KEY,
Nombre CHAR(30),
Fecha_Nac DATETIME
);
O bien:
CREATE TABLE Colegios
( Num_Colegio INTEGER NOT NULL,
Nombre CHAR(30),
Fecha_Nac DATETIME,
CONSTRAINT PK_Cole PRIMARY KEY (Num_Colegio)
);
33
Definir claves al final de la tabla
 Definir clave principal:
CONSTRAINT PK_Nom_tabla_indices
PRIMARY KEY (Atributos_clave_principal)

 Definir clave ajena:


CONSTRAINT FK_Nom_tabla_indices
FOREIGN KEY (atributo1[, atributo2...])
REFERENCES Nom_tabla(Atributos_clave)
[ON DELETE
{NO ACTION | CASCADE | SET DEFAULT | SET NULL }]
[ON UPDATE
{NO ACTION | CASCADE | SET DEFAULT | SET NULL }]

34
Ejemplo creación de tabla con clave compuesta:
 CREATE TABLE Empleados
( Nombre CHAR(15),
Apellidos CHAR(35),
Fecha_Nac DATETIME,
Telef CHAR(9),
CONSTRAINT PK_Emple
PRIMARY KEY (Apellidos, Nombre, Fecha_Nac)
);

35
Ejemplo de definición de una clave ajena I
 CREATE TABLE Clientes
(IDCliente INTEGER NOT NULL,
Nom CHAR(15) NOT NULL,
Apel CHAR(35) NOT NULL,
CONSTRAINT PK_Clie PRIMARY KEY (IDCliente)
);

36
Ejemplo de definición de una clave ajena
CREATE TABLE Pedidos
( IDPedido INTEGER PRIMARY KEY,
IDCliente INTEGER,
NotasPedido CHAR(50),
CONSTRAINT FK_Pedido_Cliente
FOREIGN KEY (IDCliente)
REFERENCES Clientes(IDCliente)
ON UPDATE CASCADE
ON DELETE CASCADE
);

37
Definición de una clave única
CREATE TABLE Sucursal
( Num_Suc CHAR(2) NOT NULL,
Ciudad CHAR(20) NOT NULL,
Zona CHAR(8) NOT NULL,
Director CHAR(3) NOT NULL,
Objetivo_Año INTEGER NOT NULL,
CONSTRAINT PK_Sucur PRIMARY KEY(Num_Suc),
CONSTRAINT SK_ciu UNIQUE(Ciudad),
CONSTRAINT FK_emple
FOREIGN KEY(Director)
REFERENCES INFEMPLE(Num_Emple)
);

38
Borrado de una tabla
 Se especifica mediante la sentencia:
DROP TABLE nombre_de_tabla
 La sentencia puede fallar si hay reglas de
integridad referencial que impidan el
borrado de datos de tal tabla, y por tanto
también impiden el borrado de la propia
tabla
DROP
DROPTABLE
TABLEEmpleados;
Empleados;

39
Modificación de tablas
 Permite básicamente las siguientes
operaciones:
 Añadir nuevas columnas a una tabla
 Eliminar columnas de una tabla
 Modificar las definiciones de campo de una
tabla (no todos los SGBD permiten esta
operación)
 Crear restricciones de integridad
 Eliminar restricciones de integridad

40
Modificación de tablas
 Adición de una nueva columna:
ALTER TABLE nombre_tabla
ADD nombre_col definición_col
 La definición de la columna sigue la misma sintaxis
que se ha visto en el apartado relativo a la instrucción
CREATE TABLE.

ALTER
ALTERTABLE
TABLEEmpleados
EmpleadosADD
ADDCOLUMN
COLUMNSalario
SalarioCURRENCY;
CURRENCY;

41
Modificación de tablas
 Eliminación de una columna de la tabla

ALTER TABLE nombre_tabla


DROP nombre_columna
 Hay que tener en cuenta que puede haber
reglas de integridad definidas que impidan la
eliminación de una columna de una tabla

ALTER
ALTERTABLE
TABLEEmpleados
EmpleadosDROP
DROPCOLUMN
COLUMNSalario;
Salario;

42
Modificación de tablas
 Modificación de una columna de la tabla
(Interbase)

ALTER TABLE nombre_tabla


ALTER COLUMN nombre_columna
TO nuevo_nombre_columna tipo_datos

ALTER
ALTERTABLE
TABLEEmpleados
EmpleadosALTER
ALTERCOLUMN
COLUMNNom
NomTO
TONombre
NombreCHAR(25);
CHAR(25);

ALTER
ALTERTABLE
TABLEEmpleados
EmpleadosALTER
ALTERCOLUMN
COLUMNNom
NomCHAR(40);
CHAR(40);
43
Modificación de tablas
 Creación de una Restricción

ALTER TABLE nombre_tabla


ADD [CONSTRAINT nombre_restricción]
{{PRIMARY KEY | UNIQUE} (col [, col …]) |
FOREIGN KEY (col [, col …])
REFERENCES otra_tabla
[(otra_col [,otra_col …])]
[ON DELETE
{NO ACTION|CASCADE|SET DEFAULT|SET NULL}]
[ON UPDATE
{NO ACTION|CASCADE|SET DEFAULT|SET NULL}] |
CHECK (condición)}

44
Modificación de tablas
 Eliminación de una Restricción (tabla de
índices de una clave principal, única o
ajena):

ALTER TABLE nombre_tabla


DROP CONSTRAINT nombre_restricción

ALTER
ALTERTABLE
TABLEEmpleados
EmpleadosDROP
DROPCONSTRAINT
CONSTRAINTFK_Emple;
FK_Emple;

45
Índices
 Un índice es una estructura que proporciona un
acceso rápido a las filas de una tabla en función
a los valores de una o más columnas
 La presencia o ausencia de un índice es
transparente al usuario de SQL sólo que:
 Con un índice sobre un campo se consigue mayor
rendimiento en la ordenación y búsqueda sobre el
mismo
 Los índices van a ocupar espacio físico de
almacenamiento en el sistema de archivos donde se
ubica la BBDD.
46
Índices
 Será conveniente crear índices en
aquellas columnas de una tabla que son
utilizadas frecuentemente en condiciones
de búsqueda y ordenación.
 La indexación también se considera más
adecuada cuando la BBDD se emplea más
para consultas que para la actualización de
datos
 El SGBD siempre creará un índice para la
clave primaria de cada tabla
47
Índices
 Creación de índices:
 Su sintaxis básica es la siguiente:

CREATE [UNIQUE] [ASC | DESC]


INDEX nombre_indice ON
nom_tabla (col [, col …]);

CREATE
CREATEUNIQUE
UNIQUEINDEX
INDEXSK_calle_num
SK_calle_num
ON
ONBloqueCasas
BloqueCasas(calle,
(calle,numero)
numero)WITH
WITHDISALLOW
DISALLOWNULL;
NULL;

48
Índices
 Eliminación de índices:
 Su sintaxis básica es la siguiente:

DROP INDEX nombre_indice;

DROP
DROPINDEX
INDEXSK_calle_num;
SK_calle_num;

DROP
DROPINDEX
INDEXSK_calle_num
SK_calle_numON
ONBloqueCasas
BloqueCasas;;
49
Base de datos Catastro

50
Definir una relación 1:1
 CREATE TABLE BloqueCasas
( calle TEXT(30) NOT NULL,
numero SHORT NOT NULL,
metros_b SHORT,
od_bloque LONG,
CONSTRAINT PK_blo PRIMARY KEY (calle, numero),
);
 Para crear una relación 1 a 1 debemos definir laclave ajena de esta
manera:
 CREATE UNIQUE INDEX SK_calle_num
ON BloqueCasas (calle, numero) WITH DISALLOW
NULL;
 ALTER TABLE BloqueCasas ADD CONSTRAINT FK_blo_vi
FOREIGN KEY (calle, numero)
REFERENCES Vivienda(calle, numero)
ON DELETE CASCADE;
51
Creación BD “SQL_LANS”

52
Esquema de la BD en SQL Server

53
Ejemplo de creación de una BD
 CREATE DATABASE SQL_LANS;
 USE SQL_LANS;

 CREATE TABLE CLIENTES


(
NUM_CLIE INT NOT NULL,
EMPRESA CHAR(20) NOT NULL,
REP_CLIE INT NOT NULL,
LIMITE_CREDITO FLOAT NOT NULL
);

54
Ejemplo de creación de una BD
 CREATE TABLE OFICINAS
(
OFICINA INT NOT NULL,
CIUDAD CHAR(15) NOT NULL,
REGION CHAR(10) NOT NULL,
DIR INT NOT NULL,
OBJETIVO FLOAT NOT NULL,
VENTAS FLOAT NOT NULL
);

 CREATE TABLE PEDIDOS


(
NUM_PEDIDO INT NOT NULL,
FECHA_PEDIDO DATETIME NOT NULL,
CLIE INT NOT NULL,
REP INT,
FAB CHAR(3) NOT NULL,
PRODUCTO CHAR(5) NOT NULL,
CANT INT NOT NULL,
IMPORTE FLOAT NOT NULL
); 55
Ejemplo de creación de una BD
 CREATE TABLE PRODUCTOS
(
ID_FAB CHAR(3) NOT NULL,
ID_PRODUCTO CHAR(5) NOT NULL,
DESCRIPCION CHAR(20) NOT NULL,
PRECIO FLOAT NOT NULL,
EXISTENCIAS INT NOT NULL
);

 CREATE TABLE REPVENTAS


(
NUM_EMPL INT NOT NULL,
NOMBRE CHAR(15) NOT NULL,
EDAD SMALLINT NOT NULL,
OFICINA_REP INT NOT NULL,
TITULO CHAR(10) NOT NULL,
CONTRATO DATETIME NOT NULL,
DIRECTOR INT NOT NULL,
CUOTA FLOAT NOT NULL,
VENTAS FLOAT NOT NULL
56
);
Definición de las claves principales
 USE SQL_LANS;

 ALTER TABLE Clientes ADD CONSTRAINT PK_Clie


PRIMARY KEY (NUM_CLIE);

 ALTER TABLE Oficinas ADD CONSTRAINT PK_Oficinas


PRIMARY KEY (OFICINA);

 ALTER TABLE Pedidos ADD CONSTRAINT PK_Pedidos


PRIMARY KEY (NUM_PEDIDO);

 ALTER TABLE Productos ADD CONSTRAINT PK_Productos


PRIMARY KEY (ID_FAB, ID_PRODUCTO);

 ALTER TABLE Repventas ADD CONSTRAINT PK_Repventas


PRIMARY KEY (NUM_EMPL);

57
Definición de las claves ajenas
 USE SQL_LANS;

 ALTER TABLE Clientes ADD CONSTRAINT FK_Clientes_RepVentas


FOREIGN KEY (REP_CLIE) REFERENCES RepVentas(NUM_EMPL)
ON DELETE SET NULL;

 ALTER TABLE Oficinas ADD CONSTRAINT FK_Oficinas_RepVentas


FOREIGN KEY (DIR) REFERENCES RepVentas(NUM_EMPL)
ON DELETE SET NULL;

 ALTER TABLE Pedidos ADD CONSTRAINT FK_Pedidos_Repventas


FOREIGN KEY (REP) REFERENCES RepVentas(NUM_EMPL)
ON DELETE SET NULL;

 ALTER TABLE Pedidos ADD CONSTRAINT FK_Pedidos_Productos


FOREIGN KEY (FAB,PRODUCTO) REFERENCES Productos(ID_FAB,ID_PRODUCTO)
ON DELETE RESTRICT;

 ALTER TABLE Pedidos ADD CONSTRAINT FK_Pedidos_Clientes


FOREIGN KEY (CLIE) REFERENCES Clientes(NUM_CLIE) ON DELETE CASCADE;

 ALTER TABLE RepVentas ADD CONSTRAINT FK_Repventas_Oficinas


FOREIGN KEY (OFICINA_REP) REFERENCES Oficinas(OFICINA) ON DELETE SET NULL;

 ALTER TABLE RepVentas ADD CONSTRAINT FK_Repventas_RepVentas


58
FOREIGN KEY (DIRECTOR) REFERENCES RepVentas(NUM_EMPL) ON DELETE SET NULL;
Borrar claves ajenas
 USE SQL_LANS;

 #DROP INDEX FK_Clientes ON Clientes;


 #DROP INDEX FK_Oficinas ON Oficinas;
 #DROP INDEX FK_Pedidos_Repventas ON Pedidos;
 #DROP INDEX FK_Pedidos_Productos ON Pedidos;
 #DROP INDEX FK_Pedidos_Clientes ON Pedidos;
 #DROP INDEX FK_RepVentas_Oficinas ON RepVentas;
 #DROP INDEX FK_RepVentas_RepVentas ON RepVentas;

 ALTER TABLE Clientes DROP CONSTRAINT FK_Clientes;


 ALTER TABLE Pedidos DROP CONSTRAINT FK_Pedidos_Repventas;
 ALTER TABLE Pedidos DROP CONSTRAINT FK_Pedidos_Productos;
 ALTER TABLE Pedidos DROP CONSTRAINT FK_Pedidos_Clientes;
 ALTER TABLE Repventas DROP CONSTRAINT FK_RepVentas_Oficinas;
 ALTER TABLE Repventas DROP CONSTRAINT FK_RepVentas_RepVentas;

59
Borrar claves principales
 DROP INDEX PK_Clie ON Clientes;
 DROP INDEX PK_Oficinas ON Oficinas;
 DROP INDEX PK_Pedidos ON Pedidos;
 DROP INDEX PK_Productos

ON Productos;
 DROP INDEX PK_Repventas

ON Repventas;
60
Borrar tablas de la BD
 USE SQL_LANS;

 DROP TABLE CLIENTES;

 DROP TABLE OFICINAS;

 DROP TABLE PEDIDOS;

 DROP TABLE PRODUCTOS;

 DROP TABLE REPVENTAS;

61
Consultas simples
Sentencia SELECT
 La sentencia SELECT recupera datos de una
base de datos y los devuelve en forma de una
relación
 La sentencia SELECT puede llegar a constar de
hasta seis cláusulas
 SELECT
 FROM
 WHERE
 GROUP BY
 HAVING
 ORDER BY

63
Sentencia SELECT
 SELECT
 Lista los datos a recuperar.
 Se pueden recuperar todas las columnas empleando
el carácter asterisco (“*”).
 Pueden ser datos contenidos en las tablas de la base
de datos o bien especificarse operaciones para
realizar cálculos (campos calculados).
 Puede ser una constante. Ejemplo: ‘Total igual a ‘.
 FROM
 Indicala lista de tablas que contienen los datos a
recuperar.
 Los datos pueden proceder de más de una tabla

64
Sentencia SELECT
 WHERE
 Se emplea para dar una condición de búsqueda para especificar
las filas deseadas
 GROUP BY
 Se emplea en consultas de resumen. Se verá en detalle más
adelante
 HAVING
 Indica una condición de selección solbre los grupos producidos
por GROUP BY. Se verá en detalle más adelante
 ORDER BY
 Permite ordenar los resultados de la consulta a través de una o
de varias columnas, ascendente o descendentemente, a través
de las cláusulas ASC (por defecto) y DESC

65
Sentencia SELECT
 Algunos ejemplos de consultas SELECT

SELECT Apellidos, Salario


FROM Empleados
WHERE Salario > 21000;

SELECT Id_Producto, Existencias


FROM Productos
WHERE Existencias <= Nuevo_Pedido;

SELECT * FROM Pedidos


WHERE Fecha_Envio = ´05/10/94’;

SELECT Apellidos, Nombre FROM Empleados


WHERE Apellidos = 'King';
66
Sentencia SELECT
 Eliminación de duplicados:
 Si en las consultas de selección se incluye una clave
primaria, el modelo relacional asegura que en los
resultados no se van a producir duplicados.
 Si no se incluye una clave primaria, se puede forzar
la eliminación de duplicados incluyendo la cláusula
DISCTINCT antes de la lista de campos.
 Ejemplo:

SELECT DISTINCT Nom_Proveedor


FROM Pedidos;
67
Cláusula WHERE
 Consta de la palabra clave WHERE
seguida de una condición de búsqueda.
 Conceptualmente, SQL recorre cada fila
de la relación seleccionada y aplica a
cada tupla la condición de búsqueda.
 Enla aplicación de la condición se pueden
producir los siguientes resultados:

68
Cláusula WHERE
1. Si la condición de búsqueda da como
resultado CIERTO la tupla se incluye en la
relación resultado
2. Si la condición de búsqueda da FALSO la
tupla se excluye de la relación resultado
3. Si la condición de búsqueda da QUIZÁS la
tupla se excluye de la relación resultado

69
Cláusula WHERE
 Para realizar las búsquedas, SQL cuenta con
distintos tipos de condiciones, que facilitan la
expresividad y naturalidad en las selecciones
 Los predicados estándar son:
 Test de comparación
 Test de rango
 Test de pertenencia a un conjunto
 Test de correspondencia a un patrón
 Test de valor nulo

70
Cláusula WHERE
 TEST DE COMPARACIÓN
 Se emplean en él los operadores de comparación
habituales
=, <>, <, <=, >, >=
 TEST DE RANGO - BETWEEN
 Comprueba si un dato se encuentra entre dos
valores
 Se indica mediante el nombre de campo a
comprobar, a continuación la palabra reservada
BETWEEN, y los dos valores extremos del intervalo
separados por la palabra AND.
 Ej: SELECT Nom, Dir
FROM Empleados
WHERE Sueldo BETWEEN 1000 AND 2000
71
Cláusula WHERE
 TEST DE PERTENENCIA A CONJUNTO – IN
 Comprueba si un valor de dato coincide con
uno de la lista de valores objetivo
proporcionada.
Ejemplo:
SELECT *
FROM Pedidos
WHERE Provincia In ('Madrid',
'Barcelona',
'Sevilla');
72
Cláusula WHERE
 TEST DE CORRESPONDENCIA CON
PATRÓN – LIKE
 Se emplea en la comparación de Cadenas
de Caracteres
 Comprueba si el valor de la columna
indicado se ajusta al patrón especificado
 Para especificar un patrón se emplean los
caracteres comodín.

73
Cláusula WHERE
 Los caracteres comodín son los siguientes:
 % (tanto por ciento)  Corresponde con una
secuencia de cero o más caracteres [Equivale al
comodín “*” de MS-DOS]

 _ (carácter de subrayado)  Corresponde con


un único carácter, y sólo uno [Equivale el
comodín ? de MS-DOS]

74
Ejemplo de patrón LIKE
 Consulta que muestra el código y el
nombre de los empleados cuyo apellido
empiece por “L”.
 SELECT Codigo, Nombre

FROM Empleados
WHERE Apellidos LIKE ‘L%’;

75
Cláusula WHERE
 TEST DE VALOR NULO – IS NULL
 Para seleccionar las tuplas en las que cierto
atributo toma un valor nulo hay que hacerlo
mediante la comparación IS NULL
 Un error típico cometido en SQL es tratar de hacer
una comparación del tipo
CAMPO = NULL
 Esta comparación en realidad lo que hace es tratar de
buscar un literal NULL que no es lo mismo que la falta de
dato que indica el valor nulo del modelo relacional.
 Ejemplo: SELECT * FROM Empleados
WHERE Sueldo IS NULL;
76
Condiciones compuestas
 Utilizando las reglas de la lógica se pueden combinar
condiciones de selección simples para formar otras
complejas.
 Para ello se pueden utilizar las palabras
reservadas
 AND (Y lógica)
 OR (O lógica)
 NOT (Negación lógica)

 Ejemplo:
 SELECT Apell, Nom
FROM Empleados
WHERE Sueldo>1000 AND Nom=‘Juan’;
77
Ordenaciones
 Si no se especifica ninguna opción, los resultados
devueltos por SQL quedarán ordenados por los
índices definidos en las tablas.
 Se puede especificar el orden en que se desean
recuperar los registros de las tablas mediante la
cláusula:
 ORDER BY Lista de Campos [ASC | DESC]
 ORDER BY posición del campo en el SELECT
 Ejemplo: SELECT Nom, Apell FROM Empleados
ORDER BY Apell, Nom;
O bien: ORDER BY 2,1
78
Ordenaciones
 Por omisión SQL ordena los datos en
secuencia ascendente (ASC)
 Para ordenar en secuencia descendente se
puede emplear la palabra clave DESC
 Si se quiere realizar una ordenación en base a
un campo calculado, como será un campo no
presente en la BBDD, y por tanto no tiene
nombre, se debe emplear el número de
columna según aparece en la definición de la
consulta
79
Consulta con expresión:
 Consulta que muestra los empleados nacidos
en 1990 con el sueldo aumentado un 20%.
 SELECT Nom, Apell,
Sueldo*1,20 AS Nuevo_Sueldo
FROM Empleados
WHERE YEAR(Fecha_Nac)=1990 AND
MONTH(Fecha_Nac)=6 AND
Sueldo IS NOT NULL;

80
Consultas con funciones de agregado

 Consult a que nos muest r a el t ot al y la media


de los sueldos de los empleados:
 SELECT SUM(Sueldo) AS Tot al_ Sueldos,
AVG(Sueldo) AS
Media_ Sueldo
FROM Empleados;
 Podemos usar las siguient es f unciones de
agr agado: SUM(), AVG(), MAX(), MI N(),
COUNT(). 81
Uniones
 SQL permite realizar la unión de dos consultas
 Operación UNION del álgebra relacional
 Para ello será imprescindible que las
relaciones origen sean compatibles
 Para realizar una unión, se utiliza la cláusula
UNION intercalada entre dos sentencias
SELECT
 Las sentencias SELECT no pueden ser ordenadas,
pero sí el resultado de la unión

82
Uniones
 Por omisión, en la unión de dos
relaciones se eliminan las tuplas
duplicadas.
 Si se quiere alterar el comportamiento
normal de la unión, forzando el que no
se eliminen los duplicados, se puede
emplear la cláusula ALL inmediatamente
después de la cláusula UNION

83
Ejemplo de consulta union:
 SELECT ID_Fab, ID_Producto
FROM Productos
WHERE Precio > 2000.00
UNION [ALL]
SELECT DISTINCT Fab, Producto
FROM Pedidos
WHERE Importe > 30000.00
ORDER BY 1,2;

84
Consultas Multitabla

Consultas con dos o


más tablas
Consultas Multitabla
 SQL permite recuperar datos
procedentes de dos o más tablas de una
base de datos, generando nuevas
relaciones
 Cuando se quiere recuperar datos de
más de una tabla, lo habitual es que
exista un nexo de unión entre ellas
 CLAVE PRIMARIA  CLAVE AJENA

86
Consultas Multitabla
 Composiciones simples (combinación
interna):
 Son las consultas multitabla fundamentales
 Recogen todas las tuplas formadas por la
combinación de las tuplas de la primera
tabla con las de la segunda, en los casos en
los que el campo de combinación (CLAVE
PRIMARIA –> CLAVE AJENA) tome valores
idénticos en ambas partes, es decir:
CLAVE
CLAVEPRIMARIA
PRIMARIA == CLAVE
CLAVEAJENA
AJENA
87
Consultas Multitabla
 La sintaxis básica es idéntica a la de las consultas
de selección, en las que se indicarán los campos
procedentes de cada tabla, y tras las cláusula FROM
se nombrarán todas las tablas desde las que
proceden
 Además, para poder hacer la combinación, se
igualarán en una condición del WHERE los campos
CLAVE PRIMARIA y CLAVE AJENA
 Este tipo de consultas se suele denominar también
PADRE – HIJO, o MAESTRO – DETALLE.

88
Consultas Multitabla
 Si además de incluir la condición de
combinación se quieren añadir nuevas
condiciones de selección, se puede hacer
mediante el uso de AND
 Del mismo modo, si existen varias columnas
de emparejamiento (claves primaria y ajena
formadas por múltiples campos), se pondrán
todas, utilizando también la cláusula AND

89
Consultas Multitabla
 Las técnicas empleadas para emparejar dos
tablas se hacen extensibles a tres o más tablas
 Con SQL también es posible emplear cualquier
par de columnas para hacer una combinación,
sin que estas guarden una relación PADRE –
HIJO
 Además se pueden generar combinaciones
basadas en desigualdades, utilizando el resto de
operadores de comparación.

90
Consultas Multitabla
 Nombres de campo cualificados:
 En consultas multitabla es habitual que haya
coincidencias en los nombres de los campos
 Para evitar el problema que esto supone, se
pueden cualificar mediante:
TABLA.CAMPO
 Si además las tablas se nominan mediante
ALIASES, se pueden cualificar los campos
mediante los mismos:
ALIAS.CAMPO

91
Consultas Multitabla
 Selección de todos los campos:
 Si se utiliza SELECT * se seleccionarán
todos los campos de todas las tablas
implicadas en la consulta
 Si se quiere hacer una selección de todos
los campos de una de las tablas de la
consulta, se puede realizar mediante
SELECT NOM_TABLA.*

92
Ejemplo consulta con dos tablas
SELECT Pedidos.[ID de pedido],
Clientes.[Nombre de la Compañia],
Clientes.[Ciudad]
Pedidos.[Fecha de pedido]
FROM Pedidos, Clientes
WHERE Pedidos.[ID de cliente]=Clientes.[ID Cliente];

93
Ejemplo con tres tablas
SELECT Pedidos.[ID de pedido], Clientes.[Nombre de la Compañia],
Clientes.[Ciudad], Pedidos.[Fecha de pedido], [Precio unidad],
Cantidad
FROM Pedidos, Clientes,[Detalle de Pedido]
WHERE Pedidos.[ID de cliente]=Clientes.[ID Cliente]
AND Pedidos.[ID de Pedido] = [Detalle de Pedido].[ID pedido]
AND Cantidad>3;

94
Consultas Multitabla
 Relación Maestro – Detalle REFLEXIVA:
 Para poder hacer una consulta Maestro – Detalle
reflexiva hay que emular que los datos se
encuentran distribuidos en dos tablas distintas en
lugar de una
 Para ello se debe hacer uso de los alias de tabla,
dando a cada una de las dos tablas emuladas un
alias distinto
 Para crear los alias basta con poner el nombre
deseado detrás del nombre de cada tabla en la
cláusula FROM
95
Consultas Multitabla
 Relación Maestro – Detalle REFLEXIVA:

A fl u e n t e
de

(0 ,n ) (0 ,1 )
R IO S

(0 ,n ) A fl u e n t e (0 ,1 )
R IO S (1 ) de
R IO S (2 )

96
Ejemplo de reflexiva
SELECT Rios.Nom_Rio,
'es afluente de ',
Afluente_de.Nom_Rio
FROM Rios, Rios AS Afluente_de
WHERE Rios.Cod_Rio_Afluente = Afluente_de.Cod_Rio;

97
Consultas Multitabla
 Producto Cartesiano:
 Es la composición que hace por defecto
SQL si no se indica ninguna condición de
igualdad de campos en la cláusula WHERE,
cuando se realiza una consulta multitabla.

98
Producto cartesiano
 Ejemplo: Si tenemos una tabla con
nombres de chicos y otra tabla con
nombres de chicas y queremos sacar
todos los emparejamientos posibles
(producto cartesiano), entonces:

SELECT Chicas.Nombre,
Chicos.Nombre
FROM Chicos, Chicas
ORDER BY 1;
99
Consultas Multitabla
 Combinación Interna
 SQL con las combinaciones que se han generado
hasta el momento genera únicamente las tuplas
que tienen coincidencia en valor en los campos
nexo de las tablas implicadas
 Esto es a lo que se llama COMBINACIÓN
INTERNA
 En los casos en que al comprobar la igualdad de
los campos nexo da un valor QUIZAS, se omiten
esas tuplas

100
Consultas Multitabla
 Combinación Externa
 Se puede especificar en SQL que incluyan
las tuplas en los que la condición de
igualdad de los campos nexo sea QUIZÁS
 Se pueden dar los casos de:
 Combinación Externa Izquierda
 Combinación Externa Derecha
 Combinación Externa Simétrica

101
Consultas Multitabla
 SQL 2 define una sintaxis específica
para realizar las combinaciones internas
y externas
 COMBINACIÓN INTERNA
 Se especifica mediante las cláusulas INNER
JOIN y ON
SELECT lista_campos FROM
Tabla_1 INNER JOIN Tabla_2
ON Tabla_1.NEXO = Tabla_2.NEXO
102
Ejemplo combinación interna
SELECT Pedidos.[ID de pedido],
Clientes.[Nombre de la Compañia],
Clientes.[Ciudad]
Pedidos.[Fecha de pedido]
FROM Clientes INNER JOIN Pedidos
ON Pedidos.[ID de cliente]=Clientes.[ID Cliente]
WHERE Pedidos.[Fecha de pedido]<’12/12/1991’;

103
Ejemplo combinación con tres tablas
SELECT Pedidos.[ID de pedido], Clientes.[Nombre de la Compañia],
Clientes.[Ciudad], Pedidos.[Fecha de pedido], [Precio unidad],
Cantidad
FROM Clientes INNER JOIN (Pedidos INNER JOIN [Detalle de
Pedido] ON Pedidos.[ID de Pedido] = [Detalle de Pedido].[ID
pedido] ) ON Pedidos.[ID de cliente]=Clientes.[ID Cliente]
WHERE Cantidad>3;

104
Consultas Multitabla
 COMBINACIÓN EXTERNA
 Se especifica mediante las cláusulas
[LEFT|RIGHT|FULL] OUTER JOIN y ON

 LEFT: Izquierda.
 RIGHT: Derecha.
 FULL: Izquierda y derecha.
SELECT lista_campos FROM
Tabla_1 LEFT [OUTER] JOIN Tabla_2
ON Tabla_1.NEXO = Tabla_2.NEXO
105
Ejemplo combinación externa por la izquierda
SELECT Clientes.[Nombre de la Compañia],
Clientes.[Ciudad],
Pedidos.[ID de pedido],
Pedidos.[Fecha de pedido]
FROM Clientes LEFT JOIN Pedidos
ON Pedidos.[ID de cliente]=Clientes.[ID Cliente];

NULOS

106
Consultas Resumen
Consultas Resumen
 Muchas peticiones de información no
requieren un detalle de todos los
registros implicados, sino una
información resumida en base a la
información total
 SQL permite resumir datos de la base de
datos mediante un conjunto de
funciones de columna.

108
Consultas Resumen
 Una función de columna SQL acepta
una columna entera de datos como
argumento, y produce un único resultado
que resume toda la columna
 SQL estándar proporciona seis
funciones de columna
 Distintos fabricantes suelen añadir en este
campo muchas más funciones además de
las estándar

109
Consultas Resumen
 Funciones de Columna Estándar:
 SUM() calcula el total de una columna
 AVG() calcula la media de una columna
 MIN() obtiene el valor mínimo de una
columna
 MAX() obtiene el valor máximo de una
columna
 COUNT() cuenta el número de valores de
una columna
 COUNT(*) cuenta las filas de una consulta

110
Consultas Resumen
 Restricciones:
 No se puede anidar funciones de columna
 No se puede mezclar funciones de columna
y nombres de columna ordinarios en una
lista de selección
Ejemplo ilegal:

SELECT NOMBRE, SUM(NOTAS)


FROM ALUMNOS

111
Consultas Resumen
 Valores NULL
 Las funciones de columna aceptan
una columna de valores como
argumento y producen como resultado
un resumen
 Si alguno de los valores de la columna
argumento toma el valor NULL, SQL lo
ignorará en sus cálculos

112
Consultas Resumen
 Eliminación de valores duplicados
 Se puede hacer que el conjunto de valores
de la columna pasada como argumento no
contenga duplicados
 Esto se hace anteponiendo la palabra clave
DISTINCT justo delante del argumento de
la función
Ejemplo:
SELECT COUNT(DISTINCT CIUDAD)
FROM ALUMNOS

113
Consultas Resumen
 Consultas Agrupadas – GROUP BY
 Las consultas resumen vistas sólo producen una
fila
 Con frecuencia es conveniente resumir los
resultados no a nivel de total, sino a nivel de
subtotales
 Esto se puede conseguir con SQL mediante la
cláusula GROUP BY
 Una consulta agrupada constará al menos de dos
campos: el de generación de grupos (de
agrupación) y el resumen
 Puede haber varios campos de agrupación

114
Consultas Resumen
 El funcionamiento de las consultas agrupadas
se puede ver conceptualmente de la siguiente
forma:
 SQL seleccionará todas las filas que cumplan con
los criterios de selección
 A continuación agrupará las columnas, de modo
que se produzcan tramos en los que no varía el
valor del campo de agrupación
 Para cada uno de estos tramos se aplicará la
función de columna seleccionada, asociando el
valor obtenido del cálculo al valor del campo de
agrupación.
115
Consultas Resumen
 Restricciones de las consultas agrupadas:
 Las columnas de agrupación deben ser columnas
efectivas
 No se pueden utilizar campos calculados para agrupar por
ellos
 Los elementos de la lista de selección sólo pueden
ser:
 Constantes
 Funciones de columna
 Columnas de agrupación (afectadas por GROUP BY)
 Una expresión que afecte a las combinaciones anteriores

116
Consultas Resumen
 Condiciones de selección de grupos – HAVING
 Funciona de manera similar a la cláusula WHERE,
aunque ésta lo hace sobre filas individuales
 Una vez calculados los grupos, se pueden aceptar o
rechazar mediante el uso de la cláusula HAVING, que
se incluirá tras la especificación del GROUP BY
Ejemplo:
SELECT Id_Familia, Sum(Stock)
FROM Productos
GROUP BY Id_Familia
HAVING Sum(Stock) > 100
117
Ejemplo Consulta Resumen
El atributo debe estar en GROUP BY

 SELECT Grupo, SUM(Cuota) AS Suma_Cuota


FROM Alumnos Solo tendrá en
cuenta para
WHERE [¿HA PAGADO?]=TRUE
agrupar y sumar
GROUP BY Grupo los registros que
cumplan la
HAVING AVG(Cuota)>6500; condición.

Resultado
Resultadosin usar
sinusar

Resultado usando
Resultadousando lalacláusula HAVING
cláusulaHAVING

lalacláusula HAVING
cláusulaHAVING

118
Ejemplo Consulta Resumen con dos tablas
Por cada oficina con dos o más personas, calcular la cuota total y
las ventas totales para todos los vendedores que trabajan en la
oficina. (Agrupar por Ciudad siempre que haya dos o más
representantes).

 SELECT Ciudad, SUM(Cuota) AS Suma_Cuotas,


SUM(RepVentas.Ventas) AS Suma_Ventas
FROM Oficinas, RepVentas
WHERE Oficina = Oficina_Rep
GROUP BY Ciudad
HAVING COUNT(*) >=2;
119
Subconsultas

Consultas anidadas
Subconsultas
 SQL permite utilizar los datos obtenidos
como resultado de una consulta como
parte de otra
 Una subconsulta es una consulta que
aparece dentro de la cláusula WHERE o
de la cláusula HAVING

121
Subconsultas
 Restricciones de las subconsultas:
 La subconsulta debe producir una única columna
de datos resultado
 Su lista de selección contiene un único elemento
 No se puede especificar la cláusula ORDER BY en
la subconsulta
 No puede ser la UNION de varias SELECT
 Los nombres de columna de la subconsulta pueden
hacer referencia a la consulta principal
 Es aconsejable emplear nombres de columna cualificados

122
Subconsultas
 Referencias Externas:
 En el cuerpo de una subconsulta es habitual tener
que referirse al valor de una columna en la “fila
actual” de la consulta principal.
Ejemplo:
SELECT Oficinas.Ciudad
FROM Oficinas
WHERE Objetivo >
(SELECT SUM(RepVentas.Cuota)
FROM RepVentas
WHERE Repventas.Oficina_Rep =

123
Oficinas.Oficina);
Subconsultas
 En el ejemplo anterior, en la subconsulta se
hace referencia al campo Oficinas.Oficina
de la consulta prinicipal.
 Conforme SQL recorre cada fila de la tabla
OFICINAS, utiliza el valor
Oficinas.Oficina de la fila actual como
argumento para resolver la condición WHERE
de la subconsulta

124
Subconsultas
 Condiciones de búsqueda en
subconsultas:
 Una subconsulta siempre forma parte de
una condición WHERE o HAVING
 Los tipos de condiciones de subconsultas
son:
 Test de comparación subconsulta
 Test de pertenencia a un conjunto subconsulta
 Test de existencia
 Test de comparación cuantificada
125
Subconsultas
 Test de comparación subconsulta:
 Hace uso de los operadores típicos de
comparación: (=,<,>,<=,>=,<>).
 Compara el valor de una expresión con un
valor único producido por la subconsulta
 Si la subconsulta no produce filas o produce
un valor NULL, el test de comparación
devuelve NULL

126
Ejemplo:
 SELECT * FROM Productos
WHERE PrecioUnidad >
(SELECT AVG(PrecioUnidad)
FROM Detalles de pedidos
WHERE Descuento >= .25);
Importante:
Importante: Si
Sien
enuna
unaconsulta
consultautilizamos
utilizamosenenlalacláusula
cláusula
WHERE
WHEREcualquiera
cualquieradedelos
losseis
seisoperadores
operadores(=,<,>,<=,>=,<>),
(=,<,>,<=,>=,<>),
para
paracomparar
compararcon
conuna
unasubconsulta,
subconsulta, yyno noutilizamos
utilizamos ninguno
ninguno
de
delos
losoperadores
operadoresANY,
ANY,ALL,ALL, IN,
IN,EXIST,
EXIST,solamente
solamente
comparará
compararácon
conun
un valor,
valor,que
queserá
seráelelque
queobtengamos
obtengamos de delala
subconsulta
subconsulta(nunca
(nuncacon
convarios).
varios). 127
Subconsultas
 Test de pertenencia a conjunto – IN
 Compara un único valor de datos con una columna
de valores producida por una subconsulta
 Se utiliza cuando se necesita comparar un valor de
la fila que se está examinando con un conjunto de
valores producidos por una subconsulta
 El formato es prácticamente igual al de test de
conjunto simple, solo que el conjunto en lugar de
declararse explícitamente se obtiene por medio de
una subconsulta

128
Ejemplo:
Utilice el predicado IN para recuperar sólo aquellos registros de la
consulta principal para los cuales algún registro de la subconsulta
contenga un valor igual.
El siguiente ejemplo devuelve todos los productos con descuento del 25
por ciento o mayor.

 SELECT * FROM Productos


WHERE IdProducto IN
(SELECT IdProducto
FROM Detalles de pedidos
WHERE Descuento >= .25);
Además,
Además,puede
puedeutilizar
utilizarNOT
NOTININpara
pararecuperar
recuperarsolamente
solamenteaquellos
aquellos
registros
registrosde
delalaconsulta
consultaprincipal
principalpara
paralos
losque
queningún
ningúnregistro
registrode
delala
subconsulta
subconsultacontenga
contengaun unvalor
valorigual.
igual. 129
Subconsultas
 Test de existencia – EXISTS
 Comprueba si una subconsulta produce alguna fila
de resultados
 No hay ninguna equivalencia en consultas simples,
sólo se usa en subconsultas
Ejemplo:
Listar los productos para los cuales se ha recibido
un pedido de 25.000 € ó más  Listar los
productos para los cuales existe al menos un
pedido en el que esté el producto en cuestión, de
modo que el pedido tiene un importe de al menos
25.000 €
130
Ejemplo:
SELECT Descripcion
FROM Productos
WHERE EXISTS (SELECT *
FROM Pedidos
WHERE Producto = ID_producto
AND Fab = Id_Fab
AND Importe >= 25000);

Utilice
Utiliceel
elpredicado
predicadoEXISTS
EXISTS(con
(conlalapalabra
palabrareservada
reservadaopcional
opcionalNOT)
NOT)enen
comparaciones
comparacionesverdadero/falso
verdadero/falsopara
paradeterminar
determinarsisila
lasubconsulta
subconsultadevuelve
devuelve
algún
algúnregistro.
registro.

131
Subconsultas
 Test de existencia – EXISTS
 Conceptualmente el funcionamiento es:
 SQL recorre la relación de la consulta principal y
para cada tupla de la misma realiza una
subconsulta.
 La subconsulta contiene una columna con un
conjunto de valores.
 Si el conjunto de valores no es vacío, el test de
existencia EXISTS devuelve TRUE, y por tanto la
tupla de la relación de la consulta principal
queda seleccionada
132
Subconsultas
 Tests cuantificados – ANY
 Similar al test de conjunto IN
 Con los test cuantificados ANY y ALL extienden el
test de conjunto IN a los operadores de
comparación, tales como > y <.
 Se utilizan conjuntamente con uno de los seis
operadores de comparación, para comparar un único
valor de test con una columna de valores, producida
por la subconsulta
 Si alguna de las comparaciones individuales
devuelve TRUE, el test ANY devuelve TRUE y la fila de
la consulta principal queda seleccionada
133
Ejemplo de Tests ANY o SOME
El
Elsiguiente
siguienteejemplo
ejemplodevuelve
devuelvetodos
todoslos
losproductos
productoscuyo
cuyoprecio
preciopor unidad
porunidad
es
esmayor
mayorque
quecualquier
cualquierproducto
productovendido
vendidocon
conun
undescuento
descuentodel
del25 por
25por
ciento mayor:
cientooomayor:

 SELECT * FROM Productos


WHERE PrecioUnidad > ANY
(SELECT PrecioUnidad
FROM Detalles_pedido
WHERE Descuento >= .25);
Utilice
Utilicelos
lospredicados
predicadosANY ANYooSOME,
SOME,que
queson
sonsinónimos,
sinónimos,para
pararecuperar
recuperar
registros
registrosdedelalaconsulta
consultaprincipal
principalque
quesatisfagan
satisfaganlalacomparación
comparacióncon conotros
otros
registros
registrosrecuperados
recuperadosen enlalasubconsulta.
subconsulta.Es
Esdecir
decirsi
sialguna
algunadedelas
las
comparaciones
comparacionesindividuales
individualesproduce
produceun
unvalor
valorVERDADERO,
VERDADERO,el eltest
testANY
ANY
devuelve
devuelveel elresultado
resultadoVERDAD
VERDAD(TRUE).
(TRUE).El
Eltest
testANY
ANYsesepuede
puedeutilizar
utilizarcon
conlos
los
operadores
operadores(=,<,>,<=,>=,<>).
(=,<,>,<=,>=,<>). 134
Subconsultas
 Tests cuantificados – ANY
 Conceptualmente:
 La consulta principal genera una relación de
datos, que es recorrida tupla a tupla
 La subconsulta genera una columna de datos, los
cuales son comparados, según el operador de
comparación seleccionado, uno a uno con el dato
de la tupla actual de la consulta principal
 Si alguna de las comparaciones da TRUE, la tupla
de la relación principal es seleccionada.

135
Subconsultas
 Tests cuantificados – ANY
 Siempre se puede transformar una consulta
con test ANY en una consulta con test
EXISTS, trasladando la comparación al
interior de la condición de búsqueda de la
subconsulta
 Esta táctica elimina errores de interpretación,
ya que el uso del test ANY puede llegar a se
un tanto oscuro

136
Ejemplo con EXISTS
SELECT
SELECT**
FROM
FROM Productos
Productos
WHERE
WHEREEXISTS
EXISTS
(SELECT
(SELECTPrecioUnidad
PrecioUnidad
FROM
FROM Detalles_pedido
Detalles_pedido
WHERE
WHEREDescuento
Descuento>=>= .25
.25AND
AND
Productos.PrecioUnidad>Detalles_pedido.PrecioUnidad);
Productos.PrecioUnidad>Detalles_pedido.PrecioUnidad);

137
Subconsultas
 Tests cuantificados – ALL
 El funcionamiento del test ALL es similar al del test
ANY
 Si todas de las comparaciones individuales devuelve
TRUE, el test ALL devuelve TRUE y la fila de la
consulta principal queda seleccionada
 Conceptualmente funciona igual que el test ANY,
salvo la necesidad que el valor comparado de la
consulta principal tiene que dar TRUE con cada
comparación con los datos obtenidos en la
subconsulta

138
Ejemplo de Tests ALL

 SELECT
SELECT ** FROM
FROM Productos
Productos
WHERE
WHERE PrecioUnidad
PrecioUnidad >> ALL
ALL
(SELECT
(SELECT PrecioUnidad
PrecioUnidad
FROM
FROM Detalles_pedido
Detalles_pedido
WHERE
WHERE Descuento
Descuento >=
>= .25);
.25);
 Utiliceelelpredicado
Utilice predicadoALLALLpara
pararecuperar
recuperarsólo
sólolos
losregistros
registrosde
dela
laconsulta
consulta
principal
principalquequesatisfagan
satisfaganlalacomparación
comparacióncon
contodos
todoslos
losregistros
registros
recuperados
recuperadosen enlalasubconsulta.
subconsulta.

SiSicambia
cambiaANY
ANYaaALL
ALLenenel
elejemplo
ejemploanterior,
anterior,la
laconsulta
consultadevolvería
devolveríasólo
sólo
aquellos
aquellosproductos
productoscuyo
cuyoprecio
preciopor
porunidad
unidadfuese
fuesemayor
mayorque
queelelde
detodos
todos
los
losproductos
productosvendidos
vendidoscon
conun undescuento
descuentodel
del2525por
porciento
cientooomayor.
mayor.
Esto
Estoes
esmucho
muchomás
másrestrictivo.
restrictivo. 139
Subconsultas y Composiciones
 Muchas consultas realizadas mediante
subconsultas se pueden obtener también
mediante consultas multitabla.
 En esos casos, las dos soluciones son
correctas
 En algunos SGBD la única diferencia que se
encontrará será la diferencia de rendimiento entre
unas y otras.
 Generalmente se obtiene mayor rendimiento en una
composición que con el uso de las subconsultas.

140
Subconsultas Anidadas
 Del mismo modo que una consulta principal puede
hacer uso de una subconsulta, una subconsulta puede
hacer uso al mismo tiempo de otra nueva subconsulta
 Esto es generalizable a los niveles que sea necesario
Lista
Listalos
losclientes
clientes(Empresa)
(Empresa)cuyos
cuyosvendedores
vendedoresestán
estánasignados
asignadosaaoficinas
oficinas
de
dela
laregión
regióndedeventas
ventasEste.
Este.

SELECT
SELECTEmpresa
Empresa
FROM
FROM Clientes
Clientes
WHERE
WHERERep_Clie
Rep_ClieININ
(SELECT
(SELECTNum_Empl
Num_Empl
FROM
FROM RepVentas
RepVentas
WHERE
WHEREOficina_Rep
Oficina_RepIN
IN
(SELECT
(SELECTOficina
Oficina
FROM
FROMOficinas
Oficinas
WHERE
WHERERegion
Region=='Este'));
'Este')); 141
Pasos para realizar la consulta anterior:
En
Eneste
esteejemplo
ejemplolalasubconsulta
subconsultamás
másinterna:
interna:

SELECT
SELECTOficina
OficinaFROM
FROMOficinas
OficinasWHERE
WHERERegión
Región==‘Este’;
‘Este’;

Nos
Nosdevuelve
devuelveuna
unauna
unacolumna
columnaquequecontiene
contienelos
losnúmeros
númerosde
deoficina
oficina
de
delas
lasoficinas
oficinasde
delalaregión
regiónEste.
Este.

La
Lasubconsulta
subconsultasiguiente:
siguiente:

SELECT
SELECTNum_Empl
Num_EmplFROM
FROMRepVentas
RepVentas
WHERE
WHEREOficina_rep
Oficina_repININ(subconsulta)
(subconsulta)
No
Nodevuelve
devuelveuna
unacolumna
columnaque
quecontiene
contienelos
losnúmeros
númerosdedeempleados
empleadosdede
los
losvendedores
vendedoresque
quetrabajan
trabajanen
enuna
unade
delas
lasoficinas
oficinasseleccionadas.
seleccionadas.

 Finalmente
Finalmentela laconsulta
consultamás
másexterna:
externa:
SELECT
SELECTEmpresa
Empresa
FROM
FROMClientes
Clientes WHERE
WHERERep_Clie
Rep_ClieIN
IN(Subconsulta)
(Subconsulta)
Mostrará
Mostrarálos
losclientes
clientes(Empresa)
(Empresa)cuyos
cuyosvendedores
vendedorestienen
tienen
uno
unodedelos
losnúmeros
númerosde deempleados
empleadosseleccionados.
seleccionados.
142
Subconsultas Correlacionadas
 Conceptualmente, SQL realiza una subconsulta
tantas veces como tuplas existen en la relación
obtenida por la consulta principal
 Para muchas subconsultas, se producen los
mismos resultados
 Cuando esto es así, las implementaciones comerciales de
servidores de BBDD tratan de evitar el repetir el cálculo
de la subconsulta, para incrementar el rendimiento
 Esta optimización no se puede realizar si la subconsulta
contiene referencias externas - CORRELACIÓN

143
Subconsultas en HAVING
 Además de utilizar las consultas en la cláusula
WHERE se pueden emplear igualmente en la
cláusula HAVING
 Cuando una subconsulta aparece en la
cláusula HAVING, funciona como parte de la
selección de grupo de filas efectuada por la
cláusula HAVING.
 Además se pueden utilizar las subconsultas en
las sentencias INSERT, DELETE, UPDATE
como veremos más adelante.
144
Actualizaciones de
bases de datos

INSERT, DELETE, UPDATE


Actualizaciones de BBDD
 Con SQL, además de poder realizar
consultas para obtener resultados a partir
de los datos incluidos en la BBDD,
permite:
 Actualizar los datos de la BBDD
 Altas, Bajas y Modificaciones
 El SGBD velará por la integridad de los datos,

además de coordinar la simultaneidad de


peticiones por parte de los usuarios
 Crear la propia BBDD
146
Introducción de datos en la BBDD
 ALTAS:
 Consiste en incluir nuevos registros de datos
en las tablas de la BBDD
 Los SGBD incluyen para ello:
 Sentencias INSERT de SQL para añadir una fila
 Sentencias INSERT de SQL para añadir varias

filas
 Utilidades de carga masiva de datos en la BBDD

147
Sentencia INSERT de una fila
 Su sintaxis es la siguiente:
INSERT INTO
Tabla (campo1, .., campoN)
VALUES (valor1, ..., valorN)

INSERT
INSERTINTO
INTORepVentas
RepVentas
( (Num_Empl,
Num_Empl,Nombre,
Nombre,Edad,
Edad,Oficina_Rep,
Oficina_Rep,Titulo,
Titulo,Contrato,
Contrato,Director,
Director,Cuota,
Cuota,Ventas
Ventas) )
VALUES
VALUES(112,’Henry
(112,’HenryFord’,
Ford’,46,
46,13,
13,‘Dir
‘DirVentas’,
Ventas’,‘25/08/90’,
‘25/08/90’,NULL,
NULL,NULL,
NULL,0.0);
0.0);

148
Sentencia INSERT de una fila
 Inserción de valores NULL:
 SQL automáticamente inserta valores NULL a
aquellas columnas no incluidas en una
sentencia INSERT, a menos que esas
columnas tengan definido un valor por
defecto en la creación de la tabla
 Se puede hacer explícitamente mediante la
palabra clave NULL en el área VALUES

149
Sentencia INSERT de una fila
 Inserción de todas las columnas
 Si se pretende insertar valores en todas las
columnas de una tabla, SQL permite omitir la
lista de los nombres de columna.
 SQL supondrá que se insertan valores,
tomando las columnas en el orden en el que
se definieron
INSERT
INSERTINTO
INTORepVentas
RepVentas
VALUES
VALUES(112,’Henry
(112,’HenryFord’,
Ford’,46,
46,13,
13,‘Dir
‘DirVentas’,
Ventas’,‘25/08/90’,
‘25/08/90’,NULL,
NULL,NULL,
NULL,0.0);
0.0);

150
Crear una tabla y añadir registros
Crear
Crearla
latabla
tablaAntPedidos
AntPedidosconconlosloscampos
camposNum_pedido,
Num_pedido,
Fecha_Pedido,
Fecha_Pedido,eeImporte,
Importe,para
paraaquellos
aquellospedidos
pedidoscuya
cuyafecha
fechade
de
pedido
pedidosea
seaigual
igualoosuperior
superioralalprimer
primerdía
díadel
delaño
año1990.
1990.

SELECT Num_Pedido,Fecha_Pedido,
SELECT Num_Pedido, Fecha_Pedido,Importe
Importe
INTO
INTO AntPedidos
AntPedidos
FROM
FROM Pedidos
Pedidos
WHERE
WHERE Fecha_Pedido
Fecha_Pedido >= >= ‘01/01/90’;
‘01/01/90’;

151
Sentencia INSERT multifila
 Permite añadir múltiples filas desde un
origen de datos a una tabla destino (la
tabla debe de estar creada).
 No se especifican los valores a insertar,
sino que estos se obtienen a partir de la
ejecución de una sentencia SELECT

152
Sentencia INSERT multifila
 Su sintaxis básica es la siguiente:
INSERT INTO
Tabla (campo1, …, campoN)
SELECT TablaOrigenX.campo1, …,
TablaOrigenZ.campoN
FROM TablaOrigenX, …, TablaOrigenZ
WHERE Condiciones_de_Selección

153
Ejemplo:
Añadir
Añadiraalalatabla
tabla AntPedidos,
AntPedidos,aquellos
aquellosde
delalatabla
tablapedidos
pedidoscuya
cuyafecha
fechade
de
pedido
pedidosea
seamenor
menoralal01-01-90
01-01-90

INSERT
INSERT INTO
INTO AntPedidos
AntPedidos
(( Num_Pedido,
Num_Pedido, Fecha_Pedido,
Fecha_Pedido, Importe
Importe ))
SELECT
SELECT Num_Pedido,
Num_Pedido, Fecha_Pedido,
Fecha_Pedido,
Importe
Importe
FROM
FROM Pedidos
Pedidos
WHERE
WHERE Fecha_Pedido
Fecha_Pedido << ‘01/01/90’;
‘01/01/90’;

154
Supresión de datos de la BBDD
 Se realiza mediante la sentencia DELETE
 Su sintaxis básica es la siguiente:
DELETE FROM Tabla WHERE criterio
 DELETE FROM Pedidos
WHERE Fecha_Pedido < ‘15/11/89’;
 Si se pretenden eliminar todos los registros de
una tabla, se prescindirá de la condición
expresada en la cláusula WHERE
 Hay que tener en cuenta que un borrado en una tabla
puede desencadenar borrados en cascada en otras
tantas

155
Supresión de datos de la BBDD
 Borrados con Subconsultas
 En ocasiones los borrados de datos se deben
efectuar en base a datos contenidos en otras
tablas
 SQL no permite utilizar composiciones en
sentencias DELETE
 El modo de solucionar esta situación es por
medio de subconsultas

156
Ejemplo de borrado con subconsulta:
Suprime
Suprimelos
lospedidos
pedidosaceptados
aceptadospor
porSue
SueSmith.
Smith.

DELETE
DELETE FROM
FROM Pedidos
Pedidos
WHERE
WHERE Rep
Rep == (SELECT
(SELECT Num_Empl
Num_Empl
FROM
FROM RepVentas
RepVentas
WHERE
WHERE Nombre= 'SueSmith'
Nombre='Sue Smith');
);

157
Modificación de datos en la BBDD

 Se realiza mediante la sentencia UPDATE


 Su sintaxis básica es la siguiente:
UPDATE Tabla
SET Campo1=Valor1, …, CampoN=ValorN
WHERE Criterio;
 Si se pretende modificar todos los registros
de una tabla, se prescindirá de la cláusula
WHERE
158
Ejemplo de UPDATE
Cambia
Cambiaaatodos
todoslos
losvendedores
vendedoresdedelalaoficina
oficinade
deChicago
Chicago(número
(número12)
12)aala
la
oficina
oficinade
deNew
NewYork
York(número
(número11)
11)yyrebaja
rebajasussuscuotas
cuotasun
un10%.
10%.

UPDATE
UPDATE RepVentas
RepVentas
SET
SET Oficina_Rep
Oficina_Rep == 11,
11, Cuota
Cuota == 0.9
0.9 *Cuota
*Cuota
WHERE
WHERE Oficina_Rep
Oficina_Rep == 12;
12;

159
Modificación de datos en la BBDD
 Modificaciones con Subconsultas
 En ocasiones las modificaciones de datos se
deben efectuar en base a datos contenidos
en otras tablas
 SQL no permite utilizar composiciones en
sentencias UPDATE
 El modo de solucionar esta situación es por
medio de subconsultas

160
Vistas

Tablas virtuales
Vistas
 Una vista es una consulta realizada en
SQL, cuya definición está
permanentemente almacenada en la
BBDD, y que tiene además un nombre
asignado
 SQL permite acceder a los resultados de
invocar a la ‘vista’ como si se tratase de una
tabla de la BBDD

162
Vistas
 Razones para utilizar las vistas:
 Permiten acomodar el aspecto de una BBDD,
de modo que distintos usuarios la vean desde
diferentes perspectivas
 Permiten restringir el acceso a los datos,
permitiendo que diferentes usuarios sólo vean
ciertas filas o columnas
 Simplifican el acceso a la BBDD mediante la
presentación de la estructura de los datos
almacenados de manera más natural
163
Vistas
 Una vista es una “tabla virtual” en la
BBDD, cuyos contenidos están definidos
por una consulta
 Los datos que muestra una vista no existe en
la base de datos como un conjunto
almacenado de valores, sino que son los
resultados producidos de la ejecución de una
consulta que define a la vista.
 Una vez definida la vista, se puede ejecutar
una sentencia SELECT sobre ella, como si se
tratase de una tabla

164
Creación de una Vista
 Se realiza mediante la sentencia
CREATE VIEW
Su sintaxis básica es:
CREATE VIEW nombre_vista
[(col_vista [,col_vista …])]
AS SELECT …
Siendo SELECT una sentencia de selección
completa

165
Ejemplo:
Define
Defineuna
unavista
vistaque
quecontenga
contengaúnicamente
únicamentelas
lasoficinas
oficinasde
delalaregión
región“Este”,
“Este”,
cuyo
cuyonombre
nombresea
seaOficinasEste.
OficinasEste.


 CREATE
CREATE VIEW
VIEW OficinasEste
OficinasEste
(Cod_Oficina,
(Cod_Oficina, Ciudad,
Ciudad, Region)
Region)
AS
AS
SELECT
SELECT OFICINA,
OFICINA, CIUDAD,
CIUDAD, REGION
REGION
FROM
FROM Oficinas
Oficinas
WHERE
WHERE Region
Region == 'Este';
'Este';
166
Vistas
 Vistas Agrupadas:
 La consulta para la definición de una vista
puede incluir la cláusula GROUP BY
 En este caso, las vistas que se definen se
denominan Vistas Agrupadas
 Una vista agrupada reúne los resultados de
una consulta agrupada en una tabla virtual,
permitiendo efectuar consultas adicionales
sobre ella.

167
Vistas
 Vistas Agrupadas:
 Como restricción, las vistas agrupadas no
son actualizables
 Sin embargo, en los últimos SGBD, las
vistas agrupadas pueden salvar la limitación
que impone SQL sobre la anidación de
funciones
 Por ejemplo, se podría calcular MIN(AVG(A))
 No todos los SGBD tienen esta capacidad

168
Vistas
 Vistas Compuestas:
 Una de las razones más frecuentes para
utilizar vistas compuestas es simplificar las
consultas multitabla.
 Se puede crear una vista compuesta que
extrae sus datos de varias tablas,
presentando los datos como si se tratase de
una única tabla virtual

169
Vistas
 Actualizaciones sobre vistas:
 Las reglas que impone SQL sobre las
actualizaciones de vista son muy restrictivas
 Los productos comerciales suelen relajar estas
reglas, ya que en muchos casos se pueden permitir
ciertas actualizaciones que el estándar impediría.
 Hay vistas que pueden soportar algunas de las
operaciones de actualización, y otras no
 Hay vistas que pueden soportar actualizaciones sobre un
subconjunto de sus columnas
 Las reglas de actualización de vistas dependen de
cada SGBD.
170
Vistas
 Comprobación de actualizaciones sobre vistas –
WITH CHECK OPTION
 Una vista actualizable puede incluir una condición
WHERE
 Si se hace una inserción de un dato sobre una vista
de este tipo, quizás el dato insertado no cumpla con
la condición de selección, y por tanto después no
aparecerá en la vista
 Esto se puede evitar si en la definición de la vista se
incluye al final la cláusula WITH CHECK OPTION

171
Vistas
 Eliminación de una vista:
 La sintaxis básica de la eliminación de una
vista es la siguiente:

DROP
DROP VIEW
VIEW NombreVista
NombreVista

172
Triggers

Disparadores
Triggers
 Un trigger o disparador es una respuesta a un
evento que se produce en una BBDD, llevando
a un cambio en la información contenida en la
misma
 Los eventos que se producen en una BBDD son
por tanto:
 Inserciones
 Borrados
 Modificaciones

174
Triggers
 En muchos SGBD se pueden llevar a
cabo acciones tanto antes como después
de que se lleven a cabo las acciones de
inserción, modificación o borrado
 Cada SGBD incorpora su propio dialecto
de descripción de triggers

175
Desencadenadores o Triggers
 Ejemplo de la Base de Datos SQL LANS
 Cuando añadimos un pedido a la tabla PEDIDOS, estos
dos cambios también podrían tener lugar en la base de
datos:
 La columna VENTAS del vendedor que aceptó el pedido
debería incrementarse en el importe del pedido.
 El valor de EXISTENCIAS para ese producto debería disminuir
en la cantidad solicitada.
 Definiendo un disparador (trigger) de nombre
NUEVOPEDIDO, haremos que estas actualizaciones de
la Base de Datos se produzcan automáticamente.

176
Triggers - SQL SERVER
Nombre del
disparador
CREATE
CREATE TRIGGER
TRIGGER NuevoPedido
NuevoPedido Tabla sobre la que actua
ON Pedidos
ON Pedidos
FOR
FOR INSERT
INSERT Se activará cuando insertamos un
AS
AS registro en la tabla Pedidos.
BEGIN
BEGIN Importe insertado en
UPDATE RepVentas
UPDATE RepVentas Pedidos
SET
SET Ventas
Ventas == Ventas
Ventas ++ INSERTED.Importe
INSERTED.Importe
WHERE insertada en
WHERE RepVentas.Num_Empl
RepVentas.Num_Empl == INSERTED.Rep;
INSERTED.Rep; Cantidad Pedidos
UPDATE Productos
UPDATE Productos
SET
SET Existencias
Existencias == Existencias
Existencias -- INSERTED.Cant
INSERTED.Cant
WHERE
WHERE Productos.Id_Fab
Productos.Id_Fab == INSERTED.Fab
INSERTED.Fab
AND
AND Productos.Id_Producto
Productos.Id_Producto == INSERTED.Producto;
INSERTED.Producto;
END;
END;

177
Para probar el disparador anterior
 INSERT INTO Pedidos
(NUM_PEDIDO,FECHA_PEDIDO, CLIE,REP,FAB, PRODUCTO, CANT, IMPORTE)
VALUES (222222,'12/02/1990',2111,103,'ACI','4100X',2,100)
 NOTA: Para ver los TRIGGERS en SQL SERVER. Iremos al menú y
seleccionaremos el programa:
 Inicio->Programas->SQL Server->Administrador Corporativo y en la
base de datos SQL_LANS nos colocamos en la tabla Pedidos y al pulsar
el botón derecho, si elegimos la opción Diseño tabla, en la lista de
botones de arriba aparecerá un botón de desencadenadores, el cual, al
pulsarlo nos saldrá el código del desencadenador.

178
Triggers – Ejemplo integridad referencial
 Este
Estedisparador
disparadorfuerza
fuerzala
laintegridad
integridadreferencial
referencialde
dela
larelación
relación
OFICINAS/REPVENTAS,
OFICINAS/REPVENTAS, yytambién
tambiénmuestra
muestraununmensaje
mensaje
cuando
cuandouna
unaactualización
actualizaciónfalla.
falla.

CREATE
CREATETRIGGER
TRIGGERActualiza_rep
Actualiza_rep Cuando hay una inserción o
ON
ONRepVentas
RepVentas un actualización en la tabla
FOR Repventas comprueba que el
FORINSERT,
INSERT,UPDATE
UPDATE
AS nº de oficina insertado sea
AS válido
IF ((SELECT COUNT(*)
IF ((SELECT COUNT(*)
FROM
FROMOFICINAS,
OFICINAS,INSERTED
INSERTED
WHERE
WHEREOFICINAS.OFICINA=INSERTED.OFICINA_REP)=0)
OFICINAS.OFICINA=INSERTED.OFICINA_REP)=0)
BEGIN
BEGIN
PRINT
PRINT'Especificado
'Especificadoun
unnumero
numerode
deoficina
oficinainvalido'
invalido'
ROLLBACK
ROLLBACKTRANSACTION
TRANSACTION
END
END

179
Ejemplo borrado en cascada
 Hay algunos SGBD que no soportan la
actualización en cascada si se modifica un valor
de la clave primaria. Si embargo, esto se puede
realizar con disparadores. Por ejemplo:
 El siguiente disparador propaga en cascada
cualquier actualización de la columna OFICINA
en la tabla OFICINAS a la columna
OFICINA_REP de la tabla REP_VENTAS:

180
Ejemplo borrado en cascada
CREATE
CREATETRIGGER
TRIGGERCambia_Oficina_Rep
Cambia_Oficina_Rep
ON
ONOficinas
Oficinas
FOR
FORUPDATE
UPDATE
AS
AS
IF
IFUPDATE
UPDATE(OFICINA)
(OFICINA)
BEGIN
BEGIN
UPDATE
UPDATEREPVENTAS
REPVENTAS
SET
SETREPVENTAS.OFICINA_REP=INSERTED.OFICINA
REPVENTAS.OFICINA_REP=INSERTED.OFICINA
FROM
FROMREPVENTAS,
REPVENTAS,INSERTED,
INSERTED,DELETED
DELETED
WHERE
WHEREREPVENTAS.OFICINA_REP=DELETED.OFICINA
REPVENTAS.OFICINA_REP=DELETED.OFICINA
END
END

Las
Lasreferencias
referenciasDELETED.OFICINA
DELETED.OFICINAeeINSERTED.OFICINA
INSERTED.OFICINAen enel
eldisparador
disparador
se
se refieren,
refieren,respectivamente,
respectivamente,aalos
losvalores
valoresde
dela
lacolumna
columnaOFICINA
OFICINAantes
antes
yydespués
despuésde dela
lasentencia
sentenciaUPDATE.
UPDATE.
181
Transacciones
Transacciones
 Una transacción es una secuencia de una o más
sentencias SQL que juntas forman una unidad de
trabajo.
 En las transacciones podemos usar las sentencias:
 BEGIN TRANSACTION Para empezar la transacción
 END TRANSACTION Para finalizar la transacción
 SAVE TRANSACTION Para realizar un punto de Salvaguardia
 COMMIT TRANSACTION ó WORK señala el final correcto de
una transacción. Informa al SGBD que la transacción está ahora
completa; todas las sentencias que forman la transacción han
sido ejecutadas y la B.D. es autoconsistente.
 ROLLBACK señala el final sin éxito de una transacción. Informa
al SGBD que el usuario no desea completar la transacción ; en
vez de ello el SGBD debe deshacer los cambios efectuados a la
B.D. durante la transacción, para que la B.D. quede en el
estado en que estaba antes de ejecutar la transacción
183
Ejemplo de Transacción
BEGIN
BEGINTRANSACTION
TRANSACTION
UPDATE
UPDATEPEDIDOS
PEDIDOS
SET
SETCANTIDAD
CANTIDAD==10,
10,IMPORTE
IMPORTE=3550.00
=3550.00
WHERE
WHERENUM_PEDIDO
NUM_PEDIDO==113051
113051
UPDATE
UPDATEREPVENTAS
REPVENTAS
SET
SETVENTAS
VENTAS==VENTAS
VENTAS--1458.00
1458.00++3550.00
3550.00
WHERE
WHERENUM_EMPL
NUM_EMPL==108 108
UPDATE
UPDATEOFICINAS
OFICINAS
SET
SETVENTAS
VENTAS==VENTAS
VENTAS--1458.00
1458.00++3550.00
3550.00
WHERE
WHEREOFICINA
OFICINA==2121
UPDATE
UPDATEPRODUCTOS
PRODUCTOS
SET
SETEXISTENCIAS
EXISTENCIAS==EXISTENCIAS
EXISTENCIAS++44-10-10
WHERE
WHEREID_FAB
ID_FAB=='QSA'
'QSA'
AND
ANDID_PRODUCTO
ID_PRODUCTO=='XK47'
'XK47'
COMMIT
COMMIT WORK
WORK

184
Ejemplo
USE
USENorthWind
NorthWind
DECLARE
DECLARE @Error
@Error int
--Declaramos una variable
int que utilizaremos para almacenar un posible código de error
--Declaramos una variable que utilizaremos para almacenar un posible código de error
BEGIN
BEGINTRAN TRAN
--Iniciamos
--Iniciamoslalatransacción
transacción
UPDATE Products
UPDATE ProductsSET SETUnitPrice=20
UnitPrice=20WHERE WHEREProductName
ProductName=’Chai’
=’Chai’
--Ejecutamos la primera sentencia
--Ejecutamos la primera sentencia
SET
SET@Error=@@ERROR
@Error=@@ERROR
--Si ocurre
--Si ocurreun unerror
erroralmacenamos
almacenamossu sucódigo
códigoen en@Error
@Erroryysaltamos
saltamosmediante
medianteelel
----GOTO
GOTOalaltrozotrozodedecódigo
códigoquequedeshara
desharalalatransacción.
transacción.
IF (@Error<>0) GOTO TratarError
IF (@Error<>0) GOTO TratarError
--Si
--Silalaprimera
primerasentencia
sentenciase seejecuta
ejecutacon conéxito,
éxito,pasamos
pasamosaalalasegunda
segunda
UPDATE Products SET UnitPrice=20 WHERE ProductName=’Chang’
UPDATE Products SET UnitPrice=20 WHERE ProductName=’Chang’
SET
SET@Error=@@ERROR
@Error=@@ERROR
--Y si
--Y sihay
hayun unerror
errorhacemos
hacemoscomo comoantesantes
IF (@Error<>0) GOTO TratarError
IF (@Error<>0) GOTO TratarError
--Si
--Sillegamos
llegamoshastahastaaquí
aquíesesque
quelos losdos
dosUPDATE
UPDATEse sehan
hancompletado
completadocon
con
--éxito y podemos “guardar” la transacción en la
--éxito y podemos “guardar” la transacción en la base de datosbase de datos
COMMIT
COMMITTRAN TRAN
TratarError:
TratarError:
--Si
--Sihahaocurrido
ocurridoalgún
algúnerror
errorllegamos
llegamoshasta hastaaquí
aquí
IfIf@@Error<>0
@@Error<>0 THEN THEN
BEGIN
BEGIN
PRINT
PRINT‘Ha ‘Haecorrido
ecorridoun unerror.
error.Abortamos
Abortamoslalatransacción’
transacción’
--Se lo comunicamos al usuario y deshacemos
--Se lo comunicamos al usuario y deshacemoslalatransacción transacción
--todo volverá a estar como si nada hubiera
--todo volverá a estar como si nada hubiera ocurrido ocurrido
ROLLBACK
ROLLBACKTRAN TRAN
END
END
185
Transacciones
Como se puede ver para cada sentencia que se ejecuta
miramos si se ha producido o no un error, y si detectamos
un error ejecutamos el bloque de código que deshace la
transacción.
Hay una interpretación incorrecta en cuanto al
funcionamiento de las transacciones que esta bastante
extendida. Mucha gente cree que si tenemos varias
sentencias dentro de una transacción y una de ellas falla,
la transacción se aborta en su totalidad.
¡Nada más lejos de la realidad!

186
Transacciones
 Si tenemos dos sentencias dentro de una transacción.
USE NorthWind
BEGIN TRAN
UPDATE Products SET UnitPrice=20 WHERE ProductName=’Chang’
UPDATE Products SET UnitPrice=20 WHERE ProductName=’Chang’
COMMIT TRAN

 Estas dos sentencias se ejecutarán como una sola.


 Si por ejemplo en medio de la transacción (después del primer UPDATE y antes del
segundo) hay un corte de electricidad, cuando el SQL Server se recupere se
encontrará en medio de una transacción y, o bien la termina o bien la deshace, pero
no se quedará a medias. El error está en pensar que si la ejecución de la primera
sentencia da un error se cancelará la transacción.
 El SQL Server sólo se preocupa de ejecutar las sentencias, no de averiguar si lo
hacen correctamente o si la lógica de la transacción es correcta.
 Eso es cosa nuestra. Por eso en el ejemplo que tenemos más arriba para cada
sentencia de nuestro conjunto averiguamos si se ha producido un error y si es así
actuamos en consecuencia cancelando toda la operación.

187
Procedimientos
Crear Procedimientos
CREATE
CREATEPROCEDURE
PROCEDURECli_Credito
Cli_Credito
@Credito_Inf
@Credito_Inf MONEY,
MONEY,
@Credito_Sup
@Credito_Sup MONEY
MONEY
AS
AS
SELECT
SELECT**
FROM
FROM Clientes
Clientes
WHERE
WHERELimite_Credito
Limite_Credito
BETWEEN
BETWEEN @Credito_Inf
@Credito_Inf AND
AND@Credito_Sup
@Credito_Sup
Para ejecutar el procedimiento usaremos:
EXECUTE Cli_Credito 20000 , 60000
donde Cli_Credito es el nombre del procedimiento, y 20000, 60000 los 2
parámetros que pasamos al procedimiento.

NOTA: Los procedimientos son guardados en SQL Server en la carpeta de la


la base de datos llamada Procedimientos Almacenados. 189
Funciones
Nombre de la Nombre del
función parámetro que
Función pasamos a la función

CREATE
CREATE FUNCTION
FUNCTION dbo.Cube(
dbo.Cube( @fNumber
@fNumber float)
float)
RETURNS
RETURNS float
float
AS
AS
BEGIN
BEGIN
RETURN (@fNumber**@fNumber
RETURN(@fNumber @fNumber **@fNumber)
@fNumber)
END
END

191
Función factorial
 CREATE
CREATEFUNCTION
FUNCTION dbo.Factorial(
dbo.Factorial( @iNumber
@iNumber int
int))
RETURNS
RETURNSINT
INT
AS
AS
BEGIN
BEGIN
DECLARE
DECLARE@i
@iint
int
IF
IF@iNumber
@iNumber <=
<= 11
SET
SET @i
@i== 11
ELSE
ELSE
SET
SET @i
@i== @iNumber
@iNumber ** dbo.Factorial(@iNumber
dbo.Factorial(@iNumber --11))
RETURN
RETURN(@i)
(@i)
END
END

192
Función con una tabla
CREATE
CREATE FUNCTION
FUNCTION
dbo.AuthorsForState(@cState
dbo.AuthorsForState(@cState char(2)
char(2) ))
RETURNS
RETURNS TABLE
TABLE
AS
AS
RETURN
RETURN (SELECT
(SELECT ** FROM
FROM Authors
Authors
WHERE
WHERE state
state == @cState)
@cState)

193
Seguridad SQL
Seguridad SQL
 La seguridad es especialmente importante en
un SGBD basado en SQL, ya que SQL permite
hacer especialmente sencillo el acceso a la
información contenida en las BBDD
 Los requerimientos de los sistemas en
producción son muchos y muy variados, pero
por resumir, algunos de ellos pueden ser en lo
referente a SQL:

195
Seguridad SQL
 Los datos de cualquier tabla deberían ser accesible
sólo a un conjunto de usuarios, no a todos
 Sólo algunos usuarios deben tener derecho de
actualización de datos en una tabla en particular
 Para algunas tablas, el acceso debería estar
restringido en base a las columnas
 Algunos usuarios deberían tener denegado el acceso
mediante SQL interactivo, pero permitirles utilizar
aplicaciones que utilicen tales tablas

196
Seguridad SQL
 Los usuarios son los actores de la BBDD
 Cada vez que el SGBD hace una operación sobre los
datos, lo hace en nombre de algún usuario
 El SGBD deberá actuar en consecuencia con los
permisos que tal usuario tenga según la operación
empleada y los datos afectados
 Cada SGBD tiene su propia implementación de
los procesos de seguridad.

197
Vistas y Seguridad SQL
 Las vistas juegan un papel esencial en la
seguridad:
 Definiendo una vista y proporcionando un
permiso de usuario para acceder a ella, pero
no a sus tablas fuente, se puede permitir el
acceso de un usuario únicamente a las
columnas y filas seleccionadas.

198
Privilegios
 El estándar SQL-1 especifica cuatro
privilegios para tablas y vistas:
 SELECT
 INSERT
 DELETE
 UPDATE

199
Concesión de Privilegios
 Cláusula GRANT
 Su sintaxis básica es:

GRANT <privilegios> ON
{nombre_tabla | nombre_vista} TO
{PUBLIC | usuario, …, usuario
[WITH GRANT OPTION]}

Siendo <privilegios>:
ALL [PRIVILEGES] |
{ SELECT |
DELETE |
INSERT |
UPDATE [(col [, col …])]]

200
Revocación de Privilegios
 Cláusula REVOKE
 Su sintaxis básica es:

REVOKE <privilegios> ON
{nombre_tabla | nombre_vista} FROM
{PUBLIC | usuario, …, usuario}

Siendo <privilegios>:
ALL [PRIVILEGES] |
{ SELECT |
DELETE |
INSERT |
UPDATE [(col [, col …])]]
201
Crea un inicio de sesión
de servidor denominado
Crear un usuario “Pepe” con una
contraseña

CREATE LOGIN Pepe


WITH PASSWORD =‘m1a2n3o4l5o';
USE BD_Facturas;
CREATE USER Pepe FOR LOGIN Pepe;
GO Crea el usuario de base
de datos “Pepe”
correspondiente a
BD_Factura

202
Crear usuario
CREATE USER nom_usuario1 contraseña,
nom_usuario2 contraseña, …

203
Cambiar el nombre de usuario
USE BD_FACTURA;
ALTER USER Pepe WITH NAME = Jose;
GO

Cambia el nombre del usuario de la base de datos BD_FACTURA “Pepe” a


“Jose”.

204
Borra un usuario
USE BD_FACTURA;
DROP USER Jose;
GO

205
Crear un grupo de usuarios

CREATE GROUP nom_grupo1 contraseña,


nom_grupo2 contraseña, …

206
Añadir usuarios a un grupo
ADD USER nom_usuario [,nom_usuario,..] TO nom_grupo

 Añade uno o más usuarios a un grupo


 Cuando se haya agregado el usuario a un grupo, el usuario
disfrutará de todos los permisos que se han otorgado a ese
grupo

207
Borra un grupo
DROP GROUP nom_grupo

 Eliminará el grupo o grupos especificados.


 Los usuarios que pertenezcan a esos
grupos no se verán afectados, pero
dejarán de ser miembros de los grupos
eliminados.

208
Borra un usuario
DROP USER nom_usuario1, nom_usuario2, …[FROM nom_grupo]

 Si utilizamos DROP USER sin la cláusula FROM,


borrará los usuarios que indiquemos.

 Si utilizamos DROP USER con la cláusula FROM,


quitará del grupo los usuarios que indiquemos, pero no
los borrará

209
Cambia contraseña del usuario
ALTER USER nom_usuario
PASSWORD contraseña_nueva contraseña_anterior

210
Cambia la contraseña de la base
de datos
ALTER DATABASE PASSWORD contraseña_nueva contraseña_anterior

211