Documentos de Académico
Documentos de Profesional
Documentos de Cultura
GESTORES DE
BASES DE DATOS
I.E.S. MARCOS ZARAGOZA
SQL
INTRODUCCIÓN
SQL fue desarrollado inicialmente por IBM como
lenguaje de consulta de su SGBD DB2, en 1970
Es un lenguaje no procedimental (indica qué
datos se desea manipular, pero no de qué
manera hacerlo)
Hay dos organizaciones, ANSI e ISO que tratan
de favorecer la estandarización del lenguaje, no
obstante, cada fabricante de SGBDs aporta sus
propias características
3
INTRODUCCIÓN
SQL significa Structured Query Language
(Lenguaje Estructurado de Consulta)
SQL incluye soporte para los lenguajes:
DDL: Lenguaje de Definición de Datos.
DML: Lenguaje de Manipulación de Datos.
DCL: Lenguaje de Control de Datos.
SQL no se limita únicamente a realizar
consultas sobre los datos almacenados
4
INTRODUCCIÓN
SQL permite:
Definición
de datos
Recuperación de datos
Manipulación de datos
Altas, Bajas y Modificaciones
Control de acceso a datos
Compartición de datos entre usuarios concurrentes
Integridad de datos
5
INTRODUCCIÓN
Características:
Independencia entre proveedores
Portabilidad
Estandarización SQL
Fundamento relacional
Estructura de alto nivel similar al inglés
Consultas interactivas
Acceso a bases de datos desde lenguajes de
programación
Múltiples vistas de datos
Arquitectura cliente/servidor
6
Reglas del SQL ANSI
Carácter coincidente Access SQL ANSI SQL
8
Constantes
Numéricas: Se escriben directamente.
Por ejemplo:
Real: 234,45.
Entero: 234
Alfanuméricas: Se escriben entre
comillas preferentemente simples.
Fechas: Se escriben entre comillas
preferentemente simples.
9
Componentes de SQL
El lenguaje SQL está compuesto por:
Comandos
Cláusulas
Operadores
Funciones de agregado
10
Sentencias DDL
Comando Descripción
11
Sentencias DML
SELECT Para consultar registros de la base de
datos que satisfagan un criterio
determinado
INSERT Para cargar lotes de datos en la base
de datos en una única operación.
UPDATE Para modificar los valores de los
campos y registros especificados
DELETE Para eliminar registros de una tabla
de una base de datos
12
Cláusulas
FROM Para especificar la tabla de la cual se van
a seleccionar los registros
WHERE Para especificar las condiciones que
deben reunir los registros que se van a
seleccionar
GROUP BY Para separar los registros seleccionados
en grupos específicos
HAVING Para expresar la condición que debe
satisfacer cada grupo
ORDER BY Para ordenar los registros seleccionados
de acuerdo con un orden específico
13
Operadores Lógicos
Operador Uso
16
Tipos de datos estándar (I)
Tipo de Datos Tamañ Descripción
o
BINARY 1 byte Para consultas sobre tabla adjunta de
productos de bases de datos que definen un
tipo de datos Binario.
BIT 1 byte Valores Si/No ó True/False
BYTE 1 byte Un valor entero entre 0 y 255.
COUNTER 4 bytes Un número incrementado automáticamente
(Autonumérico) (de tipo Long)
CURRENCY 8 bytes Un entero escalable entre
(Moneda) 922.337.203.685.477,5808 y
922.337.203.685.477,5807.
17
Tipos de datos estándar (II)
Tipo de Tamaño Descripción
Datos
DATETIME 8 bytes Un valor de fecha u hora entre los años 100 y
9999.
SINGLE 4 bytes Un valor en punto flotante de precisión simple
con un rango de -3.402823*1038 a
-1.401298*10-45 para valores negativos,
1.401298*10-45 a 3.402823*1038 para valores
positivos, y 0.
DOUBLE 8 bytes Un valor en punto flotante de doble precisión
con un rango de -1.79769313486232*10308 a
-4.94065645841247*10-324 para valores
negativos, 4.94065645841247*10-324 a
1.79769313486232*10308 para valores
positivos, y 0.
18
Tipos de datos estándar (III)
Tipo de Datos Tamaño Descripción
20
Sinónimos de tipos de datos (II)
Tipo de Dato Sinónimos
SINGLE FLOAT4
IEEESINGLE
REAL
DOUBLE FLOAT
FLOAT8
IEEEDOUBLE
NUMBER
NUMERIC
SHORT INTEGER2
SMALLINT
21
Sinónimos de tipos de datos (III)
Tipo de Dato Sinónimos
LONG INT
INTEGER
INTEGER4
LONGBINAR GENERAL
Y OLEOBJECT
LONGTEXT LONGCHAR
MEMO
NOTE
TEXT ALPHANUMERIC
CHAR
CHARACTER
STRING
VARCHAR
22
Creación de bases
de datos
El lenguaje DDL
Además de la manipulación de datos, que
se realiza por medio del lenguaje DML,
con SQL se puede definir la propia
estructura de la Base de Datos
Esto se realiza mediante el DDL
Así como el DML está bastante
estandarizado, respecto al DDL, va a
haber muchas dependencias respecto al
SGBD que se esté utilizando
24
El lenguaje DDL
El núcleo del DDL está basado en tres
cláusulas de SQL
CREATE, que define y crea un objeto de la
base de datos
DROP, que elimina un objeto existente en la
base de datos
ALTER, que modifica la definición de un
objeto de la base de datos
25
Creación y borrado de una BBDD
26
Creación de una tabla
Se realiza mediante la sentencia CREATE
TABLE.La sintaxis básica es la siguiente:
CREATE TABLE nombre_tabla
(
atributo tipo(tamaño)[DEFAULT valor] [Índice],
[NOT NULL]
atributo …… ,
atributo ……
); 27
Creación de una tabla
nombre_tabla: Es el nombre que tomará la
tabla en la BBDD
atributo: Es el nombre de una de las
columnas.
En la definición de la tabla se pueden crear tantas
columnas como sea necesario
El nombre de columna debe empezar por un carácter
alfabético
tipo(tamaño): es la indicación del tipo de
dato que la columna podrá contener y su
longitud.
28
Creación de una tabla
cláusula_defecto: indica el valor de
defecto que tomará la columna si no se le
asigna uno explícitamente en el momento en
que se crea la línea.
La sintaxis que hay que usar es la siguiente:
DEFAULT { valor | NULL }
vínculos_de_columna: son vínculos de
integridad que se aplican a cada atributo
concreto. Pueden ser:
NOT NULL, que indica que la columna no puede
tomar el valor NULL.
29
Creación de una tabla
vínculos_de_columna: (continuación)
PRIMARY KEY, que indica que la columna es la clave
primaria de la tabla.
UNIQUE: indica que no se admiten duplicados para ese
campo
Una definición de referencia (clave ajena) con la forma:
REFERENCES Nom_tabla(clave)
[ON DELETE
{NO ACTION | CASCADE | SET DEFAULT
| SET NULL }]
[ON UPDATE
{NO ACTION | CASCADE | SET DEFAULT
| SET NULL }]
30
Creación de una tabla
vínculos_de_columna: (continuación)
CHECK (expresión_condicional)
Ejemplo: CHECK (PRECIO<1000)
vínculo_de_tabla: son vínculos de
integridad que se pueden referir a más
columnas de la tabla. Estos pueden ser:
PRIMARY KEY (columna1 [, columna2,…])
para crear claves primarias compuestas de más de
una columna.
FOREIGN KEY (columna1 [, columna2, …])
definiciones_de_referencia
para crear claves ajenas de más de una columna
31
Creación de una tabla en Informix
Ejemplos:
CREATE TABLE Publicacion (
ID INTEGER PRIMARY KEY,
Tipo CHAR(18) NOT NULL);
32
Ejemplo de creación de tabla:
CREATE TABLE Colegios
( Num_Colegio INTEGER NOT NULL PRIMARY KEY,
Nombre CHAR(30),
Fecha_Nac DATETIME
);
O bien:
CREATE TABLE Colegios
( Num_Colegio INTEGER NOT NULL,
Nombre CHAR(30),
Fecha_Nac DATETIME,
CONSTRAINT PK_Cole PRIMARY KEY (Num_Colegio)
);
33
Definir claves al final de la tabla
Definir clave principal:
CONSTRAINT PK_Nom_tabla_indices
PRIMARY KEY (Atributos_clave_principal)
34
Ejemplo creación de tabla con clave compuesta:
CREATE TABLE Empleados
( Nombre CHAR(15),
Apellidos CHAR(35),
Fecha_Nac DATETIME,
Telef CHAR(9),
CONSTRAINT PK_Emple
PRIMARY KEY (Apellidos, Nombre, Fecha_Nac)
);
35
Ejemplo de definición de una clave ajena I
CREATE TABLE Clientes
(IDCliente INTEGER NOT NULL,
Nom CHAR(15) NOT NULL,
Apel CHAR(35) NOT NULL,
CONSTRAINT PK_Clie PRIMARY KEY (IDCliente)
);
36
Ejemplo de definición de una clave ajena
CREATE TABLE Pedidos
( IDPedido INTEGER PRIMARY KEY,
IDCliente INTEGER,
NotasPedido CHAR(50),
CONSTRAINT FK_Pedido_Cliente
FOREIGN KEY (IDCliente)
REFERENCES Clientes(IDCliente)
ON UPDATE CASCADE
ON DELETE CASCADE
);
37
Definición de una clave única
CREATE TABLE Sucursal
( Num_Suc CHAR(2) NOT NULL,
Ciudad CHAR(20) NOT NULL,
Zona CHAR(8) NOT NULL,
Director CHAR(3) NOT NULL,
Objetivo_Año INTEGER NOT NULL,
CONSTRAINT PK_Sucur PRIMARY KEY(Num_Suc),
CONSTRAINT SK_ciu UNIQUE(Ciudad),
CONSTRAINT FK_emple
FOREIGN KEY(Director)
REFERENCES INFEMPLE(Num_Emple)
);
38
Borrado de una tabla
Se especifica mediante la sentencia:
DROP TABLE nombre_de_tabla
La sentencia puede fallar si hay reglas de
integridad referencial que impidan el
borrado de datos de tal tabla, y por tanto
también impiden el borrado de la propia
tabla
DROP
DROPTABLE
TABLEEmpleados;
Empleados;
39
Modificación de tablas
Permite básicamente las siguientes
operaciones:
Añadir nuevas columnas a una tabla
Eliminar columnas de una tabla
Modificar las definiciones de campo de una
tabla (no todos los SGBD permiten esta
operación)
Crear restricciones de integridad
Eliminar restricciones de integridad
40
Modificación de tablas
Adición de una nueva columna:
ALTER TABLE nombre_tabla
ADD nombre_col definición_col
La definición de la columna sigue la misma sintaxis
que se ha visto en el apartado relativo a la instrucción
CREATE TABLE.
ALTER
ALTERTABLE
TABLEEmpleados
EmpleadosADD
ADDCOLUMN
COLUMNSalario
SalarioCURRENCY;
CURRENCY;
41
Modificación de tablas
Eliminación de una columna de la tabla
ALTER
ALTERTABLE
TABLEEmpleados
EmpleadosDROP
DROPCOLUMN
COLUMNSalario;
Salario;
42
Modificación de tablas
Modificación de una columna de la tabla
(Interbase)
ALTER
ALTERTABLE
TABLEEmpleados
EmpleadosALTER
ALTERCOLUMN
COLUMNNom
NomTO
TONombre
NombreCHAR(25);
CHAR(25);
ALTER
ALTERTABLE
TABLEEmpleados
EmpleadosALTER
ALTERCOLUMN
COLUMNNom
NomCHAR(40);
CHAR(40);
43
Modificación de tablas
Creación de una Restricción
44
Modificación de tablas
Eliminación de una Restricción (tabla de
índices de una clave principal, única o
ajena):
ALTER
ALTERTABLE
TABLEEmpleados
EmpleadosDROP
DROPCONSTRAINT
CONSTRAINTFK_Emple;
FK_Emple;
45
Índices
Un índice es una estructura que proporciona un
acceso rápido a las filas de una tabla en función
a los valores de una o más columnas
La presencia o ausencia de un índice es
transparente al usuario de SQL sólo que:
Con un índice sobre un campo se consigue mayor
rendimiento en la ordenación y búsqueda sobre el
mismo
Los índices van a ocupar espacio físico de
almacenamiento en el sistema de archivos donde se
ubica la BBDD.
46
Índices
Será conveniente crear índices en
aquellas columnas de una tabla que son
utilizadas frecuentemente en condiciones
de búsqueda y ordenación.
La indexación también se considera más
adecuada cuando la BBDD se emplea más
para consultas que para la actualización de
datos
El SGBD siempre creará un índice para la
clave primaria de cada tabla
47
Índices
Creación de índices:
Su sintaxis básica es la siguiente:
CREATE
CREATEUNIQUE
UNIQUEINDEX
INDEXSK_calle_num
SK_calle_num
ON
ONBloqueCasas
BloqueCasas(calle,
(calle,numero)
numero)WITH
WITHDISALLOW
DISALLOWNULL;
NULL;
48
Índices
Eliminación de índices:
Su sintaxis básica es la siguiente:
DROP
DROPINDEX
INDEXSK_calle_num;
SK_calle_num;
DROP
DROPINDEX
INDEXSK_calle_num
SK_calle_numON
ONBloqueCasas
BloqueCasas;;
49
Base de datos Catastro
50
Definir una relación 1:1
CREATE TABLE BloqueCasas
( calle TEXT(30) NOT NULL,
numero SHORT NOT NULL,
metros_b SHORT,
od_bloque LONG,
CONSTRAINT PK_blo PRIMARY KEY (calle, numero),
);
Para crear una relación 1 a 1 debemos definir laclave ajena de esta
manera:
CREATE UNIQUE INDEX SK_calle_num
ON BloqueCasas (calle, numero) WITH DISALLOW
NULL;
ALTER TABLE BloqueCasas ADD CONSTRAINT FK_blo_vi
FOREIGN KEY (calle, numero)
REFERENCES Vivienda(calle, numero)
ON DELETE CASCADE;
51
Creación BD “SQL_LANS”
52
Esquema de la BD en SQL Server
53
Ejemplo de creación de una BD
CREATE DATABASE SQL_LANS;
USE SQL_LANS;
54
Ejemplo de creación de una BD
CREATE TABLE OFICINAS
(
OFICINA INT NOT NULL,
CIUDAD CHAR(15) NOT NULL,
REGION CHAR(10) NOT NULL,
DIR INT NOT NULL,
OBJETIVO FLOAT NOT NULL,
VENTAS FLOAT NOT NULL
);
57
Definición de las claves ajenas
USE SQL_LANS;
59
Borrar claves principales
DROP INDEX PK_Clie ON Clientes;
DROP INDEX PK_Oficinas ON Oficinas;
DROP INDEX PK_Pedidos ON Pedidos;
DROP INDEX PK_Productos
ON Productos;
DROP INDEX PK_Repventas
ON Repventas;
60
Borrar tablas de la BD
USE SQL_LANS;
61
Consultas simples
Sentencia SELECT
La sentencia SELECT recupera datos de una
base de datos y los devuelve en forma de una
relación
La sentencia SELECT puede llegar a constar de
hasta seis cláusulas
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
63
Sentencia SELECT
SELECT
Lista los datos a recuperar.
Se pueden recuperar todas las columnas empleando
el carácter asterisco (“*”).
Pueden ser datos contenidos en las tablas de la base
de datos o bien especificarse operaciones para
realizar cálculos (campos calculados).
Puede ser una constante. Ejemplo: ‘Total igual a ‘.
FROM
Indicala lista de tablas que contienen los datos a
recuperar.
Los datos pueden proceder de más de una tabla
64
Sentencia SELECT
WHERE
Se emplea para dar una condición de búsqueda para especificar
las filas deseadas
GROUP BY
Se emplea en consultas de resumen. Se verá en detalle más
adelante
HAVING
Indica una condición de selección solbre los grupos producidos
por GROUP BY. Se verá en detalle más adelante
ORDER BY
Permite ordenar los resultados de la consulta a través de una o
de varias columnas, ascendente o descendentemente, a través
de las cláusulas ASC (por defecto) y DESC
65
Sentencia SELECT
Algunos ejemplos de consultas SELECT
68
Cláusula WHERE
1. Si la condición de búsqueda da como
resultado CIERTO la tupla se incluye en la
relación resultado
2. Si la condición de búsqueda da FALSO la
tupla se excluye de la relación resultado
3. Si la condición de búsqueda da QUIZÁS la
tupla se excluye de la relación resultado
69
Cláusula WHERE
Para realizar las búsquedas, SQL cuenta con
distintos tipos de condiciones, que facilitan la
expresividad y naturalidad en las selecciones
Los predicados estándar son:
Test de comparación
Test de rango
Test de pertenencia a un conjunto
Test de correspondencia a un patrón
Test de valor nulo
70
Cláusula WHERE
TEST DE COMPARACIÓN
Se emplean en él los operadores de comparación
habituales
=, <>, <, <=, >, >=
TEST DE RANGO - BETWEEN
Comprueba si un dato se encuentra entre dos
valores
Se indica mediante el nombre de campo a
comprobar, a continuación la palabra reservada
BETWEEN, y los dos valores extremos del intervalo
separados por la palabra AND.
Ej: SELECT Nom, Dir
FROM Empleados
WHERE Sueldo BETWEEN 1000 AND 2000
71
Cláusula WHERE
TEST DE PERTENENCIA A CONJUNTO – IN
Comprueba si un valor de dato coincide con
uno de la lista de valores objetivo
proporcionada.
Ejemplo:
SELECT *
FROM Pedidos
WHERE Provincia In ('Madrid',
'Barcelona',
'Sevilla');
72
Cláusula WHERE
TEST DE CORRESPONDENCIA CON
PATRÓN – LIKE
Se emplea en la comparación de Cadenas
de Caracteres
Comprueba si el valor de la columna
indicado se ajusta al patrón especificado
Para especificar un patrón se emplean los
caracteres comodín.
73
Cláusula WHERE
Los caracteres comodín son los siguientes:
% (tanto por ciento) Corresponde con una
secuencia de cero o más caracteres [Equivale al
comodín “*” de MS-DOS]
74
Ejemplo de patrón LIKE
Consulta que muestra el código y el
nombre de los empleados cuyo apellido
empiece por “L”.
SELECT Codigo, Nombre
FROM Empleados
WHERE Apellidos LIKE ‘L%’;
75
Cláusula WHERE
TEST DE VALOR NULO – IS NULL
Para seleccionar las tuplas en las que cierto
atributo toma un valor nulo hay que hacerlo
mediante la comparación IS NULL
Un error típico cometido en SQL es tratar de hacer
una comparación del tipo
CAMPO = NULL
Esta comparación en realidad lo que hace es tratar de
buscar un literal NULL que no es lo mismo que la falta de
dato que indica el valor nulo del modelo relacional.
Ejemplo: SELECT * FROM Empleados
WHERE Sueldo IS NULL;
76
Condiciones compuestas
Utilizando las reglas de la lógica se pueden combinar
condiciones de selección simples para formar otras
complejas.
Para ello se pueden utilizar las palabras
reservadas
AND (Y lógica)
OR (O lógica)
NOT (Negación lógica)
Ejemplo:
SELECT Apell, Nom
FROM Empleados
WHERE Sueldo>1000 AND Nom=‘Juan’;
77
Ordenaciones
Si no se especifica ninguna opción, los resultados
devueltos por SQL quedarán ordenados por los
índices definidos en las tablas.
Se puede especificar el orden en que se desean
recuperar los registros de las tablas mediante la
cláusula:
ORDER BY Lista de Campos [ASC | DESC]
ORDER BY posición del campo en el SELECT
Ejemplo: SELECT Nom, Apell FROM Empleados
ORDER BY Apell, Nom;
O bien: ORDER BY 2,1
78
Ordenaciones
Por omisión SQL ordena los datos en
secuencia ascendente (ASC)
Para ordenar en secuencia descendente se
puede emplear la palabra clave DESC
Si se quiere realizar una ordenación en base a
un campo calculado, como será un campo no
presente en la BBDD, y por tanto no tiene
nombre, se debe emplear el número de
columna según aparece en la definición de la
consulta
79
Consulta con expresión:
Consulta que muestra los empleados nacidos
en 1990 con el sueldo aumentado un 20%.
SELECT Nom, Apell,
Sueldo*1,20 AS Nuevo_Sueldo
FROM Empleados
WHERE YEAR(Fecha_Nac)=1990 AND
MONTH(Fecha_Nac)=6 AND
Sueldo IS NOT NULL;
80
Consultas con funciones de agregado
82
Uniones
Por omisión, en la unión de dos
relaciones se eliminan las tuplas
duplicadas.
Si se quiere alterar el comportamiento
normal de la unión, forzando el que no
se eliminen los duplicados, se puede
emplear la cláusula ALL inmediatamente
después de la cláusula UNION
83
Ejemplo de consulta union:
SELECT ID_Fab, ID_Producto
FROM Productos
WHERE Precio > 2000.00
UNION [ALL]
SELECT DISTINCT Fab, Producto
FROM Pedidos
WHERE Importe > 30000.00
ORDER BY 1,2;
84
Consultas Multitabla
86
Consultas Multitabla
Composiciones simples (combinación
interna):
Son las consultas multitabla fundamentales
Recogen todas las tuplas formadas por la
combinación de las tuplas de la primera
tabla con las de la segunda, en los casos en
los que el campo de combinación (CLAVE
PRIMARIA –> CLAVE AJENA) tome valores
idénticos en ambas partes, es decir:
CLAVE
CLAVEPRIMARIA
PRIMARIA == CLAVE
CLAVEAJENA
AJENA
87
Consultas Multitabla
La sintaxis básica es idéntica a la de las consultas
de selección, en las que se indicarán los campos
procedentes de cada tabla, y tras las cláusula FROM
se nombrarán todas las tablas desde las que
proceden
Además, para poder hacer la combinación, se
igualarán en una condición del WHERE los campos
CLAVE PRIMARIA y CLAVE AJENA
Este tipo de consultas se suele denominar también
PADRE – HIJO, o MAESTRO – DETALLE.
88
Consultas Multitabla
Si además de incluir la condición de
combinación se quieren añadir nuevas
condiciones de selección, se puede hacer
mediante el uso de AND
Del mismo modo, si existen varias columnas
de emparejamiento (claves primaria y ajena
formadas por múltiples campos), se pondrán
todas, utilizando también la cláusula AND
89
Consultas Multitabla
Las técnicas empleadas para emparejar dos
tablas se hacen extensibles a tres o más tablas
Con SQL también es posible emplear cualquier
par de columnas para hacer una combinación,
sin que estas guarden una relación PADRE –
HIJO
Además se pueden generar combinaciones
basadas en desigualdades, utilizando el resto de
operadores de comparación.
90
Consultas Multitabla
Nombres de campo cualificados:
En consultas multitabla es habitual que haya
coincidencias en los nombres de los campos
Para evitar el problema que esto supone, se
pueden cualificar mediante:
TABLA.CAMPO
Si además las tablas se nominan mediante
ALIASES, se pueden cualificar los campos
mediante los mismos:
ALIAS.CAMPO
91
Consultas Multitabla
Selección de todos los campos:
Si se utiliza SELECT * se seleccionarán
todos los campos de todas las tablas
implicadas en la consulta
Si se quiere hacer una selección de todos
los campos de una de las tablas de la
consulta, se puede realizar mediante
SELECT NOM_TABLA.*
92
Ejemplo consulta con dos tablas
SELECT Pedidos.[ID de pedido],
Clientes.[Nombre de la Compañia],
Clientes.[Ciudad]
Pedidos.[Fecha de pedido]
FROM Pedidos, Clientes
WHERE Pedidos.[ID de cliente]=Clientes.[ID Cliente];
93
Ejemplo con tres tablas
SELECT Pedidos.[ID de pedido], Clientes.[Nombre de la Compañia],
Clientes.[Ciudad], Pedidos.[Fecha de pedido], [Precio unidad],
Cantidad
FROM Pedidos, Clientes,[Detalle de Pedido]
WHERE Pedidos.[ID de cliente]=Clientes.[ID Cliente]
AND Pedidos.[ID de Pedido] = [Detalle de Pedido].[ID pedido]
AND Cantidad>3;
94
Consultas Multitabla
Relación Maestro – Detalle REFLEXIVA:
Para poder hacer una consulta Maestro – Detalle
reflexiva hay que emular que los datos se
encuentran distribuidos en dos tablas distintas en
lugar de una
Para ello se debe hacer uso de los alias de tabla,
dando a cada una de las dos tablas emuladas un
alias distinto
Para crear los alias basta con poner el nombre
deseado detrás del nombre de cada tabla en la
cláusula FROM
95
Consultas Multitabla
Relación Maestro – Detalle REFLEXIVA:
A fl u e n t e
de
(0 ,n ) (0 ,1 )
R IO S
(0 ,n ) A fl u e n t e (0 ,1 )
R IO S (1 ) de
R IO S (2 )
96
Ejemplo de reflexiva
SELECT Rios.Nom_Rio,
'es afluente de ',
Afluente_de.Nom_Rio
FROM Rios, Rios AS Afluente_de
WHERE Rios.Cod_Rio_Afluente = Afluente_de.Cod_Rio;
97
Consultas Multitabla
Producto Cartesiano:
Es la composición que hace por defecto
SQL si no se indica ninguna condición de
igualdad de campos en la cláusula WHERE,
cuando se realiza una consulta multitabla.
98
Producto cartesiano
Ejemplo: Si tenemos una tabla con
nombres de chicos y otra tabla con
nombres de chicas y queremos sacar
todos los emparejamientos posibles
(producto cartesiano), entonces:
SELECT Chicas.Nombre,
Chicos.Nombre
FROM Chicos, Chicas
ORDER BY 1;
99
Consultas Multitabla
Combinación Interna
SQL con las combinaciones que se han generado
hasta el momento genera únicamente las tuplas
que tienen coincidencia en valor en los campos
nexo de las tablas implicadas
Esto es a lo que se llama COMBINACIÓN
INTERNA
En los casos en que al comprobar la igualdad de
los campos nexo da un valor QUIZAS, se omiten
esas tuplas
100
Consultas Multitabla
Combinación Externa
Se puede especificar en SQL que incluyan
las tuplas en los que la condición de
igualdad de los campos nexo sea QUIZÁS
Se pueden dar los casos de:
Combinación Externa Izquierda
Combinación Externa Derecha
Combinación Externa Simétrica
101
Consultas Multitabla
SQL 2 define una sintaxis específica
para realizar las combinaciones internas
y externas
COMBINACIÓN INTERNA
Se especifica mediante las cláusulas INNER
JOIN y ON
SELECT lista_campos FROM
Tabla_1 INNER JOIN Tabla_2
ON Tabla_1.NEXO = Tabla_2.NEXO
102
Ejemplo combinación interna
SELECT Pedidos.[ID de pedido],
Clientes.[Nombre de la Compañia],
Clientes.[Ciudad]
Pedidos.[Fecha de pedido]
FROM Clientes INNER JOIN Pedidos
ON Pedidos.[ID de cliente]=Clientes.[ID Cliente]
WHERE Pedidos.[Fecha de pedido]<’12/12/1991’;
103
Ejemplo combinación con tres tablas
SELECT Pedidos.[ID de pedido], Clientes.[Nombre de la Compañia],
Clientes.[Ciudad], Pedidos.[Fecha de pedido], [Precio unidad],
Cantidad
FROM Clientes INNER JOIN (Pedidos INNER JOIN [Detalle de
Pedido] ON Pedidos.[ID de Pedido] = [Detalle de Pedido].[ID
pedido] ) ON Pedidos.[ID de cliente]=Clientes.[ID Cliente]
WHERE Cantidad>3;
104
Consultas Multitabla
COMBINACIÓN EXTERNA
Se especifica mediante las cláusulas
[LEFT|RIGHT|FULL] OUTER JOIN y ON
LEFT: Izquierda.
RIGHT: Derecha.
FULL: Izquierda y derecha.
SELECT lista_campos FROM
Tabla_1 LEFT [OUTER] JOIN Tabla_2
ON Tabla_1.NEXO = Tabla_2.NEXO
105
Ejemplo combinación externa por la izquierda
SELECT Clientes.[Nombre de la Compañia],
Clientes.[Ciudad],
Pedidos.[ID de pedido],
Pedidos.[Fecha de pedido]
FROM Clientes LEFT JOIN Pedidos
ON Pedidos.[ID de cliente]=Clientes.[ID Cliente];
NULOS
106
Consultas Resumen
Consultas Resumen
Muchas peticiones de información no
requieren un detalle de todos los
registros implicados, sino una
información resumida en base a la
información total
SQL permite resumir datos de la base de
datos mediante un conjunto de
funciones de columna.
108
Consultas Resumen
Una función de columna SQL acepta
una columna entera de datos como
argumento, y produce un único resultado
que resume toda la columna
SQL estándar proporciona seis
funciones de columna
Distintos fabricantes suelen añadir en este
campo muchas más funciones además de
las estándar
109
Consultas Resumen
Funciones de Columna Estándar:
SUM() calcula el total de una columna
AVG() calcula la media de una columna
MIN() obtiene el valor mínimo de una
columna
MAX() obtiene el valor máximo de una
columna
COUNT() cuenta el número de valores de
una columna
COUNT(*) cuenta las filas de una consulta
110
Consultas Resumen
Restricciones:
No se puede anidar funciones de columna
No se puede mezclar funciones de columna
y nombres de columna ordinarios en una
lista de selección
Ejemplo ilegal:
111
Consultas Resumen
Valores NULL
Las funciones de columna aceptan
una columna de valores como
argumento y producen como resultado
un resumen
Si alguno de los valores de la columna
argumento toma el valor NULL, SQL lo
ignorará en sus cálculos
112
Consultas Resumen
Eliminación de valores duplicados
Se puede hacer que el conjunto de valores
de la columna pasada como argumento no
contenga duplicados
Esto se hace anteponiendo la palabra clave
DISTINCT justo delante del argumento de
la función
Ejemplo:
SELECT COUNT(DISTINCT CIUDAD)
FROM ALUMNOS
113
Consultas Resumen
Consultas Agrupadas – GROUP BY
Las consultas resumen vistas sólo producen una
fila
Con frecuencia es conveniente resumir los
resultados no a nivel de total, sino a nivel de
subtotales
Esto se puede conseguir con SQL mediante la
cláusula GROUP BY
Una consulta agrupada constará al menos de dos
campos: el de generación de grupos (de
agrupación) y el resumen
Puede haber varios campos de agrupación
114
Consultas Resumen
El funcionamiento de las consultas agrupadas
se puede ver conceptualmente de la siguiente
forma:
SQL seleccionará todas las filas que cumplan con
los criterios de selección
A continuación agrupará las columnas, de modo
que se produzcan tramos en los que no varía el
valor del campo de agrupación
Para cada uno de estos tramos se aplicará la
función de columna seleccionada, asociando el
valor obtenido del cálculo al valor del campo de
agrupación.
115
Consultas Resumen
Restricciones de las consultas agrupadas:
Las columnas de agrupación deben ser columnas
efectivas
No se pueden utilizar campos calculados para agrupar por
ellos
Los elementos de la lista de selección sólo pueden
ser:
Constantes
Funciones de columna
Columnas de agrupación (afectadas por GROUP BY)
Una expresión que afecte a las combinaciones anteriores
116
Consultas Resumen
Condiciones de selección de grupos – HAVING
Funciona de manera similar a la cláusula WHERE,
aunque ésta lo hace sobre filas individuales
Una vez calculados los grupos, se pueden aceptar o
rechazar mediante el uso de la cláusula HAVING, que
se incluirá tras la especificación del GROUP BY
Ejemplo:
SELECT Id_Familia, Sum(Stock)
FROM Productos
GROUP BY Id_Familia
HAVING Sum(Stock) > 100
117
Ejemplo Consulta Resumen
El atributo debe estar en GROUP BY
Resultado
Resultadosin usar
sinusar
Resultado usando
Resultadousando lalacláusula HAVING
cláusulaHAVING
lalacláusula HAVING
cláusulaHAVING
118
Ejemplo Consulta Resumen con dos tablas
Por cada oficina con dos o más personas, calcular la cuota total y
las ventas totales para todos los vendedores que trabajan en la
oficina. (Agrupar por Ciudad siempre que haya dos o más
representantes).
Consultas anidadas
Subconsultas
SQL permite utilizar los datos obtenidos
como resultado de una consulta como
parte de otra
Una subconsulta es una consulta que
aparece dentro de la cláusula WHERE o
de la cláusula HAVING
121
Subconsultas
Restricciones de las subconsultas:
La subconsulta debe producir una única columna
de datos resultado
Su lista de selección contiene un único elemento
No se puede especificar la cláusula ORDER BY en
la subconsulta
No puede ser la UNION de varias SELECT
Los nombres de columna de la subconsulta pueden
hacer referencia a la consulta principal
Es aconsejable emplear nombres de columna cualificados
122
Subconsultas
Referencias Externas:
En el cuerpo de una subconsulta es habitual tener
que referirse al valor de una columna en la “fila
actual” de la consulta principal.
Ejemplo:
SELECT Oficinas.Ciudad
FROM Oficinas
WHERE Objetivo >
(SELECT SUM(RepVentas.Cuota)
FROM RepVentas
WHERE Repventas.Oficina_Rep =
123
Oficinas.Oficina);
Subconsultas
En el ejemplo anterior, en la subconsulta se
hace referencia al campo Oficinas.Oficina
de la consulta prinicipal.
Conforme SQL recorre cada fila de la tabla
OFICINAS, utiliza el valor
Oficinas.Oficina de la fila actual como
argumento para resolver la condición WHERE
de la subconsulta
124
Subconsultas
Condiciones de búsqueda en
subconsultas:
Una subconsulta siempre forma parte de
una condición WHERE o HAVING
Los tipos de condiciones de subconsultas
son:
Test de comparación subconsulta
Test de pertenencia a un conjunto subconsulta
Test de existencia
Test de comparación cuantificada
125
Subconsultas
Test de comparación subconsulta:
Hace uso de los operadores típicos de
comparación: (=,<,>,<=,>=,<>).
Compara el valor de una expresión con un
valor único producido por la subconsulta
Si la subconsulta no produce filas o produce
un valor NULL, el test de comparación
devuelve NULL
126
Ejemplo:
SELECT * FROM Productos
WHERE PrecioUnidad >
(SELECT AVG(PrecioUnidad)
FROM Detalles de pedidos
WHERE Descuento >= .25);
Importante:
Importante: Si
Sien
enuna
unaconsulta
consultautilizamos
utilizamosenenlalacláusula
cláusula
WHERE
WHEREcualquiera
cualquieradedelos
losseis
seisoperadores
operadores(=,<,>,<=,>=,<>),
(=,<,>,<=,>=,<>),
para
paracomparar
compararcon
conuna
unasubconsulta,
subconsulta, yyno noutilizamos
utilizamos ninguno
ninguno
de
delos
losoperadores
operadoresANY,
ANY,ALL,ALL, IN,
IN,EXIST,
EXIST,solamente
solamente
comparará
compararácon
conun
un valor,
valor,que
queserá
seráelelque
queobtengamos
obtengamos de delala
subconsulta
subconsulta(nunca
(nuncacon
convarios).
varios). 127
Subconsultas
Test de pertenencia a conjunto – IN
Compara un único valor de datos con una columna
de valores producida por una subconsulta
Se utiliza cuando se necesita comparar un valor de
la fila que se está examinando con un conjunto de
valores producidos por una subconsulta
El formato es prácticamente igual al de test de
conjunto simple, solo que el conjunto en lugar de
declararse explícitamente se obtiene por medio de
una subconsulta
128
Ejemplo:
Utilice el predicado IN para recuperar sólo aquellos registros de la
consulta principal para los cuales algún registro de la subconsulta
contenga un valor igual.
El siguiente ejemplo devuelve todos los productos con descuento del 25
por ciento o mayor.
Utilice
Utiliceel
elpredicado
predicadoEXISTS
EXISTS(con
(conlalapalabra
palabrareservada
reservadaopcional
opcionalNOT)
NOT)enen
comparaciones
comparacionesverdadero/falso
verdadero/falsopara
paradeterminar
determinarsisila
lasubconsulta
subconsultadevuelve
devuelve
algún
algúnregistro.
registro.
131
Subconsultas
Test de existencia – EXISTS
Conceptualmente el funcionamiento es:
SQL recorre la relación de la consulta principal y
para cada tupla de la misma realiza una
subconsulta.
La subconsulta contiene una columna con un
conjunto de valores.
Si el conjunto de valores no es vacío, el test de
existencia EXISTS devuelve TRUE, y por tanto la
tupla de la relación de la consulta principal
queda seleccionada
132
Subconsultas
Tests cuantificados – ANY
Similar al test de conjunto IN
Con los test cuantificados ANY y ALL extienden el
test de conjunto IN a los operadores de
comparación, tales como > y <.
Se utilizan conjuntamente con uno de los seis
operadores de comparación, para comparar un único
valor de test con una columna de valores, producida
por la subconsulta
Si alguna de las comparaciones individuales
devuelve TRUE, el test ANY devuelve TRUE y la fila de
la consulta principal queda seleccionada
133
Ejemplo de Tests ANY o SOME
El
Elsiguiente
siguienteejemplo
ejemplodevuelve
devuelvetodos
todoslos
losproductos
productoscuyo
cuyoprecio
preciopor unidad
porunidad
es
esmayor
mayorque
quecualquier
cualquierproducto
productovendido
vendidocon
conun
undescuento
descuentodel
del25 por
25por
ciento mayor:
cientooomayor:
135
Subconsultas
Tests cuantificados – ANY
Siempre se puede transformar una consulta
con test ANY en una consulta con test
EXISTS, trasladando la comparación al
interior de la condición de búsqueda de la
subconsulta
Esta táctica elimina errores de interpretación,
ya que el uso del test ANY puede llegar a se
un tanto oscuro
136
Ejemplo con EXISTS
SELECT
SELECT**
FROM
FROM Productos
Productos
WHERE
WHEREEXISTS
EXISTS
(SELECT
(SELECTPrecioUnidad
PrecioUnidad
FROM
FROM Detalles_pedido
Detalles_pedido
WHERE
WHEREDescuento
Descuento>=>= .25
.25AND
AND
Productos.PrecioUnidad>Detalles_pedido.PrecioUnidad);
Productos.PrecioUnidad>Detalles_pedido.PrecioUnidad);
137
Subconsultas
Tests cuantificados – ALL
El funcionamiento del test ALL es similar al del test
ANY
Si todas de las comparaciones individuales devuelve
TRUE, el test ALL devuelve TRUE y la fila de la
consulta principal queda seleccionada
Conceptualmente funciona igual que el test ANY,
salvo la necesidad que el valor comparado de la
consulta principal tiene que dar TRUE con cada
comparación con los datos obtenidos en la
subconsulta
138
Ejemplo de Tests ALL
SELECT
SELECT ** FROM
FROM Productos
Productos
WHERE
WHERE PrecioUnidad
PrecioUnidad >> ALL
ALL
(SELECT
(SELECT PrecioUnidad
PrecioUnidad
FROM
FROM Detalles_pedido
Detalles_pedido
WHERE
WHERE Descuento
Descuento >=
>= .25);
.25);
Utiliceelelpredicado
Utilice predicadoALLALLpara
pararecuperar
recuperarsólo
sólolos
losregistros
registrosde
dela
laconsulta
consulta
principal
principalquequesatisfagan
satisfaganlalacomparación
comparacióncon
contodos
todoslos
losregistros
registros
recuperados
recuperadosen enlalasubconsulta.
subconsulta.
SiSicambia
cambiaANY
ANYaaALL
ALLenenel
elejemplo
ejemploanterior,
anterior,la
laconsulta
consultadevolvería
devolveríasólo
sólo
aquellos
aquellosproductos
productoscuyo
cuyoprecio
preciopor
porunidad
unidadfuese
fuesemayor
mayorque
queelelde
detodos
todos
los
losproductos
productosvendidos
vendidoscon
conun undescuento
descuentodel
del2525por
porciento
cientooomayor.
mayor.
Esto
Estoes
esmucho
muchomás
másrestrictivo.
restrictivo. 139
Subconsultas y Composiciones
Muchas consultas realizadas mediante
subconsultas se pueden obtener también
mediante consultas multitabla.
En esos casos, las dos soluciones son
correctas
En algunos SGBD la única diferencia que se
encontrará será la diferencia de rendimiento entre
unas y otras.
Generalmente se obtiene mayor rendimiento en una
composición que con el uso de las subconsultas.
140
Subconsultas Anidadas
Del mismo modo que una consulta principal puede
hacer uso de una subconsulta, una subconsulta puede
hacer uso al mismo tiempo de otra nueva subconsulta
Esto es generalizable a los niveles que sea necesario
Lista
Listalos
losclientes
clientes(Empresa)
(Empresa)cuyos
cuyosvendedores
vendedoresestán
estánasignados
asignadosaaoficinas
oficinas
de
dela
laregión
regióndedeventas
ventasEste.
Este.
SELECT
SELECTEmpresa
Empresa
FROM
FROM Clientes
Clientes
WHERE
WHERERep_Clie
Rep_ClieININ
(SELECT
(SELECTNum_Empl
Num_Empl
FROM
FROM RepVentas
RepVentas
WHERE
WHEREOficina_Rep
Oficina_RepIN
IN
(SELECT
(SELECTOficina
Oficina
FROM
FROMOficinas
Oficinas
WHERE
WHERERegion
Region=='Este'));
'Este')); 141
Pasos para realizar la consulta anterior:
En
Eneste
esteejemplo
ejemplolalasubconsulta
subconsultamás
másinterna:
interna:
SELECT
SELECTOficina
OficinaFROM
FROMOficinas
OficinasWHERE
WHERERegión
Región==‘Este’;
‘Este’;
Nos
Nosdevuelve
devuelveuna
unauna
unacolumna
columnaquequecontiene
contienelos
losnúmeros
númerosde
deoficina
oficina
de
delas
lasoficinas
oficinasde
delalaregión
regiónEste.
Este.
La
Lasubconsulta
subconsultasiguiente:
siguiente:
SELECT
SELECTNum_Empl
Num_EmplFROM
FROMRepVentas
RepVentas
WHERE
WHEREOficina_rep
Oficina_repININ(subconsulta)
(subconsulta)
No
Nodevuelve
devuelveuna
unacolumna
columnaque
quecontiene
contienelos
losnúmeros
númerosdedeempleados
empleadosdede
los
losvendedores
vendedoresque
quetrabajan
trabajanen
enuna
unade
delas
lasoficinas
oficinasseleccionadas.
seleccionadas.
Finalmente
Finalmentela laconsulta
consultamás
másexterna:
externa:
SELECT
SELECTEmpresa
Empresa
FROM
FROMClientes
Clientes WHERE
WHERERep_Clie
Rep_ClieIN
IN(Subconsulta)
(Subconsulta)
Mostrará
Mostrarálos
losclientes
clientes(Empresa)
(Empresa)cuyos
cuyosvendedores
vendedorestienen
tienen
uno
unodedelos
losnúmeros
númerosde deempleados
empleadosseleccionados.
seleccionados.
142
Subconsultas Correlacionadas
Conceptualmente, SQL realiza una subconsulta
tantas veces como tuplas existen en la relación
obtenida por la consulta principal
Para muchas subconsultas, se producen los
mismos resultados
Cuando esto es así, las implementaciones comerciales de
servidores de BBDD tratan de evitar el repetir el cálculo
de la subconsulta, para incrementar el rendimiento
Esta optimización no se puede realizar si la subconsulta
contiene referencias externas - CORRELACIÓN
143
Subconsultas en HAVING
Además de utilizar las consultas en la cláusula
WHERE se pueden emplear igualmente en la
cláusula HAVING
Cuando una subconsulta aparece en la
cláusula HAVING, funciona como parte de la
selección de grupo de filas efectuada por la
cláusula HAVING.
Además se pueden utilizar las subconsultas en
las sentencias INSERT, DELETE, UPDATE
como veremos más adelante.
144
Actualizaciones de
bases de datos
filas
Utilidades de carga masiva de datos en la BBDD
147
Sentencia INSERT de una fila
Su sintaxis es la siguiente:
INSERT INTO
Tabla (campo1, .., campoN)
VALUES (valor1, ..., valorN)
INSERT
INSERTINTO
INTORepVentas
RepVentas
( (Num_Empl,
Num_Empl,Nombre,
Nombre,Edad,
Edad,Oficina_Rep,
Oficina_Rep,Titulo,
Titulo,Contrato,
Contrato,Director,
Director,Cuota,
Cuota,Ventas
Ventas) )
VALUES
VALUES(112,’Henry
(112,’HenryFord’,
Ford’,46,
46,13,
13,‘Dir
‘DirVentas’,
Ventas’,‘25/08/90’,
‘25/08/90’,NULL,
NULL,NULL,
NULL,0.0);
0.0);
148
Sentencia INSERT de una fila
Inserción de valores NULL:
SQL automáticamente inserta valores NULL a
aquellas columnas no incluidas en una
sentencia INSERT, a menos que esas
columnas tengan definido un valor por
defecto en la creación de la tabla
Se puede hacer explícitamente mediante la
palabra clave NULL en el área VALUES
149
Sentencia INSERT de una fila
Inserción de todas las columnas
Si se pretende insertar valores en todas las
columnas de una tabla, SQL permite omitir la
lista de los nombres de columna.
SQL supondrá que se insertan valores,
tomando las columnas en el orden en el que
se definieron
INSERT
INSERTINTO
INTORepVentas
RepVentas
VALUES
VALUES(112,’Henry
(112,’HenryFord’,
Ford’,46,
46,13,
13,‘Dir
‘DirVentas’,
Ventas’,‘25/08/90’,
‘25/08/90’,NULL,
NULL,NULL,
NULL,0.0);
0.0);
150
Crear una tabla y añadir registros
Crear
Crearla
latabla
tablaAntPedidos
AntPedidosconconlosloscampos
camposNum_pedido,
Num_pedido,
Fecha_Pedido,
Fecha_Pedido,eeImporte,
Importe,para
paraaquellos
aquellospedidos
pedidoscuya
cuyafecha
fechade
de
pedido
pedidosea
seaigual
igualoosuperior
superioralalprimer
primerdía
díadel
delaño
año1990.
1990.
SELECT Num_Pedido,Fecha_Pedido,
SELECT Num_Pedido, Fecha_Pedido,Importe
Importe
INTO
INTO AntPedidos
AntPedidos
FROM
FROM Pedidos
Pedidos
WHERE
WHERE Fecha_Pedido
Fecha_Pedido >= >= ‘01/01/90’;
‘01/01/90’;
151
Sentencia INSERT multifila
Permite añadir múltiples filas desde un
origen de datos a una tabla destino (la
tabla debe de estar creada).
No se especifican los valores a insertar,
sino que estos se obtienen a partir de la
ejecución de una sentencia SELECT
152
Sentencia INSERT multifila
Su sintaxis básica es la siguiente:
INSERT INTO
Tabla (campo1, …, campoN)
SELECT TablaOrigenX.campo1, …,
TablaOrigenZ.campoN
FROM TablaOrigenX, …, TablaOrigenZ
WHERE Condiciones_de_Selección
153
Ejemplo:
Añadir
Añadiraalalatabla
tabla AntPedidos,
AntPedidos,aquellos
aquellosde
delalatabla
tablapedidos
pedidoscuya
cuyafecha
fechade
de
pedido
pedidosea
seamenor
menoralal01-01-90
01-01-90
INSERT
INSERT INTO
INTO AntPedidos
AntPedidos
(( Num_Pedido,
Num_Pedido, Fecha_Pedido,
Fecha_Pedido, Importe
Importe ))
SELECT
SELECT Num_Pedido,
Num_Pedido, Fecha_Pedido,
Fecha_Pedido,
Importe
Importe
FROM
FROM Pedidos
Pedidos
WHERE
WHERE Fecha_Pedido
Fecha_Pedido << ‘01/01/90’;
‘01/01/90’;
154
Supresión de datos de la BBDD
Se realiza mediante la sentencia DELETE
Su sintaxis básica es la siguiente:
DELETE FROM Tabla WHERE criterio
DELETE FROM Pedidos
WHERE Fecha_Pedido < ‘15/11/89’;
Si se pretenden eliminar todos los registros de
una tabla, se prescindirá de la condición
expresada en la cláusula WHERE
Hay que tener en cuenta que un borrado en una tabla
puede desencadenar borrados en cascada en otras
tantas
155
Supresión de datos de la BBDD
Borrados con Subconsultas
En ocasiones los borrados de datos se deben
efectuar en base a datos contenidos en otras
tablas
SQL no permite utilizar composiciones en
sentencias DELETE
El modo de solucionar esta situación es por
medio de subconsultas
156
Ejemplo de borrado con subconsulta:
Suprime
Suprimelos
lospedidos
pedidosaceptados
aceptadospor
porSue
SueSmith.
Smith.
DELETE
DELETE FROM
FROM Pedidos
Pedidos
WHERE
WHERE Rep
Rep == (SELECT
(SELECT Num_Empl
Num_Empl
FROM
FROM RepVentas
RepVentas
WHERE
WHERE Nombre= 'SueSmith'
Nombre='Sue Smith');
);
157
Modificación de datos en la BBDD
UPDATE
UPDATE RepVentas
RepVentas
SET
SET Oficina_Rep
Oficina_Rep == 11,
11, Cuota
Cuota == 0.9
0.9 *Cuota
*Cuota
WHERE
WHERE Oficina_Rep
Oficina_Rep == 12;
12;
159
Modificación de datos en la BBDD
Modificaciones con Subconsultas
En ocasiones las modificaciones de datos se
deben efectuar en base a datos contenidos
en otras tablas
SQL no permite utilizar composiciones en
sentencias UPDATE
El modo de solucionar esta situación es por
medio de subconsultas
160
Vistas
Tablas virtuales
Vistas
Una vista es una consulta realizada en
SQL, cuya definición está
permanentemente almacenada en la
BBDD, y que tiene además un nombre
asignado
SQL permite acceder a los resultados de
invocar a la ‘vista’ como si se tratase de una
tabla de la BBDD
162
Vistas
Razones para utilizar las vistas:
Permiten acomodar el aspecto de una BBDD,
de modo que distintos usuarios la vean desde
diferentes perspectivas
Permiten restringir el acceso a los datos,
permitiendo que diferentes usuarios sólo vean
ciertas filas o columnas
Simplifican el acceso a la BBDD mediante la
presentación de la estructura de los datos
almacenados de manera más natural
163
Vistas
Una vista es una “tabla virtual” en la
BBDD, cuyos contenidos están definidos
por una consulta
Los datos que muestra una vista no existe en
la base de datos como un conjunto
almacenado de valores, sino que son los
resultados producidos de la ejecución de una
consulta que define a la vista.
Una vez definida la vista, se puede ejecutar
una sentencia SELECT sobre ella, como si se
tratase de una tabla
164
Creación de una Vista
Se realiza mediante la sentencia
CREATE VIEW
Su sintaxis básica es:
CREATE VIEW nombre_vista
[(col_vista [,col_vista …])]
AS SELECT …
Siendo SELECT una sentencia de selección
completa
165
Ejemplo:
Define
Defineuna
unavista
vistaque
quecontenga
contengaúnicamente
únicamentelas
lasoficinas
oficinasde
delalaregión
región“Este”,
“Este”,
cuyo
cuyonombre
nombresea
seaOficinasEste.
OficinasEste.
CREATE
CREATE VIEW
VIEW OficinasEste
OficinasEste
(Cod_Oficina,
(Cod_Oficina, Ciudad,
Ciudad, Region)
Region)
AS
AS
SELECT
SELECT OFICINA,
OFICINA, CIUDAD,
CIUDAD, REGION
REGION
FROM
FROM Oficinas
Oficinas
WHERE
WHERE Region
Region == 'Este';
'Este';
166
Vistas
Vistas Agrupadas:
La consulta para la definición de una vista
puede incluir la cláusula GROUP BY
En este caso, las vistas que se definen se
denominan Vistas Agrupadas
Una vista agrupada reúne los resultados de
una consulta agrupada en una tabla virtual,
permitiendo efectuar consultas adicionales
sobre ella.
167
Vistas
Vistas Agrupadas:
Como restricción, las vistas agrupadas no
son actualizables
Sin embargo, en los últimos SGBD, las
vistas agrupadas pueden salvar la limitación
que impone SQL sobre la anidación de
funciones
Por ejemplo, se podría calcular MIN(AVG(A))
No todos los SGBD tienen esta capacidad
168
Vistas
Vistas Compuestas:
Una de las razones más frecuentes para
utilizar vistas compuestas es simplificar las
consultas multitabla.
Se puede crear una vista compuesta que
extrae sus datos de varias tablas,
presentando los datos como si se tratase de
una única tabla virtual
169
Vistas
Actualizaciones sobre vistas:
Las reglas que impone SQL sobre las
actualizaciones de vista son muy restrictivas
Los productos comerciales suelen relajar estas
reglas, ya que en muchos casos se pueden permitir
ciertas actualizaciones que el estándar impediría.
Hay vistas que pueden soportar algunas de las
operaciones de actualización, y otras no
Hay vistas que pueden soportar actualizaciones sobre un
subconjunto de sus columnas
Las reglas de actualización de vistas dependen de
cada SGBD.
170
Vistas
Comprobación de actualizaciones sobre vistas –
WITH CHECK OPTION
Una vista actualizable puede incluir una condición
WHERE
Si se hace una inserción de un dato sobre una vista
de este tipo, quizás el dato insertado no cumpla con
la condición de selección, y por tanto después no
aparecerá en la vista
Esto se puede evitar si en la definición de la vista se
incluye al final la cláusula WITH CHECK OPTION
171
Vistas
Eliminación de una vista:
La sintaxis básica de la eliminación de una
vista es la siguiente:
DROP
DROP VIEW
VIEW NombreVista
NombreVista
172
Triggers
Disparadores
Triggers
Un trigger o disparador es una respuesta a un
evento que se produce en una BBDD, llevando
a un cambio en la información contenida en la
misma
Los eventos que se producen en una BBDD son
por tanto:
Inserciones
Borrados
Modificaciones
174
Triggers
En muchos SGBD se pueden llevar a
cabo acciones tanto antes como después
de que se lleven a cabo las acciones de
inserción, modificación o borrado
Cada SGBD incorpora su propio dialecto
de descripción de triggers
175
Desencadenadores o Triggers
Ejemplo de la Base de Datos SQL LANS
Cuando añadimos un pedido a la tabla PEDIDOS, estos
dos cambios también podrían tener lugar en la base de
datos:
La columna VENTAS del vendedor que aceptó el pedido
debería incrementarse en el importe del pedido.
El valor de EXISTENCIAS para ese producto debería disminuir
en la cantidad solicitada.
Definiendo un disparador (trigger) de nombre
NUEVOPEDIDO, haremos que estas actualizaciones de
la Base de Datos se produzcan automáticamente.
176
Triggers - SQL SERVER
Nombre del
disparador
CREATE
CREATE TRIGGER
TRIGGER NuevoPedido
NuevoPedido Tabla sobre la que actua
ON Pedidos
ON Pedidos
FOR
FOR INSERT
INSERT Se activará cuando insertamos un
AS
AS registro en la tabla Pedidos.
BEGIN
BEGIN Importe insertado en
UPDATE RepVentas
UPDATE RepVentas Pedidos
SET
SET Ventas
Ventas == Ventas
Ventas ++ INSERTED.Importe
INSERTED.Importe
WHERE insertada en
WHERE RepVentas.Num_Empl
RepVentas.Num_Empl == INSERTED.Rep;
INSERTED.Rep; Cantidad Pedidos
UPDATE Productos
UPDATE Productos
SET
SET Existencias
Existencias == Existencias
Existencias -- INSERTED.Cant
INSERTED.Cant
WHERE
WHERE Productos.Id_Fab
Productos.Id_Fab == INSERTED.Fab
INSERTED.Fab
AND
AND Productos.Id_Producto
Productos.Id_Producto == INSERTED.Producto;
INSERTED.Producto;
END;
END;
177
Para probar el disparador anterior
INSERT INTO Pedidos
(NUM_PEDIDO,FECHA_PEDIDO, CLIE,REP,FAB, PRODUCTO, CANT, IMPORTE)
VALUES (222222,'12/02/1990',2111,103,'ACI','4100X',2,100)
NOTA: Para ver los TRIGGERS en SQL SERVER. Iremos al menú y
seleccionaremos el programa:
Inicio->Programas->SQL Server->Administrador Corporativo y en la
base de datos SQL_LANS nos colocamos en la tabla Pedidos y al pulsar
el botón derecho, si elegimos la opción Diseño tabla, en la lista de
botones de arriba aparecerá un botón de desencadenadores, el cual, al
pulsarlo nos saldrá el código del desencadenador.
178
Triggers – Ejemplo integridad referencial
Este
Estedisparador
disparadorfuerza
fuerzala
laintegridad
integridadreferencial
referencialde
dela
larelación
relación
OFICINAS/REPVENTAS,
OFICINAS/REPVENTAS, yytambién
tambiénmuestra
muestraununmensaje
mensaje
cuando
cuandouna
unaactualización
actualizaciónfalla.
falla.
CREATE
CREATETRIGGER
TRIGGERActualiza_rep
Actualiza_rep Cuando hay una inserción o
ON
ONRepVentas
RepVentas un actualización en la tabla
FOR Repventas comprueba que el
FORINSERT,
INSERT,UPDATE
UPDATE
AS nº de oficina insertado sea
AS válido
IF ((SELECT COUNT(*)
IF ((SELECT COUNT(*)
FROM
FROMOFICINAS,
OFICINAS,INSERTED
INSERTED
WHERE
WHEREOFICINAS.OFICINA=INSERTED.OFICINA_REP)=0)
OFICINAS.OFICINA=INSERTED.OFICINA_REP)=0)
BEGIN
BEGIN
PRINT
PRINT'Especificado
'Especificadoun
unnumero
numerode
deoficina
oficinainvalido'
invalido'
ROLLBACK
ROLLBACKTRANSACTION
TRANSACTION
END
END
179
Ejemplo borrado en cascada
Hay algunos SGBD que no soportan la
actualización en cascada si se modifica un valor
de la clave primaria. Si embargo, esto se puede
realizar con disparadores. Por ejemplo:
El siguiente disparador propaga en cascada
cualquier actualización de la columna OFICINA
en la tabla OFICINAS a la columna
OFICINA_REP de la tabla REP_VENTAS:
180
Ejemplo borrado en cascada
CREATE
CREATETRIGGER
TRIGGERCambia_Oficina_Rep
Cambia_Oficina_Rep
ON
ONOficinas
Oficinas
FOR
FORUPDATE
UPDATE
AS
AS
IF
IFUPDATE
UPDATE(OFICINA)
(OFICINA)
BEGIN
BEGIN
UPDATE
UPDATEREPVENTAS
REPVENTAS
SET
SETREPVENTAS.OFICINA_REP=INSERTED.OFICINA
REPVENTAS.OFICINA_REP=INSERTED.OFICINA
FROM
FROMREPVENTAS,
REPVENTAS,INSERTED,
INSERTED,DELETED
DELETED
WHERE
WHEREREPVENTAS.OFICINA_REP=DELETED.OFICINA
REPVENTAS.OFICINA_REP=DELETED.OFICINA
END
END
Las
Lasreferencias
referenciasDELETED.OFICINA
DELETED.OFICINAeeINSERTED.OFICINA
INSERTED.OFICINAen enel
eldisparador
disparador
se
se refieren,
refieren,respectivamente,
respectivamente,aalos
losvalores
valoresde
dela
lacolumna
columnaOFICINA
OFICINAantes
antes
yydespués
despuésde dela
lasentencia
sentenciaUPDATE.
UPDATE.
181
Transacciones
Transacciones
Una transacción es una secuencia de una o más
sentencias SQL que juntas forman una unidad de
trabajo.
En las transacciones podemos usar las sentencias:
BEGIN TRANSACTION Para empezar la transacción
END TRANSACTION Para finalizar la transacción
SAVE TRANSACTION Para realizar un punto de Salvaguardia
COMMIT TRANSACTION ó WORK señala el final correcto de
una transacción. Informa al SGBD que la transacción está ahora
completa; todas las sentencias que forman la transacción han
sido ejecutadas y la B.D. es autoconsistente.
ROLLBACK señala el final sin éxito de una transacción. Informa
al SGBD que el usuario no desea completar la transacción ; en
vez de ello el SGBD debe deshacer los cambios efectuados a la
B.D. durante la transacción, para que la B.D. quede en el
estado en que estaba antes de ejecutar la transacción
183
Ejemplo de Transacción
BEGIN
BEGINTRANSACTION
TRANSACTION
UPDATE
UPDATEPEDIDOS
PEDIDOS
SET
SETCANTIDAD
CANTIDAD==10,
10,IMPORTE
IMPORTE=3550.00
=3550.00
WHERE
WHERENUM_PEDIDO
NUM_PEDIDO==113051
113051
UPDATE
UPDATEREPVENTAS
REPVENTAS
SET
SETVENTAS
VENTAS==VENTAS
VENTAS--1458.00
1458.00++3550.00
3550.00
WHERE
WHERENUM_EMPL
NUM_EMPL==108 108
UPDATE
UPDATEOFICINAS
OFICINAS
SET
SETVENTAS
VENTAS==VENTAS
VENTAS--1458.00
1458.00++3550.00
3550.00
WHERE
WHEREOFICINA
OFICINA==2121
UPDATE
UPDATEPRODUCTOS
PRODUCTOS
SET
SETEXISTENCIAS
EXISTENCIAS==EXISTENCIAS
EXISTENCIAS++44-10-10
WHERE
WHEREID_FAB
ID_FAB=='QSA'
'QSA'
AND
ANDID_PRODUCTO
ID_PRODUCTO=='XK47'
'XK47'
COMMIT
COMMIT WORK
WORK
184
Ejemplo
USE
USENorthWind
NorthWind
DECLARE
DECLARE @Error
@Error int
--Declaramos una variable
int que utilizaremos para almacenar un posible código de error
--Declaramos una variable que utilizaremos para almacenar un posible código de error
BEGIN
BEGINTRAN TRAN
--Iniciamos
--Iniciamoslalatransacción
transacción
UPDATE Products
UPDATE ProductsSET SETUnitPrice=20
UnitPrice=20WHERE WHEREProductName
ProductName=’Chai’
=’Chai’
--Ejecutamos la primera sentencia
--Ejecutamos la primera sentencia
SET
SET@Error=@@ERROR
@Error=@@ERROR
--Si ocurre
--Si ocurreun unerror
erroralmacenamos
almacenamossu sucódigo
códigoen en@Error
@Erroryysaltamos
saltamosmediante
medianteelel
----GOTO
GOTOalaltrozotrozodedecódigo
códigoquequedeshara
desharalalatransacción.
transacción.
IF (@Error<>0) GOTO TratarError
IF (@Error<>0) GOTO TratarError
--Si
--Silalaprimera
primerasentencia
sentenciase seejecuta
ejecutacon conéxito,
éxito,pasamos
pasamosaalalasegunda
segunda
UPDATE Products SET UnitPrice=20 WHERE ProductName=’Chang’
UPDATE Products SET UnitPrice=20 WHERE ProductName=’Chang’
SET
SET@Error=@@ERROR
@Error=@@ERROR
--Y si
--Y sihay
hayun unerror
errorhacemos
hacemoscomo comoantesantes
IF (@Error<>0) GOTO TratarError
IF (@Error<>0) GOTO TratarError
--Si
--Sillegamos
llegamoshastahastaaquí
aquíesesque
quelos losdos
dosUPDATE
UPDATEse sehan
hancompletado
completadocon
con
--éxito y podemos “guardar” la transacción en la
--éxito y podemos “guardar” la transacción en la base de datosbase de datos
COMMIT
COMMITTRAN TRAN
TratarError:
TratarError:
--Si
--Sihahaocurrido
ocurridoalgún
algúnerror
errorllegamos
llegamoshasta hastaaquí
aquí
IfIf@@Error<>0
@@Error<>0 THEN THEN
BEGIN
BEGIN
PRINT
PRINT‘Ha ‘Haecorrido
ecorridoun unerror.
error.Abortamos
Abortamoslalatransacción’
transacción’
--Se lo comunicamos al usuario y deshacemos
--Se lo comunicamos al usuario y deshacemoslalatransacción transacción
--todo volverá a estar como si nada hubiera
--todo volverá a estar como si nada hubiera ocurrido ocurrido
ROLLBACK
ROLLBACKTRAN TRAN
END
END
185
Transacciones
Como se puede ver para cada sentencia que se ejecuta
miramos si se ha producido o no un error, y si detectamos
un error ejecutamos el bloque de código que deshace la
transacción.
Hay una interpretación incorrecta en cuanto al
funcionamiento de las transacciones que esta bastante
extendida. Mucha gente cree que si tenemos varias
sentencias dentro de una transacción y una de ellas falla,
la transacción se aborta en su totalidad.
¡Nada más lejos de la realidad!
186
Transacciones
Si tenemos dos sentencias dentro de una transacción.
USE NorthWind
BEGIN TRAN
UPDATE Products SET UnitPrice=20 WHERE ProductName=’Chang’
UPDATE Products SET UnitPrice=20 WHERE ProductName=’Chang’
COMMIT TRAN
187
Procedimientos
Crear Procedimientos
CREATE
CREATEPROCEDURE
PROCEDURECli_Credito
Cli_Credito
@Credito_Inf
@Credito_Inf MONEY,
MONEY,
@Credito_Sup
@Credito_Sup MONEY
MONEY
AS
AS
SELECT
SELECT**
FROM
FROM Clientes
Clientes
WHERE
WHERELimite_Credito
Limite_Credito
BETWEEN
BETWEEN @Credito_Inf
@Credito_Inf AND
AND@Credito_Sup
@Credito_Sup
Para ejecutar el procedimiento usaremos:
EXECUTE Cli_Credito 20000 , 60000
donde Cli_Credito es el nombre del procedimiento, y 20000, 60000 los 2
parámetros que pasamos al procedimiento.
CREATE
CREATE FUNCTION
FUNCTION dbo.Cube(
dbo.Cube( @fNumber
@fNumber float)
float)
RETURNS
RETURNS float
float
AS
AS
BEGIN
BEGIN
RETURN (@fNumber**@fNumber
RETURN(@fNumber @fNumber **@fNumber)
@fNumber)
END
END
191
Función factorial
CREATE
CREATEFUNCTION
FUNCTION dbo.Factorial(
dbo.Factorial( @iNumber
@iNumber int
int))
RETURNS
RETURNSINT
INT
AS
AS
BEGIN
BEGIN
DECLARE
DECLARE@i
@iint
int
IF
IF@iNumber
@iNumber <=
<= 11
SET
SET @i
@i== 11
ELSE
ELSE
SET
SET @i
@i== @iNumber
@iNumber ** dbo.Factorial(@iNumber
dbo.Factorial(@iNumber --11))
RETURN
RETURN(@i)
(@i)
END
END
192
Función con una tabla
CREATE
CREATE FUNCTION
FUNCTION
dbo.AuthorsForState(@cState
dbo.AuthorsForState(@cState char(2)
char(2) ))
RETURNS
RETURNS TABLE
TABLE
AS
AS
RETURN
RETURN (SELECT
(SELECT ** FROM
FROM Authors
Authors
WHERE
WHERE state
state == @cState)
@cState)
193
Seguridad SQL
Seguridad SQL
La seguridad es especialmente importante en
un SGBD basado en SQL, ya que SQL permite
hacer especialmente sencillo el acceso a la
información contenida en las BBDD
Los requerimientos de los sistemas en
producción son muchos y muy variados, pero
por resumir, algunos de ellos pueden ser en lo
referente a SQL:
195
Seguridad SQL
Los datos de cualquier tabla deberían ser accesible
sólo a un conjunto de usuarios, no a todos
Sólo algunos usuarios deben tener derecho de
actualización de datos en una tabla en particular
Para algunas tablas, el acceso debería estar
restringido en base a las columnas
Algunos usuarios deberían tener denegado el acceso
mediante SQL interactivo, pero permitirles utilizar
aplicaciones que utilicen tales tablas
196
Seguridad SQL
Los usuarios son los actores de la BBDD
Cada vez que el SGBD hace una operación sobre los
datos, lo hace en nombre de algún usuario
El SGBD deberá actuar en consecuencia con los
permisos que tal usuario tenga según la operación
empleada y los datos afectados
Cada SGBD tiene su propia implementación de
los procesos de seguridad.
197
Vistas y Seguridad SQL
Las vistas juegan un papel esencial en la
seguridad:
Definiendo una vista y proporcionando un
permiso de usuario para acceder a ella, pero
no a sus tablas fuente, se puede permitir el
acceso de un usuario únicamente a las
columnas y filas seleccionadas.
198
Privilegios
El estándar SQL-1 especifica cuatro
privilegios para tablas y vistas:
SELECT
INSERT
DELETE
UPDATE
199
Concesión de Privilegios
Cláusula GRANT
Su sintaxis básica es:
GRANT <privilegios> ON
{nombre_tabla | nombre_vista} TO
{PUBLIC | usuario, …, usuario
[WITH GRANT OPTION]}
Siendo <privilegios>:
ALL [PRIVILEGES] |
{ SELECT |
DELETE |
INSERT |
UPDATE [(col [, col …])]]
200
Revocación de Privilegios
Cláusula REVOKE
Su sintaxis básica es:
REVOKE <privilegios> ON
{nombre_tabla | nombre_vista} FROM
{PUBLIC | usuario, …, usuario}
Siendo <privilegios>:
ALL [PRIVILEGES] |
{ SELECT |
DELETE |
INSERT |
UPDATE [(col [, col …])]]
201
Crea un inicio de sesión
de servidor denominado
Crear un usuario “Pepe” con una
contraseña
202
Crear usuario
CREATE USER nom_usuario1 contraseña,
nom_usuario2 contraseña, …
203
Cambiar el nombre de usuario
USE BD_FACTURA;
ALTER USER Pepe WITH NAME = Jose;
GO
204
Borra un usuario
USE BD_FACTURA;
DROP USER Jose;
GO
205
Crear un grupo de usuarios
206
Añadir usuarios a un grupo
ADD USER nom_usuario [,nom_usuario,..] TO nom_grupo
207
Borra un grupo
DROP GROUP nom_grupo
208
Borra un usuario
DROP USER nom_usuario1, nom_usuario2, …[FROM nom_grupo]
209
Cambia contraseña del usuario
ALTER USER nom_usuario
PASSWORD contraseña_nueva contraseña_anterior
210
Cambia la contraseña de la base
de datos
ALTER DATABASE PASSWORD contraseña_nueva contraseña_anterior
211