SlideShare ist ein Scribd-Unternehmen logo
1 von 211
SISTEMAS
GESTORES DE
BASES DE DATOS
I.E.S. MARCOS ZARAGOZA
SQL
3
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
4
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
5
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
6
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
7
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.
8
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.
9
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.
10
Componentes de SQL
 El lenguaje SQL está compuesto por:
Comandos
Cláusulas
Operadores
Funciones de agregado
11
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.
12
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
13
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
14
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.
15
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
16
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
17
Tipos de datos estándar (I)
Tipo de Datos Tamañ
o
Descripción
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
(Autonumérico)
4 bytes Un número incrementado automáticamente
(de tipo Long)
CURRENCY
(Moneda)
8 bytes Un entero escalable entre
922.337.203.685.477,5808 y
922.337.203.685.477,5807.
18
Tipos de datos estándar (II)
Tipo de
Datos
Tamaño Descripción
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.
19
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 ó
INTEGER
4 bytes Un entero largo entre -2,147,483,648 y
2,147,483,647.
LONGTEXT 1 byte por
carácter
De cero a un máximo de 1.2 gigabytes.
(MEMO)
LONGBINAR
Y
Según se
necesite
De cero 1 gigabyte. Utilizado para
objetos OLE.
TEXT
CHAR
1 byte por
carácter
De cero a 255 caracteres
VARCHAR 1 byte por
carácter
Longitud variable
20
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
21
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
22
Sinónimos de tipos de datos (III)
Tipo de Dato Sinónimos
LONG INT
INTEGER
INTEGER4
LONGBINAR
Y
GENERAL
OLEOBJECT
LONGTEXT LONGCHAR
MEMO
NOTE
TEXT ALPHANUMERIC
CHAR
CHARACTER
STRING
VARCHAR
Creación de bases
de datos
24
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
25
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
26
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.
27
 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 ……
);
Creación de una tabla
28
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.
29
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.
30
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 }]
31
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
32
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));
33
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)
);
34
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 }]
35
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)
);
36
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)
);
37
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
);
38
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)
);
39
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 TABLE Empleados;DROP TABLE Empleados;
40
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
41
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 TABLE Empleados ADD COLUMN Salario CURRENCY;ALTER TABLE Empleados ADD COLUMN Salario CURRENCY;
42
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 TABLE Empleados DROP COLUMN Salario;ALTER TABLE Empleados DROP COLUMN Salario;
43
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 TABLE Empleados ALTER COLUMN Nom TO Nombre CHAR(25);ALTER TABLE Empleados ALTER COLUMN Nom TO Nombre CHAR(25);
ALTER TABLE Empleados ALTER COLUMN Nom CHAR(40);ALTER TABLE Empleados ALTER COLUMN Nom CHAR(40);
44
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)}
45
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 TABLE Empleados DROP CONSTRAINT FK_Emple;ALTER TABLE Empleados DROP CONSTRAINT FK_Emple;
46
Í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.
47
Í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
48
Í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 UNIQUE INDEX SK_calle_num
ON BloqueCasas (calle, numero) WITH DISALLOW NULL;
CREATE UNIQUE INDEX SK_calle_num
ON BloqueCasas (calle, numero) WITH DISALLOW NULL;
49
Índices
 Eliminación de índices:
Su sintaxis básica es la siguiente:
DROP INDEX nombre_indice;
DROP INDEX SK_calle_num;DROP INDEX SK_calle_num;
DROP INDEX SK_calle_num ON BloqueCasas ;DROP INDEX SK_calle_num ON BloqueCasas ;
50
Base de datos Catastro
51
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;
52
Creación BD “SQL_LANS”
53
Esquema de la BD en SQL Server
54
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
);
55
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
);
56
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
);
57
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);
58
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
FOREIGN KEY (DIRECTOR) REFERENCES RepVentas(NUM_EMPL) ON DELETE SET NULL;
59
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;
60
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;
61
Borrar tablas de la BD
 USE SQL_LANS;
 DROP TABLE CLIENTES;
 DROP TABLE OFICINAS;
 DROP TABLE PEDIDOS;
 DROP TABLE PRODUCTOS;
 DROP TABLE REPVENTAS;
Consultas simples
63
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
64
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
 Indica la lista de tablas que contienen los datos a
recuperar.
 Los datos pueden proceder de más de una tabla
65
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
66
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';
67
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;
68
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.
En la aplicación de la condición se pueden
producir los siguientes resultados:
69
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
70
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
71
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
72
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');
73
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.
74
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]
75
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%’;
76
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;
77
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’;
78
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
79
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
80
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;
81
Consultas con funciones de agregado
 Consult a que nos muest ra 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
agragado: SUM(), AVG(), MAX(), MI N(),
COUNT().
82
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
83
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
84
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;
Consultas Multitabla
Consultas con dos o
más tablas
86
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
87
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 PRIMARIA = CLAVE AJENACLAVE PRIMARIA = CLAVE AJENA
88
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.
89
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
90
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.
91
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
92
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.*
93
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];
94
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;
95
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
96
Consultas Multitabla
 Relación Maestro – Detalle REFLEXIVA:
R I O S
A f l u e n t e
d e
( 0 , 1 )( 0 , n )
R I O S ( 1 )
A f l u e n t e
d e
R I O S ( 2 )
( 0 , n ) ( 0 , 1 )
97
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;
98
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.
99
Producto cartesiano
SELECT Chicas.Nombre,
Chicos.Nombre
FROM Chicos, Chicas
ORDER BY 1;
 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:
100
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
101
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
102
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
103
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’;
104
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;
105
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
106
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
Consultas Resumen
108
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.
109
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
110
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
111
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
112
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
113
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
114
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
115
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.
116
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
117
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
118
Ejemplo Consulta Resumen
 SELECT Grupo, SUM(Cuota) AS Suma_Cuota
FROM Alumnos
WHERE [¿HA PAGADO?]=TRUE
GROUP BY Grupo
HAVING AVG(Cuota)>6500;
Resultado usando
la cláusula HAVING
Resultado usando
la cláusula HAVING
Resultado sin usar
la cláusula HAVING
Resultado sin usar
la cláusula HAVING
Solo tendrá en
cuenta para
agrupar y sumar
los registros que
cumplan la
condición.
El atributo debe estar en GROUP BY
119
Ejemplo Consulta Resumen con dos tablas
 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;
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).
Subconsultas
Consultas anidadas
121
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
122
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
123
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 =
Oficinas.Oficina);
124
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
125
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
126
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
127
Ejemplo:
 SELECT * FROM Productos
WHERE PrecioUnidad >
(SELECT AVG(PrecioUnidad)
FROM Detalles de pedidos
WHERE Descuento >= .25);
Importante: Si en una consulta utilizamos en la cláusula
WHERE cualquiera de los seis operadores (=,<,>,<=,>=,<>),
para comparar con una subconsulta, y no utilizamos ninguno
de los operadores ANY, ALL, IN, EXIST, solamente
comparará con un valor, que será el que obtengamos de la
subconsulta (nunca con varios).
Importante: Si en una consulta utilizamos en la cláusula
WHERE cualquiera de los seis operadores (=,<,>,<=,>=,<>),
para comparar con una subconsulta, y no utilizamos ninguno
de los operadores ANY, ALL, IN, EXIST, solamente
comparará con un valor, que será el que obtengamos de la
subconsulta (nunca con varios).
128
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
129
Ejemplo:
 SELECT * FROM Productos
WHERE IdProducto IN
(SELECT IdProducto
FROM Detalles de pedidos
WHERE Descuento >= .25);
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.
Además, puede utilizar NOT IN para recuperar solamente aquellos
registros de la consulta principal para los que ningún registro de la
subconsulta contenga un valor igual.
Además, puede utilizar NOT IN para recuperar solamente aquellos
registros de la consulta principal para los que ningún registro de la
subconsulta contenga un valor igual.
130
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 €
131
Ejemplo:
SELECT Descripcion
FROM Productos
WHERE EXISTS (SELECT *
FROM Pedidos
WHERE Producto = ID_producto
AND Fab = Id_Fab
AND Importe >= 25000);
Utilice el predicado EXISTS (con la palabra reservada opcional NOT) en
comparaciones verdadero/falso para determinar si la subconsulta devuelve
algún registro.
Utilice el predicado EXISTS (con la palabra reservada opcional NOT) en
comparaciones verdadero/falso para determinar si la subconsulta devuelve
algún registro.
132
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
133
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
134
Ejemplo de Tests ANY o SOME
 SELECT * FROM Productos
WHERE PrecioUnidad > ANY
(SELECT PrecioUnidad
FROM Detalles_pedido
WHERE Descuento >= .25);
Utilice los predicados ANY o SOME, que son sinónimos, para recuperar
registros de la consulta principal que satisfagan la comparación con otros
registros recuperados en la subconsulta. Es decir si alguna de las
comparaciones individuales produce un valor VERDADERO, el test ANY
devuelve el resultado VERDAD (TRUE). El test ANY se puede utilizar con los
operadores (=,<,>,<=,>=,<>).
Utilice los predicados ANY o SOME, que son sinónimos, para recuperar
registros de la consulta principal que satisfagan la comparación con otros
registros recuperados en la subconsulta. Es decir si alguna de las
comparaciones individuales produce un valor VERDADERO, el test ANY
devuelve el resultado VERDAD (TRUE). El test ANY se puede utilizar con los
operadores (=,<,>,<=,>=,<>).
El siguiente ejemplo devuelve todos los productos cuyo precio por unidad
es mayor que cualquier producto vendido con un descuento del 25 por
ciento o mayor:
El siguiente ejemplo devuelve todos los productos cuyo precio por unidad
es mayor que cualquier producto vendido con un descuento del 25 por
ciento o mayor:
135
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.
136
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
137
Ejemplo con EXISTS
SELECT *
FROM Productos
WHERE EXISTS
(SELECT PrecioUnidad
FROM Detalles_pedido
WHERE Descuento >= .25 AND
Productos.PrecioUnidad>Detalles_pedido.PrecioUnidad);
SELECT *
FROM Productos
WHERE EXISTS
(SELECT PrecioUnidad
FROM Detalles_pedido
WHERE Descuento >= .25 AND
Productos.PrecioUnidad>Detalles_pedido.PrecioUnidad);
138
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
139
Ejemplo de Tests ALL
 SELECT * FROM Productos
WHERE PrecioUnidad > ALL
(SELECT PrecioUnidad
FROM Detalles_pedido
WHERE Descuento >= .25);
 SELECT * FROM Productos
WHERE PrecioUnidad > ALL
(SELECT PrecioUnidad
FROM Detalles_pedido
WHERE Descuento >= .25);
 Utilice el predicado ALL para recuperar sólo los registros de la consulta
principal que satisfagan la comparación con todos los registros
recuperados en la subconsulta.
 Si cambia ANY a ALL en el ejemplo anterior, la consulta devolvería sólo
aquellos productos cuyo precio por unidad fuese mayor que el de todos
los productos vendidos con un descuento del 25 por ciento o mayor.
Esto es mucho más restrictivo.
 Utilice el predicado ALL para recuperar sólo los registros de la consulta
principal que satisfagan la comparación con todos los registros
recuperados en la subconsulta.
 Si cambia ANY a ALL en el ejemplo anterior, la consulta devolvería sólo
aquellos productos cuyo precio por unidad fuese mayor que el de todos
los productos vendidos con un descuento del 25 por ciento o mayor.
Esto es mucho más restrictivo.
140
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.
141
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
SELECT Empresa
FROM Clientes
WHERE Rep_Clie IN
(SELECT Num_Empl
FROM RepVentas
WHERE Oficina_Rep IN
(SELECT Oficina
FROM Oficinas
WHERE Region = 'Este'));
SELECT Empresa
FROM Clientes
WHERE Rep_Clie IN
(SELECT Num_Empl
FROM RepVentas
WHERE Oficina_Rep IN
(SELECT Oficina
FROM Oficinas
WHERE Region = 'Este'));
Lista los clientes (Empresa) cuyos vendedores están asignados a oficinas
de la región de ventas Este.
Lista los clientes (Empresa) cuyos vendedores están asignados a oficinas
de la región de ventas Este.
142
 Finalmente la consulta más externa:
SELECT Empresa
FROM Clientes WHERE Rep_Clie IN (Subconsulta)
Mostrará los clientes (Empresa) cuyos vendedores tienen
uno de los números de empleados seleccionados.
 Finalmente la consulta más externa:
SELECT Empresa
FROM Clientes WHERE Rep_Clie IN (Subconsulta)
Mostrará los clientes (Empresa) cuyos vendedores tienen
uno de los números de empleados seleccionados.
Pasos para realizar la consulta anterior:
En este ejemplo la subconsulta más interna:
SELECT Oficina FROM Oficinas WHERE Región = ‘Este’;
Nos devuelve una una columna que contiene los números de oficina
de las oficinas de la región Este.
En este ejemplo la subconsulta más interna:
SELECT Oficina FROM Oficinas WHERE Región = ‘Este’;
Nos devuelve una una columna que contiene los números de oficina
de las oficinas de la región Este.
La subconsulta siguiente:
SELECT Num_Empl FROM RepVentas
WHERE Oficina_rep IN (subconsulta)
No devuelve una columna que contiene los números de empleados de
los vendedores que trabajan en una de las oficinas seleccionadas.
La subconsulta siguiente:
SELECT Num_Empl FROM RepVentas
WHERE Oficina_rep IN (subconsulta)
No devuelve una columna que contiene los números de empleados de
los vendedores que trabajan en una de las oficinas seleccionadas.
143
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
144
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.
Actualizaciones de
bases de datos
INSERT, DELETE, UPDATE
146
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
147
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
148
Sentencia INSERT de una fila
 Su sintaxis es la siguiente:
INSERT INTO
Tabla (campo1, .., campoN)
VALUES (valor1, ..., valorN)
INSERT INTO RepVentas
( Num_Empl, Nombre, Edad, Oficina_Rep, Titulo, Contrato, Director, Cuota, Ventas )
VALUES (112,’Henry Ford’, 46, 13, ‘Dir Ventas’, ‘25/08/90’, NULL, NULL, 0.0);
INSERT INTO RepVentas
( Num_Empl, Nombre, Edad, Oficina_Rep, Titulo, Contrato, Director, Cuota, Ventas )
VALUES (112,’Henry Ford’, 46, 13, ‘Dir Ventas’, ‘25/08/90’, NULL, NULL, 0.0);
149
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
150
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 INTO RepVentas
VALUES (112,’Henry Ford’, 46, 13, ‘Dir Ventas’, ‘25/08/90’, NULL, NULL, 0.0);
INSERT INTO RepVentas
VALUES (112,’Henry Ford’, 46, 13, ‘Dir Ventas’, ‘25/08/90’, NULL, NULL, 0.0);
151
Crear una tabla y añadir registros
SELECT Num_Pedido, Fecha_Pedido, Importe
INTO AntPedidos
FROM Pedidos
WHERE Fecha_Pedido >= ‘01/01/90’;
SELECT Num_Pedido, Fecha_Pedido, Importe
INTO AntPedidos
FROM Pedidos
WHERE Fecha_Pedido >= ‘01/01/90’;
Crear la tabla AntPedidos con los campos Num_pedido,
Fecha_Pedido, e Importe, para aquellos pedidos cuya fecha de
pedido sea igual o superior al primer día del año 1990.
Crear la tabla AntPedidos con los campos Num_pedido,
Fecha_Pedido, e Importe, para aquellos pedidos cuya fecha de
pedido sea igual o superior al primer día del año 1990.
152
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
153
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
154
Ejemplo:
INSERT INTO AntPedidos
( Num_Pedido, Fecha_Pedido, Importe )
SELECT Num_Pedido, Fecha_Pedido,
Importe
FROM Pedidos
WHERE Fecha_Pedido < ‘01/01/90’;
INSERT INTO AntPedidos
( Num_Pedido, Fecha_Pedido, Importe )
SELECT Num_Pedido, Fecha_Pedido,
Importe
FROM Pedidos
WHERE Fecha_Pedido < ‘01/01/90’;
Añadir a la tabla AntPedidos, aquellos de la tabla pedidos cuya fecha de
pedido sea menor al 01-01-90
Añadir a la tabla AntPedidos, aquellos de la tabla pedidos cuya fecha de
pedido sea menor al 01-01-90
155
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
156
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
157
Ejemplo de borrado con subconsulta:
DELETE FROM Pedidos
WHERE Rep = (SELECT Num_Empl
FROM RepVentas
WHERE Nombre='Sue Smith');
DELETE FROM Pedidos
WHERE Rep = (SELECT Num_Empl
FROM RepVentas
WHERE Nombre='Sue Smith');
Suprime los pedidos aceptados por Sue Smith.Suprime los pedidos aceptados por Sue Smith.
158
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
159
Ejemplo de UPDATE
UPDATE RepVentas
SET Oficina_Rep = 11, Cuota = 0.9 *Cuota
WHERE Oficina_Rep = 12;
UPDATE RepVentas
SET Oficina_Rep = 11, Cuota = 0.9 *Cuota
WHERE Oficina_Rep = 12;
Cambia a todos los vendedores de la oficina de Chicago (número 12) a la
oficina de New York (número 11) y rebaja sus cuotas un 10%.
Cambia a todos los vendedores de la oficina de Chicago (número 12) a la
oficina de New York (número 11) y rebaja sus cuotas un 10%.
160
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
Vistas
Tablas virtuales
162
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
163
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
164
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
165
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
166
Ejemplo:
 CREATE VIEW OficinasEste
(Cod_Oficina, Ciudad, Region)
AS
SELECT OFICINA, CIUDAD, REGION
FROM Oficinas
WHERE Region = 'Este';
 CREATE VIEW OficinasEste
(Cod_Oficina, Ciudad, Region)
AS
SELECT OFICINA, CIUDAD, REGION
FROM Oficinas
WHERE Region = 'Este';
Define una vista que contenga únicamente las oficinas de la región “Este”,
cuyo nombre sea OficinasEste.
Define una vista que contenga únicamente las oficinas de la región “Este”,
cuyo nombre sea OficinasEste.
167
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.
168
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
169
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
170
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.
171
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
172
Vistas
 Eliminación de una vista:
 La sintaxis básica de la eliminación de una
vista es la siguiente:
DROP VIEW NombreVistaDROP VIEW NombreVista
Triggers
Disparadores
174
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
175
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
176
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.
177
Triggers - SQL SERVER
CREATE TRIGGER NuevoPedido
ON Pedidos
FOR INSERT
AS
BEGIN
UPDATE RepVentas
SET Ventas = Ventas + INSERTED.Importe
WHERE RepVentas.Num_Empl = INSERTED.Rep;
UPDATE Productos
SET Existencias = Existencias - INSERTED.Cant
WHERE Productos.Id_Fab = INSERTED.Fab
AND Productos.Id_Producto = INSERTED.Producto;
END;
CREATE TRIGGER NuevoPedido
ON Pedidos
FOR INSERT
AS
BEGIN
UPDATE RepVentas
SET Ventas = Ventas + INSERTED.Importe
WHERE RepVentas.Num_Empl = INSERTED.Rep;
UPDATE Productos
SET Existencias = Existencias - INSERTED.Cant
WHERE Productos.Id_Fab = INSERTED.Fab
AND Productos.Id_Producto = INSERTED.Producto;
END;
Nombre del
disparador
Tabla sobre la que actua
Se activará cuando insertamos un
registro en la tabla Pedidos.
Importe insertado en
Pedidos
Cantidad insertada en
Pedidos
178
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.
179
Triggers – Ejemplo integridad referencial
 Este disparador fuerza la integridad referencial de la relación
OFICINAS/REPVENTAS, y también muestra un mensaje
cuando una actualización falla.
CREATE TRIGGER Actualiza_rep
ON RepVentas
FOR INSERT, UPDATE
AS
IF ((SELECT COUNT(*)
FROM OFICINAS, INSERTED
WHERE OFICINAS.OFICINA=INSERTED.OFICINA_REP)=0)
BEGIN
PRINT 'Especificado un numero de oficina invalido'
ROLLBACK TRANSACTION
END
 Este disparador fuerza la integridad referencial de la relación
OFICINAS/REPVENTAS, y también muestra un mensaje
cuando una actualización falla.
CREATE TRIGGER Actualiza_rep
ON RepVentas
FOR INSERT, UPDATE
AS
IF ((SELECT COUNT(*)
FROM OFICINAS, INSERTED
WHERE OFICINAS.OFICINA=INSERTED.OFICINA_REP)=0)
BEGIN
PRINT 'Especificado un numero de oficina invalido'
ROLLBACK TRANSACTION
END
Cuando hay una inserción o
un actualización en la tabla
Repventas comprueba que el
nº de oficina insertado sea
válido
180
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:
181
Ejemplo borrado en cascada
CREATE TRIGGER Cambia_Oficina_Rep
ON Oficinas
FOR UPDATE
AS
IF UPDATE (OFICINA)
BEGIN
UPDATE REPVENTAS
SET REPVENTAS.OFICINA_REP=INSERTED.OFICINA
FROM REPVENTAS, INSERTED, DELETED
WHERE REPVENTAS.OFICINA_REP=DELETED.OFICINA
END
CREATE TRIGGER Cambia_Oficina_Rep
ON Oficinas
FOR UPDATE
AS
IF UPDATE (OFICINA)
BEGIN
UPDATE REPVENTAS
SET REPVENTAS.OFICINA_REP=INSERTED.OFICINA
FROM REPVENTAS, INSERTED, DELETED
WHERE REPVENTAS.OFICINA_REP=DELETED.OFICINA
END
Las referencias DELETED.OFICINA e INSERTED.OFICINA en el disparador
se refieren, respectivamente, a los valores de la columna OFICINA antes
y después de la sentencia UPDATE.
Las referencias DELETED.OFICINA e INSERTED.OFICINA en el disparador
se refieren, respectivamente, a los valores de la columna OFICINA antes
y después de la sentencia UPDATE.
Transacciones
183
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
184
Ejemplo de Transacción
BEGIN TRANSACTION
UPDATE PEDIDOS
SET CANTIDAD = 10, IMPORTE =3550.00
WHERE NUM_PEDIDO = 113051
UPDATE REPVENTAS
SET VENTAS = VENTAS - 1458.00 + 3550.00
WHERE NUM_EMPL = 108
UPDATE OFICINAS
SET VENTAS = VENTAS - 1458.00 + 3550.00
WHERE OFICINA = 21
UPDATE PRODUCTOS
SET EXISTENCIAS = EXISTENCIAS + 4 -10
WHERE ID_FAB = 'QSA'
AND ID_PRODUCTO = 'XK47'
COMMIT WORK
BEGIN TRANSACTION
UPDATE PEDIDOS
SET CANTIDAD = 10, IMPORTE =3550.00
WHERE NUM_PEDIDO = 113051
UPDATE REPVENTAS
SET VENTAS = VENTAS - 1458.00 + 3550.00
WHERE NUM_EMPL = 108
UPDATE OFICINAS
SET VENTAS = VENTAS - 1458.00 + 3550.00
WHERE OFICINA = 21
UPDATE PRODUCTOS
SET EXISTENCIAS = EXISTENCIAS + 4 -10
WHERE ID_FAB = 'QSA'
AND ID_PRODUCTO = 'XK47'
COMMIT WORK
185
Ejemplo
USE NorthWind
DECLARE @Error int
--Declaramos una variable que utilizaremos para almacenar un posible código de error
BEGIN TRAN
--Iniciamos la transacción
UPDATE Products SET UnitPrice=20 WHERE ProductName =’Chai’
--Ejecutamos la primera sentencia
SET @Error=@@ERROR
--Si ocurre un error almacenamos su código en @Error y saltamos mediante el
-- GOTO al trozo de código que deshara la transacción.
IF (@Error<>0) GOTO TratarError
--Si la primera sentencia se ejecuta con éxito, pasamos a la segunda
UPDATE Products SET UnitPrice=20 WHERE ProductName=’Chang’
SET @Error=@@ERROR
--Y si hay un error hacemos como antes
IF (@Error<>0) GOTO TratarError
--Si llegamos hasta aquí es que los dos UPDATE se han completado con
--éxito y podemos “guardar” la transacción en la base de datos
COMMIT TRAN
TratarError:
--Si ha ocurrido algún error llegamos hasta aquí
If @@Error<>0 THEN
BEGIN
PRINT ‘Ha ecorrido un error. Abortamos la transacción’
--Se lo comunicamos al usuario y deshacemos la transacción
--todo volverá a estar como si nada hubiera ocurrido
ROLLBACK TRAN
END
USE NorthWind
DECLARE @Error int
--Declaramos una variable que utilizaremos para almacenar un posible código de error
BEGIN TRAN
--Iniciamos la transacción
UPDATE Products SET UnitPrice=20 WHERE ProductName =’Chai’
--Ejecutamos la primera sentencia
SET @Error=@@ERROR
--Si ocurre un error almacenamos su código en @Error y saltamos mediante el
-- GOTO al trozo de código que deshara la transacción.
IF (@Error<>0) GOTO TratarError
--Si la primera sentencia se ejecuta con éxito, pasamos a la segunda
UPDATE Products SET UnitPrice=20 WHERE ProductName=’Chang’
SET @Error=@@ERROR
--Y si hay un error hacemos como antes
IF (@Error<>0) GOTO TratarError
--Si llegamos hasta aquí es que los dos UPDATE se han completado con
--éxito y podemos “guardar” la transacción en la base de datos
COMMIT TRAN
TratarError:
--Si ha ocurrido algún error llegamos hasta aquí
If @@Error<>0 THEN
BEGIN
PRINT ‘Ha ecorrido un error. Abortamos la transacción’
--Se lo comunicamos al usuario y deshacemos la transacción
--todo volverá a estar como si nada hubiera ocurrido
ROLLBACK TRAN
END
186
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!
187
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.
Procedimientos
189
Crear Procedimientos
CREATE PROCEDURE Cli_Credito
@Credito_Inf MONEY,
@Credito_Sup MONEY
AS
SELECT *
FROM Clientes
WHERE Limite_Credito
BETWEEN @Credito_Inf AND @Credito_Sup
CREATE PROCEDURE Cli_Credito
@Credito_Inf MONEY,
@Credito_Sup MONEY
AS
SELECT *
FROM Clientes
WHERE Limite_Credito
BETWEEN @Credito_Inf AND @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.
Funciones
191
Función
CREATE FUNCTION dbo.Cube( @fNumber float)
RETURNS float
AS
BEGIN
RETURN(@fNumber * @fNumber * @fNumber)
END
CREATE FUNCTION dbo.Cube( @fNumber float)
RETURNS float
AS
BEGIN
RETURN(@fNumber * @fNumber * @fNumber)
END
Nombre de la
función
Nombre del
parámetro que
pasamos a la función
192
Función factorial
 CREATE FUNCTION dbo.Factorial( @iNumber int )
RETURNS INT
AS
BEGIN
DECLARE @i int
IF @iNumber <= 1
SET @i = 1
ELSE
SET @i = @iNumber * dbo.Factorial(@iNumber - 1 )
RETURN (@i)
END
 CREATE FUNCTION dbo.Factorial( @iNumber int )
RETURNS INT
AS
BEGIN
DECLARE @i int
IF @iNumber <= 1
SET @i = 1
ELSE
SET @i = @iNumber * dbo.Factorial(@iNumber - 1 )
RETURN (@i)
END
193
Función con una tabla
CREATE FUNCTION
dbo.AuthorsForState(@cState char(2) )
RETURNS TABLE
AS
RETURN (SELECT * FROM Authors
WHERE state = @cState)
CREATE FUNCTION
dbo.AuthorsForState(@cState char(2) )
RETURNS TABLE
AS
RETURN (SELECT * FROM Authors
WHERE state = @cState)
Seguridad SQL
195
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:
196
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
197
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.
198
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.
199
Privilegios
 El estándar SQL-1 especifica cuatro
privilegios para tablas y vistas:
SELECT
INSERT
DELETE
UPDATE
200
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 …])]]
201
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 …])]]
202
Crear un usuario
CREATE LOGIN Pepe
WITH PASSWORD =‘m1a2n3o4l5o';
USE BD_Facturas;
CREATE USER Pepe FOR LOGIN Pepe;
GO
Crea un inicio de sesión
de servidor denominado
“Pepe” con una
contraseña
Crea el usuario de base
de datos “Pepe”
correspondiente a
BD_Factura
203
Crear usuario
CREATE USER nom_usuario1 contraseña,
nom_usuario2 contraseña, …
204
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”.
205
Borra un usuario
USE BD_FACTURA;
DROP USER Jose;
GO
206
Crear un grupo de usuarios
CREATE GROUP nom_grupo1 contraseña,
nom_grupo2 contraseña, …
207
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
208
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.
209
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á
210
Cambia contraseña del usuario
ALTER USER nom_usuario
PASSWORD contraseña_nueva contraseña_anterior
211
Cambia la contraseña de la base
de datos
ALTER DATABASE PASSWORD contraseña_nueva contraseña_anterior

Weitere ähnliche Inhalte

Was ist angesagt?

Crear base de datos mysql command
Crear base de datos mysql commandCrear base de datos mysql command
Crear base de datos mysql commandLouis Jhosimar
 
Conexión desde una aplicación en java a un bd en mysql
Conexión desde una aplicación en java a un bd en mysqlConexión desde una aplicación en java a un bd en mysql
Conexión desde una aplicación en java a un bd en mysqlROQUE Caldas Dominguez
 
Llave primaria y llave foránea
Llave primaria y llave foráneaLlave primaria y llave foránea
Llave primaria y llave foráneaTata Jaramillo
 
Diapositivas base de datos
Diapositivas base de datosDiapositivas base de datos
Diapositivas base de datoscatherine4ad
 
Comandos utilizados en sql
Comandos utilizados en sqlComandos utilizados en sql
Comandos utilizados en sqlByron Eras
 
Relaciones entre tablas de access.
Relaciones entre tablas de access.Relaciones entre tablas de access.
Relaciones entre tablas de access.luzmilenasilvapaez
 
Sql DDL Lenguaje de definición de datos
Sql DDL Lenguaje de definición de datosSql DDL Lenguaje de definición de datos
Sql DDL Lenguaje de definición de datosjosecuartas
 
Normalizacion de bases de datos
Normalizacion de bases de datosNormalizacion de bases de datos
Normalizacion de bases de datosCaro_Noirgean
 
Bitácora de base de datos
Bitácora de base de datosBitácora de base de datos
Bitácora de base de datosLalo Osorio
 
Comandos básicos para bases de datos mysql y workbench
Comandos básicos para bases de datos mysql y workbenchComandos básicos para bases de datos mysql y workbench
Comandos básicos para bases de datos mysql y workbenchRobedgar MX
 
Modelo entidad relación de base de datos
Modelo entidad relación de base de datosModelo entidad relación de base de datos
Modelo entidad relación de base de datosani_tuza
 
conceptos de Punteros y Nodos
conceptos de Punteros y Nodosconceptos de Punteros y Nodos
conceptos de Punteros y NodosBoris Salleg
 

Was ist angesagt? (20)

Crear base de datos mysql command
Crear base de datos mysql commandCrear base de datos mysql command
Crear base de datos mysql command
 
Conexión desde una aplicación en java a un bd en mysql
Conexión desde una aplicación en java a un bd en mysqlConexión desde una aplicación en java a un bd en mysql
Conexión desde una aplicación en java a un bd en mysql
 
Llave primaria y llave foránea
Llave primaria y llave foráneaLlave primaria y llave foránea
Llave primaria y llave foránea
 
Presentacion de Microsoft SQL Server.
Presentacion de Microsoft SQL Server. Presentacion de Microsoft SQL Server.
Presentacion de Microsoft SQL Server.
 
Diapositivas base de datos
Diapositivas base de datosDiapositivas base de datos
Diapositivas base de datos
 
Modelo Entidad Relacion
Modelo Entidad RelacionModelo Entidad Relacion
Modelo Entidad Relacion
 
Comandos utilizados en sql
Comandos utilizados en sqlComandos utilizados en sql
Comandos utilizados en sql
 
Windows forms c# visual basic .net ejercicios
Windows forms c# visual basic .net ejerciciosWindows forms c# visual basic .net ejercicios
Windows forms c# visual basic .net ejercicios
 
Relaciones entre tablas de access.
Relaciones entre tablas de access.Relaciones entre tablas de access.
Relaciones entre tablas de access.
 
Sql DDL Lenguaje de definición de datos
Sql DDL Lenguaje de definición de datosSql DDL Lenguaje de definición de datos
Sql DDL Lenguaje de definición de datos
 
Base de datos relacionales
Base de datos relacionalesBase de datos relacionales
Base de datos relacionales
 
Procedimientos almacenados en MySQL
Procedimientos almacenados en MySQLProcedimientos almacenados en MySQL
Procedimientos almacenados en MySQL
 
Herramientas CASE
Herramientas CASEHerramientas CASE
Herramientas CASE
 
Normalizacion de bases de datos
Normalizacion de bases de datosNormalizacion de bases de datos
Normalizacion de bases de datos
 
Clases y objetos en Java
Clases y objetos en JavaClases y objetos en Java
Clases y objetos en Java
 
Pilas, colas, y listas estructura de datos
Pilas, colas, y listas estructura de datosPilas, colas, y listas estructura de datos
Pilas, colas, y listas estructura de datos
 
Bitácora de base de datos
Bitácora de base de datosBitácora de base de datos
Bitácora de base de datos
 
Comandos básicos para bases de datos mysql y workbench
Comandos básicos para bases de datos mysql y workbenchComandos básicos para bases de datos mysql y workbench
Comandos básicos para bases de datos mysql y workbench
 
Modelo entidad relación de base de datos
Modelo entidad relación de base de datosModelo entidad relación de base de datos
Modelo entidad relación de base de datos
 
conceptos de Punteros y Nodos
conceptos de Punteros y Nodosconceptos de Punteros y Nodos
conceptos de Punteros y Nodos
 

Ähnlich wie Sql presentacion

Lenguaje estructurado sql
Lenguaje estructurado sqlLenguaje estructurado sql
Lenguaje estructurado sqlDiego Sánchez
 
Unidad 2-lenguaje-sql
Unidad 2-lenguaje-sqlUnidad 2-lenguaje-sql
Unidad 2-lenguaje-sqlclaudia_m
 
TEMA3-SQL-(PARTE 1).pdf
TEMA3-SQL-(PARTE 1).pdfTEMA3-SQL-(PARTE 1).pdf
TEMA3-SQL-(PARTE 1).pdfalukardconde1
 
Sql server 2005 (bda)henrry
Sql server 2005 (bda)henrrySql server 2005 (bda)henrry
Sql server 2005 (bda)henrryHENRRYDAVIDS1
 
4. sql (autoguardado)
4. sql (autoguardado)4. sql (autoguardado)
4. sql (autoguardado)felpe33
 
ManualPracticoSQL.pdf
ManualPracticoSQL.pdfManualPracticoSQL.pdf
ManualPracticoSQL.pdfJenny29068
 
Precentacion de sql visual
Precentacion de sql visualPrecentacion de sql visual
Precentacion de sql visualBryanChacon12
 
04-SQLBuenaPresentaciónyConceptos.pdf
04-SQLBuenaPresentaciónyConceptos.pdf04-SQLBuenaPresentaciónyConceptos.pdf
04-SQLBuenaPresentaciónyConceptos.pdfssuser78e8eb
 
SQL (Structured Query Language): Informe de Lectura Unidad 3
SQL (Structured Query Language): Informe de Lectura Unidad 3SQL (Structured Query Language): Informe de Lectura Unidad 3
SQL (Structured Query Language): Informe de Lectura Unidad 3JuanMiguelCustodioMo
 
ANALISIS DE SISTEMAS ROCKI.pdf
ANALISIS DE SISTEMAS ROCKI.pdfANALISIS DE SISTEMAS ROCKI.pdf
ANALISIS DE SISTEMAS ROCKI.pdfyannaRodrguez
 
Manual practico para sql ingieneria de sistemas
Manual practico para sql ingieneria de sistemas  Manual practico para sql ingieneria de sistemas
Manual practico para sql ingieneria de sistemas Crhis
 

Ähnlich wie Sql presentacion (20)

Lenguaje estructurado sql
Lenguaje estructurado sqlLenguaje estructurado sql
Lenguaje estructurado sql
 
Unidad 2-lenguaje-sql
Unidad 2-lenguaje-sqlUnidad 2-lenguaje-sql
Unidad 2-lenguaje-sql
 
TEMA3-SQL-(PARTE 1).pdf
TEMA3-SQL-(PARTE 1).pdfTEMA3-SQL-(PARTE 1).pdf
TEMA3-SQL-(PARTE 1).pdf
 
BD cap 5 SQL.pdf
BD cap 5  SQL.pdfBD cap 5  SQL.pdf
BD cap 5 SQL.pdf
 
Sql server 2005 (bda)henrry
Sql server 2005 (bda)henrrySql server 2005 (bda)henrry
Sql server 2005 (bda)henrry
 
4. sql (autoguardado)
4. sql (autoguardado)4. sql (autoguardado)
4. sql (autoguardado)
 
Fundamentos de BD - Unidad 6 lenguaje sql
Fundamentos de BD - Unidad 6 lenguaje sqlFundamentos de BD - Unidad 6 lenguaje sql
Fundamentos de BD - Unidad 6 lenguaje sql
 
ManualPracticoSQL.pdf
ManualPracticoSQL.pdfManualPracticoSQL.pdf
ManualPracticoSQL.pdf
 
Precentacion de sql visual
Precentacion de sql visualPrecentacion de sql visual
Precentacion de sql visual
 
04-SQL.pdf
04-SQL.pdf04-SQL.pdf
04-SQL.pdf
 
04-SQLBuenaPresentaciónyConceptos.pdf
04-SQLBuenaPresentaciónyConceptos.pdf04-SQLBuenaPresentaciónyConceptos.pdf
04-SQLBuenaPresentaciónyConceptos.pdf
 
SQL (Structured Query Language): Informe de Lectura Unidad 3
SQL (Structured Query Language): Informe de Lectura Unidad 3SQL (Structured Query Language): Informe de Lectura Unidad 3
SQL (Structured Query Language): Informe de Lectura Unidad 3
 
Sql
SqlSql
Sql
 
Sql
SqlSql
Sql
 
Lenguaje sql
Lenguaje sqlLenguaje sql
Lenguaje sql
 
Luis cepeda
Luis cepedaLuis cepeda
Luis cepeda
 
ANALISIS DE SISTEMAS ROCKI.pdf
ANALISIS DE SISTEMAS ROCKI.pdfANALISIS DE SISTEMAS ROCKI.pdf
ANALISIS DE SISTEMAS ROCKI.pdf
 
Manual practico para sql ingieneria de sistemas
Manual practico para sql ingieneria de sistemas  Manual practico para sql ingieneria de sistemas
Manual practico para sql ingieneria de sistemas
 
Manual practico SQL
Manual practico SQLManual practico SQL
Manual practico SQL
 
Manual practicosql
Manual practicosqlManual practicosql
Manual practicosql
 

Sql presentacion

  • 1. SISTEMAS GESTORES DE BASES DE DATOS I.E.S. MARCOS ZARAGOZA
  • 2. SQL
  • 3. 3 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
  • 4. 4 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
  • 5. 5 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
  • 6. 6 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
  • 7. 7 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.
  • 8. 8 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.
  • 9. 9 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.
  • 10. 10 Componentes de SQL  El lenguaje SQL está compuesto por: Comandos Cláusulas Operadores Funciones de agregado
  • 11. 11 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.
  • 12. 12 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
  • 13. 13 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
  • 14. 14 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.
  • 15. 15 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
  • 16. 16 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
  • 17. 17 Tipos de datos estándar (I) Tipo de Datos Tamañ o Descripción 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 (Autonumérico) 4 bytes Un número incrementado automáticamente (de tipo Long) CURRENCY (Moneda) 8 bytes Un entero escalable entre 922.337.203.685.477,5808 y 922.337.203.685.477,5807.
  • 18. 18 Tipos de datos estándar (II) Tipo de Datos Tamaño Descripción 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.
  • 19. 19 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 ó INTEGER 4 bytes Un entero largo entre -2,147,483,648 y 2,147,483,647. LONGTEXT 1 byte por carácter De cero a un máximo de 1.2 gigabytes. (MEMO) LONGBINAR Y Según se necesite De cero 1 gigabyte. Utilizado para objetos OLE. TEXT CHAR 1 byte por carácter De cero a 255 caracteres VARCHAR 1 byte por carácter Longitud variable
  • 20. 20 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
  • 21. 21 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
  • 22. 22 Sinónimos de tipos de datos (III) Tipo de Dato Sinónimos LONG INT INTEGER INTEGER4 LONGBINAR Y GENERAL OLEOBJECT LONGTEXT LONGCHAR MEMO NOTE TEXT ALPHANUMERIC CHAR CHARACTER STRING VARCHAR
  • 24. 24 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
  • 25. 25 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
  • 26. 26 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.
  • 27. 27  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 …… ); Creación de una tabla
  • 28. 28 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.
  • 29. 29 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.
  • 30. 30 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 }]
  • 31. 31 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
  • 32. 32 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));
  • 33. 33 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) );
  • 34. 34 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 }]
  • 35. 35 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) );
  • 36. 36 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) );
  • 37. 37 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 );
  • 38. 38 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) );
  • 39. 39 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 TABLE Empleados;DROP TABLE Empleados;
  • 40. 40 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
  • 41. 41 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 TABLE Empleados ADD COLUMN Salario CURRENCY;ALTER TABLE Empleados ADD COLUMN Salario CURRENCY;
  • 42. 42 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 TABLE Empleados DROP COLUMN Salario;ALTER TABLE Empleados DROP COLUMN Salario;
  • 43. 43 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 TABLE Empleados ALTER COLUMN Nom TO Nombre CHAR(25);ALTER TABLE Empleados ALTER COLUMN Nom TO Nombre CHAR(25); ALTER TABLE Empleados ALTER COLUMN Nom CHAR(40);ALTER TABLE Empleados ALTER COLUMN Nom CHAR(40);
  • 44. 44 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)}
  • 45. 45 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 TABLE Empleados DROP CONSTRAINT FK_Emple;ALTER TABLE Empleados DROP CONSTRAINT FK_Emple;
  • 46. 46 Í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.
  • 47. 47 Í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
  • 48. 48 Í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 UNIQUE INDEX SK_calle_num ON BloqueCasas (calle, numero) WITH DISALLOW NULL; CREATE UNIQUE INDEX SK_calle_num ON BloqueCasas (calle, numero) WITH DISALLOW NULL;
  • 49. 49 Índices  Eliminación de índices: Su sintaxis básica es la siguiente: DROP INDEX nombre_indice; DROP INDEX SK_calle_num;DROP INDEX SK_calle_num; DROP INDEX SK_calle_num ON BloqueCasas ;DROP INDEX SK_calle_num ON BloqueCasas ;
  • 50. 50 Base de datos Catastro
  • 51. 51 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;
  • 53. 53 Esquema de la BD en SQL Server
  • 54. 54 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 );
  • 55. 55 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 );
  • 56. 56 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 );
  • 57. 57 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);
  • 58. 58 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 FOREIGN KEY (DIRECTOR) REFERENCES RepVentas(NUM_EMPL) ON DELETE SET NULL;
  • 59. 59 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;
  • 60. 60 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;
  • 61. 61 Borrar tablas de la BD  USE SQL_LANS;  DROP TABLE CLIENTES;  DROP TABLE OFICINAS;  DROP TABLE PEDIDOS;  DROP TABLE PRODUCTOS;  DROP TABLE REPVENTAS;
  • 63. 63 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
  • 64. 64 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  Indica la lista de tablas que contienen los datos a recuperar.  Los datos pueden proceder de más de una tabla
  • 65. 65 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
  • 66. 66 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';
  • 67. 67 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;
  • 68. 68 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. En la aplicación de la condición se pueden producir los siguientes resultados:
  • 69. 69 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
  • 70. 70 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
  • 71. 71 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
  • 72. 72 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');
  • 73. 73 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.
  • 74. 74 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]
  • 75. 75 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%’;
  • 76. 76 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;
  • 77. 77 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’;
  • 78. 78 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
  • 79. 79 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
  • 80. 80 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;
  • 81. 81 Consultas con funciones de agregado  Consult a que nos muest ra 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 agragado: SUM(), AVG(), MAX(), MI N(), COUNT().
  • 82. 82 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
  • 83. 83 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
  • 84. 84 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;
  • 86. 86 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
  • 87. 87 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 PRIMARIA = CLAVE AJENACLAVE PRIMARIA = CLAVE AJENA
  • 88. 88 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.
  • 89. 89 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
  • 90. 90 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.
  • 91. 91 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
  • 92. 92 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.*
  • 93. 93 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];
  • 94. 94 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;
  • 95. 95 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
  • 96. 96 Consultas Multitabla  Relación Maestro – Detalle REFLEXIVA: R I O S A f l u e n t e d e ( 0 , 1 )( 0 , n ) R I O S ( 1 ) A f l u e n t e d e R I O S ( 2 ) ( 0 , n ) ( 0 , 1 )
  • 97. 97 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;
  • 98. 98 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.
  • 99. 99 Producto cartesiano SELECT Chicas.Nombre, Chicos.Nombre FROM Chicos, Chicas ORDER BY 1;  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:
  • 100. 100 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
  • 101. 101 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
  • 102. 102 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
  • 103. 103 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’;
  • 104. 104 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;
  • 105. 105 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
  • 106. 106 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
  • 108. 108 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.
  • 109. 109 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
  • 110. 110 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
  • 111. 111 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
  • 112. 112 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
  • 113. 113 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
  • 114. 114 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
  • 115. 115 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.
  • 116. 116 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
  • 117. 117 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
  • 118. 118 Ejemplo Consulta Resumen  SELECT Grupo, SUM(Cuota) AS Suma_Cuota FROM Alumnos WHERE [¿HA PAGADO?]=TRUE GROUP BY Grupo HAVING AVG(Cuota)>6500; Resultado usando la cláusula HAVING Resultado usando la cláusula HAVING Resultado sin usar la cláusula HAVING Resultado sin usar la cláusula HAVING Solo tendrá en cuenta para agrupar y sumar los registros que cumplan la condición. El atributo debe estar en GROUP BY
  • 119. 119 Ejemplo Consulta Resumen con dos tablas  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; 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).
  • 121. 121 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
  • 122. 122 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
  • 123. 123 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 = Oficinas.Oficina);
  • 124. 124 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
  • 125. 125 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
  • 126. 126 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
  • 127. 127 Ejemplo:  SELECT * FROM Productos WHERE PrecioUnidad > (SELECT AVG(PrecioUnidad) FROM Detalles de pedidos WHERE Descuento >= .25); Importante: Si en una consulta utilizamos en la cláusula WHERE cualquiera de los seis operadores (=,<,>,<=,>=,<>), para comparar con una subconsulta, y no utilizamos ninguno de los operadores ANY, ALL, IN, EXIST, solamente comparará con un valor, que será el que obtengamos de la subconsulta (nunca con varios). Importante: Si en una consulta utilizamos en la cláusula WHERE cualquiera de los seis operadores (=,<,>,<=,>=,<>), para comparar con una subconsulta, y no utilizamos ninguno de los operadores ANY, ALL, IN, EXIST, solamente comparará con un valor, que será el que obtengamos de la subconsulta (nunca con varios).
  • 128. 128 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
  • 129. 129 Ejemplo:  SELECT * FROM Productos WHERE IdProducto IN (SELECT IdProducto FROM Detalles de pedidos WHERE Descuento >= .25); 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. Además, puede utilizar NOT IN para recuperar solamente aquellos registros de la consulta principal para los que ningún registro de la subconsulta contenga un valor igual. Además, puede utilizar NOT IN para recuperar solamente aquellos registros de la consulta principal para los que ningún registro de la subconsulta contenga un valor igual.
  • 130. 130 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 €
  • 131. 131 Ejemplo: SELECT Descripcion FROM Productos WHERE EXISTS (SELECT * FROM Pedidos WHERE Producto = ID_producto AND Fab = Id_Fab AND Importe >= 25000); Utilice el predicado EXISTS (con la palabra reservada opcional NOT) en comparaciones verdadero/falso para determinar si la subconsulta devuelve algún registro. Utilice el predicado EXISTS (con la palabra reservada opcional NOT) en comparaciones verdadero/falso para determinar si la subconsulta devuelve algún registro.
  • 132. 132 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
  • 133. 133 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
  • 134. 134 Ejemplo de Tests ANY o SOME  SELECT * FROM Productos WHERE PrecioUnidad > ANY (SELECT PrecioUnidad FROM Detalles_pedido WHERE Descuento >= .25); Utilice los predicados ANY o SOME, que son sinónimos, para recuperar registros de la consulta principal que satisfagan la comparación con otros registros recuperados en la subconsulta. Es decir si alguna de las comparaciones individuales produce un valor VERDADERO, el test ANY devuelve el resultado VERDAD (TRUE). El test ANY se puede utilizar con los operadores (=,<,>,<=,>=,<>). Utilice los predicados ANY o SOME, que son sinónimos, para recuperar registros de la consulta principal que satisfagan la comparación con otros registros recuperados en la subconsulta. Es decir si alguna de las comparaciones individuales produce un valor VERDADERO, el test ANY devuelve el resultado VERDAD (TRUE). El test ANY se puede utilizar con los operadores (=,<,>,<=,>=,<>). El siguiente ejemplo devuelve todos los productos cuyo precio por unidad es mayor que cualquier producto vendido con un descuento del 25 por ciento o mayor: El siguiente ejemplo devuelve todos los productos cuyo precio por unidad es mayor que cualquier producto vendido con un descuento del 25 por ciento o mayor:
  • 135. 135 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.
  • 136. 136 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
  • 137. 137 Ejemplo con EXISTS SELECT * FROM Productos WHERE EXISTS (SELECT PrecioUnidad FROM Detalles_pedido WHERE Descuento >= .25 AND Productos.PrecioUnidad>Detalles_pedido.PrecioUnidad); SELECT * FROM Productos WHERE EXISTS (SELECT PrecioUnidad FROM Detalles_pedido WHERE Descuento >= .25 AND Productos.PrecioUnidad>Detalles_pedido.PrecioUnidad);
  • 138. 138 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
  • 139. 139 Ejemplo de Tests ALL  SELECT * FROM Productos WHERE PrecioUnidad > ALL (SELECT PrecioUnidad FROM Detalles_pedido WHERE Descuento >= .25);  SELECT * FROM Productos WHERE PrecioUnidad > ALL (SELECT PrecioUnidad FROM Detalles_pedido WHERE Descuento >= .25);  Utilice el predicado ALL para recuperar sólo los registros de la consulta principal que satisfagan la comparación con todos los registros recuperados en la subconsulta.  Si cambia ANY a ALL en el ejemplo anterior, la consulta devolvería sólo aquellos productos cuyo precio por unidad fuese mayor que el de todos los productos vendidos con un descuento del 25 por ciento o mayor. Esto es mucho más restrictivo.  Utilice el predicado ALL para recuperar sólo los registros de la consulta principal que satisfagan la comparación con todos los registros recuperados en la subconsulta.  Si cambia ANY a ALL en el ejemplo anterior, la consulta devolvería sólo aquellos productos cuyo precio por unidad fuese mayor que el de todos los productos vendidos con un descuento del 25 por ciento o mayor. Esto es mucho más restrictivo.
  • 140. 140 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.
  • 141. 141 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 SELECT Empresa FROM Clientes WHERE Rep_Clie IN (SELECT Num_Empl FROM RepVentas WHERE Oficina_Rep IN (SELECT Oficina FROM Oficinas WHERE Region = 'Este')); SELECT Empresa FROM Clientes WHERE Rep_Clie IN (SELECT Num_Empl FROM RepVentas WHERE Oficina_Rep IN (SELECT Oficina FROM Oficinas WHERE Region = 'Este')); Lista los clientes (Empresa) cuyos vendedores están asignados a oficinas de la región de ventas Este. Lista los clientes (Empresa) cuyos vendedores están asignados a oficinas de la región de ventas Este.
  • 142. 142  Finalmente la consulta más externa: SELECT Empresa FROM Clientes WHERE Rep_Clie IN (Subconsulta) Mostrará los clientes (Empresa) cuyos vendedores tienen uno de los números de empleados seleccionados.  Finalmente la consulta más externa: SELECT Empresa FROM Clientes WHERE Rep_Clie IN (Subconsulta) Mostrará los clientes (Empresa) cuyos vendedores tienen uno de los números de empleados seleccionados. Pasos para realizar la consulta anterior: En este ejemplo la subconsulta más interna: SELECT Oficina FROM Oficinas WHERE Región = ‘Este’; Nos devuelve una una columna que contiene los números de oficina de las oficinas de la región Este. En este ejemplo la subconsulta más interna: SELECT Oficina FROM Oficinas WHERE Región = ‘Este’; Nos devuelve una una columna que contiene los números de oficina de las oficinas de la región Este. La subconsulta siguiente: SELECT Num_Empl FROM RepVentas WHERE Oficina_rep IN (subconsulta) No devuelve una columna que contiene los números de empleados de los vendedores que trabajan en una de las oficinas seleccionadas. La subconsulta siguiente: SELECT Num_Empl FROM RepVentas WHERE Oficina_rep IN (subconsulta) No devuelve una columna que contiene los números de empleados de los vendedores que trabajan en una de las oficinas seleccionadas.
  • 143. 143 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
  • 144. 144 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.
  • 145. Actualizaciones de bases de datos INSERT, DELETE, UPDATE
  • 146. 146 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
  • 147. 147 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
  • 148. 148 Sentencia INSERT de una fila  Su sintaxis es la siguiente: INSERT INTO Tabla (campo1, .., campoN) VALUES (valor1, ..., valorN) INSERT INTO RepVentas ( Num_Empl, Nombre, Edad, Oficina_Rep, Titulo, Contrato, Director, Cuota, Ventas ) VALUES (112,’Henry Ford’, 46, 13, ‘Dir Ventas’, ‘25/08/90’, NULL, NULL, 0.0); INSERT INTO RepVentas ( Num_Empl, Nombre, Edad, Oficina_Rep, Titulo, Contrato, Director, Cuota, Ventas ) VALUES (112,’Henry Ford’, 46, 13, ‘Dir Ventas’, ‘25/08/90’, NULL, NULL, 0.0);
  • 149. 149 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
  • 150. 150 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 INTO RepVentas VALUES (112,’Henry Ford’, 46, 13, ‘Dir Ventas’, ‘25/08/90’, NULL, NULL, 0.0); INSERT INTO RepVentas VALUES (112,’Henry Ford’, 46, 13, ‘Dir Ventas’, ‘25/08/90’, NULL, NULL, 0.0);
  • 151. 151 Crear una tabla y añadir registros SELECT Num_Pedido, Fecha_Pedido, Importe INTO AntPedidos FROM Pedidos WHERE Fecha_Pedido >= ‘01/01/90’; SELECT Num_Pedido, Fecha_Pedido, Importe INTO AntPedidos FROM Pedidos WHERE Fecha_Pedido >= ‘01/01/90’; Crear la tabla AntPedidos con los campos Num_pedido, Fecha_Pedido, e Importe, para aquellos pedidos cuya fecha de pedido sea igual o superior al primer día del año 1990. Crear la tabla AntPedidos con los campos Num_pedido, Fecha_Pedido, e Importe, para aquellos pedidos cuya fecha de pedido sea igual o superior al primer día del año 1990.
  • 152. 152 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
  • 153. 153 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
  • 154. 154 Ejemplo: INSERT INTO AntPedidos ( Num_Pedido, Fecha_Pedido, Importe ) SELECT Num_Pedido, Fecha_Pedido, Importe FROM Pedidos WHERE Fecha_Pedido < ‘01/01/90’; INSERT INTO AntPedidos ( Num_Pedido, Fecha_Pedido, Importe ) SELECT Num_Pedido, Fecha_Pedido, Importe FROM Pedidos WHERE Fecha_Pedido < ‘01/01/90’; Añadir a la tabla AntPedidos, aquellos de la tabla pedidos cuya fecha de pedido sea menor al 01-01-90 Añadir a la tabla AntPedidos, aquellos de la tabla pedidos cuya fecha de pedido sea menor al 01-01-90
  • 155. 155 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
  • 156. 156 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
  • 157. 157 Ejemplo de borrado con subconsulta: DELETE FROM Pedidos WHERE Rep = (SELECT Num_Empl FROM RepVentas WHERE Nombre='Sue Smith'); DELETE FROM Pedidos WHERE Rep = (SELECT Num_Empl FROM RepVentas WHERE Nombre='Sue Smith'); Suprime los pedidos aceptados por Sue Smith.Suprime los pedidos aceptados por Sue Smith.
  • 158. 158 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
  • 159. 159 Ejemplo de UPDATE UPDATE RepVentas SET Oficina_Rep = 11, Cuota = 0.9 *Cuota WHERE Oficina_Rep = 12; UPDATE RepVentas SET Oficina_Rep = 11, Cuota = 0.9 *Cuota WHERE Oficina_Rep = 12; Cambia a todos los vendedores de la oficina de Chicago (número 12) a la oficina de New York (número 11) y rebaja sus cuotas un 10%. Cambia a todos los vendedores de la oficina de Chicago (número 12) a la oficina de New York (número 11) y rebaja sus cuotas un 10%.
  • 160. 160 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
  • 162. 162 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
  • 163. 163 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
  • 164. 164 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
  • 165. 165 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
  • 166. 166 Ejemplo:  CREATE VIEW OficinasEste (Cod_Oficina, Ciudad, Region) AS SELECT OFICINA, CIUDAD, REGION FROM Oficinas WHERE Region = 'Este';  CREATE VIEW OficinasEste (Cod_Oficina, Ciudad, Region) AS SELECT OFICINA, CIUDAD, REGION FROM Oficinas WHERE Region = 'Este'; Define una vista que contenga únicamente las oficinas de la región “Este”, cuyo nombre sea OficinasEste. Define una vista que contenga únicamente las oficinas de la región “Este”, cuyo nombre sea OficinasEste.
  • 167. 167 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.
  • 168. 168 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
  • 169. 169 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
  • 170. 170 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.
  • 171. 171 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
  • 172. 172 Vistas  Eliminación de una vista:  La sintaxis básica de la eliminación de una vista es la siguiente: DROP VIEW NombreVistaDROP VIEW NombreVista
  • 174. 174 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
  • 175. 175 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
  • 176. 176 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.
  • 177. 177 Triggers - SQL SERVER CREATE TRIGGER NuevoPedido ON Pedidos FOR INSERT AS BEGIN UPDATE RepVentas SET Ventas = Ventas + INSERTED.Importe WHERE RepVentas.Num_Empl = INSERTED.Rep; UPDATE Productos SET Existencias = Existencias - INSERTED.Cant WHERE Productos.Id_Fab = INSERTED.Fab AND Productos.Id_Producto = INSERTED.Producto; END; CREATE TRIGGER NuevoPedido ON Pedidos FOR INSERT AS BEGIN UPDATE RepVentas SET Ventas = Ventas + INSERTED.Importe WHERE RepVentas.Num_Empl = INSERTED.Rep; UPDATE Productos SET Existencias = Existencias - INSERTED.Cant WHERE Productos.Id_Fab = INSERTED.Fab AND Productos.Id_Producto = INSERTED.Producto; END; Nombre del disparador Tabla sobre la que actua Se activará cuando insertamos un registro en la tabla Pedidos. Importe insertado en Pedidos Cantidad insertada en Pedidos
  • 178. 178 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.
  • 179. 179 Triggers – Ejemplo integridad referencial  Este disparador fuerza la integridad referencial de la relación OFICINAS/REPVENTAS, y también muestra un mensaje cuando una actualización falla. CREATE TRIGGER Actualiza_rep ON RepVentas FOR INSERT, UPDATE AS IF ((SELECT COUNT(*) FROM OFICINAS, INSERTED WHERE OFICINAS.OFICINA=INSERTED.OFICINA_REP)=0) BEGIN PRINT 'Especificado un numero de oficina invalido' ROLLBACK TRANSACTION END  Este disparador fuerza la integridad referencial de la relación OFICINAS/REPVENTAS, y también muestra un mensaje cuando una actualización falla. CREATE TRIGGER Actualiza_rep ON RepVentas FOR INSERT, UPDATE AS IF ((SELECT COUNT(*) FROM OFICINAS, INSERTED WHERE OFICINAS.OFICINA=INSERTED.OFICINA_REP)=0) BEGIN PRINT 'Especificado un numero de oficina invalido' ROLLBACK TRANSACTION END Cuando hay una inserción o un actualización en la tabla Repventas comprueba que el nº de oficina insertado sea válido
  • 180. 180 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:
  • 181. 181 Ejemplo borrado en cascada CREATE TRIGGER Cambia_Oficina_Rep ON Oficinas FOR UPDATE AS IF UPDATE (OFICINA) BEGIN UPDATE REPVENTAS SET REPVENTAS.OFICINA_REP=INSERTED.OFICINA FROM REPVENTAS, INSERTED, DELETED WHERE REPVENTAS.OFICINA_REP=DELETED.OFICINA END CREATE TRIGGER Cambia_Oficina_Rep ON Oficinas FOR UPDATE AS IF UPDATE (OFICINA) BEGIN UPDATE REPVENTAS SET REPVENTAS.OFICINA_REP=INSERTED.OFICINA FROM REPVENTAS, INSERTED, DELETED WHERE REPVENTAS.OFICINA_REP=DELETED.OFICINA END Las referencias DELETED.OFICINA e INSERTED.OFICINA en el disparador se refieren, respectivamente, a los valores de la columna OFICINA antes y después de la sentencia UPDATE. Las referencias DELETED.OFICINA e INSERTED.OFICINA en el disparador se refieren, respectivamente, a los valores de la columna OFICINA antes y después de la sentencia UPDATE.
  • 183. 183 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
  • 184. 184 Ejemplo de Transacción BEGIN TRANSACTION UPDATE PEDIDOS SET CANTIDAD = 10, IMPORTE =3550.00 WHERE NUM_PEDIDO = 113051 UPDATE REPVENTAS SET VENTAS = VENTAS - 1458.00 + 3550.00 WHERE NUM_EMPL = 108 UPDATE OFICINAS SET VENTAS = VENTAS - 1458.00 + 3550.00 WHERE OFICINA = 21 UPDATE PRODUCTOS SET EXISTENCIAS = EXISTENCIAS + 4 -10 WHERE ID_FAB = 'QSA' AND ID_PRODUCTO = 'XK47' COMMIT WORK BEGIN TRANSACTION UPDATE PEDIDOS SET CANTIDAD = 10, IMPORTE =3550.00 WHERE NUM_PEDIDO = 113051 UPDATE REPVENTAS SET VENTAS = VENTAS - 1458.00 + 3550.00 WHERE NUM_EMPL = 108 UPDATE OFICINAS SET VENTAS = VENTAS - 1458.00 + 3550.00 WHERE OFICINA = 21 UPDATE PRODUCTOS SET EXISTENCIAS = EXISTENCIAS + 4 -10 WHERE ID_FAB = 'QSA' AND ID_PRODUCTO = 'XK47' COMMIT WORK
  • 185. 185 Ejemplo USE NorthWind DECLARE @Error int --Declaramos una variable que utilizaremos para almacenar un posible código de error BEGIN TRAN --Iniciamos la transacción UPDATE Products SET UnitPrice=20 WHERE ProductName =’Chai’ --Ejecutamos la primera sentencia SET @Error=@@ERROR --Si ocurre un error almacenamos su código en @Error y saltamos mediante el -- GOTO al trozo de código que deshara la transacción. IF (@Error<>0) GOTO TratarError --Si la primera sentencia se ejecuta con éxito, pasamos a la segunda UPDATE Products SET UnitPrice=20 WHERE ProductName=’Chang’ SET @Error=@@ERROR --Y si hay un error hacemos como antes IF (@Error<>0) GOTO TratarError --Si llegamos hasta aquí es que los dos UPDATE se han completado con --éxito y podemos “guardar” la transacción en la base de datos COMMIT TRAN TratarError: --Si ha ocurrido algún error llegamos hasta aquí If @@Error<>0 THEN BEGIN PRINT ‘Ha ecorrido un error. Abortamos la transacción’ --Se lo comunicamos al usuario y deshacemos la transacción --todo volverá a estar como si nada hubiera ocurrido ROLLBACK TRAN END USE NorthWind DECLARE @Error int --Declaramos una variable que utilizaremos para almacenar un posible código de error BEGIN TRAN --Iniciamos la transacción UPDATE Products SET UnitPrice=20 WHERE ProductName =’Chai’ --Ejecutamos la primera sentencia SET @Error=@@ERROR --Si ocurre un error almacenamos su código en @Error y saltamos mediante el -- GOTO al trozo de código que deshara la transacción. IF (@Error<>0) GOTO TratarError --Si la primera sentencia se ejecuta con éxito, pasamos a la segunda UPDATE Products SET UnitPrice=20 WHERE ProductName=’Chang’ SET @Error=@@ERROR --Y si hay un error hacemos como antes IF (@Error<>0) GOTO TratarError --Si llegamos hasta aquí es que los dos UPDATE se han completado con --éxito y podemos “guardar” la transacción en la base de datos COMMIT TRAN TratarError: --Si ha ocurrido algún error llegamos hasta aquí If @@Error<>0 THEN BEGIN PRINT ‘Ha ecorrido un error. Abortamos la transacción’ --Se lo comunicamos al usuario y deshacemos la transacción --todo volverá a estar como si nada hubiera ocurrido ROLLBACK TRAN END
  • 186. 186 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!
  • 187. 187 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.
  • 189. 189 Crear Procedimientos CREATE PROCEDURE Cli_Credito @Credito_Inf MONEY, @Credito_Sup MONEY AS SELECT * FROM Clientes WHERE Limite_Credito BETWEEN @Credito_Inf AND @Credito_Sup CREATE PROCEDURE Cli_Credito @Credito_Inf MONEY, @Credito_Sup MONEY AS SELECT * FROM Clientes WHERE Limite_Credito BETWEEN @Credito_Inf AND @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.
  • 191. 191 Función CREATE FUNCTION dbo.Cube( @fNumber float) RETURNS float AS BEGIN RETURN(@fNumber * @fNumber * @fNumber) END CREATE FUNCTION dbo.Cube( @fNumber float) RETURNS float AS BEGIN RETURN(@fNumber * @fNumber * @fNumber) END Nombre de la función Nombre del parámetro que pasamos a la función
  • 192. 192 Función factorial  CREATE FUNCTION dbo.Factorial( @iNumber int ) RETURNS INT AS BEGIN DECLARE @i int IF @iNumber <= 1 SET @i = 1 ELSE SET @i = @iNumber * dbo.Factorial(@iNumber - 1 ) RETURN (@i) END  CREATE FUNCTION dbo.Factorial( @iNumber int ) RETURNS INT AS BEGIN DECLARE @i int IF @iNumber <= 1 SET @i = 1 ELSE SET @i = @iNumber * dbo.Factorial(@iNumber - 1 ) RETURN (@i) END
  • 193. 193 Función con una tabla CREATE FUNCTION dbo.AuthorsForState(@cState char(2) ) RETURNS TABLE AS RETURN (SELECT * FROM Authors WHERE state = @cState) CREATE FUNCTION dbo.AuthorsForState(@cState char(2) ) RETURNS TABLE AS RETURN (SELECT * FROM Authors WHERE state = @cState)
  • 195. 195 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:
  • 196. 196 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
  • 197. 197 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.
  • 198. 198 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.
  • 199. 199 Privilegios  El estándar SQL-1 especifica cuatro privilegios para tablas y vistas: SELECT INSERT DELETE UPDATE
  • 200. 200 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 …])]]
  • 201. 201 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 …])]]
  • 202. 202 Crear un usuario CREATE LOGIN Pepe WITH PASSWORD =‘m1a2n3o4l5o'; USE BD_Facturas; CREATE USER Pepe FOR LOGIN Pepe; GO Crea un inicio de sesión de servidor denominado “Pepe” con una contraseña Crea el usuario de base de datos “Pepe” correspondiente a BD_Factura
  • 203. 203 Crear usuario CREATE USER nom_usuario1 contraseña, nom_usuario2 contraseña, …
  • 204. 204 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”.
  • 205. 205 Borra un usuario USE BD_FACTURA; DROP USER Jose; GO
  • 206. 206 Crear un grupo de usuarios CREATE GROUP nom_grupo1 contraseña, nom_grupo2 contraseña, …
  • 207. 207 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
  • 208. 208 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.
  • 209. 209 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á
  • 210. 210 Cambia contraseña del usuario ALTER USER nom_usuario PASSWORD contraseña_nueva contraseña_anterior
  • 211. 211 Cambia la contraseña de la base de datos ALTER DATABASE PASSWORD contraseña_nueva contraseña_anterior