Bases de Datos 1. práctica. Dpto. de Lenguajes y Sistemas Informáticos. Universidad de Alicante http://www.dlsi.ua.es/asignaturas/bd1/bd1.



Documentos relacionados
MANEJO DE SQL WORKSHEET

CONSULTAS CON SQL. 3. Hacer clic sobre el botón Nuevo de la ventana de la base de datos. Aparecerá el siguiente cuadro de diálogo.

select nombre from profesores where categoria='aso6';

T12 Vistas y tablas temporales

MANUAL DEL PROGRAMA DE ASESORAMIENTO (Asesores) Navegador y limpiar caché/cookies...2 Acceso al programa de Asesoramiento... 7

INSTALACIÓN DE ORACLE 8i (8.1.7) SOBRE NT

SQL (Structured Query Language)

Bases de datos relacionales y el modelo entidad-relación

Unidad III: Lenguaje de manipulación de datos (DML) 3.1 Inserción, eliminación y modificación de registros

Base de datos en la Enseñanza. Open Office

LEER Y ESCRIBIR ARCHIVOS O FICHEROS EN C. FOPEN, FCLOSE, MODOS DE ACCESO READ, WRITE Y APPEND (CU00536F)

CONSULTAS MULTITABLAS SQL SERVER Manual de Referencia para usuarios. Salomón Ccance CCANCE WEBSITE

Módulo 8: Ofimática básica. Unidad didáctica 2: Conceptos fundamentales en un gestor de base de datos. Access

Reservas - Rooming List

MANUAL DE AYUDA MÓDULO GOTELGEST.NET PREVENTA/AUTOVENTA

Base de datos: Access. Unidad Didáctica 3: Planificación y diseño de una base de datos

Base de datos relacional

5- Uso de sentencias avanzadas

COLEGIO APUNTES ACCESS

CASO PRÁCTICO DISTRIBUCIÓN DE COSTES

MANUAL DE AYUDA HERRAMIENTA DE APROVISIONAMIENTO

LABORATORIO Nº 2 GUÍA PARA REALIZAR FORMULAS EN EXCEL

MANUAL DE USUARIO DE LA HERAMIENTA CONFIGURACION DE PRESUPUESTOS PARA DISTRIBUIDORES

Centro de Capacitación en Informática

Región de Murcia Consejería de Educación, Ciencia e Investigación. Manual Usuario FCT

La ventana de Microsoft Excel

INVENTARIO INTRODUCCIÓN RESUMEN DE PASOS

Teclado sobre una PDA para Personas con Parálisis Cerebral

Conceptos Avanzados de Bases de datos

Boletín de Problemas de la Asignatura II18 Bases de Datos. Ingeniería Informática Universitat Jaume I

Manual de usuario de Solmicro BI. Página 1

FOCO GESTIÓN DE GRUPOS

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

Trabajos de Ampliación. Bases de datos NoSQL.

Módulo 8: Ofimática básica. Unidad didáctica 4: Introducción y modificación de datos. Access

6 - Recuperar algunos registros (where)

MANUAL DE USUARIO DE LA APLICACIÓN DE ACREDITACION DE ACTIVIDADES DE FORMACION CONTINUADA. Perfil Entidad Proveedora

CONSULTAS BASICAS EN SQL SERVER

Otros tipos de Consultas

1. DML. Las subconsultas

LAS SUBCONSULTAS SQL SERVER Manual de Referencia para usuarios. Salomón Ccance CCANCE WEBSITE

Proyectos de Innovación Docente

MANUAL DE USUARIO ARCHIVO

Servicio de estadísticas de Alojamiento Fecha de revisión: 19/09/2005

Manual de ayuda para crear y gestionar Tareas, como actividad evaluable

Documentación del Terminal

Operación de Microsoft Excel. Guía del Usuario Página 79. Centro de Capacitación en Informática

Práctica 3. Consultas SQL

MANUAL TIENDA VIRTUAL. Paseo del Gran Capitán, Nº 62, Salamanca. Telf.: Fax:

UNIVERSIDAD TÉCNICA DEL NORTE FACULTAD DE INGENIERÍA EN CIENCIAS APLICADAS ESCUELA DE INGENIERÍA EN SISTEMAS COMPUTACIONALES

Operaciones en el Modelo Relacional. Relacional. Relacional. Índice. Lenguajes de Consulta

Toda base de datos relacional se basa en dos objetos

GUIA APLICACIÓN DE SOLICITUDES POR INTERNET. Gestión de Cursos, Certificados de Aptitud Profesional y Tarjetas de Cualificación de Conductores ÍNDICE

Consultas con combinaciones

Programa Presupuestos de Sevillana de Informática.

Modelos y Bases de Datos

OBTENER DATOS EXTERNOS

TEMA 20: CONCEPTOS BÁSICOS DE SQL

Ejercicio Nº 3: Realizar aumentos en una Tabla de Sueldos

Base de datos en Access

GUÍA BÁSICA DE USO DEL SISTEMA RED

Base de datos Lenguaje SQL

Esta extensión está obsoleta a partir de PHP 5.5.0, y será eliminada en el futuro

GENERAR DOCUMENTOS HTML USANDO LENGUAJE PHP. EJERCICIO RESUELTO EJEMPLO SENCILLO. (CU00733B)

Programa diseñado y creado por Art-Tronic Promotora Audiovisual, S.L.

Manual de OpenOffice Impress

UNIVERSIDAD NACIONAL DE ASUNCION FACULTAD POLITÉCNICA CARRERA: LCIK MATERIA: Bases de Datos I Prof: Lic. Lilian Riveros Unidad 2: Modelo Relacional

PROGRAMA INFORMÁTICO PARA LA CUMPLIMENTACIÓN DE RECETAS EN FORMATO XML VERSIÓN: 1.0

COMANDOS DE SQL, OPERADORES, CLAUSULAS Y CONSULTAS SIMPLES DE SELECCIÓN

Manual de Procedimiento

RESOLUCIÓN DE ERRORES EN MOODLE CAMPUS VIRTUAL-BIRTUALA UPV-EHU

PROPUESTAS COMERCIALES

El proceso de edición digital en Artelope y CTCE

Teórico 9 Del MER al MR

BASE DE DATOS RELACIONALES

6.1. Conoce la papelera

GESTION DE REQUISICIONES VIA WEB MANUAL DEL USUARIO

BUSCAR Y RECOPILAR INFORMACIÓN EN INTERNET. APLICACIÓN PRÁCTICA.

3. Modelo relacional: Estructura e integridad.

A.1. Definiciones de datos en SQL

INTRODUCCIÓN INTRODUCCIÓN INTRODUCCIÓN INTRODUCCIÓN INSTRUCCIONES DE DEFINICIÓN DE TABLAS E ÍNDICES INSTRUCCIONES DE DEFINICIÓN DE TABLAS E ÍNDICES

OPTIMIZACIÓN DE CONSULTAS EN SQL. Análisis de Consultas y Transacciones Ajuste de Indices Ajuste de Consultas

Bases de Datos: Structured Query Language (SQL)

MANUAL DEL SISTEMA DE INFORMACIÓN DE EXPEDIENTES DEL GOBIERNO DE LA CIUDAD DE SANTA FE

Instructivo Asesoría Básica Comunidad Virtual SharePoint 2010

MANEJANDO FICHEROS Y CARPETAS

MANUAL BÁSICO DEL LENGUAJE SQL

Gobierno del Estado de México

- Access es un gestor de bases de datos relacionales gráfico e interactivo.

Estructurar la información dentro del ordenador:

MANUAL DE PRACTICUM12 PARA CENTROS EDUCATIVOS ÁMBITO MÁSTER

Manual de rol gestor de GAV para moodle 2.5

P/. Factura Electrónica D/. Manual de Usuario Proveedores

Aplicación de gestión TPC Manual usuario: Tramitación

LAS CONSULTAS ACCESS Manual de Referencia para usuarios. Salomón Ccance CCANCE WEBSITE

Oficina Online. Manual del administrador

Sistema de etiquetas Manual de uso

Introducción a las tablas dinámicas

Primeramente estudiaremos la forma básica de la sentencia SELECT, que esta formado por:

Modulo 1 El lenguaje Java

Transcripción:

práctica Bases de Datos 1 Eva Gómez Ballester Paloma Moreda Pozo Patricio Martínez Barco José Clavel Cerro Ernesto Pérez López Armando Suárez Cueto Dpto. de Lenguajes y Sistemas Informáticos Escuela Politécnica Superior Universidad de Alicante http://www.dlsi.ua.es/asignaturas/bd1/bd1.html

índice sesión 0 5 select 1 9 BD Proveedores 13 select 2 21 select 3 27 select fecha 31 create 33 manipulación 1 41 manipulación 2 47 manipulación 3 53 conjuntos 59 funciones 63 group by 67 group by - having 71 subselect 75 subselect - exists 81 adicionales 1 83 adicionales 2 85 adicionales 3 87 adicionales 4 89 adicionales 5 91 adicionales 6 93 adicionales 7 95

sesión 0 ENTORNO ORACLE Objetivos: Adquirir la destreza mínima para trabajar en el entorno ORACLE isqlplus. Contenidos Concepto de Base de Datos y Tabla. Entrar en ORACLE SQL. 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 5

Extensiones de Ejemplo: ASIGNATURAS codigo descripcion creditos creditosp HI HISTORIA DE LA INFORMATICA 4.5 FBD FUNDAMENTOS DE LAS BASES DE DATOS 6.0 1.5 DGBD DISEÑO Y GESTION DE BASES DE DATOS 6.0 3.0 PC PROGRAMACION CONCURRENTE 6.0 1.5 FP FUNDAMENTOS DE LA PROGRAMACION 9.0 4.5 PROFESORES IMPARTE dni nombre categoria ingreso dni asignatura 21111222 EVA GOMEZ TEU 01/10/1993 21111222 FBD 21222333 MANUEL PALOMAR TEU 16/06/1989 21111222 DGBD 21333444 RAFAEL ROMERO ASO6 16/06/1992 21333444 PC isqlplus Oracle es un sistema de gestión de bases de datos relacional. Dicho gestor está instalado en un servidor al que se accede por red desde un navegador o un cliente Windows. Desde el navegador, accediendo a la dirección http://oraculo.eps.ua.es:5560/isqlplus, aparece la pantalla de identificación. Para la mayoría de las sesiones, la información a introducir en el formulario es: Usuario: alumno Contraseña: alumno Conexión: oracle 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 nombre categoria 21111222 EVA GOMEZ TEU 21222333 MANUEL PALOMAR TEU 21333444 RAFAEL ROMERO 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. 6

Algunos de los tipos de datos que nos podemos encontrar en ORACLE son: VARCHAR2(n) Cadena de caracteres de longitud variable con un máximo de n (1<=n<=4000) CHAR(n) Cadena de caracteres de longitud fija de longitud n (1<=n<=2000) LONG Cadena de caracteres de longitud variable hasta 2 gigabytes, o 2 31-1 bytes NUMBER(p,s) Números con precisión p y escala s (1<=p<=38) (-84<=s<=127) RAW(n) Cadena de caracteres binarios de longitud n (1<=n<=2000) LONG RAW Cadena de caracteres binarios de longitud variable hasta 2 gigabytes DATE Datos de tipo fecha, con la forma dd/mm/yyyy(día, mes y año). Los valores date deben manejarse encerrados entre comillas simples. Rango válido desde 1 de enero de 4712 AC hasta el 31 de diciembre de 4712 DC. INFORMACIÓN ADICIONAL Direcciones con ayuda Oracle disponible: www.oracle.com www.redcientifica.com/ Ayuda en línea. En general, es bastante fácil encontrar información en internet por medio de cualquier buscador. Obtener información sobre una tabla de la BD Ejecutar DESC nombretabla o DESCRIBE nombretabla para mostrar información de la tabla nombretabla: ( el nombre de cada columna, si los valores nulos se permiten o no (NULL or NOT NULL) en esa columna, tipo de dato de la columna, por ejemplo, NUMBER, CHAR, VARCHAR2, LONG, DATE, RAW, o LONG RAW, y la precisión de la columna si el tipo de dato lo requiere). Otras informaciones disponibles en el catálogo del sistema (el comando DESCRIBE se basa en algunas de las tablas que se utilizan aquí) son: select distinct table_name, column_name from all_cons_columns where OWNER='BD1TABLAS'; select * from all_cons_columns where OWNER='BD1TABLAS'; select OWNER, TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_LENGTH, DATA_PRECISION, DATA_SCALE from all_tab_columns where OWNER='BD1TABLAS'; Donde BD1TABLAS es un usuario (el propietario, en este caso, de la BD PROVEEDORES) Para que los datos se muestren en pantalla sin saltos de línea, se puede dar formato a las columnas con las siguientes órdenes, (es permanente para toda la sesión, sólo se ejecutan una vez; si se quiere otro formato, hay que volver a ejecutarlas con las modificaciones oportunas) COLUMN OWNER FORMAT a20 COLUMN CONSTRAINT_NAME FORMAT A20 COLUMN TABLE_NAME FORMAT A15 COLUMN COLUMN_NAME FORMAT A20 7

COLUMN POSITION FORMAT 99 COLUMN DATA_TYPE FORMAT A15 Y también: SET LINESIZE 600 (para evitar que la filas de salida, incluída la cabecera, ocupen, más de una línea) SET PAGESIZE 200 (para evitar cabeceras tantas cabeceras) Sobre guardar órdenes en disco En la máquina se dispone de un disco duro local que se puede utilizar para guardar y recuperar ficheros generados por el alumno. No obstante, no se garantiza que los datos ahí guardados permanezcan de una sesión para otra. Por lo tanto, si se quieren guardar datos con seguridad es preferible hacerlo en un disco removible, o bien utilizando los servicios de disco virtual de la EPS o el Campus Virtual. 8

select 1 SQL - SELECT 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 SELECT [ DISTINCT ] listacolumnas FROM listatablas [ WHERE condición ] [ GROUP BY listacolumnas [ HAVING condición ] ] [ ORDER BY listacolumnas [ ASC DESC ] ] Sintaxis general de la orden select 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 nombre categoria 21111222 EVA GOMEZ TEU 21222333 MANUEL PALOMAR TEU 21333444 RAFAEL ROMERO ASO6 9

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 categoria EVA GOMEZ TEU MANUEL PALOMAR TEU RAFAEL ROMERO 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 categoria 21111222 TEU 21222333 TEU 21333444 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' resultado: nombre EVA GOMEZ MANUEL PALOMAR 10

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 descendentes 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: creditos descripcion 4.5 Historia de la Informática 6 Diseño y Gestión de Bases de Datos 6 Fundamentos de las Bases de Datos 6 Programación Concurrente 9 Fundamentos de la Programación 11

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 12

BD Proveedores LA BASE DE DATOS PROVEEDORES Objetivos: Ser capaz de interpretar un esquema de base de datos relacional (concretamente, el propuesto para las prácticas de la asignatura: Proveedores) Se detalla el esquema lógico que describe la BD de PROVEEDORES, ya creada y a disposición del alumno, intentando que comprenda su significado, el sistema real que pretende representar. El esquema lógico es la referencia que permite construir las órdenes select con las que interrogar a la BD. Las extensiones de cada relación se incluyen como ayuda para comprobar la corrección de las órdenes select utilizadas. 13

LA BASE DE DATOS PROVEEDORES TABLA COLUMNAS RESTRICCIONES VENDEDOR ( numvend NUMBER(4), Clave Primaria: (numvend) nomvend VARCHAR2(30), nombrecomer VARCHAR2(30), telefono CHAR(11), calle VARCHAR2(30), ciudad VARCHAR2(20), provincia VARCHAR2(20) ) PIEZA ( numpieza VARCHAR2(16), nompieza VARCHAR2(30), preciovent NUMBER(9,2)) Clave Primaria: (numpieza) PRECIOSUM PEDIDO LINPED INVENTARIO ( numpieza VARCHAR2(16), numvend NUMBER(4), preciounit NUMBER(9,2), diassum NUMBER(3), descuento NUMBER(2)) ( numpedido NUMBER(5), numvend NUMBER(4), fecha DATE ) ( numpedido NUMBER(5), numlinea NUMBER(2), numpieza VARCHAR2(16), preciocompra NUMBER(9,2), cantpedida NUMBER(4), fecharecep DATE, cantrecibida NUMBER(4)) ( numpieza VARCHAR2(16), numbin NUMBER(10), cantdisponible NUMBER(5), fecharecuento DATE, periodorecuen NUMBER(2), cantminima NUMBER(5) ) Clave Primaria: (numpieza, numvend) Clave Ajena: (numpieza) PIEZA, Clave Ajena: (numvend) VENDEDOR Clave Primaria: (numpedido) Clave Ajena: (numvend) VENDEDOR Clave Primaria: (numpedido, numlinea) Clave Ajena: (numpedido) PEDIDO Clave Ajena: (numpieza) PIEZA 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. 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, las tareas que se pretenden mecanizar son las siguientes (entre paréntesis aparecen las tablas directamente relacionadas con cada una): Lista de suministradores (vendedor). Los datos de los proveedores que nos suministran la mercadería que, posteriormente, es vendida al público en general. Catálogo de venta (pieza) 14 Las piezas que distribuye nuestra empresa y el precio de venta al público de las mismas.

Lista de precios de suministro (preciosum, vendedor, pieza). Conocer los precios a los que los proveedores nos podrían suministrar las piezas. Es información histórica cuyo origen no nos preocupa. 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, si se ha hecho, que hayan sido comprados a un precio distinto porque se negociara en ese instante con cualquiera de los suministradores. Control de pedidos (pedido, linped, vendedor, pieza). De aquellas mercancías que se solicitan a los proveedores, controlar si se han servido en el tiempo estimado y en la cantidad pedida. Cada pedido consta de: Cabecera de pedido (tabla pedido), donde se especifica qué vendedor nos ha suministrado el pedido completo, y la fecha en que se realizó el pedido. Líneas de pedido (tabla linped), donde un conjunto de líneas pertenecientes a un mismo pedido se numeran desde la número 1 en adelante. Contiene el código de pieza que sirvió el proveedor, la cantidad que se le pidió y la cantidad que realmente ha servido a nuestra empresa y la fecha en la que se recibió, así como el precio al que se le compro (puede ser diferente al estipulado en preciosum). Sólo aquellas piezas que aparezcan en una línea de pedido han sido solicitadas al correspondiente vendedor y, si la cantidad recibida es mayor que cero, habrán sido recibidas por la empresa en esa cantidad. Control de existencias (inventario, pieza). Mediante la confección de un inventario, donde cada entrada, que corresponde a un único artículo, es el recuento real de existencias. 15

tabla VENDEDOR numvend nomvend nombrecomer telefono calle Ciudad provincia 1 AGAPITO LAFUENTE DEL CORRAL MECEMSA 96-5782401 Avda. Valencia 3205 ALICANTE ALICANTE 2 LUCIANO BLAZQUEZ GENERAL LACY, 15 2 HARW S.A. 96-3232321 VAZQUEZ B ALICANTE ALICANTE 3 GODOFREDO MARTIN MARTINEZ MECEMSA 96-4141722 AVDA. VALENCIA 3372 ALICANTE ALICANTE 4 JUANITO REINA DONDEQUIERAS, HARW S.A. 903-696969 PRINCESA 1000, 13F LO ANGELE LOS EU'S 5 JUANITO REINA S. FRANCISCO DE LA DEAQUI 98-5363636 PRINCESA ASIS, 10 1 GIJON ASTURIAS 6 MANOLO PIEDRA POMEZ HUMP S.A. 96-5660727 AVIACION 92, 3 I SAN VICENTE ALICANTE 7 MANUEL PEREZ SOFTHARD QUINTANAR DE LA 98-5696969 ARZOBISPO LOACES RODRIGUEZ DISTRIBUIDORA S.A. ORDE TOLEDO 8 LUISA PINTO HEREDIA LA MEJOR S.A. 999-2014455 OXFORD BLUES NEW ORLEANS LOUISSIANA 9 CHEMA PAMUNDI OLE ESPAÑA, S.A. RIVAS VACIAMADRID MADRID 10 GUSTAVO DE BASICA OLE ESPAÑA, S.A. RIVAS VACIAMADRID MADRID 11 MARIO DUQUE LIZONDO BANESTOESSOFT S.L. 98-0101010 MOROS, 19 GIJON ASTURIAS 12 JOSE ANTONIO MARTINEZ JUAN OLE ESPAÑA, S.A. 3667788 COLON, 21 VALENCIA VALENCIA 13 MANUEL GOMEZ SANTISTEBAN OLE ESPAÑA, S.A. 3667789 COLON, 21 VALENCIA VALENCIA 8001 JUAN RODRIGUEZ JUAN HALA S.A. ALMORADI ALICANTE 8002 JUAN MARTINEZ GARCIA HARW S.A. 3334455 CISCAR, 5 VALENCIA VALENCIA 8003 LUIS RODRIGUEZ SALA HARW S.A. 3335588 SALAMANCA, 102 VALENCIA VALENCIA 100 PEDRO GRACIA MORALES SOFT S.A. SALAMANCA, 100 VALENCIA VALENCIA 101 SALVADOR PLA GARCIA TABAC & SOFT 5661100 MAYOR, 44 SAN VICENTE ALICANTE 102 SOLEDAD MARTINEZ ORTEGA ASX. S.A. 87879998 PEREZ GALDOS, 54 ALICANTE ALICANTE 200 SEVERINO MARTIN MARTINEZ SEVESOFT 5779988 GENERAL LACY, 17 ALICANTE ALICANTE 55 LUIS GARCIA SATORRE HARW S.A. 5889944 POETA ALONSO, 12 ALICANTE ALICANTE 201 MANUEL ORTUÑO LAFUENTE HALA S.A. 5660788 MAYOR, 64 SAN VICENTE ALICANTE tabla PIEZA numpieza nompieza preciovent A-1001-L MOUSE ADL 3B 7,00 C-1002-H 4,00 C-1002-J 7,00 C-400-Z FILTRO PANTALLA X200 18,00 DD-0001-210 DISCO DURO WESTERN DIG 210M 28 250,00 DD-0001-30 DISCO DURO 30M SEAGATE 200,00 DK144-0001 DISKETTE 1.44 PANASONIC 1,10 DK144-0002-P PACK DISKETTE 144 PANASONIC 10,00 FD-0001-144 FLOPPY 1.44 IBM 180,00 FD-0002-720 FLOPPY 720K IBM 150,00 M-0001-C MONITOR SYNCMASTER 3 COLOR 170,00 M-0002-C MONITOR COLOR SONY BT 350,00 M-0003-C MONITOR IBM 3570 COLOR 400,00 O-0001-PP PEGATINAS CONCIERTO JEVI 20,00 O-0002-PP PACK PEGATINAS CONCIERTO JEVI 100,00 P-0001-33 PLACA INTEL 33Mz 350,00 T-0001-IBM TECLADO XT IBM 110,00 T-0002-AT TECLADO AT SUSUSU 55,00 T-0003-AT TECLADO AT HP 120,00 X-0001-PC TECLADO ESTANDAR PC 70,00 16

tabla PEDIDO numpedido numvend fecha 1 1 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 tabla LINPED numpedido numlinea numpieza preciocompra cantpedida fecharecep cantrecibida 1 1 M-0001-C 300,00 10 10/05/1992 10 1 2 P-0001-33 210,00 20 10/05/1992 18 1 3 FD-0001-144 135,00 20 10/05/1992 20 1 4 DD-0001-210 150,00 20 10/05/1992 20 1 5 T-0002-AT 31,00 22 17/10/1992 22 2 1 DK144-0002-P 5,45 100 15/10/1992 101 2 2 T-0002-AT 30,00 1 15/10/1992 1 3 1 DD-0001-210 146,00 15 17/10/1992 15 3 2 P-0001-33 210,00 3 17/10/1992 3 4 1 O-0002-PP 99,00 10 17/10/1992 10 5 1 T-0002-AT 15,00 15 11/06/1993 13 6 1 O-0001-PP 15,00 1000 25/08/1995 1000 6 2 O-0002-PP 99,00 2000 25/08/1995 1998 7 1 C-400-Z 7,00 45 09/10/1992 8 tabla INVENTARIO numpieza numbin cantdisponible fecharecuento periodorecuen cantminima DD-0001-30 1 120 15/10/1990 1 15 P-0001-33 2 10 15/10/1992 5 O-0002-PP 3 110 15/10/1992 1 3 M-0001-C 4 15 15/10/1992 2 2 M-0003-C 5 2 20/10/1992 1 0 DD-0001-210 6 10 12/11/1992 2 1 FD-0001-144 7 10 12/11/1992 2 0 17

tabla PRECIOSUM numpieza numvend preciounit diassum descuento A-1001-L 3 5,00 1 A-1001-L 4 4,90 1 A-1001-L 100 4,00 3 A-1001-L 1 2,00 3 C-1002-H 1 0,50 2 C-1002-J 1 1,50 2 C-400-Z 1 8,50 4 5 C-400-Z 8002 7,00 3 DD-0001-210 1 150,00 3 15 DD-0001-210 2 170,00 5 12 DD-0001-210 101 140,00 15 14 DD-0001-30 1 120,00 4 DK144-0001 1 0,56 3 DK144-0002-P 1 5,60 3 DK144-0002-P 2 5,50 5 FD-0001-144 1 130,00 3 FD-0001-144 102 136,00 3 7 FD-0001-144 55 120,00 10 13 FD-0002-720 1 60,00 3 M-0001-C 1 155,00 3 10 M-0001-C 3 180,00 7 15 M-0002-C 9 300,00 1 5 M-0002-C 1 150,00 10 15 M-0003-C 3 350,00 2 15 M-0003-C 4 280,00 7 M-0003-C 1 200,00 7 O-0001-PP 5 19,50 1 O-0001-PP 55 15,00 7 O-0001-PP 1 15,00 1 O-0002-PP 2 99,00 1 O-0002-PP 5 98,75 1 12 O-0002-PP 101 80,00 10 O-0002-PP 1 75,00 1 P-0001-33 2 210,00 5 P-0001-33 1 250,00 3 P-0001-33 4 280,00 7 P-0001-33 3 250,00 2 P-0001-33 5 280,00 3 10 T-0001-IBM 2 90,00 5 T-0001-IBM 100 95,00 5 10 T-0001-IBM 1 90,00 15 T-0002-AT 1 30,00 3 T-0002-AT 2 35,00 5 7 T-0002-AT 4 25,00 7 T-0002-AT 5 33,00 3 T-0002-AT 100 34,00 2 5 T-0002-AT 201 30,00 1 5 T-0003-AT 1 77,50 3 T-0003-AT 3 81,45 18

CONSULTAS SELECT1 1. Obtener todos los números de piezas de las piezas de la base de datos. 2. Nombre de todas las piezas con un precio de venta menor que 1000. 3. Número, nombre y precio de venta de las piezas de precio de venta mayor que 10 o menor que 1 euros, ordenadas de menor a mayor precio. 4. Para cada pieza de la que se conozca algún suministrador, obtener el número de pieza y el descuento, en orden descendente del valor de descuento. 5. Nombre de los vendedores con número de vendedor menor que 6. 6. Modificar el requerimiento anterior para eliminar duplicados. 7. Número y nombre de los vendedores con número de vendedor menor que 6. 8. Obtener todos los números de los vendedores de los que se sepa que pueden suministrar alguna pieza. 9. Vendedores de la provincia de Alicante. 10. Nombre y empresa de los vendedores de la Comunidad Valenciana. 11. Números de vendedores y días que tardarían en suministrar la pieza 'P-0001-33' 12. Códigos de pieza solicitados en el pedido 1, ordenados de mayor a menor precio de compra. 13. Números de pedido y números de vendedor, para los pedidos solicitados el 15 de octubre de 1992. 14. Códigos de pieza de los que se sabe que algún vendedor nos podría hacer descuento. 15. Códigos de pieza, de posible suministrador y precio de suministro, ordenados por código de vendedor y código de pieza. 19

20

select 2 CONSULTAS SOBRE VARIAS TABLAS Objetivos: Poder relacionar distintas tablas de la BD para obtener información más compleja. Contenidos Utilización de más de una tabla. Nombres cualificados de atributo. Sinónimos temporales de tabla. Tipos de datos: dominios. 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. La forma de especificar qué tablas vamos a consultar es construir una lista de nombres de tablas en la cláusula FROM. Si seleccionamos la BD Ejemplo, podemos preguntar por el nombre de los profesores y la descripción de las asignaturas que imparten; esta información se encuentra almacenada en la tabla imparte, que relaciona las claves primarias de cada una de las tablas asociadas por tal relación. select nombre, descripcion from asignaturas, imparte, profesores where profesores.dni = imparte.dni and asignatura = codigo resultado: nombre descripcion EVA GOMEZ Fundamentos de las Bases de Datos EVA GOMEZ Diseño y Gestión de Bases de Datos RAFAEL ROMERO Programación Concurrente En primer lugar, solicitamos nombre (del profesor) y descripcion (de la asignatura). El primer atributo se encuentra en la tabla profesores, y el segundo en la de asignaturas. La relación entre ambas tablas se encuentra en la tabla imparte, que asocia dni de profesor con codigo de asignatura que imparte. Así, para obtener la información que precisamos, necesitamos involucrar a las tres tablas al mismo tiempo. Podemos pensar, por clarificar el mecanismo por el que se obtiene este resultado, que el SGBD recorre la tabla de profesores, tupla por tupla, y busca el valor de dni de cada una en la tabla imparte. Si encuentra tal valor, en esa tupla de imparte en que lo ha encontrado, aparecerá el código de asignatura, en la columna nominada como asignatura; buscando en la tercera tabla, asignaturas, obtendrá la descripcion y finalmente mostrará en pantalla el nombre y la descripción que le corresponde. 21

Nótese que no aparece MANUEL PALOMAR, o la asignatura HISTORIA DE LA INFORMÁTICA, puesto que ni el primero (en nuestra BD) imparte asignatura alguna, 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, nombre from profesores, imparte resultado: asignatura nombre FBD EVA GOMEZ FBD MANUEL PALOMAR FBD RAFAEL ROMERO DGBD EVA GOMEZ DGBD MANUEL PALOMAR DGBD RAFAEL ROMERO PC EVA GOMEZ PC MANUEL PALOMAR PC 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, la cardinalidad de la relación resultante es 3 x 3 = 9 tuplas. Si en la cláusula from pusiéramos, además, la tabla asignaturas, el resultado final tendría 3 x 3 x 5 = 45 tuplas. 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, nombre from profesores, imparte where profesores.dni = imparte.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 ingreso dni asignatura 21111222 EVA GOMEZ TEU 01/10/1993 21111222 FBD 21222333 MANUEL PALOMAR TEU 16/06/1989 21111222 FBD 21333444 RAFAEL ROMERO ASO6 16/06/1992 21111222 FBD 21111222 EVA GOMEZ TEU 01/10/1993 21111222 DGBD 21222333 MANUEL PALOMAR TEU 16/06/1989 21111222 DGBD 21333444 RAFAEL ROMERO ASO6 16/06/1992 21111222 DGBD 21111222 EVA GOMEZ TEU 01/10/1993 21333444 PC 21222333 MANUEL PALOMAR TEU 16/06/1989 21333444 PC 21333444 RAFAEL ROMERO ASO6 16/06/1992 21333444 PC 22 1 Esto no es necesariamente real, 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.

Por lo especificado por la where eliminaría aquellas tuplas que no cumplieran la condición, y nos quedaría: dni nombre categoria ingreso dni asignatura 21111222 EVA GOMEZ TEU 01/10/1993 21111222 FBD 21111222 EVA GOMEZ TEU 01/10/1993 21111222 DGBD 21333444 RAFAEL ROMERO ASO6 16/06/1992 21333444 PC Y por último, las columnas especificadas en la select determinarían el resultado final: asignatura nombre FBD EVA GOMEZ DGBD EVA GOMEZ PC RAFAEL ROMERO NOMBRES CUALIFICADOS DE ATRIBUTO Si observamos la sentencia select anterior, al comparar los dni que aparecen en profesores y en imparte hemos utilizado el nombre de la tabla a la que pertenecen cada uno, profesores.dni e imparte.dni. Si en el conjunto de columnas de todas las tablas que se especifican en la cláusula from existen varias con nombres iguales, deberemos especificar en todo momento la tabla de la que queremos extraer la información. Caso de no existir ambigüedad, no es necesario utilizar el nombre de la tabla; ni asignatura ni codigo se utilizan en otras tablas. Si deseamos conocer el dni y el nombre de los profesores que imparten alguna asignatura, 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. select dni, nombre from profesores, imparte where profesores.dni = imparte.dni resultado: ERROR Al especificar que nos muestre en pantalla el dni del profesor, el SGBD entra en conflicto puesto que no sabe si nos referimos al de la tabla profesores o al de la tabla imparte. Utilizaremos el nombre completo de la columna (es indiferente, en este caso, de qué tabla): select profesores.dni, nombre from profesores, imparte where profesores.dni = imparte.dni resultado: dni nombre 21111222 EVA GOMEZ 21111222 EVA GOMEZ 21333444 RAFAEL ROMERO Se recuerda que la ocurrencia EVA GOMEZ está relacionada con dos asignaturas, y es por eso que aparece duplicada en este resultado. La forma de evitar tuplas idénticas ya se mostró en la sesión anterior. 23

SINÓNIMOS TEMPORALES DE TABLA Para facilitar la escritura de las sentencias select (entre otros posibles motivos) se pueden utilizar alias temporales, nombres alternativos de las tablas. Se especifican en la lista de tablas del from, antes de la, que separa el nombre de la tabla en cuestión de la siguiente. select distinct p.dni, nombre from profesores p, imparte i where p.dni = i.dni resultado: dni nombre 21111222 EVA GOMEZ 21333444 RAFAEL ROMERO CONSULTAS SELECT2 1. Obtener el número de pieza junto con el nombre de todas las provincias desde las que puede sernos suministrada, en orden descendente del número de pieza. 2. Modificar el requerimiento anterior para eliminar duplicados. 3. Lista el nombre y número de las piezas. 4. Obtener el nombre y número de proveedores de la provincia de Valencia. 5. Obtener el nombre y número de proveedores de la provincia de Valencia a los que se les ha solicitado un pedido. 6. Obtener los números de línea y su precio de compra del pedido número 1. 7. Obtener todas las piezas que se recuenten el 15 /10/1992. 8. Obtener número y nombre de todas las piezas recibidas el 1 de Mayo de 1992. 9. Precio unitario de suministro del número de pieza A-1001-L y el vendedor 100. 10. Nombres de proveedores que puedan suministrarnos la pieza numero A-1001-L 11. Obtener nombre, teléfono, y ciudad del vendedor que puede suministrarnos piezas con valor mayor de 100. 12. Obtener los vendedores que pueden suministrarnos piezas con un descuento de más de 10%. 13. Obtener los números de pedido del vendedor número 1. 14. Obtener los vendedores ordenados alfabéticamente en orden descendente. 15. Ídem en orden ascendente. 16. Obtener los números de pieza de las que conozcamos algún vendedor que nos la pueda suministrar. 17. 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). 18. Piezas que nos puedan suministar los vendedores de la empresa Harw S.A. 24

19. Número, nombre y precio de venta de las piezas que han sido compradas en un pedido servido por el vendedor 1. 20. Número y nombre de vendedor, y pieza que ha sido comprada a un precio mayor que el estipulado en la lista de precios de suministro. 21. 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. 22. Pedidos y datos del vendedor cuya fecha de pedido no sea el 22 de octubre de 1992. 23. Precios a los que nos pueden ser suministradas las piezas DD-0001-210 y FD-0001-144, y número y nombre de los vendedores que las podrían suministrar a esos precios. 25

26

select 3 EXPRESIONES DE SELECCIÓN DE FILAS Objetivos: Comparaciones de cadenas de caracteres. Contenidos BETWEEN, IN LIKE, subcadenas. Construcción de expresiones de selección de filas utilizando rangos, listas, y funciones de comparación de cadenas de caracteres. RANGOS Expresiones del tipo 10 <= x <= 100 se pueden construir utilizando el operador de construcción de rangos BETWEEN. 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, deseamos conocer los créditos y descripción de las asignaturas cuyo número de créditos está entre 5 y 8. select creditos, descripcion from asignaturas where creditos between 5 and 8 resultado: creditos descripcion 6 Fundamentos de las Bases de Datos 6 Diseño y Gestión de Bases de Datos 6 Programación Concurrente LISTAS Mediante el operador IN se puede buscar un determinado valor en una lista construida usando constantes. expresión [NOT] IN (listavalores) 27

Descripción de las asignaturas FBD y DGBD: select descripcion from asignaturas where codigo in ('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, FBD o DGBD: select nombre from profesores p, imparte i where p.dni = i.dni and asignatura not in ('HI', 'FBD', 'DGBD') resultado: nombre RAFAEL ROMERO Fijémonos en que MANUEL PALOMAR, que no imparte ninguna de las asignaturas objeto de la búsqueda, tampoco aparece en la tabla resultado puesto que su dni no aparece en la tabla IMPARTE. SUBCADENAS DE CARACTERES Podemos preguntar por subcadenas dentro de columnas de tipo carácter. Para ello utilizaremos los operadores LIKE o MATCHES, que soportan la siguiente sintaxis: columna [NOT] LIKE 'cadena' La cadena de caracteres cadena admite los comodines % y _, equivalentes en uso a los comodines de MS-DOS * y?, es decir, el primero indica una cadena de caracteres de cualquier longitud, y el segundo un carácter cualquiera. Profesores que atiendan al nombre de 'RAFA': select * from profesores where nombre like 'RAFA%' resultado: dni nombre categoria 21333444 RAFAEL ROMERO ASO6 Código de las asignaturas de 'Bases de Datos' select codigo from asignaturas where descripcion like '%BASES DE DATOS%' resultado: codigo FBD DGBD 28

Código de las asignaturas, 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, 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, creditos from asignaturas where creditos is not null resultado: codigo creditos HI 4.5 FBD 6 DGBD 6 PC 6 FP 9 RESUMEN DE OPERADORES Recopilamos todos los operadores y conectivas lógicas vistos hasta ahora para la construcción de expresiones condicionales: = AND BETWEEN LIKE {%,_} > OR IN < NOT > = < = < > IS NULL 29

CONSULTAS SELECT3 1. Obtener el nombre de las piezas que puedan ser suministradas por aquellos proveedores cuyo nombre empiece por S. 2. Obtener el nombre de las piezas que puedan ser suministradas por proveedores cuyo nombre empiece por S, y se llamen de apellido 2 Martínez o Martín. 3. Obtener los nombres de los vendedores de las provincias de Valencia, Castellón o Alicante. 4. Nombres de vendedores que empieza su nombre por J. 5. Nombres de vendedores que termina su nombre por Z. 6. Nombres de vendedores que se apellidan López. 7. Nombre de vendedores que el nombre empieza por M seguido de cualquier carácter simple, una R y cualquier cadena de n caracteres. 8. 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. 9. Listar los nombres y números de vendedores así como el número y nombre de las piezas que pueden suministrar, para los vendedores de la provincia de Valencia o Alicante. 10. Obtener los nombres de pieza que pueden suministrar los vendedores de apellido 'García'. 11. Piezas 3 que sabemos que nos puede suministrar algún vendedor. 12. Obtener todos los vendedores que tengan teléfono. 13. 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. 14. Obtener los nombres de vendedores en orden alfabético. 15. Obtener nombre de vendedores y nombre de piezas que pueden suministrar ordenado en orden alfabético. 16. Obtener todos los nombres de piezas que pueda suministrar el vendedor 100, el 300 y/o el 400 con un precio de venta entre 10 y 1000, y un precio unitario entre 1 y 500. 17. Obtener el número de pieza y el precio de los monitores. 18. Nombre de las piezas que pueden sernos suministradas desde la Comunidad Valenciana. 19. Obtener los vendedores que viven en la calle Ciscar o Salamanca y de la Empresa Harw S.A. 20. Obtener nombres de vendedores y números de pieza que nos pueden suministrar, de aquellos vendedores cuyo apellido comienza por Martín, y ordenados alfabéticamente. 2 Evidentemente, la BD no diferencia entre nombre y apellido primero y segundo, por lo que se ha de tratar como subcadenas dentro del valor del atributo. 3 Cuando no se especifica un atributo concreto, se entiende que se pide toda la información disponible en la BD de los objetos solicitados. 30

select fecha FUNCIONES DE FECHA 4 Objetivos: Construir condiciones de selección de filas utilizando atributos de tipo fecha. 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, 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, la comparación entre fechas se hace directamente. Por ejemplo: select nombre from profesores where ingreso < '23/12/1989'; 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, cambiar el formato de visualización, calcular días, etc.) entonces debemos ayudarnos de estas funciones. TO_CHAR(fecha [, formato]) TO_DATE(cadena [, formato]) Convierte la fecha de tipo DATE a un valor VARCHAR2 en el formato especificado en "formato" Convierte la cadena de caracteres "cadena" de tipo CHAR a un valor de tipo DATE con el formato especificado en "formato" SYSDATE Devuelve la fecha actual del sistema ADD_MONTHS(fecha,n) Devuelve la fecha especificada con n meses más MONTHS_BETWEEN(fecha1,fecha2) Devuelve los meses transcurridos entre fecha1 y fecha2 4 Aunque todas las demás sesiones de prácticas cumplen con el estándar SQL, 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. 31

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. Dicha máscara es una cadena de caracteres entre comillas simples en la que se pueden utilizar los siguientes: ELEMENTO SIGNIFICADO - / '. ; : 'texto' Marcas de puntuación y texto fijo que se reproduce en el resultado D Día de la semana (1-7) DAY Nombre del día de la semana DD Día del mes (1-31) DY Día del año (1-366) MM Mes (1-12) MON Nombre abreviado del mes MONTH Nombre completo del mes Q Cuatrimestre del año (1-4) YYYY Año con 4 dígitos Y,YYY Año con punto de millar YY Año con 2 dígitos Por ejemplo: select nombre, to_char (ingreso,'dd') from profesores where to_char(ingreso,'dd') < 15 select * from profesores where 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, sysdate-ingreso from profesores CONSULTAS SELECT FECHA 1. Obtener el número de pieza de las piezas que se recuenten el 15/10/92. 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. Número y fecha de los pedidos solicitados en el segundo semestre del 92. 4. Nombre de los vendedores que sirvieron piezas en la primera quincena de mayo del 92, ordenado alfabéticamente. 5. Número, nombre de vendedor y mes en que se les solicitó un pedido de discos duros. 6. Años en que se ha efectuado algún recuento. 7. Número y descripción de las piezas que sirvieron los proveedores los días 10 de cada mes. 8. 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. 9. Número de pieza, descripción, fecha de recepción, cantidad recibida, de las piezas recibidas en el 95 y de precio de venta entre 50 y 100 euros. 32

create DEFINICIÓN DE DATOS Objetivos: Introducir al alumno a la definición de datos. Contenidos Las órdenes CREATE TABLE y DROP TABLE Restricciones La orden INSERT (1) Información sobre las restricciones de una tabla IMPORTANTE Para ésta y las sesiones que traten de crear y borrar tablas, e insertar, modificar o eliminar datos, es necesario entrar al sistema con un usuario con permisos suficientes y diferente para cada puesto (si dos alumnos entraran con el mismo usuario estarían trabajando en el mismo espacio de trabajo y colisionarían al crear y mantener sus tablas). Por ello, se debe iniciar la sesión como: usuario: bdixx contraseña: bdixx servicio: oracle donde xx es el número del ordenador en el aula (01, 02,..., 10, 11,... 25...) Dado que el número de usuarios es limitado, al terminar cada grupo de prácticas, los usuarios serán limpiados por lo que los datos manejados durante la sesión serán borrados y no estarán disponibles para las semanas siguientes. LA ORDEN CREATE TABLE La definición de tablas es el primer paso en la creación de una base de datos. El conjunto de descripciones de tablas conforma el esquema de base de datos y representa a un sistema de información concreto. Supongamos que vamos a implementar un esquema de base de datos relacional de profesores, asignaturas (sólo es un listado de profesores y asignaturas, sin relaciones entre ellos). En primer lugar debemos decidir cuáles son los atributos de cada uno de ellos y sus tipos de datos: PROFESORES (DNI: varchar2(10), nombre: varchar2(40), categoria: char(4), ingreso: datetime) ASIGNATURAS (codigo: char(5), descripcion: varchar2(35), creditos: number(3,1) creditosp: number(3,1))

Para cumplir con las restricciones del modelo relacional, además, debemos elegir las claves primarias adecuadas 5 : DNI para profesores y codigo para asignaturas. Obviamente, la forma que tienen estas tablas ha sido una decisión nuestra como diseñadores de esta base de datos concreta, en otra situación hubiéramos, probablemente, decidido definir otros atributos y otras tablas. La orden CREATE TABLE nos permite crear cada una de las tablas necesarias para nuestra base de datos: CREATE TABLE nombretabla ( {listacolumnas} [,{restricciones}] ) La lista de columnas, en su forma más sencilla, es un conjunto de expresiones (tantas como columnas deseemos, y separadas por comas) del tipo: columna tipodatos[,columna tipodatos[,...]] RESTRICCIONES Las restricciones son reglas, que normalmente se establecen en el momento de crear una tabla, para garantizar la integridad de los datos. Básicamente, las restricciones obligan a cumplirse ciertas reglas cuando una fila es insertada, borrada o modificada, de forma que la operación se llevará a efecto sólo si se cumplen las restricciones definidas en la tabla. Podemos contemplar los siguientes tipos de restricciones de integridad de datos: NOT NULL: especifica que la columna no puede contener un valor nulo. PRIMARY KEY: identifica de manera única a cada fila de la tabla mediante una o varias columas, estas columnas que forman la clave primaria no pueden tener valores nulos. FOREIGN KEY: establece una relación entre una(s) columna(s) de la tabla y otra(s) columna(s) de la tabla referenciada, siendo esta última(s) columna(s) la PRIMARY KEY. CHECK: especifica una condición que se debe evaluar a cierto. De las restricciones, sólo vamos a utilizar, de momento, la clave primaria, que puede contener tantas columnas como se necesiten: PRIMARY KEY (columna[,columna[,...]]) 5 Todos los SGBDR permiten crear tablas sin restricciones de clave primaria, pero un correcto diseño de bases de datos incluirá claves ajenas que no se pueden definir si no existen sus correspondientes claves primarias. Las claves ajenas se introducen en la siguiente sesión. 35

Por ejemplo: create table profesores (DNI varchar2(10), nombre varchar2(40), categoria char(4), ingreso date, primary key (DNI)); 6 create table asignaturas (codigo char(5), descripcion varchar2(35), creditos number(3,1) creditosp number(3,1), 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, sin filas, lista para insertar datos en ellas (orden insert, a continuación). Al crear una tabla, el resultado es persistente, la tabla no desaparece cuando nos desconectamos del servidor (tampoco los datos que almacenamos en ella). 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. Ahora podríamos volver a crear la tabla (sin filas), con los mismos o diferentes atributos, y volver a borrarla, y... LA ORDEN INSERT Para introducir datos nuevos en una base de datos vamos a utilizar la orden INSERT de SQL. 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. En principio, veremos la expresión mínima de la orden, formada por dos cláusulas, into y values. INSERT INTO nombretabla VALUES ( listaexpresiones ) Supongamos que en la base de datos anterior queremos dar de alta un nuevo profesor. Si dicho profesor tiene como dni el 55555555, nombre PATRICIO MARTÍNEZ, categoría TU y fecha de incorporación 01/01/2000, deberíamos ejecutar la siguiente orden. 6 Para facilitar su uso, 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, a continuación, se va a ejecutar otra orden distinta. Si sólo se escribe una orden no hace falta este caracter. No obstante, por la implementación del cliente Worksheet, se aconseja terminar todas las órdenes con punto y coma, incluso si sólo es una. 36

Insert into profesores values ( 55555555, PATRICIO MARTINEZ, TU, 01/01/2000 ); resultado: 1 fila creada Sólo se puede indicar una tabla en la que introducir datos, no se permite una lista de nombres de tabla para introducir datos en varias tablas a la vez. Para introducir datos en n tablas, habrá que ejecutar n sentencias INSERT. insert into profesores, asignaturas values ( 55555555, PATRICIO MARTINEZ, TU, 01/01/2000, BdI, BASES DE DATOS I,6,0); resultado: ERROR falta la palabra clave values Lo mismo ocurre con las filas, sólo se puede indicar una lista de valores. 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, ERNESTO PEREZ, ASO6, 10/10/2001 ); resultado: 1 fila creada Resultado El resultado que devuelve una orden INSERT, será siempre el número de filas insertadas, en el caso de que la ejecución haya sido correcta. Para los casos en que la ejecución de la sentencia viole alguna restricción de la BD y por tanto, su ejecución no sea correcta, el resultado indicará cuál es la restricción violada. El SGBD, cada vez que insertamos un nuevo dato en una tabla, se encarga de verificar las restricciones activas, en nuestro caso las claves primarias, que como sabemos, no admiten valores duplicados, ni valores nulos. insert into profesores values ( 66, PEPITO, XXX, 11/11/2006 ); resultado: ERROR restricción única (BDI.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. Así, si por ejemplo, sólo supiéramos el dni y el nombre del profesor que queremos dar de alta, ejecutaríamos la sentencia siguiente Insert into profesores (dni, nombre) values ( 88888888, ARMANDO SUAREZ ); resultado: 1 fila creada Es recomendable acostumbrarse a poner siempre las columnas a las que se va a dar valor, sean o no todas las de la tabla. Las razones que lo aconsejan son: 8 Nombre de la restricción. 37

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. Si por alguna razón se modifica la estructura de una tabla, es decir, se añaden columnas nuevas, y tenemos costumbre de no indicar las columnas cuando se inserta valor a todas, con la modificación dejarán de funcionar las sentencias que tuviéramos escritas. Existe la posibilidad de hacer uso del valor NULL. Puesto que NULL es la ausencia de valor, si lo asignamos como valor a una columna de una tabla, lo que estaremos haciendo es indicar que esa columna no tiene valor. La siguiente sentencia realiza la misma operación que la anterior. Insert into profesores (dni,nombre,categoria,ingreso) values ( 88888888, ARMANDO SUAREZ, NULL, NULL); resultado: 1 fila creada La lista de valores se asigna a la lista de columnas, de forma que la primera columna toma el primer valor, la segunda el segundo y así sucesivamente. Es decir, las dos sentencias siguientes realizan exactamente la misma operación, aunque el orden de asignación es diferente. Insert into profesores (dni,nombre,categoria) values ( 88888888, ARMANDO SUAREZ, NULL); resultado: 1 fila creada Insert into profesores (categoria,dni,nombre) values (NULL, 88888888, ARMANDO SUAREZ ); resultado: 1 fila creada Ésto apoya aún más el hecho de que sea aconsejable poner siempre la lista de columnas, ya que aún dando valor a todas las columnas de la tabla, si no las indicamos, la lista de valores deberá seguir el orden que esas columnas tienen internamente en la tabla. Es decir, estaremos obligados a mirar las columnas y su orden, para poder establecer el orden adecuado en la lista de valores. INFORMACIÓN SOBRE UNA TABLA Recordemos que ejecutar DESC nombretabla o DESCRIBE nombretabla, muestra información sobre las columnas que componen la tabla, el orden interno de las mismas en la tabla, y sus tipos de datos. 38 INFORMACIÓN SOBRE LAS RESTRICCIONES DE UNA TABLA En el momento de crear una restricción, además de especificar las reglas que se deben cumplir, podemos dar un nombre a la misma. Para establecer los nombres de las restricciones, se suele seguir el siguiente convenio: ser nombres descriptivos y empezar, por ejemplo, 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. No vamos a profundizar más en los nombres de las restricciones ni en la sintaxis para crearlos, pero sí que debemos saber que si no especificamos ningún nombre, Oracle asigna un nombre único a cada restricción con el formato SYS_Cn, siendo n un valor entero.