sql presentacion
TRANSCRIPT
SISTEMAS GESTORES DE BASES DE DATOS
I.E.S. MARCOS ZARAGOZA
SQL
3
INTRODUCCIÓN
SQL fue desarrollado inicialmente por IBM como lenguaje de consulta de su SGBD DB2, en 1970
Es un lenguaje no procedimental (indica qué datos se desea manipular, pero no de qué manera hacerlo)
Hay dos organizaciones, ANSI e ISO que tratan de favorecer la estandarización del lenguaje, no obstante, cada fabricante de SGBDs aporta sus propias características
4
INTRODUCCIÓN
SQL significa Structured Query Language (Lenguaje Estructurado de Consulta)
SQL incluye soporte para los lenguajes:DDL: Lenguaje de Definición de Datos.DML: Lenguaje de Manipulación de Datos.DCL: Lenguaje de Control de Datos.
SQL no se limita únicamente a realizar consultas sobre los datos almacenados
5
INTRODUCCIÓN
SQL permite: Definición de datos Recuperación de datos Manipulación de datos
Altas, Bajas y Modificaciones
Control de acceso a datos Compartición de datos entre usuarios concurrentes Integridad de datos
6
INTRODUCCIÓN Características:
Independencia entre proveedores Portabilidad Estandarización SQL Fundamento relacional Estructura de alto nivel similar al inglés Consultas interactivas Acceso a bases de datos desde lenguajes de
programación Múltiples vistas de datos Arquitectura cliente/servidor
7
Reglas del SQL ANSI
Carácter coincidente Access SQL ANSI SQL
Un carácter cualquiera ? _ (subrayado)
Cero o más caracteres * %
El estándar ANSI/ISO especifica que:
Los nombres SQL deben contener de 1 a 18 caracteres, comenzar con una letra, y que no pueden contener espacios o caracteres de puntuación especiales, exceptuando el guión de subrayado.
8
Nombres de tabla y de columna
Pepe.Productos: Hace referencia a la tabla Productos de la que el usuario Pepe es propietario.
Productos.Clave: Hace referencia al atributo Clave de la tabla Productos. Es necesario poner el alias de la tabla cuando hay atributos en distintas tablas que tienen el mismo nombre.
9
Constantes
Numéricas: Se escriben directamente. Por ejemplo:Real: 234,45.Entero: 234
Alfanuméricas: Se escriben entre comillas preferentemente simples.
Fechas: Se escriben entre comillas preferentemente simples.
10
Componentes de SQL
El lenguaje SQL está compuesto por:ComandosCláusulasOperadoresFunciones de agregado
11
Sentencias DDL
Comando Descripción
CREATE Para crear nuevas tablas, campos e índices
DROP Para eliminar tablas e índices
ALTER Para modificar las tablas agregando campos o cambiando la definición de los campos.
12
Sentencias DML SELECT Para consultar registros de la base de
datos que satisfagan un criterio determinado
INSERT Para cargar lotes de datos en la base de datos en una única operación.
UPDATE Para modificar los valores de los campos y registros especificados
DELETE Para eliminar registros de una tabla de una base de datos
13
Cláusulas
FROM Para especificar la tabla de la cual se van a seleccionar los registros
WHERE Para especificar las condiciones que deben reunir los registros que se van a seleccionar
GROUP BY Para separar los registros seleccionados en grupos específicos
HAVING Para expresar la condición que debe satisfacer cada grupo
ORDER BY Para ordenar los registros seleccionados de acuerdo con un orden específico
14
Operadores Lógicos
Operador Uso
AND “Y" lógico. Evalua dos condiciones y devuelve un valor de verdad sólo si ambas son ciertas.
OR “O" lógico. Evalúa dos condiciones y devuelve un valor de verdar si alguna de las dos es cierta.
NOT Negación lógica. Devuelve el valor contrario de la expresión.
15
Operadores de comparación< Menor que
> Mayor que
<> Distinto de
<= Menor ó Igual que
>= Mayor ó Igual que
= Igual que
BETWEEN Utilizado para especificar un intervalo de valores.
LIKE Utilizado en la comparación de un modelo
IN Utilizado para especificar registros de una base de datos
16
Funciones de agregado
AVG Utilizada para calcular el promedio de los valores de un campo determinado
COUNT Utilizada para devolver el número de registros de la selección
SUM Utilizada para devolver la suma de todos los valores de un campo determinado
MAX Utilizada para devolver el valor más alto de un campo especificado
MIN Utilizada para devolver el valor más bajo de un campo especificado
17
Tipos de datos estándar (I)Tipo de Datos Tamañ
oDescripción
BINARY 1 byte Para consultas sobre tabla adjunta de productos de bases de datos que definen un tipo de datos Binario.
BIT 1 byte Valores Si/No ó True/False
BYTE 1 byte Un valor entero entre 0 y 255.
COUNTER(Autonumérico)
4 bytes Un número incrementado automáticamente (de tipo Long)
CURRENCY(Moneda)
8 bytes Un entero escalable entre 922.337.203.685.477,5808 y 922.337.203.685.477,5807.
18
Tipos de datos estándar (II)Tipo de Datos
Tamaño Descripción
DATETIME 8 bytes Un valor de fecha u hora entre los años 100 y 9999.
SINGLE 4 bytes Un valor en punto flotante de precisión simple con un rango de -3.402823*1038 a -1.401298*10-45 para valores negativos, 1.401298*10-45 a 3.402823*1038 para valores positivos, y 0.
DOUBLE 8 bytes Un valor en punto flotante de doble precisión con un rango de -1.79769313486232*10308 a -4.94065645841247*10-324 para valores negativos, 4.94065645841247*10-324 a 1.79769313486232*10308 para valores positivos, y 0.
19
Tipos de datos estándar (III)Tipo de Datos Tamaño Descripción
SHORT 2 bytes Un entero corto entre -32,768 y 32,767.
LONG óINTEGER
4 bytes Un entero largo entre -2,147,483,648 y 2,147,483,647.
LONGTEXT 1 byte por carácter
De cero a un máximo de 1.2 gigabytes.(MEMO)
LONGBINARY Según se necesite
De cero 1 gigabyte. Utilizado para objetos OLE.
TEXTCHAR
1 byte por carácter
De cero a 255 caracteres
VARCHAR 1 byte por carácter
Longitud variable
20
Sinónimos de tipos de datos (I)Tipo de Dato Sinónimos
BINARY VARBINARY
BIT BOOLEAN LOGICAL LOGICAL1 YESNO
BYTE INTEGER1
COUNTER AUTOINCREMENT
CURRENCY MONEY
DATETIME DATE TIME TIMESTAMP
21
Sinónimos de tipos de datos (II)
Tipo de Dato Sinónimos
SINGLE FLOAT4 IEEESINGLE REAL
DOUBLE FLOAT FLOAT8 IEEEDOUBLE NUMBER NUMERIC
SHORT INTEGER2 SMALLINT
22
Sinónimos de tipos de datos (III)Tipo de Dato Sinónimos
LONG INT INTEGER INTEGER4
LONGBINARY GENERAL OLEOBJECT
LONGTEXT LONGCHAR MEMO NOTE
TEXT ALPHANUMERIC CHAR CHARACTER STRING VARCHAR
Creación de bases de datos
24
El lenguaje DDL Además de la manipulación de datos, que
se realiza por medio del lenguaje DML, con SQL se puede definir la propia estructura de la Base de Datos
Esto se realiza mediante el DDL Así como el DML está bastante
estandarizado, respecto al DDL, va a haber muchas dependencias respecto al SGBD que se esté utilizando
25
El lenguaje DDL El núcleo del DDL está basado en tres
cláusulas de SQLCREATE, que define y crea un objeto de la
base de datosDROP, que elimina un objeto existente en la
base de datosALTER, que modifica la definición de un
objeto de la base de datos
26
Creación y borrado de una BBDD
Dependiendo del SGBD utilizado, puede variar:CREATE DATABASE Nombre_de_la_Base_de_Datos
Crea una base de datos con el nombre indicado.
DROP DATABASE Nombre_de_la_Base_de_Datos Borra una Base de Datos que previamente está cerrada (CLOSE).
USE Nombre_de_la_Base_de_Datos Abre la base de datos.
27
Se realiza mediante la sentencia CREATE TABLE.La sintaxis básica es la siguiente:
CREATE TABLE nombre_tabla
(
atributo tipo(tamaño)[DEFAULT valor] [Índice], [NOT NULL]
atributo …… , atributo ……
);
Creación de una tabla
28
Creación de una tablanombre_tabla: Es el nombre que tomará la
tabla en la BBDDatributo: Es el nombre de una de las
columnas. En la definición de la tabla se pueden crear tantas
columnas como sea necesario El nombre de columna debe empezar por un carácter
alfabético
tipo(tamaño): es la indicación del tipo de dato que la columna podrá contener y su longitud.
29
Creación de una tablacláusula_defecto: indica el valor de
defecto que tomará la columna si no se le asigna uno explícitamente en el momento en que se crea la línea.
La sintaxis que hay que usar es la siguiente:DEFAULT { valor | NULL }
vínculos_de_columna: son vínculos de integridad que se aplican a cada atributo concreto. Pueden ser:
NOT NULL, que indica que la columna no puede tomar el valor NULL.
30
Creación de una tabla vínculos_de_columna: (continuación)
PRIMARY KEY, que indica que la columna es la clave primaria de la tabla.
UNIQUE: indica que no se admiten duplicados para ese campo
Una definición de referencia (clave ajena) con la forma:REFERENCES Nom_tabla(clave)
[ON DELETE {NO ACTION | CASCADE | SET DEFAULT | SET NULL }]
[ON UPDATE {NO ACTION | CASCADE | SET DEFAULT | SET NULL }]
31
Creación de una tablaví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_referenciapara crear claves ajenas de más de una columna
32
Creación de una tabla en InformixEjemplos:
CREATE TABLE Publicacion (ID INTEGER PRIMARY KEY,Tipo CHAR(18) NOT NULL);
CREATE TABLE Libro (ID INTEGER PRIMARY KEY REFERENCES Publicacion(ID),Titulo VARCHAR(160) NOT NULL,Editor INTEGER NOT NULL REFERENCES Editor(ID),Volumen VARCHAR(16),Serie VARCHAR(160),Edicion VARCHAR(16),Mes_publicacion CHAR(3),Anyo_publicacion INTEGER NOT NULL,Comentario VARCHAR(255));
CREATE TABLE Autor (IDPublicacion INTEGER REFERENCES Publicacion(ID),IDPersona INTEGER REFERENCES Persona(ID),PRIMARY KEY (IDPublicacion, IDPersona));
33
Ejemplo de creación de tabla:
CREATE TABLE Colegios( Num_Colegio INTEGER NOT NULL PRIMARY KEY, Nombre CHAR(30), Fecha_Nac DATETIME);O bien:
CREATE TABLE Colegios( Num_Colegio INTEGER NOT NULL, Nombre CHAR(30), Fecha_Nac DATETIME, CONSTRAINT PK_Cole PRIMARY KEY (Num_Colegio)
);
34
Definir claves al final de la tabla
Definir clave principal: CONSTRAINT PK_Nom_tabla_indices
PRIMARY KEY (Atributos_clave_principal)
Definir clave ajena:CONSTRAINT FK_Nom_tabla_indices
FOREIGN KEY (atributo1[, atributo2...]) REFERENCES
Nom_tabla(Atributos_clave) [ON DELETE
{NO ACTION | CASCADE | SET DEFAULT | SET NULL }]
[ON UPDATE
{NO ACTION | CASCADE | SET DEFAULT | SET NULL }]
35
Ejemplo creación de tabla con clave compuesta:
CREATE TABLE Empleados ( Nombre CHAR(15), Apellidos CHAR(35), Fecha_Nac DATETIME,
Telef CHAR(9), CONSTRAINT PK_Emple
PRIMARY KEY (Apellidos, Nombre, Fecha_Nac));
36
Ejemplo de definición de una clave ajena I
CREATE TABLE Clientes
(IDCliente INTEGER NOT NULL,
Nom CHAR(15) NOT NULL,
Apel CHAR(35) NOT NULL,
CONSTRAINT PK_Clie PRIMARY KEY (IDCliente)
);
37
Ejemplo de definición de una clave ajena
CREATE TABLE Pedidos( IDPedido INTEGER PRIMARY KEY, IDCliente INTEGER, NotasPedido CHAR(50), CONSTRAINT FK_Pedido_Cliente
FOREIGN KEY (IDCliente) REFERENCES Clientes(IDCliente)
ON UPDATE CASCADEON DELETE CASCADE
);
38
Definición de una clave única
CREATE TABLE Sucursal ( Num_Suc CHAR(2) NOT NULL,
Ciudad CHAR(20) NOT NULL,Zona CHAR(8) NOT NULL, Director CHAR(3) NOT NULL, Objetivo_Año INTEGER NOT NULL, CONSTRAINT PK_Sucur PRIMARY KEY(Num_Suc), CONSTRAINT SK_ciu UNIQUE(Ciudad), CONSTRAINT FK_emple
FOREIGN KEY(Director) REFERENCES INFEMPLE(Num_Emple));
39
Borrado de una tabla Se especifica mediante la sentencia:
DROP TABLE nombre_de_tabla La sentencia puede fallar si hay reglas de
integridad referencial que impidan el borrado de datos de tal tabla, y por tanto también impiden el borrado de la propia tabla
DROP TABLE Empleados; DROP TABLE Empleados;
40
Modificación de tablas
Permite básicamente las siguientes operaciones:Añadir nuevas columnas a una tablaEliminar columnas de una tablaModificar las definiciones de campo de una
tabla (no todos los SGBD permiten esta operación)
Crear restricciones de integridadEliminar restricciones de integridad
41
Modificación de tablas Adición de una nueva columna:
ALTER TABLE nombre_tabla ADD nombre_col definición_col La definición de la columna sigue la misma sintaxis
que se ha visto en el apartado relativo a la instrucción CREATE TABLE.
ALTER TABLE Empleados ADD COLUMN Salario CURRENCY; ALTER TABLE Empleados ADD COLUMN Salario CURRENCY;
42
Modificación de tablas
Eliminación de una columna de la tabla
ALTER TABLE nombre_tabla DROP nombre_columnaHay que tener en cuenta que puede haber
reglas de integridad definidas que impidan la eliminación de una columna de una tabla
ALTER TABLE Empleados DROP COLUMN Salario; ALTER TABLE Empleados DROP COLUMN Salario;
43
Modificación de tablas
Modificación de una columna de la tabla (Interbase)
ALTER TABLE nombre_tabla ALTER COLUMN nombre_columna TO nuevo_nombre_columna tipo_datos
ALTER TABLE Empleados ALTER COLUMN Nom TO Nombre CHAR(25); ALTER TABLE Empleados ALTER COLUMN Nom TO Nombre CHAR(25);
ALTER TABLE Empleados ALTER COLUMN Nom CHAR(40); ALTER TABLE Empleados ALTER COLUMN Nom CHAR(40);
44
Modificación de tablas Creación de una Restricción
ALTER TABLE nombre_tabla ADD [CONSTRAINT nombre_restricción] {{PRIMARY KEY | UNIQUE} (col [, col …]) | FOREIGN KEY (col [, col …]) REFERENCES otra_tabla [(otra_col [,otra_col …])] [ON DELETE {NO ACTION|CASCADE|SET DEFAULT|SET NULL}] [ON UPDATE {NO ACTION|CASCADE|SET DEFAULT|SET NULL}] | CHECK (condición)}
45
Modificación de tablas
Eliminación de una Restricción (tabla de índices de una clave principal, única o ajena):
ALTER TABLE nombre_tabla DROP CONSTRAINT nombre_restricción
ALTER TABLE Empleados DROP CONSTRAINT FK_Emple; ALTER TABLE Empleados DROP CONSTRAINT FK_Emple;
46
Índices Un índice es una estructura que proporciona un
acceso rápido a las filas de una tabla en función a los valores de una o más columnas
La presencia o ausencia de un índice es transparente al usuario de SQL sólo que: Con un índice sobre un campo se consigue mayor
rendimiento en la ordenación y búsqueda sobre el mismo
Los índices van a ocupar espacio físico de almacenamiento en el sistema de archivos donde se ubica la BBDD.
47
Índices Será conveniente crear índices en
aquellas columnas de una tabla que son utilizadas frecuentemente en condiciones de búsqueda y ordenación.La indexación también se considera más
adecuada cuando la BBDD se emplea más para consultas que para la actualización de datos
El SGBD siempre creará un índice para la clave primaria de cada tabla
48
Índices Creación de índices:
Su sintaxis básica es la siguiente:
CREATE [UNIQUE] [ASC | DESC] INDEX nombre_indice ON nom_tabla (col [, col …]);
CREATE UNIQUE INDEX SK_calle_num ON BloqueCasas (calle, numero) WITH DISALLOW NULL;
CREATE UNIQUE INDEX SK_calle_num ON BloqueCasas (calle, numero) WITH DISALLOW NULL;
49
Índices Eliminación de índices:
Su sintaxis básica es la siguiente:
DROP INDEX nombre_indice;
DROP INDEX SK_calle_num;DROP INDEX SK_calle_num;
DROP INDEX SK_calle_num ON BloqueCasas ;DROP INDEX SK_calle_num ON BloqueCasas ;
50
Base de datos Catastro
51
Definir una relación 1:1 CREATE TABLE BloqueCasas( calle TEXT(30) NOT NULL, numero SHORT NOT NULL, metros_b SHORT, od_bloque LONG, CONSTRAINT PK_blo PRIMARY KEY (calle, numero),); Para crear una relación 1 a 1 debemos definir laclave ajena de esta
manera: CREATE UNIQUE INDEX SK_calle_num
ON BloqueCasas (calle, numero) WITH DISALLOW NULL;
ALTER TABLE BloqueCasas ADD CONSTRAINT FK_blo_vi FOREIGN KEY (calle, numero)
REFERENCES Vivienda(calle, numero) ON DELETE CASCADE;
52
Creación BD “SQL_LANS”
53
Esquema de la BD en SQL Server
54
Ejemplo de creación de una BD
CREATE DATABASE SQL_LANS; USE SQL_LANS;
CREATE TABLE CLIENTES ( NUM_CLIE INT NOT NULL, EMPRESA CHAR(20) NOT NULL, REP_CLIE INT NOT NULL, LIMITE_CREDITO FLOAT NOT NULL );
55
Ejemplo de creación de una BD CREATE TABLE OFICINAS ( OFICINA INT NOT NULL, CIUDAD CHAR(15) NOT NULL, REGION CHAR(10) NOT NULL, DIR INT NOT NULL, OBJETIVO FLOAT NOT NULL, VENTAS FLOAT NOT NULL );
CREATE TABLE PEDIDOS ( NUM_PEDIDO INT NOT NULL, FECHA_PEDIDO DATETIME NOT NULL, CLIE INT NOT NULL, REP INT, FAB CHAR(3) NOT NULL, PRODUCTO CHAR(5) NOT NULL, CANT INT NOT NULL, IMPORTE FLOAT NOT NULL );
56
Ejemplo de creación de una BD CREATE TABLE PRODUCTOS ( ID_FAB CHAR(3) NOT NULL, ID_PRODUCTO CHAR(5) NOT NULL, DESCRIPCION CHAR(20) NOT NULL, PRECIO FLOAT NOT NULL, EXISTENCIAS INT NOT NULL );
CREATE TABLE REPVENTAS ( NUM_EMPL INT NOT NULL, NOMBRE CHAR(15) NOT NULL, EDAD SMALLINT NOT NULL, OFICINA_REP INT NOT NULL, TITULO CHAR(10) NOT NULL, CONTRATO DATETIME NOT NULL, DIRECTOR INT NOT NULL, CUOTA FLOAT NOT NULL, VENTAS FLOAT NOT NULL );
57
Definición de las claves principales USE SQL_LANS;
ALTER TABLE Clientes ADD CONSTRAINT PK_Clie PRIMARY KEY
(NUM_CLIE);
ALTER TABLE Oficinas ADD CONSTRAINT PK_OficinasPRIMARY KEY (OFICINA);
ALTER TABLE Pedidos ADD CONSTRAINT PK_Pedidos PRIMARY KEY (NUM_PEDIDO);
ALTER TABLE Productos ADD CONSTRAINT PK_ProductosPRIMARY KEY (ID_FAB, ID_PRODUCTO);
ALTER TABLE Repventas ADD CONSTRAINT PK_Repventas PRIMARY KEY (NUM_EMPL);
58
Definición de las claves ajenas USE SQL_LANS;
ALTER TABLE Clientes ADD CONSTRAINT FK_Clientes_RepVentas FOREIGN KEY (REP_CLIE) REFERENCES RepVentas(NUM_EMPL) ON DELETE SET NULL;
ALTER TABLE Oficinas ADD CONSTRAINT FK_Oficinas_RepVentas FOREIGN KEY (DIR) REFERENCES RepVentas(NUM_EMPL) ON DELETE SET NULL;
ALTER TABLE Pedidos ADD CONSTRAINT FK_Pedidos_Repventas FOREIGN KEY (REP) REFERENCES RepVentas(NUM_EMPL) ON DELETE SET NULL;
ALTER TABLE Pedidos ADD CONSTRAINT FK_Pedidos_Productos FOREIGN KEY (FAB,PRODUCTO) REFERENCES Productos(ID_FAB,ID_PRODUCTO) ON DELETE RESTRICT;
ALTER TABLE Pedidos ADD CONSTRAINT FK_Pedidos_Clientes FOREIGN KEY (CLIE) REFERENCES Clientes(NUM_CLIE) ON DELETE CASCADE;
ALTER TABLE RepVentas ADD CONSTRAINT FK_Repventas_Oficinas FOREIGN KEY (OFICINA_REP) REFERENCES Oficinas(OFICINA) ON DELETE SET NULL;
ALTER TABLE RepVentas ADD CONSTRAINT FK_Repventas_RepVentas FOREIGN KEY (DIRECTOR) REFERENCES RepVentas(NUM_EMPL) ON DELETE SET NULL;
59
Borrar claves ajenas USE SQL_LANS;
#DROP INDEX FK_Clientes ON Clientes; #DROP INDEX FK_Oficinas ON Oficinas; #DROP INDEX FK_Pedidos_Repventas ON Pedidos; #DROP INDEX FK_Pedidos_Productos ON Pedidos; #DROP INDEX FK_Pedidos_Clientes ON Pedidos; #DROP INDEX FK_RepVentas_Oficinas ON RepVentas; #DROP INDEX FK_RepVentas_RepVentas ON RepVentas;
ALTER TABLE Clientes DROP CONSTRAINT FK_Clientes; ALTER TABLE Pedidos DROP CONSTRAINT FK_Pedidos_Repventas; ALTER TABLE Pedidos DROP CONSTRAINT FK_Pedidos_Productos; ALTER TABLE Pedidos DROP CONSTRAINT FK_Pedidos_Clientes; ALTER TABLE Repventas DROP CONSTRAINT FK_RepVentas_Oficinas; ALTER TABLE Repventas DROP CONSTRAINT FK_RepVentas_RepVentas;
60
Borrar claves principales
DROP INDEX PK_Clie ON Clientes; DROP INDEX PK_Oficinas ON Oficinas; DROP INDEX PK_Pedidos ON Pedidos; DROP INDEX PK_Productos
ON Productos; DROP INDEX PK_Repventas
ON Repventas;
61
Borrar tablas de la BD
USE SQL_LANS;
DROP TABLE CLIENTES;
DROP TABLE OFICINAS;
DROP TABLE PEDIDOS;
DROP TABLE PRODUCTOS;
DROP TABLE REPVENTAS;
Consultas simples
63
Sentencia SELECT La sentencia SELECT recupera datos de una
base de datos y los devuelve en forma de una relación
La sentencia SELECT puede llegar a constar de hasta seis cláusulas SELECT FROM WHERE GROUP BY HAVING ORDER BY
64
Sentencia SELECT SELECT
Lista los datos a recuperar. Se pueden recuperar todas las columnas empleando
el carácter asterisco (“*”). Pueden ser datos contenidos en las tablas de la base
de datos o bien especificarse operaciones para realizar cálculos (campos calculados).
Puede ser una constante. Ejemplo: ‘Total igual a ‘. FROM
Indica la lista de tablas que contienen los datos a recuperar.
Los datos pueden proceder de más de una tabla
65
Sentencia SELECT WHERE
Se emplea para dar una condición de búsqueda para especificar las filas deseadas
GROUP BY Se emplea en consultas de resumen. Se verá en detalle más
adelante HAVING
Indica una condición de selección solbre los grupos producidos por GROUP BY. Se verá en detalle más adelante
ORDER BY Permite ordenar los resultados de la consulta a través de una o
de varias columnas, ascendente o descendentemente, a través de las cláusulas ASC (por defecto) y DESC
66
Sentencia SELECT Algunos ejemplos de consultas SELECT
SELECT Apellidos, Salario FROM Empleados WHERE Salario > 21000;
SELECT Id_Producto, Existencias FROM ProductosWHERE Existencias <= Nuevo_Pedido; SELECT * FROM Pedidos WHERE Fecha_Envio = ´05/10/94’;
SELECT Apellidos, Nombre FROM EmpleadosWHERE Apellidos = 'King';
67
Sentencia SELECT Eliminación de duplicados:
Si en las consultas de selección se incluye una clave primaria, el modelo relacional asegura que en los resultados no se van a producir duplicados.
Si no se incluye una clave primaria, se puede forzar la eliminación de duplicados incluyendo la cláusula DISCTINCT antes de la lista de campos.
Ejemplo:
SELECT DISTINCT Nom_Proveedor
FROM Pedidos;
68
Cláusula WHERE
Consta de la palabra clave WHERE seguida de una condición de búsqueda.
Conceptualmente, SQL recorre cada fila de la relación seleccionada y aplica a cada tupla la condición de búsqueda.En la aplicación de la condición se pueden
producir los siguientes resultados:
69
Cláusula WHERE
1. Si la condición de búsqueda da como resultado CIERTO la tupla se incluye en la relación resultado
2. Si la condición de búsqueda da FALSO la tupla se excluye de la relación resultado
3. Si la condición de búsqueda da QUIZÁS la tupla se excluye de la relación resultado
70
Cláusula WHERE Para realizar las búsquedas, SQL cuenta con
distintos tipos de condiciones, que facilitan la expresividad y naturalidad en las selecciones
Los predicados estándar son: Test de comparación Test de rango Test de pertenencia a un conjunto Test de correspondencia a un patrón Test de valor nulo
71
Cláusula WHERE TEST DE COMPARACIÓN
Se emplean en él los operadores de comparación habituales=, <>, <, <=, >, >=
TEST DE RANGO - BETWEEN Comprueba si un dato se encuentra entre dos
valores Se indica mediante el nombre de campo a
comprobar, a continuación la palabra reservada BETWEEN, y los dos valores extremos del intervalo separados por la palabra AND.
Ej: SELECT Nom, Dir FROM Empleados WHERE Sueldo BETWEEN 1000 AND 2000
72
Cláusula WHERE TEST DE PERTENENCIA A CONJUNTO – IN
Comprueba si un valor de dato coincide con uno de la lista de valores objetivo proporcionada.
Ejemplo:SELECT *FROM Pedidos WHERE Provincia In ('Madrid',
'Barcelona', 'Sevilla');
73
Cláusula WHERE TEST DE CORRESPONDENCIA CON
PATRÓN – LIKE Se emplea en la comparación de Cadenas
de Caracteres Comprueba si el valor de la columna
indicado se ajusta al patrón especificado Para especificar un patrón se emplean los
caracteres comodín.
74
Cláusula WHERE
Los caracteres comodín son los siguientes:
% (tanto por ciento) Corresponde con una
secuencia de cero o más caracteres [Equivale al
comodín “*” de MS-DOS]
_ (carácter de subrayado) Corresponde con
un único carácter, y sólo uno [Equivale el
comodín ? de MS-DOS]
75
Ejemplo de patrón LIKE
Consulta que muestra el código y el nombre de los empleados cuyo apellido empiece por “L”.
SELECT Codigo, Nombre
FROM Empleados
WHERE Apellidos LIKE ‘L%’;
76
Cláusula WHERE TEST DE VALOR NULO – IS NULL
Para seleccionar las tuplas en las que cierto atributo toma un valor nulo hay que hacerlo mediante la comparación IS NULL
Un error típico cometido en SQL es tratar de hacer una comparación del tipo CAMPO = NULL
Esta comparación en realidad lo que hace es tratar de buscar un literal NULL que no es lo mismo que la falta de dato que indica el valor nulo del modelo relacional.
Ejemplo: SELECT * FROM Empleados
WHERE Sueldo IS NULL;
77
Condiciones compuestas Utilizando las reglas de la lógica se pueden combinar
condiciones de selección simples para formar otras complejas.
Para ello se pueden utilizar las palabras reservadas
AND (Y lógica) OR (O lógica) NOT (Negación lógica)
Ejemplo: SELECT Apell, Nom
FROM Empleados WHERE Sueldo>1000 AND Nom=‘Juan’;
78
Ordenaciones Si no se especifica ninguna opción, los resultados
devueltos por SQL quedarán ordenados por los índices definidos en las tablas.
Se puede especificar el orden en que se desean recuperar los registros de las tablas mediante la cláusula:
ORDER BY Lista de Campos [ASC | DESC] ORDER BY posición del campo en el SELECT Ejemplo: SELECT Nom, Apell FROM Empleados
ORDER BY Apell, Nom;
O bien: ORDER BY 2,1
79
Ordenaciones Por omisión SQL ordena los datos en
secuencia ascendente (ASC) Para ordenar en secuencia descendente se
puede emplear la palabra clave DESC Si se quiere realizar una ordenación en base a
un campo calculado, como será un campo no presente en la BBDD, y por tanto no tiene nombre, se debe emplear el número de columna según aparece en la definición de la consulta
80
Consulta con expresión:
Consulta que muestra los empleados nacidos en 1990 con el sueldo aumentado un 20%.
SELECT Nom, Apell, Sueldo*1,20 AS Nuevo_Sueldo
FROM Empleados WHERE YEAR(Fecha_Nac)=1990 AND
MONTH(Fecha_Nac)=6 ANDSueldo IS NOT NULL;
81
Consultas con funciones de agregado
Consulta que nos muestra el total y la media de los sueldos de los empleados:
SELECT SUM(Sueldo) AS Total_Sueldos, AVG(Sueldo) AS Media_Sueldo
FROM Empleados; Podemos usar las siguientes funciones de
agragado: SUM(), AVG(), MAX(), MIN(), COUNT().
82
Uniones SQL permite realizar la unión de dos consultas
Operación UNION del álgebra relacional
Para ello será imprescindible que las relaciones origen sean compatibles
Para realizar una unión, se utiliza la cláusula UNION intercalada entre dos sentencias SELECT
Las sentencias SELECT no pueden ser ordenadas, pero sí el resultado de la unión
83
Uniones Por omisión, en la unión de dos
relaciones se eliminan las tuplas duplicadas.
Si se quiere alterar el comportamiento normal de la unión, forzando el que no se eliminen los duplicados, se puede emplear la cláusula ALL inmediatamente después de la cláusula UNION
84
Ejemplo de consulta union:
SELECT ID_Fab, ID_ProductoFROM ProductosWHERE Precio > 2000.00
UNION [ALL]SELECT DISTINCT Fab, ProductoFROM PedidosWHERE Importe > 30000.00ORDER BY 1,2;
Consultas Multitabla
Consultas con dos o más tablas
86
Consultas Multitabla SQL permite recuperar datos
procedentes de dos o más tablas de una base de datos, generando nuevas relaciones
Cuando se quiere recuperar datos de más de una tabla, lo habitual es que exista un nexo de unión entre ellas
CLAVE PRIMARIA CLAVE AJENA
87
Consultas Multitabla Composiciones simples (combinación
interna): Son las consultas multitabla fundamentales Recogen todas las tuplas formadas por la
combinación de las tuplas de la primera tabla con las de la segunda, en los casos en los que el campo de combinación (CLAVE PRIMARIA –> CLAVE AJENA) tome valores idénticos en ambas partes, es decir:
CLAVE PRIMARIA = CLAVE AJENACLAVE PRIMARIA = CLAVE AJENA
88
Consultas Multitabla La sintaxis básica es idéntica a la de las consultas
de selección, en las que se indicarán los campos procedentes de cada tabla, y tras las cláusula FROM se nombrarán todas las tablas desde las que proceden
Además, para poder hacer la combinación, se igualarán en una condición del WHERE los campos CLAVE PRIMARIA y CLAVE AJENA
Este tipo de consultas se suele denominar también PADRE – HIJO, o MAESTRO – DETALLE.
89
Consultas Multitabla Si además de incluir la condición de
combinación se quieren añadir nuevas condiciones de selección, se puede hacer mediante el uso de AND
Del mismo modo, si existen varias columnas de emparejamiento (claves primaria y ajena formadas por múltiples campos), se pondrán todas, utilizando también la cláusula AND
90
Consultas Multitabla Las técnicas empleadas para emparejar dos
tablas se hacen extensibles a tres o más tablas Con SQL también es posible emplear cualquier
par de columnas para hacer una combinación, sin que estas guarden una relación PADRE – HIJO
Además se pueden generar combinaciones basadas en desigualdades, utilizando el resto de operadores de comparación.
91
Consultas Multitabla Nombres de campo cualificados:
En consultas multitabla es habitual que haya coincidencias en los nombres de los campos
Para evitar el problema que esto supone, se pueden cualificar mediante:TABLA.CAMPO
Si además las tablas se nominan mediante ALIASES, se pueden cualificar los campos mediante los mismos:ALIAS.CAMPO
92
Consultas Multitabla Selección de todos los campos:
Si se utiliza SELECT * se seleccionarán todos los campos de todas las tablas implicadas en la consulta
Si se quiere hacer una selección de todos los campos de una de las tablas de la consulta, se puede realizar mediante SELECT NOM_TABLA.*
93
Ejemplo consulta con dos tablasSELECT Pedidos.[ID de pedido],
Clientes.[Nombre de la Compañia],
Clientes.[Ciudad]
Pedidos.[Fecha de pedido]
FROM Pedidos, Clientes
WHERE Pedidos.[ID de cliente]=Clientes.[ID Cliente];
94
Ejemplo con tres tablasSELECT Pedidos.[ID de pedido], Clientes.[Nombre de la Compañia],
Clientes.[Ciudad], Pedidos.[Fecha de pedido], [Precio unidad], Cantidad
FROM Pedidos, Clientes,[Detalle de Pedido]WHERE Pedidos.[ID de cliente]=Clientes.[ID Cliente] AND Pedidos.[ID de Pedido] = [Detalle de Pedido].[ID pedido] AND Cantidad>3;
95
Consultas Multitabla Relación Maestro – Detalle REFLEXIVA:
Para poder hacer una consulta Maestro – Detalle reflexiva hay que emular que los datos se encuentran distribuidos en dos tablas distintas en lugar de una
Para ello se debe hacer uso de los alias de tabla, dando a cada una de las dos tablas emuladas un alias distinto
Para crear los alias basta con poner el nombre deseado detrás del nombre de cada tabla en la cláusula FROM
96
Consultas Multitabla Relación Maestro – Detalle REFLEXIVA:
R IO S
Afl ue ntede
(0 ,1 )(0 ,n)
R IO S (1 ) Afl ue ntede R IO S (2 )(0 ,n) (0 ,1 )
97
Ejemplo de reflexivaSELECT Rios.Nom_Rio,
'es afluente de ', Afluente_de.Nom_Rio
FROM Rios, Rios AS Afluente_de
WHERE Rios.Cod_Rio_Afluente = Afluente_de.Cod_Rio;
98
Consultas Multitabla Producto Cartesiano:
Es la composición que hace por defecto
SQL si no se indica ninguna condición de
igualdad de campos en la cláusula WHERE,
cuando se realiza una consulta multitabla.
99
Producto cartesiano
SELECT Chicas.Nombre,
Chicos.Nombre
FROM Chicos, Chicas
ORDER BY 1;
Ejemplo: Si tenemos una tabla con
nombres de chicos y otra tabla con
nombres de chicas y queremos sacar
todos los emparejamientos posibles
(producto cartesiano), entonces:
100
Consultas Multitabla Combinación Interna
SQL con las combinaciones que se han generado hasta el momento genera únicamente las tuplas que tienen coincidencia en valor en los campos nexo de las tablas implicadas
Esto es a lo que se llama COMBINACIÓN INTERNA
En los casos en que al comprobar la igualdad de los campos nexo da un valor QUIZAS, se omiten esas tuplas
101
Consultas Multitabla Combinación Externa
Se puede especificar en SQL que incluyan las tuplas en los que la condición de igualdad de los campos nexo sea QUIZÁS
Se pueden dar los casos de: Combinación Externa Izquierda Combinación Externa Derecha Combinación Externa Simétrica
102
Consultas Multitabla SQL 2 define una sintaxis específica
para realizar las combinaciones internas y externas
COMBINACIÓN INTERNA Se especifica mediante las cláusulas INNER
JOIN y ONSELECT lista_campos FROM Tabla_1 INNER JOIN Tabla_2 ON Tabla_1.NEXO = Tabla_2.NEXO
103
Ejemplo combinación internaSELECT Pedidos.[ID de pedido],
Clientes.[Nombre de la Compañia], Clientes.[Ciudad]
Pedidos.[Fecha de pedido]FROM Clientes INNER JOIN Pedidos
ON Pedidos.[ID de cliente]=Clientes.[ID Cliente]WHERE Pedidos.[Fecha de pedido]<’12/12/1991’;
104
Ejemplo combinación con tres tablas
SELECT Pedidos.[ID de pedido], Clientes.[Nombre de la Compañia], Clientes.[Ciudad], Pedidos.[Fecha de pedido], [Precio unidad], Cantidad
FROM Clientes INNER JOIN (Pedidos INNER JOIN [Detalle de Pedido] ON Pedidos.[ID de Pedido] = [Detalle de Pedido].[ID pedido] ) ON Pedidos.[ID de cliente]=Clientes.[ID Cliente]
WHERE Cantidad>3;
105
Consultas Multitabla COMBINACIÓN EXTERNA
Se especifica mediante las cláusulas [LEFT|RIGHT|FULL] OUTER JOIN y ON
LEFT: Izquierda. RIGHT: Derecha. FULL: Izquierda y derecha.
SELECT lista_campos FROMTabla_1 LEFT [OUTER] JOIN Tabla_2ON Tabla_1.NEXO = Tabla_2.NEXO
106
Ejemplo combinación externa por la izquierda
SELECT Clientes.[Nombre de la Compañia], Clientes.[Ciudad],
Pedidos.[ID de pedido],Pedidos.[Fecha de pedido]
FROM Clientes LEFT JOIN PedidosON Pedidos.[ID de cliente]=Clientes.[ID Cliente];
NULOS
Consultas Resumen
108
Consultas Resumen Muchas peticiones de información no
requieren un detalle de todos los registros implicados, sino una información resumida en base a la información total
SQL permite resumir datos de la base de datos mediante un conjunto de funciones de columna.
109
Consultas Resumen Una función de columna SQL acepta una
columna entera de datos como argumento, y produce un único resultado que resume toda la columna
SQL estándar proporciona seis funciones de columna
Distintos fabricantes suelen añadir en este campo muchas más funciones además de las estándar
110
Consultas Resumen Funciones de Columna Estándar:
SUM() calcula el total de una columna AVG() calcula la media de una columna MIN() obtiene el valor mínimo de una
columna MAX() obtiene el valor máximo de una
columna COUNT() cuenta el número de valores de
una columna COUNT(*) cuenta las filas de una consulta
111
Consultas Resumen Restricciones:
No se puede anidar funciones de columna No se puede mezclar funciones de columna
y nombres de columna ordinarios en una lista de selecciónEjemplo ilegal:
SELECT NOMBRE, SUM(NOTAS)FROM ALUMNOS
112
Consultas Resumen Valores NULL
Las funciones de columna aceptan una columna de valores como argumento y producen como resultado un resumen
Si alguno de los valores de la columna argumento toma el valor NULL, SQL lo ignorará en sus cálculos
113
Consultas Resumen Eliminación de valores duplicados
Se puede hacer que el conjunto de valores de la columna pasada como argumento no contenga duplicados
Esto se hace anteponiendo la palabra clave DISTINCT justo delante del argumento de la función
Ejemplo:SELECT COUNT(DISTINCT CIUDAD)
FROM ALUMNOS
114
Consultas Resumen Consultas Agrupadas – GROUP BY
Las consultas resumen vistas sólo producen una fila
Con frecuencia es conveniente resumir los resultados no a nivel de total, sino a nivel de subtotales
Esto se puede conseguir con SQL mediante la cláusula GROUP BY
Una consulta agrupada constará al menos de dos campos: el de generación de grupos (de agrupación) y el resumen
Puede haber varios campos de agrupación
115
Consultas Resumen El funcionamiento de las consultas agrupadas
se puede ver conceptualmente de la siguiente forma:
SQL seleccionará todas las filas que cumplan con los criterios de selección
A continuación agrupará las columnas, de modo que se produzcan tramos en los que no varía el valor del campo de agrupación
Para cada uno de estos tramos se aplicará la función de columna seleccionada, asociando el valor obtenido del cálculo al valor del campo de agrupación.
116
Consultas Resumen Restricciones de las consultas agrupadas:
Las columnas de agrupación deben ser columnas efectivas
No se pueden utilizar campos calculados para agrupar por ellos
Los elementos de la lista de selección sólo pueden ser:
Constantes Funciones de columna Columnas de agrupación (afectadas por GROUP BY) Una expresión que afecte a las combinaciones anteriores
117
Consultas Resumen Condiciones de selección de grupos – HAVING
Funciona de manera similar a la cláusula WHERE, aunque ésta lo hace sobre filas individuales
Una vez calculados los grupos, se pueden aceptar o rechazar mediante el uso de la cláusula HAVING, que se incluirá tras la especificación del GROUP BY
Ejemplo:
SELECT Id_Familia, Sum(Stock)
FROM Productos
GROUP BY Id_Familia
HAVING Sum(Stock) > 100
118
Ejemplo Consulta Resumen
SELECT Grupo, SUM(Cuota) AS Suma_Cuota
FROM Alumnos
WHERE [¿HA PAGADO?]=TRUE
GROUP BY Grupo
HAVING AVG(Cuota)>6500;
Resultado usando
la cláusula HAVING
Resultado usando
la cláusula HAVING
Resultado sin usar
la cláusula HAVING
Resultado sin usar
la cláusula HAVING
Solo tendrá en cuenta para
agrupar y sumar los registros que
cumplan la condición.
El atributo debe estar en GROUP BY
119
Ejemplo Consulta Resumen con dos tablas
SELECT Ciudad, SUM(Cuota) AS Suma_Cuotas, SUM(RepVentas.Ventas) AS Suma_Ventas
FROM Oficinas, RepVentas
WHERE Oficina = Oficina_Rep
GROUP BY Ciudad
HAVING COUNT(*) >=2;
Por cada oficina con dos o más personas, calcular la cuota total y las ventas totales para todos los vendedores que trabajan en la oficina. (Agrupar por Ciudad siempre que haya dos o más representantes).
Subconsultas
Consultas anidadas
121
Subconsultas SQL permite utilizar los datos obtenidos
como resultado de una consulta como parte de otra
Una subconsulta es una consulta que aparece dentro de la cláusula WHERE o de la cláusula HAVING
122
Subconsultas Restricciones de las subconsultas:
La subconsulta debe producir una única columna de datos resultado
Su lista de selección contiene un único elemento
No se puede especificar la cláusula ORDER BY en la subconsulta
No puede ser la UNION de varias SELECT Los nombres de columna de la subconsulta pueden
hacer referencia a la consulta principal Es aconsejable emplear nombres de columna cualificados
123
Subconsultas Referencias Externas:
En el cuerpo de una subconsulta es habitual tener que referirse al valor de una columna en la “fila actual” de la consulta principal.
Ejemplo:SELECT Oficinas.Ciudad
FROM OficinasWHERE Objetivo >
(SELECT SUM(RepVentas.Cuota) FROM RepVentas WHERE Repventas.Oficina_Rep = Oficinas.Oficina);
124
Subconsultas En el ejemplo anterior, en la subconsulta se
hace referencia al campo Oficinas.Oficina de la consulta prinicipal.
Conforme SQL recorre cada fila de la tabla OFICINAS, utiliza el valor Oficinas.Oficina de la fila actual como argumento para resolver la condición WHERE de la subconsulta
125
Subconsultas Condiciones de búsqueda en
subconsultas: Una subconsulta siempre forma parte de
una condición WHERE o HAVING Los tipos de condiciones de subconsultas
son: Test de comparación subconsulta Test de pertenencia a un conjunto subconsulta Test de existencia Test de comparación cuantificada
126
Subconsultas Test de comparación subconsulta:
Hace uso de los operadores típicos de comparación: (=,<,>,<=,>=,<>).
Compara el valor de una expresión con un valor único producido por la subconsulta
Si la subconsulta no produce filas o produce un valor NULL, el test de comparación devuelve NULL
127
Ejemplo: SELECT * FROM Productos
WHERE PrecioUnidad > (SELECT AVG(PrecioUnidad)
FROM Detalles de pedidosWHERE Descuento >= .25);
Importante: Si en una consulta utilizamos en la cláusula WHERE cualquiera de los seis operadores (=,<,>,<=,>=,<>), para comparar con una subconsulta, y no utilizamos ninguno de los operadores ANY, ALL, IN, EXIST, solamente comparará con un valor, que será el que obtengamos de la subconsulta (nunca con varios).
Importante: Si en una consulta utilizamos en la cláusula WHERE cualquiera de los seis operadores (=,<,>,<=,>=,<>), para comparar con una subconsulta, y no utilizamos ninguno de los operadores ANY, ALL, IN, EXIST, solamente comparará con un valor, que será el que obtengamos de la subconsulta (nunca con varios).
128
Subconsultas Test de pertenencia a conjunto – IN
Compara un único valor de datos con una columna de valores producida por una subconsulta
Se utiliza cuando se necesita comparar un valor de la fila que se está examinando con un conjunto de valores producidos por una subconsulta
El formato es prácticamente igual al de test de conjunto simple, solo que el conjunto en lugar de declararse explícitamente se obtiene por medio de una subconsulta
129
Ejemplo:
SELECT * FROM ProductosWHERE IdProducto IN
(SELECT IdProductoFROM Detalles de pedidos
WHERE Descuento >= .25);
Utilice el predicado IN para recuperar sólo aquellos registros de la consulta principal para los cuales algún registro de la subconsulta contenga un valor igual.
El siguiente ejemplo devuelve todos los productos con descuento del 25 por ciento o mayor.
Además, puede utilizar NOT IN para recuperar solamente aquellos registros de la consulta principal para los que ningún registro de la subconsulta contenga un valor igual.
Además, puede utilizar NOT IN para recuperar solamente aquellos registros de la consulta principal para los que ningún registro de la subconsulta contenga un valor igual.
130
Subconsultas Test de existencia – EXISTS
Comprueba si una subconsulta produce alguna fila de resultados
No hay ninguna equivalencia en consultas simples, sólo se usa en subconsultas
Ejemplo:
Listar los productos para los cuales se ha recibido un pedido de 25.000 € ó más Listar los
productos para los cuales existe al menos un pedido en el que esté el producto en cuestión, de modo que el pedido tiene un importe de al menos 25.000 €
131
Ejemplo:SELECT DescripcionFROM ProductosWHERE EXISTS (SELECT *
FROM Pedidos WHERE Producto = ID_producto AND Fab = Id_Fab AND Importe >= 25000);
Utilice el predicado EXISTS (con la palabra reservada opcional NOT) en comparaciones verdadero/falso para determinar si la subconsulta devuelve algún registro.
Utilice el predicado EXISTS (con la palabra reservada opcional NOT) en comparaciones verdadero/falso para determinar si la subconsulta devuelve algún registro.
132
Subconsultas Test de existencia – EXISTS
Conceptualmente el funcionamiento es: SQL recorre la relación de la consulta principal y
para cada tupla de la misma realiza una subconsulta.
La subconsulta contiene una columna con un conjunto de valores.
Si el conjunto de valores no es vacío, el test de existencia EXISTS devuelve TRUE, y por tanto la tupla de la relación de la consulta principal queda seleccionada
133
Subconsultas Tests cuantificados – ANY
Similar al test de conjunto IN Con los test cuantificados ANY y ALL extienden el
test de conjunto IN a los operadores de comparación, tales como > y <.
Se utilizan conjuntamente con uno de los seis operadores de comparación, para comparar un único valor de test con una columna de valores, producida por la subconsulta
Si alguna de las comparaciones individuales devuelve TRUE, el test ANY devuelve TRUE y la fila de la consulta principal queda seleccionada
134
Ejemplo de Tests ANY o SOME
SELECT * FROM ProductosWHERE PrecioUnidad > ANY(SELECT PrecioUnidad
FROM Detalles_pedidoWHERE Descuento >= .25);
Utilice los predicados ANY o SOME, que son sinónimos, para recuperar registros de la consulta principal que satisfagan la comparación con otros registros recuperados en la subconsulta. Es decir si alguna de las comparaciones individuales produce un valor VERDADERO, el test ANY devuelve el resultado VERDAD (TRUE). El test ANY se puede utilizar con los operadores (=,<,>,<=,>=,<>).
Utilice los predicados ANY o SOME, que son sinónimos, para recuperar registros de la consulta principal que satisfagan la comparación con otros registros recuperados en la subconsulta. Es decir si alguna de las comparaciones individuales produce un valor VERDADERO, el test ANY devuelve el resultado VERDAD (TRUE). El test ANY se puede utilizar con los operadores (=,<,>,<=,>=,<>).
El siguiente ejemplo devuelve todos los productos cuyo precio por unidad es mayor que cualquier producto vendido con un descuento del 25 por ciento o mayor:
El siguiente ejemplo devuelve todos los productos cuyo precio por unidad es mayor que cualquier producto vendido con un descuento del 25 por ciento o mayor:
135
Subconsultas Tests cuantificados – ANY
Conceptualmente: La consulta principal genera una relación de
datos, que es recorrida tupla a tupla La subconsulta genera una columna de datos, los
cuales son comparados, según el operador de comparación seleccionado, uno a uno con el dato de la tupla actual de la consulta principal
Si alguna de las comparaciones da TRUE, la tupla de la relación principal es seleccionada.
136
Subconsultas Tests cuantificados – ANY
Siempre se puede transformar una consulta con test ANY en una consulta con test EXISTS, trasladando la comparación al interior de la condición de búsqueda de la subconsulta
Esta táctica elimina errores de interpretación, ya que el uso del test ANY puede llegar a se un tanto oscuro
137
Ejemplo con EXISTSSELECT * FROM Productos
WHERE EXISTS(SELECT PrecioUnidad FROM Detalles_pedido WHERE Descuento >= .25 AND
Productos.PrecioUnidad>Detalles_pedido.PrecioUnidad);
SELECT * FROM Productos
WHERE EXISTS(SELECT PrecioUnidad FROM Detalles_pedido WHERE Descuento >= .25 AND
Productos.PrecioUnidad>Detalles_pedido.PrecioUnidad);
138
Subconsultas Tests cuantificados – ALL
El funcionamiento del test ALL es similar al del test ANY
Si todas de las comparaciones individuales devuelve TRUE, el test ALL devuelve TRUE y la fila de la consulta principal queda seleccionada
Conceptualmente funciona igual que el test ANY, salvo la necesidad que el valor comparado de la consulta principal tiene que dar TRUE con cada comparación con los datos obtenidos en la subconsulta
139
Ejemplo de Tests ALL
SELECT * FROM ProductosWHERE PrecioUnidad > ALL(SELECT PrecioUnidad
FROM Detalles_pedidoWHERE Descuento >= .25);
SELECT * FROM ProductosWHERE PrecioUnidad > ALL(SELECT PrecioUnidad
FROM Detalles_pedidoWHERE Descuento >= .25);
Utilice el predicado ALL para recuperar sólo los registros de la consulta principal que satisfagan la comparación con todos los registros recuperados en la subconsulta.
Si cambia ANY a ALL en el ejemplo anterior, la consulta devolvería sólo aquellos productos cuyo precio por unidad fuese mayor que el de todos los productos vendidos con un descuento del 25 por ciento o mayor. Esto es mucho más restrictivo.
Utilice el predicado ALL para recuperar sólo los registros de la consulta principal que satisfagan la comparación con todos los registros recuperados en la subconsulta.
Si cambia ANY a ALL en el ejemplo anterior, la consulta devolvería sólo aquellos productos cuyo precio por unidad fuese mayor que el de todos los productos vendidos con un descuento del 25 por ciento o mayor. Esto es mucho más restrictivo.
140
Subconsultas y Composiciones Muchas consultas realizadas mediante
subconsultas se pueden obtener también mediante consultas multitabla.
En esos casos, las dos soluciones son correctas
En algunos SGBD la única diferencia que se encontrará será la diferencia de rendimiento entre unas y otras.
Generalmente se obtiene mayor rendimiento en una composición que con el uso de las subconsultas.
141
Subconsultas Anidadas Del mismo modo que una consulta principal puede
hacer uso de una subconsulta, una subconsulta puede hacer uso al mismo tiempo de otra nueva subconsulta
Esto es generalizable a los niveles que sea necesario
SELECT EmpresaFROM ClientesWHERE Rep_Clie IN (SELECT Num_Empl FROM RepVentas
WHERE Oficina_Rep IN (SELECT Oficina
FROM Oficinas WHERE Region = 'Este'));
SELECT EmpresaFROM ClientesWHERE Rep_Clie IN (SELECT Num_Empl FROM RepVentas
WHERE Oficina_Rep IN (SELECT Oficina
FROM Oficinas WHERE Region = 'Este'));
Lista los clientes (Empresa) cuyos vendedores están asignados a oficinas de la región de ventas Este.
Lista los clientes (Empresa) cuyos vendedores están asignados a oficinas de la región de ventas Este.
142
Finalmente la consulta más externa:SELECT Empresa
FROM Clientes WHERE Rep_Clie IN (Subconsulta) Mostrará los clientes (Empresa) cuyos vendedores tienen
uno de los números de empleados seleccionados.
Finalmente la consulta más externa:SELECT Empresa
FROM Clientes WHERE Rep_Clie IN (Subconsulta) Mostrará los clientes (Empresa) cuyos vendedores tienen
uno de los números de empleados seleccionados.
Pasos para realizar la consulta anterior:En este ejemplo la subconsulta más interna:
SELECT Oficina FROM Oficinas WHERE Región = ‘Este’;
Nos devuelve una una columna que contiene los números de oficina de las oficinas de la región Este.
En este ejemplo la subconsulta más interna:
SELECT Oficina FROM Oficinas WHERE Región = ‘Este’;
Nos devuelve una una columna que contiene los números de oficina de las oficinas de la región Este.
La subconsulta siguiente:
SELECT Num_Empl FROM RepVentas WHERE Oficina_rep IN (subconsulta)
No devuelve una columna que contiene los números de empleados de los vendedores que trabajan en una de las oficinas seleccionadas.
La subconsulta siguiente:
SELECT Num_Empl FROM RepVentas WHERE Oficina_rep IN (subconsulta)
No devuelve una columna que contiene los números de empleados de los vendedores que trabajan en una de las oficinas seleccionadas.
143
Subconsultas Correlacionadas Conceptualmente, SQL realiza una subconsulta
tantas veces como tuplas existen en la relación obtenida por la consulta principal
Para muchas subconsultas, se producen los mismos resultados
Cuando esto es así, las implementaciones comerciales de servidores de BBDD tratan de evitar el repetir el cálculo de la subconsulta, para incrementar el rendimiento
Esta optimización no se puede realizar si la subconsulta contiene referencias externas - CORRELACIÓN
144
Subconsultas en HAVING Además de utilizar las consultas en la cláusula
WHERE se pueden emplear igualmente en la cláusula HAVING
Cuando una subconsulta aparece en la cláusula HAVING, funciona como parte de la selección de grupo de filas efectuada por la cláusula HAVING.
Además se pueden utilizar las subconsultas en las sentencias INSERT, DELETE, UPDATE como veremos más adelante.
Actualizaciones de bases de datos
INSERT, DELETE, UPDATE
146
Actualizaciones de BBDD Con SQL, además de poder realizar
consultas para obtener resultados a partir de los datos incluidos en la BBDD, permite:Actualizar los datos de la BBDD
Altas, Bajas y Modificaciones El SGBD velará por la integridad de los datos,
además de coordinar la simultaneidad de peticiones por parte de los usuarios
Crear la propia BBDD
147
Introducción de datos en la BBDD
ALTAS:Consiste en incluir nuevos registros de datos
en las tablas de la BBDDLos SGBD incluyen para ello:
Sentencias INSERT de SQL para añadir una fila Sentencias INSERT de SQL para añadir varias
filas Utilidades de carga masiva de datos en la BBDD
148
Sentencia INSERT de una fila Su sintaxis es la siguiente:
INSERT INTO Tabla (campo1, .., campoN) VALUES (valor1, ..., valorN)
INSERT INTO RepVentas ( Num_Empl, Nombre, Edad, Oficina_Rep, Titulo, Contrato, Director, Cuota, Ventas )VALUES (112,’Henry Ford’, 46, 13, ‘Dir Ventas’, ‘25/08/90’, NULL, NULL, 0.0);
INSERT INTO RepVentas ( Num_Empl, Nombre, Edad, Oficina_Rep, Titulo, Contrato, Director, Cuota, Ventas )VALUES (112,’Henry Ford’, 46, 13, ‘Dir Ventas’, ‘25/08/90’, NULL, NULL, 0.0);
149
Sentencia INSERT de una fila
Inserción de valores NULL:SQL automáticamente inserta valores NULL a
aquellas columnas no incluidas en una sentencia INSERT, a menos que esas columnas tengan definido un valor por defecto en la creación de la tabla
Se puede hacer explícitamente mediante la palabra clave NULL en el área VALUES
150
Sentencia INSERT de una fila
Inserción de todas las columnasSi se pretende insertar valores en todas las
columnas de una tabla, SQL permite omitir la lista de los nombres de columna.
SQL supondrá que se insertan valores, tomando las columnas en el orden en el que se definieron
INSERT INTO RepVentas VALUES (112,’Henry Ford’, 46, 13, ‘Dir Ventas’, ‘25/08/90’, NULL, NULL, 0.0);
INSERT INTO RepVentas VALUES (112,’Henry Ford’, 46, 13, ‘Dir Ventas’, ‘25/08/90’, NULL, NULL, 0.0);
151
Crear una tabla y añadir registros
SELECT Num_Pedido, Fecha_Pedido, Importe INTO AntPedidos
FROM Pedidos
WHERE Fecha_Pedido >= ‘01/01/90’;
SELECT Num_Pedido, Fecha_Pedido, Importe INTO AntPedidos
FROM Pedidos
WHERE Fecha_Pedido >= ‘01/01/90’;
Crear la tabla AntPedidos con los campos Num_pedido, Fecha_Pedido, e Importe, para aquellos pedidos cuya fecha de pedido sea igual o superior al primer día del año 1990.
Crear la tabla AntPedidos con los campos Num_pedido, Fecha_Pedido, e Importe, para aquellos pedidos cuya fecha de pedido sea igual o superior al primer día del año 1990.
152
Sentencia INSERT multifila
Permite añadir múltiples filas desde un origen de datos a una tabla destino (la tabla debe de estar creada).
No se especifican los valores a insertar, sino que estos se obtienen a partir de la ejecución de una sentencia SELECT
153
Sentencia INSERT multifila
Su sintaxis básica es la siguiente:INSERT INTO
Tabla (campo1, …, campoN)
SELECT TablaOrigenX.campo1, …,
TablaOrigenZ.campoN
FROM TablaOrigenX, …, TablaOrigenZ
WHERE Condiciones_de_Selección
154
Ejemplo:
INSERT INTO AntPedidos
( Num_Pedido, Fecha_Pedido, Importe )
SELECT Num_Pedido, Fecha_Pedido, Importe
FROM Pedidos
WHERE Fecha_Pedido < ‘01/01/90’;
INSERT INTO AntPedidos
( Num_Pedido, Fecha_Pedido, Importe )
SELECT Num_Pedido, Fecha_Pedido, Importe
FROM Pedidos
WHERE Fecha_Pedido < ‘01/01/90’;
Añadir a la tabla AntPedidos, aquellos de la tabla pedidos cuya fecha de pedido sea menor al 01-01-90
Añadir a la tabla AntPedidos, aquellos de la tabla pedidos cuya fecha de pedido sea menor al 01-01-90
155
Supresión de datos de la BBDD
Se realiza mediante la sentencia DELETE Su sintaxis básica es la siguiente:
DELETE FROM Tabla WHERE criterio DELETE FROM Pedidos
WHERE Fecha_Pedido < ‘15/11/89’; Si se pretenden eliminar todos los registros de
una tabla, se prescindirá de la condición expresada en la cláusula WHERE
Hay que tener en cuenta que un borrado en una tabla puede desencadenar borrados en cascada en otras tantas
156
Supresión de datos de la BBDD
Borrados con SubconsultasEn ocasiones los borrados de datos se deben
efectuar en base a datos contenidos en otras tablas
SQL no permite utilizar composiciones en sentencias DELETE
El modo de solucionar esta situación es por medio de subconsultas
157
Ejemplo de borrado con subconsulta:
DELETE FROM Pedidos
WHERE Rep = (SELECT Num_Empl
FROM RepVentas
WHERE Nombre='Sue Smith');
DELETE FROM Pedidos
WHERE Rep = (SELECT Num_Empl
FROM RepVentas
WHERE Nombre='Sue Smith');
Suprime los pedidos aceptados por Sue Smith.Suprime los pedidos aceptados por Sue Smith.
158
Modificación de datos en la BBDD
Se realiza mediante la sentencia UPDATE Su sintaxis básica es la siguiente:
UPDATE Tabla SET Campo1=Valor1, …, CampoN=ValorN WHERE Criterio;
Si se pretende modificar todos los registros de una tabla, se prescindirá de la cláusula WHERE
159
Ejemplo de UPDATE
UPDATE RepVentas
SET Oficina_Rep = 11, Cuota = 0.9 *Cuota
WHERE Oficina_Rep = 12;
UPDATE RepVentas
SET Oficina_Rep = 11, Cuota = 0.9 *Cuota
WHERE Oficina_Rep = 12;
Cambia a todos los vendedores de la oficina de Chicago (número 12) a la oficina de New York (número 11) y rebaja sus cuotas un 10%.
Cambia a todos los vendedores de la oficina de Chicago (número 12) a la oficina de New York (número 11) y rebaja sus cuotas un 10%.
160
Modificación de datos en la BBDD
Modificaciones con SubconsultasEn ocasiones las modificaciones de datos se
deben efectuar en base a datos contenidos en otras tablas
SQL no permite utilizar composiciones en sentencias UPDATE
El modo de solucionar esta situación es por medio de subconsultas
Vistas
Tablas virtuales
162
Vistas Una vista es una consulta realizada en
SQL, cuya definición está permanentemente almacenada en la BBDD, y que tiene además un nombre asignadoSQL permite acceder a los resultados de
invocar a la ‘vista’ como si se tratase de una tabla de la BBDD
163
Vistas Razones para utilizar las vistas:
Permiten acomodar el aspecto de una BBDD, de modo que distintos usuarios la vean desde diferentes perspectivas
Permiten restringir el acceso a los datos, permitiendo que diferentes usuarios sólo vean ciertas filas o columnas
Simplifican el acceso a la BBDD mediante la presentación de la estructura de los datos almacenados de manera más natural
164
Vistas Una vista es una “tabla virtual” en la
BBDD, cuyos contenidos están definidos por una consultaLos datos que muestra una vista no existe en
la base de datos como un conjunto almacenado de valores, sino que son los resultados producidos de la ejecución de una consulta que define a la vista.
Una vez definida la vista, se puede ejecutar una sentencia SELECT sobre ella, como si se tratase de una tabla
165
Creación de una Vista Se realiza mediante la sentenciaCREATE VIEWSu sintaxis básica es:
CREATE VIEW nombre_vista [(col_vista [,col_vista …])] AS SELECT …
Siendo SELECT una sentencia de selección completa
166
Ejemplo:
CREATE VIEW OficinasEste
(Cod_Oficina, Ciudad, Region)
AS
SELECT OFICINA, CIUDAD, REGION
FROM Oficinas
WHERE Region = 'Este';
CREATE VIEW OficinasEste
(Cod_Oficina, Ciudad, Region)
AS
SELECT OFICINA, CIUDAD, REGION
FROM Oficinas
WHERE Region = 'Este';
Define una vista que contenga únicamente las oficinas de la región “Este”, cuyo nombre sea OficinasEste.
Define una vista que contenga únicamente las oficinas de la región “Este”, cuyo nombre sea OficinasEste.
167
Vistas Vistas Agrupadas:
La consulta para la definición de una vista puede incluir la cláusula GROUP BY
En este caso, las vistas que se definen se denominan Vistas Agrupadas
Una vista agrupada reúne los resultados de una consulta agrupada en una tabla virtual, permitiendo efectuar consultas adicionales sobre ella.
168
Vistas Vistas Agrupadas:
Como restricción, las vistas agrupadas no son actualizables
Sin embargo, en los últimos SGBD, las vistas agrupadas pueden salvar la limitación que impone SQL sobre la anidación de funciones
Por ejemplo, se podría calcular MIN(AVG(A)) No todos los SGBD tienen esta capacidad
169
Vistas Vistas Compuestas:
Una de las razones más frecuentes para utilizar vistas compuestas es simplificar las consultas multitabla.
Se puede crear una vista compuesta que extrae sus datos de varias tablas, presentando los datos como si se tratase de una única tabla virtual
170
Vistas Actualizaciones sobre vistas:
Las reglas que impone SQL sobre las actualizaciones de vista son muy restrictivas
Los productos comerciales suelen relajar estas reglas, ya que en muchos casos se pueden permitir ciertas actualizaciones que el estándar impediría.
Hay vistas que pueden soportar algunas de las operaciones de actualización, y otras no
Hay vistas que pueden soportar actualizaciones sobre un subconjunto de sus columnas
Las reglas de actualización de vistas dependen de cada SGBD.
171
Vistas Comprobación de actualizaciones sobre vistas – WITH CHECK OPTION
Una vista actualizable puede incluir una condición WHERE
Si se hace una inserción de un dato sobre una vista de este tipo, quizás el dato insertado no cumpla con la condición de selección, y por tanto después no aparecerá en la vista
Esto se puede evitar si en la definición de la vista se incluye al final la cláusula WITH CHECK OPTION
172
Vistas Eliminación de una vista:
La sintaxis básica de la eliminación de una vista es la siguiente:
DROP VIEW NombreVistaDROP VIEW NombreVista
Triggers
Disparadores
174
Triggers
Un trigger o disparador es una respuesta a un evento que se produce en una BBDD, llevando a un cambio en la información contenida en la misma
Los eventos que se producen en una BBDD son por tanto: Inserciones Borrados Modificaciones
175
Triggers
En muchos SGBD se pueden llevar a cabo acciones tanto antes como después de que se lleven a cabo las acciones de inserción, modificación o borrado
Cada SGBD incorpora su propio dialecto de descripción de triggers
176
Desencadenadores o Triggers
Ejemplo de la Base de Datos SQL LANS Cuando añadimos un pedido a la tabla PEDIDOS, estos
dos cambios también podrían tener lugar en la base de datos: La columna VENTAS del vendedor que aceptó el pedido
debería incrementarse en el importe del pedido. El valor de EXISTENCIAS para ese producto debería disminuir
en la cantidad solicitada. Definiendo un disparador (trigger) de nombre
NUEVOPEDIDO, haremos que estas actualizaciones de la Base de Datos se produzcan automáticamente.
177
Triggers - SQL SERVER
CREATE TRIGGER NuevoPedidoON Pedidos FOR INSERTASBEGINUPDATE 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 NuevoPedidoON Pedidos FOR INSERTASBEGINUPDATE RepVentas SET Ventas = Ventas + INSERTED.Importe WHERE RepVentas.Num_Empl = INSERTED.Rep;UPDATE Productos SET Existencias = Existencias - INSERTED.Cant WHERE Productos.Id_Fab = INSERTED.Fab AND Productos.Id_Producto = INSERTED.Producto;END;
Nombre del disparador
Tabla sobre la que actua
Se activará cuando insertamos un registro en la tabla Pedidos.
Importe insertado en Pedidos
Cantidad insertada en Pedidos
178
Para probar el disparador anterior
INSERT INTO Pedidos (NUM_PEDIDO,FECHA_PEDIDO, CLIE,REP,FAB, PRODUCTO, CANT, IMPORTE)
VALUES (222222,'12/02/1990',2111,103,'ACI','4100X',2,100)
NOTA: Para ver los TRIGGERS en SQL SERVER. Iremos al menú y seleccionaremos el programa:
Inicio->Programas->SQL Server->Administrador Corporativo y en la base de datos SQL_LANS nos colocamos en la tabla Pedidos y al pulsar el botón derecho, si elegimos la opción Diseño tabla, en la lista de botones de arriba aparecerá un botón de desencadenadores, el cual, al pulsarlo nos saldrá el código del desencadenador.
179
Triggers – Ejemplo integridad referencial
Este disparador fuerza la integridad referencial de la relación OFICINAS/REPVENTAS, y también muestra un mensaje cuando una actualización falla.
CREATE TRIGGER Actualiza_repON RepVentasFOR INSERT, UPDATEAS IF ((SELECT COUNT(*) FROM OFICINAS, INSERTED WHERE OFICINAS.OFICINA=INSERTED.OFICINA_REP)=0)BEGIN PRINT 'Especificado un numero de oficina invalido' ROLLBACK TRANSACTIONEND
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_repON RepVentasFOR INSERT, UPDATEAS IF ((SELECT COUNT(*) FROM OFICINAS, INSERTED WHERE OFICINAS.OFICINA=INSERTED.OFICINA_REP)=0)BEGIN PRINT 'Especificado un numero de oficina invalido' ROLLBACK TRANSACTIONEND
Cuando hay una inserción o un actualización en la tabla
Repventas comprueba que el nº de oficina insertado sea
válido
180
Ejemplo borrado en cascada
Hay algunos SGBD que no soportan la actualización en cascada si se modifica un valor de la clave primaria. Si embargo, esto se puede realizar con disparadores. Por ejemplo:
El siguiente disparador propaga en cascada cualquier actualización de la columna OFICINA en la tabla OFICINAS a la columna OFICINA_REP de la tabla REP_VENTAS:
181
Ejemplo borrado en cascadaCREATE TRIGGER Cambia_Oficina_RepON OficinasFOR UPDATEASIF 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_RepON OficinasFOR UPDATEASIF UPDATE (OFICINA) BEGIN UPDATE REPVENTAS SET REPVENTAS.OFICINA_REP=INSERTED.OFICINA FROM REPVENTAS, INSERTED, DELETED WHERE REPVENTAS.OFICINA_REP=DELETED.OFICINA END
Las referencias DELETED.OFICINA e INSERTED.OFICINA en el disparador se refieren, respectivamente, a los valores de la columna OFICINA antes y después de la sentencia UPDATE.
Las referencias DELETED.OFICINA e INSERTED.OFICINA en el disparador se refieren, respectivamente, a los valores de la columna OFICINA antes y después de la sentencia UPDATE.
Transacciones
183
Transacciones Una transacción es una secuencia de una o más
sentencias SQL que juntas forman una unidad de trabajo.
En las transacciones podemos usar las sentencias: BEGIN TRANSACTION Para empezar la transacción END TRANSACTION Para finalizar la transacción SAVE TRANSACTION Para realizar un punto de Salvaguardia COMMIT TRANSACTION ó WORK señala el final correcto de
una transacción. Informa al SGBD que la transacción está ahora completa; todas las sentencias que forman la transacción han sido ejecutadas y la B.D. es autoconsistente.
ROLLBACK señala el final sin éxito de una transacción. Informa al SGBD que el usuario no desea completar la transacción ; en vez de ello el SGBD debe deshacer los cambios efectuados a la B.D. durante la transacción, para que la B.D. quede en el estado en que estaba antes de ejecutar la transacción
184
Ejemplo de Transacción BEGIN TRANSACTION
UPDATE PEDIDOS SET CANTIDAD = 10, IMPORTE =3550.00 WHERE NUM_PEDIDO = 113051 UPDATE REPVENTAS SET VENTAS = VENTAS - 1458.00 + 3550.00 WHERE NUM_EMPL = 108 UPDATE OFICINAS SET VENTAS = VENTAS - 1458.00 + 3550.00 WHERE OFICINA = 21 UPDATE PRODUCTOS SET EXISTENCIAS = EXISTENCIAS + 4 -10 WHERE ID_FAB = 'QSA' AND ID_PRODUCTO = 'XK47'
COMMIT WORK
BEGIN TRANSACTION UPDATE PEDIDOS SET CANTIDAD = 10, IMPORTE =3550.00 WHERE NUM_PEDIDO = 113051 UPDATE REPVENTAS SET VENTAS = VENTAS - 1458.00 + 3550.00 WHERE NUM_EMPL = 108 UPDATE OFICINAS SET VENTAS = VENTAS - 1458.00 + 3550.00 WHERE OFICINA = 21 UPDATE PRODUCTOS SET EXISTENCIAS = EXISTENCIAS + 4 -10 WHERE ID_FAB = 'QSA' AND ID_PRODUCTO = 'XK47'
COMMIT WORK
185
EjemploUSE NorthWind
DECLARE @Error int--Declaramos una variable que utilizaremos para almacenar un posible código de errorBEGIN TRAN--Iniciamos la transacciónUPDATE Products SET UnitPrice=20 WHERE ProductName =’Chai’--Ejecutamos la primera sentenciaSET @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 segundaUPDATE Products SET UnitPrice=20 WHERE ProductName=’Chang’SET @Error=@@ERROR--Y si hay un error hacemos como antesIF (@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 datosCOMMIT TRANTratarError:--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 NorthWindDECLARE @Error int--Declaramos una variable que utilizaremos para almacenar un posible código de errorBEGIN TRAN--Iniciamos la transacciónUPDATE Products SET UnitPrice=20 WHERE ProductName =’Chai’--Ejecutamos la primera sentenciaSET @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 segundaUPDATE Products SET UnitPrice=20 WHERE ProductName=’Chang’SET @Error=@@ERROR--Y si hay un error hacemos como antesIF (@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 datosCOMMIT TRANTratarError:--Si ha ocurrido algún error llegamos hasta aquíIf @@Error<>0 THEN BEGIN PRINT ‘Ha ecorrido un error. Abortamos la transacción’ --Se lo comunicamos al usuario y deshacemos la transacción --todo volverá a estar como si nada hubiera ocurrido ROLLBACK TRAN END
186
Transacciones
Como se puede ver para cada sentencia que se ejecuta miramos si se ha producido o no un error, y si detectamos un error ejecutamos el bloque de código que deshace la transacción.
Hay una interpretación incorrecta en cuanto al funcionamiento de las transacciones que esta bastante extendida. Mucha gente cree que si tenemos varias sentencias dentro de una transacción y una de ellas falla, la transacción se aborta en su totalidad.
¡Nada más lejos de la realidad!
187
Transacciones Si tenemos dos sentencias dentro de una transacción.
USE NorthWindBEGIN TRANUPDATE Products SET UnitPrice=20 WHERE ProductName=’Chang’UPDATE Products SET UnitPrice=20 WHERE ProductName=’Chang’COMMIT TRAN
Estas dos sentencias se ejecutarán como una sola. Si por ejemplo en medio de la transacción (después del primer UPDATE y antes del
segundo) hay un corte de electricidad, cuando el SQL Server se recupere se encontrará en medio de una transacción y, o bien la termina o bien la deshace, pero no se quedará a medias. El error está en pensar que si la ejecución de la primera sentencia da un error se cancelará la transacción.
El SQL Server sólo se preocupa de ejecutar las sentencias, no de averiguar si lo hacen correctamente o si la lógica de la transacción es correcta.
Eso es cosa nuestra. Por eso en el ejemplo que tenemos más arriba para cada sentencia de nuestro conjunto averiguamos si se ha producido un error y si es así actuamos en consecuencia cancelando toda la operación.
Procedimientos
189
Crear Procedimientos CREATE PROCEDURE Cli_Credito @Credito_InfMONEY,
@Credito_Sup MONEYAS
SELECT *FROM ClientesWHERE Limite_Credito
BETWEEN @Credito_Inf AND @Credito_Sup
CREATE PROCEDURE Cli_Credito @Credito_InfMONEY,
@Credito_Sup MONEYAS
SELECT *FROM ClientesWHERE Limite_Credito
BETWEEN @Credito_Inf AND @Credito_Sup
Para ejecutar el procedimiento usaremos:EXECUTE Cli_Credito 20000 , 60000
donde Cli_Credito es el nombre del procedimiento, y 20000, 60000 los 2 parámetros que pasamos al procedimiento.
NOTA: Los procedimientos son guardados en SQL Server en la carpeta de la la base de datos llamada Procedimientos Almacenados.
Funciones
191
Función
CREATE FUNCTION dbo.Cube( @fNumber float)RETURNS floatASBEGIN
RETURN(@fNumber * @fNumber * @fNumber)END
CREATE FUNCTION dbo.Cube( @fNumber float)RETURNS floatASBEGIN
RETURN(@fNumber * @fNumber * @fNumber)END
Nombre de la función
Nombre del parámetro que
pasamos a la función
192
Función factorial
CREATE FUNCTION dbo.Factorial( @iNumber int )RETURNS INTASBEGINDECLARE @i int
IF @iNumber <= 1SET @i = 1
ELSESET @i = @iNumber * dbo.Factorial(@iNumber -
1 )RETURN (@i)END
CREATE FUNCTION dbo.Factorial( @iNumber int )RETURNS INTASBEGINDECLARE @i int
IF @iNumber <= 1SET @i = 1
ELSESET @i = @iNumber * dbo.Factorial(@iNumber -
1 )RETURN (@i)END
193
Función con una tabla
CREATE FUNCTION dbo.AuthorsForState(@cState char(2) )RETURNS TABLEASRETURN (SELECT * FROM Authors WHERE state = @cState)
CREATE FUNCTION dbo.AuthorsForState(@cState char(2) )RETURNS TABLEASRETURN (SELECT * FROM Authors WHERE state = @cState)
Seguridad SQL
195
Seguridad SQL
La seguridad es especialmente importante en un SGBD basado en SQL, ya que SQL permite hacer especialmente sencillo el acceso a la información contenida en las BBDD
Los requerimientos de los sistemas en producción son muchos y muy variados, pero por resumir, algunos de ellos pueden ser en lo referente a SQL:
196
Seguridad SQL
Los datos de cualquier tabla deberían ser accesible sólo a un conjunto de usuarios, no a todos
Sólo algunos usuarios deben tener derecho de actualización de datos en una tabla en particular
Para algunas tablas, el acceso debería estar restringido en base a las columnas
Algunos usuarios deberían tener denegado el acceso mediante SQL interactivo, pero permitirles utilizar aplicaciones que utilicen tales tablas
197
Seguridad SQL
Los usuarios son los actores de la BBDD Cada vez que el SGBD hace una operación sobre los
datos, lo hace en nombre de algún usuario El SGBD deberá actuar en consecuencia con los
permisos que tal usuario tenga según la operación empleada y los datos afectados
Cada SGBD tiene su propia implementación de los procesos de seguridad.
198
Vistas y Seguridad SQL
Las vistas juegan un papel esencial en la seguridad:Definiendo una vista y proporcionando un
permiso de usuario para acceder a ella, pero no a sus tablas fuente, se puede permitir el acceso de un usuario únicamente a las columnas y filas seleccionadas.
199
Privilegios
El estándar SQL-1 especifica cuatro privilegios para tablas y vistas:SELECTINSERTDELETEUPDATE
200
Concesión de Privilegios Cláusula GRANT
Su sintaxis básica es:
GRANT <privilegios> ON {nombre_tabla | nombre_vista} TO {PUBLIC | usuario, …, usuario [WITH GRANT OPTION]}
Siendo <privilegios>: ALL [PRIVILEGES] | { SELECT | DELETE | INSERT | UPDATE [(col [, col …])]]
201
Revocación de Privilegios
Cláusula REVOKE Su sintaxis básica es:
REVOKE <privilegios> ON {nombre_tabla | nombre_vista} FROM {PUBLIC | usuario, …, usuario}
Siendo <privilegios>: ALL [PRIVILEGES] | { SELECT | DELETE | INSERT | UPDATE [(col [, col …])]]
202
Crear un usuario
CREATE LOGIN Pepe
WITH PASSWORD =‘m1a2n3o4l5o';
USE BD_Facturas;
CREATE USER Pepe FOR LOGIN Pepe;
GO
Crea un inicio de sesión de servidor denominado
“Pepe” con una contraseña
Crea el usuario de base de datos “Pepe”
correspondiente a BD_Factura
203
Crear usuario
CREATE USER nom_usuario1 contraseña, nom_usuario2 contraseña, …
204
Cambiar el nombre de usuario
USE BD_FACTURA;
ALTER USER Pepe WITH NAME = Jose;
GO
Cambia el nombre del usuario de la base de datos BD_FACTURA “Pepe” a “Jose”.
205
Borra un usuario
USE BD_FACTURA; DROP USER Jose;GO
206
Crear un grupo de usuarios
CREATE GROUP nom_grupo1 contraseña, nom_grupo2 contraseña, …
207
Añadir usuarios a un grupo
ADD USER nom_usuario [,nom_usuario,..] TO nom_grupo
Añade uno o más usuarios a un grupo
Cuando se haya agregado el usuario a un grupo, el usuario disfrutará de todos los permisos que se han otorgado a ese grupo
208
Borra un grupo
DROP GROUP nom_grupo
Eliminará el grupo o grupos especificados. Los usuarios que pertenezcan a esos
grupos no se verán afectados, pero dejarán de ser miembros de los grupos eliminados.
209
Borra un usuarioDROP USER nom_usuario1, nom_usuario2, …[FROM nom_grupo]
Si utilizamos DROP USER sin la cláusula FROM, borrará los usuarios que indiquemos.
Si utilizamos DROP USER con la cláusula FROM, quitará del grupo los usuarios que indiquemos, pero no los borrará
210
Cambia contraseña del usuarioALTER USER nom_usuario
PASSWORD contraseña_nueva contraseña_anterior
211
Cambia la contraseña de la base de datos
ALTER DATABASE PASSWORD contraseña_nueva contraseña_anterior