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 ;
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;
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.
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
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”.
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