Sql presentacion

728
-1

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
728
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
56
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Sql presentacion

  1. 1. SISTEMASGESTORES DEBASES DE DATOSI.E.S. MARCOS ZARAGOZA
  2. 2. SQL
  3. 3. 3INTRODUCCIÓN SQL fue desarrollado inicialmente por IBM comolenguaje 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 tratande favorecer la estandarización del lenguaje, noobstante, cada fabricante de SGBDs aporta suspropias características
  4. 4. 4INTRODUCCIÓ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 realizarconsultas sobre los datos almacenados
  5. 5. 5INTRODUCCIÓN SQL permite: Definición de datos Recuperación de datos Manipulación de datos Altas, Bajas y Modificaciones Control de acceso a datos Compartición de datos entre usuarios concurrentes Integridad de datos
  6. 6. 6INTRODUCCIÓ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 deprogramación Múltiples vistas de datos Arquitectura cliente/servidor
  7. 7. 7Reglas del SQL ANSICarácter coincidente Access SQL ANSI SQLUn carácter cualquiera ? _ (subrayado)Cero o más caracteres * %El estándar ANSI/ISO especifica que: Los nombres SQL deben contener de 1 a 18caracteres, comenzar con una letra, y que no puedencontener espacios o caracteres de puntuaciónespeciales, exceptuando el guión de subrayado.
  8. 8. 8Nombres de tabla y de columna Pepe.Productos: Hace referencia a latabla Productos de la que el usuario Pepees propietario. Productos.Clave: Hace referencia alatributo Clave de la tabla Productos. Esnecesario poner el alias de la tablacuando hay atributos en distintas tablasque tienen el mismo nombre.
  9. 9. 9Constantes Numéricas: Se escriben directamente.Por ejemplo:Real: 234,45.Entero: 234 Alfanuméricas: Se escriben entrecomillas preferentemente simples. Fechas: Se escriben entre comillaspreferentemente simples.
  10. 10. 10Componentes de SQL El lenguaje SQL está compuesto por:ComandosCláusulasOperadoresFunciones de agregado
  11. 11. 11Sentencias DDLComando DescripciónCREATE Para crear nuevas tablas, campos eíndicesDROP Para eliminar tablas e índicesALTER Para modificar las tablas agregandocampos o cambiando la definición delos campos.
  12. 12. 12Sentencias DMLSELECT Para consultar registros de la base dedatos que satisfagan un criteriodeterminadoINSERT Para cargar lotes de datos en la basede datos en una única operación.UPDATE Para modificar los valores de loscampos y registros especificadosDELETE Para eliminar registros de una tablade una base de datos
  13. 13. 13CláusulasFROM Para especificar la tabla de la cual se vana seleccionar los registrosWHERE Para especificar las condiciones quedeben reunir los registros que se van aseleccionarGROUP BY Para separar los registros seleccionadosen grupos específicosHAVING Para expresar la condición que debesatisfacer cada grupoORDER BY Para ordenar los registros seleccionadosde acuerdo con un orden específico
  14. 14. 14Operadores LógicosOperador UsoAND “Y" lógico. Evalua dos condiciones ydevuelve un valor de verdad sólo siambas son ciertas.OR “O" lógico. Evalúa dos condiciones ydevuelve un valor de verdar si algunade las dos es cierta.NOT Negación lógica. Devuelve el valorcontrario de la expresión.
  15. 15. 15Operadores de comparación< Menor que> Mayor que<> Distinto de<= Menor ó Igual que>= Mayor ó Igual que= Igual queBETWEEN Utilizado para especificar un intervalo devalores.LIKE Utilizado en la comparación de un modeloIN Utilizado para especificar registros de unabase de datos
  16. 16. 16Funciones de agregadoAVG Utilizada para calcular el promedio de losvalores de un campo determinadoCOUNT Utilizada para devolver el número deregistros de la selecciónSUM Utilizada para devolver la suma de todos losvalores de un campo determinadoMAX Utilizada para devolver el valor más alto deun campo especificadoMIN Utilizada para devolver el valor más bajo deun campo especificado
  17. 17. 17Tipos de datos estándar (I)Tipo de Datos TamañoDescripciónBINARY 1 byte Para consultas sobre tabla adjunta deproductos de bases de datos que definen untipo de datos Binario.BIT 1 byte Valores Si/No ó True/FalseBYTE 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 entre922.337.203.685.477,5808 y922.337.203.685.477,5807.
  18. 18. 18Tipos de datos estándar (II)Tipo deDatosTamaño DescripciónDATETIME 8 bytes Un valor de fecha u hora entre los años 100 y9999.SINGLE 4 bytes Un valor en punto flotante de precisión simplecon un rango de -3.402823*1038 a-1.401298*10-45para valores negativos,1.401298*10-45a 3.402823*1038 para valorespositivos, y 0.DOUBLE 8 bytes Un valor en punto flotante de doble precisióncon un rango de -1.79769313486232*10308 a-4.94065645841247*10-324para valoresnegativos, 4.94065645841247*10-324a1.79769313486232*10308 para valorespositivos, y 0.
  19. 19. 19Tipos de datos estándar (III)Tipo de Datos Tamaño DescripciónSHORT 2 bytes Un entero corto entre -32,768 y 32,767.LONG óINTEGER4 bytes Un entero largo entre -2,147,483,648 y2,147,483,647.LONGTEXT 1 byte porcarácterDe cero a un máximo de 1.2 gigabytes.(MEMO)LONGBINARYSegún senecesiteDe cero 1 gigabyte. Utilizado paraobjetos OLE.TEXTCHAR1 byte porcarácterDe cero a 255 caracteresVARCHAR 1 byte porcarácterLongitud variable
  20. 20. 20Sinónimos de tipos de datos (I)Tipo de Dato SinónimosBINARY VARBINARYBIT BOOLEANLOGICALLOGICAL1YESNOBYTE INTEGER1COUNTER AUTOINCREMENTCURRENCY MONEYDATETIME DATETIMETIMESTAMP
  21. 21. 21Sinónimos de tipos de datos (II)Tipo de Dato SinónimosSINGLE FLOAT4IEEESINGLEREALDOUBLE FLOATFLOAT8IEEEDOUBLENUMBERNUMERICSHORT INTEGER2SMALLINT
  22. 22. 22Sinónimos de tipos de datos (III)Tipo de Dato SinónimosLONG INTINTEGERINTEGER4LONGBINARYGENERALOLEOBJECTLONGTEXT LONGCHARMEMONOTETEXT ALPHANUMERICCHARCHARACTERSTRINGVARCHAR
  23. 23. Creación de basesde datos
  24. 24. 24El lenguaje DDL Además de la manipulación de datos, quese realiza por medio del lenguaje DML,con SQL se puede definir la propiaestructura de la Base de Datos Esto se realiza mediante el DDL Así como el DML está bastanteestandarizado, respecto al DDL, va ahaber muchas dependencias respecto alSGBD que se esté utilizando
  25. 25. 25El lenguaje DDL El núcleo del DDL está basado en trescláusulas de SQLCREATE, que define y crea un objeto de labase de datosDROP, que elimina un objeto existente en labase de datosALTER, que modifica la definición de unobjeto de la base de datos
  26. 26. 26Creación y borrado de una BBDDDependiendo del SGBD utilizado, puedevariar:CREATE DATABASE Nombre_de_la_Base_de_Datos Crea una base de datos con el nombreindicado.DROP DATABASE Nombre_de_la_Base_de_Datos Borra una Base de Datos que previamente estácerrada (CLOSE).USE Nombre_de_la_Base_de_Datos Abre la base de datos.
  27. 27. 27 Se realiza mediante la sentencia CREATETABLE.La sintaxis básica es la siguiente:CREATE TABLE nombre_tabla(atributo tipo(tamaño)[DEFAULT valor] [Índice],[NOT NULL]atributo …… ,atributo ……);Creación de una tabla
  28. 28. 28Creación de una tablanombre_tabla: Es el nombre que tomará latabla en la BBDDatributo: Es el nombre de una de lascolumnas. En la definición de la tabla se pueden crear tantascolumnas como sea necesario El nombre de columna debe empezar por un carácteralfabéticotipo(tamaño): es la indicación del tipo dedato que la columna podrá contener y sulongitud.
  29. 29. 29Creación de una tablacláusula_defecto: indica el valor dedefecto que tomará la columna si no se leasigna uno explícitamente en el momento enque se crea la línea. La sintaxis que hay que usar es la siguiente:DEFAULT { valor | NULL }vínculos_de_columna: son vínculos deintegridad que se aplican a cada atributoconcreto. Pueden ser: NOT NULL, que indica que la columna no puedetomar el valor NULL.
  30. 30. 30Creación de una tabla vínculos_de_columna: (continuación) PRIMARY KEY, que indica que la columna es la claveprimaria de la tabla. UNIQUE: indica que no se admiten duplicados para esecampo Una definición de referencia (clave ajena) con la forma:REFERENCES Nom_tabla(clave)[ON DELETE{NO ACTION | CASCADE | SET DEFAULT| SET NULL }][ON UPDATE{NO ACTION | CASCADE | SET DEFAULT| SET NULL }]
  31. 31. 31Creación de una tablavínculos_de_columna: (continuación) CHECK (expresión_condicional)Ejemplo: CHECK (PRECIO<1000)vínculo_de_tabla: son vínculos deintegridad que se pueden referir a máscolumnas de la tabla. Estos pueden ser: PRIMARY KEY (columna1 [, columna2,…])para crear claves primarias compuestas de más deuna columna. FOREIGN KEY (columna1 [, columna2, …])definiciones_de_referenciapara crear claves ajenas de más de una columna
  32. 32. 32Creación de una tabla en InformixEjemplos:CREATE TABLE Publicacion (ID INTEGER PRIMARY KEY,Tipo CHAR(18) NOT NULL);CREATE TABLE Libro (ID INTEGER PRIMARY KEY REFERENCES Publicacion(ID),Titulo VARCHAR(160) NOT NULL,Editor INTEGER NOT NULL REFERENCES Editor(ID),Volumen VARCHAR(16),Serie VARCHAR(160),Edicion VARCHAR(16),Mes_publicacion CHAR(3),Anyo_publicacion INTEGER NOT NULL,Comentario VARCHAR(255));CREATE TABLE Autor (IDPublicacion INTEGER REFERENCES Publicacion(ID),IDPersona INTEGER REFERENCES Persona(ID),PRIMARY KEY (IDPublicacion, IDPersona));
  33. 33. 33Ejemplo de creación de tabla:CREATE TABLE Colegios( Num_Colegio INTEGER NOT NULL PRIMARY KEY,Nombre CHAR(30),Fecha_Nac DATETIME);O bien:CREATE TABLE Colegios( Num_Colegio INTEGER NOT NULL,Nombre CHAR(30),Fecha_Nac DATETIME,CONSTRAINT PK_Cole PRIMARY KEY (Num_Colegio));
  34. 34. 34Definir claves al final de la tabla Definir clave principal:CONSTRAINT PK_Nom_tabla_indicesPRIMARY KEY (Atributos_clave_principal) Definir clave ajena:CONSTRAINT FK_Nom_tabla_indicesFOREIGN KEY (atributo1[, atributo2...])REFERENCES Nom_tabla(Atributos_clave)[ON DELETE{NO ACTION | CASCADE | SET DEFAULT | SET NULL }][ON UPDATE{NO ACTION | CASCADE | SET DEFAULT | SET NULL }]
  35. 35. 35Ejemplo creación de tabla con clave compuesta: CREATE TABLE Empleados( Nombre CHAR(15),Apellidos CHAR(35),Fecha_Nac DATETIME,Telef CHAR(9),CONSTRAINT PK_EmplePRIMARY KEY (Apellidos, Nombre, Fecha_Nac));
  36. 36. 36Ejemplo de definición de una clave ajena I CREATE TABLE Clientes(IDCliente INTEGER NOT NULL,Nom CHAR(15) NOT NULL,Apel CHAR(35) NOT NULL,CONSTRAINT PK_Clie PRIMARY KEY (IDCliente));
  37. 37. 37Ejemplo de definición de una clave ajenaCREATE TABLE Pedidos( IDPedido INTEGER PRIMARY KEY,IDCliente INTEGER,NotasPedido CHAR(50),CONSTRAINT FK_Pedido_ClienteFOREIGN KEY (IDCliente)REFERENCES Clientes(IDCliente)ON UPDATE CASCADEON DELETE CASCADE);
  38. 38. 38Definición de una clave únicaCREATE 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_empleFOREIGN KEY(Director)REFERENCES INFEMPLE(Num_Emple));
  39. 39. 39Borrado de una tabla Se especifica mediante la sentencia:DROP TABLE nombre_de_tabla La sentencia puede fallar si hay reglas deintegridad referencial que impidan elborrado de datos de tal tabla, y por tantotambién impiden el borrado de la propiatablaDROP TABLE Empleados;DROP TABLE Empleados;
  40. 40. 40Modificación de tablas Permite básicamente las siguientesoperaciones:Añadir nuevas columnas a una tablaEliminar columnas de una tablaModificar las definiciones de campo de unatabla (no todos los SGBD permiten estaoperación)Crear restricciones de integridadEliminar restricciones de integridad
  41. 41. 41Modificación de tablas Adición de una nueva columna:ALTER TABLE nombre_tablaADD nombre_col definición_col La definición de la columna sigue la misma sintaxisque se ha visto en el apartado relativo a la instrucciónCREATE TABLE.ALTER TABLE Empleados ADD COLUMN Salario CURRENCY;ALTER TABLE Empleados ADD COLUMN Salario CURRENCY;
  42. 42. 42Modificación de tablas Eliminación de una columna de la tablaALTER TABLE nombre_tablaDROP nombre_columnaHay que tener en cuenta que puede haberreglas de integridad definidas que impidan laeliminación de una columna de una tablaALTER TABLE Empleados DROP COLUMN Salario;ALTER TABLE Empleados DROP COLUMN Salario;
  43. 43. 43Modificación de tablas Modificación de una columna de la tabla(Interbase)ALTER TABLE nombre_tablaALTER COLUMN nombre_columnaTO nuevo_nombre_columna tipo_datosALTER TABLE Empleados ALTER COLUMN Nom TO Nombre CHAR(25);ALTER TABLE Empleados ALTER COLUMN Nom TO Nombre CHAR(25);ALTER TABLE Empleados ALTER COLUMN Nom CHAR(40);ALTER TABLE Empleados ALTER COLUMN Nom CHAR(40);
  44. 44. 44Modificación de tablas Creación de una RestricciónALTER TABLE nombre_tablaADD [CONSTRAINT nombre_restricción]{{PRIMARY KEY | UNIQUE} (col [, col …]) |FOREIGN KEY (col [, col …])REFERENCES otra_tabla[(otra_col [,otra_col …])][ON DELETE{NO ACTION|CASCADE|SET DEFAULT|SET NULL}][ON UPDATE{NO ACTION|CASCADE|SET DEFAULT|SET NULL}] |CHECK (condición)}
  45. 45. 45Modificación de tablas Eliminación de una Restricción (tabla deíndices de una clave principal, única oajena):ALTER TABLE nombre_tablaDROP CONSTRAINT nombre_restricciónALTER TABLE Empleados DROP CONSTRAINT FK_Emple;ALTER TABLE Empleados DROP CONSTRAINT FK_Emple;
  46. 46. 46Índices Un índice es una estructura que proporciona unacceso rápido a las filas de una tabla en funcióna los valores de una o más columnas La presencia o ausencia de un índice estransparente al usuario de SQL sólo que: Con un índice sobre un campo se consigue mayorrendimiento en la ordenación y búsqueda sobre elmismo Los índices van a ocupar espacio físico dealmacenamiento en el sistema de archivos donde seubica la BBDD.
  47. 47. 47Índices Será conveniente crear índices enaquellas columnas de una tabla que sonutilizadas frecuentemente en condicionesde búsqueda y ordenación.La indexación también se considera másadecuada cuando la BBDD se emplea máspara consultas que para la actualización dedatos El SGBD siempre creará un índice para laclave primaria de cada tabla
  48. 48. 48Índices Creación de índices:Su sintaxis básica es la siguiente:CREATE [UNIQUE] [ASC | DESC]INDEX nombre_indice ONnom_tabla (col [, col …]);CREATE UNIQUE INDEX SK_calle_numON BloqueCasas (calle, numero) WITH DISALLOW NULL;CREATE UNIQUE INDEX SK_calle_numON BloqueCasas (calle, numero) WITH DISALLOW NULL;
  49. 49. 49Índices Eliminación de índices:Su sintaxis básica es la siguiente:DROP INDEX nombre_indice;DROP INDEX SK_calle_num;DROP INDEX SK_calle_num;DROP INDEX SK_calle_num ON BloqueCasas ;DROP INDEX SK_calle_num ON BloqueCasas ;
  50. 50. 50Base de datos Catastro
  51. 51. 51Definir 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 estamanera: CREATE UNIQUE INDEX SK_calle_numON BloqueCasas (calle, numero) WITH DISALLOWNULL; ALTER TABLE BloqueCasas ADD CONSTRAINT FK_blo_viFOREIGN KEY (calle, numero)REFERENCES Vivienda(calle, numero)ON DELETE CASCADE;
  52. 52. 52Creación BD “SQL_LANS”
  53. 53. 53Esquema de la BD en SQL Server
  54. 54. 54Ejemplo de creación de una BD CREATE DATABASE SQL_LANS; USE SQL_LANS; CREATE TABLE CLIENTES(NUM_CLIE INT NOT NULL,EMPRESA CHAR(20) NOT NULL,REP_CLIE INT NOT NULL,LIMITE_CREDITO FLOAT NOT NULL);
  55. 55. 55Ejemplo de creación de una BD CREATE TABLE OFICINAS(OFICINA INT NOT NULL,CIUDAD CHAR(15) NOT NULL,REGION CHAR(10) NOT NULL,DIR INT NOT NULL,OBJETIVO FLOAT NOT NULL,VENTAS FLOAT NOT NULL); CREATE TABLE PEDIDOS(NUM_PEDIDO INT NOT NULL,FECHA_PEDIDO DATETIME NOT NULL,CLIE INT NOT NULL,REP INT,FAB CHAR(3) NOT NULL,PRODUCTO CHAR(5) NOT NULL,CANT INT NOT NULL,IMPORTE FLOAT NOT NULL);
  56. 56. 56Ejemplo de creación de una BD CREATE TABLE PRODUCTOS(ID_FAB CHAR(3) NOT NULL,ID_PRODUCTO CHAR(5) NOT NULL,DESCRIPCION CHAR(20) NOT NULL,PRECIO FLOAT NOT NULL,EXISTENCIAS INT NOT NULL); CREATE TABLE REPVENTAS(NUM_EMPL INT NOT NULL,NOMBRE CHAR(15) NOT NULL,EDAD SMALLINT NOT NULL,OFICINA_REP INT NOT NULL,TITULO CHAR(10) NOT NULL,CONTRATO DATETIME NOT NULL,DIRECTOR INT NOT NULL,CUOTA FLOAT NOT NULL,VENTAS FLOAT NOT NULL);
  57. 57. 57Definición de las claves principales USE SQL_LANS; ALTER TABLE Clientes ADD CONSTRAINT PK_CliePRIMARY KEY (NUM_CLIE); ALTER TABLE Oficinas ADD CONSTRAINT PK_OficinasPRIMARY KEY (OFICINA); ALTER TABLE Pedidos ADD CONSTRAINT PK_PedidosPRIMARY KEY (NUM_PEDIDO); ALTER TABLE Productos ADD CONSTRAINT PK_ProductosPRIMARY KEY (ID_FAB, ID_PRODUCTO); ALTER TABLE Repventas ADD CONSTRAINT PK_RepventasPRIMARY KEY (NUM_EMPL);
  58. 58. 58Definición de las claves ajenas USE SQL_LANS; ALTER TABLE Clientes ADD CONSTRAINT FK_Clientes_RepVentasFOREIGN KEY (REP_CLIE) REFERENCES RepVentas(NUM_EMPL)ON DELETE SET NULL; ALTER TABLE Oficinas ADD CONSTRAINT FK_Oficinas_RepVentasFOREIGN KEY (DIR) REFERENCES RepVentas(NUM_EMPL)ON DELETE SET NULL; ALTER TABLE Pedidos ADD CONSTRAINT FK_Pedidos_RepventasFOREIGN KEY (REP) REFERENCES RepVentas(NUM_EMPL)ON DELETE SET NULL; ALTER TABLE Pedidos ADD CONSTRAINT FK_Pedidos_ProductosFOREIGN KEY (FAB,PRODUCTO) REFERENCES Productos(ID_FAB,ID_PRODUCTO)ON DELETE RESTRICT; ALTER TABLE Pedidos ADD CONSTRAINT FK_Pedidos_ClientesFOREIGN KEY (CLIE) REFERENCES Clientes(NUM_CLIE) ON DELETE CASCADE; ALTER TABLE RepVentas ADD CONSTRAINT FK_Repventas_OficinasFOREIGN KEY (OFICINA_REP) REFERENCES Oficinas(OFICINA) ON DELETE SET NULL; ALTER TABLE RepVentas ADD CONSTRAINT FK_Repventas_RepVentasFOREIGN KEY (DIRECTOR) REFERENCES RepVentas(NUM_EMPL) ON DELETE SET NULL;
  59. 59. 59Borrar claves ajenas USE SQL_LANS; #DROP INDEX FK_Clientes ON Clientes; #DROP INDEX FK_Oficinas ON Oficinas; #DROP INDEX FK_Pedidos_Repventas ON Pedidos; #DROP INDEX FK_Pedidos_Productos ON Pedidos; #DROP INDEX FK_Pedidos_Clientes ON Pedidos; #DROP INDEX FK_RepVentas_Oficinas ON RepVentas; #DROP INDEX FK_RepVentas_RepVentas ON RepVentas; ALTER TABLE Clientes DROP CONSTRAINT FK_Clientes; ALTER TABLE Pedidos DROP CONSTRAINT FK_Pedidos_Repventas; ALTER TABLE Pedidos DROP CONSTRAINT FK_Pedidos_Productos; ALTER TABLE Pedidos DROP CONSTRAINT FK_Pedidos_Clientes; ALTER TABLE Repventas DROP CONSTRAINT FK_RepVentas_Oficinas; ALTER TABLE Repventas DROP CONSTRAINT FK_RepVentas_RepVentas;
  60. 60. 60Borrar claves principales DROP INDEX PK_Clie ON Clientes; DROP INDEX PK_Oficinas ON Oficinas; DROP INDEX PK_Pedidos ON Pedidos; DROP INDEX PK_ProductosON Productos; DROP INDEX PK_RepventasON Repventas;
  61. 61. 61Borrar tablas de la BD USE SQL_LANS; DROP TABLE CLIENTES; DROP TABLE OFICINAS; DROP TABLE PEDIDOS; DROP TABLE PRODUCTOS; DROP TABLE REPVENTAS;
  62. 62. Consultas simples
  63. 63. 63Sentencia SELECT La sentencia SELECT recupera datos de unabase de datos y los devuelve en forma de unarelación La sentencia SELECT puede llegar a constar dehasta seis cláusulas SELECT FROM WHERE GROUP BY HAVING ORDER BY
  64. 64. 64Sentencia SELECT SELECT Lista los datos a recuperar. Se pueden recuperar todas las columnas empleandoel carácter asterisco (“*”). Pueden ser datos contenidos en las tablas de la basede datos o bien especificarse operaciones pararealizar cálculos (campos calculados). Puede ser una constante. Ejemplo: ‘Total igual a ‘. FROM Indica la lista de tablas que contienen los datos arecuperar. Los datos pueden proceder de más de una tabla
  65. 65. 65Sentencia SELECT WHERE Se emplea para dar una condición de búsqueda para especificarlas filas deseadas GROUP BY Se emplea en consultas de resumen. Se verá en detalle másadelante HAVING Indica una condición de selección solbre los grupos producidospor GROUP BY. Se verá en detalle más adelante ORDER BY Permite ordenar los resultados de la consulta a través de una ode varias columnas, ascendente o descendentemente, a travésde las cláusulas ASC (por defecto) y DESC
  66. 66. 66Sentencia SELECT Algunos ejemplos de consultas SELECTSELECT Apellidos, SalarioFROM EmpleadosWHERE Salario > 21000;SELECT Id_Producto, ExistenciasFROM ProductosWHERE Existencias <= Nuevo_Pedido;SELECT * FROM PedidosWHERE Fecha_Envio = ´05/10/94’;SELECT Apellidos, Nombre FROM EmpleadosWHERE Apellidos = King;
  67. 67. 67Sentencia SELECT Eliminación de duplicados: Si en las consultas de selección se incluye una claveprimaria, el modelo relacional asegura que en losresultados no se van a producir duplicados. Si no se incluye una clave primaria, se puede forzarla eliminación de duplicados incluyendo la cláusulaDISCTINCT antes de la lista de campos.Ejemplo:SELECT DISTINCT Nom_ProveedorFROM Pedidos;
  68. 68. 68Cláusula WHERE Consta de la palabra clave WHEREseguida de una condición de búsqueda. Conceptualmente, SQL recorre cada filade la relación seleccionada y aplica acada tupla la condición de búsqueda.En la aplicación de la condición se puedenproducir los siguientes resultados:
  69. 69. 69Cláusula WHERE1. Si la condición de búsqueda da comoresultado CIERTO la tupla se incluye en larelación resultado2. Si la condición de búsqueda da FALSO latupla se excluye de la relación resultado3. Si la condición de búsqueda da QUIZÁS latupla se excluye de la relación resultado
  70. 70. 70Cláusula WHERE Para realizar las búsquedas, SQL cuenta condistintos tipos de condiciones, que facilitan laexpresividad y naturalidad en las selecciones Los predicados estándar son: Test de comparación Test de rango Test de pertenencia a un conjunto Test de correspondencia a un patrón Test de valor nulo
  71. 71. 71Cláusula WHERE TEST DE COMPARACIÓN Se emplean en él los operadores de comparaciónhabituales=, <>, <, <=, >, >= TEST DE RANGO - BETWEEN Comprueba si un dato se encuentra entre dosvalores Se indica mediante el nombre de campo acomprobar, a continuación la palabra reservadaBETWEEN, y los dos valores extremos del intervaloseparados por la palabra AND. Ej: SELECT Nom, DirFROM EmpleadosWHERE Sueldo BETWEEN 1000 AND 2000
  72. 72. 72Cláusula WHERE TEST DE PERTENENCIA A CONJUNTO – IN Comprueba si un valor de dato coincide conuno de la lista de valores objetivoproporcionada.Ejemplo:SELECT *FROM PedidosWHERE Provincia In (Madrid,Barcelona,Sevilla);
  73. 73. 73Cláusula WHERE TEST DE CORRESPONDENCIA CONPATRÓN – LIKE Se emplea en la comparación de Cadenasde Caracteres Comprueba si el valor de la columnaindicado se ajusta al patrón especificado Para especificar un patrón se emplean loscaracteres comodín.
  74. 74. 74Cláusula WHERE Los caracteres comodín son los siguientes: % (tanto por ciento)  Corresponde con unasecuencia de cero o más caracteres [Equivale alcomodín “*” de MS-DOS] _ (carácter de subrayado)  Corresponde conun único carácter, y sólo uno [Equivale elcomodín ? de MS-DOS]
  75. 75. 75Ejemplo de patrón LIKE Consulta que muestra el código y elnombre de los empleados cuyo apellidoempiece por “L”. SELECT Codigo, NombreFROM EmpleadosWHERE Apellidos LIKE ‘L%’;
  76. 76. 76Cláusula WHERE TEST DE VALOR NULO – IS NULL Para seleccionar las tuplas en las que ciertoatributo toma un valor nulo hay que hacerlomediante la comparación IS NULL Un error típico cometido en SQL es tratar de haceruna comparación del tipoCAMPO = NULL Esta comparación en realidad lo que hace es tratar debuscar un literal NULL que no es lo mismo que la falta dedato que indica el valor nulo del modelo relacional. Ejemplo: SELECT * FROM EmpleadosWHERE Sueldo IS NULL;
  77. 77. 77Condiciones compuestas Utilizando las reglas de la lógica se pueden combinarcondiciones de selección simples para formar otrascomplejas. Para ello se pueden utilizar las palabrasreservadas AND (Y lógica) OR (O lógica) NOT (Negación lógica) Ejemplo: SELECT Apell, NomFROM EmpleadosWHERE Sueldo>1000 AND Nom=‘Juan’;
  78. 78. 78Ordenaciones Si no se especifica ninguna opción, los resultadosdevueltos por SQL quedarán ordenados por losíndices definidos en las tablas. Se puede especificar el orden en que se deseanrecuperar los registros de las tablas mediante lacláusula: ORDER BY Lista de Campos [ASC | DESC] ORDER BY posición del campo en el SELECT Ejemplo: SELECT Nom, Apell FROM EmpleadosORDER BY Apell, Nom;O bien: ORDER BY 2,1
  79. 79. 79Ordenaciones Por omisión SQL ordena los datos ensecuencia ascendente (ASC) Para ordenar en secuencia descendente sepuede emplear la palabra clave DESC Si se quiere realizar una ordenación en base aun campo calculado, como será un campo nopresente en la BBDD, y por tanto no tienenombre, se debe emplear el número decolumna según aparece en la definición de laconsulta
  80. 80. 80Consulta con expresión: Consulta que muestra los empleados nacidosen 1990 con el sueldo aumentado un 20%. SELECT Nom, Apell,Sueldo*1,20 AS Nuevo_SueldoFROM EmpleadosWHERE YEAR(Fecha_Nac)=1990 ANDMONTH(Fecha_Nac)=6 ANDSueldo IS NOT NULL;
  81. 81. 81Consultas con funciones de agregado Consult a que nos muest ra el t ot al y la mediade los sueldos de los empleados: SELECT SUM(Sueldo) AS Tot al_Sueldos,AVG(Sueldo) ASMedia_SueldoFROM Empleados; Podemos usar las siguient es f unciones deagragado: SUM(), AVG(), MAX(), MI N(),COUNT().
  82. 82. 82Uniones SQL permite realizar la unión de dos consultas Operación UNION del álgebra relacional Para ello será imprescindible que lasrelaciones origen sean compatibles Para realizar una unión, se utiliza la cláusulaUNION intercalada entre dos sentenciasSELECT Las sentencias SELECT no pueden ser ordenadas,pero sí el resultado de la unión
  83. 83. 83Uniones Por omisión, en la unión de dosrelaciones se eliminan las tuplasduplicadas. Si se quiere alterar el comportamientonormal de la unión, forzando el que nose eliminen los duplicados, se puedeemplear la cláusula ALL inmediatamentedespués de la cláusula UNION
  84. 84. 84Ejemplo de consulta union: SELECT ID_Fab, ID_ProductoFROM ProductosWHERE Precio > 2000.00UNION [ALL]SELECT DISTINCT Fab, ProductoFROM PedidosWHERE Importe > 30000.00ORDER BY 1,2;
  85. 85. Consultas MultitablaConsultas con dos omás tablas
  86. 86. 86Consultas Multitabla SQL permite recuperar datosprocedentes de dos o más tablas de unabase de datos, generando nuevasrelaciones Cuando se quiere recuperar datos demás de una tabla, lo habitual es queexista un nexo de unión entre ellas CLAVE PRIMARIA  CLAVE AJENA
  87. 87. 87Consultas Multitabla Composiciones simples (combinacióninterna): Son las consultas multitabla fundamentales Recogen todas las tuplas formadas por lacombinación de las tuplas de la primeratabla con las de la segunda, en los casos enlos que el campo de combinación (CLAVEPRIMARIA –> CLAVE AJENA) tome valoresidénticos en ambas partes, es decir:CLAVE PRIMARIA = CLAVE AJENACLAVE PRIMARIA = CLAVE AJENA
  88. 88. 88Consultas Multitabla La sintaxis básica es idéntica a la de las consultasde selección, en las que se indicarán los camposprocedentes de cada tabla, y tras las cláusula FROMse nombrarán todas las tablas desde las queproceden Además, para poder hacer la combinación, seigualarán en una condición del WHERE los camposCLAVE PRIMARIA y CLAVE AJENA Este tipo de consultas se suele denominar tambiénPADRE – HIJO, o MAESTRO – DETALLE.
  89. 89. 89Consultas Multitabla Si además de incluir la condición decombinación se quieren añadir nuevascondiciones de selección, se puede hacermediante el uso de AND Del mismo modo, si existen varias columnasde emparejamiento (claves primaria y ajenaformadas por múltiples campos), se pondrántodas, utilizando también la cláusula AND
  90. 90. 90Consultas Multitabla Las técnicas empleadas para emparejar dostablas se hacen extensibles a tres o más tablas Con SQL también es posible emplear cualquierpar de columnas para hacer una combinación,sin que estas guarden una relación PADRE –HIJO Además se pueden generar combinacionesbasadas en desigualdades, utilizando el resto deoperadores de comparación.
  91. 91. 91Consultas Multitabla Nombres de campo cualificados: En consultas multitabla es habitual que hayacoincidencias en los nombres de los campos Para evitar el problema que esto supone, sepueden cualificar mediante:TABLA.CAMPO Si además las tablas se nominan medianteALIASES, se pueden cualificar los camposmediante los mismos:ALIAS.CAMPO
  92. 92. 92Consultas Multitabla Selección de todos los campos: Si se utiliza SELECT * se seleccionarántodos los campos de todas las tablasimplicadas en la consulta Si se quiere hacer una selección de todoslos campos de una de las tablas de laconsulta, se puede realizar medianteSELECT NOM_TABLA.*
  93. 93. 93Ejemplo consulta con dos tablasSELECT Pedidos.[ID de pedido],Clientes.[Nombre de la Compañia],Clientes.[Ciudad]Pedidos.[Fecha de pedido]FROM Pedidos, ClientesWHERE Pedidos.[ID de cliente]=Clientes.[ID Cliente];
  94. 94. 94Ejemplo con tres tablasSELECT Pedidos.[ID de pedido], Clientes.[Nombre de la Compañia],Clientes.[Ciudad], Pedidos.[Fecha de pedido], [Precio unidad],CantidadFROM Pedidos, Clientes,[Detalle de Pedido]WHERE Pedidos.[ID de cliente]=Clientes.[ID Cliente]AND Pedidos.[ID de Pedido] = [Detalle de Pedido].[ID pedido]AND Cantidad>3;
  95. 95. 95Consultas Multitabla Relación Maestro – Detalle REFLEXIVA: Para poder hacer una consulta Maestro – Detallereflexiva hay que emular que los datos seencuentran distribuidos en dos tablas distintas enlugar de una Para ello se debe hacer uso de los alias de tabla,dando a cada una de las dos tablas emuladas unalias distinto Para crear los alias basta con poner el nombredeseado detrás del nombre de cada tabla en lacláusula FROM
  96. 96. 96Consultas Multitabla Relación Maestro – Detalle REFLEXIVA:R I O SA f l u e n t ed e( 0 , 1 )( 0 , n )R I O S ( 1 )A f l u e n t ed eR I O S ( 2 )( 0 , n ) ( 0 , 1 )
  97. 97. 97Ejemplo de reflexivaSELECT Rios.Nom_Rio,es afluente de ,Afluente_de.Nom_RioFROM Rios, Rios AS Afluente_deWHERE Rios.Cod_Rio_Afluente = Afluente_de.Cod_Rio;
  98. 98. 98Consultas Multitabla Producto Cartesiano: Es la composición que hace por defectoSQL si no se indica ninguna condición deigualdad de campos en la cláusula WHERE,cuando se realiza una consulta multitabla.
  99. 99. 99Producto cartesianoSELECT Chicas.Nombre,Chicos.NombreFROM Chicos, ChicasORDER BY 1; Ejemplo: Si tenemos una tabla connombres de chicos y otra tabla connombres de chicas y queremos sacartodos los emparejamientos posibles(producto cartesiano), entonces:
  100. 100. 100Consultas Multitabla Combinación Interna SQL con las combinaciones que se han generadohasta el momento genera únicamente las tuplasque tienen coincidencia en valor en los camposnexo de las tablas implicadas Esto es a lo que se llama COMBINACIÓNINTERNA En los casos en que al comprobar la igualdad delos campos nexo da un valor QUIZAS, se omitenesas tuplas
  101. 101. 101Consultas Multitabla Combinación Externa Se puede especificar en SQL que incluyanlas tuplas en los que la condición deigualdad de los campos nexo sea QUIZÁS Se pueden dar los casos de: Combinación Externa Izquierda Combinación Externa Derecha Combinación Externa Simétrica
  102. 102. 102Consultas Multitabla SQL 2 define una sintaxis específicapara realizar las combinaciones internasy externas COMBINACIÓN INTERNA Se especifica mediante las cláusulas INNERJOIN y ONSELECT lista_campos FROMTabla_1 INNER JOIN Tabla_2ON Tabla_1.NEXO = Tabla_2.NEXO
  103. 103. 103Ejemplo combinación internaSELECT Pedidos.[ID de pedido],Clientes.[Nombre de la Compañia],Clientes.[Ciudad]Pedidos.[Fecha de pedido]FROM Clientes INNER JOIN PedidosON Pedidos.[ID de cliente]=Clientes.[ID Cliente]WHERE Pedidos.[Fecha de pedido]<’12/12/1991’;
  104. 104. 104Ejemplo combinación con tres tablasSELECT Pedidos.[ID de pedido], Clientes.[Nombre de la Compañia],Clientes.[Ciudad], Pedidos.[Fecha de pedido], [Precio unidad],CantidadFROM Clientes INNER JOIN (Pedidos INNER JOIN [Detalle dePedido] ON Pedidos.[ID de Pedido] = [Detalle de Pedido].[IDpedido] ) ON Pedidos.[ID de cliente]=Clientes.[ID Cliente]WHERE Cantidad>3;
  105. 105. 105Consultas Multitabla COMBINACIÓN EXTERNA Se especifica mediante las cláusulas[LEFT|RIGHT|FULL] OUTER JOIN y ON LEFT: Izquierda. RIGHT: Derecha. FULL: Izquierda y derecha.SELECT lista_campos FROMTabla_1 LEFT [OUTER] JOIN Tabla_2ON Tabla_1.NEXO = Tabla_2.NEXO
  106. 106. 106Ejemplo combinación externa por la izquierdaSELECT 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
  107. 107. Consultas Resumen
  108. 108. 108Consultas Resumen Muchas peticiones de información norequieren un detalle de todos losregistros implicados, sino unainformación resumida en base a lainformación total SQL permite resumir datos de la base dedatos mediante un conjunto defunciones de columna.
  109. 109. 109Consultas Resumen Una función de columna SQL aceptauna columna entera de datos comoargumento, y produce un único resultadoque resume toda la columna SQL estándar proporciona seisfunciones de columna Distintos fabricantes suelen añadir en estecampo muchas más funciones además delas estándar
  110. 110. 110Consultas 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 unacolumna MAX() obtiene el valor máximo de unacolumna COUNT() cuenta el número de valores deuna columna COUNT(*) cuenta las filas de una consulta
  111. 111. 111Consultas Resumen Restricciones: No se puede anidar funciones de columna No se puede mezclar funciones de columnay nombres de columna ordinarios en unalista de selecciónEjemplo ilegal:SELECT NOMBRE, SUM(NOTAS)FROM ALUMNOS
  112. 112. 112Consultas Resumen Valores NULL Las funciones de columna aceptanuna columna de valores comoargumento y producen como resultadoun resumen Si alguno de los valores de la columnaargumento toma el valor NULL, SQL loignorará en sus cálculos
  113. 113. 113Consultas Resumen Eliminación de valores duplicados Se puede hacer que el conjunto de valoresde la columna pasada como argumento nocontenga duplicados Esto se hace anteponiendo la palabra claveDISTINCT justo delante del argumento dela funciónEjemplo:SELECT COUNT(DISTINCT CIUDAD)FROM ALUMNOS
  114. 114. 114Consultas Resumen Consultas Agrupadas – GROUP BY Las consultas resumen vistas sólo producen unafila Con frecuencia es conveniente resumir losresultados no a nivel de total, sino a nivel desubtotales Esto se puede conseguir con SQL mediante lacláusula GROUP BY Una consulta agrupada constará al menos de doscampos: el de generación de grupos (deagrupación) y el resumen Puede haber varios campos de agrupación
  115. 115. 115Consultas Resumen El funcionamiento de las consultas agrupadasse puede ver conceptualmente de la siguienteforma: SQL seleccionará todas las filas que cumplan conlos criterios de selección A continuación agrupará las columnas, de modoque se produzcan tramos en los que no varía elvalor del campo de agrupación Para cada uno de estos tramos se aplicará lafunción de columna seleccionada, asociando elvalor obtenido del cálculo al valor del campo deagrupación.
  116. 116. 116Consultas Resumen Restricciones de las consultas agrupadas: Las columnas de agrupación deben ser columnasefectivas No se pueden utilizar campos calculados para agrupar porellos Los elementos de la lista de selección sólo puedenser: Constantes Funciones de columna Columnas de agrupación (afectadas por GROUP BY) Una expresión que afecte a las combinaciones anteriores
  117. 117. 117Consultas 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 orechazar mediante el uso de la cláusula HAVING, quese incluirá tras la especificación del GROUP BYEjemplo:SELECT Id_Familia, Sum(Stock)FROM ProductosGROUP BY Id_FamiliaHAVING Sum(Stock) > 100
  118. 118. 118Ejemplo Consulta Resumen SELECT Grupo, SUM(Cuota) AS Suma_CuotaFROM AlumnosWHERE [¿HA PAGADO?]=TRUEGROUP BY GrupoHAVING AVG(Cuota)>6500;Resultado usandola cláusula HAVINGResultado usandola cláusula HAVINGResultado sin usarla cláusula HAVINGResultado sin usarla cláusula HAVINGSolo tendrá encuenta paraagrupar y sumarlos registros quecumplan lacondición.El atributo debe estar en GROUP BY
  119. 119. 119Ejemplo Consulta Resumen con dos tablas SELECT Ciudad, SUM(Cuota) AS Suma_Cuotas,SUM(RepVentas.Ventas) AS Suma_VentasFROM Oficinas, RepVentasWHERE Oficina = Oficina_RepGROUP BY CiudadHAVING COUNT(*) >=2;Por cada oficina con dos o más personas, calcular la cuota total ylas ventas totales para todos los vendedores que trabajan en laoficina. (Agrupar por Ciudad siempre que haya dos o másrepresentantes).
  120. 120. SubconsultasConsultas anidadas
  121. 121. 121Subconsultas SQL permite utilizar los datos obtenidoscomo resultado de una consulta comoparte de otra Una subconsulta es una consulta queaparece dentro de la cláusula WHERE ode la cláusula HAVING
  122. 122. 122Subconsultas Restricciones de las subconsultas: La subconsulta debe producir una única columnade datos resultado Su lista de selección contiene un único elemento No se puede especificar la cláusula ORDER BY enla subconsulta No puede ser la UNION de varias SELECT Los nombres de columna de la subconsulta puedenhacer referencia a la consulta principal Es aconsejable emplear nombres de columna cualificados
  123. 123. 123Subconsultas Referencias Externas: En el cuerpo de una subconsulta es habitual tenerque referirse al valor de una columna en la “filaactual” de la consulta principal.Ejemplo:SELECT Oficinas.CiudadFROM OficinasWHERE Objetivo >(SELECT SUM(RepVentas.Cuota)FROM RepVentasWHERE Repventas.Oficina_Rep =Oficinas.Oficina);
  124. 124. 124Subconsultas En el ejemplo anterior, en la subconsulta sehace referencia al campo Oficinas.Oficinade la consulta prinicipal. Conforme SQL recorre cada fila de la tablaOFICINAS, utiliza el valorOficinas.Oficina de la fila actual comoargumento para resolver la condición WHEREde la subconsulta
  125. 125. 125Subconsultas Condiciones de búsqueda ensubconsultas: Una subconsulta siempre forma parte deuna condición WHERE o HAVING Los tipos de condiciones de subconsultasson: Test de comparación subconsulta Test de pertenencia a un conjunto subconsulta Test de existencia Test de comparación cuantificada
  126. 126. 126Subconsultas Test de comparación subconsulta: Hace uso de los operadores típicos decomparación: (=,<,>,<=,>=,<>). Compara el valor de una expresión con unvalor único producido por la subconsulta Si la subconsulta no produce filas o produceun valor NULL, el test de comparacióndevuelve NULL
  127. 127. 127Ejemplo: SELECT * FROM ProductosWHERE PrecioUnidad >(SELECT AVG(PrecioUnidad)FROM Detalles de pedidosWHERE Descuento >= .25);Importante: Si en una consulta utilizamos en la cláusulaWHERE cualquiera de los seis operadores (=,<,>,<=,>=,<>),para comparar con una subconsulta, y no utilizamos ningunode los operadores ANY, ALL, IN, EXIST, solamentecomparará con un valor, que será el que obtengamos de lasubconsulta (nunca con varios).Importante: Si en una consulta utilizamos en la cláusulaWHERE cualquiera de los seis operadores (=,<,>,<=,>=,<>),para comparar con una subconsulta, y no utilizamos ningunode los operadores ANY, ALL, IN, EXIST, solamentecomparará con un valor, que será el que obtengamos de lasubconsulta (nunca con varios).
  128. 128. 128Subconsultas Test de pertenencia a conjunto – IN Compara un único valor de datos con una columnade valores producida por una subconsulta Se utiliza cuando se necesita comparar un valor dela fila que se está examinando con un conjunto devalores producidos por una subconsulta El formato es prácticamente igual al de test deconjunto simple, solo que el conjunto en lugar dedeclararse explícitamente se obtiene por medio deuna subconsulta
  129. 129. 129Ejemplo: SELECT * FROM ProductosWHERE IdProducto IN(SELECT IdProductoFROM Detalles de pedidosWHERE Descuento >= .25);Utilice el predicado IN para recuperar sólo aquellos registros de laconsulta principal para los cuales algún registro de la subconsultacontenga un valor igual.El siguiente ejemplo devuelve todos los productos con descuento del 25por ciento o mayor.Además, puede utilizar NOT IN para recuperar solamente aquellosregistros de la consulta principal para los que ningún registro de lasubconsulta contenga un valor igual.Además, puede utilizar NOT IN para recuperar solamente aquellosregistros de la consulta principal para los que ningún registro de lasubconsulta contenga un valor igual.
  130. 130. 130Subconsultas Test de existencia – EXISTS Comprueba si una subconsulta produce alguna filade resultados No hay ninguna equivalencia en consultas simples,sólo se usa en subconsultasEjemplo:Listar los productos para los cuales se ha recibidoun pedido de 25.000 € ó más  Listar losproductos para los cuales existe al menos unpedido en el que esté el producto en cuestión, demodo que el pedido tiene un importe de al menos25.000 €
  131. 131. 131Ejemplo:SELECT DescripcionFROM ProductosWHERE EXISTS (SELECT *FROM PedidosWHERE Producto = ID_productoAND Fab = Id_FabAND Importe >= 25000);Utilice el predicado EXISTS (con la palabra reservada opcional NOT) encomparaciones verdadero/falso para determinar si la subconsulta devuelvealgún registro.Utilice el predicado EXISTS (con la palabra reservada opcional NOT) encomparaciones verdadero/falso para determinar si la subconsulta devuelvealgún registro.
  132. 132. 132Subconsultas Test de existencia – EXISTS Conceptualmente el funcionamiento es: SQL recorre la relación de la consulta principal ypara cada tupla de la misma realiza unasubconsulta. La subconsulta contiene una columna con unconjunto de valores. Si el conjunto de valores no es vacío, el test deexistencia EXISTS devuelve TRUE, y por tanto latupla de la relación de la consulta principalqueda seleccionada
  133. 133. 133Subconsultas Tests cuantificados – ANY Similar al test de conjunto IN Con los test cuantificados ANY y ALL extienden eltest de conjunto IN a los operadores decomparación, tales como > y <. Se utilizan conjuntamente con uno de los seisoperadores de comparación, para comparar un únicovalor de test con una columna de valores, producidapor la subconsulta Si alguna de las comparaciones individualesdevuelve TRUE, el test ANY devuelve TRUE y la fila dela consulta principal queda seleccionada
  134. 134. 134Ejemplo de Tests ANY o SOME SELECT * FROM ProductosWHERE PrecioUnidad > ANY(SELECT PrecioUnidadFROM Detalles_pedidoWHERE Descuento >= .25);Utilice los predicados ANY o SOME, que son sinónimos, para recuperarregistros de la consulta principal que satisfagan la comparación con otrosregistros recuperados en la subconsulta. Es decir si alguna de lascomparaciones individuales produce un valor VERDADERO, el test ANYdevuelve el resultado VERDAD (TRUE). El test ANY se puede utilizar con losoperadores (=,<,>,<=,>=,<>).Utilice los predicados ANY o SOME, que son sinónimos, para recuperarregistros de la consulta principal que satisfagan la comparación con otrosregistros recuperados en la subconsulta. Es decir si alguna de lascomparaciones individuales produce un valor VERDADERO, el test ANYdevuelve el resultado VERDAD (TRUE). El test ANY se puede utilizar con losoperadores (=,<,>,<=,>=,<>).El siguiente ejemplo devuelve todos los productos cuyo precio por unidades mayor que cualquier producto vendido con un descuento del 25 porciento o mayor:El siguiente ejemplo devuelve todos los productos cuyo precio por unidades mayor que cualquier producto vendido con un descuento del 25 porciento o mayor:
  135. 135. 135Subconsultas Tests cuantificados – ANY Conceptualmente: La consulta principal genera una relación dedatos, que es recorrida tupla a tupla La subconsulta genera una columna de datos, loscuales son comparados, según el operador decomparación seleccionado, uno a uno con el datode la tupla actual de la consulta principal Si alguna de las comparaciones da TRUE, la tuplade la relación principal es seleccionada.
  136. 136. 136Subconsultas Tests cuantificados – ANY Siempre se puede transformar una consultacon test ANY en una consulta con testEXISTS, trasladando la comparación alinterior de la condición de búsqueda de lasubconsulta Esta táctica elimina errores de interpretación,ya que el uso del test ANY puede llegar a seun tanto oscuro
  137. 137. 137Ejemplo con EXISTSSELECT *FROM ProductosWHERE EXISTS(SELECT PrecioUnidadFROM Detalles_pedidoWHERE Descuento >= .25 ANDProductos.PrecioUnidad>Detalles_pedido.PrecioUnidad);SELECT *FROM ProductosWHERE EXISTS(SELECT PrecioUnidadFROM Detalles_pedidoWHERE Descuento >= .25 ANDProductos.PrecioUnidad>Detalles_pedido.PrecioUnidad);
  138. 138. 138Subconsultas Tests cuantificados – ALL El funcionamiento del test ALL es similar al del testANY Si todas de las comparaciones individuales devuelveTRUE, el test ALL devuelve TRUE y la fila de laconsulta principal queda seleccionada Conceptualmente funciona igual que el test ANY,salvo la necesidad que el valor comparado de laconsulta principal tiene que dar TRUE con cadacomparación con los datos obtenidos en lasubconsulta
  139. 139. 139Ejemplo de Tests ALL SELECT * FROM ProductosWHERE PrecioUnidad > ALL(SELECT PrecioUnidadFROM Detalles_pedidoWHERE Descuento >= .25); SELECT * FROM ProductosWHERE PrecioUnidad > ALL(SELECT PrecioUnidadFROM Detalles_pedidoWHERE Descuento >= .25); Utilice el predicado ALL para recuperar sólo los registros de la consultaprincipal que satisfagan la comparación con todos los registrosrecuperados en la subconsulta. Si cambia ANY a ALL en el ejemplo anterior, la consulta devolvería sóloaquellos productos cuyo precio por unidad fuese mayor que el de todoslos 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 consultaprincipal que satisfagan la comparación con todos los registrosrecuperados en la subconsulta. Si cambia ANY a ALL en el ejemplo anterior, la consulta devolvería sóloaquellos productos cuyo precio por unidad fuese mayor que el de todoslos productos vendidos con un descuento del 25 por ciento o mayor.Esto es mucho más restrictivo.
  140. 140. 140Subconsultas y Composiciones Muchas consultas realizadas mediantesubconsultas se pueden obtener tambiénmediante consultas multitabla. En esos casos, las dos soluciones soncorrectas En algunos SGBD la única diferencia que seencontrará será la diferencia de rendimiento entreunas y otras. Generalmente se obtiene mayor rendimiento en unacomposición que con el uso de las subconsultas.
  141. 141. 141Subconsultas Anidadas Del mismo modo que una consulta principal puedehacer uso de una subconsulta, una subconsulta puedehacer uso al mismo tiempo de otra nueva subconsulta Esto es generalizable a los niveles que sea necesarioSELECT EmpresaFROM ClientesWHERE Rep_Clie IN(SELECT Num_EmplFROM RepVentasWHERE Oficina_Rep IN(SELECT OficinaFROM OficinasWHERE Region = Este));SELECT EmpresaFROM ClientesWHERE Rep_Clie IN(SELECT Num_EmplFROM RepVentasWHERE Oficina_Rep IN(SELECT OficinaFROM OficinasWHERE Region = Este));Lista los clientes (Empresa) cuyos vendedores están asignados a oficinasde la región de ventas Este.Lista los clientes (Empresa) cuyos vendedores están asignados a oficinasde la región de ventas Este.
  142. 142. 142 Finalmente la consulta más externa:SELECT EmpresaFROM Clientes WHERE Rep_Clie IN (Subconsulta)Mostrará los clientes (Empresa) cuyos vendedores tienenuno de los números de empleados seleccionados. Finalmente la consulta más externa:SELECT EmpresaFROM Clientes WHERE Rep_Clie IN (Subconsulta)Mostrará los clientes (Empresa) cuyos vendedores tienenuno 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 oficinade 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 oficinade las oficinas de la región Este.La subconsulta siguiente:SELECT Num_Empl FROM RepVentasWHERE Oficina_rep IN (subconsulta)No devuelve una columna que contiene los números de empleados delos vendedores que trabajan en una de las oficinas seleccionadas.La subconsulta siguiente:SELECT Num_Empl FROM RepVentasWHERE Oficina_rep IN (subconsulta)No devuelve una columna que contiene los números de empleados delos vendedores que trabajan en una de las oficinas seleccionadas.
  143. 143. 143Subconsultas Correlacionadas Conceptualmente, SQL realiza una subconsultatantas veces como tuplas existen en la relaciónobtenida por la consulta principal Para muchas subconsultas, se producen losmismos resultados Cuando esto es así, las implementaciones comerciales deservidores de BBDD tratan de evitar el repetir el cálculode la subconsulta, para incrementar el rendimiento Esta optimización no se puede realizar si la subconsultacontiene referencias externas - CORRELACIÓN
  144. 144. 144Subconsultas en HAVING Además de utilizar las consultas en la cláusulaWHERE se pueden emplear igualmente en lacláusula HAVING Cuando una subconsulta aparece en lacláusula HAVING, funciona como parte de laselección de grupo de filas efectuada por lacláusula HAVING. Además se pueden utilizar las subconsultas enlas sentencias INSERT, DELETE, UPDATEcomo veremos más adelante.
  145. 145. Actualizaciones debases de datosINSERT, DELETE, UPDATE
  146. 146. 146Actualizaciones de BBDD Con SQL, además de poder realizarconsultas para obtener resultados a partirde 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 depeticiones por parte de los usuariosCrear la propia BBDD
  147. 147. 147Introducción de datos en la BBDD ALTAS:Consiste en incluir nuevos registros de datosen las tablas de la BBDDLos SGBD incluyen para ello: Sentencias INSERT de SQL para añadir una fila Sentencias INSERT de SQL para añadir variasfilas Utilidades de carga masiva de datos en la BBDD
  148. 148. 148Sentencia INSERT de una fila Su sintaxis es la siguiente:INSERT INTOTabla (campo1, .., campoN)VALUES (valor1, ..., valorN)INSERT INTO RepVentas( Num_Empl, Nombre, Edad, Oficina_Rep, Titulo, Contrato, Director, Cuota, Ventas )VALUES (112,’Henry Ford’, 46, 13, ‘Dir Ventas’, ‘25/08/90’, NULL, NULL, 0.0);INSERT INTO RepVentas( Num_Empl, Nombre, Edad, Oficina_Rep, Titulo, Contrato, Director, Cuota, Ventas )VALUES (112,’Henry Ford’, 46, 13, ‘Dir Ventas’, ‘25/08/90’, NULL, NULL, 0.0);
  149. 149. 149Sentencia INSERT de una fila Inserción de valores NULL:SQL automáticamente inserta valores NULL aaquellas columnas no incluidas en unasentencia INSERT, a menos que esascolumnas tengan definido un valor pordefecto en la creación de la tablaSe puede hacer explícitamente mediante lapalabra clave NULL en el área VALUES
  150. 150. 150Sentencia INSERT de una fila Inserción de todas las columnasSi se pretende insertar valores en todas lascolumnas de una tabla, SQL permite omitir lalista de los nombres de columna.SQL supondrá que se insertan valores,tomando las columnas en el orden en el quese definieronINSERT INTO RepVentasVALUES (112,’Henry Ford’, 46, 13, ‘Dir Ventas’, ‘25/08/90’, NULL, NULL, 0.0);INSERT INTO RepVentasVALUES (112,’Henry Ford’, 46, 13, ‘Dir Ventas’, ‘25/08/90’, NULL, NULL, 0.0);
  151. 151. 151Crear una tabla y añadir registrosSELECT Num_Pedido, Fecha_Pedido, ImporteINTO AntPedidosFROM PedidosWHERE Fecha_Pedido >= ‘01/01/90’;SELECT Num_Pedido, Fecha_Pedido, ImporteINTO AntPedidosFROM PedidosWHERE Fecha_Pedido >= ‘01/01/90’;Crear la tabla AntPedidos con los campos Num_pedido,Fecha_Pedido, e Importe, para aquellos pedidos cuya fecha depedido 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 depedido sea igual o superior al primer día del año 1990.
  152. 152. 152Sentencia INSERT multifila Permite añadir múltiples filas desde unorigen de datos a una tabla destino (latabla debe de estar creada). No se especifican los valores a insertar,sino que estos se obtienen a partir de laejecución de una sentencia SELECT
  153. 153. 153Sentencia INSERT multifila Su sintaxis básica es la siguiente:INSERT INTOTabla (campo1, …, campoN)SELECT TablaOrigenX.campo1, …,TablaOrigenZ.campoNFROM TablaOrigenX, …, TablaOrigenZWHERE Condiciones_de_Selección
  154. 154. 154Ejemplo:INSERT INTO AntPedidos( Num_Pedido, Fecha_Pedido, Importe )SELECT Num_Pedido, Fecha_Pedido,ImporteFROM PedidosWHERE Fecha_Pedido < ‘01/01/90’;INSERT INTO AntPedidos( Num_Pedido, Fecha_Pedido, Importe )SELECT Num_Pedido, Fecha_Pedido,ImporteFROM PedidosWHERE Fecha_Pedido < ‘01/01/90’;Añadir a la tabla AntPedidos, aquellos de la tabla pedidos cuya fecha depedido sea menor al 01-01-90Añadir a la tabla AntPedidos, aquellos de la tabla pedidos cuya fecha depedido sea menor al 01-01-90
  155. 155. 155Supresió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 PedidosWHERE Fecha_Pedido < ‘15/11/89’; Si se pretenden eliminar todos los registros deuna tabla, se prescindirá de la condiciónexpresada en la cláusula WHERE Hay que tener en cuenta que un borrado en una tablapuede desencadenar borrados en cascada en otrastantas
  156. 156. 156Supresión de datos de la BBDD Borrados con SubconsultasEn ocasiones los borrados de datos se debenefectuar en base a datos contenidos en otrastablasSQL no permite utilizar composiciones ensentencias DELETEEl modo de solucionar esta situación es pormedio de subconsultas
  157. 157. 157Ejemplo de borrado con subconsulta:DELETE FROM PedidosWHERE Rep = (SELECT Num_EmplFROM RepVentasWHERE Nombre=Sue Smith);DELETE FROM PedidosWHERE Rep = (SELECT Num_EmplFROM RepVentasWHERE Nombre=Sue Smith);Suprime los pedidos aceptados por Sue Smith.Suprime los pedidos aceptados por Sue Smith.
  158. 158. 158Modificación de datos en la BBDD Se realiza mediante la sentencia UPDATE Su sintaxis básica es la siguiente:UPDATE TablaSET Campo1=Valor1, …, CampoN=ValorNWHERE Criterio; Si se pretende modificar todos los registrosde una tabla, se prescindirá de la cláusulaWHERE
  159. 159. 159Ejemplo de UPDATEUPDATE RepVentasSET Oficina_Rep = 11, Cuota = 0.9 *CuotaWHERE Oficina_Rep = 12;UPDATE RepVentasSET Oficina_Rep = 11, Cuota = 0.9 *CuotaWHERE Oficina_Rep = 12;Cambia a todos los vendedores de la oficina de Chicago (número 12) a laoficina 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 laoficina de New York (número 11) y rebaja sus cuotas un 10%.
  160. 160. 160Modificación de datos en la BBDD Modificaciones con SubconsultasEn ocasiones las modificaciones de datos sedeben efectuar en base a datos contenidosen otras tablasSQL no permite utilizar composiciones ensentencias UPDATEEl modo de solucionar esta situación es pormedio de subconsultas
  161. 161. VistasTablas virtuales
  162. 162. 162Vistas Una vista es una consulta realizada enSQL, cuya definición estápermanentemente almacenada en laBBDD, y que tiene además un nombreasignadoSQL permite acceder a los resultados deinvocar a la ‘vista’ como si se tratase de unatabla de la BBDD
  163. 163. 163Vistas Razones para utilizar las vistas:Permiten acomodar el aspecto de una BBDD,de modo que distintos usuarios la vean desdediferentes perspectivasPermiten restringir el acceso a los datos,permitiendo que diferentes usuarios sólo veanciertas filas o columnasSimplifican el acceso a la BBDD mediante lapresentación de la estructura de los datosalmacenados de manera más natural
  164. 164. 164Vistas Una vista es una “tabla virtual” en laBBDD, cuyos contenidos están definidospor una consultaLos datos que muestra una vista no existe enla base de datos como un conjuntoalmacenado de valores, sino que son losresultados producidos de la ejecución de unaconsulta que define a la vista.Una vez definida la vista, se puede ejecutaruna sentencia SELECT sobre ella, como si setratase de una tabla
  165. 165. 165Creación de una Vista Se realiza mediante la sentenciaCREATE VIEWSu sintaxis básica es:CREATE VIEW nombre_vista[(col_vista [,col_vista …])]AS SELECT …Siendo SELECT una sentencia de seleccióncompleta
  166. 166. 166Ejemplo: CREATE VIEW OficinasEste(Cod_Oficina, Ciudad, Region)ASSELECT OFICINA, CIUDAD, REGIONFROM OficinasWHERE Region = Este; CREATE VIEW OficinasEste(Cod_Oficina, Ciudad, Region)ASSELECT OFICINA, CIUDAD, REGIONFROM OficinasWHERE Region = Este;Define una vista que contenga únicamente las oficinas de la región “Este”,cuyo nombre sea OficinasEste.Define una vista que contenga únicamente las oficinas de la región “Este”,cuyo nombre sea OficinasEste.
  167. 167. 167Vistas Vistas Agrupadas: La consulta para la definición de una vistapuede incluir la cláusula GROUP BY En este caso, las vistas que se definen sedenominan Vistas Agrupadas Una vista agrupada reúne los resultados deuna consulta agrupada en una tabla virtual,permitiendo efectuar consultas adicionalessobre ella.
  168. 168. 168Vistas Vistas Agrupadas: Como restricción, las vistas agrupadas noson actualizables Sin embargo, en los últimos SGBD, lasvistas agrupadas pueden salvar la limitaciónque impone SQL sobre la anidación defunciones Por ejemplo, se podría calcular MIN(AVG(A)) No todos los SGBD tienen esta capacidad
  169. 169. 169Vistas Vistas Compuestas: Una de las razones más frecuentes parautilizar vistas compuestas es simplificar lasconsultas multitabla. Se puede crear una vista compuesta queextrae sus datos de varias tablas,presentando los datos como si se tratase deuna única tabla virtual
  170. 170. 170Vistas Actualizaciones sobre vistas: Las reglas que impone SQL sobre lasactualizaciones de vista son muy restrictivas Los productos comerciales suelen relajar estasreglas, ya que en muchos casos se pueden permitirciertas actualizaciones que el estándar impediría. Hay vistas que pueden soportar algunas de lasoperaciones de actualización, y otras no Hay vistas que pueden soportar actualizaciones sobre unsubconjunto de sus columnas Las reglas de actualización de vistas dependen decada SGBD.
  171. 171. 171Vistas Comprobación de actualizaciones sobre vistas –WITH CHECK OPTION Una vista actualizable puede incluir una condiciónWHERE Si se hace una inserción de un dato sobre una vistade este tipo, quizás el dato insertado no cumpla conla condición de selección, y por tanto después noaparecerá en la vista Esto se puede evitar si en la definición de la vista seincluye al final la cláusula WITH CHECK OPTION
  172. 172. 172Vistas Eliminación de una vista: La sintaxis básica de la eliminación de unavista es la siguiente:DROP VIEW NombreVistaDROP VIEW NombreVista
  173. 173. TriggersDisparadores
  174. 174. 174Triggers Un trigger o disparador es una respuesta a unevento que se produce en una BBDD, llevandoa un cambio en la información contenida en lamisma Los eventos que se producen en una BBDD sonpor tanto: Inserciones Borrados Modificaciones
  175. 175. 175Triggers En muchos SGBD se pueden llevar acabo acciones tanto antes como despuésde que se lleven a cabo las acciones deinserción, modificación o borrado Cada SGBD incorpora su propio dialectode descripción de triggers
  176. 176. 176Desencadenadores o Triggers Ejemplo de la Base de Datos SQL LANS Cuando añadimos un pedido a la tabla PEDIDOS, estosdos cambios también podrían tener lugar en la base dedatos: La columna VENTAS del vendedor que aceptó el pedidodebería incrementarse en el importe del pedido. El valor de EXISTENCIAS para ese producto debería disminuiren la cantidad solicitada. Definiendo un disparador (trigger) de nombreNUEVOPEDIDO, haremos que estas actualizaciones dela Base de Datos se produzcan automáticamente.
  177. 177. 177Triggers - SQL SERVERCREATE TRIGGER NuevoPedidoON PedidosFOR INSERTASBEGINUPDATE RepVentasSET Ventas = Ventas + INSERTED.ImporteWHERE RepVentas.Num_Empl = INSERTED.Rep;UPDATE ProductosSET Existencias = Existencias - INSERTED.CantWHERE Productos.Id_Fab = INSERTED.FabAND Productos.Id_Producto = INSERTED.Producto;END;CREATE TRIGGER NuevoPedidoON PedidosFOR INSERTASBEGINUPDATE RepVentasSET Ventas = Ventas + INSERTED.ImporteWHERE RepVentas.Num_Empl = INSERTED.Rep;UPDATE ProductosSET Existencias = Existencias - INSERTED.CantWHERE Productos.Id_Fab = INSERTED.FabAND Productos.Id_Producto = INSERTED.Producto;END;Nombre deldisparadorTabla sobre la que actuaSe activará cuando insertamos unregistro en la tabla Pedidos.Importe insertado enPedidosCantidad insertada enPedidos
  178. 178. 178Para 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ú yseleccionaremos el programa: Inicio->Programas->SQL Server->Administrador Corporativo y en labase de datos SQL_LANS nos colocamos en la tabla Pedidos y al pulsarel botón derecho, si elegimos la opción Diseño tabla, en la lista debotones de arriba aparecerá un botón de desencadenadores, el cual, alpulsarlo nos saldrá el código del desencadenador.
  179. 179. 179Triggers – Ejemplo integridad referencial Este disparador fuerza la integridad referencial de la relaciónOFICINAS/REPVENTAS, y también muestra un mensajecuando una actualización falla.CREATE TRIGGER Actualiza_repON RepVentasFOR INSERT, UPDATEASIF ((SELECT COUNT(*)FROM OFICINAS, INSERTEDWHERE OFICINAS.OFICINA=INSERTED.OFICINA_REP)=0)BEGINPRINT Especificado un numero de oficina invalidoROLLBACK TRANSACTIONEND Este disparador fuerza la integridad referencial de la relaciónOFICINAS/REPVENTAS, y también muestra un mensajecuando una actualización falla.CREATE TRIGGER Actualiza_repON RepVentasFOR INSERT, UPDATEASIF ((SELECT COUNT(*)FROM OFICINAS, INSERTEDWHERE OFICINAS.OFICINA=INSERTED.OFICINA_REP)=0)BEGINPRINT Especificado un numero de oficina invalidoROLLBACK TRANSACTIONENDCuando hay una inserción oun actualización en la tablaRepventas comprueba que elnº de oficina insertado seaválido
  180. 180. 180Ejemplo borrado en cascada Hay algunos SGBD que no soportan laactualización en cascada si se modifica un valorde la clave primaria. Si embargo, esto se puederealizar con disparadores. Por ejemplo: El siguiente disparador propaga en cascadacualquier actualización de la columna OFICINAen la tabla OFICINAS a la columnaOFICINA_REP de la tabla REP_VENTAS:
  181. 181. 181Ejemplo borrado en cascadaCREATE TRIGGER Cambia_Oficina_RepON OficinasFOR UPDATEASIF UPDATE (OFICINA)BEGINUPDATE REPVENTASSET REPVENTAS.OFICINA_REP=INSERTED.OFICINAFROM REPVENTAS, INSERTED, DELETEDWHERE REPVENTAS.OFICINA_REP=DELETED.OFICINAENDCREATE TRIGGER Cambia_Oficina_RepON OficinasFOR UPDATEASIF UPDATE (OFICINA)BEGINUPDATE REPVENTASSET REPVENTAS.OFICINA_REP=INSERTED.OFICINAFROM REPVENTAS, INSERTED, DELETEDWHERE REPVENTAS.OFICINA_REP=DELETED.OFICINAENDLas referencias DELETED.OFICINA e INSERTED.OFICINA en el disparadorse refieren, respectivamente, a los valores de la columna OFICINA antesy después de la sentencia UPDATE.Las referencias DELETED.OFICINA e INSERTED.OFICINA en el disparadorse refieren, respectivamente, a los valores de la columna OFICINA antesy después de la sentencia UPDATE.
  182. 182. Transacciones
  183. 183. 183Transacciones Una transacción es una secuencia de una o mássentencias SQL que juntas forman una unidad detrabajo. 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 deuna transacción. Informa al SGBD que la transacción está ahoracompleta; todas las sentencias que forman la transacción hansido ejecutadas y la B.D. es autoconsistente. ROLLBACK señala el final sin éxito de una transacción. Informaal SGBD que el usuario no desea completar la transacción ; envez de ello el SGBD debe deshacer los cambios efectuados a laB.D. durante la transacción, para que la B.D. quede en elestado en que estaba antes de ejecutar la transacción
  184. 184. 184Ejemplo de TransacciónBEGIN TRANSACTIONUPDATE PEDIDOSSET CANTIDAD = 10, IMPORTE =3550.00WHERE NUM_PEDIDO = 113051UPDATE REPVENTASSET VENTAS = VENTAS - 1458.00 + 3550.00WHERE NUM_EMPL = 108UPDATE OFICINASSET VENTAS = VENTAS - 1458.00 + 3550.00WHERE OFICINA = 21UPDATE PRODUCTOSSET EXISTENCIAS = EXISTENCIAS + 4 -10WHERE ID_FAB = QSAAND ID_PRODUCTO = XK47COMMIT WORKBEGIN TRANSACTIONUPDATE PEDIDOSSET CANTIDAD = 10, IMPORTE =3550.00WHERE NUM_PEDIDO = 113051UPDATE REPVENTASSET VENTAS = VENTAS - 1458.00 + 3550.00WHERE NUM_EMPL = 108UPDATE OFICINASSET VENTAS = VENTAS - 1458.00 + 3550.00WHERE OFICINA = 21UPDATE PRODUCTOSSET EXISTENCIAS = EXISTENCIAS + 4 -10WHERE ID_FAB = QSAAND ID_PRODUCTO = XK47COMMIT WORK
  185. 185. 185EjemploUSE 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 THENBEGINPRINT ‘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 ocurridoROLLBACK TRANENDUSE 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 THENBEGINPRINT ‘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 ocurridoROLLBACK TRANEND
  186. 186. 186TransaccionesComo se puede ver para cada sentencia que se ejecutamiramos si se ha producido o no un error, y si detectamosun error ejecutamos el bloque de código que deshace latransacción.Hay una interpretación incorrecta en cuanto alfuncionamiento de las transacciones que esta bastanteextendida. Mucha gente cree que si tenemos variassentencias dentro de una transacción y una de ellas falla,la transacción se aborta en su totalidad.¡Nada más lejos de la realidad!
  187. 187. 187Transacciones 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 delsegundo) hay un corte de electricidad, cuando el SQL Server se recupere seencontrará en medio de una transacción y, o bien la termina o bien la deshace, perono se quedará a medias. El error está en pensar que si la ejecución de la primerasentencia da un error se cancelará la transacción. El SQL Server sólo se preocupa de ejecutar las sentencias, no de averiguar si lohacen 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 cadasentencia de nuestro conjunto averiguamos si se ha producido un error y si es asíactuamos en consecuencia cancelando toda la operación.
  188. 188. Procedimientos
  189. 189. 189Crear ProcedimientosCREATE PROCEDURE Cli_Credito@Credito_Inf MONEY,@Credito_Sup MONEYASSELECT *FROM ClientesWHERE Limite_CreditoBETWEEN @Credito_Inf AND @Credito_SupCREATE PROCEDURE Cli_Credito@Credito_Inf MONEY,@Credito_Sup MONEYASSELECT *FROM ClientesWHERE Limite_CreditoBETWEEN @Credito_Inf AND @Credito_SupPara ejecutar el procedimiento usaremos:EXECUTE Cli_Credito 20000 , 60000donde Cli_Credito es el nombre del procedimiento, y 20000, 60000 los 2parámetros que pasamos al procedimiento.NOTA: Los procedimientos son guardados en SQL Server en la carpeta de lala base de datos llamada Procedimientos Almacenados.
  190. 190. Funciones
  191. 191. 191FunciónCREATE FUNCTION dbo.Cube( @fNumber float)RETURNS floatASBEGINRETURN(@fNumber * @fNumber * @fNumber)ENDCREATE FUNCTION dbo.Cube( @fNumber float)RETURNS floatASBEGINRETURN(@fNumber * @fNumber * @fNumber)ENDNombre de lafunciónNombre delparámetro quepasamos a la función
  192. 192. 192Función factorial CREATE FUNCTION dbo.Factorial( @iNumber int )RETURNS INTASBEGINDECLARE @i intIF @iNumber <= 1SET @i = 1ELSESET @i = @iNumber * dbo.Factorial(@iNumber - 1 )RETURN (@i)END CREATE FUNCTION dbo.Factorial( @iNumber int )RETURNS INTASBEGINDECLARE @i intIF @iNumber <= 1SET @i = 1ELSESET @i = @iNumber * dbo.Factorial(@iNumber - 1 )RETURN (@i)END
  193. 193. 193Función con una tablaCREATE FUNCTIONdbo.AuthorsForState(@cState char(2) )RETURNS TABLEASRETURN (SELECT * FROM AuthorsWHERE state = @cState)CREATE FUNCTIONdbo.AuthorsForState(@cState char(2) )RETURNS TABLEASRETURN (SELECT * FROM AuthorsWHERE state = @cState)
  194. 194. Seguridad SQL
  195. 195. 195Seguridad SQL La seguridad es especialmente importante enun SGBD basado en SQL, ya que SQL permitehacer especialmente sencillo el acceso a lainformación contenida en las BBDD Los requerimientos de los sistemas enproducción son muchos y muy variados, peropor resumir, algunos de ellos pueden ser en loreferente a SQL:
  196. 196. 196Seguridad SQL Los datos de cualquier tabla deberían ser accesiblesólo a un conjunto de usuarios, no a todos Sólo algunos usuarios deben tener derecho deactualización de datos en una tabla en particular Para algunas tablas, el acceso debería estarrestringido en base a las columnas Algunos usuarios deberían tener denegado el accesomediante SQL interactivo, pero permitirles utilizaraplicaciones que utilicen tales tablas
  197. 197. 197Seguridad SQL Los usuarios son los actores de la BBDD Cada vez que el SGBD hace una operación sobre losdatos, lo hace en nombre de algún usuario El SGBD deberá actuar en consecuencia con lospermisos que tal usuario tenga según la operaciónempleada y los datos afectados Cada SGBD tiene su propia implementación delos procesos de seguridad.
  198. 198. 198Vistas y Seguridad SQL Las vistas juegan un papel esencial en laseguridad:Definiendo una vista y proporcionando unpermiso de usuario para acceder a ella, perono a sus tablas fuente, se puede permitir elacceso de un usuario únicamente a lascolumnas y filas seleccionadas.
  199. 199. 199Privilegios El estándar SQL-1 especifica cuatroprivilegios para tablas y vistas:SELECTINSERTDELETEUPDATE
  200. 200. 200Concesión de Privilegios Cláusula GRANT Su sintaxis básica es:GRANT <privilegios> ON{nombre_tabla | nombre_vista} TO{PUBLIC | usuario, …, usuario[WITH GRANT OPTION]}Siendo <privilegios>:ALL [PRIVILEGES] |{ SELECT |DELETE |INSERT |UPDATE [(col [, col …])]]
  201. 201. 201Revocación de Privilegios Cláusula REVOKE Su sintaxis básica es:REVOKE <privilegios> ON{nombre_tabla | nombre_vista} FROM{PUBLIC | usuario, …, usuario}Siendo <privilegios>:ALL [PRIVILEGES] |{ SELECT |DELETE |INSERT |UPDATE [(col [, col …])]]
  202. 202. 202Crear un usuarioCREATE LOGIN PepeWITH PASSWORD =‘m1a2n3o4l5o;USE BD_Facturas;CREATE USER Pepe FOR LOGIN Pepe;GOCrea un inicio de sesiónde servidor denominado“Pepe” con unacontraseñaCrea el usuario de basede datos “Pepe”correspondiente aBD_Factura
  203. 203. 203Crear usuarioCREATE USER nom_usuario1 contraseña,nom_usuario2 contraseña, …
  204. 204. 204Cambiar el nombre de usuarioUSE BD_FACTURA;ALTER USER Pepe WITH NAME = Jose;GOCambia el nombre del usuario de la base de datos BD_FACTURA “Pepe” a“Jose”.
  205. 205. 205Borra un usuarioUSE BD_FACTURA;DROP USER Jose;GO
  206. 206. 206Crear un grupo de usuariosCREATE GROUP nom_grupo1 contraseña,nom_grupo2 contraseña, …
  207. 207. 207Añadir usuarios a un grupoADD 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 usuariodisfrutará de todos los permisos que se han otorgado a esegrupo
  208. 208. 208Borra un grupoDROP GROUP nom_grupo Eliminará el grupo o grupos especificados. Los usuarios que pertenezcan a esosgrupos no se verán afectados, perodejarán de ser miembros de los gruposeliminados.
  209. 209. 209Borra 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 nolos borrará
  210. 210. 210Cambia contraseña del usuarioALTER USER nom_usuarioPASSWORD contraseña_nueva contraseña_anterior
  211. 211. 211Cambia la contraseña de la basede datosALTER DATABASE PASSWORD contraseña_nueva contraseña_anterior
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×