0% encontró este documento útil (0 votos)
260 vistas

Practicas06 PDF

Este documento presenta un esquema de base de datos para gestionar información docente con tres tablas - PROFESORES, ASIGNATURAS e IMPARTE - y proporciona ejemplos de consultas SQL SELECT básicas sobre estas tablas para seleccionar y proyectar filas y columnas según criterios especificados.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
260 vistas

Practicas06 PDF

Este documento presenta un esquema de base de datos para gestionar información docente con tres tablas - PROFESORES, ASIGNATURAS e IMPARTE - y proporciona ejemplos de consultas SQL SELECT básicas sobre estas tablas para seleccionar y proyectar filas y columnas según criterios especificados.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 88

prcticas 2006-07

Bases de Datos I
Eva Gmez Ballester
Paloma Moreda Pozo
Patricio Martnez Barco
Jos Clavel Cerro
Ernesto Prez Lpez
Armando Surez Cueto

Dpto. de Lenguajes y
Sistemas Informticos
Escuela Politcnica Superior

Universidad de Alicante
http://www.dlsi.ua.es/asignaturas/bd1/bd1.html

ndice
sesin 0_______________________________________________ 5
select 1 ______________________________________________ 11
select 2 ______________________________________________ 23
select 3 ______________________________________________ 29
select fecha___________________________________________ 35
conjuntos ____________________________________________ 39
funciones_____________________________________________ 45
group by - having ______________________________________ 59
subselect _____________________________________________ 65
subselect - exists ______________________________________ 71
adicionales 1 __________________________________________ 75
adicionales 2 __________________________________________ 77
adicionales 3 __________________________________________ 79
adicionales 4 __________________________________________ 81
adicionales 5 __________________________________________ 83
adicionales 6 __________________________________________ 85
adicionales 7 __________________________________________ 87

sesin 0

MANEJO DE SQL
WORKSHEET
Objetivos:
Adquirir la destreza mnima para trabajar en el entorno ORACLE SQL
WORKSHEET
Contenidos

Concepto de Base de Datos y Tabla.


Entrar en ORACLE SQL Worksheet.
Manejo de mens.
Seleccin de Base de Datos.
Tipos de datos.
Ayuda en lnea.
Salvar y recuperar rdenes SQL.

Concepto de Base de Datos y Relacin (Tabla)


Una base de datos es un conjunto de informacin interrelacionada que representa un sistema
de informacin particular, y est compuesta por relaciones, o ms comnmente tablas, que
almacenan los datos referentes a un objeto o a una interrelacin entre objetos.
As, si queremos mantener mediante un gestor de bases de datos informacin 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 informacin se llamar Ejemplo, y las tablas contenidas en ella
se presentan en el siguiente cuadro.
Base de Datos: Ejemplo
PROFESORES ( dni : char(9), nombre : char(25), categora : char(4), fechainc : date )
Clave primaria: dni
ASIGNATURAS ( cdigo : char(5), descripcin : char(40), crditos : decimal(3,1),
crditosp : decimal(3,1) )
Clave primaria: cdigo
IMPARTE ( dni : char(9), asignatura : char(5) )
Clave primaria: (dni, asignatura)
Clave ajena: dni PROFESORES
Clave ajena: asignatura ASIGNATURAS

Extensiones de Ejemplo:

ASIGNATURAS

cdigo descripcin

crditos crditosp

HI
FBD
DGBD
PC
FP

4.5
6.0
6.0
6.0
9.0

HISTORIA DE LA INFORMATICA
FUNDAMENTOS DE LAS BASES DE DATOS
DISEO Y GESTION DE BASES DE DATOS
PROGRAMACION CONCURRENTE
FUNDAMENTOS DE LA PROGRAMACION

1.5
3.0
1.5
4.5

PROFESORES

IMPARTE

dni

nombre

categora fechainc

dni

asignatura

21111222
21222333
21333444

EVA GOMEZ
MANUEL PALOMAR
RAFAEL ROMERO

TEU
TEU
ASO6

21111222
21111222
21333444

FBD
DGBD
PC

01/10/1993
16/06/1989
16/06/1992

Ejecutar SQL Worksheet


Esta primera sesin es de contacto con el sistema Oracle 1 y la herramienta cliente SQL
Worksheet.
Oracle es un sistema de gestin de bases de datos relacional. Dicho gestor est instalado en
un servidor al que se accede por red desde un cliente Windows.

Como entrar al sistema.


1.

Arrancar el ordenador y, cuando la pantalla muestre el mensaje

lilo:
teclear la palabra
windows
2.

Una vez aparezca en la pantalla de entrada a Windows introduciremos los datos de


usuario asignados por la EPS2

Cmo ejecutar SQL WORKSHEET.


3.

En el escritorio nos encontraremos con un icono de acceso directo al programa SQL


Worksheet. Pulsando con la tecla izquierda del ratn dos veces sobre l conseguiremos
ejecutar la herramienta cliente.

En el caso de que no existiera el acceso directo en el escritorio, pinchar el botn de Inicio y


elegir las opciones Programas, Oracle, SQL Worksheet.
El primer dilogo que aparece en la pantalla nos pedir informacin sobre:

Usuario: alumno
Contrasea: alumno
Servicio: oracle
Conectar como: normal

Actualmente, Oracle 9.

Este proceso puede cambiar de unas aulas a otras.

El cliente entrar en la pantalla de edicin con la base de datos PROVEEDORES 3 seleccionada,


listo ya para editar y ejecutar rdenes SQL.

Cmo abandonar SQL WOKSHEET.


En el men Archivo, elegir la opcin Salir.

Manejo de SQL WORKSHEET.


En la pantalla de introduccin de datos podemos observar la pantalla dividida en dos:
Parte superior de la pantalla: aqu se escriben y almacenan temporalmente las
instrucciones SQL
Parte inferior de la pantalla: muestra los resultados de la ejecucin de una instruccin
Adems, en la parte izquierda, tenemos una barra de botones que incluye las siguientes
funciones, de arriba a abajo:
Conectar a un servidor
Ejecutar la instruccin SQL escrita actualmente
Historial de comandos
Instruccin anterior
Instruccin posterior
Ayuda (depende de la instalacin)
Repaso rpido (depende de la instalacin)
En el men Archivo, adems, podemos encontrar la opcin Guardar entrada
como, que nos permite grabar la orden SQL (parte superior). La opcin Guardar
salida como hace lo propio con el resultado de la ejecucin (parte inferior).

Tipos de datos
En general, la utilizacin de varias tablas necesita que ellas se puedan relacionar por una
columna comn, en este caso dni de profesor, para la relacin entre imparte y profesor, y cdigo
de asignatura, para la relacin entre asignatura e imparte. Ntese, sin embargo, que en la tabla
imparte el cdigo de asignatura se llama asignatura y en la tabla asignaturas cdigo. 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 acompaan 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 slo podremos comparar columnas con idntico tipo de
datos, o a la hora de manipular datos, dado que, como veremos en prximas sesiones, cada tipo
de datos presenta unos requisitos especficos para su manipulacin.
Algunos de los tipos de datos que nos podemos encontrar en ORACLE son:

VARCHAR2(n) Cadena de caracteres de longitud variable con un mximo de n


CHAR(n)
LONG
NUMBER(p,s)
RAW(n)
LONG RAW
DATE

(1<=n<=4000)
Cadena de caracteres de longitud fija de longitud n (1<=n<=2000)
Cadena de caracteres de longitud variable hasta 2 gigabytes, o 231-1 bytes
Nmeros con precisin p y escala s (1<=p<=38) (-84<=s<=127)
Cadena de caracteres binarios de longitud n (1<=n<=2000)
Cadena de caracteres binarios de longitud variable hasta 2 gigabytes
Datos de tipo fecha, con la forma dd/mm/yyyy(da, mes y ao). Los valores
date deben manejarse encerrados entre comillas simples. Rango vlido desde 1
de enero de 4712 AC hasta el 31 de diciembre de 4712 DC.

La base de datos PROVEEDORES ser la base de datos utilizada durante todo el desarrollo de las prcticas de BD1.

INFORMACIN ADICIONAL
Ayuda en lnea.
Direcciones con ayuda Oracle disponible:

www.oracle.com

www.redcientifica.com/

En general, es bastante fcil encontrar informacin en internet por medio de cualquier


buscador.

Obtener informacin sobre una tabla de la BD


Ejecutar DESC nombreTabla o DESCRIBE nombreTabla para mostrar informacin 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 precisin de la columna si el tipo de dato lo
requiere).
Otras informaciones disponibles en el catlogo 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 lnea, se puede dar formato a las
columnas con las siguientes rdenes, (es permanente para toda la sesin, slo se ejecutan una
vez; si se quiere otro formato, hay que volver a ejecutarlas con las modificaciones oportunas)

COLUMN
COLUMN
COLUMN
COLUMN
COLUMN
COLUMN

OWNER FORMAT a20


CONSTRAINT_NAME FORMAT A20
TABLE_NAME FORMAT A15
COLUMN_NAME FORMAT A20
POSITION FORMAT 99
DATA_TYPE FORMAT A15

Y tambin:

SET LINESIZE 600 (para evitar que la filas de salida,


includa la cabecera, ocupen , ms de una lnea)
SET PAGESIZE 200 (para evitar cabeceras tantas cabeceras)

Sobre guardar rdenes en disco


En la mquina 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 sesin para otra. Por lo tanto, si se quieren guardar datos con seguridad es
preferible hacerlo en disco flexible.
Para mantener los ficheros de una semana a otra recomendamos el uso del espacio en disco
de la EPS.

select 1

SQL - SELECT
Objetivos:
Introducir al alumno en el SQL y la orden SELECT.
Comentar el esquema lgico propuesto.
Contenidos:
Sistema de informacin propuesto.
La orden SELECT-FROM-WHERE.
Proyecciones, Selecciones.
Tipos de datos.
ORDER BY
Consultas 1.
Se detalla el esquema lgico que describe la BD de PROVEEDORES, ya creada y a
disposicin del alumno, intentando que comprenda su significado, el sistema real que
pretende representar. El esquema lgico es la referencia que permite construir las rdenes
select con las que interrogar a la BD. Las extensiones de cada relacin se incluyen como
ayuda para comprobar la correccin de las rdenes select utilizadas.
Tambin se proporciona informacin sobre las consultas ms sencillas a realizar sobre una
BD.
El resto de la sesin practicar con el primer grupo de requerimientos propuestos, cuyo
objetivo es familiarizarle con el entorno de trabajo SQL WorkSheet de ORACLE, y los
resultados que puede obtener.

11

LA BASE DE DATOS PROVEEDORES


TABLA
VENDEDOR

COLUMNAS
( numvend NUMBER(4),
nomvend VARCHAR2(30),
nombrecomer VARCHAR2(30),
telefono CHAR(11),
calle VARCHAR2(30),
ciudad VARCHAR2(20),
provincia VARCHAR2(20) )
( numpieza VARCHAR2(16),
nompieza VARCHAR2(30),
preciovent NUMBER(9,2))

RESTRICCIONES
Clave Primaria: (numvend)

PRECIOSUM

( numpieza VARCHAR2(16),
numvend NUMBER(4),
preciounit NUMBER(9,2),
diassum NUMBER(3),
descuento NUMBER(2))

Clave Primaria: (numpieza, numvend)


Clave Ajena: (numpieza) PIEZA,
Clave Ajena: (numvend) VENDEDOR

PEDIDO

( numpedido NUMBER(5),
numvend NUMBER(4),
fecha DATE )

Clave Primaria: (numpedido)


Clave Ajena: (numvend) VENDEDOR

LINPED

( numpedido NUMBER(5),
numlinea NUMBER(2),
numpieza VARCHAR2(16),
preciocompra NUMBER(9,2),
cantpedida NUMBER(4),
fecharecep DATE,
cantrecibida NUMBER(4))

Clave Primaria: (numpedido, numlinea)


Clave Ajena: (numpedido) PEDIDO
Clave Ajena: (numpieza) PIEZA

INVENTARIO

( numpieza VARCHAR2(16),
numbin NUMBER(10),
cantdisponible NUMBER(5),
fecharecuento DATE,
periodorecuen NUMBER(2),
cantminima NUMBER(5) )

Clave Primaria: (numbin)


Clave Alternativa: (numpieza)
Clave Ajena: (numpieza) PIEZA

PIEZA

Clave Primaria: (numpieza)

La base de datos pretende reflejar la poltica de compras de una empresa de distribucin. Se


compran (tablas PEDIDO y LINPED) ciertas mercancas a los distintos proveedores (tabla
VENDEDOR) y son vendidas posteriormente al pblico o a otros distribuidores (que no hemos
considerado en la BD)
Bsicamente, las tareas que se pretenden mecanizar son las siguientes (entre parntesis
aparecen las tablas directamente relacionadas con cada una):

Lista de suministradores (vendedor).


Los datos de los proveedores que nos suministran la mercadera que, posteriormente,
es vendida al pblico en general.

Catlogo de venta (pieza)


Las piezas que distribuye nuestra empresa y el precio de venta al pblico de las
mismas.

12

Lista de precios de suministro (preciosum, vendedor, pieza).


Conocer los precios a los que los proveedores nos podran suministrar las piezas. Es
informacin histrica cuyo origen no nos preocupa. No se debe confundir esta
informacin con la de los pedidos: los artculos 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 mercancas 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.
Lneas de pedido (tabla linped), donde un conjunto de lneas pertenecientes a un
mismo pedido se numeran desde la nmero 1 en adelante. Contiene el cdigo 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).
Slo aquellas piezas que aparezcan en una lnea de pedido han sido solicitadas al
correspondiente vendedor y, si la cantidad recibida es mayor que cero, habrn sido
recibidas por la empresa en esa cantidad.

Control de existencias (inventario, pieza).


Mediante la confeccin de un inventario, donde cada entrada, que corresponde a un
nico artculo, es el recuento real de existencias.

13

tabla VENDEDOR
numvend
1
2
3
4
5
6
7
8
9
10
11
12
13
8001
8002
8003
100
101
102
200
55
201

nomvend
AGAPITO LAFUENTE
DEL CORRAL
LUCIANO BLAZQUEZ
VAZQUEZ
GODOFREDO MARTIN
MARTINEZ
JUANITO REINA
PRINCESA
JUANITO REINA
PRINCESA
MANOLO PIEDRA
POMEZ
MANUEL PEREZ
RODRIGUEZ
LUISA PINTO HEREDIA
CHEMA PAMUNDI
GUSTAVO DE BASICA
MARIO DUQUE
LIZONDO
JOSE ANTONIO
MARTINEZ JUAN
MANUEL GOMEZ
SANTISTEBAN
JUAN RODRIGUEZ
JUAN
JUAN MARTINEZ
GARCIA
LUIS RODRIGUEZ
SALA
PEDRO GRACIA
MORALES
SALVADOR PLA
GARCIA
SOLEDAD MARTINEZ
ORTEGA
SEVERINO MARTIN
MARTINEZ
LUIS GARCIA
SATORRE
MANUEL ORTUO
LAFUENTE

nombrecomer

telefono

calle

Ciudad

provincia

MECEMSA

96-5782401

Avda. Valencia 3205

ALICANTE

ALICANTE

HARW S.A.

96-3232321

GENERAL LACY, 15 2
B

ALICANTE

ALICANTE

MECEMSA

96-4141722

AVDA. VALENCIA 3372

ALICANTE

ALICANTE

HARW S.A.

903-696969

LO ANGELE

LOS EU'S

LA DEAQUI

98-5363636

GIJON

ASTURIAS

HUMP S.A.

96-5660727

AVIACION 92, 3 I

SAN VICENTE

ALICANTE

DONDEQUIERAS,
1000, 13F
S. FRANCISCO DE
ASIS, 10 1

SOFTHARD
DISTRIBUIDORA S.A.
LA MEJOR S.A.
OLE ESPAA, S.A.
OLE ESPAA, S.A.

98-5696969

ARZOBISPO LOACES

999-2014455

BANESTOESSOFT S.L.

OXFORD BLUES

QUINTANAR DE LA
ORDE
NEW ORLEANS
RIVAS VACIAMADRID
RIVAS VACIAMADRID

LOUISSIANA
MADRID
MADRID

98-0101010

MOROS, 19

GIJON

ASTURIAS

OLE ESPAA, S.A.

3667788

COLON, 21

VALENCIA

VALENCIA

OLE ESPAA, S.A.

3667789

COLON, 21

VALENCIA

VALENCIA

ALMORADI

ALICANTE

HALA S.A.
HARW S.A.

3334455

CISCAR, 5

VALENCIA

VALENCIA

HARW S.A.

3335588

SALAMANCA, 102

VALENCIA

VALENCIA

SALAMANCA, 100

VALENCIA

VALENCIA

SOFT S.A.
TABAC & SOFT

5661100

MAYOR, 44

SAN VICENTE

ALICANTE

ASX. S.A.

87879998

PEREZ GALDOS, 54

ALICANTE

ALICANTE

SEVESOFT

5779988

GENERAL LACY, 17

ALICANTE

ALICANTE

HARW S.A.

5889944

POETA ALONSO, 12

ALICANTE

ALICANTE

HALA S.A.

5660788

MAYOR, 64

SAN VICENTE

ALICANTE

tabla PIEZA
numpieza
A-1001-L
C-1002-H
C-1002-J
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

14

TOLEDO

nompieza
MOUSE ADL 3B

FILTRO PANTALLA X200


DISCO DURO WESTERN DIG 210M 28
DISCO DURO 30M SEAGATE
DISKETTE 1.44 PANASONIC
PACK DISKETTE 144 PANASONIC
FLOPPY 1.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

preciovent
7,00
4,00
7,00
18,00
250,00
200,00
1,10
10,00
180,00
150,00
170,00
350,00
400,00
20,00
100,00
350,00
110,00
55,00
120,00
70,00

tabla PEDIDO
numpedido
1
2
3
4
5
6
7

numvend
1
1
2
2
1
5
8002

fecha
05/05/1992
11/10/1992
15/10/1992
16/10/1992
22/10/1992
22/08/1995
02/10/1992

tabla LINPED
numpedido
1
1
1
1
1
2
2
3
3
4
5
6
6
7

numlinea
1
2
3
4
5
1
2
1
2
1
1
1
2
1

numpieza
M-0001-C
P-0001-33
FD-0001-144
DD-0001-210
T-0002-AT
DK144-0002-P
T-0002-AT
DD-0001-210
P-0001-33
O-0002-PP
T-0002-AT
O-0001-PP
O-0002-PP
C-400-Z

preciocompra
300,00
210,00
135,00
150,00
31,00
5,45
30,00
146,00
210,00
99,00
15,00
15,00
99,00
7,00

cantpedida
10
20
20
20
22
100
1
15
3
10
15
1000
2000
45

fecharecep
10/05/1992
10/05/1992
10/05/1992
10/05/1992
17/10/1992
15/10/1992
15/10/1992
17/10/1992
17/10/1992
17/10/1992
11/06/1993
25/08/1995
25/08/1995
09/10/1992

cantrecibida
10
18
20
20
22
101
1
15
3
10
13
1000
1998
8

tabla INVENTARIO
numpieza
DD-0001-30
P-0001-33
O-0002-PP
M-0001-C
M-0003-C
DD-0001-210
FD-0001-144

numbin
1
2
3
4
5
6
7

cantdisponible
120
10
110
15
2
10
10

fecharecuento
15/10/1990
15/10/1992
15/10/1992
15/10/1992
20/10/1992
12/11/1992
12/11/1992

periodorecuen
1
1
2
1
2
2

cantminima
15
5
3
2
0
1
0

15

tabla PRECIOSUM
numpieza
A-1001-L
A-1001-L
A-1001-L
A-1001-L
C-1002-H
C-1002-J
C-400-Z
C-400-Z
DD-0001-210
DD-0001-210
DD-0001-210
DD-0001-30
DK144-0001
DK144-0002-P
DK144-0002-P
FD-0001-144
FD-0001-144
FD-0001-144
FD-0002-720
M-0001-C
M-0001-C
M-0002-C
M-0002-C
M-0003-C
M-0003-C
M-0003-C
O-0001-PP
O-0001-PP
O-0001-PP
O-0002-PP
O-0002-PP
O-0002-PP
O-0002-PP
P-0001-33
P-0001-33
P-0001-33
P-0001-33
P-0001-33
T-0001-IBM
T-0001-IBM
T-0001-IBM
T-0002-AT
T-0002-AT
T-0002-AT
T-0002-AT
T-0002-AT
T-0002-AT
T-0003-AT
T-0003-AT

16

numvend
3
4
100
1
1
1
1
8002
1
2
101
1
1
1
2
1
102
55
1
1
3
9
1
3
4
1
5
55
1
2
5
101
1
2
1
4
3
5
2
100
1
1
2
4
5
100
201
1
3

preciounit
5,00
4,90
4,00
2,00
0,50
1,50
8,50
7,00
150,00
170,00
140,00
120,00
0,56
5,60
5,50
130,00
136,00
120,00
60,00
155,00
180,00
300,00
150,00
350,00
280,00
200,00
19,50
15,00
15,00
99,00
98,75
80,00
75,00
210,00
250,00
280,00
250,00
280,00
90,00
95,00
90,00
30,00
35,00
25,00
33,00
34,00
30,00
77,50
81,45

diassum
1
1
3
3
2
2
4
3
3
5
15
4
3
3
5
3
3
10
3
3
7
1
10
2
7
7
1
7
1
1
1
10
1
5
3
7
2
3
5
5
15
3
5
7
3
2
1
3

descuento

5
15
12
14

7
13
10
15
5
15
15

12

10
10

5
5

LA ORDEN SELECT-FROM-WHERE
Sintaxis general de la orden select
SELECT [ DISTINCT ] listaColumnas
FROM listaTablas
[ WHERE condicin ]
[ GROUP BY listaColumnas
[ HAVING condicin ] ]
[ 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 expresin mnima de la orden, formada por dos clusulas, select y from, que
obligatoriamente tendremos que especificar en cada consulta que realicemos.
Supongamos que sobre la base de datos Ejemplo 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

nombre

EVA GMEZ
MANUEL PALOMAR
RAFAEL ROMERO

categora

TEU
TEU
ASO6

Al especificar en la lista de atributos un asterisco le indicamos al SGBD que deseamos la


informacin de todas las columnas definidas para la tabla PROFESORES.
Si deseamos conocer a qu categoras pertenecen los profesores que se encuentran en la BD:
select categora from profesores
resultado:

categora
TEU
TEU
ASO6

Podemos especificar tantas columnas como queramos:


select nombre, categora from profesores
resultado:

nombre

EVA GMEZ
MANUEL PALOMAR
RAFAEL ROMERO

categora

TEU
TEU
ASO6

17

Para evitar la salida de filas duplicadas podemos utilizar el modificador DISTINCT:


select distinct categora from profesores
resultado:

categora
TEU
ASO6

Ntese, sin embargo, que las dos rdenes siguientes obtienen el mismo resultado, puesto que
la duplicacin se refiere a filas completas y no a una columna en particular:
select distinct dni, categora from profesores
select dni, categora from profesores
resultado:

dni

21111222
21222333
21333444

categora
TEU
TEU
ASO6

La clusula WHERE
Con la orden select-from obtenemos la informacin de las columnas requeridas de toda la
tabla. Si nicamente queremos informacin de aquellas filas que cumplen una determinada
condicin utilizaremos la clusula where.
Pretendemos obtener el nombre de los profesores titulares:
select nombre from profesores where categora = 'TEU'
resultado:

nombre

EVA GMEZ
MANUEL PALOMAR

En la construccin de tales condiciones podemos utilizar las conectivas lgicas AND, OR, y
NOT, as como los parntesis para alterar la evaluacin de izquierda a derecha. Tambin, los
operadores de comparacin >, <, >=, <=, <>
Nombre de los profesores que son titulares o asociados a 6 horas:
select nombre from profesores
where categora = 'TEU' or categora = 'ASO6'
resultado:

18

nombre

EVA GMEZ
MANUEL PALOMAR
RAFAEL ROMERO

La clusula 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 nmero de crditos:
select crditos, descripcin from asignaturas order by crditos
resultado:

crditos

4.5
6
6
6
9

descripcin

Historia de la Informtica
Fundamentos de las Bases de Datos
Diseo y Gestin de Bases de Datos
Programacin Concurrente
Fundamentos de la Programacin

Si no se indica nada la ordenacin ser ascendente.


El mismo requerimiento anterior pero en orden descendente y de aquellas que tienen ms de
4.5 crditos:
select crditos, descripcin from asignaturas
where crditos > 4.5
order by crditos desc
resultado:

crditos
9
6
6
6

descripcin

Fundamentos de la Programacin
Fundamentos de las Bases de Datos
Diseo y Gestin de Bases de Datos
Programacin Concurrente

Puede aplicarse ms de un criterio de ordenacin:


select crditos, descripcin from asignaturas order by crditos, descripcin
resultado:

crditos

4.5
6
6
6
9

descripcin

Historia de la Informtica
Diseo y Gestin de Bases de Datos
Fundamentos de las Bases de Datos
Programacin Concurrente
Fundamentos de la Programacin

Constantes
Se pueden explicitar constantes en la orden select de forma que dicho valor aparezca en
todas las filas:
select 'La asignatura ', descripcin, ' tiene ', crditos, ' crditos'
from asignaturas
order by crditos
resultado:
'laasignatura'
La asignatura
La asignatura
La asignatura
La asignatura
La asignatura

descripcin
HISTORIA DE LA INFORMATICA
FUNDAMENTOS DE LAS BASES DE DATOS
DISEO Y GESTION DE BASES DE DATOS
PROGRAMACION CONCURRENTE
FUNDAMENTOS DE LA PROGRAMACION

'tiene' crditos 'crditos


tiene
4.5 crditos
tiene
6
crditos
tiene
6
crditos
tiene
6
crditos
tiene
9
crditos

19

CONSULTAS SELECT1
1.

Obtener todos los nmeros 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.

Nmero, 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 algn suministrador, obtener el nmero de pieza y
el descuento, en orden descendente del valor de descuento.

5.

Nombre de los vendedores con nmero de vendedor menor que 6.

6.

Modificar el requerimiento anterior para eliminar duplicados.

7.

Nmero y nombre de los vendedores con nmero de vendedor menor que 6.

8.

Obtener todos los nmeros 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. Nmeros de vendedores y das que tardaran en suministrar la pieza 'P-0001-33'
12. Cdigos de pieza solicitados en el pedido 1, ordenados de mayor a menor precio de
compra.
13. Nmeros de pedido y nmeros de vendedor, para los pedidos solicitados el 15 de octubre
de 1992.
14. Cdigos de pieza de los que se sabe que algn vendedor nos podra hacer descuento.
15. Cdigos de pieza, de posible suministrador y precio de suministro, ordenados por cdigo
de vendedor y cdigo de pieza.

20

SOLUCIONES SELECT1
Muchas de las soluciones tambin se muestran en lgebra relacional (AR) y clculo
relacional de tuplas (CRT), que son temas que se tratarn ms adelante en las clases de
teora. En AR y CRT los resultados son relaciones, por lo tanto todas las soluciones que
se muestran aqu corresponden al enunciado al que se est dando respuesta, pero eliminando
duplicados. En CRT se consideran declaradas correctamente todas las variables utilizadas.
--1
select numpieza
from pieza
En AR PIEZA[numpieza]
En CRT {P.numpieza/PIEZA(P)}
--2
select nompieza
from pieza
where preciovent < 1000
En AR PIEZA donde preciovent<1000[nompieza]
En CRT {P.nompieza / PIEZA(P) P.preciovent<1000}
--3
select numpieza, nompieza, preciovent
from pieza
where preciovent > 10
or preciovent < 1
order by preciovent
(la ordenacin no se puede expresar ni En CRT ni En AR)
En AR PIEZA donde preciovent>10 o preciovent<1 [numpieza,nompieza,preciovent]
En CRT { P.nompieza, P.nompieza, P.preciovent /
PIEZA(P) P.preciovent>1000 P.preciovent<10000}
--4
select numpieza, descuento
from preciosum
order by descuento desc
En AR PRECIOSUM [numpieza, descuento]
En CRT {P.numpieza, P.descuento / PRECIOSUM(P)}
--5
select nomvend
from vendedor
where numvend < 6
--6
select distinct nomvend
from vendedor
where numvend < 6
En AR VENDEDOR donde numvend<6 [nomvend]
En CRT {V.nomvend / VENDEDOR(V) V.numvend<6}
--7
select numvend, nomvend
from vendedor
where numvend < 6
En AR VENDEDOR donde numvend<6 [numvend, nomvend]
En CRT {V.numvend, V.nomvend / VENDEDOR(V) V.numvend<6}
--8
select distinct numvend
from preciosum

--9
select numvend, nomvend
from vendedor
where provincia = 'ALICANTE'

--10
select nomvend, nombrecomer
from vendedor
where provincia = 'ALICANTE'
or provincia = 'CASTELLON'

21

or provincia = 'VALENCIA'

--11
select numvend, diassum
from preciosum
where numpieza = 'P-0001-33'

--12
select numpieza
from linped
where numpedido = 1
order by preciocompra desc

--13
select numpedido, numvend
from pedido
where fecha = '15/10/1992'

--14
select distinct numpieza
from preciosum
where descuento is not null

--15
select numvend, numpieza, preciounit
from preciosum
order by numvend, numpieza

22

select 2

CONSULTAS SOBRE
VARIAS TABLAS
Objetivos:
Poder relacionar distintas tablas de la BD para obtener informacin ms compleja.
Contenidos
Utilizacin de ms de una tabla.
Nombres cualificados de atributo.
Sinnimos temporales de tabla.
Tipos de datos: dominios.
Resolucin de requerimientos

UTILIZACIN DE MS DE UNA TABLA


Para la resolucin de la mayora de requerimientos es necesario trabajar con informacin 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 clusula FROM.
Si seleccionamos la BD Ejemplo, podemos preguntar por el nombre de los profesores y la
descripcin de las asignaturas que imparten; esta informacin se encuentra almacenada en la
tabla imparte, que relaciona las claves primarias de cada una de las tablas asociadas por tal
relacin.
select nombre, descripcin
from asignaturas, imparte, profesores
where
profesores.dni = imparte.dni
and asignatura = cdigo
resultado:

nombre

EVA GMEZ
EVA GMEZ
RAFAEL ROMERO

descripcin

Fundamentos de las Bases de Datos


Diseo y Gestin de Bases de Datos
Programacin Concurrente

En primer lugar, solicitamos nombre (del profesor) y descripcin (de la asignatura). El primer
atributo se encuentra en la tabla profesores, y el segundo en la de asignaturas. La relacin entre
ambas tablas se encuentra en la tabla imparte, que asocia dni de profesor con cdigo de
asignatura que imparte. As, para obtener la informacin 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
cdigo de asignatura, en la columna nominada como asignatura; buscando en la tercera tabla,
asignaturas, obtendr la descripcin y finalmente mostrar en pantalla el nombre y la descripcin
que le corresponde.
23

Ntese que no aparece MANUEL PALOMAR, o la asignatura HISTORIA DE LA INFORMTICA,


puesto que ni el primero (en nuestra BD) imparte asignatura alguna, ni la segunda es impartida
por ningn profesor (de los conocidos por nuestro sistema).
Qu pasara si no utilizramos la clusula where para enlazar las tablas? Supongamos el
siguiente requerimiento:
select asignatura, nombre
from profesores, 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 clusula where la informacin que obtenemos es simplemente la


combinacin de cada tupla con todas las dems: si hay 3 tuplas en imparte y otras 3 en
profesores, la cardinalidad de la relacin resultante es 3 x 3 = 9 tuplas. Si en la clusula from
pusiramos, adems, la tabla asignaturas, el resultado final tendra 3 x 3 x 5 = 45 tuplas.
Veamos en detalle como funciona la orden select-from-where para el caso de la siguiente
consulta (cdigos de asignaturas y nombre de los profesores que las imparten) 4 :
select asignatura, nombre
from profesores, imparte
where profesores.dni = imparte.dni
resultado:

asignatura

FBD
DGBD
PC

nombre

EVA GOMEZ
EVA GOMEZ
RAFAEL ROMERO

El SGBD primero combinara todas las tuplas con todas de las tablas especificadas en el from:
dni
21111222
21222333
21333444
21111222
21222333
21333444
21111222
21222333
21333444

nombre
EVA GOMEZ
MANUEL PALOMAR
RAFAEL ROMERO
EVA GOMEZ
MANUEL PALOMAR
RAFAEL ROMERO
EVA GOMEZ
MANUEL PALOMAR
RAFAEL ROMERO

categoria
TEU
TEU
ASO6
TEU
TEU
ASO6
TEU
TEU
ASO6

fechainc
01/10/1993
16/06/1989
16/06/1992
01/10/1993
16/06/1989
16/06/1992
01/10/1993
16/06/1989
16/06/1992

dni
21111222
21111222
21111222
21111222
21111222
21111222
21333444
21333444
21333444

asignatura
FBD
FBD
FBD
DGBD
DGBD
DGBD
PC
PC
PC

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.

24

Por lo especificado por la where eliminara aquellas tuplas que no cumplieran la condicin, y
nos quedara:
dni
21111222
21111222
21333444

nombre
EVA GOMEZ
EVA GOMEZ
RAFAEL ROMERO

categoria
TEU
TEU
ASO6

fechainc
01/10/1993
01/10/1993
16/06/1992

dni
21111222
21111222
21333444

asignatura
FBD
DGBD
PC

Y por ltimo, las columnas especificadas en la select determinaran el resultado final:


asignatura nombre
FBD
DGBD
PC

EVA GOMEZ
EVA GOMEZ
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 clusula from
existen varias con nombres iguales, deberemos especificar en todo momento la tabla de la que
queremos extraer la informacin. Caso de no existir ambigedad, no es necesario utilizar el
nombre de la tabla; ni asignatura ni cdigo 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

21111222
21111222
21333444

nombre

EVA GMEZ
EVA GMEZ
RAFAEL ROMERO

Se recuerda que la ocurrencia EVA GMEZ est relacionada con dos asignaturas, y es por eso que aparece duplicada
en este resultado. La forma de evitar tuplas idnticas ya se mostr en la sesin anterior.

SINNIMOS 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 cuestin de la siguiente.

25

select distinct p.dni, nombre


from profesores p, imparte i
where p.dni = i.dni
resultado:

dni

21111222
21333444

26

nombre

EVA GMEZ
RAFAEL ROMERO

CONSULTAS SELECT2
1.

Obtener el nmero de pieza junto con el nombre de todas las provincias desde las que
puede sernos suministrada, en orden descendente del nmero de pieza.

2.

Modificar el requerimiento anterior para eliminar duplicados.

3.

Lista el nombre y nmero de las piezas.

4.

Obtener el nombre y nmero de proveedores de la provincia de Valencia.

5.

Obtener el nombre y nmero de proveedores de la provincia de Valencia a los que se les


ha solicitado un pedido.

6.

Obtener los nmeros de lnea y su precio de compra del pedido nmero 1.

7.

Obtener todas las piezas que se recuenten el 15 /10/1992.

8.

Obtener nmero y nombre de todas las piezas recibidas el 1 de Mayo de 1992.

9.

Precio unitario de suministro del nmero 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, telfono, 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 ms de
10%.
13. Obtener los nmeros de pedido del vendedor nmero 1.
14. Obtener los vendedores ordenados alfabticamente en orden descendente.
15. dem en orden ascendente.
16. Obtener los nmeros de pieza de las que conozcamos algn vendedor que nos la pueda
suministrar.
17. Nmero y nombre de las piezas que puedan suministrarnos el vendedor nmero 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.
19. Nmero, nombre y precio de venta de las piezas que han sido compradas en un pedido
servido por el vendedor 1.
20. Nmero 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. Nmero de pieza y nmero 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
nmero y nombre de los vendedores que las podran suministrar a esos precios.

27

SOLUCIONES SELECT2
--2
select distinct numpieza, provincia
from preciosum ps, vendedor v
where ps.numvend = v.numvend
order by numpieza desc
(En AR y C.R.T. no se puede hacer order by)
En AR Vendedor Preciosum [numpieza, provincia]
En CRT {PS.numpieza, V.provincia/ Preciosum(PS)
V(Vendedor(V) PS.numvend=V.numvend) }
--9
select preciounit
from preciosum
where numvend = 100 and numpieza='A-1001-L'
En AR Preciosum donde numvend=100 y numpieza=A-1001-L
[precionuit]
En CRT {PS.preciounit / Preciosum(PS) numvend=100
numpieza=A-1001-L }
--17
select p.numpieza, nompieza
from preciosum ps, pieza p
where ps.numpieza=p.numpieza
and (numvend = 2
or numvend = 4)
En AR Pieza Preciosum donde numvend=2 o numvend=4
[numpieza, nompieza]
En CRT {P.numpieza, P.nompieza/ Pieza(P) PR
(Preciosum(PR) P.numpieza=PR.numpieza (numvend=2
numvend=4)) }
--19
select nompieza, l.numpieza, preciovent
from pieza pz, pedido p,linped l
where numvend = 1
and p.numpedido=l.numpedido
and l.numpieza=pz.numpieza
En AR Pieza Linped Pedido donde numvend=1 [numpieza,
nompieza, preciovent]
En CRT {P.numpieza, P.nompieza P.preciovent/ Pieza(P) LP
(Linped(LP) P.numpieza=LP.numpieza P (Pedido(P)
LP.numpedido=P.numpedido numvend=1)) }

28

select 3

EXPRESIONES DE
SELECCIN DE FILAS
Objetivos:
Comparaciones de cadenas de caracteres.
Contenidos
BETWEEN, IN
LIKE, subcadenas.
Construccin de expresiones de seleccin de filas utilizando rangos, listas, y funciones de
comparacin de cadenas de caracteres.

RANGOS
Expresiones del tipo 10 <= x <= 100 se pueden construir utilizando el operador de
construccin de rangos BETWEEN.
La sintaxis de tal subexpresin de la clusula where es la siguiente:

expresin [NOT] BETWEEN expresin AND expresin


Por ejemplo, deseamos conocer los crditos y descripcin de las asignaturas cuyo nmero de
crditos est entre 5 y 8.

select crditos, descripcin from asignaturas where crditos between 5 and 8


resultado:

crditos
6
6
6

descripcin

Fundamentos de las Bases de Datos


Diseo y Gestin de Bases de Datos
Programacin Concurrente

LISTAS
Mediante el operador IN se puede buscar un determinado valor en una lista construida
mediante constantes.

expresin [NOT] IN (listaValores)

29

Descripcin de las asignaturas FBD y DGBD:

select descripcin from asignaturas where cdigo in ('FBD', 'DGBD')


resultado:

descripcin

Fundamentos de las Bases de Datos


Diseo y Gestin 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

Fijmonos en que MANUEL PALOMAR, que no imparte ninguna de las asignaturas objeto de la
bsqueda, 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 carcter. 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 carcter cualquiera.
Profesores que atiendan al nombre de 'RAFA':
select * from profesores
where nombre like 'RAFA%'
resultado:

dni

21333444

nombre

RAFAEL ROMERO

Cdigo de las asignaturas de 'Bases de Datos'


select cdigo from asignaturas
where descripcin like '%Bases de Datos%'
resultado:

30

cdigo
FBD
DGBD

categora

ASO6

Cdigo de las asignaturas, siendo tal cdigo de 2 caracteres:


select cdigo from asignaturas
where cdigo like '_ _'
resultado:

cdigo
HI
PC
FP

VALORES NULOS
Podemos interrogar a la BD de datos en busca de valores desconocidos
(informacin faltante) mediante el operador IS NULL, cuya sintaxis es:

columna IS [NOT] NULL


Cdigo y crditos de las asignaturas de las que conocemos su nmero de crditos:

select cdigo, crditos from asignaturas


where crditos is not null
resultado:

cdigo

crditos

HI
FBD
DGBD
PC
FP

4.5
6
6
6
9

RESUMEN DE OPERADORES
Recopilamos todos los operadores y conectivas lgicas vistos hasta ahora para la construccin
de expresiones condicionales:
=
>
<
>=
<=
<>
IS NULL

AND
OR
NOT

BETWEEN
IN

LIKE {%,_}

31

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 5 Martnez o Martn.

3.

Obtener los nombres de los vendedores de las provincias de Valencia, Castelln 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 Lpez.

7.

Nombre de vendedores que el nombre empieza por M seguido de cualquier carcter


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 nmero de vendedor entre 1 y 100.

9.

Listar los nombres y nmeros de vendedores as como el nmero 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 'Garca'.
11. Piezas 6 que sabemos que nos puede suministrar algn vendedor.
12. Obtener todos los vendedores que tengan telfono.
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 nmero oscile entre el 1 y el 1000.
14. Obtener los nombres de vendedores en orden alfabtico.
15. Obtener nombre de vendedores y nombre de piezas que pueden suministrar ordenado en
orden alfabtico.
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 nmero 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 nmeros de pieza que nos pueden suministrar, de
aquellos vendedores cuyo apellido comienza por Martn, y ordenados alfabticamente.

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.

Cuando no se especifica un atributo concreto, se entiende que se pide toda la informacin disponible
en la BD de los objetos solicitados.

32

SOLUCIONES SELECT3
En AR y CRT no existe el operador LIKE, ni el operador IS
NULL, as como tampoco se puede establecer un criterio para
ordenar el resultado.
--1
select nompieza
from pieza p, preciosum ps, vendedor v
where p.numpieza = ps.numpieza
and ps.numvend = v.numvend
and nomvend like 'S%'
--2
select nompieza
from pieza p, preciosum ps, vendedor v
where p.numpieza = ps.numpieza
and ps.numvend = v.numvend
and (nomvend like 'S% MARTIN %'
or nomvend like 'S% MARTINEZ %')
--3
select nomvend
from vendedor
where provincia in ('ALICANTE', 'VALENCIA', 'CASTELLON')
order by nomvend
En AR Vendedor donde provincia=Alicante o
provincia=Castelln o provincia=Valencia [nomvend]
En CRT {V.nomvend / Vendedor(V) (provincia=Alicante
provincia=Castellon provincia=Valencia)}
--7
select nomvend
from vendedor
where nomvend like 'M_R%'
order by nomvend
--12
select *
from vendedor
where telefono is not null
order by nomvend

33

select fecha

FUNCIONES DE FECHA7
Objetivos:
Construir condiciones de seleccin de filas utilizando atributos de tipo fecha.
Contenidos
TO_CHAR()
TO_DATE()
SYSDATE
ADD_MONTHS()
MONTHS_BETWEEN()

FUNCIONES DE FECHA
Se presentan a continuacin distintas funciones de manejo de fechas y hora, que se pueden
utilizar tanto en la lista de columnas que aparecern en la tabla resultado de la select como en la
construccin de expresiones de la where.
En general, la comparacin entre fechas se hace directamente. Por ejemplo:
select nombre from profesores where fechainc < 12/23/1989
select nombre from profesores where fechainc < 12-23-1989
resultado:

nombre

MANUEL PALOMAR

Pero si necesitamos hacer transformaciones sobre un determinado dato (extraer parte de una
fecha, cambiar el formato de visualizacin, calcular das, etc.) entonces debemos ayudarnos de
estas funciones.

TO_CHAR(fecha [, 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


TO_DATE(cadena [, formato]) 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 ms
MONTHS_BETWEEN(fecha1,fecha2) Devuelve los meses transcurridos entre fecha1 y fecha2

Aunque todas las dems sesiones de prcticas cumplen con el estndar 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 sesin es nicamente aplicable a Oracle.

35

FORMATOS DE FECHA
Las funciones TO_CHAR() y TO_DATE() admiten distintos formatos de fecha que se pueden
construir segn una mscara especificada por el usuario. Dicha mscara es una cadena de
caracteres entre comillas simples en la que se pueden utilizar los siguientes:
ELEMENTO
- / ' . ; : 'texto'
D
DAY
DD
DY
MM
MON
MONTH
Q
YYYY
Y,YYY
YY

SIGNIFICADO
Marcas de puntuacin y texto fijo que se reproduce en el resultado
Da de la semana (1-7)
Nombre del da de la semana
Da del mes (1-31)
Da del ao (1-366)
Mes (1-12)
Nombre abreviado del mes
Nombre completo del mes
Cuatrimestre del ao (1-4)
Ao con 4 dgitos
Ao con punto de millar
Ao con 2 dgitos

Por ejemplo:
select nombre, to_char (fechainc,'DD') from profesores where to_char(fechainc,'DD') < 15
select * from profesores where to_char(fechainc,'MM') < 6
select * from profesores where fechainc = sysdate

Para obtener el nmero de das entre dos fechas basta con utilizar la operacin resta
select sysdate-fechainc from profesores

36

CONSULTAS SELECT FECHA


1.

Obtener el nmero de pieza de las piezas que se recuenten el 15/10/92.

2.

Nmeros de pieza de las piezas que se recuentan entre el 1 de Octubre de 1992 y el 31


de Octubre de 1992.

3.

Nmero 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 alfabticamente.

5.

Nmero, nombre de vendedor y mes en que se les solicit un pedido de discos duros.

6.

Aos en que se ha efectuado algn recuento.

7.

Nmero y descripcin de las piezas que sirvieron los proveedores los das 10 de cada mes.

8.

Nmero y descripcin 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.

Nmero de pieza, descripcin, fecha de recepcin, cantidad recibida, de las piezas


recibidas en el 95 y de precio de venta entre 50 y 100 euros.

SOLUCIONES SELECT FECHA


--1
select numpieza
from inventario
where fecharecuento=15/10/1992
--2
select numpieza
from inventario
where fecharecuento >= '1/10/1992' and fecharecuento <='31/10/1992'
--3
select numpedido, fecha
from pedido
where fecha >= '1/7/1992' and fecha <= '31/12/1992';
select numpedido, fecha
from pedido
where to_char(fecha,'YY') = '92' and to_char(fecha,'MM') >= 6;
--4
select distinct nomvend
from vendedor v, pedido pd, linped l
where v.numvend = pd.numvend
and pd.numpedido = l.numpedido
and to_char(fecharecep,'YYYY') = 1992
and to_char(fecharecep,'MM') = 5
and to_char(fecharecep,'DD') <= 15
order by nomvend
--7
select distinct pz.numpieza, nompieza
from linped l, pieza pz
where l.numpieza = pz.numpieza
and to_char(fecharecep,'DD') = 10

37

conjuntos

OPERACIONES DE
CONJUNTOS
Objetivos:
Combinar el resultado de varias sentencias select en un nico resultado, utilizando los
operadores de conjuntos: unin, interseccin y diferencia.
Contenidos
Union, Union All
Intersect
Minus
Resolucin de requerimientos.

OPERADORES SOBRE CONJUNTOS


Un operador sobre conjuntos combina el resultado de dos sentencias SELECT en un nico
resultado. Para que se pueda realizar, las sentencias SELECT deben tener como resultado el
mismo nmero de columnas y los mismos tipos de datos (no es necesario que sean de igual
longitud).
Los operadores de conjuntos son la UNION, UNION ALL, INTERSECT y MINUS. En la versin de
Oracle con la que trabajamos, todos tienen la misma precedencia y se evalan de izquierda a
derecha. Si queremos alterar este orden debemos utilizar los parntesis.

UNION, UNION ALL


Al utilizar el operador UNION entre dos sentencias SELECT, el resultado final estar compuesto
por todas aquellas filas que aparecen en el resultado de como mnimo una de las SELECT. El
operador UNION elimina filas duplicadas en el resultado final. El operador UNION ALL opera de
igual modo que el operador UNION, pero no elimina filas duplicadas en el resultado final.
Supongamos que queremos saber el nombre de los profesores que son ASO6 o imparten
asignaturas de 6 crditos.
Se calcula cada SELECT por separado.
select nombre
from profesores
where categora=ASO6
resultado:

nombre
RAFAEL ROMERO

39

select nombre
from profesores p, imparte i, asignaturas
where p.dni=i.dni and asignatura=codigo and creditos=6
resultado:

nombre
RAFAEL ROMERO
EVA GMEZ
EVA GMEZ

En el resultado final aparecern todas las filas que estn en cualquiera de los dos resultados.
select nombre
from profesores
where categora=ASO6
UNION
select nombre
from profesores p, imparte i, asignaturas
where p.dni=i.dni and asignatura=codigo and creditos=6
resultado con UNION ALL:
nombre
RAFAEL ROMERO
RAFAEL ROMERO
EVA GMEZ
EVA GMEZ

con UNION
nombre
RAFAEL ROMERO
EVA GMEZ

INTERSECT
Al utilizar el operador INTERSECT entre dos sentencias SELECT, el resultado final estar
compuesto por todas aquellas filas que aparezcan en los resultados de ambas sentencias (no es
suficiente que aparezcan slo en el resultado de una de ellas)
Supongamos que queremos saber el nombre de los profesores que son ASO6 e imparten
asignaturas de 6 crditos.
select nombre
from profesores
where categora=ASO6
INTERSECT
select nombre
from profesores p, imparte i, asignaturas
where p.dni=i.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 estn
en ambos resultados.

MINUS
Al utilizar el operador MINUS entre dos sentencias SELECT, el resultado final estar compuesto
slo por aquellas filas que aparecen en el resultado de la primera SELECT y no aparecen en el
resultado de la segunda.
Supongamos que queremos saber el nombre de los profesores que son ASO6 y no imparten
asignaturas de 6 crditos.
40

select nombre
from profesores
where categora=ASO6
MINUS
select nombre
from profesores p, imparte i, asignaturas
where p.dni=i.dni and asignatura=codigo and creditos=6
resultado:

nombre

Supongamos que las condiciones hubiesen estado al revs. Queremos saber el nombre de los
profesores que imparten asignaturas de 6 crditos y no son ASO6.
select nombre
from profesores p, imparte i, asignaturas
where p.dni=i.dni and asignatura=codigo and creditos=6
MINUS
select nombre
from profesores
where categora=ASO6
resultado:

nombre
EVA GMEZ

Algunos de estos requerimientos se pueden resolver con una sola sentencia SELECT donde se
combinen de modo adecuado las condiciones. En otras ocasiones debemos recurrir a operar con
los resultados de varias sentencias. Por ejemplo, en estos dos ltimos enunciados, el segundo se
puede solucionar con una SELECT, mientras que en el caso del primero es necesario trabajar con
dos.

41

CONSULTAS CONJUNTOS
1.

Nombre de las empresas que tengan ms de dos vendedores o que pueda suministrar la
pieza A-1001-L.

2.

Nombre de las empresas que tengan ms de dos vendedores y que pueda suministrar la
pieza A-1001-L, al menos por medio de uno de ellos.

3.

Nombre de las empresas que tengan ms de dos vendedores y que ninguno de sus
vendedores pueda suministrar la pieza A-1001-L.

4.

Nmero de los pedidos en los que se soliciten teclados pero no monitores.

5.

Nmero y fecha del pedido que contiene piezas que no estn listadas en la lista de
suministros.

6.

Nmero y nombre de los vendedores que oferten alguna de las piezas que pueden ser
suministradas por el vendedor nmero 1, pero que no oferten ninguna de las que puedan
ser suministradas por el vendedor nmero 2.

7.

Nmero y nombre de las piezas con un precio de venta mayor que 1000, y que puedan
ser suministradas por el vendedor nmero 1.

42

SOLUCIONES CONJUNTOS
--1
select nombrecomer
from vendedor
group by nombrecomer
having count(*)>2
UNION
select nombrecomer
from vendedor v, preciosum ps
where v.numvend=ps.numvend and numpieza=A-10001-L
En AR Define alias V1, V2 para VENDEDOR
V1 V2 VENDEDOR donde V1.nombrecomer=V2.nombrecomer and
V2.nombrecomer=Vendedor.nombrecomer and
V1.numvend<>V2.numvend and V1.numvend<> VENDEDOR.numvend and
V2.numvend<>Vendedor.numvend [V1.nombrecomer]

(VENDEDOR PRECIOSUM DONDE NUMPIEZA=A-1001-L)


[nombrecomer]
En CRT {V1.nombrecomer / VENDEDOR(V1) V2(VENDEDOR(V2)
V1.nombrecomer=V2.nombrecomer V1.numvend<>V2.numvend
V3(VENDEDOR(V3) V2.nombrecomer=V3.nombrecomer
V1.numvend<>V3.numvend V2.numvend<>V3.numvend))
PS(PRECIOSUM(PS) PS.numvend=V1.nomvend numpieza=A1001-L}
--2
select nombrecomer
from vendedor
group by nombrecomer
having count(*)>2
INTERSECT
select nombrecomer
from vendedor v, preciosum ps
where v.numvend=ps.numvend and numpieza=A-10001-L
En AR Define alias V1, V2 para VENDEDOR
V1 V2 VENDEDOR donde V1.nombrecomer=V2.nombrecomer and
V2.nombrecomer=Vendedor.nombrecomer and
V1.numvend<>V2.numvend and V1.numvend<> VENDEDOR.numvend and
V2.numvend<>Vendedor.numvend [V1.nombrecomer]
(VENDEDOR PRECIOSUM DONDE NUMPIEZA=A-1001-L)
[nombrecomer]
En CRT {V1.nombrecomer / VENDEDOR(V1) V2(VENDEDOR(V2)
V1.nombrecomer=V2.nombrecomer V1.numvend<>V2.numvend
V3(VENDEDOR(V3) V2.nombrecomer=V3.nombrecomer
V1.numvend<>V3.numvend V2.numvend<>V3.numvend))
PS(PRECIOSUM(PS) PS.numvend=V1.nomvend numpieza=A1001-L}
--3
select nombrecomer
from vendedor
group by nombrecomer
having count(*)>2
MINUS
select nombrecomer
from vendedor v, preciosum ps
where v.numvend=ps.numvend and numpieza=A-10001-L
En AR Define alias V1, V2 para VENDEDOR
V1 V2 VENDEDOR donde V1.nombrecomer=V2.nombrecomer and
V2.nombrecomer=Vendedor.nombrecomer and
V1.numvend<>V2.numvend and V1.numvend<> VENDEDOR.numvend and
V2.numvend<>Vendedor.numvend [V1.nombrecomer]
(VENDEDOR PRECIOSUM donde numpieza=A-1001-L)
[nombrecomer]
En CRT {V1.nombrecomer / VENDEDOR(V1) V2(VENDEDOR(V2)
V1.nombrecomer=V2.nombrecomer V1.numvend<>V2.numvend
V3(VENDEDOR(V3) V2.nombrecomer=V3.nombrecomer
V1.numvend<>V3.numvend V2.numvend<>V3.numvend))

43

PS(PRECIOSUM(PS) numpieza=A-1001-L
V4(VENDEDOR(V4) PS.numvend=V4.numvend
V4.nombrecomer=V1.nombrecomer) ) }
--6
select v.numvend, nomvend
from vendedor v, preciosum ps1, preciosum ps2
where v.numvend=ps1.numvend and
ps1.numpieza=ps2.numpieza and numvend=1
MINUS
select v.numvend, nomvend
from vendedor v, preciosum ps1, preciosum ps2
where v.numvend=ps1.numvend and
ps1.numpieza=ps2.numpieza and numvend=2
En AR
(PRECIOSUM donde numvend=1 [numpieza] PRECIOSUM
VENDEDOR)[numvend, nomvend]
(PRECIOSUM donde numvend=2 [numpieza] PRECIOSUM
VENDEDOR)[numvend, nomvend]
En CRT {V1.numvend, V1.nomvend / VENDEDOR(V1)
PS1(PRECIOSUM(PS1) PS1.numvend=V1.numvend
PS2(PRECIOSUM(PS2) PS2.numvend=1
PS1.numpieza=PS2.numpieza
PS3(PRECIOSUM(PS3) PS3.numvend=V1.numvend
PS4(PRECIOSUM(PS4) PS4.numvend=2
PS3.numpieza=PS4.numpieza)) ) ) }
--7

Se podra hacer utilizando el operador INTERSECT, pero no es necesario.


select numpieza, nompieza
from pieza p, preciosum ps
where p.numpieza=ps.numpieza and preciovent>1000 and numvend=1
En AR
(PIEZA donde preciovent>1000 PRECIOSUM donde
numvend=1)[numpieza, nompieza]
En CRT {P.numpieza, P.nompieza / PIEZA(P) P.preciovent>1000
PS(PRECIOSUM(PS) PS.numpieza=P.numpieza
PS.numvend=1)}

44

funciones

ARITMTICA Y
FUNCIONES
AGREGADAS
Objetivos:
Obtencin de informacin calculada.
Contenidos
operaciones aritmticas: +, -, *, /
SUM(), AVG(), COUNT(), MAX(), MIN(), ROUND(), ABS().
etiquetas para columnas
Resolucin de requerimientos.
Introduccin de las funciones estadsticas aplicables a columnas enteras y de cuenta de
filas, as como la forma de realizar operaciones como suma, producto, etc., de valores
escalares.

OPERACIONES ARITMTICAS
Se pueden utilizar expresiones aritmticas tanto en la clusula select, para obtener una nueva
columna en la tabla resultado, como en la construccin de condiciones de seleccin de filas.
Nmero de horas semanales, en un slo semestre, que se imparten de cada asignatura:
select descripcin, (crditos/3)*2 from asignaturas
resultado:

descripcin

Historia de la Informtica
Fundamentos de las Bases de Datos
Diseo y Gestin de Bases de Datos
Programacin Concurrente
Fundamentos de Programacin

(crditos/3)*2

3
4
4
4
6

45

Descripcin de las asignaturas y nmero de horas semanales de las asignaturas con menos de
4 horas semanales de clase:
select descripcin, crditos from asignaturas where (crditos/3)*2 < 4
resultado:

descripcin

Historia de la Informtica

crditos
4.5

FUNCIONES AGREGADAS
Se dispone de una serie de funciones agregadas que retornan valores calculados sobre una
determinada columna. Estas funciones devuelven un nico valor para todas las tuplas
seleccionadas mediante la condicin de la clusula where; si no se especifica sta, el clculo se
realiza sobre la totalidad de la columna.
COUNT( *
COUNT( DISTINCT expr
SUM( [DISTINCT] expr
AVG( [DISTINCT] expr
MIN( expr
MAX( expr
ROUND( expr
ABS( expr

)
)
)
)
)
)
)
)

nmero de filas
nmero de valores distintos en la columna expr
suma de todos los valores en expr
promedio de todos los valores en expr
el ms pequeo de todos los valores en expr
el mayor de todos los valores en expr
redondea expr
valor absoluto de expr

Las funciones de tipo estadstico precisan que la expresin que se evale se construya sobre
columnas de tipo de datos numrico.
La expresin expr puede contener el nombre de una columna o un clculo sobre una o varias
columnas.
Si se especifica la palabra clave distinct la expresin obligatoriamente ha de ser un nombre de
columna, y se asume que la funcin se calcula nicamente sobre valores distintos de la expresin.
En ningn caso se pueden anidar funciones: avg ( min ( crditos ) ) no est permitido.
Cuntos profesores hay en nuestra BD?
select count( * ) from profesores
resultado:

( count( * ) )
3

Cuntas asignaturas de ms de 5 crditos hay en nuestra BD?


select count( * ) from asignaturas where crditos > 5
resultado:

( count( * ) )
4

Cuntas valores de crditos distintos hay en nuestra BD?


select count( distinct crditos ) from asignaturas
resultado:

( count )
3

46

Cul es la media de crditos por asignatura?


select avg( crditos ) from asignaturas
resultado:

( avg )
6.3

Cul es la media de horas por asignatura?


select avg( crditos*2/3 ) from asignaturas
resultado:

( avg )
4.2

Total de crditos ofertados en asignaturas de Bases de Datos:


select sum( crditos ) from asignaturas where cdigo like '%BD'
resultado:

sum( crditos )
12

ETIQUETAS PARA COLUMNAS


Dado que las expresiones calculadas no tienen un nombre especfico de columna en la salida
por pantalla, es conveniente "renombrarlas" para aclarar su significado.
Se pueden etiquetar las columnas de la tabla resultado aadiendo, antes de la coma si hubiera
ms columnas detrs, una cadena de no ms de 18 caracteres y sin espacios en blanco, tal como
se hace con los alias temporales de las tablas. Esta cadena de caracteres aparecer en el
encabezado de la columna.

select count( * ) num_asignaturas, avg(crditos) mediactos


from asignaturas
resultado:

num_asignaturas mediactos
5

6.30

47

CONSULTAS FUNCIONES
1.

Obtener la diferencia entre cantidad pedida y cantidad recibida de las lneas del pedido 1.

2.

Media de das de intervalo entre la fecha de envo del pedido 1 y de entrega de las
distintas piezas solicitadas en ese pedido

3.

Obtener la cantidad de provincias distintas de las que tenemos conocimiento de algn


proveedor.

4.

Mnima diferencia entre precio de compra y precio de suministro del vendedor al que se le
compr.

5.

Media de precios distintos de venta de piezas.

6.

Mximo descuento (en euros) de las piezas suministradas.

7.

Nmero, nombre y diferencia entre precio de venta y precio de compra de la(s) pieza(s)
que suministran los vendedores de Alicante.

8.

Mximo, mnimo y media de precio de venta de las piezas.

9.

Cantidad total de piezas que sabemos nos pueden suministrar los proveedores.

10. Cantidad de vendedores de nuestra BD.


11. Total de la diferencia en euros entre lo pagado por compra de artculos y sus respectivos
precios de suministro ofrecidos en su da por los proveedores si el segundo precio es
menor que el primero.

48

SOLUCIONES FUNCIONES
--1
select numlinea, cantrecibida-cantpedida diferencia
from linped
where numpedido = 1
--2
select avg(abs(fecha-fecharecep)) mediarecep
from linped l, pedido pd
where pd.numpedido = 1
and l.numpedido = pd.numpedido
--3
select count(distinct provincia) provincias
from vendedor
--4
select min(preciocompra-preciounit) minimo
from preciosum ps, pedido pd, linped l
where ps.numvend = pd.numvend
and pd.numpedido = l.numpedido
and l.numpieza = ps.numpieza
--5
select avg(distinct preciovent) mediaventa
from pieza

49

group by

INFORMACIN
AGRUPADA
Objetivos:
Obtencin de informacin calculada sobre grupos de filas.
Contenidos
GROUP BY
Resolucin de requerimientos.
Clasificacin de informacin en funcin de algn criterio especificado mediante la clusula
GROUP BY.

LA CLUSULA GROUP BY
Supongamos que queremos obtener la cantidad de asignaturas que imparte cada profesor:
select p.dni, nombre, count( * )
from profesores p, imparte i
where p.dni = i.dni
group by p.dni, nombre
resultado:

dni

21111222
21333444

nombre

EVA GMEZ
RAFAEL ROMERO

( count )
2
1

En esta ocasin, y por la utilizacin de la clusula group by, la cuenta de valores distintos de la
columna asignatura se calcula en base a cada profesor de nuestra BD que imparte alguna
asignatura.
El criterio de agrupacin se forma con al menos todas las columnas no calculadas de la lista de
la clusula select.
No se pueden poner columnas no calculadas en la select que no aparezcan en la group
by.
select p.dni, nombre, count( * )
from profesores p, imparte i
where p.dni = i.dni
group by p.dni
resultado:

ERROR

51

Si se pueden poner ms columnas en la lista del group by que en la de la select.


select nombre, count( * )
from profesores p, imparte i
where p.dni = imparte.dni
group by p.dni, nombre
resultado:

nombre

( count(*) )

EVA GMEZ
RAFAEL ROMERO

2
1

where y group by
Cuando se utiliza la clusula where, aparte de enlazar tablas por columnas comunes, como
PROFESORES e IMPARTE por profesores.dni e imparte.dni respectivamente, se puede utilizar para
eliminar ciertas filas del clculo.
As, si queremos calcular cuantas asignaturas imparte cada profesor sin contar Fundamentos
de las Bases de Datos, escribiremos la siguiente sentencia.

select nombre, count( * )


from profesores p, imparte i
where p.dni = i.dni
and asignatura <> 'FBD'
group by p.dni, nombre
resultado:

nombre

EVA GMEZ
RAFAEL ROMERO

( count(*) )

1
1

ATRIBUTOS NO CLAVE EN EL GROUP BY


Los nicos atributos que aseguran la identificacin de una tupla respecto de las dems son los
que forman la clave primaria (en general, la clave candidata).
As, si la clave primaria de una tabla de personas (profesores o alumnos, por ejemplo) es el
D.N.I., podemos decir sin equivocarnos que no habr duplicados en este atributo. No obstante, el
nombre no ser clave y, por lo tanto, admite duplicados. Es decir, es perfectamente posible
encontrar a dos personas distintas (con nmeros de D.N.I. diferentes, obviamente) que se llamen
igual (nombres y apellidos).
Si, por ejemplo, agrupamos datos por el nombre y no por el D.N.I. podemos obtener
informacin en una nica fila de dos personas diferentes que se llaman igual. Sea una ocurrencia
tal como sta:
DNI
21
22

52

CLIENTE
NOMBRE
JUAN
JUAN

OPERACIN
1
2
3

INGRESO
CLIENTE
21
22
22

INGRESO
1000
2000
3000

select nombre, avg( ingreso ) media


from cliente, ingreso
where dni = cliente
group by nombre
resultado:

nombre
JUAN

media

2000

Puesto que el nombre es el mismo para los dos clientes, la agrupacin contabiliza todas las
ocurrencias de ingreso como de uno slo. Sin embargo, si introducimos en la lista de columnas del
GROUP BY aquellas que son su clave primaria:
select nombre, avg( ingreso ) media
from cliente, ingreso
where dni = cliente
group by dni, nombre
resultado:

nombre
JUAN
JUAN

media

1000
2500

Es evidente que, si queremos saber exactamente de a qu cliente nos referimos en cada tupla
del resultado, debemos incluir la clave primaria como atributo de la relacin derivada de la
ejecucin de la select.
En general, y aunque no afecte al resultado, evitaremos la no inclusin de atributos clave en la
clusula group by.

ORDENACIN DE LA SALIDA
En la clusula order by podemos especificar la expresin tal cual aparece en la select.
select dni, count( * ) asignaturas from profesores group by p.dni, nombre order by count( * )
resultado:

dni

21333444
21111222

asignaturas

1
2

O bien podemos utilizar una alias para la columna (asignaturas en este ejemplo) o el orden de
la columna empezando por la izquierda (la funcin est en la tercera columna en este ejemplo):
select dni, count( * ) asignaturas
from profesores
group by p.dni, nombre
order by asignaturas
select dni, count( * ) asignaturas
from profesores
group by p.dni, nombre
order by 2

53

resultado:

dni
21333444
21111222

asignaturas
1
2

55

CONSULTAS GROUP BY
NOTA:

es muy recomendable, aunque no se especifique explcitamente en el


requerimiento, que la salida se ordene ascendentemente (por defecto)
por las columnas no calculadas de la lista de la clusula select.

NOTA:

as mismo, se deben etiquetar las columnas calculadas.

1.

Obtener para cada pieza, nombre de la pieza, precio de venta, y la media de la diferencia
entre el precio de venta y el de suministro.

2.

Obtener para cada nmero de pedido, el precio pagado en total por ese pedido, la cantidad
pedida total as como la diferencia entre cantidad pedida total y cantidad recibida total.

3.

Obtener la cantidad de vendedores de cada empresa, indicando cantidad y nombre de la


misma, ordenado descendentemente por cantidad de empleados.

4.

Obtener, por pieza solicitada, la mxima diferencia entre cantidad pedida y cantidad recibida
de entre todas las veces en que fue servida.

5.

Obtener para cada pieza, el nmero de la pieza y el nmero total de vendedores que nos
pueden suministrar esa pieza.

6.

Obtener nmero de pieza y nmero total de vendedores que la pueden suministrar para
piezas de ms de 250 de precio de venta.

7.

De cada pieza obtener el precio unitario medio de suministro.

8.

De cada pieza de precio de venta mayor que 250 obtener el precio medio de suministro.

9.

Obtener la media de las ventas (en euros) realizadas por cada vendedor de cada pieza.

10. Obtener la cantidad de pedidos efectuados por fecha y el total pagado por las mercancas.
11. Calcular las ganancias (precio de compra menos precio de suministro por la cantidad
recibida) de cada vendedor que ha efectuado alguna venta.
12. Calcular por nmero de pedido, 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 lneas de cada
pedido.
13. Calcular para cada pieza, el tanto por ciento de beneficios del precio de venta al pblico
respecto al precio medio de compra de todas las compras que se han realizado de la pieza
14. Obtener, por cada pieza solicitada, cuntos vendedores la podran suministrar, ordenado
alfabticamente por la descripcin de la pieza y eliminando aquellas compradas a
proveedores de Alicante.

56

SOLUCIONES GROUP BY
En AR y C.R.T. no hay definidas funciones agregadas por lo que
muchos de los requerimientos nos los podramos abordar, sobre
todo si estas funciones agregadas aparecen en la clusula
SELECT.
--1
select nompieza, preciovent, avg(preciovent-preciounit) media
from pieza p, preciosum ps
where p.numpieza=ps.numpieza
group by p.numpieza,nompieza,preciovent
order by nompieza
--2
select numpedido, sum(preciocompra*cantrecibida) precioPagado,
sum(cantpedida) cantidadPedida,
sum(cantpedida-cantrecibida) no_recibido
from linped
group by numpedido
order by numpedido
--3
select count(*) vendedores, nombrecomer
from vendedor
group by nombrecomer
order by vendedores desc, nombrecomer
--4
select numpieza, max(cantpedida-cantrecibida) maximo
from linped
group by numpieza
order by numpieza
--5
select numpieza, count(*) vendedores
from preciosum
group by numpieza
order by numpieza
--6
select ps.numpieza, count(*) vendedores
from preciosum ps, pieza p
where ps.numpieza = p.numpieza
and preciovent >= 250
group by ps.numpieza
order by 2
--7
select numpieza,avg(preciounit) precio_Sum_Medio
from preciosum
group by numpieza
order by numpieza
--13
select p.numpieza, max(preciovent)/avg(preciocompra)*100
from linped l, pieza p
where l.numpieza=p.numpieza
group by p.numpieza
order by p.numpieza

57

group by - having

SELECCIN DE
INFORMACIN
AGRUPADA
Objetivos:
Establecer selecciones sobre informacin agrupada.
Contenidos
HAVING.
Resolucin de requerimientos.

LA CLUSULA HAVING
Al igual que la clusula where selecciona filas, la clusula having selecciona grupos; si en la
where la condicin que se especifica afecta a las tuplas de toda la tabla, el group by efecta los

clculos en funcin de esa seleccin previa y da como resultado una tabla con la informacin
calculada para cada grupo. Sobre esta ltima el having eliminara aquellas tuplas que no cumplen
la condicin.
Normalmente, where selecciona sobre los datos almacenados en la tabla y having sobre la
informacin calculada.
Supongamos que queremos saber cuantas asignaturas imparte cada profesor pero nicamente
en el caso de que imparta 2 ms asignaturas:

select p.dni, nombre, count( * ) asignaturas


from profesores p, imparte i
where p.dni = i.dni
group by p.dni, nombre
having count(*) >= 2
order by nombre
resultado:

dni

21111222

nombre

EVA GMEZ

asignaturas

59

select p.dni, nombre, count( * ) asignaturas


from profesores p, imparte i
where p.dni = i.dni and asignatura <> 'FBD'
group by p.dni, nombre
having count(*) >= 2
order by nombre
resultado:

dni

nombre

asignaturas

En la expresin del having no se pueden utilizar los alias de las columnas (asignaturas) en este
caso.
Veamos, clusula a clusula, los efectos de esta ltima orden:
1. la clusula where ha eliminado las tuplas de imparte de cdigo de asignatura FBD.
2. la clusula group by calcula, para cada profesor, el nmero de asignaturas que imparte.
Puesto que no contamos FBD, Eva Gmez slo imparte, igual que Rafael Romero, una
nica asignatura.
3. la clusula having elimina del resultado del paso anterior todas aquellas tuplas con un valor
en la cuenta de filas menor que 2. El resultado es vaco puesto que ninguno de los grupos
supera la condicin.

60

CONSULTAS GROUP BY - HAVING


1.

Nombre de las empresas que tienen ms de dos vendedores.

2.

Nmeros de pedido que tengan ms de tres lneas de pedido.

3.

Nmeros de pedido donde el total de piezas pedidas es mayor que 40.

4.

Obtener los nmeros de pedido donde el precio total sea superior a 1000.

5.

Para las piezas que se hayan ofertadoa un precio unitario medio mayor que 260 obtener
el nmero de pieza, el mximo precio unitario, y la cantidad de suministradores.

6.

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 nmero de pieza, el mximo precio
unitario, y la cantidad de suministradores.

7.

Obtener aquellos nmeros de pedido y fecha en que se confeccionaron cuya cantidad de


artculos pedidos sea superior a 30 y la recibida inferior a 10.

8.

Obtener el nmero de pieza y el precio unitario medio de aquellas piezas que tarden de
media 14 das como mximo en ser suministradas (diassum=tiempo de suministro).

9.

Obtener los nmeros de pedido, precio de compra y cantidad pedida de los nmeros de
lnea 1 y recibidas en fecha 10-05-92.

10. Obtener el nmero, el nombre y el precio mximo unitario de las piezas cuyo precio de
venta sea mayor que 250 o menor que 170, su descuento medio oscile entre 10 y 17 y
que tengan un precio unitario medio total superior a 150, ordenado por precio mximo.
11. Determinar el nmero total de proveedores que pueden suministrar la pieza 'P-0001-33.
12. Para cada pieza, de la que se tiene informacin sobre sus posibles vendedores, obtener el
nmero de pieza, y sus precios unitarios mximo y mnimo, exceptuando la informacin
referida al vendedor nmero 1.
13. Dar una relacin del nombre de las piezas que nos pueden suministrar ms de dos
proveedores.
14. Obtener el nmero y el nombre del vendedor as como el nmero y nombre de las piezas
de precio unitario mayor que 200 que nos puedan suministrar. El resultado se dar
ordenado por nmero y nombre de vendedor y por nombre de la pieza.

61

SOLUCIONES GROUP BY - HAVING


En AR y CRT no hay definidas funciones de agregados por lo
que muchos de los requerimientos nos los podramos abordar,
sobre todo si estas funciones agregadas aparecen en la
clusula SELECT.
--1
select nombrecomer
from vendedor
group by nombrecomer
having count(*)>2
En AR Define alias V1, V2 para VENDEDOR
V1 V2 VENDEDOR donde V1.nombrecomer=V2.nombrecomer and
V2.nombrecomer=Vendedor.nombrecomer and
V1.numvend<>V2.numvend and V1.numvend<> VENDEDOR.numvend and
V2.numvend<>Vendedor.numvend [V1.nombrecomer]
En CRT {V1.nombrecomer | VENDEDOR(V1) V2(VENDEDOR(V2)
V1.nombrecomer=V2.nombrecomer V1.numvend<>V2.numvend
V3(VENDEDOR(V3) V2.nombrecomer=V3.nombrecomer
V1.numvend<>V3.numvend V2.numvend<>V3.numvend))}
--2
select numpedido
from linped
group by numpedido
having count(*)>3
En AR Define alias LP1, LP2, LP3 para LINPED
LP1 LP2 LP3 LINPED donde LP1.numpedido=LP2.numpedido
and LP2.numpedido=LP3.numpedido and
LP3.numpedido=LINPED.numpedido and LP1.numlinea<>LP2.numlinea
and LP1.numlinea<> LP3.numlinea and LP1.numlinea<>
LINPED.numlinea and LP2.numlinea<> LP3.numlinea and
LP2.numlinea<>LINPED.numlinea and LP3.numlinea<>
LINPED.numlinea [LP1.numpedido]
En CRT {LP1.numpedido | LINPED(LP1) LP2 LP3 LP4
(LINPED(LP2) LINPED(LP3) LINPED(LP4)
LP1.numpedido=LP2.numpedido LP1.numlinea<>LP2.numlinea
LP1.numlinea<>LP3.numlinea LP1.numlinea<>LP4.numlinea
LP2.numpedido=LP3.numpedido LP3.numpedido=LP4.numpedido
LP2.numlinea<>LP4.numlinea LP3.numlinea<>LP4.numlinea) }
--3
select numpedido
from linped
group by numpedido
having sum(cantpedida)>40
--4
select numpedido
from linped l
group by numpedido
having sum(cantrecibida*preciocompra)>1000
--5
select numpieza, max(preciounit), count(*)
from preciosum
group by numpieza
having avg(preciounit)>260
--6
select numpieza, max(preciounit) maximo, count(*) cuantos
from preciosum
where preciounit >= 250
group by numpieza
having avg(preciounit)>260
--7
select p.numpedido, fecha
from pedido p, linped l
where p.numpedido=l.numpedido
group by p.numpedido,fecha
having sum(cantpedida)>30 and sum(cantrecibida)<10

62

--10
select p.numpieza,nompieza,max(preciounit) maximo
from pieza p,preciosum ps
where ps.numpieza=p.numpieza
and preciovent > 250 or preciovent < 170
group by p.numpieza,nompieza
having avg(descuento) between 10 and 17
and avg(preciounit) > 150
order by maximo

63

subselect

CONSULTAS ANIDADAS
Objetivos:

Utilizar el resultado de una sentencia select para establecer las condiciones de otra
sentencia select.

Contenidos

Subqueries.

operadores de comparacin escalar.

IN, ALL, ANY, [NOT].

Resolucin de requerimientos.

CONSULTAS ANIDADAS (SUBQUERIES)


En la condicin de bsqueda de la orden select (en la clusula where o en la having) tambin
podemos:
comparar una expresin con el resultado de otra orden select
determinar si el valor de una expresin est incluido en los resultados de otra orden select
preguntar si una orden select ha seleccionado filas.
Cuando una orden select se encuentra dentro de la clusula where de otra select recibe el
nombre de subconsulta (subquery). Por ejemplo :
select descripcin, crditos
from asignaturas
where crditos = ( select min(crditos) from asignaturas )
resultado:

descripcin
Historia de la Informtica

crditos
4.5

En primer lugar se calcula la select anidada (entre parntesis) y se obtiene el valor mnimo
para la columna crditos de la tabla asignaturas. Con ese valor se compara tupla a tupla y se
obtiene la asignatura (o asignaturas) cuya cantidad de crditos es igual al mnimo.

sintaxis general de la subconsulta


expresin op_comparacin { ALL | [ ANY | SOME ] } ( orden select )
expresin [ NOT ] IN ( orden select )
[ NOT ] EXISTS ( orden select )
Los valores posibles a devolver por una orden select anidada son :

nada

un valor nico (una fila y una columna),

un conjunto de valores (varias filas y una columna).


65

Siempre que la subselect devuelva algo, nicamente ser en una y nada ms que
una columna (salvo el operador EXISTS).

DEVOLUCIN DE UN NICO VALOR


expresin op_comparacin ( orden select )
Podemos utilizar los operadores de comparacin para preguntar si el valor de una determinada
expresin es mayor, menor, igual, etc. que el resultado de la subselect, siempre y cuando sta
devuelva una nica fila y una nica columna, es decir, un valor simple.
En general sern rdenes select que calculan una funcin agregada (sum, min, max, avg,
count).
select descripcin
from asignaturas
where crditos = ( select min(crditos) from asignaturas )

No sera correcto, porque la subselect devuelve ms de una fila, la siguiente orden :


select descripcin
from asignaturas
where crditos = ( select crditos from asignaturas where crditos < 9 )

DEVOLUCIN DE UNA LISTA DE VALORES


expresin op_comparacin ALL | [ ANY | SOME ] ( orden select )
Cuando la tabla resultado contiene ms de una fila (pero una nica columna, insistimos) hay
que utilizar un modificador para el operador de comparacin.
Nombre de la asignatura que tiene el mnimo nmero de crditos (es equivalente al primer
ejemplo) :
select descripcin
from asignaturas
where crditos <= ALL ( select crditos from asignaturas )
resultado:

descripcin

Historia de la Informtica

crditos
4.5

En este caso, el nmero en crditos de la asignatura tiene que ser menor o igual que todos
(all) los valores obtenidos en la subconsulta (que es la relacin de crditos de todas las
asignaturas).

66

Nombre de las asignaturas que no tienen el mnimo nmero de crditos :


select descripcin
from asignaturas
where crditos > ANY ( select crditos from asignaturas )
resultado:

crditos
6
6
6
9

descripcin

Fundamentos de las Bases de Datos


Diseo y Gestin de Bases de Datos
Programacin Concurrente
Fundamentos de la Programacin

Seran todas aquellas asignaturas cuyos crditos superasen al menos a uno (any) de los
valores devueltos por la subconsulta. El modificador some es equivalente a any.
Otra forma de expresar el mismo requerimiento :
select descripcin
from asignaturas
where crditos != ( select min(crditos) from asignaturas )

Supongamos que deseamos obtener el nombre de los profesores que imparten una asignatura
que no sea la mxima en nmero de crditos :
select nombre
from profesores p, asignaturas a, imparte i
where p.dni = i.dni and i.asignatura = a.codigo
and crditos < ANY ( select crditos from asignaturas )
resultado:

nombre

Eva Gmez
Rafael Romero

expresin [ NOT ] IN ( orden select )


Tambin podemos consultar la pertenencia de un valor a la lista de valores devuelta por la
subconsulta.
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.
En este caso dara lo mismo procesar la orden :
select p.* from profesores p, imparte i
where p.dni = i.dni

Se ver ms clara la utilidad de este operador si preguntamos justo lo contrario.

67

Obtener todos los datos de los profesores que no imparten asignaturas :


select * from profesores
where dni NOT IN ( select dni from imparte )

Por ltimo, veamos que algunos de estos operadores son equivalentes :

expresin IN (orden select)


expresin NOT IN (orden select)

68

expresin =ANY (orden select)


expresin !=ALL (orden select)

CONSULTAS SUBSELECT
1.

Obtener todos los datos de los vendedores a los que se les han solicitado ms pedidos
que a todos los dems.

2.

Nmero y nombre de los vendedores que no ofertan ninguna pieza.

3.

Nmero y nombre de los vendedores a los que se les ha solicitado algn pedido.

4.

Nmero y nombre de los vendedores a los que no se les ha solicitado pedidos.

5.

Nombre de la empresa que ofrece la pieza ms barata de precio de suministro.

6.

Nmero y descripcin de la pieza ms cara (precio de venta).

7.

Para cada pieza que se ofrece en la lista de suministros, obtener el nmero de pieza, y
sus precios unitarios mximo y mnimo, exceptuando aquellos suministrados por el
vendedor nmero 1.

8.

Nmero de pedido y precio total pagado del pedido ms caro.

9.

Nmero y nombre del vendedor al que se le ha solicitado el pedido ms caro.

10. Nmero, descripcin y precio de venta de los monitores que no han sido nunca
solicitados.
11. Calcular, por cada nmero de vendedor, la cantidad de piezas distintas que ha vendido,
para aquellos vendedores pertenecientes a la empresa con ms proveedores.
12. Nombre de los suministradores que pueden suministrar al menos alguna de las piezas que
puede suministrar el vendedor nmero 5.
13. Listar los vendedores que sean de la misma provincia que el vendedor nmero 100.
14. Obtener los nombres de los vendedores de la misma empresa que Luis Garca.
15. Nmero y descripcin de las piezas cuyo precio medio de suministro est por encima del
mayor precio de compra pagado por ella.
16. Nmero, nombre, empresa en la que trabaja y nmero de piezas que puede suministrar el
vendedor que tiene la media ms alta de piezas servidas.
17. Nombre de la empresa con mayor importe de ventas.
18. Nmero y descripcin de la pieza que ha sido pedida ms veces.
19. Nmero y descripcin 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 ms bajo)
20. Nmero de vendedor, nmero de pieza y descuento para aquellas piezas cuyo precio de
venta supere en ms del 15% la media del precio de compra de los pedidos en los que
aparece.
21. Cantidad de piezas a la venta de las que no tenemos informacin sobre sus posibles
suministradores.

69

SOLUCIONES SUBSELECT
--1
select *
from vendedor
where numvend in (select numvend
from pedido
group by numvend
having count(*) >= all(select count(*)
from pedido
group by numvend))
--2
select numvend, nomvend
from vendedor
where numvend not in (select numvend
from preciosum)
order by nomvend
En AR (VENDEDOR[numvend] PRECIOSUM[numvend])
VENDEDOR[numvend, nomvend]
En CRT {V.numvend, V.nomvend / VENDEDOR(V)
PR(PRECIOSUM(PR) PR.numvend=V.numvend)}
--3a
select v.numvend, nomvend
from vendedor v, pedido p
where v.numvend = p.numvend
order by nomvend
En AR VENDEDOR PEDIDO [numvend, nomvend]
En CRT {V.numvend, V.nomvend / VENDEDOR(V) P(PEDIDO(P)
P.numvend=V.numvend)}
--3b
select numvend, nomvend
from vendedor
where numvend in (select numvend
from pedido)
order by nomvend
--11
select v.numvend,count(distinct numpieza) npiezas
from vendedor v, pedido p, linped l
where v.numvend=p.numvend
and p.numpedido=l.numpedido
and nombrecomer in
(select nombrecomer
from vendedor
group by nombrecomer
having count(*) >= all
(select count(*)
from vendedor
group by nombrecomer))
group by v.numvend
order by v.numvend
--15
select p.numpieza, nompieza,avg(preciounit),max(preciocompra)
from pieza p, preciosum ps, linped l
where p.numpieza=ps.numpieza and ps.numpieza=l.numpieza
group by p.numpieza, nompieza
having avg(preciounit)>=
(select max(preciocompra)
from linped
where linped.numpieza=p.numpieza)

70

subselect - exists

CONSULTAS ANIDADAS II
Contenidos

El operador EXISTS.

Resolucin de requerimientos.

EL OPERADOR EXISTS
[ NOT ] EXISTS ( orden select )
El operador exists nos informa si una subconsulta ha devuelto algn resultado, o lo que es lo
mismo, si la tabla resultado tiene alguna fila.

Exists devuelve verdadero si hay al menos una tupla en la relacin derivada y falso si la
relacin derivada es vaca.
Supongamos que queremos conocer si algn profesor imparte todas las asignaturas :
select nombre from profesores p
where not exists ( select cdigo from asignaturas a
where not exists ( select asignatura from imparte i
where i.asignatura=a.cdigo and p.dni=i.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.
Supongamos que la forma que tiene el SGBD de resolver esta sentencia es la siguiente :

En la primera select recorremos la tabla de profesores.

Para cada profesor, la segunda select recorre la tabla de asignaturas.

Para cada profesor y asignatura comprueba que el primero imparte la segunda.

Una vez que ha fijado el profesor y la asignatura, 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. Cuando el SGBD est resolviendo la ltima subselect para ese profesor y esa asignatura,
como no estn relacionados, no devolver ninguna tupla : el resultado del segundo exists es falso,
y, como est negado, finalmente verdadero (ese profesor no imparte esa asignatura).
Por lo tanto, para la primera subselect, ya existe una asignatura que obtiene en la clusula

where un valor verdadero : esa asignatura saldr en la tabla resultado. Como sta ltima tiene al
menos una fila, el primer exists ser verdadero, y, como est negado, finalmente falso. El profesor
no imparte todas las asignaturas de nuestra base de datos.

Un profesor que imparta todas las asignaturas obtendr siempre una fila en la ltima subselect
y, por lo tanto, ninguna asignatura aparecer como resultado de la primera subselect, el
correspondiente exists ser falso, y por efecto del operador de negacin la condicin ser cierta :
ese profesor aparecer en la solucin.
En nuestra base de datos Ejemplo no hay ningn profesor que imparta todas las asignaturas.
71

Aunque puede inducir a error, por su traduccin intuitiva del ingls al espaol, no
se deben confundir nunca los operadores IN y EXISTS : el primero devuelve una lista de
valores, mientras que el segundo devuelve un valor de verdad; la sintaxis tambin es muy
diferente.

72

REQUERIMIENTOS SUBSELECT - EXISTS


1.

Nombre de los vendedores que pueden suministrar todas las piezas.

2.

Nombre de los vendedores que no pueden suministrar ninguna pieza, ordenados


alfabticamente.

3.

Numero y descripcin de las piezas que se han solicitado en todos los pedidos del
vendedor 1.

4.

Nombre de las empresas que cumplen que todos sus vendedores son de la Comunidad
Valenciana, ordenadas alfabticamente.

5.

Nmero y nombre de todos los vendedores de la ciudad de Alicante.

6.

Empresas que no han servido ninguna pieza.

7.

Empresas que han servido la(s) pieza(s) de mayor precio de venta.

8.

Numero de los pedidos cuyas piezas tienen todas un precio de venta mayor que la mitad
del precio mximo de venta.

9.

Obtener todos los datos de los vendedores que sirvieron los pedidos del requerimiento
anterior.

10. Nmero y nombre de los vendedores que han servido algn pedido (utilizando
obligatoriamente EXISTS).
11. Nmero y nombre de la pieza de menor precio de suministro (utilizando EXISTS).
12. Nombre de los vendedores a los que se les haya solicitado ms de dos pedidos (utilizando
subconsultas).
13. Nmero de pedido, fecha y nmero de vendedor del pedido ms caro (utilizando
subconsultas).

73

SOLUCIONES SUBSELECT - EXISTS


--1
select nomvend
from vendedor v
where not exists
(select *
from pieza pz
where not exists
(select *
from preciosum
where numvend = v.numvend and numpieza = pz.numpieza))
En AR ((PRECIOSUM [numvend, numpieza] PIEZA[numpieza])
VENDEDOR) [nomvend]
En CRT { V.nomvend / VENDEDOR(V) P (PIEZA(P) PR
(PRECIOSUM(PR) PR.numvend=V.numvend
PR.numpieza=P.numpieza ))}
--2
select nomvend
from vendedor
where numvend not in (select numvend
from preciosum)
order by nomvend
--2
select nomvend
from vendedor v
where not exists (select *
from preciosum
where numvend = v.numvend)
order by nomvend
En AR ((VENDEDOR[numvend] PRECIOSUM[numvend])
VENDEDOR)[nomvend]
En CRT {V.nomvend / VENDEDOR(V) PR(PRECIOSUM(PR)
PR.numvend=V.numvend)}
--3
select numpieza, nompieza
from pieza pz
where not exists
(select *
from pedido pd
where numvend=1
and not exists (select *
from linped l
where pd.numpedido=l.numpedido
and pz.numpieza=l.numpieza))
En AR ((LINPED [numpieza, numpedido] (PEDIDO donde
numvend=1)[numpedido]) PIEZA) [numpieza, nompieza]
En CRT { P.numpieza, P.nompieza / PIEZA(P) PD (PEDIDO(PD)
PD.numvend=1 LP (LINPED(LP)
LP.numpedido=PD.numpedido LP.numpieza=P.numpieza ))}
--4
select distinct nombrecomer
from vendedor v
where not exists
(select *
from vendedor
where nombrecomer = v.nombrecomer
and provincia not in ('ALICANTE','CASTELLON','VALENCIA'))
order by nombrecomer
En AR VENDEDOR[nombrecomer] (VENDEDOR donde
provincia<>ALICANTE or provincia<>CASTELLON or
provincia<>VALENCIA)[nombrecomer]
En CRT { V.nombrecomer / VENDEDOR(V) V2 (VENDEDOR(V2)
V2.nombrecomer=V.nombrecomer (V2.provincia=ALICANTE
V2.provincia=CASTELLON V2.provincia=VALENCIA))}
O bien
{ V.nombrecomer / VENDEDOR(V) V2 (VENDEDOR(V2)
V2.nombrecomer=V.nombrecomer V2.provincia<>ALICANTE
V2.provincia<>CASTELLON V2.provincia<>VALENCIA))}

74

adicionales 1

EJERCICIOS
ADICIONALES
CONSULTAS
1.

Toda la informacin de las piezas que puedan ser suministradas por vendedores de
empresas cuyo nombre empieza por 'H'.

2.

Piezas que el vendedor numero 1 ofrece en la lista de suministros y que han sido servidas
en algn pedido

3.

Vendedores que pueden suministrarnos piezas que se venden al pblico con un precio de
venta entre 50 y 100 y que esa pieza ha sido solicitada en algn momento (no
necesariamente a ellos)

4.

Nombre de las empresas de Alicante a las que se ha comprado algn monitor

5.

Nombre y numero de las piezas que se han solicitado en algn pedido ordenadas por el
nombre

6.

Para cada pieza comprada, nmero de pieza y diferencia en euros entre el precio de
compra y el de suministro del vendedor al que se le compr, ordenado descendentemente
por dicha cantidad.

7.

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

75

SOLUCIONES
--3
select distinct numvend
from preciosum ps, pieza p, linped l
where ps.numpieza = p.numpieza
and p.numpieza = l.numpieza
and preciovent between 50 and 100
order by numvend
En AR PIEZA PRECIOSUM LINPED donde preciovent50 and
preciovent100 [numvend]
En CRT {PR.numvend / PRECIOSUM(PR) P (PIEZA(P)
P.numpieza=PR.numpieza preciovent5000 preciovent10000
LP (LINPED(LP) PR.numpieza=LP.numpieza)) }
--4
select nombrecomer
from vendedor v, pedido pd, linped l, pieza p
where v.numvend = pd.numvend
and pd.numpedido = l.numpedido
and l.numpieza = p.numpieza
and nompieza like '%MONITOR%'
and provincia = 'ALICANTE'
--5
select nompieza, p.numpieza
from pieza p, linped l
where p.numpieza = l.numpieza
order by nompieza
En AR PIEZA LINPED [numpieza, nompieza]
En CRT {P.numpieza, P.nompieza / PIEZA(P) LP (LINPED(LP)
P.numpieza=LP.numpieza) }
--6
select ps.numpieza, preciounit - preciocompra
from linped l, pedido pd, preciosum ps
where l.numpedido = pd.numpedido
and pd.numvend = ps.numvend
and ps.numpieza = l.numpieza
order by diferencia
En AR PRECIOSUM PEDIDO LINPED [numpieza, preciounit,
preciocompra]
En CRT {PR.numpieza, PR.preciounit, LP.preciocompra /
PRECIOSUM(PR) LINPED(LP) P (PEDIDO(P)
PR.numvend=P.numvend P.numpedido=LP.numpedido
PR.numpieza=LP.numpieza) }
En AR y C.R.T.: no est considerada, en la formalizacin de
estos lenguajes, la resta como resultado.
--7
select distinct v.numvend, nombrecomer
from vendedor v, pedido pd, linped l, preciosum ps
where ps.numvend = v.numvend
and v.numvend = pd.numvend
and pd.numpedido = l.numpedido
and l.numpieza = ps.numpieza
and preciocompra > preciounit
En AR VENDEDOR PRECIOSUM PEDIDO LINPED donde
preciocompra > preciounit [numvend, nomvend]
En CRT {V.numvend, V.nomvend / VENDEDOR(V)
PR(PRECIOSUM(PR) V.numvend=PR.numvend P (PEDIDO(P)
PR.numvend=P.numvend LP(LINPED(LP)
P.numpedido=LP.numpedido PR.numpieza=LP.numpieza
preciocompra > p

76

adicionales 2

EJERCICIOS
ADICIONALES
CONSULTAS
1.

Obtener el nombre de los vendedores y la cantidad de piezas que pueden suministrar,


ordenado alfabticamente por vendedor.

2.

Obtener el nmero y el nombre de los vendedores y la cantidad de piezas que pueden


suministrar ordenado alfabticamente por vendedor.

3.

Obtener el nombre de las piezas, la media del precio unitario de cada pieza y el precio de
venta de todas las piezas de las que conocemos posibles suministradores.

4.

Para cada pedido obtener el nmero de lneas que tiene, el nmero y nombre del
vendedor y la fecha del pedido.

5.

Obtener el nombre de las piezas, la media del precio unitario de cada pieza y el precio de
venta de todas las piezas que puedan sernos suministradas por ms de tres proveedores.

6.

Obtener los nmeros y nombres de los vendedores que han servido algn pedido con ms
de tres artculos diferentes.

7.

Obtener nmero y nombre de vendedores a los que les hayamos solicitado algn pedido.

8.

Obtener el nombre de las piezas, 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 ms de dos proveedores.

9.

Obtener para cada pieza, el nombre de las pieza, la media del precio unitario de
suministro y el precio de venta, 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.
Ordenar el resultado por el nombre de la pieza.

10. Obtener nmero 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.

77

SOLUCIONES
--1
select nomvend,count(*) cantidad
from preciosum ps, vendedor v
where ps.numvend=v.numvend
group by v.numvend,nomvend
order by nomvend
--2
select v.numvend,nomvend,count(*) cantidad
from preciosum ps, vendedor v
where ps.numvend=v.numvend
group by v.numvend,nomvend
order by nomvend
--6
select numvend, nomvend
from vendedor v, pedido p, linped lp
where v.numvend = p.numvend
and p.numpedido = lp.numpedido
group by p.numpedido,v.numvend, nomvend
having count(distinct numpieza)> 3
En AR Define alias LP1, LP2, LP3 para LINPED
LP1 LP2 LP3 LINPED donde LP1.numpedido=LP2.numpedido
and LP2.numpedido=LP3.numpedido and
LP3.numpedido=LINPED.numpedido and LP1.numpieza<>LP2.numpieza
and LP1.numpieza<> LP3.numpieza and LP1.numpieza<>
LINPED.numpieza and LP2.numpieza<> LP3.numpieza and
LP2.numpieza<>LINPED.numpieza and LP3.numpieza<>
LINPED.numpieza [LP1.numpedido] PEDIDO VENDEDOR [numvend,
nomvend]
En CRT {V.numvend, V.nomvend / VENDEDOR(V) P (PEDIDO(P)
P.numvend=V.numvend) LP1 ( LINPED(LP1)
LP1.numpedido=P.numpedido LP2 (LINPED(LP2)
LP1.numpedido=LP2.numpedido LP1.numpieza<>LP2.numpieza
LP3 (LINPED(LP3) LP2.numpedido=LP3.numpedido
LP1.numpieza<>LP3.numpieza LP2.numpieza<>LP3.numpieza
LP4 (LINPED(LP4) LP3.numpedido=LP4.numpedido
LP1.numpieza<>LP4.numpieza LP2.numpieza<>LP4.numpieza
LP3.numpieza<>LP4.numpieza))))) }
--4
select p.numpedido, count(*), p.numvend, nomvend, fecha from pedido p, linped l,
vendedor v where p.numvend = v.numvend and p.numpedido = l.numpedido group by
p.numpedido, p.numvend, nomvend, fecha
(en este caso coincide count(*) y count(distinct numlinea)
--7
select v.numvend, nomvend from vendedor v, pedido p where v.numvend = p.numvend
--8
select nompieza, avg(preciosum), preciovent from preciosum ps, pieza p where
p.numpieza = ps.numpieza group by nompieza, preciovent having avg(preciosum) > 100
and count(*) > 2
(aqu tambin coincide count(*) y count(distinct numvend)
--9
select nompieza, avg(preciounit) media, preciovent
from preciosum ps, pieza p
where ps.numpieza=p.numpieza
and preciovent > 30000
group by p.numpieza,nompieza,preciovent
having count(*)>2
and avg(preciounit) between 100 and 280
order by p.nompieza
--10
select p.numpieza, nompieza from pieza p, preciosum ps where p.numpieza =
ps.numpieza group by p.numpieza, nompieza, preciovent having preciovent*20/100 >
avg(preciounit)
(necesito poner el preciovent en el group by porque es no calculado)

78

adicionales 3

EJERCICIOS
ADICIONALES
CONSULTAS
1.

Obtener para los vendedores de la provincia de Alicante, el nmero de vendedor, su


nombre y la cantidad total de pedidos que se les ha solicitado.

2.

Obtener la cantidad total de piezas que se solicitaron en el ao 1992.

3.

Obtener el nmero de pedido, el importe total, y el numero y nombre del vendedor al que
se les solicit, para los pedidos de importe total superior a 10000 euros. Ordena el
resultado por el importe total.

4.

Para cada pieza que pueda ser suministrada a un precio medio unitario inferior a 10
euros, obtener el nmero de la pieza, su nombre, el precio mximo al que nos la han
ofrecido, el precio mnimo y la cantidad de vendedores que nos la pueden suministrar.

5.

Para los pedidos que nos han sido servidos en ms de un da, obtener el nmero de
pedido, el nmero del vendedor al que se le solicit, su nombre, y la cantidad de das
distintos en los que nos han servido las piezas solicitadas.

6.

Para las empresas que tengan un nico vendedor, obtener el nombre de la empresa y la
cantidad total de pedidos que se le han solicitado, y el importe total entre todos los
pedidos.

7.

Para las piezas recibidas en domingo, obtener el nmero de la pieza, su nombre y el


nmero y nombre del vendedor al que se le solicitaron. Ordena el resultado por el nombre
de la pieza.

79

SOLUCIONES
--1
select v.numvend, nomvend, count(*) cantidadPED
from vendedor v, pedido p
where v.numvend=p.numvend and provincia=ALICANTE
group by v.numvend, nomvend
--4
select p.numpieza, nompieza, max(preciounit) maxPrecio,
min(preciounit) minPrecio, count(*) totalVend
from preciosum ps, pieza p
where ps.numpieza=p.numpieza
group by p.numpieza, nompieza
having avg(preciounit)<10
--5
select p.numpedido, v.numvend, nomvend, count(distinct fecharecep)
from vendedor v, pedido p, linped lp
where v.numvend = p.numvend
and p.numpedido = lp.numpedido
group by p.numpedido, v.numvend, nomvend
having count(distinct fecharecep)> 1
--7
select p.numpieza, nompieza, v.numvend, nomvend
from pieza p, linped lp , pedido ped, vendedor v
where lp.numpieza=p.numpieza and lp.numpedido=ped.numpedido
and ped.numvend=v.numvend and to_char(fecharecep, d)=7
order by 2

80

adicionales 4

EJERCICIOS
ADICIONALES
CONSULTAS
1.

Nmero y nombre de los vendedores a los que les hemos solicitado algn pedido en el
ao 1995 pero no les hemos solicitado ninguno en el ao 1992.

2.

Obtener el nmero y el nombre las piezas que puedan sernos suministradas por ms de
dos vendedores de la provincia de Alicante, y que en total (entre todos los pedidos
solicitados a todos los vendedores) hayamos pedido ms de 500 unidades.

3.

Obtener el nombre de las empresas de las que tengamos ms de 1 de un vendedor de


Alicante y no se les haya hecho ningn pedido (a ninguno de sus vendedores) antes del
ao 1995.

4.

Obtener el nmero y nombre de las piezas que nunca hemos solicitado.

5.

Obtener el nmero de los vendedores (numvend) que nos hubiesen podido servir todo lo
que se solicita en las lneas 1, 2 y 3 del pedido nmero 1.

6.

Obtener para los vendedores de Alicante o Madrid, el nmero y nombre de vendedor


junto con el importe total que les hemos pagado a travs de todos los pedidos que se les
ha solicitado.

81

SOLUCIONES
--1
select v.numvend, nomvend
from pedido p, vendedor v
where p.numvend=v.numvend and to_char(fecha,yyyy)=1995
minus
select v.numvend, nomvend
from pedido p, vendedor v
where p.numvend=v.numvend and to_char(fecha,yyyy)=1992
--4
select numpieza, nompieza
from pieza
minus
select p.numpieza, nompieza
from linped lp, pieza p
where lp.numpieza=p.numpieza
En AR
PIEZA[numpieza, nompieza]
(PIEZA LINPED)[numpieza, nompieza]
En CRT {P.numpieza, P.nompieza / PIEZA(P) LP(LINPED(LP)
LP.numpieza=P.numpieza}
--5
select numvend
from preciosum ps, linped lp
where ps.numpieza=lp.numpieza and numpedido=1 and numlinea=1
intersect
select numvend
from preciosum ps, linped lp
where ps.numpieza=lp.numpieza and numpedido=1 and numlinea=2
intersect
select numvend
from preciosum ps, linped lp
where ps.numpieza=lp.numpieza and numpedido=1 and numlinea=3
En AR Define alias V1, V2 para VENDEDOR
PRECIOSUM [numvend, numpieza]
LINPED DONDE (numpedido=1 and (numlinea=1 or numlinea=2 or
numlinea=3)) [numpieza]
En CRT
{V.numvend / VENDEDOR(V)
LP (LINPED(LP) LP.numpedido=1 (LP.numlinea=1
LP.numlinea=2 LP.numlinea=3)
PS(PRECIOSUM(PS) PS.numpieza=LP.numpieza
PS.numvend=V.numvend) ) }

--6
select v.numvend, nomvend, sum(cantrecibida*preciocompra) Total
from vendedor v, pedido p, linped lp
where v.numvend=p.numvend and p.numpedido=lp.numpedido
and provincia I (ALICANTE, MADRID)
group by v.numvend, nomvend

82

adicionales 5

EJERCICIOS
ADICIONALES
CONSULTAS
1.

Obtener para los pedidos con un importe total entre 400 y 600 euros, el nmero de
pedido, el nmero y nombre del vendedor al que se le solicit, y la fecha del pedido.

2.

Obtener para las piezas cuyo precio de suministro oscila entre 10 y 15, el nmero de la
pieza, su nombre, y la cantidad de vendedores que nos la pueden suministrar a ese
precio.

3.

Obtener para los vendedores a los que les hayamos pagado en total (entre todos sus
pedidos) ms de 3000 euros, el nmero y nombre de vendedor junto con el importe total
que les hemos pagado, y el total de pedidos que les hemos hecho.

4.

Obtener para el nmero y nombre de los vendedores de Alicante a los que se les haya
solicitado alguna pieza, de la que nos haban indicado que su plazo de suministro sera
superior a una semana, junto con el nmero y nombre de la pieza, y la cantidad de
pedidos distintos en los que se les ha solicitado. Ordena el resultado por la ltima
columna.

5.

Obtener el nombre de la empresa que tiene ms de tres vendedores, y al menos dos de


ellos son de la provincia de Alicante.

6.

Obtener los nombre y empresas de los vendedores que no son de la Comunidad


Valenciana, de los que se desconoce el telfono.

83

SOLUCIONES
--1
select p.numpedido, v.numvend, nomvend, fecha
from pedido p, linped lp, vendedor v
where p.numvend=v.numvend and p.numpedido=lp.numpedido
group by p.numpedido, fecha, v.numvend, nomvend
having sum(ctdpedida*preciocompra) between 400 and 600
--4
select v.numvend, nomvend, p.numpieza, nompieza, count(distinct numpedido)
from vendedor v, preciosum ps, pedido pd, linped lp, pieza p
where v.numvend = pd.numvend and v.numvend=ps.numvend
and pd.numpedido = lp.numpedido and p.numpieza=lp.numpieza and
p.numpieza=ps.numpieza and diassum>7
group by v.numvend, nomvend, p.numpieza, nompieza
order by 5
--5
select nombrecomer
from vendedor
group by nombrecomer
having count(*)>3
intersect
select nombrecomer
from vendedor
where provincia=AICANTE
group by nombrecomer
having count(*)>1
--6
select nomvend, nombrecomer
from vendedor
where provincia not in (ALICANTE,CASTELLON,VALENCIA) and telefono is null

84

adicionales 6

EJERCICIOS
CONSULTAS
1.

Obtener el nombre de la pieza (o piezas) y su precio unitario mximo de la pieza de


precio unitario medio ms bajo.

2.

Nombre del vendedor y media de todos sus precios de suministro para los vendedores
que viven en la misma ciudad que algn vendedor de apellido Garca.

3.

Para la pieza (o piezas) de precio de venta mayor, obtener el nombre de la pieza y


nmero total de vendedores que la pueden suministrar.

4.

Obtener el nombre de vendedor para los vendedores cuya media de precio unitario de
suministro sea mxima.

5.

Obtener el nombre de la pieza y su precio unitario medio de la pieza ms barata de precio


de venta.

6.

Nombre y empresa de los vendedores de la ciudad a la que se le ha solicitado ms piezas.

7.

Nmero de pedido, y nmero y nombre de vendedor del pedido que no es el de menor


importe de venta (preciocompra*cantrecibida) siendo el ao del pedido posterior al 1992
(>1992).

8.

Nombre de los vendedores a los que se les haya solicitado ms de dos pedidos en los que
se sirvan discos duros.

9.

Nmero de pieza, descripcin y precio de venta de la pieza que ms veces se ha pedido.

10. Nmero de pieza, descripcin, precio medio de suministro y descuento mximo de las
piezas que proceden de la misma ciudad que la empresa Mecemsa y que se han solicitado
2 veces o ms.

85

SOLUCIONES
--2
select nomvend, avg(preciounit) mediasumin
from vendedor v, preciosum ps
where v.numvend=ps.numvend
and ciudad IN (select ciudad
from vendedor
where nomvend like '%GARCIA%')
group by v.numvend, nomvend,ciudad
order by mediasumin
--7
select numpedido, v.numvend, nomvend, fecha
from pedido p, vendedor v
where p.numvend=v.numvend
and to_char(fecha,'YYYY')>1992
and numpedido in (select numpedido
from linped
group by numpedido
having sum(preciocompra*cantrecibida) > any
(select sum(preciocompra*cantrecibida)
from linped
group by numpedido))
--10
select ps.numpieza, nompieza, avg(preciounit) media,
max(descuento) descuento
from preciosum ps, pieza pz, vendedor v
where ps.numpieza=pz.numpieza and v.numvend=ps.numvend
and v.ciudad in (select ciudad
from vendedor
where nombrecomer='MECEMSA')
and ps.numpieza in (select numpieza
from linped
group by numpieza
having count(*)>1)
group by ps.numpieza,nompieza
order by ps.numpieza

86

adicionales 7

EJERCICIOS
CONSULTAS
1.

Nmero y nombre de los vendedores que oferten alguna de las piezas que pueden ser
suministradas por el vendedor nmero 1, pero que no oferten ninguna de las que puedan
ser suministradas por el vendedor nmero 2.

2.

Obtener el nmero y el nombre de los vendedores y la cantidad de piezas que pueden


suministrar a un precio entre 15 y 20 euros, ordenado por el nombre de vendedor.

3.

Obtener, para el vendedor que cumple que la diferencia de precio al que le compramos
una pieza y el precio que nos haba ofrecido por ella sea mxima, el nmero de vendedor,
su nombre y la diferencia media entre el precio al que nos vende las piezas y el que nos
haba ofrecido por las mismas.

4.

Obtener el nmero de pieza de los teclados que nos han sido servidos en el mayo de
cualquier ao.

5.

Obtener un listado en el que figure el nmero y nombre de la pieza , junto con el nmero
y nombre de vendedor que nos ha ofertado la pieza, pero al que nunca se la hemos
solicitado.

6.

Obtener los nmeros y nombres de los vendedores que nos han servido ms de tres
artculos diferentes.

87

SOLUCIONES
--1
select v.numvend, nomvend
from vendedor v, preciosum ps
where v.numvend=ps.numvend and
numpieza IN (select numpieza from preciosum where numvend=1)
and numvend NOT IN (
select v.numvend, nomvend
from vendedor v, preciosum ps
where v.numvend=ps.numvend and
numpieza IN (select numpieza from preciosum where numvend=2))
--1
select numvend, nomvend
from vendedor
where numvend IN (
select numvend from preciosum
where numpieza IN (select numpieza from preciosum where numvend=1)
MINUS
select numvend from preciosum
where numpieza IN (select numpieza from preciosum where numvend=2))
En AR
(PRECIOSUM donde numvend=1 [numpieza] PRECIOSUM
VENDEDOR)[numvend, nomvend]
(PRECIOSUM donde numvend=2 [numpieza] PRECIOSUM
VENDEDOR)[numvend, nomvend]
En CRT {V1.numvend, V1.nomvend / VENDEDOR(V1)
PS1(PRECIOSUM(PS1) PS1.numvend=V1.numvend
PS2(PRECIOSUM(PS2) PS2.numvend=1
PS1.numpieza=PS2.numpieza
PS3(PRECIOSUM(PS3) PS3.numvend=V1.numvend
PS4(PRECIOSUM(PS4) PS4.numvend=2
PS3.numpieza=PS4.numpieza)) ) ) }
--3
select v.numvend, nomvend, avg(preciocompra-preciounit) DifMedia
from preciosum ps, pedido p, linped lp, vendedor v
where p.numpedido=lp.numpedido and ps.numvend=p.numvend
and lp.numpieza=ps.numpieza and p.numvend=v.numvend
group by v.numvend, nomvend
having max(precicompra-preciounit) =
(Select max(preciocomprapreciounit)
from preciosum ps, pedido p, linped lp
where p.numpedido=lp.numpedido and ps.numvend=p.numvend
and lp.numpieza=ps.numpieza)
--4
select numpieza
from pieza p, linped lp
where p.numpieza=lp.numpieza and nompieza like %TECLADO%
and to_char(fecharecep, mm)=5
--6
select v.numvend, nomvend
from vendedor v, pedido p, linped lp
where v.numvend=p.numvend and p.numpedido=lp.numpedido
group by v.numvend, nomvend
having count(distinct numpieza)>3

88

También podría gustarte