Sql presentacion

211
SISTEMAS GESTORES DE BASES DE DATOS I.E.S. MARCOS ZARAGOZA

Transcript of Sql presentacion

Page 1: Sql presentacion

SISTEMAS GESTORES DE BASES DE DATOS

I.E.S. MARCOS ZARAGOZA

Page 2: Sql presentacion

SQL

Page 3: Sql presentacion

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

Page 4: Sql presentacion

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

Page 5: Sql presentacion

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

Page 6: Sql presentacion

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

Page 7: Sql presentacion

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.

Page 8: Sql presentacion

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.

Page 9: Sql presentacion

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.

Page 10: Sql presentacion

10

Componentes de SQL

El lenguaje SQL está compuesto por:ComandosCláusulasOperadoresFunciones de agregado

Page 11: Sql presentacion

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.

Page 12: Sql presentacion

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

Page 13: Sql presentacion

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

Page 14: Sql presentacion

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.

Page 15: Sql presentacion

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  

Page 16: Sql presentacion

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 

Page 17: Sql presentacion

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.

Page 18: Sql presentacion

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.

Page 19: Sql presentacion

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

Page 20: Sql presentacion

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

Page 21: Sql presentacion

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

Page 22: Sql presentacion

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

Page 23: Sql presentacion

Creación de bases de datos

Page 24: Sql presentacion

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

Page 25: Sql presentacion

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

Page 26: Sql presentacion

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.

Page 27: Sql presentacion

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

Page 28: Sql presentacion

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.

Page 29: Sql presentacion

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.

Page 30: Sql presentacion

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 }]

Page 31: Sql presentacion

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

Page 32: Sql presentacion

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));

Page 33: Sql presentacion

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)

);

Page 34: Sql presentacion

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 }]

Page 35: Sql presentacion

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));

Page 36: Sql presentacion

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)

);

Page 37: Sql presentacion

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

);

Page 38: Sql presentacion

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));

Page 39: Sql presentacion

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;

Page 40: Sql presentacion

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

Page 41: Sql presentacion

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;

Page 42: Sql presentacion

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;

Page 43: Sql presentacion

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);

Page 44: Sql presentacion

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)}

Page 45: Sql presentacion

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;

Page 46: Sql presentacion

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.

Page 47: Sql presentacion

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

Page 48: Sql presentacion

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;

Page 49: Sql presentacion

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 ;

Page 50: Sql presentacion

50

Base de datos Catastro

Page 51: Sql presentacion

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;

Page 52: Sql presentacion

52

Creación BD “SQL_LANS”

Page 53: Sql presentacion

53

Esquema de la BD en SQL Server

Page 54: Sql presentacion

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 );

Page 55: Sql presentacion

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 );

Page 56: Sql presentacion

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 );

Page 57: Sql presentacion

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);

Page 58: Sql presentacion

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;

Page 59: Sql presentacion

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;

Page 60: Sql presentacion

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;

Page 61: Sql presentacion

61

Borrar tablas de la BD

USE SQL_LANS;

DROP TABLE CLIENTES;

DROP TABLE OFICINAS;

DROP TABLE PEDIDOS;

DROP TABLE PRODUCTOS;

DROP TABLE REPVENTAS;

Page 62: Sql presentacion

Consultas simples

Page 63: Sql presentacion

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

Page 64: Sql presentacion

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

Page 65: Sql presentacion

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

Page 66: Sql presentacion

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';

Page 67: Sql presentacion

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;

Page 68: Sql presentacion

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:

Page 69: Sql presentacion

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

Page 70: Sql presentacion

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

Page 71: Sql presentacion

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

Page 72: Sql presentacion

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');

Page 73: Sql presentacion

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.

Page 74: Sql presentacion

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]

Page 75: Sql presentacion

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%’;

Page 76: Sql presentacion

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;

Page 77: Sql presentacion

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’;

Page 78: Sql presentacion

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

Page 79: Sql presentacion

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

Page 80: Sql presentacion

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;

Page 81: Sql presentacion

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().

Page 82: Sql presentacion

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

Page 83: Sql presentacion

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

Page 84: Sql presentacion

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;

Page 85: Sql presentacion

Consultas Multitabla

Consultas con dos o más tablas

Page 86: Sql presentacion

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

Page 87: Sql presentacion

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

Page 88: Sql presentacion

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.

Page 89: Sql presentacion

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

Page 90: Sql presentacion

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.

Page 91: Sql presentacion

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

Page 92: Sql presentacion

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.*

Page 93: Sql presentacion

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];

Page 94: Sql presentacion

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;

Page 95: Sql presentacion

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

Page 96: Sql presentacion

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 )

Page 97: Sql presentacion

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;

Page 98: Sql presentacion

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.

Page 99: Sql presentacion

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:

Page 100: Sql presentacion

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

Page 101: Sql presentacion

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

Page 102: Sql presentacion

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

Page 103: Sql presentacion

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’;

Page 104: Sql presentacion

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;

Page 105: Sql presentacion

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

Page 106: Sql presentacion

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

Page 107: Sql presentacion

Consultas Resumen

Page 108: Sql presentacion

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.

Page 109: Sql presentacion

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

Page 110: Sql presentacion

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

Page 111: Sql presentacion

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

Page 112: Sql presentacion

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

Page 113: Sql presentacion

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

Page 114: Sql presentacion

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

Page 115: Sql presentacion

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.

Page 116: Sql presentacion

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

Page 117: Sql presentacion

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

Page 118: Sql presentacion

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

Page 119: Sql presentacion

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).

Page 120: Sql presentacion

Subconsultas

Consultas anidadas

Page 121: Sql presentacion

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

Page 122: Sql presentacion

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

Page 123: Sql presentacion

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);

Page 124: Sql presentacion

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

Page 125: Sql presentacion

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

Page 126: Sql presentacion

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

Page 127: Sql presentacion

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).

Page 128: Sql presentacion

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

Page 129: Sql presentacion

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.

Page 130: Sql presentacion

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 €

Page 131: Sql presentacion

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.

Page 132: Sql presentacion

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

Page 133: Sql presentacion

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

Page 134: Sql presentacion

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:

Page 135: Sql presentacion

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.

Page 136: Sql presentacion

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

Page 137: Sql presentacion

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);

Page 138: Sql presentacion

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

Page 139: Sql presentacion

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.

Page 140: Sql presentacion

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.

Page 141: Sql presentacion

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.

Page 142: Sql presentacion

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.

Page 143: Sql presentacion

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

Page 144: Sql presentacion

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.

Page 145: Sql presentacion

Actualizaciones de bases de datos

INSERT, DELETE, UPDATE

Page 146: Sql presentacion

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

Page 147: Sql presentacion

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

Page 148: Sql presentacion

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);

Page 149: Sql presentacion

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

Page 150: Sql presentacion

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);

Page 151: Sql presentacion

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.

Page 152: Sql presentacion

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

Page 153: Sql presentacion

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

Page 154: Sql presentacion

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

Page 155: Sql presentacion

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

Page 156: Sql presentacion

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

Page 157: Sql presentacion

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.

Page 158: Sql presentacion

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

Page 159: Sql presentacion

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%.

Page 160: Sql presentacion

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

Page 161: Sql presentacion

Vistas

Tablas virtuales

Page 162: Sql presentacion

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

Page 163: Sql presentacion

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

Page 164: Sql presentacion

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

Page 165: Sql presentacion

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

Page 166: Sql presentacion

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.

Page 167: Sql presentacion

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.

Page 168: Sql presentacion

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

Page 169: Sql presentacion

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

Page 170: Sql presentacion

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.

Page 171: Sql presentacion

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

Page 172: Sql presentacion

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

Page 173: Sql presentacion

Triggers

Disparadores

Page 174: Sql presentacion

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

Page 175: Sql presentacion

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

Page 176: Sql presentacion

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.

Page 177: Sql presentacion

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

Page 178: Sql presentacion

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.

Page 179: Sql presentacion

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

Page 180: Sql presentacion

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:

Page 181: Sql presentacion

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.

Page 182: Sql presentacion

Transacciones

Page 183: Sql presentacion

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

Page 184: Sql presentacion

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

Page 185: Sql presentacion

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

Page 186: Sql presentacion

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!

Page 187: Sql presentacion

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.

Page 188: Sql presentacion

Procedimientos

Page 189: Sql presentacion

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.

Page 190: Sql presentacion

Funciones

Page 191: Sql presentacion

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

Page 192: Sql presentacion

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

Page 193: Sql presentacion

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)

Page 194: Sql presentacion

Seguridad SQL

Page 195: Sql presentacion

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:

Page 196: Sql presentacion

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

Page 197: Sql presentacion

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.

Page 198: Sql presentacion

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.

Page 199: Sql presentacion

199

Privilegios

El estándar SQL-1 especifica cuatro privilegios para tablas y vistas:SELECTINSERTDELETEUPDATE

Page 200: Sql presentacion

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 …])]]

Page 201: Sql presentacion

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 …])]]

Page 202: Sql presentacion

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

Page 203: Sql presentacion

203

Crear usuario

CREATE USER nom_usuario1 contraseña, nom_usuario2 contraseña, …

Page 204: Sql presentacion

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

Page 205: Sql presentacion

205

Borra un usuario

USE BD_FACTURA; DROP USER Jose;GO

Page 206: Sql presentacion

206

Crear un grupo de usuarios

CREATE GROUP nom_grupo1 contraseña, nom_grupo2 contraseña, …

Page 207: Sql presentacion

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

Page 208: Sql presentacion

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.

Page 209: Sql presentacion

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á

Page 210: Sql presentacion

210

Cambia contraseña del usuarioALTER USER nom_usuario

PASSWORD contraseña_nueva contraseña_anterior

Page 211: Sql presentacion

211

Cambia la contraseña de la base de datos

ALTER DATABASE PASSWORD contraseña_nueva contraseña_anterior