Resumen consultas muy bueno

Page 1

I.E.S. MARCOS ZARAGOZA

SISTEMAS GESTORES DE BASES DE DATOS


SQL


3

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

INTRODUCCIÓN


4

SQL no se limita únicamente a realizar consultas sobre los datos almacenados

Lenguaje de Definición de Datos.  DML: Lenguaje de Manipulación de Datos.  DCL: Lenguaje de Control de Datos.

 DDL:

SQL significa Structured Query Language (Lenguaje Estructurado de Consulta)  SQL incluye soporte para los lenguajes:

INTRODUCCIÓN


5

de acceso a datos  Compartición de datos entre usuarios concurrentes  Integridad de datos

Altas, Bajas y Modificaciones

 Control

de datos  Recuperación de datos  Manipulación de datos

 Definición

SQL permite:

INTRODUCCIÓN


6

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

entre proveedores

 Estandarización

 Portabilidad

 Independencia

Características:

INTRODUCCIÓN


? *

Un carácter cualquiera

Cero o más caracteres

7

%

_ (subrayado)

ANSI SQL

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

El estándar ANSI/ISO especifica que:

Access SQL

Carácter coincidente

Reglas del SQL ANSI


ď Ž

8

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.

Nombres de tabla y de columna


 Entero:

 Real:

234,45. 234

Numéricas: Se escriben directamente. Por ejemplo:

9

Alfanuméricas: Se escriben entre comillas preferentemente simples.  Fechas: Se escriben entre comillas preferentemente simples.

Constantes


 Funciones

de agregado

 Operadores

 Cláusulas

 Comandos

10

El lenguaje SQL está compuesto por:

Componentes de SQL


Para eliminar tablas e índices

Para modificar las tablas agregando campos o cambiando la definición de los campos.

DROP

ALTER

11

Para crear nuevas tablas, campos e índices

CREATE

Comando Descripción

Sentencias DDL


Para cargar lotes de datos en la base de datos en una Ăşnica operaciĂłn. Para modificar los valores de los campos y registros especificados Para eliminar registros de una tabla de una base de datos

INSERT

UPDATE

DELETE

12

Para consultar registros de la base de datos que satisfagan un criterio determinado

SELECT

Sentencias DML


Para especificar las condiciones que deben reunir los registros que se van a seleccionar Para separar los registros seleccionados en grupos específicos Para expresar la condición que debe satisfacer cada grupo Para ordenar los registros seleccionados de acuerdo con un orden específico

WHERE

GROUP BY

HAVING

ORDER BY

13

Para especificar la tabla de la cual se van a seleccionar los registros

FROM

Cláusulas


“O" lógico. Evalúa dos condiciones y devuelve un valor de verdar si alguna de las dos es cierta.

Negación lógica. Devuelve el valor contrario de la expresión.

OR

NOT

14

“Y" lógico. Evalua dos condiciones y devuelve un valor de verdad sólo si ambas son ciertas.

AND

Operador Uso

Operadores Lógicos


Mayor que Distinto de Menor 贸 Igual que Mayor 贸 Igual que Igual que Utilizado para especificar un intervalo de valores. Utilizado en la comparaci贸n de un modelo Utilizado para especificar registros de una base de datos

>

<>

<=

>=

=

BETWEEN

LIKE

IN

15

Menor que

<

Operadores de comparaci贸n


Utilizada para devolver el número de registros de la selección Utilizada para devolver la suma de todos los valores de un campo determinado Utilizada para devolver el valor más alto de un campo especificado Utilizada para devolver el valor más bajo de un campo especificado

COUNT

SUM

MAX

MIN

16

Utilizada para calcular el promedio de los valores de un campo determinado

AVG

Funciones de agregado


Tamañ o 1 byte

1 byte 1 byte 4 bytes 8 bytes

Tipo de Datos

BINARY

BIT

BYTE

COUNTER (Autonumérico)

CURRENCY (Moneda)

17

Un entero escalable entre 922.337.203.685.477,5808 y 922.337.203.685.477,5807.

Un número incrementado automáticamente (de tipo Long)

Un valor entero entre 0 y 255.

Valores Si/No ó True/False

Para consultas sobre tabla adjunta de productos de bases de datos que definen un tipo de datos Binario.

Descripción

Tipos de datos estándar (I)


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.

4 bytes

8 bytes

SINGLE

DOUBLE

18

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.

Un valor de fecha u hora entre los años 100 y 9999.

Tamaño Descripción

DATETIME 8 bytes

Tipo de Datos

Tipos de datos estándar (II)


Un entero corto entre -32,768 y 32,767.

2 bytes

4 bytes

1 byte por carácter

Según se necesite

1 byte por carácter

1 byte por carácter

SHORT

LONG ó INTEGER

LONGTEXT

LONGBINAR Y

TEXT CHAR

VARCHAR

Longitud variable 19

De cero a 255 caracteres

De cero 1 gigabyte. Utilizado para objetos OLE.

De cero a un máximo de 1.2 gigabytes. (MEMO)

Un entero largo entre -2,147,483,648 y 2,147,483,647.

Descripción

Tipo de Datos Tamaño

Tipos de datos estándar (III)


VARBINARY BOOLEAN LOGICAL LOGICAL1 YESNO INTEGER1 AUTOINCREMENT MONEY DATE TIME TIMESTAMP

BINARY BIT

BYTE COUNTER CURRENCY DATETIME

Tipo de Dato Sinรณnimos

20

Sinรณnimos de tipos de datos (I)


FLOAT4 IEEESINGLE REAL FLOAT FLOAT8 IEEEDOUBLE NUMBER NUMERIC INTEGER2 SMALLINT

SINGLE

DOUBLE

SHORT

Tipo de Dato Sinรณnimos

21

Sinรณnimos de tipos de datos (II)


Sinรณnimos INT INTEGER INTEGER4 GENERAL OLEOBJECT LONGCHAR MEMO NOTE ALPHANUMERIC CHAR CHARACTER STRING VARCHAR

Tipo de Dato

LONG

LONGBINAR Y

LONGTEXT

TEXT

22

Sinรณnimos de tipos de datos (III)


Creaciรณn de bases de datos


24

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

El lenguaje DDL


 CREATE,

25

que define y crea un objeto de la base de datos  DROP, que elimina un objeto existente en la base de datos  ALTER, que modifica la definición de un objeto de la base de datos

El núcleo del DDL está basado en tres cláusulas de SQL

El lenguaje DDL


USE

DATABASE Nombre_de_la_Base_de_Datos

Abre la base de datos.

Nombre_de_la_Base_de_Datos 26

Borra una Base de Datos que previamente está cerrada (CLOSE).

DATABASE Nombre_de_la_Base_de_Datos

Crea una base de datos con el nombre indicado.

DROP

CREATE

Dependiendo del SGBD utilizado, puede variar:

Creación y borrado de una BBDD


);

atributo ……

atributo ……

,

[NOT NULL]

27

atributo tipo(tamaño)[DEFAULT valor] [Índice],

Se realiza mediante la sentencia CREATE TABLE.La sintaxis básica es la siguiente: CREATE TABLE nombre_tabla (

Creación de una tabla


Es el nombre que tomará la

 tipo(tamaño):

28

es la indicación del tipo de dato que la columna podrá contener y su longitud.

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

tabla en la BBDD  atributo: Es el nombre de una de las columnas.

 nombre_tabla:

Creación de una tabla


La sintaxis que hay que usar es la siguiente: DEFAULT { valor | NULL }

29

NOT NULL, que indica que la columna no puede tomar el valor NULL.

 vínculos_de_columna:

son vínculos de integridad que se aplican a cada atributo concreto. Pueden ser:

 cláusula_defecto:

indica el valor de defecto que tomará la columna si no se le asigna uno explícitamente en el momento en que se crea la línea.

Creación de una tabla


 PRIMARY

30

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

vínculos_de_columna: (continuación)

Creación de una tabla


(continuación)

31

PRIMARY KEY (columna1 [, columna2,…]) para crear claves primarias compuestas de más de una columna.  FOREIGN KEY (columna1 [, columna2, …]) definiciones_de_referencia para crear claves ajenas de más de una columna

 vínculo_de_tabla:

son vínculos de integridad que se pueden referir a más columnas de la tabla. Estos pueden ser:

CHECK (expresión_condicional) Ejemplo: CHECK (PRECIO<1000)

 vínculos_de_columna:

Creación de una tabla


32

CREATE TABLE Autor ( IDPublicacion INTEGER REFERENCES Publicacion(ID), IDPersona INTEGER REFERENCES Persona(ID), PRIMARY KEY (IDPublicacion, IDPersona));

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 Publicacion ( ID INTEGER PRIMARY KEY, Tipo CHAR(18) NOT NULL);

Ejemplos:

Creaciรณn de una tabla en Informix


CHAR(30), DATETIME

); 33

Nombre CHAR(30), Fecha_Nac DATETIME, CONSTRAINT PK_Cole PRIMARY KEY (Num_Colegio)

CREATE TABLE Colegios ( Num_Colegio INTEGER NOT NULL,

); O bien:

Nombre Fecha_Nac

CREATE TABLE Colegios ( Num_Colegio INTEGER NOT NULL PRIMARY KEY,

Ejemplo de creaciรณn de tabla:


clave principal:

clave ajena:

34

[ON DELETE {NO ACTION | CASCADE | SET DEFAULT | SET NULL }] [ON UPDATE {NO ACTION | CASCADE | SET DEFAULT | SET NULL }]

CONSTRAINT FK_Nom_tabla_indices FOREIGN KEY (atributo1[, atributo2...]) REFERENCES Nom_tabla(Atributos_clave)

 Definir

CONSTRAINT PK_Nom_tabla_indices PRIMARY KEY (Atributos_clave_principal)

 Definir

Definir claves al final de la tabla


);

35

CONSTRAINT PK_Emple PRIMARY KEY (Apellidos, Nombre, Fecha_Nac)

CREATE TABLE Empleados ( Nombre CHAR(15), Apellidos CHAR(35), Fecha_Nac DATETIME, Telef CHAR(9),

Ejemplo creación de tabla con clave compuesta:


36

CONSTRAINT PK_Clie PRIMARY KEY (IDCliente) );

CREATE TABLE Clientes (IDCliente INTEGER NOT NULL, Nom CHAR(15) NOT NULL, Apel CHAR(35) NOT NULL,

Ejemplo de definición de una clave ajena I


37

CREATE TABLE Pedidos ( IDPedido INTEGER PRIMARY KEY, IDCliente INTEGER, NotasPedido CHAR(50), CONSTRAINT FK_Pedido_Cliente FOREIGN KEY (IDCliente) REFERENCES Clientes(IDCliente) ON UPDATE CASCADE ON DELETE CASCADE );

Ejemplo de definiciรณn de una clave ajena


); 38

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)

Definición de una clave única


DROP DROPTABLE TABLEEmpleados; Empleados; 39

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 nombre_de_tabla

Se especifica mediante la sentencia:

Borrado de una tabla


40

nuevas columnas a una tabla  Eliminar columnas de una tabla  Modificar las definiciones de campo de una tabla (no todos los SGBD permiten esta operación)  Crear restricciones de integridad  Eliminar restricciones de integridad

 Añadir

Permite básicamente las siguientes operaciones:

Modificación de tablas


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.

Adición de una nueva columna:

41

ALTER ALTERTABLE TABLEEmpleados EmpleadosADD ADDCOLUMN COLUMNSalario SalarioCURRENCY; CURRENCY;

Modificación de tablas


42

que tener en cuenta que puede haber reglas de integridad definidas que impidan la eliminación de una columna de una tabla

 Hay

ALTER TABLE nombre_tabla DROP nombre_columna

Eliminación de una columna de la tabla

ALTER ALTERTABLE TABLEEmpleados EmpleadosDROP DROPCOLUMN COLUMNSalario; Salario;

Modificación de tablas


ALTER TABLE nombre_tabla ALTER COLUMN nombre_columna TO nuevo_nombre_columna tipo_datos

Modificación de una columna de la tabla (Interbase)

43

ALTER ALTERTABLE TABLEEmpleados EmpleadosALTER ALTERCOLUMN COLUMNNom NomCHAR(40); CHAR(40);

ALTER ALTERTABLE TABLEEmpleados EmpleadosALTER ALTERCOLUMN COLUMNNom NomTO TONombre NombreCHAR(25); CHAR(25);

Modificación de tablas


44

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

Creación de una Restricción

Modificación de tablas


ALTER TABLE nombre_tabla DROP CONSTRAINT nombre_restricción

Eliminación de una Restricción (tabla de índices de una clave principal, única o ajena):

45

ALTER ALTERTABLE TABLEEmpleados EmpleadosDROP DROPCONSTRAINT CONSTRAINTFK_Emple; FK_Emple;

Modificación de tablas


46

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.

 Con

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:

Índices


47

El SGBD siempre creará un índice para la clave primaria de cada tabla

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

 La

Será conveniente crear índices en aquellas columnas de una tabla que son utilizadas frecuentemente en condiciones de búsqueda y ordenación.

Índices


sintaxis básica es la siguiente:

CREATE [UNIQUE] [ASC | DESC] INDEX nombre_indice ON nom_tabla (col [, col …]);

 Su

Creación de índices:

48

CREATE CREATEUNIQUE UNIQUEINDEX INDEXSK_calle_num SK_calle_num ON ONBloqueCasas BloqueCasas(calle, (calle,numero) numero)WITH WITHDISALLOW DISALLOWNULL; NULL;

Índices


sintaxis básica es la siguiente:

DROP INDEX nombre_indice;

 Su

Eliminación de índices:

DROP DROPINDEX INDEXSK_calle_num SK_calle_numON ONBloqueCasas BloqueCasas;;

DROP DROPINDEX INDEXSK_calle_num; SK_calle_num;

Índices

49


Base de datos Catastro

50


51

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;

Definir una relación 1:1


52

Creación BD “SQL_LANS”


53

Esquema de la BD en SQL Server


CREATE TABLE CLIENTES ( NUM_CLIE INT EMPRESA CHAR(20) REP_CLIE INT LIMITE_CREDITO FLOAT );

CREATE DATABASE SQL_LANS; USE SQL_LANS;

54

NOT NULL, NOT NULL, NOT NULL, NOT NULL

Ejemplo de creación de una BD


CREATE TABLE PEDIDOS ( NUM_PEDIDO INT FECHA_PEDIDO DATETIME CLIE INT REP INT, FAB CHAR(3) PRODUCTO CHAR(5) CANT INT IMPORTE FLOAT );

NOT NULL, NOT NULL, NOT NULL, NOT NULL

NOT NULL, NOT NULL, NOT NULL,

NOT NULL, NOT NULL, NOT NULL, NOT NULL, NOT NULL, NOT NULL

CREATE TABLE OFICINAS ( OFICINA INT CIUDAD CHAR(15) REGION CHAR(10) DIR INT OBJETIVO FLOAT VENTAS FLOAT );

55

Ejemplo de creación de una BD


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

NOT NULL, NOT NULL, NOT NULL, NOT NULL, NOT NULL

CREATE TABLE PRODUCTOS ( ID_FAB CHAR(3) ID_PRODUCTO CHAR(5) DESCRIPCION CHAR(20) PRECIO FLOAT EXISTENCIAS INT );

56

Ejemplo de creación de una BD


ALTER TABLE Clientes ADD CONSTRAINT PK_Clie

ALTER TABLE Pedidos ADD CONSTRAINT PK_Pedidos PRIMARY KEY (NUM_PEDIDO);

ALTER TABLE Productos ADD CONSTRAINT PK_Productos PRIMARY KEY (ID_FAB, ID_PRODUCTO);

ALTER TABLE Repventas ADD CONSTRAINT PK_Repventas PRIMARY KEY (NUM_EMPL);

57

ALTER TABLE Oficinas ADD CONSTRAINT PK_Oficinas PRIMARY KEY (OFICINA);

PRIMARY KEY (NUM_CLIE);

USE SQL_LANS;

Definición de las claves principales


ALTER TABLE Clientes ADD CONSTRAINT FK_Clientes_RepVentas

ON DELETE CASCADE;

FOREIGN KEY (DIRECTOR) REFERENCES RepVentas(NUM_EMPL) ON DELETE SET NULL;

58

ALTER TABLE RepVentas ADD CONSTRAINT FK_Repventas_RepVentas

FOREIGN KEY (OFICINA_REP) REFERENCES Oficinas(OFICINA) ON DELETE SET NULL;

ALTER TABLE RepVentas ADD CONSTRAINT FK_Repventas_Oficinas

FOREIGN KEY (CLIE) REFERENCES Clientes(NUM_CLIE)

ALTER TABLE Pedidos ADD CONSTRAINT FK_Pedidos_Clientes

FOREIGN KEY (FAB,PRODUCTO) REFERENCES Productos(ID_FAB,ID_PRODUCTO) ON DELETE RESTRICT;

ALTER TABLE Pedidos ADD CONSTRAINT FK_Pedidos_Productos

FOREIGN KEY (REP) REFERENCES RepVentas(NUM_EMPL) ON DELETE SET NULL;

ALTER TABLE Pedidos ADD CONSTRAINT FK_Pedidos_Repventas

FOREIGN KEY (DIR) REFERENCES RepVentas(NUM_EMPL) ON DELETE SET NULL;

ALTER TABLE Oficinas ADD CONSTRAINT FK_Oficinas_RepVentas

FOREIGN KEY (REP_CLIE) REFERENCES RepVentas(NUM_EMPL) ON DELETE SET NULL;

USE SQL_LANS;

Definición de las claves ajenas


59

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;

#DROP INDEX FK_Clientes #DROP INDEX FK_Oficinas #DROP INDEX FK_Pedidos_Repventas #DROP INDEX FK_Pedidos_Productos #DROP INDEX FK_Pedidos_Clientes #DROP INDEX FK_RepVentas_Oficinas #DROP INDEX FK_RepVentas_RepVentas

ON Clientes; ON Oficinas; ON Pedidos; ON Pedidos; ON Pedidos; ON RepVentas; ON RepVentas;

USE SQL_LANS;

Borrar claves ajenas


60

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;

Borrar claves principales


USE SQL_LANS;

DROP TABLE CLIENTES;

DROP TABLE OFICINAS;

DROP TABLE PEDIDOS;

DROP TABLE PRODUCTOS;

DROP TABLE REPVENTAS;

Borrar tablas de la BD

61


Consultas simples


BY

 ORDER

BY

 HAVING

 GROUP

 WHERE

 FROM

 SELECT

63

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

Sentencia SELECT


64

la lista de tablas que contienen los datos a recuperar.  Los datos pueden proceder de más de una tabla

 Indica

FROM

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

 Lista

SELECT

Sentencia SELECT


Se emplea para dar una condición de búsqueda para especificar las filas deseadas

Se emplea en consultas de resumen. Se verá en detalle más adelante

Indica una condición de selección solbre los grupos producidos por GROUP BY. Se verá en detalle más adelante

65

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

ORDER BY

HAVING

GROUP BY

WHERE

Sentencia SELECT


66

SELECT Apellidos, Nombre FROM Empleados WHERE Apellidos = 'King';

SELECT * FROM Pedidos WHERE Fecha_Envio = ´05/10/94’;

SELECT Id_Producto, Existencias FROM Productos WHERE Existencias <= Nuevo_Pedido;

SELECT Apellidos, Salario FROM Empleados WHERE Salario > 21000;

Algunos ejemplos de consultas SELECT

Sentencia SELECT


67

SELECT DISTINCT Nom_Proveedor FROM Pedidos;

 Ejemplo:

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.

 Si

Eliminación de duplicados:

Sentencia SELECT


68

la aplicación de la condición se pueden producir los siguientes resultados:

 En

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.

Cláusula WHERE


3.

2.

1.

69

Si la condición de búsqueda da como resultado CIERTO la tupla se incluye en la relación resultado Si la condición de búsqueda da FALSO la tupla se excluye de la relación resultado Si la condición de búsqueda da QUIZÁS la tupla se excluye de la relación resultado

Cláusula WHERE


Test de comparación Test de rango Test de pertenencia a un conjunto Test de correspondencia a un patrón Test de valor nulo 70

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:

Cláusula WHERE


=, <>, <, <=, >, >=

Se emplean en él los operadores de comparación habituales

71

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

TEST DE RANGO - BETWEEN

TEST DE COMPARACIÓN

Cláusula WHERE


72

Ejemplo: SELECT * FROM Pedidos WHERE Provincia In ('Madrid', 'Barcelona', 'Sevilla');

TEST DE PERTENENCIA A CONJUNTO – IN  Comprueba si un valor de dato coincide con uno de la lista de valores objetivo proporcionada.

Cláusula WHERE


73

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.

TEST DE CORRESPONDENCIA CON PATRÓN – LIKE

Cláusula WHERE


comodín ? de MS-DOS] 74

un único carácter, y sólo uno [Equivale el

_ (carácter de subrayado)  Corresponde con

comodín “*” de MS-DOS]

secuencia de cero o más caracteres [Equivale al

% (tanto por ciento)  Corresponde con una

Los caracteres comodín son los siguientes:

Cláusula WHERE


75

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

Ejemplo de patrón LIKE


Ejemplo:

76

SELECT * FROM Empleados WHERE Sueldo IS 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.

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

TEST DE VALOR NULO – IS NULL

Cláusula WHERE


SELECT Apell, Nom FROM Empleados WHERE Sueldo>1000 AND Nom=‘Juan’;

77

Ejemplo:

AND (Y lógica) OR (O lógica) NOT (Negación lógica)

Para ello se pueden utilizar las palabras reservadas

Utilizando las reglas de la lógica se pueden combinar condiciones de selección simples para formar otras complejas.

Condiciones compuestas


78

Ejemplo: SELECT Nom, Apell FROM Empleados ORDER BY Apell, Nom; O bien: ORDER BY 2,1

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

Ordenaciones


79

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

Ordenaciones


80

Consulta que muestra los empleados nacidos en 1990 con el sueldo aumentado un 20%. SELECT Nom, Apell, Sueldo*1,20 AS Nuevo_Sueldo FROM Empleados WHERE YEAR(Fecha_Nac)=1990 AND MONTH(Fecha_Nac)=6 AND Sueldo IS NOT NULL;

Consulta con expresión:


Consult a que nos muest r a el t ot al y la media de los sueldos de los empleados:  SELECT SUM(Sueldo) AS Tot al_ Sueldos, AVG(Sueldo) AS Media_ Sueldo FROM Empleados;  Podemos usar las siguient es f unciones de agr agado: SUM(), AVG(), MAX(), MI N(), 81 COUNT().

Consultas con funciones de agregado


Operación UNION del álgebra relacional

82

Las sentencias SELECT no pueden ser ordenadas, pero sí el resultado de la unión

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

SQL permite realizar la unión de dos consultas

Uniones


83

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

Uniones


яБо

84

SELECT ID_Fab, ID_Producto FROM Productos WHERE Precio > 2000.00 UNION [ALL] SELECT DISTINCT Fab, Producto FROM Pedidos WHERE Importe > 30000.00 ORDER BY 1,2;

Ejemplo de consulta union:


Consultas con dos o mรกs tablas

Consultas Multitabla


86

CLAVE PRIMARIA  CLAVE AJENA

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

Consultas Multitabla


CLAVE CLAVEPRIMARIA PRIMARIA == CLAVE CLAVEAJENA AJENA 87

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:

Composiciones simples (combinación interna):

Consultas Multitabla


Además, para poder hacer la combinación, se igualarán en una condición del WHERE los campos CLAVE PRIMARIA y CLAVE AJENA

Este tipo de consultas se suele denominar también PADRE – HIJO, o MAESTRO – DETALLE.

88

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

Consultas Multitabla


Del mismo modo, si existen varias columnas de emparejamiento (claves primaria y ajena formadas por múltiples campos), se pondrán todas, utilizando también la cláusula AND

89

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

Consultas Multitabla


Con SQL también es posible emplear cualquier par de columnas para hacer una combinación, sin que estas guarden una relación PADRE – HIJO

Además se pueden generar combinaciones basadas en desigualdades, utilizando el resto de operadores de comparación.

90

Las técnicas empleadas para emparejar dos tablas se hacen extensibles a tres o más tablas

Consultas Multitabla


Para evitar el problema que esto supone, se pueden cualificar mediante: TABLA.CAMPO

Si además las tablas se nominan mediante ALIASES, se pueden cualificar los campos mediante los mismos: ALIAS.CAMPO

91

En consultas multitabla es habitual que haya coincidencias en los nombres de los campos

Nombres de campo cualificados:

Consultas Multitabla


Si se quiere hacer una selección de todos los campos de una de las tablas de la consulta, se puede realizar mediante SELECT NOM_TABLA.*

92

Si se utiliza SELECT * se seleccionarán todos los campos de todas las tablas implicadas en la consulta

Selección de todos los campos:

Consultas Multitabla


93

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

SELECT

Ejemplo consulta con dos tablas


94

SELECT Pedidos.[ID de pedido], Clientes.[Nombre de la CompaĂąia], Clientes.[Ciudad], Pedidos.[Fecha de pedido], [Precio unidad], Cantidad FROM Pedidos, Clientes,[Detalle de Pedido] WHERE Pedidos.[ID de cliente]=Clientes.[ID Cliente] AND Pedidos.[ID de Pedido] = [Detalle de Pedido].[ID pedido] AND Cantidad>3;

Ejemplo con tres tablas


Para ello se debe hacer uso de los alias de tabla, dando a cada una de las dos tablas emuladas un alias distinto

Para crear los alias basta con poner el nombre deseado detrás del nombre de cada tabla en la cláusula FROM

95

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

Relación Maestro – Detalle REFLEXIVA:

Consultas Multitabla


(0 ,n )

R IO S (1 )

R IO S

A fl u e n t e de

(0 ,n )

(0 ,1 )

A fl u e n t e de

(0 ,1 )

R IO S (2 )

96

Relación Maestro – Detalle REFLEXIVA:

Consultas Multitabla


97

FROM Rios, Rios AS Afluente_de WHERE Rios.Cod_Rio_Afluente = Afluente_de.Cod_Rio;

'es afluente de ', Afluente_de.Nom_Rio

SELECT Rios.Nom_Rio,

Ejemplo de reflexiva


98

cuando se realiza una consulta multitabla.

igualdad de campos en la cláusula WHERE,

SQL si no se indica ninguna condición de

Es la composición que hace por defecto

Producto Cartesiano:

Consultas Multitabla


(producto cartesiano), entonces:

todos los emparejamientos posibles

nombres de chicas y queremos sacar

nombres de chicos y otra tabla con

Ejemplo: Si tenemos una tabla con

ORDER BY 1;

99

FROM Chicos, Chicas

Chicos.Nombre

SELECT Chicas.Nombre,

ď Ž

Producto cartesiano


Esto es a lo que se llama COMBINACIÓN INTERNA

En los casos en que al comprobar la igualdad de los campos nexo da un valor QUIZAS, se omiten esas tuplas

100

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

Combinación Interna

Consultas Multitabla


Combinación Externa Izquierda

Combinación Externa Derecha

Combinación Externa Simétrica

101

Se pueden dar los casos de:

Se puede especificar en SQL que incluyan las tuplas en los que la condición de igualdad de los campos nexo sea QUIZÁS

Combinación Externa

Consultas Multitabla


102

Se especifica mediante las cláusulas INNER JOIN y ON SELECT lista_campos FROM Tabla_1 INNER JOIN Tabla_2 ON Tabla_1.NEXO = Tabla_2.NEXO

COMBINACIÓN INTERNA

SQL 2 define una sintaxis específica para realizar las combinaciones internas y externas

Consultas Multitabla


103

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

SELECT

Ejemplo combinación interna


104

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;

Ejemplo combinaciĂłn con tres tablas


FULL:

Izquierda y derecha.

RIGHT: Derecha.

Izquierda.

LEFT:

Se especifica mediante las cláusulas [LEFT|RIGHT|FULL] OUTER JOIN y ON

105

SELECT lista_campos FROM Tabla_1 LEFT [OUTER] JOIN Tabla_2 ON Tabla_1.NEXO = Tabla_2.NEXO

COMBINACIÓN EXTERNA

Consultas Multitabla


106

Clientes.[Nombre de la Compañia], Clientes.[Ciudad], Pedidos.[ID de pedido], Pedidos.[Fecha de pedido] FROM Clientes LEFT JOIN Pedidos ON Pedidos.[ID de cliente]=Clientes.[ID Cliente];

SELECT

Ejemplo combinación externa por la izquierda

NULOS


Consultas Resumen


SQL permite resumir datos de la base de datos mediante un conjunto de funciones de columna.

108

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

Consultas Resumen


109

Distintos fabricantes suelen añadir en este campo muchas más funciones además de las estándar

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

Consultas Resumen


110

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

Funciones de Columna Estándar:

Consultas Resumen


111

SELECT NOMBRE, SUM(NOTAS) FROM ALUMNOS

Ejemplo ilegal:

No se puede anidar funciones de columna No se puede mezclar funciones de columna y nombres de columna ordinarios en una lista de selección

Restricciones:

Consultas Resumen


112

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

Valores NULL

Consultas Resumen


113

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

Eliminación de valores duplicados

Consultas Resumen


114

Puede haber varios campos de agrupación

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

Consultas Agrupadas – GROUP BY

Consultas Resumen


115

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.

El funcionamiento de las consultas agrupadas se puede ver conceptualmente de la siguiente forma:

Consultas Resumen


No se pueden utilizar campos calculados para agrupar por ellos

Funciones de columna

Columnas de agrupación (afectadas por GROUP BY)

Una expresión que afecte a las combinaciones anteriores

116

Constantes

Los elementos de la lista de selección sólo pueden ser:

Las columnas de agrupación deben ser columnas efectivas

Restricciones de las consultas agrupadas:

Consultas Resumen


117

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

Funciona de manera similar a la cláusula WHERE, aunque ésta lo hace sobre filas individuales

Condiciones de selección de grupos – HAVING

Consultas Resumen


Resultadousando usando Resultado cláusulaHAVING HAVING lalacláusula

118

Resultadosin sinusar usar Resultado cláusulaHAVING HAVING lalacláusula

SELECT Grupo, SUM(Cuota) AS Suma_Cuota FROM Alumnos Solo tendrá en cuenta para WHERE [¿HA PAGADO?]=TRUE agrupar y sumar los registros que GROUP BY Grupo cumplan la HAVING AVG(Cuota)>6500; condición.

El atributo debe estar en GROUP BY

Ejemplo Consulta Resumen


FROM Oficinas, RepVentas WHERE Oficina = Oficina_Rep GROUP BY Ciudad HAVING COUNT(*) >=2; 119

SUM(RepVentas.Ventas) AS Suma_Ventas

SELECT Ciudad, SUM(Cuota) AS Suma_Cuotas,

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

Ejemplo Consulta Resumen con dos tablas


Consultas anidadas

Subconsultas


Una subconsulta es una consulta que aparece dentro de la cláusula WHERE o de la cláusula HAVING

121

SQL permite utilizar los datos obtenidos como resultado de una consulta como parte de otra

Subconsultas


122

Es aconsejable emplear nombres de columna cualificados

Los nombres de columna de la subconsulta pueden hacer referencia a la consulta principal

No puede ser la UNION de varias SELECT

Su lista de selección contiene un único elemento

No se puede especificar la cláusula ORDER BY en la subconsulta

La subconsulta debe producir una única columna de datos resultado

Restricciones de las subconsultas:

Subconsultas


En el cuerpo de una subconsulta es habitual tener que referirse al valor de una columna en la “fila actual” de la consulta principal.

Oficinas.Oficina); 123

Ejemplo: SELECT Oficinas.Ciudad FROM Oficinas WHERE Objetivo > (SELECT SUM(RepVentas.Cuota) FROM RepVentas WHERE Repventas.Oficina_Rep =

Referencias Externas:

Subconsultas


Conforme SQL recorre cada fila de la tabla OFICINAS, utiliza el valor Oficinas.Oficina de la fila actual como argumento para resolver la condición WHERE de la subconsulta

124

En el ejemplo anterior, en la subconsulta se hace referencia al campo Oficinas.Oficina de la consulta prinicipal.

Subconsultas


Test de pertenencia a un conjunto subconsulta

Test de existencia

Test de comparación cuantificada

125

Test de comparación subconsulta

Los tipos de condiciones de subconsultas son:

Una subconsulta siempre forma parte de una condición WHERE o HAVING

Condiciones de búsqueda en subconsultas:

Subconsultas


Compara el valor de una expresión con un valor único producido por la subconsulta

Si la subconsulta no produce filas o produce un valor NULL, el test de comparación devuelve NULL

126

Hace uso de los operadores típicos de comparación: (=,<,>,<=,>=,<>).

Test de comparación subconsulta:

Subconsultas


SELECT * FROM Productos WHERE PrecioUnidad > (SELECT AVG(PrecioUnidad) FROM Detalles de pedidos WHERE Descuento >= .25);

Importante: Importante: Si Sien enuna unaconsulta consultautilizamos utilizamosen enla lacláusula cláusula WHERE WHEREcualquiera cualquierade delos losseis seisoperadores operadores(=,<,>,<=,>=,<>), (=,<,>,<=,>=,<>), para paracomparar compararcon conuna unasubconsulta, subconsulta, yyno noutilizamos utilizamos ninguno ninguno de delos losoperadores operadoresANY, ANY,ALL, ALL, IN, IN,EXIST, EXIST,solamente solamente comparará compararácon conun un valor, valor,que queserá seráel elque queobtengamos obtengamos de dela la subconsulta subconsulta(nunca (nuncacon convarios). varios). 127

Ejemplo:


Se utiliza cuando se necesita comparar un valor de la fila que se está examinando con un conjunto de valores producidos por una subconsulta

El formato es prácticamente igual al de test de conjunto simple, solo que el conjunto en lugar de declararse explícitamente se obtiene por medio de una subconsulta

128

Compara un único valor de datos con una columna de valores producida por una subconsulta

Test de pertenencia a conjunto – IN

Subconsultas


SELECT * FROM Productos WHERE IdProducto IN (SELECT IdProducto FROM Detalles de pedidos WHERE Descuento >= .25);

Además, Además,puede puedeutilizar utilizarNOT NOTIN INpara pararecuperar recuperarsolamente solamenteaquellos aquellos registros registrosde delalaconsulta consultaprincipal principalpara paralos losque queningún ningúnregistro registrode delala subconsulta subconsultacontenga contengaun unvalor valorigual. igual. 129

El siguiente ejemplo devuelve todos los productos con descuento del 25 por ciento o mayor.

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.

Ejemplo:


No hay ninguna equivalencia en consultas simples, sólo se usa en subconsultas

130

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 €

Listar los productos para los cuales se ha recibido un pedido de 25.000 € ó más  Listar los

Ejemplo:

Comprueba si una subconsulta produce alguna fila de resultados

Test de existencia – EXISTS

Subconsultas


131

Utilice Utiliceel elpredicado predicadoEXISTS EXISTS(con (conla lapalabra palabrareservada reservadaopcional opcionalNOT) NOT)en en comparaciones comparacionesverdadero/falso verdadero/falsopara paradeterminar determinarsisila lasubconsulta subconsultadevuelve devuelve algĂşn algĂşnregistro. registro.

SELECT Descripcion FROM Productos WHERE EXISTS (SELECT * FROM Pedidos WHERE Producto = ID_producto AND Fab = Id_Fab AND Importe >= 25000);

Ejemplo:


La subconsulta contiene una columna con un conjunto de valores.

Si el conjunto de valores no es vacío, el test de existencia EXISTS devuelve TRUE, y por tanto la tupla de la relación de la consulta principal queda seleccionada

132

SQL recorre la relación de la consulta principal y para cada tupla de la misma realiza una subconsulta.

Conceptualmente el funcionamiento es:

Test de existencia – EXISTS

Subconsultas


Con los test cuantificados ANY y ALL extienden el test de conjunto IN a los operadores de comparación, tales como > y <.

Se utilizan conjuntamente con uno de los seis operadores de comparación, para comparar un único valor de test con una columna de valores, producida por la subconsulta

Si alguna de las comparaciones individuales devuelve TRUE, el test ANY devuelve TRUE y la fila de la consulta principal queda seleccionada

133

Similar al test de conjunto IN

Tests cuantificados – ANY

Subconsultas


SELECT * FROM Productos WHERE PrecioUnidad > ANY (SELECT PrecioUnidad FROM Detalles_pedido WHERE Descuento >= .25);

Utilice Utilicelos lospredicados predicadosANY ANYooSOME, SOME,que queson sonsinónimos, sinónimos,para pararecuperar recuperar registros registrosde delalaconsulta consultaprincipal principalque quesatisfagan satisfaganla lacomparación comparacióncon conotros otros registros registrosrecuperados recuperadosen enlalasubconsulta. subconsulta.Es Esdecir decirsi sialguna algunade delas las comparaciones comparacionesindividuales individualesproduce produceun unvalor valorVERDADERO, VERDADERO,el eltest testANY ANY devuelve devuelveel elresultado resultadoVERDAD VERDAD(TRUE). (TRUE).El Eltest testANY ANYse sepuede puedeutilizar utilizarcon conlos los operadores operadores(=,<,>,<=,>=,<>). (=,<,>,<=,>=,<>). 134

Elsiguiente siguienteejemplo ejemplodevuelve devuelvetodos todoslos losproductos productoscuyo cuyoprecio preciopor porunidad unidad El esmayor mayorque quecualquier cualquierproducto productovendido vendidocon conun undescuento descuentodel del25 25por por es cientooomayor: mayor: ciento

Ejemplo de Tests ANY o SOME


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.

135

La consulta principal genera una relación de datos, que es recorrida tupla a tupla

Conceptualmente:

Tests cuantificados – ANY

Subconsultas


Esta táctica elimina errores de interpretación, ya que el uso del test ANY puede llegar a se un tanto oscuro

136

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

Tests cuantificados – ANY

Subconsultas


137

SELECT SELECT** FROM FROM Productos Productos WHERE WHEREEXISTS EXISTS (SELECT (SELECTPrecioUnidad PrecioUnidad FROM FROM Detalles_pedido Detalles_pedido WHERE WHEREDescuento Descuento>= >= .25 .25AND AND Productos.PrecioUnidad>Detalles_pedido.PrecioUnidad); Productos.PrecioUnidad>Detalles_pedido.PrecioUnidad);

Ejemplo con EXISTS


Si todas de las comparaciones individuales devuelve TRUE, el test ALL devuelve TRUE y la fila de la consulta principal queda seleccionada

Conceptualmente funciona igual que el test ANY, salvo la necesidad que el valor comparado de la consulta principal tiene que dar TRUE con cada comparación con los datos obtenidos en la subconsulta

138

El funcionamiento del test ALL es similar al del test ANY

Tests cuantificados – ALL

Subconsultas


 Si Sicambia cambiaANY ANYaaALL ALLen enel elejemplo ejemploanterior, anterior,la laconsulta consultadevolvería devolveríasólo sólo aquellos aquellosproductos productoscuyo cuyoprecio preciopor porunidad unidadfuese fuesemayor mayorque queelelde detodos todos los losproductos productosvendidos vendidoscon conun undescuento descuentodel del25 25por porciento cientooomayor. mayor. Esto 139 Estoes esmucho muchomás másrestrictivo. restrictivo.

 Utilice Utiliceelelpredicado predicadoALL ALLpara pararecuperar recuperarsólo sólolos losregistros registrosde dela laconsulta consulta principal principalque quesatisfagan satisfaganlalacomparación comparacióncon contodos todoslos losregistros registros recuperados recuperadosen enlalasubconsulta. subconsulta.

WHERE WHERE PrecioUnidad PrecioUnidad >> ALL ALL (SELECT (SELECT PrecioUnidad PrecioUnidad FROM FROM Detalles_pedido Detalles_pedido WHERE WHERE Descuento Descuento >= >= .25); .25);

  SELECT SELECT ** FROM FROM Productos Productos

Ejemplo de Tests ALL


Generalmente se obtiene mayor rendimiento en una composición que con el uso de las subconsultas.

140

En algunos SGBD la única diferencia que se encontrará será la diferencia de rendimiento entre unas y otras.

En esos casos, las dos soluciones son correctas

Muchas consultas realizadas mediante subconsultas se pueden obtener también mediante consultas multitabla.

Subconsultas y Composiciones


Esto es generalizable a los niveles que sea necesario

SELECT SELECTEmpresa Empresa FROM FROM Clientes Clientes WHERE WHERERep_Clie Rep_ClieIN IN (SELECT (SELECTNum_Empl Num_Empl FROM FROM RepVentas RepVentas WHERE WHEREOficina_Rep Oficina_RepIN IN (SELECT (SELECTOficina Oficina FROM FROMOficinas Oficinas WHERE WHERERegion Region=='Este')); 'Este'));

141

Lista Listalos losclientes clientes(Empresa) (Empresa)cuyos cuyosvendedores vendedoresestán estánasignados asignadosaaoficinas oficinas de dela laregión regiónde deventas ventasEste. Este.

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

Subconsultas Anidadas




142

Finalmente Finalmentela laconsulta consultamás másexterna: externa: SELECT SELECTEmpresa Empresa FROM FROMClientes Clientes WHERE WHERERep_Clie Rep_ClieIN IN(Subconsulta) (Subconsulta) Mostrará Mostrarálos losclientes clientes(Empresa) (Empresa)cuyos cuyosvendedores vendedorestienen tienen uno unode delos losnúmeros númerosde deempleados empleadosseleccionados. seleccionados.

SELECT SELECTNum_Empl Num_EmplFROM FROMRepVentas RepVentas WHERE WHEREOficina_rep Oficina_repIN IN(subconsulta) (subconsulta) No Nodevuelve devuelveuna unacolumna columnaque quecontiene contienelos losnúmeros númerosde deempleados empleadosde de los losvendedores vendedoresque quetrabajan trabajanen enuna unade delas lasoficinas oficinasseleccionadas. seleccionadas.

La Lasubconsulta subconsultasiguiente: siguiente:

Nos Nosdevuelve devuelveuna unauna unacolumna columnaque quecontiene contienelos losnúmeros númerosde deoficina oficina de delas lasoficinas oficinasde delalaregión regiónEste. Este.

SELECT SELECTOficina OficinaFROM FROMOficinas OficinasWHERE WHERERegión Región==‘Este’; ‘Este’;

En Eneste esteejemplo ejemplolalasubconsulta subconsultamás másinterna: interna:

Pasos para realizar la consulta anterior:


Esta optimización no se puede realizar si la subconsulta contiene referencias externas - CORRELACIÓN

143

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

Para muchas subconsultas, se producen los mismos resultados

Conceptualmente, SQL realiza una subconsulta tantas veces como tuplas existen en la relación obtenida por la consulta principal

Subconsultas Correlacionadas


Cuando una subconsulta aparece en la cláusula HAVING, funciona como parte de la selección de grupo de filas efectuada por la cláusula HAVING.

Además se pueden utilizar las subconsultas en las sentencias INSERT, DELETE, UPDATE como veremos más adelante.

144

Además de utilizar las consultas en la cláusula WHERE se pueden emplear igualmente en la cláusula HAVING

Subconsultas en HAVING


INSERT, DELETE, UPDATE

Actualizaciones de bases de datos


los datos de la BBDD

 Crear

la propia BBDD 146

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

 Actualizar

Con SQL, además de poder realizar consultas para obtener resultados a partir de los datos incluidos en la BBDD, permite:

Actualizaciones de BBDD


147

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

en incluir nuevos registros de datos en las tablas de la BBDD  Los SGBD incluyen para ello:

 Consiste

ALTAS:

Introducción de datos en la BBDD


INSERT INTO Tabla (campo1, .., campoN) VALUES (valor1, ..., valorN)

Su sintaxis es la siguiente:

148

VALUES VALUES(112,’Henry (112,’HenryFord’, Ford’,46, 46,13, 13,‘Dir ‘DirVentas’, Ventas’,‘25/08/90’, ‘25/08/90’,NULL, NULL,NULL, NULL,0.0); 0.0);

( (Num_Empl, Num_Empl,Nombre, Nombre,Edad, Edad,Oficina_Rep, Oficina_Rep,Titulo, Titulo,Contrato, Contrato,Director, Director,Cuota, Cuota,Ventas Ventas) )

INSERT INSERTINTO INTORepVentas RepVentas

Sentencia INSERT de una fila


149

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

 SQL

Inserción de valores NULL:

Sentencia INSERT de una fila


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

 Si

Inserción de todas las columnas

150

INSERT INSERTINTO INTORepVentas RepVentas VALUES VALUES(112,’Henry (112,’HenryFord’, Ford’,46, 46,13, 13,‘Dir ‘DirVentas’, Ventas’,‘25/08/90’, ‘25/08/90’,NULL, NULL,NULL, NULL,0.0); 0.0);

Sentencia INSERT de una fila


151

SELECT SELECT Num_Pedido, Num_Pedido,Fecha_Pedido, Fecha_Pedido,Importe Importe INTO INTO AntPedidos AntPedidos FROM FROM Pedidos Pedidos WHERE WHERE Fecha_Pedido Fecha_Pedido >= >= ‘01/01/90’; ‘01/01/90’;

Crear Crearla latabla tablaAntPedidos AntPedidoscon conlos loscampos camposNum_pedido, Num_pedido, Fecha_Pedido, Fecha_Pedido,eeImporte, Importe,para paraaquellos aquellospedidos pedidoscuya cuyafecha fechade de pedido pedidosea seaigual igualoosuperior superioralalprimer primerdía díadel delaño año1990. 1990.

Crear una tabla y añadir registros


152

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

Sentencia INSERT multifila


153

INSERT INTO Tabla (campo1, …, campoN) SELECT TablaOrigenX.campo1, …, TablaOrigenZ.campoN FROM TablaOrigenX, …, TablaOrigenZ WHERE Condiciones_de_Selección

Su sintaxis básica es la siguiente:

Sentencia INSERT multifila


154

INSERT INSERT INTO INTO AntPedidos AntPedidos (( Num_Pedido, Num_Pedido, Fecha_Pedido, Fecha_Pedido, Importe Importe )) SELECT SELECT Num_Pedido, Num_Pedido, Fecha_Pedido, Fecha_Pedido, Importe Importe FROM FROM Pedidos Pedidos WHERE WHERE Fecha_Pedido Fecha_Pedido << ‘01/01/90’; ‘01/01/90’;

Añadir Añadiraalalatabla tabla AntPedidos, AntPedidos,aquellos aquellosde delalatabla tablapedidos pedidoscuya cuyafecha fechade de pedido pedidosea seamenor menoralal01-01-90 01-01-90

Ejemplo:


155

Hay que tener en cuenta que un borrado en una tabla puede desencadenar borrados en cascada en otras tantas

Si se pretenden eliminar todos los registros de una tabla, se prescindirá de la condición expresada en la cláusula WHERE

DELETE FROM Tabla WHERE criterio  DELETE FROM Pedidos WHERE Fecha_Pedido < ‘15/11/89’;

Se realiza mediante la sentencia DELETE Su sintaxis básica es la siguiente:

Supresión de datos de la BBDD


156

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

 En

Borrados con Subconsultas

Supresión de datos de la BBDD


157

DELETE DELETE FROM FROM Pedidos Pedidos WHERE WHERE Rep Rep == (SELECT (SELECT Num_Empl Num_Empl FROM FROM RepVentas RepVentas WHERE WHERE Nombre= Nombre='Sue 'SueSmith' Smith'); );

Suprime Suprimelos lospedidos pedidosaceptados aceptadospor porSue SueSmith. Smith.

Ejemplo de borrado con subconsulta:


158

Si se pretende modificar todos los registros de una tabla, se prescindirá de la cláusula WHERE

UPDATE Tabla SET Campo1=Valor1, …, CampoN=ValorN WHERE Criterio;

Se realiza mediante la sentencia UPDATE  Su sintaxis básica es la siguiente:

Modificación de datos en la BBDD


159

UPDATE UPDATE RepVentas RepVentas SET SET Oficina_Rep Oficina_Rep == 11, 11, Cuota Cuota == 0.9 0.9 *Cuota *Cuota WHERE WHERE Oficina_Rep Oficina_Rep == 12; 12;

Cambia Cambiaaatodos todoslos losvendedores vendedoresde delalaoficina oficinade deChicago Chicago(número (número12) 12)aala la oficina oficinade deNew NewYork York(número (número11) 11)yyrebaja rebajasus suscuotas cuotasun un10%. 10%.

Ejemplo de UPDATE


160

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

 En

Modificaciones con Subconsultas

Modificación de datos en la BBDD


Tablas virtuales

Vistas


162

permite acceder a los resultados de invocar a la ‘vista’ como si se tratase de una tabla de la BBDD

 SQL

Una vista es una consulta realizada en SQL, cuya definición está permanentemente almacenada en la BBDD, y que tiene además un nombre asignado

Vistas


163

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

 Permiten

Razones para utilizar las vistas:

Vistas


164

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

 Los

Una vista es una “tabla virtual” en la BBDD, cuyos contenidos están definidos por una consulta

Vistas


165

sintaxis básica es: CREATE VIEW nombre_vista [(col_vista [,col_vista …])] AS SELECT … Siendo SELECT una sentencia de selección completa

Su

Se realiza mediante la sentencia CREATE VIEW

Creación de una Vista


166

(Cod_Oficina, (Cod_Oficina, Ciudad, Ciudad, Region) Region) AS AS SELECT SELECT OFICINA, OFICINA, CIUDAD, CIUDAD, REGION REGION FROM FROM Oficinas Oficinas WHERE WHERE Region Region == 'Este'; 'Este';

  CREATE CREATE VIEW VIEW OficinasEste OficinasEste

Define Defineuna unavista vistaque quecontenga contengaúnicamente únicamentelas lasoficinas oficinasde delalaregión región“Este”, “Este”, cuyo cuyonombre nombresea seaOficinasEste. OficinasEste.

Ejemplo:


167

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.

Vistas Agrupadas:

Vistas


168

Por ejemplo, se podría calcular MIN(AVG(A))  No todos los SGBD tienen esta capacidad

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

Vistas Agrupadas:

Vistas


169

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

Vistas Compuestas:

Vistas


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

170

Las reglas de actualización de vistas dependen de cada SGBD.

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.

Actualizaciones sobre vistas:

Vistas


171

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

Comprobación de actualizaciones sobre vistas – WITH CHECK OPTION

Vistas


172

DROP DROP VIEW VIEW NombreVista NombreVista

La sintaxis básica de la eliminación de una vista es la siguiente:

Eliminación de una vista:

Vistas


Disparadores

Triggers


 Modificaciones

 Borrados

 Inserciones

174

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:

Triggers


175

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

Triggers


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.

176

Definiendo un disparador (trigger) de nombre NUEVOPEDIDO, haremos que estas actualizaciones de la Base de Datos se produzcan automáticamente.

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:

Desencadenadores o Triggers


Nombre del disparador

177

CREATE CREATE TRIGGER TRIGGER NuevoPedido NuevoPedido Tabla sobre la que actua ON Pedidos ON Pedidos FOR FOR INSERT INSERT Se activarรก cuando insertamos un AS registro en la tabla Pedidos. AS BEGIN BEGIN Importe insertado en UPDATE RepVentas Pedidos UPDATE RepVentas SET SET Ventas Ventas == Ventas Ventas ++ INSERTED.Importe INSERTED.Importe insertada en WHERE WHERE RepVentas.Num_Empl RepVentas.Num_Empl == INSERTED.Rep; INSERTED.Rep; Cantidad Pedidos UPDATE Productos UPDATE Productos SET SET Existencias Existencias == Existencias Existencias -- INSERTED.Cant INSERTED.Cant WHERE WHERE Productos.Id_Fab Productos.Id_Fab == INSERTED.Fab INSERTED.Fab AND AND Productos.Id_Producto Productos.Id_Producto == INSERTED.Producto; INSERTED.Producto; END; END;

Triggers - SQL SERVER


INSERT INTO Pedidos

178

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.

VALUES (222222,'12/02/1990',2111,103,'ACI','4100X',2,100)

(NUM_PEDIDO,FECHA_PEDIDO, CLIE,REP,FAB, PRODUCTO, CANT, IMPORTE)

Para probar el disparador anterior


Este Estedisparador disparadorfuerza fuerzala laintegridad integridadreferencial referencialde dela larelación relación OFICINAS/REPVENTAS, OFICINAS/REPVENTAS, yytambién tambiénmuestra muestraun unmensaje mensaje cuando cuandouna unaactualización actualizaciónfalla. falla.

179

Cuando hay una inserción o CREATE CREATETRIGGER TRIGGERActualiza_rep Actualiza_rep un actualización en la tabla ON ONRepVentas RepVentas Repventas comprueba que el FOR FORINSERT, INSERT,UPDATE UPDATE nº de oficina insertado sea AS AS válido IF ((SELECT COUNT(*) IF ((SELECT COUNT(*) FROM FROMOFICINAS, OFICINAS,INSERTED INSERTED WHERE WHEREOFICINAS.OFICINA=INSERTED.OFICINA_REP)=0) OFICINAS.OFICINA=INSERTED.OFICINA_REP)=0) BEGIN BEGIN PRINT PRINT'Especificado 'Especificadoun unnumero numerode deoficina oficinainvalido' invalido' ROLLBACK ROLLBACKTRANSACTION TRANSACTION END END



Triggers – Ejemplo integridad referencial


180

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:

Ejemplo borrado en cascada


181

Las Lasreferencias referenciasDELETED.OFICINA DELETED.OFICINAeeINSERTED.OFICINA INSERTED.OFICINAen enel eldisparador disparador se se refieren, refieren,respectivamente, respectivamente,aalos losvalores valoresde dela lacolumna columnaOFICINA OFICINAantes antes yydespués despuésde dela lasentencia sentenciaUPDATE. UPDATE.

CREATE CREATETRIGGER TRIGGERCambia_Oficina_Rep Cambia_Oficina_Rep ON ONOficinas Oficinas FOR FORUPDATE UPDATE AS AS IF IFUPDATE UPDATE(OFICINA) (OFICINA) BEGIN BEGIN UPDATE UPDATEREPVENTAS REPVENTAS SET SETREPVENTAS.OFICINA_REP=INSERTED.OFICINA REPVENTAS.OFICINA_REP=INSERTED.OFICINA FROM FROMREPVENTAS, REPVENTAS,INSERTED, INSERTED,DELETED DELETED WHERE WHEREREPVENTAS.OFICINA_REP=DELETED.OFICINA REPVENTAS.OFICINA_REP=DELETED.OFICINA END END

Ejemplo borrado en cascada


Transacciones


183

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

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:

Transacciones


COMMIT COMMIT WORK WORK

184

UPDATE UPDATEPEDIDOS PEDIDOS SET SETCANTIDAD CANTIDAD==10, 10,IMPORTE IMPORTE=3550.00 =3550.00 WHERE WHERENUM_PEDIDO NUM_PEDIDO==113051 113051 UPDATE UPDATEREPVENTAS REPVENTAS SET SETVENTAS VENTAS==VENTAS VENTAS--1458.00 1458.00++3550.00 3550.00 WHERE WHERENUM_EMPL NUM_EMPL==108 108 UPDATE UPDATEOFICINAS OFICINAS SET SETVENTAS VENTAS==VENTAS VENTAS--1458.00 1458.00++3550.00 3550.00 WHERE WHEREOFICINA OFICINA==21 21 UPDATE UPDATEPRODUCTOS PRODUCTOS SET SETEXISTENCIAS EXISTENCIAS==EXISTENCIAS EXISTENCIAS++44-10 -10 WHERE WHEREID_FAB ID_FAB=='QSA' 'QSA' AND ANDID_PRODUCTO ID_PRODUCTO=='XK47' 'XK47'

BEGIN BEGINTRANSACTION TRANSACTION

Ejemplo de Transacciรณn


185

USE USENorthWind NorthWind DECLARE @Error int DECLARE @Error int que utilizaremos para almacenar un posible código de error --Declaramos una variable --Declaramos una variable que utilizaremos para almacenar un posible código de error BEGIN BEGINTRAN TRAN --Iniciamos --Iniciamoslalatransacción transacción UPDATE Products UPDATE ProductsSET SETUnitPrice=20 UnitPrice=20WHERE WHEREProductName ProductName=’Chai’ =’Chai’ --Ejecutamos la primera sentencia --Ejecutamos la primera sentencia SET SET@Error=@@ERROR @Error=@@ERROR --Si ocurre --Si ocurreun unerror erroralmacenamos almacenamossu sucódigo códigoen en@Error @Erroryysaltamos saltamosmediante medianteelel ----GOTO GOTOalaltrozo trozode decódigo códigoque quedeshara desharalalatransacción. transacción. IF (@Error<>0) GOTO TratarError IF (@Error<>0) GOTO TratarError --Si --Silalaprimera primerasentencia sentenciase seejecuta ejecutacon conéxito, éxito,pasamos pasamosaalalasegunda segunda UPDATE Products SET UnitPrice=20 WHERE ProductName=’Chang’ UPDATE Products SET UnitPrice=20 WHERE ProductName=’Chang’ SET SET@Error=@@ERROR @Error=@@ERROR --Y si --Y sihay hayun unerror errorhacemos hacemoscomo comoantes antes IF (@Error<>0) GOTO TratarError IF (@Error<>0) GOTO TratarError --Si --Sillegamos llegamoshasta hastaaquí aquíes esque quelos losdos dosUPDATE UPDATEse sehan hancompletado completadocon con --éxito y podemos “guardar” la transacción en la base de datos --éxito y podemos “guardar” la transacción en la base de datos COMMIT COMMITTRAN TRAN TratarError: TratarError: --Si --Siha haocurrido ocurridoalgún algúnerror errorllegamos llegamoshasta hastaaquí aquí IfIf@@Error<>0 THEN @@Error<>0 THEN BEGIN BEGIN PRINT PRINT‘Ha ‘Haecorrido ecorridoun unerror. error.Abortamos Abortamoslalatransacción’ transacción’ --Se lo comunicamos al usuario y deshacemos --Se lo comunicamos al usuario y deshacemoslalatransacción transacción --todo volverá a estar como si nada hubiera ocurrido --todo volverá a estar como si nada hubiera ocurrido ROLLBACK ROLLBACKTRAN TRAN END END

Ejemplo


¡Nada más lejos de la realidad!

186

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.

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.

Transacciones


187

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.

USE NorthWind BEGIN TRAN UPDATE Products SET UnitPrice=20 WHERE ProductName=’Chang’ UPDATE Products SET UnitPrice=20 WHERE ProductName=’Chang’ COMMIT TRAN

Si tenemos dos sentencias dentro de una transacción.

Transacciones


Procedimientos


NOTA: Los procedimientos son guardados en SQL Server en la carpeta de la la base de datos llamada Procedimientos Almacenados. 189

Para ejecutar el procedimiento usaremos: EXECUTE Cli_Credito 20000 , 60000 donde Cli_Credito es el nombre del procedimiento, y 20000, 60000 los 2 parรกmetros que pasamos al procedimiento.

CREATE CREATEPROCEDURE PROCEDURECli_Credito Cli_Credito @Credito_Inf MONEY, @Credito_Inf MONEY, @Credito_Sup @Credito_Sup MONEY MONEY AS AS SELECT SELECT** FROM FROM Clientes Clientes WHERE WHERELimite_Credito Limite_Credito BETWEEN BETWEEN @Credito_Inf @Credito_Inf AND AND@Credito_Sup @Credito_Sup

Crear Procedimientos


Funciones


Nombre del parรกmetro que pasamos a la funciรณn

191

CREATE CREATE FUNCTION FUNCTION dbo.Cube( dbo.Cube( @fNumber @fNumber float) float) RETURNS RETURNS float float AS AS BEGIN BEGIN RETURN RETURN(@fNumber (@fNumber**@fNumber @fNumber **@fNumber) @fNumber) END END

Funciรณn

Nombre de la funciรณn




192

IF IF@iNumber @iNumber <= <= 11 SET SET @i @i== 11 ELSE ELSE SET SET @i @i== @iNumber @iNumber ** dbo.Factorial(@iNumber dbo.Factorial(@iNumber --11)) RETURN RETURN(@i) (@i) END END

CREATE CREATEFUNCTION FUNCTION dbo.Factorial( dbo.Factorial( @iNumber @iNumber int int)) RETURNS RETURNSINT INT AS AS BEGIN BEGIN DECLARE DECLARE@i @iint int

Función factorial


193

CREATE CREATE FUNCTION FUNCTION dbo.AuthorsForState(@cState dbo.AuthorsForState(@cState char(2) char(2) )) RETURNS RETURNS TABLE TABLE AS AS RETURN RETURN (SELECT (SELECT ** FROM FROM Authors Authors WHERE WHERE state state == @cState) @cState)

Funciรณn con una tabla


Seguridad SQL


195

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:

Seguridad SQL


196

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

 Los

Seguridad SQL


197

Cada SGBD tiene su propia implementación de los procesos de seguridad.

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

Los usuarios son los actores de la BBDD

Seguridad SQL


ď Ž

198

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.

 Definiendo

Las vistas juegan un papel esencial en la seguridad:

Vistas y Seguridad SQL


 UPDATE

 DELETE

 INSERT

 SELECT

199

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

Privilegios


sintaxis básica es:

ALL [PRIVILEGES] | { SELECT | DELETE | INSERT | UPDATE [(col [, col …])]]

Siendo <privilegios>:

GRANT <privilegios> ON {nombre_tabla | nombre_vista} TO {PUBLIC | usuario, …, usuario [WITH GRANT OPTION]}

 Su

Cláusula GRANT

200

Concesión de Privilegios


sintaxis básica es:

ALL [PRIVILEGES] | { SELECT | DELETE | INSERT | UPDATE [(col [, col …])]]

Siendo <privilegios>:

REVOKE <privilegios> ON {nombre_tabla | nombre_vista} FROM {PUBLIC | usuario, …, usuario}

 Su

Cláusula REVOKE

201

Revocación de Privilegios


202

de datos “Pepe” correspondiente a BD_Factura

CREATE LOGIN Pepe WITH PASSWORD =‘m1a2n3o4l5o'; USE BD_Facturas; CREATE USER Pepe FOR LOGIN Pepe; Crea el usuario de base GO

Crear un usuario

Crea un inicio de sesión de servidor denominado “Pepe” con una contraseña


203

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

Crear usuario


204

Cambia el nombre del usuario de la base de datos BD_FACTURA “Pepe” a “Jose”.

USE BD_FACTURA; ALTER USER Pepe WITH NAME = Jose; GO

Cambiar el nombre de usuario


USE BD_FACTURA; DROP USER Jose; GO

Borra un usuario

205


206

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

Crear un grupo de usuarios


Cuando se haya agregado el usuario a un grupo, el usuario disfrutará de todos los permisos que se han otorgado a ese grupo

207

Añade uno o más usuarios a un grupo

ADD USER nom_usuario [,nom_usuario,..] TO nom_grupo

Añadir usuarios a un grupo


208

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.

DROP GROUP nom_grupo

Borra un grupo


Si utilizamos DROP USER con la cláusula FROM, quitará del grupo los usuarios que indiquemos, pero no los borrará

209

Si utilizamos DROP USER sin la cláusula FROM, borrará los usuarios que indiquemos.

DROP USER nom_usuario1, nom_usuario2, …[FROM nom_grupo]

Borra un usuario


210

PASSWORD contraseña_nueva contraseña_anterior

ALTER USER nom_usuario

Cambia contraseña del usuario


211

ALTER DATABASE PASSWORD contraseña_nueva contraseña_anterior

Cambia la contraseña de la base de datos


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.