Práctica[Email: 1
[email protected]] Bases de Datos II Sesión 0: ENTORNO MySQL Objetivos: • Adquirir la destreza mínima para trabajar en el entorno MySQL. Contenidos • • • • • • • Concepto de Base de Datos y Tabla. Entrar en MySQL. Manejo de menús. Selección de Base de Datos. Tipos de datos. Ayuda en línea. Salvar y recuperar órdenes SQL. Concepto de Base de Datos y Relación (Tabla) Una base de datos es un conjunto de información interrelacionada que representa un sistema de información particular, y está compuesta por relaciones, o más comúnmente tablas, que almacenan los datos referentes a un objeto o a una interrelación entre objetos. Así, si queremos mantener mediante un gestor de bases de datos información docente, lo que haremos (en este caso en particular) será crear una base de datos que englobe tres tablas: PROFESORES, ASIGNATURAS e IMPARTE. Cada tabla tendrá sus columnas, que representan los correspondientes atributos de la entidad o claves ajenas que permiten relacionar varias tablas entre sí. La BD que gestione esta información se llamará Ejemplo, y las tablas contenidas en ella se presentan en el siguiente cuadro. Base de Datos: Ejemplo PROFESORES ( dni : varchar(10), nombre : varchar(40), categoria : char(4), ingreso : date ) Clave primaria: dni ASIGNATURAS ( codigo : char(5), descripcion : varchar(35), creditos : number(3,1), creditosp : number(3,1) ) Clave primaria: codigo IMPARTE ( dni : varchar2(10), asignatura : char(5) ) Clave primaria: (dni, asignatura) Clave ajena: dni → PROFESORES Clave ajena: asignatura → ASIGNATURAS Extensiones de Ejemplo: 2 Docente: Arturo Díaz Pulido Bases de Datos II ASIGNATURAS codigo descripcion HI FBD DGBD PC FP creditos creditosp HISTORIA DE LA INFORMATICA FUNDAMENTOS DE LAS BASES DE DATOS DISEÑO Y GESTION DE BASES DE DATOS PROGRAMACION CONCURRENTE FUNDAMENTOS DE LA PROGRAMACION 4.5 6.0 6.0 6.0 9.0 PROFESORES dni 21111222 21222333 21333444 nombre EVA GOMEZ MANUEL PALOMAR RAFAEL ROMERO 1.5 3.0 1.5 4.5 IMPARTE categoria ingreso TEU TEU ASO6 01/10/1993 16/06/1989 16/06/1992 dni 21111222 21111222 21333444 asignatura FBD DGBD PC MySQL Una vez el sistema permite la conexión, disponemos de un área donde introducir órdenes SQL cuyo resultado se obtiene pulsando el botón “Ejecutar”. Podemos probar con la siguiente consulta: select * from profesores resultado: dni 21111222 21222333 21333444 nombre EVA GOMEZ MANUEL PALOMAR RAFAEL ROMERO categoria TEU TEU ASO6 Tipos de datos En general, la utilización de varias tablas necesita que ellas se puedan relacionar por una columna común, en este caso dni de profesor, para la relación entre imparte y profesor, y codigo de asignatura, para la relación entre asignatura e imparte. Nótese, sin embargo, que en la tabla imparte el código de asignatura se llama asignatura y en la tabla asignaturas codigo. En realidad, tales atributos son “comunes” porque el dominio es el mismo para ambos y se pueden comparar. Los dominios vienen definidos por los tipos de datos que ofrece el SGBD. Los tipos de datos que acompañan en el esquema de BD a cada columna en cada tabla determinan los valores que pueden tomar éstas. Son de capital importancia a la hora de relacionar tablas en una sentencia select, puesto que sólo podremos comparar columnas con idéntico tipo de datos, o a la hora de manipular datos, dado que, como veremos en próximas sesiones, cada tipo de datos presenta unos requisitos específicos para su manipulación. 3 Docente: Arturo DíazPulido Bases de Datos II Algunos de los tipos de datos que nos podemos encontrar en MySQL son: Tipos numéricos: Existen tipos de datos numéricos, que se pueden dividir en dos grandes grupos, los que están en coma flotante (con decimales) y los que no. TinyInt: es un número entero con o sin signo. Con signo el rango de valores válidos va desde -128 a 127. Sin signo, el rango de valores es de 0 a 255 Bit ó Bool: un número entero que puede ser 0 ó 1 SmallInt: número entero con o sin signo. Con signo el rango de valores va desde 32768 a 32767. Sin signo, el rango de valores es de 0 a 65535. MediumInt: número entero con o sin signo. Con signo el rango de valores va desde -8.388.608 a 8.388.607. Sin signo el rango va desde 0 a16777215. Integer, Int: número entero con o sin signo. Con signo el rango de valores va desde -2147483648 a 2147483647. Sin signo el rango va desde 0 a 429.4967.295 BigInt: número entero con o sin signo. Con signo el rango de valores va desde 9.223.372.036.854.775.808 a 9.223.372.036.854.775.807. Sin signo el rango va desde 0 a 18.446.744.073.709.551.615. Float: número pequeño en coma flotante de precisión simple. Los valores válidos van desde -3.402823466E+38 a -1.175494351E-38, 0 y desde 1.175494351E-38 a 3.402823466E+38. xReal, Double: número en coma flotante de precisión doble. Los valores permitidos van desde -1.7976931348623157E+308 a -2.2250738585072014E308, 0 y desde 2.2250738585072014E-308 a 1.7976931348623157E+308 Decimal, Dec, Numeric: Número en coma flotante desempaquetado. El número se almacena como una cadena Tamaño de 4 Tipo de Campo Almacenamiento TINYINT 1 byte SMALLINT 2 bytes MEDIUMINT 3 bytes INT 4 bytes INTEGER 4 bytes BIGINT 8 bytes Docente: Arturo Díaz Pulido almacena una fecha. 0 minutos y 0 segundos al 31 de diciembre del 9999 a las 23 horas. El formato de almacenamiento es de año-mes-dia horas: minutos: segundos TimeStamp: Combinación de fecha y hora. 59 minutos y 59 segundos. 59 minutos y 59 segundos a 838. M+1 NUMERIC(M.D bytes sí D = 0 M+2 bytes if D > 0. El rango de valores va desde el 1 de enero del 1001 a las 0 horas. El rango va desde el 1 de enero de 1970 al año 2037. El rango de valores va desde el 1 de enero del 1001 al 31 de diciembre de 9999. M+1 DECIMAL(M.D) bytes if D = 0 Tipos fecha: A la hora de almacenar fechas. Date: tipo fecha. El formato de almacenamiento depende del tamaño del campo: Tamaño Formato AñoMesDiaHoraMinutoSegundo 14 aaaammddhhmmss AñoMesDiaHoraMinutoSegundo 12 aammddhhmmss 8 ñoMesDia aaaammdd 6 AñoMesDia aammdd 4 AñoMes aamm 2 Año aa Time: almacena una hora. El formato de almacenamiento es de añomes-dia DateTime: Combinación de fecha y hora.Bases de Datos II FLOAT(X) 4 ú 8 bytes FLOAT 4 bytes DOUBLE 8 bytes DOUBLE PRECISION 8 bytes REAL 8 bytes M+2 bytes sí D > 0. hay que tener en cuenta que Mysql no comprueba de una manera estricta si una fecha es válida o no. Simplemente comprueba que el mes esta comprendido entre 0 y 12 y que el día esta comprendido entre 0 y 31. El rango de horas va desde -838 horas. 59 minutos y 59 segundos. El formato de almacenamiento es 5 Docente: Arturo DíazPulido . MediumBlob y MediumText: un texto con un máximo de 16. Tipo de Tamaño de Campo Almacenamiento DATE 3 bytes DATETIME 8 bytes TIMESTAMP 4 bytes TIME 3 bytes YEAR 1 byte Tipos de cadena: Char(n): almacena una cadena de longitud fija. Enum: campo que puede tener un único valor de una lista que se especifica. Mientras que el tipo test se ordena sin tener en cuenta las Mayúsculas y las minúsculas. El tipo Enum acepta hasta 65535 valores distintos 6 Docente: Arturo Díaz Pulido . El campo puede tener tamaño dos o tamaño 4 dependiendo de si queremos almacenar el año con dos o cuatro dígitos.967.294.777.215 caracteres. VarChar(n): almacena una cadena de longitud variable. los tipo Test y los tipo BLOB (Binary large Object) La diferencia entre un tipo y otro es el tratamiento que reciben a la hora de realizar ordenamientos y comparaciones. Hay que tener en cuenta que debido a los protocolos de comunicación los paquetes pueden tener un máximo de 16 Mb. el tipo BLOB se ordena teniéndolas en cuenta. TinyText y TinyBlob: Columna con una longitud máxima de 255 caracteres. La cadena podrá contener desde 0 a 255 caracteres.Bases de Datos II de 'HH:MM:SS' Year: almacena un año.295. Los tipos BLOB se utilizan para almacenar datos binarios como pueden ser ficheros. El rango de valores permitidos va desde el año 1901 al año 2155. LongBlob y LongText: un texto con un máximo de caracteres 4. La cadena podrá contener desde 0 a 255 caracteres. Blob y Text: un texto con un máximo de 65535 caracteres. Dentro de los tipos de cadena se pueden distinguir otros dos subtipos. dependiendo del número de SET('value1'.Bases de Datos II Set: un campo que puede contener ninguno. TEXT Longitud +2 bytes MEDIUMBLOB. uno ó varios valores de una lista.. MEDIUMTEXT Longitud +3 bytes LONGBLOB. 3. La lista puede tener un máximo de 64 valores.'value2'. TINYTEXT Longitud+1 bytes BLOB. Tamaño de Tipo de campo Almacenamiento CHAR(n) n bytes VARCHAR(n) n +1 bytes TINYBLOB.) del número de valores 1....) valores Diferencia de almacenamiento entre los tipos Char y VarChar CHAR(4 7 Almace Almace Valor ) namiento VARCHAR(4) namiento '' '' 4 bytes " 1 byte 'ab' 'ab ' 4 bytes 'ab' 3 bytes 'abcd' 'abcd' 4 bytes 'abcd' 'abcdefgh' 'abcd' 4 bytes 'abcd' 5 bytes Docente: Arturo DíazPulido . LONGTEXT Longitud +4 bytes 1 ó dos bytes dependiendo ENUM('value1'. 2.'value2'... 4 ó 8 bytes. Bases de Datos II SELECT 1 Objetivos: • Introducir al alumno en el SQL y la orden SELECT. • Comentar el esquema lógico propuesto. Contenidos: • Sistema de información propuesto. • La orden SELECT-FROM-WHERE. • Proyecciones, Selecciones. • Tipos de datos. • ORDER BY Se proporciona información sobre las consultas más sencillas a realizar sobre una BD. LA ORDEN SELECT-FROM-WHERE Sintaxis general de la orden select SELECT [ DISTINCT ] listaColumnas FROM listaTablas [ WHERE condición ] [ GROUP BY listaColumnas [ HAVING condición ] ] [ ORDER BY listaColumnas [ ASC | DESC ] ] Select-From Para realizar consultas sobre una base de datos vamos a utilizar la orden SELECT de SQL. Con la sintaxis que se muestra en el punto anterior seremos capaces de formular cualquier requerimiento (consulta) sobre las tablas que componen una determinada BD. En este momento veremos la expresión mínima de la orden, formada por dos cláusulas, select y from, que obligatoriamente tendremos que especificar en cada consulta que realicemos. Supongamos que sobre la base de datos Ejemplo (cuyo esquema y contenido se presentaron en la sesión anterior) queremos obtener todos los datos acerca de los profesores. Debemos, en primer lugar, seleccionar la base de datos, y ejecutamos (en el Query-language) la siguiente orden select * from profesores resultado: dni 21111222 21222333 21333444 8 nombre EVA GOMEZ MANUEL PALOMAR RAFAEL ROMERO categoria TEU TEU ASO6 Docente: Arturo Díaz Pulido Bases de Datos II Al especificar en la lista de atributos un asterisco le indicamos al SGBD que deseamos la información de todas las columnas definidas para la tabla PROFESORES. Si deseamos conocer a qué categorías pertenecen los profesores que se encuentran en la BD: select categoria from profesores resultado: categoria TEU TEU ASO6 Podemos especificar tantas columnas como queramos: select nombre, categoria from profesores resultado: nombre EVA GOMEZ MANUEL PALOMAR RAFAEL ROMERO categoria TEU TEU ASO6 Para evitar la salida de filas duplicadas podemos utilizar el modificador DISTINCT: select distinct categoria from profesores resultado: categoria TEU ASO6 Nótese, sin embargo, que las dos órdenes siguientes obtienen el mismo resultado, puesto que la duplicación se refiere a filas completas y no a una columna en particular: select distinct dni, categoria from profesores select dni, categoria from profesores resultado: dni 21111222 21222333 21333444 categoria TEU TEU ASO6 La cláusula WHERE Con la orden select-from obtenemos la información de las columnas requeridas de toda la tabla. Si únicamente queremos información de aquellas filas que cumplen una determinada condición utilizaremos la cláusula where. Pretendemos obtener el nombre de los profesores titulares: select nombre from profesores where categoria = 'TEU' 9 Docente: Arturo DíazPulido Bases de Datos II resultado: nombre EVA GOMEZ MANUEL PALOMAR En la construcción de tales condiciones podemos utilizar las conectivas lógicas AND, OR, y NOT, así como los paréntesis para alterar la evaluación de izquierda a derecha. También, los operadores de comparación >, <, >=, <=, <> Nombre de los profesores que son titulares o asociados a 6 horas: select nombre from profesores where categoria = 'TEU' or categoria = 'ASO6' resultado: nombre EVA GOMEZ MANUEL PALOMAR RAFAEL ROMERO La cláusula ORDER BY Podemos ordenar la salida producida por nuestra orden select por valores ascendentes o descendientes de una columna en particular. Nombre de las asignaturas ordenadas de menor a mayor número de créditos: select creditos, descripcion from asignaturas order by creditos resultado: creditos descripcion 4.5 Historia de la Informática 6 Fundamentos de las Bases de Datos 6 Diseño y Gestión de Bases de Datos 6 Programación Concurrente 9 Fundamentos de la Programación Si no se indica nada la ordenación será ascendente. El mismo requerimiento anterior pero en orden descendente y de aquellas que tienen más de 4.5 créditos: select creditos, descripcion from asignaturas where creditos > 4.5 order by creditos desc resultado: creditos descripcion 9 Fundamentos de la Programación 6 Fundamentos de las Bases de Datos 6 Diseño y Gestión de Bases de Datos 6 Programación Concurrente Puede aplicarse más de un criterio de ordenación: select creditos, descripcion from asignaturas order by creditos, descripcion resultado: 10 Pulido creditos 4.5 descripcion Historia de la Informática Docente: Arturo Díaz Bases de Datos II 6 6 6 9 Diseño y Gestión de Bases de Datos Fundamentos de las Bases de Datos Programación Concurrente Fundamentos de la Programación Constantes Se pueden explicitar constantes en la orden select de forma que dicho valor aparezca en todas las filas: select 'La asignatura ', descripcion, ' tiene ', creditos, ' creditos' from asignaturas order by creditos resultado: 'laasignatura' descripcion 'tiene' creditos 'créditos’ La asignatura HISTORIA DE LA INFORMATICA tiene 4.5 créditos La asignatura FUNDAMENTOS DE LAS BASES DE DATOS tiene 6 créditos La asignatura DISEÑO Y GESTION DE BASES DE DATOS tiene 6 créditos La asignatura PROGRAMACION CONCURRENTE tiene 6 créditos La asignatura FUNDAMENTOS DE LA PROGRAMACION tiene 9 créditos 11 Docente: Arturo DíazPulido Bases de Datos II BD Proveedores LA BASE DE DATOS PROVEEDORES Objetivos: • Ser capaz de interpretar un esquema de base de datos relacional (concretamente. ya creada y a disposición del alumno. Las extensiones de cada relación se incluyen como ayuda para comprobar la corrección de las órdenes select utilizadas. El esquema lógico es la referencia que permite construir las órdenes select con las que interrogar a la BD. el propuesto para las prácticas de la asignatura: Proveedores) Se detalla el esquema lógico que describe la BD de PROVEEDORES. el sistema real que pretende representar. intentando que comprenda su significado. 12 Pulido Docente: Arturo Díaz . numlinea) PEDIDO LINPED Clave Ajena: (numpieza)→ PIEZA. preciovent NUMBER(9. ciudad VARCHAR2(20).2)) Clave Primaria: (numpieza) PRECIOSUM ( numpieza VARCHAR2(16). preciounit NUMBER(9. cantdisponible NUMBER(5). Se compran (tablas PEDIDO y LINPED) ciertas mercancías a los distintos proveedores (tabla VENDEDOR) y son vendidas posteriormente al público o a otros distribuidores (que no hemos considerado en la BD) Básicamente. Clave Primaria: (numpedido. diassum NUMBER(3). cantminima NUMBER(5) ) Clave Primaria: (numbin) Clave Alternativa: (numpieza) Clave Ajena: (numpieza)→ PIEZA La base de datos pretende reflejar la política de compras de una empresa de distribución. numbin NUMBER(10). numvend) ( numpedido NUMBER(5). numpieza VARCHAR2(16). nomvend VARCHAR2(30). calle VARCHAR2(30). nompieza VARCHAR2(30). las tareas que se pretenden mecanizar son las siguientes (entre paréntesis aparecen las tablas directamente relacionadas con cada una): • Lista de suministradores (vendedor). numvend NUMBER(4).2). nombrecomer VARCHAR2(30). cantpedida NUMBER(4). numlinea NUMBER(2).Bases de Datos II LA BASE DE DATOS PROVEEDORES TABLA COLUMNAS RESTRICCIONES VENDEDOR ( numvend NUMBER(4). telefono CHAR(11). cantrecibida NUMBER(4)) INVENTARIO ( numpieza VARCHAR2(16). 13 Docente: Arturo DíazPulido . descuento NUMBER(2)) Clave Primaria: (numpieza.2). preciocompra NUMBER(9. periodorecuen NUMBER(2). fecha DATE ) Clave Primaria: (numpedido) ( numpedido NUMBER(5). numvend NUMBER(4). Clave Ajena: (numvend)→ VENDEDOR Clave Ajena: (numvend)→ VENDEDOR Clave Ajena: (numpedido)→ PEDIDO Clave Ajena: (numpieza)→ PIEZA fecharecep DATE. fecharecuento DATE. provincia VARCHAR2(20) ) Clave Primaria: (numvend) PIEZA ( numpieza VARCHAR2(16). linped. Sólo aquellas piezas que aparezcan en una línea de pedido han sido solicitadas al correspondiente vendedor y. así como el precio al que se le compro (puede ser diferente al estipulado en preciosum). habrán sido recibidas por la empresa en esa cantidad. Cada pedido consta de: • Cabecera de pedido (tabla pedido). vendedor. Control de existencias (inventario. Lista de precios de suministro (preciosum. Control de pedidos (pedido. que hayan sido comprados a un precio distinto porque se negociara en ese instante con cualquiera de los suministradores. donde se especifica qué vendedor nos ha suministrado el pedido completo. es el recuento real de existencias. controlar si se han servido en el tiempo estimado y en la cantidad pedida. y la fecha en que se realizó el pedido. que corresponde a un único artículo. Contiene el código de pieza que sirvió el proveedor. si la cantidad recibida es mayor que cero. • Mediante la confección de un inventario.Bases de Datos II Los datos de los proveedores que nos suministran la mercadería que. pieza). donde cada entrada. • Líneas de pedido (tabla linped). • Catálogo de venta (pieza) • Las piezas que distribuye nuestra empresa y el precio de venta al público de las mismas. si se ha hecho. vendedor. la cantidad que se le pidió y la cantidad que realmente ha servido a nuestra empresa y la fecha en la que se recibió. pieza). 14 Pulido Docente: Arturo Díaz . pieza). • De aquellas mercancías que se solicitan a los proveedores. Es información histórica cuyo origen no nos preocupa. donde un conjunto de líneas pertenecientes a un mismo pedido se numeran desde la número 1 en adelante. es vendida al público en general. posteriormente. No se debe confundir esta información con la de los pedidos: los artículos almacenado en preciosum puede que no se hayan pedido nunca y. Conocer los precios a los que los proveedores nos podrían suministrar las piezas. 64 SAN VICENTE ORTUÑO LAFUENTE ALICANTE ALICANTE ALICANTE LOS EU'S ASTURIAS ALICANTE TOLEDO LOUISSIANA MADRID MADRID ASTURIAS VALENCIA VALENCIA ALICANTE VALENCIA VALENCIA VALENCIA ALICANTE ALICANTE ALICANTE ALICANTE ALICANTE tabla PIEZA numpieza nompieza preciovent A-1001-L MOUSE ADL 3B 15 7. RIVAS VACIAMADRID 10 GUSTAVO DE OLE ESPAÑA. 903-696969 LO ANGELE 1000. 100 VALENCIA MORALES 101 SALVADOR PLA TABAC & SOFT 5661100 MAYOR. S.A. 8 LUISA PINTO LA MEJOR S. 102 VALENCIA RODRIGUEZ SALA 100 PEDRO GRACIA SOFT S. 96-3232321 GENERAL LACY. 0101010 12 JOSE ANTONIO OLE ESPAÑA. ALICANTE BLAZQUEZ 15 2 B VAZQUEZ 3 GODOFREDO MECEMSA 96-4141722 AVDA. 3 I SAN VICENTE POMEZ SOFTHARD 7 MANUEL PEREZ 98-5696969 ARZOBISPO QUINTANAR DE DISTRIBUIDORA RODRIGUEZ LOACES LA ORDE S.A. 999OXFORD BLUES NEW ORLEANS HEREDIA 2014455 9 CHEMA PAMUNDI OLE ESPAÑA. FRANCISCO GIJON PRINCESA DE ASIS. Valencia ALICANTE LAFUENTE DEL 3205 CORRAL 2 LUCIANO HARW S. 5 VALENCIA GARCIA 8003 LUIS HARW S. 21 VALENCIA SANTISTEBAN 8001 JUAN HALA S.A. 3334455 CISCAR. 5889944 POETA ALONSO.L. 4 JUANITO REINA HARW S. 44 SAN VICENTE GARCIA 102 SOLEDAD ASX. 3667789 COLON.A.A.A.A. S. VALENCIA ALICANTE MARTIN 3372 MARTINEZ DONDEQUIERAS.00 Docente: Arturo DíazPulido . 19 GIJON LIZONDO S.A.A. ALICANTE MARTIN 17 MARTINEZ 55 LUIS GARCIA HARW S. 3667788 COLON. RIVAS BASICA VACIAMADRID 11 MARIO DUQUE BANESTOESSOFT 98MOROS. 87879998 PEREZ GALDOS. 10 1 6 MANOLO PIEDRA HUMP S.A. ALICANTE MARTINEZ 54 ORTEGA 200 SEVERINO SEVESOFT 5779988 GENERAL LACY. S.A. S. 21 VALENCIA MARTINEZ JUAN 13 MANUEL GOMEZ OLE ESPAÑA.A. SALAMANCA.A.A. S.A. ALMORADI RODRIGUEZ JUAN 8002 JUAN MARTINEZ HARW S. 13F PRINCESA 5 JUANITO REINA LA DEAQUI 98-5363636 S. 5660788 MAYOR.Bases de Datos II tabla VENDEDOR numvend nomvend nombrecomer telefono calle Ciudad provincia 1 AGAPITO MECEMSA 96-5782401 Avda. ALICANTE SATORRE 12 201 MANUEL HALA S. 96-5660727 AVIACION 92.A. 3335588 SALAMANCA. 00 100.00 180.00 C-400-Z DD-0001-210 DD-0001-30 DK144-0001 DK144-0002-P FD-0001-144 FD-0002-720 M-0001-C M-0002-C M-0003-C O-0001-PP O-0002-PP P-0001-33 T-0001-IBM T-0002-AT T-0003-AT X-0001-PC FILTRO PANTALLA X200 DISCO DURO WESTERN DIG 210M 28 DISCO DURO 30M SEAGATE DISKETTE 1.00 55.00 150.Bases de Datos II C-1002-H 4.44 IBM FLOPPY 720K IBM MONITOR SYNCMASTER 3 COLOR MONITOR COLOR SONY BT MONITOR IBM 3570 COLOR PEGATINAS CONCIERTO JEVI PACK PEGATINAS CONCIERTO JEVI PLACA INTEL 33Mz TECLADO XT IBM TECLADO AT SUSUSU TECLADO AT HP TECLADO ESTANDAR PC 18.00 350.00 250.00 350.00 170.00 20 10/05/1992 20 1 5 FD-0001144 DD-0001210 T-0002-AT 31.00 120.00 45 09/10/1992 8 DK144-0002P T-0002-AT tabla INVENTARIO 16 Pulido Docente: Arturo Díaz .00 1.00 15 11/06/1993 13 6 1 O-0001-PP 15.00 20 10/05/1992 20 1 4 150.00 C-1002-J 7.10 10.00 110.45 100 15/10/1992 101 2 2 30.00 1 15/10/1992 1 3 1 146.00 10 10/05/1992 10 1 2 P-0001-33 210.00 200.00 400.00 tabla PEDIDO 1 numpedido 1 numvend 05/05/1992 2 1 11/10/1992 3 2 15/10/1992 4 2 16/10/1992 5 1 22/10/1992 6 5 22/08/1995 7 8002 02/10/1992 fecha tabla LINPED numpedido numlinea numpieza preciocompra cantpedida fecharecep cantrecibida 1 1 M-0001-C 300.00 20 10/05/1992 18 1 3 135.00 20.00 10 17/10/1992 10 5 1 T-0002-AT 15.00 2000 25/08/1995 1998 7 1 C-400-Z 7.00 22 17/10/1992 22 2 1 5.00 3 17/10/1992 3 4 1 O-0002-PP 99.00 70.00 15 17/10/1992 15 3 2 DD-0001210 P-0001-33 210.44 PANASONIC PACK DISKETTE 144 PANASONIC FLOPPY 1.00 1000 25/08/1995 1000 6 2 O-0002-PP 99. 90 A-1001-L 100 A-1001-L 1 2.50 1 55 15.00 C-1002-H 1 0.00 60.00 descuento 3 C-400-Z C-400-Z O-0001-PP diassum 1 C-1002-J P-0001-33 17 4.00 7 5 O-0001-PP O-0001-PP 19.00 1 O-0002-PP 2 99.00 120.Bases de Datos II numpieza numbin cantdisponible DD-0001-30 1 120 P-0001-33 2 10 O-0002-PP M-0001-C M-0003-C DD-0001210 FD-0001144 fecharecuento 15/10/1990 15/10/1992 periodorecuen 1 cantminima 15 5 3 4 5 6 110 15 2 10 15/10/1992 15/10/1992 20/10/1992 12/11/1992 1 2 1 2 3 2 0 1 7 10 12/11/1992 2 0 tabla PRECIOSUM numpieza A-1001-L 3 numvend 5.00 4 3 DD-0001-210 DD-0001-210 DD-0001-210 DD-0001-30 1 2 101 1 150.00 A-1001-L 4 4.75 80.00 350.00 3 FD-0001-144 FD-0001-144 FD-0002-720 102 55 1 136.00 140.60 3 2 5.50 2 1 8002 8.00 300.00 3 10 3 M-0001-C M-0001-C M-0002-C M-0002-C M-0003-C M-0003-C 1 3 9 1 3 4 155.00 3 7 1 10 2 7 M-0003-C 1 200.50 5 1 130.00 1 O-0002-PP O-0002-PP 5 101 98.00 1 10 O-0002-PP 1 75.00 280.56 3 DK144-0002P DK144-0002P FD-0001-144 1 5.00 180.50 7.00 150.00 3 5 15 4 DK144-0001 1 0.00 1 2 210.00 preciounit 1 5 15 12 14 7 13 10 15 5 15 15 12 5 Docente: Arturo DíazPulido .50 3 2 1 1.00 170.00 7 1 15.00 120. 2. Para cada pieza de la que se conozca algún suministrador. 14.00 3 P-0001-33 4 280. 3. 9. Nombre y empresa de los vendedores de la Comunidad Valenciana.00 30.50 2 1 3 T-0003-AT 3 81. Número y nombre de los vendedores con número de vendedor menor que 6. 4. ordenadas de menor a mayor precio. Modificar el requerimiento anterior para eliminar duplicados. 11. ordenados de mayor a menor precio de compra. Códigos de pieza de los que se sabe que algún vendedor nos podría hacer descuento.00 25.00 2 P-0001-33 T-0001-IBM 5 2 280.00 5 15 T-0002-AT 1 30. 10. para los pedidos solicitados el 15 de octubre de 1992. Número. Códigos de pieza solicitados en el pedido 1.00 7 P-0001-33 3 250. 8.00 90.00 3 5 T-0001-IBM T-0001-IBM 100 1 95. de posible suministrador y precio de suministro.00 3 T-0002-AT T-0002-AT 2 4 35. Obtener todos los números de los vendedores de los que se sepa que pueden suministrar alguna pieza. Nombre de los vendedores con número de vendedor menor que 6. ordenados por código de vendedor y código de pieza. Números de vendedores y días que tardarían en suministrar la pieza 'P-0001-33' 12.00 77. Obtener todos los números de piezas de las piezas de la base de datos.45 10 10 7 5 5 CONSULTAS SELECT1 1.00 90. Códigos de pieza. Números de pedido y números de vendedor. 6. 5. 7.00 5 7 T-0002-AT 5 33.00 3 T-0002-AT T-0002-AT T-0003-AT 100 201 1 34. 15. 18 Pulido Docente: Arturo Díaz . Vendedores de la provincia de Alicante. Nombre de todas las piezas con un precio de venta menor que 1000. obtener el número de pieza y el descuento. en orden descendente del valor de descuento. nombre y precio de venta de las piezas de precio de venta mayor que 10 o menor que 1 euros.Bases de Datos II P-0001-33 1 250. 13. Si encuentra tal valor. Así. esta información se encuentra almacenada en la tabla imparte. Contenidos • Utilización de más de una tabla. que relaciona las claves primarias de cada una de las tablas asociadas por tal relación. y el segundo en la de asignaturas. profesores where profesores. • Tipos de datos: dominios.dni and asignatura = codigo resultado: nombre EVA GOMEZ EVA GOMEZ RAFAEL ROMERO descripcion Fundamentos de las Bases de Datos Diseño y Gestión de Bases de Datos Programación Concurrente En primer lugar. aparecerá el código de 19 Docente: Arturo DíazPulido . • Resolución de requerimientos UTILIZACIÓN DE MÁS DE UNA TABLA Para la resolución de la mayoría de requerimientos es necesario trabajar con información que se obtiene de relacionar varias tablas. por clarificar el mecanismo por el que se obtiene este resultado. que asocia dni de profesor con codigo de asignatura que imparte. El primer atributo se encuentra en la tabla profesores. y busca el valor de dni de cada una en la tabla imparte. descripcion from asignaturas.Bases de Datos II select 2 CONSULTAS SOBRE VARIAS TABLAS Objetivos: • Poder relacionar distintas tablas de la BD para obtener información más compleja. • Sinónimos temporales de tabla. imparte. • Nombres cualificados de atributo. para obtener la información que precisamos.dni = imparte. podemos preguntar por el nombre de los profesores y la descripción de las asignaturas que imparten. tupla por tupla. que el SGBD recorre la tabla de profesores. La forma de especificar qué tablas vamos a consultar es construir una lista de nombres de tablas en la cláusula FROM. La relación entre ambas tablas se encuentra en la tabla imparte. en esa tupla de imparte en que lo ha encontrado. select nombre. solicitamos nombre (del profesor) y descripcion (de la asignatura). Si seleccionamos la BD Ejemplo. necesitamos involucrar a las tres tablas al mismo tiempo. Podemos pensar. el resultado final tendría 3 x 3 x 5 = 45 tuplas. Si en la cláusula from pusiéramos. asignaturas. en la columna nominada como asignatura. imparte where profesores. ni la segunda es impartida por ningún profesor (de los conocidos por nuestro sistema). ¿Qué pasaría si no utilizáramos la cláusula where para enlazar las tablas? Supongamos el siguiente requerimiento: select asignatura. o la asignatura HISTORIA DE LA INFORMÁTICA. nombre from profesores. una de las ventajas de utilizar un SGBD es que las consultas se procesan de manera eficiente y de forma totalmente transparente para el usuario. imparte resultado: asignatura FBD FBD FBD DGBD DGBD DGBD PC PC PC nombre EVA GOMEZ MANUEL PALOMAR RAFAEL ROMERO EVA GOMEZ MANUEL PALOMAR RAFAEL ROMERO EVA GOMEZ MANUEL PALOMAR RAFAEL ROMERO Si no indicamos nada en la cláusula where la información que obtenemos es simplemente la combinación de cada tupla con todas las demás: si hay 3 tuplas en imparte y otras 3 en profesores. además. puesto que ni el primero (en nuestra BD) imparte asignatura alguna. obtendrá la descripcion y finalmente mostrará en pantalla el nombre y la descripción que le corresponde. Veamos en detalle como funciona la orden select-from-where para el caso de la siguiente consulta (códigos de asignaturas y nombre de los profesores que las imparten) 1: select asignatura. la cardinalidad de la relación resultante es 3 x 3 = 9 tuplas.dni resultado: asignatura nombre FBD EVA GOMEZ DGBD EVA GOMEZ PC RAFAEL ROMERO El SGBD primero combinaría todas las tuplas con todas de las tablas especificadas en el from: dni nombre categoria 21111222 EVA GOMEZ TEU 21222333 MANUEL PALOMAR TEU 21333444 RAFAEL ROMERO ASO6 21111222 EVA GOMEZ TEU 21222333 MANUEL PALOMAR TEU 21333444 RAFAEL ROMERO ASO6 21111222 EVA GOMEZ TEU 1 ingreso dni asignatura 01/10/1993 21111222 FBD 16/06/1989 21111222 FBD 16/06/1992 21111222 FBD 01/10/1993 21111222 DGBD 16/06/1989 21111222 DGBD 16/06/1992 21111222 DGBD 01/10/1993 21333444 PC Esto no es necesariamente real. 20 Pulido Docente: Arturo Díaz .dni = imparte. la tabla asignaturas. buscando en la tercera tabla.Bases de Datos II asignatura. Nótese que no aparece MANUEL PALOMAR. nombre from profesores. ni asignatura ni codigo se utilizan en otras tablas. las columnas especificadas en la select determinarían el resultado final: asignatura FBD DGBD PC nombre EVA GOMEZ EVA GOMEZ RAFAEL ROMERO NOMBRES CUALIFICADOS DE ATRIBUTO Si observamos la sentencia select anterior. de qué tabla): select profesores. imparte profeso where profesores. profesores. al comparar los dni que aparecen en profesores y en imparte hemos utilizado el nombre de la tabla a la que pertenecen cada uno. y nos quedaría: dni nombre categoria 21111222 EVA GOMEZ TEU 21111222 EVA GOMEZ TEU 21333444 RAFAEL ROMERO ASO6 ingreso dni asignatura 01/10/1993 21111222 FBD 01/10/1993 21111222 DGBD 16/06/1992 21333444 PC Y por último. no es necesario utilizar el nombre de la tabla. en este caso. Utilizaremos el nombre completo de la columna (es indiferente.dni . select dni.dni. nombre from profesores. buscaremos en imparte los dni de los profesores (son los que tienen al menos una asignatura asignada). y con este valor obtendremos el nombre en profesores. Si en el conjunto de columnas de todas las tablas que se especifican en la cláusula from existen varias con nombres iguales.dni resultado: ERROR Al especificar que nos muestre en pantalla el dni del profesor. deberemos especificar en todo momento la tabla de la que queremos extraer la información.Bases de Datos II 21222333 MANUEL PALOMAR TEU 21333444 RAFAEL ROMERO ASO6 16/06/1989 21333444 16/06/1992 21333444 PC PC Por lo especificado por la where eliminaría aquellas tuplas que no cumplieran la condición.dni resultado: dni 21111222 21111222 21333444 21 nombre EVA GOMEZ EVA GOMEZ RAFAEL ROMERO Docente: Arturo DíazPulido . imparte where profesores. nombre from res.dni = imparte.dni e imparte. Si deseamos conocer el dni y el nombre de los profesores que imparten alguna asignatura. el SGBD entra en conflicto puesto que no sabe si nos referimos al de la tabla profesores o al de la tabla imparte.dni = imparte. Caso de no existir ambigüedad. La forma de evitar tuplas idénticas ya se mostró en la sesión anterior. 22 Pulido Docente: Arturo Díaz . y es por eso que aparece duplicada en este resultado.Bases de Datos II Se recuerda que la ocurrencia EVA GOMEZ está relacionada con dos asignaturas. nombres alternativos de las tablas.dni resultado: dni 21111222 21333444 23 nombre EVA GOMEZ RAFAEL ROMERO Docente: Arturo DíazPulido .dni = i. select distinct p. antes de la “.dni. Se especifican en la lista de tablas del from. nombre from profesores p.Bases de Datos II SINÓNIMOS TEMPORALES DE TABLA Para facilitar la escritura de las sentencias select (entre otros posibles motivos) se pueden utilizar alias temporales. imparte i where p.” que separa el nombre de la tabla en cuestión de la siguiente. Obtener número y nombre de todas las piezas recibidas el 1 de Mayo de 1992. y pieza que ha sido comprada a un precio mayor que el estipulado en la lista de precios de suministro. Número de pieza y número y nombre de vendedor de aquellas piezas cuyo precio de venta es mayor que 50 o su descuento de suministro es mayor que 10. Pedidos y datos del vendedor cuya fecha de pedido no sea el 22 de octubre de 1992. 7. Obtener el nombre y número de proveedores de la provincia de Valencia a los que se les ha solicitado un pedido. Obtener el nombre y número de proveedores de la provincia de Valencia. 20. 5. Piezas que nos puedan suministrar los vendedores de la empresa Harw S. Lista el nombre y número de las piezas. Número. 14.A. Nombres de proveedores que puedan suministrarnos la pieza numero A-1001-L 11. 21. 22. 24 Pulido Docente: Arturo Díaz . nombre y precio de venta de las piezas que han sido compradas en un pedido servido por el vendedor 1. 2. Obtener los números de pieza de las que conozcamos algún vendedor que nos la pueda suministrar. Número y nombre de las piezas que puedan suministrarnos el vendedor número 2 y el 4 (no necesariamente que las puedan suministrar los dos). Obtener nombre. Obtener los números de pedido del vendedor número 1. Obtener los números de línea y su precio de compra del pedido número 1. 9. 12. Obtener los vendedores que pueden suministrarnos piezas con un descuento de más de 10%. Modificar el requerimiento anterior para eliminar duplicados. 23. 4. en orden descendente del número de pieza. y ciudad del vendedor que puede suministrarnos piezas con valor mayor de 100.Bases de Datos II CONSULTAS SELECT2 1. Obtener los vendedores ordenados alfabéticamente en orden descendente. 17. 16. Precio unitario de suministro del número de pieza A-1001-L y el vendedor 100. 18. 10. 19. 8. 3. teléfono. Obtener el número de pieza junto con el nombre de todas las provincias desde las que puede sernos suministrada. Ídem en orden ascendente. Precios a los que nos pueden ser suministradas las piezas DD-0001-210 y FD-0001-144. Obtener todas las piezas que se recuenten el 15 /10/1992. 6. 15. Número y nombre de vendedor. y número y nombre de los vendedores que las podrían suministrar a esos precios. 13. Construcción de expresiones de selección de filas utilizando rangos. listas. deseamos conocer los créditos y descripción de las asignaturas cuyo número de créditos está entre 5 y 8. Contenidos • BETWEEN. subcadenas.Bases de Datos II select 3 EXPRESIONES DE SELECCIÓN DE FILAS Objetivos: • Comparaciones de cadenas de caracteres. 25 Docente: Arturo DíazPulido . La sintaxis de tal subexpresión de la cláusula where es la siguiente: expresión [NOT] BETWEEN expresión AND expresión Por ejemplo. IN • LIKE. y funciones de comparación de cadenas de caracteres. select creditos. RANGOS Expresiones del tipo 10 <= x <= 100 se pueden construir utilizando el operador de construcción de rangos BETWEEN. descripcion from asignaturas where creditos between 5 and 8 resultado: creditos 6 6 6 descripcion Fundamentos de las Bases de Datos Diseño y Gestión de Bases de Datos Programación Concurrente LISTAS Mediante el operador IN se puede buscar un determinado valor en una lista construida usando constantes. imparte i where p.dni and asignatura not in ('HI'. es decir. Profesores que atiendan al nombre de 'RAFA': select * from profesores where nombre like 'RAFA%' resultado: dni 21333444 nombre RAFAEL ROMERO categoria ASO6 Código de las asignaturas de 'Bases de Datos' select codigo from asignaturas where descripcion like '%BASES DE DATOS%' 26 Pulido Docente: Arturo Díaz .Bases de Datos II expresión [NOT] IN (listaValores) Descripción de las asignaturas FBD y DGBD: select descripcion from asignaturas where codigo in ('FBD'. que soportan la siguiente sintaxis: columna [NOT] LIKE 'cadena' La cadena de caracteres cadena admite los comodines % y _ . Para ello utilizaremos los operadores LIKE o MATCHES. FBD o DGBD: select nombre from profesores p. que no imparte ninguna de las asignaturas objeto de la búsqueda. 'DGBD') resultado: nombre RAFAEL ROMERO Fijémonos en que MANUEL PALOMAR. SUBCADENAS DE CARACTERES Podemos preguntar por subcadenas dentro de columnas de tipo carácter.dni = i. el primero indica una cadena de caracteres de cualquier longitud. 'FBD'. 'DGBD') resultado: descripcion Fundamentos de las Bases de Datos Diseño y Gestión de Bases de Datos Nombre de los profesores que no imparten HI. tampoco aparece en la tabla resultado puesto que su dni no aparece en la tabla IMPARTE. equivalentes en uso a los comodines de MS-DOS * y ?. y el segundo un carácter cualquiera. 5 6 6 6 9 Docente: Arturo DíazPulido .Bases de Datos II resultado: codigo FBD DGBD Código de las asignaturas. creditos from asignaturas where creditos is not null resultado: 27 codigo HI FBD DGBD PC FP creditos 4. cuya sintaxis es: columna IS [NOT] NULL Código y créditos de las asignaturas de las que conocemos su número de créditos: select codigo. siendo tal código de 2 caracteres: select codigo from asignaturas where codigo like '__ ' (2 subrayados seguidos de 3 espacios en blanco: codigo es un CHAR(5) resultado: codigo HI PC FP VALORES NULOS Podemos interrogar a la BD de datos en busca de valores desconocidos (información faltante) mediante el operador IS NULL. 2 Evidentemente. Nombres de vendedores que empieza su nombre por J. 3. Obtener el nombre de las piezas que puedan ser suministradas por aquellos proveedores cuyo nombre empiece por S. 2. Nombre de vendedores que el nombre empieza por M seguido de cualquier carácter simple. 6. 4._} CONSULTAS SELECT3 1. 7. Obtener los vendedores de la provincia de Valencia o Alicante que su nombre empieza por J o por M y tienen un número de vendedor entre 1 y 100. Obtener los nombres de pieza que pueden suministrar los vendedores de apellido 'García'. por lo que se ha de tratar como subcadenas dentro del valor del atributo. 9. para los vendedores de la provincia de Valencia o Alicante. Obtener el nombre de las piezas que puedan ser suministradas por proveedores cuyo nombre empiece por S. la BD no diferencia entre nombre y apellido primero y segundo. Listar los nombres y números de vendedores así como el número y nombre de las piezas que pueden suministrar. Nombres de vendedores que termina su nombre por Z. Castellón o Alicante. 8. y se llamen de apellido2 Martínez o Martín. una R y cualquier cadena de n caracteres. Obtener los nombres de los vendedores de las provincias de Valencia. 5. 10. Nombres de vendedores que se apellidan López.Bases de Datos II RESUMEN DE OPERADORES Recopilamos todos los operadores y conectivas lógicas vistos hasta ahora para la construcción de expresiones condicionales: = AND BETWEEN > OR IN < >= <= <> IS NULL NOT LIKE {%. 28 Pulido Docente: Arturo Díaz . 17. 3 Cuando no se especifica un atributo concreto. 15. Obtener los nombres de vendedores en orden alfabético. de aquellos vendedores cuyo apellido comienza por Martín. Nombre de las piezas que pueden sernos suministradas desde la Comunidad Valenciana. Obtener todos los vendedores que tengan teléfono. se entiende que se pide toda la información disponible en la BD de los objetos solicitados. Obtener los vendedores que viven en la calle Ciscar o Salamanca y de la Empresa Harw S. Obtener nombres de vendedores y números de pieza que nos pueden suministrar. 18. 12. 13. el 300 y/o el 400 con un precio de venta entre 10 y 1000. Obtener todos los nombres de piezas que pueda suministrar el vendedor 100. Listar las piezas con un descuento entre 1 y 10 cuyo nombre contenga una O y que se las hayamos solicitado a proveedores cuyo número oscile entre el 1 y el 1000. y ordenados alfabéticamente. Piezas3 que sabemos que nos puede suministrar algún vendedor. 20. 16. y un precio unitario entre 1 y 500. Obtener el número de pieza y el precio de los monitores.Bases de Datos II 11.A. 29 Docente: Arturo DíazPulido . 14. 19. Obtener nombre de vendedores y nombre de piezas que pueden suministrar ordenado en orden alfabético. etc. calcular días.fecha2) TO_CHAR(fecha [. cambiar el formato de visualización. formato]) 4 Aunque todas las demás sesiones de prácticas cumplen con el estándar SQL.) entonces debemos ayudarnos de estas funciones. Convierte la fecha de tipo DATE a un valor VARCHAR2 en el formato especificado en "formato" Convierte la cadena de caracteres "cadena" de tipo TO_DATE(cadena [.Bases de Datos II select fecha FUNCIONES DE FECHA4 Contenidos • TO_CHAR() • TO_DATE() • SYSDATE • ADD_MONTHS() • MONTHS_BETWEEN() FUNCIONES DE FECHA Se presentan a continuación distintas funciones de manejo de fechas y hora. la comparación entre fechas se hace directamente. select nombre from profesores where ingreso < '23/12/1989'’ resultado: nombre MANUEL PALOMAR Pero si necesitamos hacer transformaciones sobre un determinado dato (extraer parte de una fecha.n) Devuelve los meses transcurridos entre fecha1 y fecha2 MONTHS_BETWEEN(fecha1. 30 Pulido Docente: Arturo Díaz . Por ejemplo: select nombre from profesores where ingreso < '23/12/1989'. que se pueden utilizar tanto en la lista de columnas que aparecerán en la tabla resultado de la select como en la construcción de expresiones de la where. En general. los tipos de datos de fecha y hora y las funciones que los manejan no suelen estar igualmente implementadas en todos los SGBD. por lo que esta sesión es únicamente aplicable a Oracle. formato]) CHAR a un valor de tipo DATE con el formato especificado en "formato" Devuelve la fecha actual del sistema SYSDATE Devuelve la fecha especificada con n meses más ADD_MONTHS(fecha. Bases de Datos II 31 Docente: Arturo DíazPulido . 'DD') < 15 select * from profesores where to_char(ingreso. : 'texto' D DAY DD DY MM MON MONTH Q YYYY Y.YYY YY SIGNIFICADO Marcas de puntuación y texto fijo que se reproduce en el resultado Día de la semana (1-7) Nombre del día de la semana Día del mes (1-31) Día del año (1-366) Mes (1-12) Nombre abreviado del mes Nombre completo del mes Cuatrimestre del año (1-4) Año con 4 dígitos Año con punto de millar Año con 2 dígitos Por ejemplo: select nombre. sysdate-ingreso from profesores 32 Pulido Docente: Arturo Díaz .Bases de Datos II FORMATOS DE FECHA Las funciones TO_CHAR() y TO_DATE() admiten distintos formatos de fecha que se pueden construir según una máscara especificada por el usuario. . to_char (ingreso.'MM') < 6 select * from profesores where ingreso = sysdate Para obtener el número de días entre dos fechas basta con utilizar la operación resta select nombre.'DD') from profesores where to_char(ingreso. Dicha máscara es una cadena de caracteres entre comillas simples en la que se pueden utilizar los siguientes: ELEMENTO ./ ' . 8. 5. de las piezas recibidas en el 95 y de precio de venta entre 50 y 100 euros. 2. Números de pieza de las piezas que se recuentan entre el 1 de Octubre de 1992 y el 31 de Octubre de 1992. 3. 7. descripción. Obtener el número de pieza de las piezas que se recuenten el 15/10/92. 9. 4. Número y fecha de los pedidos solicitados en el segundo semestre del 92. cantidad recibida. ordenado alfabéticamente. fecha de recepción. Número y descripción de las piezas que sirvieron los proveedores en el 95 y cuyo precio de compra es superior al precio de suministro que ellos ofertaban. Número de pieza. Nombre de los vendedores que sirvieron piezas en la primera quincena de mayo del 92.Bases de Datos II CONSULTAS SELECT FECHA 1. 33 Docente: Arturo DíazPulido . Número. Número y descripción de las piezas que sirvieron los proveedores los días 10 de cada mes. Años en que se ha efectuado algún recuento. nombre de vendedor y mes en que se les solicitó un pedido de discos duros. 6. create DEFINICIÓN DE DATOS Objetivos: • Introducir al alumno a la definición de datos. Contenidos 34 • Las órdenes CREATE TABLE y DROP TABLE • Restricciones • La orden INSERT (1) • Información sobre las restricciones de una tabla . ingreso: datetime) ASIGNATURAS (codigo: char(5). en su forma más sencilla. En primer lugar debemos decidir cuáles son los atributos de cada uno de ellos y sus tipos de datos: PROFESORES (DNI: varchar2(10). probablemente. la forma que tienen estas tablas ha sido una decisión nuestra como diseñadores de esta base de datos concreta. Supongamos que vamos a implementar un esquema de base de datos relacional de profesores. nombre: varchar2(40).]] RESTRICCIONES Las restricciones son reglas.columna tipoDatos[. las restricciones obligan a cumplirse ciertas reglas cuando una fila es insertada. Podemos contemplar los siguientes tipos de restricciones de integridad de datos: • 5 NOT NULL: especifica que la columna no puede contener un valor nulo. Todos los SGBDR permiten crear tablas sin restricciones de clave primaria. El conjunto de descripciones de tablas conforma el esquema de base de datos y representa a un sistema de información concreto.{restricciones}] ) La lista de columnas. en otra situación hubiéramos. Básicamente. descripcion: varchar2(35).. Obviamente.1) creditosp: number(3. que normalmente se establecen en el momento de crear una tabla. Las claves ajenas se introducen en la siguiente sesión. es un conjunto de expresiones (tantas como columnas deseemos. y separadas por comas) del tipo: columna tipoDatos[. para garantizar la integridad de los datos..1)) Para cumplir con las restricciones del modelo relacional. sin relaciones entre ellos). de forma que la operación se llevará a efecto sólo si se cumplen las restricciones definidas en la tabla. . decidido definir otros atributos y otras tablas. categoria: char(4). 35 .LA ORDEN CREATE TABLE La definición de tablas es el primer paso en la creación de una base de datos. pero un correcto diseño de bases de datos incluirá claves ajenas que no se pueden definir si no existen sus correspondientes claves primarias. debemos elegir las claves primarias adecuadas5: DNI para profesores y codigo para asignaturas. además. La orden CREATE TABLE nos permite crear cada una de las tablas necesarias para nuestra base de datos: CREATE TABLE nombreTabla ( {listaColumnas} [. borrada o modificada. asignaturas (sólo es un listado de profesores y asignaturas. creditos: number(3. . los nombres de tabla y las columnas no deben incluir acentos o caracteres no habituales 7 El “punto y coma” es necesario para informar a Oracle de que una orden ha de ejecutarse y que. primary key (DNI)). estas columnas que forman la clave primaria no pueden tener valores nulos. Al crear una tabla.]]) Por ejemplo: create table profesores (DNI varchar2(10). sin filas. se aconseja terminar todas las órdenes con punto y coma. que puede contener tantas columnas como se necesiten: PRIMARY KEY (columna[. creditos number(3.. por la implementación del cliente Worksheet. se va a ejecutar otra orden distinta. la tabla no “desaparece” cuando nos desconectamos del servidor (tampoco los datos que almacenamos en ella). incluso si sólo es una. lista para insertar datos en ellas (orden insert. nombre varchar2(40). Si queremos borrar una tabla debemos ordenárselo al SGBD mediante la orden DROP TABLE: DROP TABLE nombreTabla Por ejemplo: drop table asignaturas resultado: 1 tabla borrada Al utilizar esta orden nótese que también se eliminan los datos (las filas) que pudiera contener. De las restricciones.columna[..1) creditosp number(3. con los mismos o diferentes atributos. de momento. No obstante. la clave primaria. y. Ahora podríamos volver a crear la tabla (sin filas). el resultado es persistente. ingreso date.. primary key (codigo)) 7 resultado: 1 tabla creada 1 tabla creada Ahora ya podemos ejecutar una consulta sobre cualquiera de estas dos tablas: select * from profesores resultado: ninguna fila seleccionada El resultado de la creación es una tabla vacía.• PRIMARY KEY: identifica de manera única a cada fila de la tabla mediante una o varias columas. sólo vamos a utilizar. • FOREIGN KEY: establece una relación entre una(s) columna(s) de la tabla y otra(s) columna(s) de la tabla referenciada. • CHECK: especifica una condición que se debe evaluar a “cierto”.6 create table asignaturas (codigo char(5). y volver a borrarla.1). descripcion varchar2(35). siendo esta última(s) columna(s) la PRIMARY KEY. categoria char(4). . 36 6 Para facilitar su uso. a continuación). a continuación. Si sólo se escribe una orden no hace falta este caracter.. ’01/01/2000’. INSERT INTO nombreTabla VALUES ( listaExpresiones ) Supongamos que en la base de datos anterior queremos dar de alta un nuevo profesor.’01/01/2000’). no admiten valores duplicados. nombre “PATRICIO MARTÍNEZ”. into y values. asignaturas values (‘55555555’. insert into profesores.’ERNESTO PEREZ’. 37 . su ejecución no sea correcta.0). Con la sintaxis que se muestra a continuación seremos capaces de introducir datos nuevos en cualquiera de las tablas que componen una determinada BD. no se permite una lista de nombres de tabla para introducir datos en varias tablas a la vez. deberíamos ejecutar la siguiente orden. El SGBD. en nuestro caso las claves primarias. el resultado indicará cuál es la restricción violada.’PATRICIO MARTINEZ’. resultado: ERROR falta la palabra clave values Lo mismo ocurre con las filas. resultado: 1 fila creada Resultado El resultado que devuelve una orden INSERT. cada vez que insertamos un nuevo dato en una tabla. formada por dos cláusulas.’XXX’. ’10/10/2001’). ‘BdI’. Insert into profesores values (‘55555555’.’BASES DE DATOS I’.LA ORDEN INSERT Para introducir datos nuevos en una base de datos vamos a utilizar la orden INSERT de SQL.’PATRICIO MARTINEZ’. veremos la expresión mínima de la orden. que como sabemos.’TU’. En principio.’PEPITO’. Si dicho profesor tiene como dni el “55555555”. ’11/11/2006’). será siempre el número de filas insertadas. habrá que ejecutar n sentencias INSERT. Para los casos en que la ejecución de la sentencia viole alguna restricción de la BD y por tanto.’ASO6’. sólo se puede indicar una lista de valores. se encarga de verificar las restricciones activas.6. resultado: 1 fila creada Sólo se puede indicar una tabla en la que introducir datos.’TU’. Para introducir datos en n tablas. insert into profesores values (‘66’. en el caso de que la ejecución haya sido correcta. Esto quiere decir que hay que ejecutar una orden insert por cada una de las filas que queramos almacenar en una tabla insert into profesores values (‘66’. ni valores nulos. categoría “TU” y fecha de incorporación “01/01/2000”. Las razones que lo aconsejan son: • No habrá que fijarse en si se va a dar valor a todas o sólo a alguna de las columnas para acomodar la sintaxis de la sentencia INSERT. resultado: 1 fila creada La lista de valores se asigna a la lista de columnas. sean o no todas las de la tabla. Es decir. estaremos obligados a mirar las columnas y su orden. • Si por alguna razón se modifica la estructura de una tabla. La siguiente sentencia realiza la misma operación que la anterior. se añaden columnas nuevas.’ARMANDO SUAREZ’.nombre) values (NULL. si no las indicamos. Insert into profesores (dni. . resultado: 1 fila creada Es recomendable acostumbrarse a poner siempre las columnas a las que se va a dar valor. Puesto que NULL es la ausencia de valor. la segunda el segundo y así sucesivamente. NULL).ingreso) values (‘88888888’.SYS_C0033923) 8 violada VALUES Si no se va a dar valor a todas las columnas de la tabla se deberá indicar las columnas a las que se les dará valor. ‘ARMANDO SUAREZ’).dni. NULL. Existe la posibilidad de hacer uso del valor NULL.categoria) values (‘88888888’. para poder establecer el orden adecuado en la lista de valores.resultado: ERROR restricción única (BDI. y tenemos costumbre de no indicar las columnas cuando se inserta valor a todas.’ARMANDO SUAREZ’). es decir. de forma que la primera columna toma el primer valor. Es decir. si lo asignamos como valor a una columna de una tabla. sólo supiéramos el dni y el nombre del profesor que queremos dar de alta. NULL). resultado: 1 fila creada Ésto apoya aún más el hecho de que sea aconsejable poner siempre la lista de columnas. ‘88888888’. si por ejemplo. 8 38 Nombre de la restricción.nombre. aunque el orden de asignación es diferente.’ARMANDO SUAREZ’. ejecutaríamos la sentencia siguiente Insert into profesores (dni. resultado: 1 fila creada Insert into profesores (categoria.nombre. con la modificación dejarán de funcionar las sentencias que tuviéramos escritas. nombre) values (‘88888888’. lo que estaremos haciendo es indicar que esa columna no tiene valor.categoria. Así. ya que aún dando valor a todas las columnas de la tabla. Insert into profesores (dni. la lista de valores deberá seguir el orden que esas columnas tienen internamente en la tabla. las dos sentencias siguientes realizan exactamente la misma operación. por ejemplo. y sus tipos de datos. pero no facilita ninguna información sobre otro tipo de restricciones. resultado: CONSTRAINT_NAME C SEARCH_CONDITION -----------------------------. por ejemplo. search_condition from user_constraints where table_name =’nombreTabla’ 9 . del tipo siguiente: select constraint_name. Para establecer los nombres de las restricciones. si una columna determinada admite o no nulos. constraint_type. Donde • Constraint_name es el nombre de la restricción.----------------SYS_C0058701 P SYS_C0058702 R SYS_C0058703 R 9 (1) nombreTabla debe indicarse en mayúsculas. INFORMACIÓN SOBRE LAS RESTRICCIONES DE UNA TABLA En el momento de crear una restricción. se suele seguir el siguiente convenio: ser nombres descriptivos y empezar. Si.INFORMACIÓN SOBRE UNA TABLA Recordemos que ejecutar DESC nombreTabla o DESCRIBE nombreTabla. Oracle asigna un nombre único a cada restricción con el formato SYS_Cn. por PK_ si se trata de una Primary Key o por FK_ si se trata de una Foreign Key o por C_ si se trata de una CHECK. el orden interno de las mismas en la tabla. quisiéramos saber las restricciones definidas sobre la tabla IMPARTE. La sentecia DESC sólo muestra. constraint_type. Para obtener la información relativa a otras restricciones definidas sobre una tabla se deberá ejecutar una consulta. R que es ajena y C una check. P indica que la restricción es de clave primaria. muestra información sobre las columnas que componen la tabla. siendo n un valor entero. pero sí que debemos saber que si no especificamos ningún nombre.. • Search_condition es la condición impuesta en caso de que la restricción sea de tipo check. a nivel de restricción. sobre la tabla USER_CONSTRAINTS. No vamos a profundizar más en los nombres de las restricciones ni en la sintaxis para crearlos. ejecutaríamos la siguiente consulta select constraint_name. además de especificar las reglas que se deben cumplir. • Constraint_type puede tomar distintos valores. podemos dar un nombre a la misma. search_condition from user_constraints where table_name =’IMPARTE’. 39 . grado de amistad.’tercera’) (1.’quinta’) (NULL.NULL) 13. inserta en la tabla la fila (1. 2.”octava” .NULL. col2) 12.’AA’.2) 5.’octava’)10 (3.’séptima’) (0.ÓRDENES CREATE 1.’’. crea un listín de teléfonos con los siguientes datos: apodo. teléfono. con col1 como clave primaria. col2(char(2)) y col3(varchar2(10)). inserta los siguientes datos y consulta la tabla para ver los datos almacenados (1. consulta la tabla XX 11. consulta la tabla 3. crea una tabla YY con 3 columnas col1(integer). modifica la tabla anterior. rellénala con datos (4 filas será suficiente) 14. añádele una columna más. Crea una tabla de nombre XX con 2 columnas.’segunda’) (2. efectivamente.’sexta’) (3.’AA’.’AA’) 4.’primera’) (2. cuya clave primaria sea (col1. insert en la tabla la fila (2. comprueba que.’BB’) 6. ejecuta insert into XX values (‘BB’. “dos comillas simples”.’CC’. consulta la tabla XX 7.’BB’.’AA’. nombre.’AA’.’cuarta’) (NULL. y vuelve a rellenarla de datos 15. crea una lista de la compra y rellénala de datos 10 40 “cero”. col1 de tipo integer. y col2 de tipo char(3). borra la tabla XX 10. los datos siguen estando ahí 9. cierra la sesión de Worksheet e identifícate de nuevo (“salte y vuelve a entrar”) 8.NULL. en lugar de indicar la lista concreta de valores a insertar. creditos number(3. • La orden DELETE. hacer la SELECT e ir haciendo las INSERT una a una. Insertar las filas resultantes de una SELECT. INSERT INTO nombreTabla [ ( listaColumnas ) ] consulta Supongamos que serán optativas todas las asignaturas que tengan menos de 9 créditos. primary key (asignaturas)) LA ORDEN INSERT Existe la posibilidad de insertar el resultado de una SELECT. creditos) select codigo. en concreto. • Influencia de las claves ajenas en la sentencia INSERT y DELETE. influencia de las mismas en las sentencias Insert y Delete. tantas filas como tuplas devuelva la SELECT. eligiendo como clave primaria el código de la asignatura y poniendo además otra restricción. tenemos dos opciones. Se trata de introducir los códigos de dichas asignaturas en la tabla OPTATIVAS. creditos from asignaturas where creditos < 9. 41 . que todas las filas tengan un valor no nulo en la columna créditos create table optativas (asignatura char (5). Contenidos • La orden INSERT (2). Vamos a crear dicha tabla. como ya tenemos las asignaturas en la tabla ASIGNATURAS. copiando los datos de las filas obtenidas. Borrar todas las filas de una tabla. Insert into optativas (asignatura. Una opción es. Esto nos permite insertar varias filas en una tabla con una sola operación.MANIPULACIÓN DE DATOS (1) Objetivos: • Introducir al alumno en el concepto de clave ajena. Supongamos que en la BD Ejemplo existiera una tabla llamada OPTATIVAS que contuviera los códigos y los créditos de aquellas asignaturas de carácter optativo.1) not null. En este caso. Borrar determinadas filas. Otra opción es insertar en una sola operación el resultado de la SELECT en la tabla OPTATIVAS. • Creación de tablas con claves ajenas. evitando que se pongan valores nulos en esa columna. resultado: ERROR no hay suficientes valores Insert into optativas (asignatura. Delete from asignaturas a.codigo from asignaturas.CREDITOS) En esta última sentencia la restricción NOT NULL sobre la columna creditos impide que se realice la inserción de filas. Insert into optativas (asignatura) select codigo. para asegurar la integridad de los datos. asignatura) values (‘55555555’. Para borrar filas de varias tablas habrá que ejecutar tantas sentencias DELETE como de tablas queramos borrar. imparte i where a. resultado: ERROR tipos de dato inconsistentes Insert into optativas (asignatura) select codigo from asignaturas where creditos < 4. resultado:ERROR no se puede realizar una inserción NULL en (BDI.dni=’21111222’.creditos) select codigo from asignaturas where creditos < 9. resultado: ERROR demasiados valores Insert into optativas (asignatura. resultado: 42 ERROR comando SQL no terminado correctamente . DELETE [FROM] nombreTabla [WHERE condición] No se pueden borrar filas de varias tablas a la vez en una misma sentencia. es importante fijarse en que la sintaxis de la sentencia INSERT no permite utilizar a la vez una lista de valores y el resultado de una consulta.ingreso from profesores. Por otra parte.OPTATIVAS.asignatura and i.resultado: 4 filas creadas La SELECT deberá seleccionar tantas columnas como columnas pongamos en la lista de columnas de la parte insert y los tipos de datos de las columnas seleccionadas deberán coincidir con los tipos de datos de las columnas en las que se van a insertar esos valores.select codigo from asignaturas). asignatura) select ‘55555555’.creditos) select dni. resultado: 4 filas creadas LA ORDEN DELETE La sentencia DELETE nos permite borrar las filas contenidas en una tabla.codigo = i. resultado: ERROR falta una expresión Pero sí dentro de la propia orden select: Insert into imparte (dni. creditos from asignaturas where creditos < 9. Insert into imparte (dni. Por ejemplo.dni and p. junto con sus restricciones de clave primaria y claves ajenas es create table imparte ( dni varchar2(10) references profesores.categoria=’TEU’). de forma que para cada profesor que tenga docencia. columna REFERENCES tabla La sentencia de creación de esta tabla. IMPARTE ( dni : varchar2(10). se deberá exigir que el valor que tenga la columna dni exista en la tabla PROFESORES. como asignaturas imparta. resultado: 1 fila suprimida La condición indicada en la cláusula where puede ser tan complicada como se desee. hará que se borren sólo las asignaturas que tengan menos de 5 créditos. resultado: 5 filas suprimidas En el caso de que se indique alguna condición. asignatura char(5) references asignaturas. de la misma manera cada código de asignatura deberá existir en la tabla ASIGNATURAS. 43 . profesores p where i.dni = p. primary key (dni. en esta nueva tabla. Así. a diferencia de la anterior que borra todas las filas de la tabla asignaturas.asignatura ) ). Cada profesor tendrá tantas filas. esto es lo que se conoce como integridad referencial y se consigue mediante las denominadas claves ajenas:.CLÁUSULA WHERE Si no se especifica ninguna condición. Resultado: 1 fila suprimida CREACIÓN DE TABLAS CON CLAVES AJENAS Relacionemos ahora las tablas PROFESORES y ASIGNATURAS mediante la tabla IMPARTE. la siguiente sentencia. Con esta sintaxis a nivel de columna. Delete from asignaturas where creditos < 5. Delete from asignaturas. la sentencia siguiente borra aquellas asignaturas que son impartidas por profesores con categoría de TEU. la sentencia causará el borrado de todas las filas de la tabla. cada clave ajena sólo puede estar formada por una sola columna. asignatura : char(5) ) Clave primaria: (dni. Delete from asignaturas where codigo in (select asignatura from imparte i. se indique en la tabla IMPARTE su dni junto con el código de la asignatura que imparta. asignatura) Clave ajena: dni → PROFESORES Clave ajena: asignatura → ASIGNATURAS Evidentemente. se borrarán sólo aquellas filas de la tabla que cumplan la condición o condiciones impuestas. debe tener un valor que coincida con un valor existente en la tabla padre.Veamos otra sintaxis para definir claves ajenas.. desde otra tabla.'FP'). Toda clave ajena.. Delete from asignaturas where codigo = ‘FBD’.asignatura ). las columnas que conforman la clave ajena han de coincidir en número (y orden) y tipo de datos con la clave primaria de la tabla a la que se va a hacer referencia. sólo se podrán insertar aquellas filas cuyas claves ajenas existan en la correspondiente tabla padre. resultado: ERROR restricción de integridad (BDI. Una restricción de integridad referencial designa una columna o combinación de columnas como clave ajena de una tabla (la tabla hija) y establece una relación entre ella y la clave primaria de otra tabla (la tabla padre11).SYS_C0058700) violada . asignatura) values ('55555555'. asignatura) values ('21333444'. insert into imparte (dni. En el siguiente ejemplo la inserción no es posible pues no existe la asignatura ‘AAA’. FOREIGN KEY (columna[. mediante las palabras reservadas FOREIGN KEY. primary key (dni. la clave ajena asignatura hace referencia a la clave primaria codigo de la tabla padre asignaturas. que nos permite designar varias columnas como clave ajena. si no tiene un valor nulo.registro La tabla padre puede ser la misma tabla hija . CLAVES AJENAS: influencia en el INSERT En una tabla con claves ajenas. en la última línea de la sentencia. asignatura char(5). foreign key (asignatura) references asignaturas (codigo) ).SYS_C0058700) violada . no se podrá borrar la asignatura si antes no se eliminan las líneas correspondientes a esa asignatura en la tabla imparte. resultado: 1 fila creada CLAVES AJENAS: influencia en el DELETE Sólo se podrán borrar aquellas filas que no estén siendo referenciadas. resultado: 11 44 ERROR:restricción de integridad (BDI.columna[.]]) REFERENCES tabla Con esta sintaxis. .'AAA'). foreign key (dni) references profesores (dni). a través de ninguna clave ajena. Sea cual sea la sintaxis elegida para su definición. Si por ejemplo tenemos que la asignatura BDA es impartida por el profesor con dni 21111222. Por ejemplo.clave principal no encontrada insert into imparte (dni. vamos a escribir una sentencia equivalente a la anterior create table imparte ( dni varchar2(10). Crear un nuevo grado de amistad en AMISTAD. 8. 6. 45 . Y volvamos a crearla. Mira las filas de AMISTAD y explica que sucede. 3. Ejecutemos las sentencias del punto 1 para insertar algunas filas en LISTIN. Resultado: 1 fila suprimida EJERCICIOS MANIPULACIÓN1 Si alguna de las sentencias no se puede realizar. explica el motivo del error 1. para reflejar los diferentes grados de amistad y su descripción: amigo. pero añadiendo una restricción: que la columna grado sea clave ajena que referencie a AMISTAD. 5. Borremos TODAS las filas de AMISTAD. será necesario primero eliminar las filas de imparte que hagan referencia a esa asignatura. puede ser eliminada. Borremos las filas necesarias del LISTIN que nos permitan ejecutar el punto 10. grado. 7. 11. colega. 9. Ejecutemos todo ello para tener la tabla LISTIN con algunas filas. Delete from imparte where asignatura = ‘FBD’. Como clave primaria podemos elegir apodo. Borremos ahora sólo una fila. 10. Crear la tabla AMISTAD con las columnas grado y descripcion . Por lo pronto vamos a crear sólo la tabla. Volvamos a ejecutar las sentencias del punto 4. Mirando detenidamente las anteriores sentencias hagamos SÓLO los insert NECESARIOS en la tabla AMISTAD. deberemos tener la sentencia de creación de la tabla LISTIN. Partiendo del ejercicio 13 de la sesión anterior. Borremos de AMISTAD la fila que más referencias tenga. Sin incorporar datos. 4. telefono. resultado: 1 fila suprimida Delete from asignaturas where codigo = ‘FBD’. la última que hemos añadido. hagamos una select de LISTIN y contemos visualmente. nombre. Volvamos a ejecutar el punto 10. con las siguientes columnas: apodo. Una vez que la asignatura ya no está siendo referenciada desde ninguna otra tabla. etc. También tendremos las sentencias insert para incorporar algunas filas. 12. 2. Borremos la tabla LISTIN.secundario encontrado Para poder realizar esta operación. • Actualizar los valores existentes en tablas de la base de datos a través de subconsultas. creditosp=2. Contenidos • Actualizar los valores existentes en tablas de la base de datos.codigo = i. Resultado: 46 ERROR número no válido . resultado: 4 filas actualizadas Cuando se desea modificar más de una columna se indicará la lista de columnas y valores separadas por comas. Resultado: 4 filas modificadas Debe existir concordancia entre los tipos de datos de las columnas y el de los valores asignados a las mismas. UPDATE nombreTabla [aliasTabla] SET columna=expresion [WHERE condición] No se pueden modificar varias tablas a la vez en una misma sentencia. LA ORDEN UPDATE La sentencia UPDATE nos permite modificar la información contenida en una tabla. En el ejemplo que se muestra a continuación. Por ejemplo.MANIPULACIÓN DE DATOS (2) Objetivos: • Introducir al alumno en la orden UPDATE. imparte i set creditos= 2 where a. Para modificar los valores de varias tablas varias habrá que ejecutar tantas sentencias UPDATE como de tablas queramos modificar. Update asignaturas set creditos=4.asignatura and i. la siguiente sentencia hace que la columna créditos de la tabla asignaturas pase a tener valor 0. Update asignaturas a. • Practicar con la integridad referencial. Update asignaturas set creditos=’01/01/2002’. creditosp=2. resultado: ERROR falta la palabra clave SET CLÁUSULA SET En la cláusula SET se especifican las columnas de la tabla cuyos valores se desean modificar y los nuevos valores que se van a asignar a dichas columnas.dni=’21111222’. Update asignaturas set creditos = 0. a la columna créditos se le asigna el valor 4 y a la columna créditosp el valor 2. resultado: 2 filas modificadas La condición indicada en la cláusula where puede ser tan complicada como se desee.CLÁUSULA WHERE Si no se especifica ninguna condición. Por ejemplo.categoria=’TEU’). Update profesores set ingreso=’01/01/2003’ where categoria = ‘TEU’. profesores p where i. Update profesores set ingreso=’01/01/2003’. Resultado: 1 fila modificada 47 . se modificarán sólo aquellas filas de la tabla que cumplan la condición o condiciones impuestas. resultado: 3 filas modificadas En el caso de que se indique alguna condición. la siguiente sentencia. la sentencia causará la modificación de todas las filas de la tabla. Update asignaturas set creditos = 0 where codigo in (select asignatura from imparte i.dni = p.dni and p. la sentencia siguiente modifica los créditos de las asignaturas que son impartidas por profesores con categoría de TEU. hará que se modifique la fecha de ingreso sólo a aquellos profesores cuya categoría sea TEU. a diferencia de la anterior que modifica todas las filas de la tabla profesores. Así. resultado: ERROR la subconsulta devuelve más de una fila Update imparte set asignatura=’BDA’. el resultado de una consulta. dni = (select dni from profesores where categoria=’ASO6’) where asignatura like ‘%BD%’.asignatura) = (select dni from profesores where categoria =’ASO6’) where asignatura like ‘%BD%’. En este caso. a la segunda la segunda. 48 .MODIFICACIÓN DE MÁS DE UNA FILA Existe la posibilidad de modificar la información contenida en una tabla asignando como nuevo valor o valores. nombre from profesores where categoria =’ASO6’) where asignatura like ‘%BD%’. y así sucesivamente. Update imparte set asignatura=’BDA’. dni = (select dni from profesores) where asignatura like ‘%BD%’. Update imparte set asignatura=’BDA’. dni = (select dni. resultado: 1 fila actualizada Update imparte set (dni.asignatura) = (select dni. resultado: ERROR la subconsulta devuelve más de una fila Update imparte set (dni. Los valores se asignan por orden. ‘BDA’. la sentencia SELECT devolverá una única fila.asignatura) = (select dni. de forma que a la primera columna se le asigna el valor de la primera columna de la SELECT. resultado: ERROR demasiados valores Update imparte set (dni. ‘BDA’ from profesores where categoria =’ASO6’) where asignatura like ‘%BD%’. En el ejemplo siguiente se seleccionan dos columnas para dar valor a las columnas dni y asignatura de la tabla impartir. nombre from profesores where categoria =’ASO6’) where asignatura like ‘%BD%’. ‘BDA’ from profesores) where asignatura like ‘%BD%’. la sentencia SELECT sólo devolverá un valor (una fila y una columna) el cual debe coincidir en tipo de dato y longitud con el tipo de dato y longitud de la columna a la cual asignamos el valor. En el primer caso. Update imparte set (dni. UPDATE nombreTabla [aliasTabla] SET { {columna=expresion|columna=subconsulta} | listaColumnas=subconsulta} [WHERE condición] El resultado de la consulta puede asignarse a una única columna o a una lista de columnas. pero con tantas columnas como elementos haya en la lista de columnas. resultado: 1 fila actualizada Si la restricción de que la consulta devuelva una fila y una columna no se cumple no se realiza la actulización. resultado: ERROR demasiados valores La segunda opción asigna el resultado de una consulta a una lista de columnas.asignatura) = (select dni. borrar la fila de ‘FBD’.creditosp from asignaturas where codigo = ‘FBD’. después cambiar las referencias a ‘FBD’ por ‘BD1’ y.SYS_C005870012) violada registro secundario encontrado Para poder realizar esta operación. resultado: 1 fila insertada Update imparte set asignatura = ‘BD1’ where asignatura = ‘FBD’. Suponiendo el estado de la base de datos original: Update asignaturas set codigo = BD1 where codigo = ‘FBD’. Resultado: 1 fila suprimida Delete from asignaturas where codigo = ‘FBD’. Resultado: 1 fila suprimida 12 Recuérdese que el identificador de restricción (en este caso. 49 .creditosp) select ‘BD1’.descripcion. descripcion.creditos. Insert into asignaturas (codigo. una clave ajena) lo asigna el sistema y puede cambiar de un usuario a otro. las claves ajenas generan las mismas restricciones de integridad referencial que el DELETE salvo por la naturaleza de la operación: el UPDATE sólo generará problemas de integridad referencial si el dato a modificar es un valor de clave primaria que está siendo referenciada por alguna clave ajena.resultado: ERROR no hay suficientes valores Deberá existir una concordancia de tipo de dato y longitud entre los elementos de la lista de columnas y las columnas seleccionadas. resultado: ERROR:restricción de integridad (BDI.creditos. por último. será necesario insertar una nueva fila en asignaturas con el identificador BD1 y copiando el resto de los valores. CLAVES AJENAS: influencia en el UPDATE En general. El pedido con número 8 va a tener a partir de ahora el número 4. Actualiza el precio de venta de la pieza de número A-1001-L a 4 euros y el de la pieza de número C-1002-H a 15. 1. Pon a 0 el descuento de las piezas cuyos días de suministro sea inferior a 3. Modifica los datos de las piezas recontadas con anterioridad al 1 de enero de 2003 de forma que el período de recuento sea el mismo que para las piezas recontadas 50 . 17. para las líneas de pedido en las que la pieza pedida sea A-1001L. modifica el número de vendedor por el 3. Para los pedidos en los que la cantidad recibida variara de la pedida. 15. Haz que tomen el valor ‘SIN DESCRIPCION’. Antes de comenzar. el 8 será el 2 a partir de ahora y el 3 el 2. ya conocida. 11. la ciudad y la provincia de los vendedores de TOLEDO sea ‘CENTRAL. 18.ÓRDENES MANIPULACIÓN2 Los siguientes ejercicios se ejecutarán sobre la base de datos de Proveedores. Modifica los pedidos realizados por el vendedor de número 200 de forma que los haya realizado el vendedor de número 1000. Modifica la cantidad mínima de todas las piezas inventariadas que cumplan que la cantidad disponible es menor. pero para el vendedor de número 200. Haz que tomen el valor de la cantidad disponible de cada una de ellas. 14. 3. deberás ejecutar las instrucciones contenidas en el fichero BD1CreateBD. haz que no sea así. 5. 12. 8. 10. 9. Haz lo mismo que en el ejercicio anterior. 16.44 PANASONIC al precio de venta de la misma. 7. la cantidad pedida y recibida a 100 y la fecha de recepción a la fecha del día. a un preciounitario de 5 euros. el pedido con número 5 va a tener a partir de ahora el pedido con número 1. 19. Pon el precio de compra igual al precio de venta. Para pedidos anteriores al año 2000. Haz que la calle. Modifica la descripción de las piezas que estén SIN DESCRIPCIÓN asignándoles la descripción de la que tenga el precio de venta igual a 7 euros. 6. 2. 4. Asígnales los valores de la ciudad y la provincia del vendedor de número 3. 5’. A partir de ahora el vendedor número 5 suministrará la pieza DISKETTE 1. Para aquellos vendedores para los que no tengamos teléfono. Haz que la fecha de recuento del inventario de todas las piezas sea el 1 de enero de 2003. ponles el valor ‘SIN TLFNO’. Modifica los datos de las piezas que no tengan descripción. Actualiza la ciudad y la provincia de los vendedores que no sean de ALICANTE. Los pedidos del vendedor número 3 han sido realizados a fecha de hoy.‘SALAMANCA’. 13. Las piezas suministradas por el vendedor de número 3 van a ser suministradas a partir de ahora por el de número 500.sql para la creación de la BD e inserción de datos iniciales. ‘SALAMANCA’. 0 1. categoria : char(4).5 3. descripcion : char(40).1). creditosp : decimal(3. Contenidos • Cláusula ON DELETE (políticas de mantenimiento de la integridad referencial en las claves ajenas ante borrados en claves primarias) ON DELETE Ya se ha practicado con la integridad referencial en sesiones anteriores y se ha visto que el intento de borrar ciertas filas es rechazado por el SGBD si éstas están siendo referenciadas por alguna clave ajena.0 1.0 9.5 51 . creditos : decimal(3.0 6.5 6.INTEGRIDAD REFERENCIAL Y BORRADOS Objetivos: • Extender la gestión de las claves ajenas y automatizar el borrado cuando produce problemas de integridad referencial. asignatura : char(5) ) Clave primaria: (dni. ingreso : date ) Clave primaria: dni ASIGNATURAS ( codigo : char(5). Recordemos la estructura y el contenido de la base de datos Ejemplo: PROFESORES ( dni : char(9). asignatura) Clave ajena: dni → PROFESORES Clave ajena: asignatura → ASIGNATURAS Extensiones de Ejemplo: ASIGNATURAS codigo descripcion HI FBD DGBD PC FP creditos creditosp HISTORIA DE LA INFORMATICA FUNDAMENTOS DE LAS BASES DE DATOS DISEÑO Y GESTION DE BASES DE DATOS PROGRAMACION CONCURRENTE FUNDAMENTOS DE LA PROGRAMACION 4.0 6.1) ) Clave primaria: codigo IMPARTE ( dni : char(9). nombre : char(25).5 4. pero si intentamos eliminar “Fundamentos de las Bases de Datos” el sistema mostrará un error y no realizará la operación.0 3.0 1.0 6. pero tanto PROFESORES como ASIGNATURAS son referenciadas por las claves ajenas definidas en IMPARTE y según el estado de la BD ciertas filas pueden ser eliminadas y otras no. Ello es posible mediante la cláusula ON DELETE al crear una tabla: FOREIGN KEY (columna[. El resultado del borrado anteriormente intentado sería ahora: Delete from asignaturas where codigo = ‘FBD’.SYS_C0058700) violada . resultado: 1 fila suprimida ASIGNATURAS codigo descripcion HI DGBD PC FP 52 creditos creditosp HISTORIA DE LA INFORMATICA DISEÑO Y GESTION DE BASES DE DATOS PROGRAMACION CONCURRENTE FUNDAMENTOS DE LA PROGRAMACION 4.registro secundario encontrado En ciertos sistemas de información es posible redefinir las restricciones de clave ajena para que no se den estos mensajes de error.columna[. no existen claves ajenas que les hagan referencia.5 .PROFESORES dni nombre 21111222 21222333 21333444 IMPARTE dni asignatura categoria ingreso EVA GOMEZ MANUEL PALOMAR RAFAEL ROMERO TEU TEU ASO6 21111222 21111222 21333444 01/10/1993 16/06/1989 16/06/1992 FBD DGBD PC No hay ningún problema en borrar cualquier fila de la tabla IMPARTE.5 6.]]) REFERENCES tabla ON DELETE {CASCADE | SET NULL} La acción a realizar ante el borrado de una fila que está siendo referenciada por alguna clave ajena puede ser el propagar la operacion (ON DELETE CASCADE) o anular (ON DELETE SET NULL).5 4. Por ejemplo. foreign key (dni) references PROFESORES (dni). primary key (dni. PROPAGAR EL BORRADO Supongamos que la tabla IMPARTE de la BD Ejemplo tiene la siguiente definición: create table IMPARTE ( dni varchar2(10). resultado: ERROR:restricción de integridad (BDI.0 9.. foreign key (asignatura) references ASIGNATURAS (codigo) ON DELETE CASCADE). asignatura char(5). podemos eliminar “Historia de la Informática” puesto que ningún profesor la imparte. asignatura).. . dependiendo de la decisión del diseñador de la base de datos. Delete from asignaturas where codigo = ‘FBD’. PROFESORES dni IMPARTE nombre 21111222 21222333 21333444 categoria ingreso EVA GOMEZ MANUEL PALOMAR RAFAEL ROMERO TEU TEU ASO6 dni 01/10/1993 16/06/1989 16/06/1992 21111222 21333444 asignatura DGBD PC Como ya hemos dicho. resultado: ERROR:restricción de integridad (BDI.0 6.0 9. que no imparte asignatura alguna.SYS_xxxxx) violada . resultado: 1 fila borrada La fila de Eva GOMEZ no ha podido ser eliminada puesto que imparte DGBD (y no se ha modificado con ON DELETE) pero sí se ha borrado la de Manuel Palomar.registro secundario encontrado Delete from profesores where dni = ‘21222333’.0 6.0 3.0 9.0 1. nótese que la clave ajena dni que hace referencia a PROFESORES no tiene modificado su comportamiento ante borrados: Delete from profesores where dni = ‘21111222’. ASIGNATURAS codigo descripcion DGBD PC FP creditos creditosp DISEÑO Y GESTION DE BASES DE DATOS PROGRAMACION CONCURRENTE FUNDAMENTOS DE LA PROGRAMACION PROFESORES 6.5 4. resultado: 1 fila suprimida ASIGNATURAS codigo descripcion DGBD PC FP creditos creditosp DISEÑO Y GESTION DE BASES DE DATOS PROGRAMACION CONCURRENTE FUNDAMENTOS DE LA PROGRAMACION PROFESORES 21111222 21222333 21333444 6.0 1. eliminar la asignatura Historia de la Informática no genera conflictos de integridad referencial por lo que el sistema puede hacerlo sin problemas: Delete from asignaturas where codigo = ‘HI’.0 3.5 IMPARTE EVA GOMEZ MANUEL PALOMAR RAFAEL ROMERO TEU TEU ASO6 dni nombre categoria ingreso dni 01/10/1993 asignatura 16/06/1989 16/06/1992 21111222 21333444 DGBD PC Sin embargo.5 4.5 IMPARTE dni nombre categoria ingreso dni asignatura 21111222 21222333 EVA GOMEZ MANUEL PALOMAR TEU TEU 01/10/1993 16/06/1989 21111222 21333444 DGBD PC 53 . Esta definición tiene más dificultad de aplicación puesto que prevalecen las definiciones de clave candidata. la acción que llevará a cabo automáticamente el SGBD es la de poner NULOS en aquellos casos en que la integridad referencial se vea comprometida. foreign key (asignatura) references ASIGNATURAS (codigo) ). ERROR: no se puede actualizar (“IMPARTE”. primary key (dni.ANULAR EL VALOR DE CLAVE AJENA Si la modificación de una clave ajena es ON DELETE SET NULL. ha rechazado la operación. asignatura).5 6. Por ejemplo. Delete from profesores where dni = ‘21111222’. Y el contenido de la BD es ahora: ASIGNATURAS codigo descripcion HI FBD DGBD PC FP creditos creditosp HISTORIA DE LA INFORMATICA FUNDAMENTOS DE LAS BASES DE DATOS DISEÑO Y GESTION DE BASES DE DATOS PROGRAMACION CONCURRENTE FUNDAMENTOS DE LA PROGRAMACION PROFESORES dni nombre 21111222 21222333 21333444 EVA GOMEZ MANUEL PALOMAR RAFAEL ROMERO IMPARTE ficha dni asignatura 1 2 3 54 21111222 21111222 21333444 FBD DGBD PC 4. asignatura char(5). foreign key (dni) references PROFESORES (dni) ON DELETE SET NULL. primary key (ficha).5 .0 9. foreign key (asignatura) references ASIGNATURAS (codigo) ).”DNI”) a un valor NULL resultado: El sistema ha intentado cambiar el valor ‘21111222’ en la tabla IMPARTE por un nulo pero.5 4. asignatura char(5). Supongamos que la tabla imparte tiene esta otra definición: create table IMPARTE ( ficha integer.0 6. al ser parte de la clave primaria.0 categoría ingreso TEU TEU ASO6 01/10/1993 16/06/1989 16/06/1992 1. dni varchar2(10).0 6.0 1.5 3. la siguiente definición es inútil puesto que dni en IMPARTE forma parte de la clave primaria y no admite nulos en ningún caso: create table IMPARTE ( dni varchar2(10). foreign key (dni) references PROFESORES (dni) ON DELETE SET NULL. PROFESORES dni nombre 21222333 21333444 MANUEL PALOMAR RAFAEL ROMERO IMPARTE ficha dni 1 2 3 categoria ingreso 21333444 TEU ASO6 16/06/1989 16/06/1992 asignatura FBD DGBD PC 55 . resultado: 1 fila borrada El sistema puede borrar la fila de la profesora Eva GOMEZ.Delete from profesores where dni = ‘21111222’. poniendo nulos en cualquier referencia que halle en la clave ajena afectada de IMPARTE. 2. Borra el vendedor 1. ya conocida. 3. Borra el vendedor 8001. 5. 1.sql (y ejecútalo después de realizada la modificación) cambiando la política de la clave ajena de INVENTARIO a PROPAGAR. 17. Borra la pieza O-0001-PP. Comprueba los efectos de la operación anterior consultando todas las tablas. 7. Comprueba los efectos de la operación anterior consultando todas las tablas. numvend) Clave Ajena: (numpieza)→ PIEZA RECHAZAR13 Clave Ajena: (numvend)→ VENDEDOR PROPAGAR PEDIDO Clave Primaria: (numpedido) Clave Ajena: (numvend)→ VENDEDOR PROPAGAR LINPED Clave Primaria: (numpedido. Comprueba los efectos de la operación anterior consultando todas las tablas. Borra el pedido 6 8. y vuelve a borrar el vendedor 2. 11. numlinea) Clave Ajena: (numpedido)→ PEDIDO PROPAGAR Clave Ajena: (numpieza)→ PIEZA ANULAR INVENTARIO Clave Primaria: (numbin) Clave Alternativa: (numpieza) Clave Ajena: (numpieza)→ PIEZA ANULAR Para la comprobación de los efectos de las siguientes órdenes es conveniente tener a mano la sesión Select 1 donde se muestra el contenido original de la BD PROVEEDORES. 6. 18. 13 “Ante borrados en PIEZA.1) Card(PRECIOSUM. 56 .N) RECHAZAR 16. vuelve a insertar los suministros del ejercicio 16. deberás ejecutar las instrucciones contenidas en el fichero BD1CreateBD2. 13. Nótese que se han efectuado cambios en la definición de ciertas claves ajenas para incorporar las políticas de mantenimiento de la integridad referencial ante borrados: PRECIOSUM Clave Primaria: (numpieza. Modifica BD1CreateBD2. 4. 15. rechazar la operación si existen referencias”. Modifica la política de la clave ajena de NUEVA a ANULAR (y ejecuta). 12. Comprueba los efectos de la operación anterior consultando todas las tablas. y así con todas las claves ajenas definidas. 9. 14. Comprueba los efectos de la operación anterior consultando todas las tablas. Borra todos los suministros de la pieza DD-0001-210. Antes de comenzar.ÓRDENES MANIPULACIÓN3 Los siguientes ejercicios se ejecutarán sobre la base de datos de Proveedores. Borra la pieza DD-0001-210. 10. Borra todos los suministros de la pieza O-0001-PP. comprobando los efectos sobre la BD. rel1) = (0. Inserta en NUEVA los 3 suministros de la pieza T-0001-IBM.sql para la creación de la BD e inserción de datos iniciales. y añádele una nueva tabla con los siguientes datos: NUEVA(orden entero) CP(orden) Card(NUEVA. Intenta borrar el vendedor 2 y localiza el error producido. rel1) = (0. Borra el vendedor 3. Borra la pieza O-0001-PP. En la versión de Oracle con la que trabajamos. intersección y diferencia. Se calcula cada SELECT por separado. El operador UNION elimina filas duplicadas en el resultado final. select nombre from profesores where categoria=’ASO6’ resultado: nombre RAFAEL ROMERO 57 . utilizando los operadores de conjuntos: unión. OPERADORES SOBRE CONJUNTOS Un operador sobre conjuntos combina el resultado de dos sentencias SELECT en un único resultado. Los operadores de conjuntos son la UNION. Union All • Intersect • Minus • Resolución de requerimientos. el resultado final estará compuesto por todas aquellas filas que aparecen en el resultado de como mínimo una de las SELECT. Para que se pueda realizar.Conjuntos OPERACIONES DE CONJUNTOS Objetivos: • Combinar el resultado de varias sentencias select en un único resultado. Contenidos • Union. todos tienen la misma precedencia y se evalúan de izquierda a derecha. Si queremos alterar este orden debemos utilizar los paréntesis. UNION ALL Al utilizar el operador UNION entre dos sentencias SELECT. pero no elimina filas duplicadas en el resultado final. INTERSECT y MINUS. Supongamos que queremos saber el nombre de los profesores que son ASO6 o imparten asignaturas de 6 créditos. El operador UNION ALL opera de igual modo que el operador UNION. las sentencias SELECT deben tener ambas como resultado el mismo número de columnas y los mismos tipos de datos (no es necesario que sean de igual longitud). UNION. UNION ALL. el resultado final estará compuesto por todas aquellas filas que aparezcan en los resultados de ambas sentencias (no es suficiente que aparezcan sólo en el resultado de una de ellas) Supongamos que queremos saber el nombre de los profesores que son ASO6 e imparten asignaturas de 6 créditos.dni=i. select nombre from profesores where categoria=’ASO6’ UNION select nombre from profesores p. imparte i.select nombre from profesores p. el resultado final estará compuesto sólo por aquellas filas que aparecen en el resultado de la primera SELECT y no aparecen en el resultado de la segunda.dni=i. MINUS Al utilizar el operador MINUS entre dos sentencias SELECT. 58 . select nombre from profesores where categoria=’ASO6’ INTERSECT select nombre from profesores p. asignaturas where p.dni and asignatura=codigo and creditos=6 resultado: nombre RAFAEL ROMERO Se calcula cada SELECT por separado y aparecen en el resultado final todas las filas que estén en ambos resultados. asignaturas where p.dni and asignatura=codigo and creditos=6 resultado con UNION ALL: nombre RAFAEL ROMERO RAFAEL ROMERO EVA GOMEZ EVA GOMEZ con UNION nombre RAFAEL ROMERO EVA GOMEZ INTERSECT Al utilizar el operador INTERSECT entre dos sentencias SELECT.dni and asignatura=codigo and creditos=6 resultado: nombre RAFAEL ROMERO EVA GOMEZ EVA GOMEZ En el resultado final aparecerán todas las filas que estén en cualquiera de los dos resultados. asignaturas where p. imparte i. imparte i.dni=i. asignaturas where p.dni=i. mientras que en el caso del primero es necesario trabajar con dos. Nombre de las empresas que tienen vendedores con pedidos PERO NO suministran la pieza ‘A1001-L’. select nombre from profesores where categoria=’ASO6’ MINUS select nombre from profesores p. 5.dni and asignatura=codigo and creditos=6 resultado: nombre Supongamos que las condiciones hubiesen estado al revés.Supongamos que queremos saber el nombre de los profesores que son ASO6 y no imparten asignaturas de 6 créditos. 7. Queremos saber el nombre de los profesores que imparten asignaturas de 6 créditos y no son ASO6. Nombre de las empresas que tienen vendedores con pedidos Y que puedan suministrar la pieza ‘A-1001-L’.dni and asignatura=codigo and creditos=6 MINUS select nombre from profesores where categoria=’ASO6’ resultado: nombre EVA GOMEZ Algunos de estos requerimientos se pueden resolver con una sola sentencia SELECT donde se combinen de modo adecuado las condiciones. imparte i. y todas las que pueden ser suministradas por el vendedor número 1. ordenado por nombre.dni=i. en estos dos últimos enunciados. Nombre de las empresas que tienen vendedores con pedidos O que puedan suministrar la pieza ‘A-1001-L’. Número y nombre de los vendedores de la empresa MECEMSA que. Número y nombre de las piezas que han sido pedidas pero no inventariadas 8. 4. Por ejemplo. 2. select nombre from profesores p. Número y nombre de las piezas que suministra el vendedor número 1. imparte i. pero no el vendedor número 2. asignaturas where p. además. el segundo se puede solucionar con una SELECT. En otras ocasiones debemos recurrir a operar con los resultados de varias sentencias. 6. tienen suministros de precio unitario mayor que 10 o se les ha hecho algún pedido 59 . Número y nombre de las piezas con un precio de venta mayor que 1000. CONSULTAS CONJUNTOS 1. Número de los pedidos en los que se soliciten teclados pero no monitores. 3. ROUND(). Introducción de las funciones estadísticas aplicables a columnas enteras y de cuenta de filas. etc. OPERACIONES ARITMÉTICAS Se pueden utilizar expresiones aritméticas tanto en la cláusula select. AVG(). producto. de valores escalares. Número de horas semanales. MAX(). que se imparten de cada asignatura: select descripcion..Funciones ARITMÉTICA Y FUNCIONES AGREGADAS Objetivos: • Obtención de información calculada. ABS(). como en la construcción de condiciones de selección de filas. para obtener una nueva columna en la tabla resultado. MIN(). Contenidos • operaciones aritméticas: +.5 . (creditos/3)*2 from asignaturas resultado: descripcion Historia de la Informática Fundamentos de las Bases de Datos Diseño y Gestión de Bases de Datos Programación Concurrente Fundamentos de Programación (creditos/3)*2 3 4 4 4 6 Descripción de las asignaturas y número de horas semanales de las asignaturas con menos de 4 horas semanales de clase: select descripcion. en un sólo semestre. creditos from asignaturas where (creditos/3)*2 < 4 resultado: 60 descripcion Historia de la Informática creditos 4. -. / • SUM(). así como la forma de realizar operaciones como suma. COUNT(). • etiquetas para columnas • Resolución de requerimientos. *. y se asume que la función se calcula únicamente sobre valores distintos de la expresión. Estas funciones devuelven un único valor para todas las tuplas seleccionadas mediante la condición de la cláusula where. si no se especifica ésta. COUNT( * ) COUNT( DISTINCT expr ) número de filas número de valores distintos en la columna expr SUM( [DISTINCT] expr ) suma de todos los valores en expr AVG( [DISTINCT] expr ) MIN( expr ) MAX( expr ) ROUND( expr ) ABS( expr ) promedio de todos los valores en expr el más pequeño de todos los valores en expr el mayor de todos los valores en expr redondea expr valor absoluto de expr Las funciones de tipo estadístico precisan que la expresión que se evalúe se construya sobre columnas de tipo de datos numérico.FUNCIONES AGREGADAS Se dispone de una serie de funciones agregadas que retornan valores calculados sobre una determinada columna. el cálculo se realiza sobre la totalidad de la columna. En ningún caso se pueden anidar funciones: avg ( min ( creditos ) ) no está permitido. La expresión expr puede contener el nombre de una columna o un cálculo sobre una o varias columnas. Si se especifica la palabra clave distinct la expresión obligatoriamente ha de ser un nombre de columna. ¿Cuántos profesores hay en nuestra BD? select count( * ) from profesores resultado: ( count( * ) ) 3 ¿Cuántas asignaturas de más de 5 créditos hay en nuestra BD? select count( * ) from asignaturas where creditos > 5 resultado: ( count( * ) ) 4 ¿Cuántas valores de créditos distintos hay en nuestra BD? select count( distinct creditos ) from asignaturas resultado: ( count ) 3 ¿Cuál es la media de créditos por asignatura? select avg( creditos ) from asignaturas resultado: ( avg ) 61 . 30 . tal como se hace con los alias temporales de las tablas. Se pueden etiquetar las columnas de la tabla resultado añadiendo. avg(creditos) mediactos from asignaturas resultado: 62 num_asignaturas mediactos 5 6.3 ¿Cuál es la media de horas por asignatura? select avg( creditos*2/3 ) from asignaturas resultado: ( avg ) 4. Esta cadena de caracteres aparecerá en el encabezado de la columna. select count( * ) num_asignaturas. antes de la coma si hubiera más columnas detrás.6.2 Total de créditos ofertados en asignaturas de Bases de Datos: select sum( creditos ) from asignaturas where codigo like '%BD' resultado: sum( creditos ) 12 ETIQUETAS PARA COLUMNAS Dado que las expresiones calculadas no tienen un nombre específico de columna en la salida por pantalla. una cadena de no más de 18 caracteres y sin espacios en blanco. es conveniente "renombrarlas" para aclarar su significado. Mínima diferencia entre precio de compra y precio de suministro del vendedor al que se le compró. 10.CONSULTAS FUNCIONES 1. 9. Cantidad total de piezas que sabemos nos pueden suministrar los proveedores. Máximo. Máximo descuento (en euros) de las piezas suministradas. 8. 11. Media de precios distintos de venta de piezas. nombre y diferencia entre precio de venta y precio de compra de la(s) pieza(s) que suministran los vendedores de Alicante. 2. Número. Media de días de intervalo entre la fecha de envío del pedido 1 y de entrega de las distintas piezas solicitadas en ese pedido 3. Total de la diferencia en euros entre lo pagado por compra de artículos y sus respectivos precios de suministro ofrecidos en su día por los proveedores si el segundo precio es menor que el primero. 63 . Obtener la diferencia entre cantidad pedida y cantidad recibida de las líneas del pedido 1. 4. Obtener la cantidad de provincias distintas de las que tenemos conocimiento de algún proveedor. 7. 6. 5. mínimo y media de precio de venta de las piezas. Cantidad de vendedores de nuestra BD. count( * ) from profesores p. El criterio de agrupación se forma con al menos todas las columnas no calculadas de la lista de la cláusula select.dni resultado: 64 ERROR .dni.dni. select p. Clasificación de información en función de algún criterio especificado mediante la cláusula GROUP BY. count( * ) from profesores p. imparte i where p.Group by INFORMACIÓN AGRUPADA Objetivos: • Obtención de información calculada sobre grupos de filas. la cuenta de valores distintos de la columna asignatura se calcula en base a cada profesor de nuestra BD que imparte alguna asignatura. nombre. Contenidos • GROUP BY • Resolución de requerimientos. LA CLÁUSULA GROUP BY Supongamos que queremos obtener la cantidad de asignaturas que imparte cada profesor: select p.dni = i. y por la utilización de la cláusula group by. nombre.dni. nombre resultado: dni 21111222 21333444 nombre EVA GOMEZ RAFAEL ROMERO ( count ) 2 1 En esta ocasión.dni = i. • No se pueden poner columnas no calculadas en la select que no aparezcan en la group by.dni group by p.dni group by p. imparte i where p. No obstante.dni and asignatura <> 'FBD' group by p. por lo tanto.I. Es decir.dni respectivamente. la clave candidata).dni e imparte. el nombre no será clave y.dni group by p. si la clave primaria de una tabla de personas (profesores o alumnos. imparte i where p. select nombre. admite duplicados. nombre resultado: nombre EVA GOMEZ RAFAEL ROMERO ( count(*) ) 2 1 where y group by Cuando se utiliza la cláusula where. aparte de enlazar tablas por columnas comunes. Sea una ocurrencia tal como ésta: CLIENTE DNI 21 22 NOMBRE JUAN JUAN INGRESO OPERACIÓN 1 2 3 CLIENTE 21 22 22 INGRESO 1000 2000 3000 65 . es perfectamente posible encontrar a dos personas distintas (con números de D. como PROFESORES e IMPARTE por profesores. count( * ) from profesores p. podemos decir sin equivocarnos que no habrá duplicados en este atributo.N. si queremos calcular cuantas asignaturas imparte cada profesor sin contar Fundamentos de las Bases de Datos. Así. agrupamos datos por el nombre y no por el D. Si. nombre resultado: nombre EVA GOMEZ RAFAEL ROMERO ( count(*) ) 1 1 ATRIBUTOS NO CLAVE EN EL GROUP BY Los únicos atributos que aseguran la identificación de una tupla respecto de las demás son los que forman la clave primaria (en general. imparte i where p.dni. escribiremos la siguiente sentencia. count( * ) from profesores p. obviamente) que se llamen igual (nombres y apellidos). select nombre.• Si se pueden poner más columnas en la lista del group by que en la de la select. por ejemplo.N.I. Así.dni = i.dni = imparte. se puede utilizar para eliminar ciertas filas del cálculo.I..N.dni. por ejemplo) es el D. diferentes. podemos obtener información en una única fila de dos personas diferentes que se llaman igual. debemos incluir la clave primaria como atributo de la relación derivada de la ejecución de la select. evitaremos la no inclusión de atributos clave en la cláusula group by. ORDENACIÓN DE LA SALIDA En la cláusula order by podemos especificar la expresión tal cual aparece en la select. y aunque no afecte al resultado. ingreso where dni = cliente group by nombre resultado: nombre media JUAN 2000 Puesto que el nombre es el mismo para los dos clientes. nombre order by asignaturas select dni. select dni.dni. count( * ) asignaturas from profesores group by p.dni. ingreso where dni = cliente group by dni. avg( ingreso ) media from cliente. si queremos saber exactamente de a qué cliente nos referimos en cada tupla del resultado. la agrupación contabiliza todas las ocurrencias de ingreso como de uno sólo. Sin embargo.dni. nombre resultado: nombre media JUAN 1000 JUAN 2500 Es evidente que.select nombre. avg( ingreso ) media from cliente. count( * ) asignaturas from profesores group by p. si introducimos en la lista de columnas del GROUP BY aquellas que son su clave primaria: select nombre. nombre order by 2 resultado: dni 21333444 21111222 66 asignaturas 1 2 . En general. count( * ) asignaturas from profesores group by p. nombre order by count( * ) resultado: dni 21333444 21111222 asignaturas 1 2 O bien podemos utilizar un alias para la columna (asignaturas en este ejemplo) o el orden de la columna empezando por la izquierda (la función está en la tercera columna en este ejemplo): select dni. la media de la diferencia entre el precio de compra y el de suministro (que nos ofertaba el vendedor al que se le solicitó el pedido) de las líneas de cada pedido. 3. el tanto por ciento de beneficios del precio de venta al público respecto al precio medio de compra de todas las compras que se han realizado de la pieza 14. por cada pieza solicitada. aunque no se especifique explícitamente en el requerimiento. Obtener la cantidad de pedidos efectuados por fecha y el total pagado por las mercancías. ordenado alfabéticamente por la descripción de la pieza y eliminando aquellas compradas a proveedores de Alicante. y la media de la diferencia entre el precio de venta y el de suministro. la cantidad pedida total así como la diferencia entre cantidad pedida total y cantidad recibida total. 7. Calcular las ganancias (precio de compra menos precio de suministro por la cantidad recibida) de cada vendedor que ha efectuado alguna venta. 9. 4. Obtener la media de las ventas (en euros) realizadas por cada vendedor de cada pieza. el precio pagado en total por ese pedido. precio de venta. Calcular por número de pedido. Obtener para cada número de pedido. nombre de la pieza.CONSULTAS GROUP BY NOTA: es muy recomendable. Obtener. Obtener para cada pieza. De cada pieza de precio de venta mayor que 250 obtener el precio medio de suministro. 1. el número de la pieza y el número total de vendedores que nos pueden suministrar esa pieza. 13. indicando cantidad y nombre de la misma. 5. 6. la máxima diferencia entre cantidad pedida y cantidad recibida de entre todas las veces en que fue servida. 8. por pieza solicitada. 10. Obtener. De cada pieza obtener el precio unitario medio de suministro. 67 . se deben etiquetar las columnas calculadas. Obtener número de pieza y número total de vendedores que la pueden suministrar para piezas de más de 250 de precio de venta. que la salida se ordene ascendentemente (por defecto) por las columnas no calculadas de la lista de la cláusula select. 12. NOTA: así mismo. ordenado descendentemente por cantidad de empleados. 11. Obtener para cada pieza. 2. Calcular para cada pieza. cuántos vendedores la podrían suministrar. Obtener la cantidad de vendedores de cada empresa. Sobre esta última el having eliminaría aquellas tuplas que no cumplen la condición.having SELECCIÓN DE INFORMACIÓN AGRUPADA LA CLÁUSULA HAVING Al igual que la cláusula where selecciona filas. la cláusula group by calcula. la cláusula where ha eliminado las tuplas de imparte de código de asignatura FBD. Eva GOMEZ sólo imparte. para cada profesor. una única asignatura. 68 .dni = i.dni. los efectos de esta última orden: 1. si en la where la condición que se especifica afecta a las tuplas de toda la tabla. 3. Supongamos que queremos saber cuantas asignaturas imparte cada profesor pero únicamente en el caso de que imparta 2 ó más asignaturas: select p. la cláusula having elimina del resultado del paso anterior todas aquellas tuplas con un valor en la cuenta de filas menor que 2. count( * ) asignaturas from profesores p. cláusula a cláusula. count( * ) asignaturas from profesores p.dni. nombre. 2. nombre.dni.dni.group by . Puesto que no contamos FBD. Normalmente. igual que Rafael Romero. Veamos. El resultado es vacío puesto que ninguno de los grupos supera la condición.dni group by p. el número de asignaturas que imparte. nombre having count(*) >= 2 order by nombre resultado: dni 21111222 nombre EVA GOMEZ select p.dni and asignatura <> 'FBD' group by p. imparte i where p. where selecciona sobre los datos almacenados en la tabla y having sobre la información calculada. la cláusula having selecciona grupos. imparte i where p. nombre having count(*) >= 2 order by nombre resultado: dni nombre asignaturas 2 asignaturas En la expresión del having no se pueden utilizar los alias de las columnas (asignaturas) en este caso. el group by efectúa los cálculos en función de esa selección previa y da como resultado una tabla con la información calculada para cada grupo.dni = i. 2. 4. Para las piezas que se hayan ofertadoa un precio unitario medio mayor que 260 obtener el número de pieza. Números de pedido donde el total de piezas pedidas es mayor que 40. 13. Obtener los números de pedido. Para cada pieza. y sus precios unitarios máximo y mínimo. 10. 69 . exceptuando la información referida al vendedor número 1. 5. el máximo precio unitario. 11. Obtener los números de pedido donde el precio total sea superior a 1000. Obtener aquellos números de pedido y fecha en que se confeccionaron cuya cantidad de artículos pedidos sea superior a 30 y la recibida inferior a 10. Nombre de las empresas que tienen más de dos vendedores. El resultado se dará ordenado por número y nombre de vendedor y por nombre de la pieza. 8. y la cantidad de suministradores. ordenado por precio máximo. 6. Obtener el número.HAVING 1. 9. Números de pedido que tengan más de tres líneas de pedido. Obtener el número de pieza y el precio unitario medio de aquellas piezas que tarden de media 14 días como máximo en ser suministradas (diassum=tiempo de suministro). de la que se tiene información sobre sus posibles vendedores. y la cantidad de suministradores. Para las piezas que se ofrecen a un precio unitario medio mayor que 260 (sin tener en cuenta los suministros menores de 250) obtener el número de pieza. el nombre y el precio máximo unitario de las piezas cuyo precio de venta sea mayor que 250 o menor que 170. Obtener el número y el nombre del vendedor así como el número y nombre de las piezas de precio unitario mayor que 200 que nos puedan suministrar. precio de compra y cantidad pedida de los números de línea 1 y recibidas en fecha 10-05-92. el máximo precio unitario. 3. obtener el número de pieza. su descuento medio oscile entre 10 y 17 y que tengan un precio unitario medio total superior a 150. Dar una relación del nombre de las piezas que nos pueden suministrar más de dos proveedores.CONSULTAS GROUP BY . Determinar el número total de proveedores que pueden suministrar la pieza 'P-0001-33’. 12. 14. 7. • operadores de comparación escalar. Con ese valor se compara tupla a tupla y se obtiene la asignatura (o asignaturas) cuya cantidad de créditos es igual al mínimo.Subselect CONSULTAS ANIDADAS Objetivos: • Utilizar el resultado de una sentencia select para establecer las condiciones de otra sentencia select. [NOT]. sintaxis general de la subconsulta expresión op_comparación { ALL | [ ANY | SOME ] } ( orden select ) expresión [ NOT ] IN ( orden select ) [ NOT ] EXISTS ( orden select ) Los valores posibles a devolver por una orden select anidada son : 70 • nada • un valor único (una fila y una columna). ALL. Cuando una orden select se encuentra dentro de la cláusula where de otra select recibe el nombre de subconsulta (subquery). • Resolución de requerimientos. • un conjunto de valores (varias filas y una columna). Por ejemplo : select descripcion. CONSULTAS ANIDADAS (SUBQUERIES) En la condición de búsqueda de la orden select (en la cláusula where o en la having) también podemos: • • comparar una expresión con el resultado de otra orden select determinar si el valor de una expresión está incluido en los resultados de otra orden select • preguntar si una orden select ha seleccionado filas.5 En primer lugar se calcula la select anidada (entre paréntesis) y se obtiene el valor mínimo para la columna créditos de la tabla asignaturas. • IN. ANY. creditos from asignaturas where creditos = ( select min(creditos) from asignaturas ) resultado: descripcion Historia de la Informática creditos 4. . Contenidos • Subqueries. select descripcion from asignaturas where creditos = ( select min(creditos) from asignaturas ) No sería correcto. el número en créditos de la asignatura tiene que ser menor o igual que todos (all) los valores obtenidos en la subconsulta (que es la relación de créditos de todas las asignaturas). un valor simple. únicamente será en una y nada más que una columna (salvo el operador EXISTS). igual. avg. porque la subselect devuelve más de una fila.5 En este caso. Nombre de las asignaturas que no tienen el mínimo número de créditos: select descripcion from asignaturas where creditos > ANY ( select creditos from asignaturas ) resultado: creditos descripcion 6 Fundamentos de las Bases de Datos 6 Diseño y Gestión de Bases de Datos 71 .Siempre que la subselect devuelva algo. min. siempre y cuando ésta devuelva una única fila y una única columna. etc. count). En general serán órdenes select que calculan una función agregada (sum. DEVOLUCIÓN DE UN ÚNICO VALOR expresión op_comparación ( orden select ) Podemos utilizar los operadores de comparación para preguntar si el valor de una determinada expresión es mayor. que el resultado de la subselect. la siguiente orden : select descripcion from asignaturas where creditos = ( select creditos from asignaturas where creditos < 9 ) DEVOLUCIÓN DE UNA LISTA DE VALORES expresión op_comparación ALL | [ ANY | SOME ] ( orden select ) Cuando la tabla resultado contiene más de una fila (pero una única columna. menor. es decir. Nombre de la asignatura que tiene el mínimo número de créditos (es equivalente al primer ejemplo) : select descripcion from asignaturas where creditos <= ALL ( select creditos from asignaturas ) resultado: descripcion Historia de la Informática creditos 4. insistimos) hay que utilizar un modificador para el operador de comparación. max. dni and i. asignaturas a.dni = i. veamos que algunos de estos operadores son equivalentes : expresión IN (orden select) ≡ expresión =ANY (orden select) expresión NOT IN (orden select) ≡ expresión !=ALL (orden select) 72 . Otra forma de expresar el mismo requerimiento: select descripcion from asignaturas where creditos != ( select min(creditos) from asignaturas ) Supongamos que deseamos obtener el nombre de los profesores que imparten una asignatura que no sea la máxima en número de créditos: select nombre from profesores p.dni Se verá más clara la utilidad de este operador si preguntamos justo lo contrario.dni = i. El modificador some es equivalente a any. Obtener todos los datos de los profesores que imparte alguna asignatura: select * from profesores where dni IN ( select dni from imparte ) O dicho de otra manera : datos de los profesores cuyo dni aparece en la tabla imparte. Obtener todos los datos de los profesores que no imparten asignaturas : select * from profesores where dni NOT IN ( select dni from imparte ) Por último.codigo resultado: and creditos < ANY ( select creditos from asignaturas ) nombre Eva GOMEZ Rafael Romero expresión [ NOT ] IN ( orden select ) También podemos consultar la pertenencia de un valor a la lista de valores devuelta por la subconsulta.6 9 Programación Concurrente Fundamentos de la Programación Serían todas aquellas asignaturas cuyos créditos superasen al menos a uno (any) de los valores devueltos por la subconsulta.asignatura = a. imparte i where p. En este caso daría lo mismo procesar la orden : select p.* from profesores p. imparte i where p. exceptuando aquellos suministrados por el vendedor número 1. Número. 6. Número. 9. por cada número de vendedor. Obtener los nombres de los vendedores de la misma empresa que Luis García. 73 . número de pieza y descuento para aquellas piezas cuyo precio de venta supere en más del 15% la media del precio de compra de los pedidos en los que aparece. 17. Número de pedido y precio total pagado del pedido más caro. 5. 10. Nombre de la empresa con mayor importe de ventas. 2. Nombre de los suministradores que pueden suministrar al menos alguna de las piezas que puede suministrar el vendedor número 5. 8. Listar los vendedores que sean de la misma provincia que el vendedor número 100. Obtener todos los datos de los vendedores a los que se les han solicitado más pedidos que a todos los demás. Número y nombre de los vendedores a los que no se les ha solicitado pedidos. 21. Número y descripción de las piezas que pueden ser suministradas por proveedores de la Comunidad Valenciana o que pueden ser suministradas por el vendedor que ha realizado la menor venta (pedido de importe más bajo) 20. la cantidad de piezas distintas que ha vendido. 7. 14. Número y descripción de la pieza más cara (precio de venta). Número y descripción de las piezas cuyo precio medio de suministro esté por encima del mayor precio de compra pagado por ella. 4. nombre. empresa en la que trabaja y número de piezas que puede suministrar el vendedor que tiene la media más alta de piezas servidas. 12. Cantidad de piezas a la venta de las que no tenemos información sobre sus posibles suministradores. Nombre de la empresa que ofrece la pieza más barata de precio de suministro. Para cada pieza que se ofrece en la lista de suministros. 11. Número y nombre del vendedor al que se le ha solicitado el pedido más caro. y sus precios unitarios máximo y mínimo.CONSULTAS SUBSELECT 1. Número y nombre de los vendedores que no ofertan ninguna pieza. 16. 18. 3. Número de vendedor. 13. obtener el número de pieza. Número y descripción de la pieza que ha sido pedida más veces. Calcular. descripción y precio de venta de los monitores que no han sido nunca solicitados. para aquellos vendedores pertenecientes a la empresa con más proveedores. 15. 19. Número y nombre de los vendedores a los que se les ha solicitado algún pedido. o lo que es lo mismo. el primer exists será verdadero. Exists devuelve verdadero si hay al menos una tupla en la relación derivada y falso si la relación derivada es vacía. y. Un profesor que imparta todas las asignaturas obtendrá siempre una fila en la última subselect y. por lo tanto. la última subconsulta dará como resultado verdadero si la imparte y falso en caso contrario (devolverá una tupla o no devolverá nada). Supongamos un profesor que no imparte al menos una de las asignaturas de nuestra base de datos. • Resolución de requerimientos. Por lo tanto. • Para cada profesor y asignatura comprueba que el primero imparte la segunda. • Para cada profesor.subselect . Como ésta última tiene al menos una fila. Supongamos que queremos conocer si algún profesor imparte todas las asignaturas : select nombre from profesores p where not exists ( select codigo from asignaturas a where not exists ( select asignatura from imparte i where i. Una vez que ha fijado el profesor y la asignatura. el correspondiente 74 . no devolverá ninguna tupla : el resultado del segundo exists es falso. El profesor no imparte todas las asignaturas de nuestra base de datos. Cuando el SGBD esté resolviendo la última subselect para ese profesor y esa asignatura. ya existe una asignatura que obtiene en la cláusula where un valor verdadero : esa asignatura saldrá en la tabla resultado. finalmente falso.dni=i.codigo and p. como está negado. y. finalmente verdadero (ese profesor no imparte esa asignatura). la segunda select recorre la tabla de asignaturas. para la primera subselect. como está negado.exists CONSULTAS ANIDADAS II Contenidos • El operador EXISTS. si la tabla resultado tiene alguna fila. ninguna asignatura aparecerá como resultado de la primera subselect. Supongamos que la forma que tiene el SGBD de resolver esta sentencia es la siguiente : • En la primera select recorremos la tabla de profesores.asignatura=a. como no están relacionados.dni ) ) Vamos a leer el requerimiento siguiendo las apariciones del operador exists dentro de las sucesivas órdenes select : Nombre de los profesores tales que no hay ninguna asignatura que no imparta él. EL OPERADOR EXISTS [ NOT ] EXISTS ( orden select ) El operador exists nos informa si una subconsulta ha devuelto algún resultado. Nombre de los vendedores que no pueden suministrar ninguna pieza. 12. Nombre de los vendedores a los que se les haya solicitado más de dos pedidos (utilizando subconsultas). ordenadas alfabéticamente.EXISTS 1. Número y nombre de la pieza de menor precio de suministro (utilizando EXISTS). la sintaxis también es muy diferente. Nombre de los vendedores que pueden suministrar todas las piezas. CONSULTAS SUBSELECT . 2. 3. Obtener todos los datos de los vendedores que sirvieron los pedidos del requerimiento anterior.exists será falso. Numero y descripción de las piezas que se han solicitado en todos los pedidos del vendedor 1. mientras que el segundo devuelve un valor de verdad. Número y nombre de todos los vendedores de la ciudad de Alicante. fecha y número de vendedor del pedido más caro (utilizando subconsultas). 11. Nombre de las empresas que cumplen que todos sus vendedores son de la Comunidad Valenciana. 7. Número y nombre de los vendedores que han servido algún pedido (utilizando obligatoriamente EXISTS). 6. Empresas que han servido la(s) pieza(s) de mayor precio de venta. ordenados alfabéticamente. 10. Aunque puede inducir a error. 4. no se deben confundir nunca los operadores IN y EXISTS : el primero devuelve una lista de valores. 8. 9. Empresas que no han servido ninguna pieza. 13. 75 . por su traducción intuitiva del inglés al español. 5. y por efecto del operador de negación la condición será cierta : ese profesor aparecerá en la solución. Número de pedido. En nuestra base de datos Ejemplo no hay ningún profesor que imparta todas las asignaturas. Numero de los pedidos cuyas piezas tienen todas un precio de venta mayor que la mitad del precio máximo de venta. Numero de vendedor y empresa para la que trabaja de aquellos que han vendido alguna pieza por un precio mayor que el estipulado por ellos en la lista de suministros 76 . Piezas que el vendedor numero 1 ofrece en la lista de suministros y que han sido servidas en algún pedido 3. número de pieza y diferencia en euros entre el precio de compra y el de suministro del vendedor al que se le compró.Adicionales 1 EJERCICIOS ADICIONALES CONSULTAS 1. 2. Nombre de las empresas de Alicante a las que se ha comprado algún monitor 5. Nombre y numero de las piezas que se han solicitado en algún pedido ordenadas por el nombre 6. Vendedores que pueden suministrarnos piezas que se venden al público con un precio de venta entre 50 y 100 y que esa pieza ha sido solicitada en algún momento (no necesariamente a ellos) 4. Toda la información de las piezas que puedan ser suministradas por vendedores de empresas cuyo nombre empieza por 'H'. ordenado descendentemente por dicha cantidad. Para cada pieza comprada. 7. 2. 8. la media del precio unitario de cada pieza y el precio de venta de todas las piezas de precio unitario medio mayor que 100 y que puedan ser suministradas por más de dos proveedores. Ordenar el resultado por el nombre de la pieza. Obtener para cada pieza. el número y nombre del vendedor y la fecha del pedido. para las piezas de precio de venta mayor que 300. teniendo en cuenta que la media de los precios unitarios debe estar entre 100 y 280. 6. Obtener número y nombre de las piezas que tengan una diferencia entre precio de venta y media de precio de suministro (preciounit) menor del 20% del precio de venta. Para cada pedido obtener el número de líneas que tiene. 9. ordenado alfabéticamente por vendedor. la media del precio unitario de suministro y el precio de venta. Obtener los números y nombres de los vendedores que han servido algún pedido con más de tres artículos diferentes. Obtener el nombre de las piezas. el nombre de las pieza. la media del precio unitario de cada pieza y el precio de venta de todas las piezas que puedan sernos suministradas por más de tres proveedores. 3. 77 . 7. 4. 10. Obtener el nombre de los vendedores y la cantidad de piezas que pueden suministrar. 5. la media del precio unitario de cada pieza y el precio de venta de todas las piezas de las que conocemos posibles suministradores. Obtener el número y el nombre de los vendedores y la cantidad de piezas que pueden suministrar ordenado alfabéticamente por vendedor. Obtener el nombre de las piezas. Obtener número y nombre de vendedores a los que les hayamos solicitado algún pedido. Obtener el nombre de las piezas.Adicionales 2 EJERCICIOS ADICIONALES CONSULTAS 1. 7. 6. y la cantidad de días distintos en los que nos han servido las piezas solicitadas. obtener el número de la pieza. para los pedidos de importe total superior a 10000 euros. el número de vendedor. Obtener para los vendedores de la provincia de Alicante. Para cada pieza que pueda ser suministrada a un precio medio unitario inferior a 10 euros. su nombre. Para los pedidos que nos han sido servidos en más de un día. 3. y el numero y nombre del vendedor al que se les solicitó. su nombre y la cantidad total de pedidos que se les ha solicitado. . Ordena el resultado por el nombre de la pieza. Para las piezas recibidas en domingo. Obtener el número de pedido. su nombre.EJERCICIOS ADICIONALES CONSULTAS 78 1. obtener el número de pedido. Para las empresas que tengan un único vendedor. el importe total. obtener el número de la pieza. 2. 5. el número del vendedor al que se le solicitó. el precio máximo al que nos la han ofrecido. 4. el precio mínimo y la cantidad de vendedores que nos la pueden suministrar. obtener el nombre de la empresa y la cantidad total de pedidos que se le han solicitado. Ordena el resultado por el importe total. Obtener la cantidad total de piezas que se solicitaron en el año 1992. su nombre y el número y nombre del vendedor al que se le solicitaron. y el importe total entre todos los pedidos. y que en total (entre todos los pedidos solicitados a todos los vendedores) hayamos pedido más de 500 unidades.Adicionales 4 CONSULTAS 1. Obtener para los vendedores de Alicante o Madrid. 79 . Obtener el número de los vendedores (numvend) que nos hubiesen podido servir todo lo que se solicita en las líneas 1. 2 y 3 del pedido número 1. 4. 5. 6. Obtener el número y el nombre las piezas que puedan sernos suministradas por más de dos vendedores de la provincia de Alicante. Obtener el número y nombre de las piezas que nunca hemos solicitado. 2. Número y nombre de los vendedores a los que les hemos solicitado algún pedido en el año 1995 pero no les hemos solicitado ninguno en el año 1992. 3. Obtener el nombre de las empresas de las que tengamos más de 1 de un vendedor de Alicante y no se les haya hecho ningún pedido (a ninguno de sus vendedores) antes del año 1995. el número y nombre de vendedor junto con el importe total que les hemos pagado a través de todos los pedidos que se les ha solicitado. 3. de la que nos habían indicado que su plazo de suministro sería superior a una semana. 5. Obtener los nombres y empresas de los vendedores que no son de la Comunidad Valenciana. el número y nombre del vendedor al que se le solicitó. el número de pedido. de los que se desconoce el teléfono. el número de la pieza. y la cantidad de pedidos distintos en los que se les ha solicitado. Obtener para los vendedores a los que les hayamos pagado en total (entre todos sus pedidos) más de 3000 euros.Adicionales 5 CONSULTAS 80 1. y la cantidad de vendedores que nos la pueden suministrar a ese precio. Ordena el resultado por la última columna. y la fecha del pedido. su nombre. . 2. Obtener para las piezas cuyo precio de suministro oscila entre 10 y 15. Obtener para el número y nombre de los vendedores de Alicante a los que se les haya solicitado alguna pieza. Obtener el nombre de la empresa que tiene más de tres vendedores. y el total de pedidos que les hemos hecho. 6. 4. y al menos dos de ellos son de la provincia de Alicante. el número y nombre de vendedor junto con el importe total que les hemos pagado. Obtener para los pedidos con un importe total entre 400 y 600 euros. junto con el número y nombre de la pieza. y número y nombre de vendedor del pedido que no es el de menor importe de venta (preciocompra*cantrecibida) siendo el año del pedido posterior al 1992 (>1992). Obtener el nombre de vendedor para los vendedores cuya media de precio unitario de suministro sea máxima.Adicionales 6 CONSULTAS 1. 7. precio medio de suministro y descuento máximo de las piezas que proceden de la misma ciudad que la empresa Mecemsa y que se han solicitado 2 veces o más. 6. descripción y precio de venta de la pieza que más veces se ha pedido. Obtener el nombre de la pieza (o piezas) y su precio unitario máximo de la pieza de precio unitario medio más bajo. Para la pieza (o piezas) de precio de venta mayor. Número de pedido. 9. Nombre del vendedor y media de todos sus precios de suministro para los vendedores que viven en la misma ciudad que algún vendedor de apellido García. 5. 81 . Nombre y empresa de los vendedores de la ciudad a la que se le ha solicitado más piezas. 4. Número de pieza. descripción. Número de pieza. Obtener el nombre de la pieza y su precio unitario medio de la pieza más barata de precio de venta. 2. 3. 8. obtener el nombre de la pieza y número total de vendedores que la pueden suministrar. Nombre de los vendedores a los que se les haya solicitado más de dos pedidos en los que se sirvan discos duros. 10. Adicionales 7 CONSULTAS 82 1. 3. . pero que no oferten ninguna de las que puedan ser suministradas por el vendedor número 2. Obtener. 4. pero al que nunca se la hemos solicitado. ordenado por el nombre de vendedor. 6. el número de vendedor. su nombre y la diferencia media entre el precio al que nos vende las piezas y el que nos había ofrecido por las mismas. 2. Número y nombre de los vendedores que oferten alguna de las piezas que pueden ser suministradas por el vendedor número 1. 5. Obtener el número y el nombre de los vendedores y la cantidad de piezas que pueden suministrar a un precio entre 15 y 20 euros. junto con el número y nombre de vendedor que nos ha ofertado la pieza. para el vendedor que cumple que la diferencia de precio al que le compramos una pieza y el precio que nos había ofrecido por ella sea máxima. Obtener un listado en el que figure el número y nombre de la pieza. Obtener los números y nombres de los vendedores que nos han servido más de tres artículos diferentes. Obtener el número de pieza de los teclados que nos han sido servidos en el mayo de cualquier año.