Académique Documents
Professionnel Documents
Culture Documents
Pág. 1
PARTE 7ª:SQL/TEMPORAL ............................................................................................................................................19
SQL/MM (MULTIMEDIA )............................................................................................................................................19
EJERCICIOS DE SQL RESUELTOS...................................................................................................................20
Creación de tablas.....................................................................................................................................20
Solución.....................................................................................................................................................................20
Consultas simples................................................................................................................................21
Consultas de reunión (con filtrado WHERE) ....................................................................................21
SELECT * FROM PIEZAS WHERE P_NOMBRE LIKE 'B*';...............................................................................23
SELECT * FROM PROVEEDORES WHERE SITUACION < (SELECT MAX(SITUACION) AS MAXIMO
FROM PROVEEDORES);............................................................................................................................................24
UPDATE PIEZAS SET COLOR='AMARILLO',PESO=PESO+5,P_CIUDAD='CUBA' WHERE
P_CODIGO='P2';...........................................................................................................................................................26
EJERCICIOS PROPUESTOS.................................................................................................................................27
Creación de la base de datos y las tablas en MySQL.......................................................................27
Consultas sencillas...............................................................................................................................28
Consultas con varias tablas.................................................................................................................28
Funciones de agregados (COUNT, SUM, etc)..................................................................................29
Consultas diversas...............................................................................................................................29
Subconsultas(SELECT dentro de SELECT)......................................................................................29
Exists....................................................................................................................................................30
Union....................................................................................................................................................30
Operaciones de actualización..............................................................................................................30
Apuntes de SQL
Pág. 2
INTRODUCCIÓN: EL LENGUAJE DE CONSULTA SQL.
Esta constituido básicamente por las siguientes sentencias: CREATE TABLE, CREATE
VIEW, CREATE DOMAIN, CREATE ASSERTION, CREATE INDEX, ALTER TABLE,
DROP TABLE, DROP VIEW, DROP INDEX.
En los siguientes apartados describiremos el lenguaje SQL empleando la notación BNF
extendida. Esta notación utiliza unos símbolos que no son propios del SQL y cuyo significado
es el siguiente:
CREATE TABLE.
Se emplea para crear una tabla de la base de datos. Esta instrucción la tienen todos los SGBD
relacionales aunque con modificaciones respecto de la SQL ISO-92
Apuntes de SQL
Pág. 3
( <definición de columna> | <definición de restricción de tabla>[, <definición de columna> |
<definición de restricción de tabla>]…);
<especificación de referencia>::=
Ejemplo
CREATE TABLE PROFESOR
( Cod_profe Char(5) PRIMARY KEY,
Nombre Char(15) NOT NULL,
DNI Int NOT NULL,
Dirección Char(25) NOT NULL,
Materia Char(10),
Tipo Char NOT NULL,
Cód_profe_e Char(5),
Cód_area Char(5), NOT NULL,
Catedrático Bit,
FOREIGN KEY (Cód_profe_e) REFERENCES PROFESOR ON UPDATE CASCADE,
FOREIGN KEY (Cód_area) REFERENCES AREA ON UPDATE CASCADE,
Apuntes de SQL
Pág. 4
CHECK( ( (Cód_prof_e = NULL) And (Catedrático =1)) Or ((Cód_prof_e = NOT
NULL) And (Catedrático =0))
CHECK (Cód_profe <> Cód_profe_e)
);
CREATE DOMAIN
Se utiliza para crear un dominio, es decir un conjunto de valores que puede tomar un atributo
o campo de una tabla. Es algo parecido a los tipos de datos definidos por el usuario en los
lenguajes de programación. Esta instrucción no la soportan actualmente todos los SGBD, por
ejemplo no la soporta Oracle ni SQLbase.
Ejemplo
CREATE DOMAIN C_PER Char(5);
CREATE DOMAIN C_BECA Char(5);
CREATE ASSERTION
Se utiliza para establecer restricciones en la base de datos. Por ejemplo para que el sistema
compruebe las cardinalidades mínimas o las condiciones que deben cumplir un conjunto de
atributos pertenecientes a varias tablas. No está disponible en todos los SGBD
CREATE VIEW
Crea una vista de una tabla. Una vista es una tabla virtual que no se sustenta en sus propios
datos almacenados y separados físicamente. Lo que se almacena es la definición de la vista en
términos de otras tablas en el diccionario de datos del sistema.
Pág. 5
AS <expresión de consulta> [WITH CHECK OPTION]
Ejemplo
CREATE INDEX
Esta sentencia no forma parte del estándar SQL92 sin embargo la incluyen la mayoría de los
SGBD tales como Oracle, Informix, SQLServer, DB2, Access. En concreto aquí veremos la
del SQL de DB2.
Nos permite crear un índice para una tabla basado en una o varias de sus columnas.
Ejemplo
CREATE SYNONYM
Esta sentencia no forma parte del estándar SQL92 sin embargo la incorporan la mayoría de las
implementaciones.
Crea un nombre de alias para una tabla o vista. El alias puede ser útil para proporcionar un
nombre corto para un nombre de tabla largo o para tratar la tabla a través de su alias como si
fuese una copia lo cual nos puede servir para unir una tabla consigo misma.
Pág. 6
Ejemplo
CREATE SYNONYM CLIE FOR PROD.CLIE;
Ejemplo
Ejemplo
Ejemplo
Ejemplo
Apuntes de SQL
Pág. 7
DROP SYNONYM
Destruye un sinónimo de una tabla o de una vista. No froma parte del SQL92.
SELECT
Selecciona filas de una o más tablas.
<sentencia select>::=
La palabra clave DISTINCT indica que si existen filas idénticas, sólo se mostrará una de
ellas.
Ejemplos
SELECT S#
FROM S
WHERE Ciudad=‘PARIS’
AND Situación > 20;
SELECT S.*,P.* /*Selecciona todos los campos de las dos tablas S y P*/
FROM PROVEEDORES, PIEZAS
WHERE PROVEEDORES.CIUDAD= PIEZAS.CIUDAD;
Apuntes de SQL
Pág. 8
>mostrar las piezas rojas y verdes de una ciudad
Esta cláusula especifica las columnas usadas para formar grupos con las filas devueltas por la
sentencia SELECT. Dentro de cada grupo todas las filas tienen el mismo valor en la o las
columnas de GROUP BY.
Si está precedida de la cláusula WHERE el sistema agrupa las filas después de aplicar la
cláusula WHERE.
Todas las columnas de la <lista de selección> de la sentencia SELECT deben ser funciones de
columna (AVG, COUNT, MAX, MIN, SUM) o formar parte de la cláusula GROUP BY.
Ejemplo
Obtener la cantidad total suministrada de cada pieza
Obsérvese que en la tabla de suministros SP a lo mejor hay seis filas de P1 coda una con una
cantidad de 100 pero el resultado consiste en agruparlas por el código de la pieza.
Se utiliza para indicar que los grupos de filas agrupados por GROUP BY que se muestran
deben cumplir la <condición de búsqueda>. Por lo tanto si se especifica HAVING en una
sentencia SELECT deberá haberse especificado también GROUP BY o bien todas las
columnas de la <lista de selección> de SELECT deben formarse con funciones de columna.
HAVING es a los grupos lo que WHERE es a las filas.
Ejemplo
Obtener los códigos de las piezas que son suministradas por más de un proveedor.
Apuntes de SQL
Pág. 9
SELECT P#
FROM SP
GROUP BY P#
HAVING COUNT(*) >1;
Especifica el orden en que una sentencia SELECT devuelve las filas. Las filas se pueden
ordenar por una columna de forma ascendente ASC o descendente DESC. Si se especifican
más de una columna en primer lugar se ordenan según la primera columna especidicada y
dentro de esta la segunda y dentro de la segunda la tercera y asi sucesivamente.
Ejemplo
Seleccionar los clientes cuya primera ficha de negocio fue 1988 y mostrarlos en orden
ascendente por el código postal:
SELECT…INTO
Crea una tabla lógica de una fila a lo sumo y asigna los valores de las columnas de la fila a
unas variables host especificadas.
NOTAS:
• Esta sentencia se utiliza sólo dentro de un programa de aplicación. La palabra clave EXEC
SQL debe preceder a esta sentencia.
• Si existe más de una fila como resultado de la sentencia entonces segenera un error
• Los tipos de las variables host deben coincidir con los de los campos de las columnas
especificadas en <lista de selección>.
Ejemplo
En un programa C para almacenar el número de precios diferentes de artículos de un
inventario actual en la variable declarada en el programa como int número_precios
escribiríamos:
…
EXEC SQL
SELECT COUNT (DISTINCT COSTE)
INTO: número_precios
Apuntes de SQL
Pág. 10
FROM INVENTARIO
WHERE CANT >0;
…
UPDATE
Modifica las columnas seleccionadas de una tabla en todas las filas que satisfacen una
condición de búsqueda.
Ejemplo:
Modifica sólo las piezas cuyo código es P2 actualizando los campos de color, peso y ciudad.
UPDATE PIEZAS
SET COLOR=‘AMBAR’,
PESO=PESO+5,
CIUDAD=NULL
WHERE P# = ‘P2’;
DELETE
Borra una o más filas de una tabla o vista. Si no se especifica la cláusula WHERE, se borran
todas las filas de la tabla señalada en la cláusula FROM. Si se especifica la cláusula WHERE
sólo serán borradas aquellas filas que hagan la condición de búsqueda verdadera.
Ejemplo:
Borrar todas las filas de tabla SP cuya CANT sea mayor que 30.
Apuntes de SQL
Pág. 11
DELETE
FROM SP
WHERE CANT > 30;
INSERT
Inserta una o más filas nuevas dentro de la tabla o vista especificada. Cuando se utilice la
cláusula VALUES sólo se insertará una fila. Si se utiliza una <sentencia select> el número de
filas insertadas será igual al devuelto por la <sentencia select>.
Ejemplos
INSERT
INTO SUMINISTROS(S#, P#, CANT)
VALUES (‘S20’, ‘P20’, 1000);
En este ejemplo se insertan unas filas obtenidas de la tabla de SUMINISTROS en una tabla
temporal TEMP.
INSERT
INTO TEMP (P#, CANTTOTAL)
SELECT P#, SUM(CANT)
FROM SUMINISTROS
GROUP BY P#;
SELECT JNOMBRE
FROM J
WHERE J# IN
(SELECT J#
FROM SPJ Subconsulta
WHERE S#=’S1’);
Apuntes de SQL
Pág. 12
Función AVG (media aritmética)
La sintaxis es:
En una consulta SELECT o una subconsulta esta función crea una columna cuyo valor es el
promedio numérico de los valores de la <expresión> o del <nombre de columna>. Se puede
usar la cláusula GOUP BY para crear el promedio de cada grupo de filas seleccionadas en las
tablas o vistas subyacentes.
Ejemplos
Obtener el promedio del coste del inventario de artículos sin contar aquellos que no están en
stock.
SELECT AVG(CANTIDAD*COSTE)
FROM INVENTARIO
WHWRE CANTIDAD >0;
SELECT AVG(CANTDEBIDA)
FROM CUENTASPAGAR
WHER MESFACTURA = 10
AND CANTDEBIDA >0;
En una consulta SELECT o subconsulta esta función crea una columna cuyo valor es igual al
número de filas de la tabla resultado o al número de valores distintos en <nombre columna>.
Se puede utilizar la cláusula GROUP BY para crear una cuenta por cada grupo de filas.
Ejemplo
Obtener el número de clientes de cada provincia que hicieron negocio en una fecha posterior a
1985.
SELECT COUNT(*)
FROM CLIENTES
Apuntes de SQL
Pág. 13
WHERE PRIMERFECHA > 1985
GROUP BY PROVINCIA;
Función MAX
En una consulta o subconsulta crea una columna cuyo valor es el valor máximo
de<expresión> o <nombre de columna>. Se puede utilizar la cláusula GROPU BY para
obtener el máximo de cada grupo de filas seleccionadas en las tablas o filas subyacentes
Ejemplos
Calcular la máxima cantidad debida a cualquier vendedor que envió una factura en Octubre.
Función MIN
Ejemplos
Obtener la mínima cantidad que se le debe a cualquier vendedor que envió una factura en
Octubre.
Función SUM
Apuntes de SQL
Pág. 14
En una tabla lógica devuelta por una consulta o subconsulta crea una columna cuyo valor es
la suma numérica de los valores de <expresión> o <nombre de columna>. Se puede utilizar la
cláusula GROUP BY para obtener la suma de cada grupo de filas.
Ejemplos
Obtener la cantidad total debida a todos los vendedores que enviaron una factura en Octubre.
SELECT SUM(CANTDEBIDA)
FROM CUENTASPAGAR
WHERE MESFACTURA = 10;
TIPO DESCRIPCIÓN
CHAR[ACTER](n) Cadena de caracteres de longitud fija n
CHARACTER VARYING Cadena de caracteres de longitud variable. En las
implementaciones reales se suele indicar la longitud
máxima. Así en DB” sería VARCHAR(n).
SMALLINT Número entero en el rango –32.768 a 32.767
INTEGER Número entero con signo con un rango de –
2.147.483.648 a 2.147.483.647 y sin signo de 0 a
4.294.967.295
DEC[IMAL](p,q) Decimal empaquetado con un total de p dígitos de los
cuales q hay a la derecha del punto decimal.
NUMERIC(p,q) Igual que DECIMAL
FLOAT[(p)] Número de punto flotante con una precisión de p dígitos
binarios
REAL Igual que FOLAT pero con una precisión definida por la
implementación.
DOUBLE PRECISION Igualque REAL pero con el doble de precisión.
DATE Fecha en formato aaaammdd
TIME Hora en formato hhmmss
TIMESTAMP “Marca de tiempo”. Es una combinación de fecha y hora
con una precisión de microsegundos.
INTERVAL Expresa diferencias entre fechas u horas
BIT Un bit
Apuntes de SQL
Pág. 15
BIT VARYING Cadena de bits de longitud variable.
Apuntes de SQL
Pág. 16
SQL3:El nuevo SQL1
La versión actual estándar del SQL, la SQL/92, tiene su origen en la norma ISO 9075 de Julio
de 1992. Actualmente la ISO y ANSI están trabajando en una nueva versión del SQL
denominada SQL3 cuyo objetivo final es convertir al SQL en un lenguaje computacional
completo para la definición y el manejo de objetos complejos. Esto incluye jerarquías de
generalización y especialización, herencia múltiple, tipos definidos por el usuario, triggers,
aserciones, soporte para sistemas basados en el conocimiento, expresiones recursivas de
consultas, herramientas de administración de datos, herencia, polimorfismo, encapsulamiento,
capacidades multimedia, etc.
En 1993 la ISO y ANSI deciden crear múltiples comités de normalización para definir el
SQL3. Cada uno de estos comités se encarga de un aspecto del nuevo SQL. Estos comités son
los siguientes.
Parte 3ª:SQL/CLI
Es una interfase de programación a nivel de llamadas (Call Level Innterface) para bases de
datos SQL diseñada para que las aplicaciones puedan acceder a las bases de datos. Se pretende
normalizar:
• Una implementación independiente de la interfase de programación a nivel de llamadas
para acceso a bases de datos SQL.
1
Este apartado ha sido sacado de la dirección de internet
http://www.jcc.com/SQLPages/jccs_sql.html que recoge el estado actual del SQL y cuya última
actualización fue el 2 de Diciembre de 1999
Apuntes de SQL
Pág. 17
• Herramientas cliente-servidor para fácil acceso a bases de datos a través de librerías de
enlace dinámico.
• Soporte y fomento de un rico conjunto de herramientas cliente-servidor.
Este comité ha trabajado con gran rapidez y el estándar es el ISO/IEC 9075-3 terminado en
1995 y actualmente está trabajando para dar soporte a las nuevas características del SQL3.
Parte 5: SQL/Bindings
Esta es la parte obligatoria del SQL compuesta por el LDD o parte estático de definición de
datos y la parte dinámica de la manipulación de datos LMD.
En la actualidad hay que resolver la gran variedad de usos que los diferentes sistemas de bases
de datos relacionales hacen tanto de la parte estática como dinámica. Por otro lado el SQL-92
tiene una correspondencia en los tipos de datos con los lenguajes de programación
tradicionales pero no con los orientados a objetos que hay que resolver también.
Parte 6: SQL/XA
Este comité pretende normalizar una Interfase de Programación de Aplicaciones (API) entre
un gestor de transacciones global y un gestor de recursos SQL. La idea es que el gestor de
recursos de SQL tenga soporte para el protocolo de compromiso de dos fases. El compromiso
Apuntes de SQL
Pág. 18
de dos fases se basa en el avance al unísono de todos los agentes que intervienen en una
transacción o el retroceso al unísono de esos agentes si la transacción no puede realizarse.
En concreto se trabaja para especificar los parámetros de entrada y salida en términos de tipos
de datos SQL para las funciones de dicho protocolo desarrollado por X/Open.
Parte 7ª:SQL/Temporal
Se trata de añadir capacidades relacionadas con el tiempo al SQL. La idea es que se puedan
realizar consultas a las bases de datos no sólo en el estado o momento actual sino en estados
previos de tiempo. Hay varias soluciones para que el nuevo SQL contemple la dimensión
temporal:
• Añadir dos nuevos atributos INICIO y FINAL a las relaciones base que indiquen
respectivamente los momentos en los cuales una tupla se inserta y elimina en el sentido
lógico y no físico. Por ejemplo, supongamos que se inserta un nuevo proveedor de código
S6 en el momento t1, entonces se creará una nueva tupla para S6 con NINICIO=t1 y
FINAL=”infinito”. Si después en el instante t2 la situación (el atributo SITUACION) del
proveedor S6 cambia se modificaría la primera tupla de S6 haciendo FINAL= t2 y se
insertaría otra nueva tupla para S6 con INICIO=t2 y FINAL= “infinito”.
• Mediante relaciones anidadas (subtablas) en las cuales cada tupla de una relación base
incluyera un atributo especial, que sería la relación anidada o subtabla que definiese la
historia de esa tupla.
Se trata por tanto de ponerse de acuerdo en el modelo a elegir.
SQL/MM (Multimedia)
Intenta normalizar librerías de clase para ciencias e ingeniería, procesamiento de documentos,
métodos para manejar objetos multimedia tales como imágenes, sonido, animación, música y
vídeo.
A su vez este comité ha sido dividido en 4 partes cada una de las cuales trata un aspecto
diferente del SQL/MM.
Apuntes de SQL
Pág. 19
EJERCICIOS DE SQL RESUELTOS
Creación de tablas
1.- A continuación se presenta una muestra de valores de una base de datos compuesta por tres
tablas de proveedores, proyectos y piezas. Los proveedores (tabla S) , las piezas (tabla P) y los
proyectos (tabla J) se identifican respectivamente por un código de proveedor (S#, un código
de pieza (P#) y un número o código de proyecto (J#). El significado de una fila de la tabla de
envis (tabla SPJ) es que el proveedor con código S# envía la pieza con código P# al proyecto
con código J# en la cantidad especificada en CANTIDAD. La combinación S#P#J# identifica
de forma única cada fila de la tabla de envíos. Escribir un conjunto de sentencias CREATE
TABLE de SQL92 para esta base de datos.
S# P# J# CANTIDAD
PCODI PNOMB COLO PESO PCIUDAD
GO RE R S1 P1 J1 200
P1 Tuerca Rojo 12 Londres S1 P1 J4 700
P2 Perno Verde 17 París S2 P3 J1 800
P3 Birlo Azul 17 Roma S2 P3 J2 200
P4 Birlo Rojo 14 Londres S2 P3 J3 100
P5 Leva Azul 12 París S2 P3 J4 100
P6 Engrane Rojo 19 Londres S2 P3 J5 500
S2 P3 J6 300
S# SNOMBRE SITUACION SCIUDAD S2 P3 J7 500
S1 Juan 20 Londres S2 P5 J2 150
S2 Antonio 10 París S3 P3 J1 125
S3 María 30 París S3 P4 J2 200
S4 Susana 20 Londres S4 P6 J3 200
S5 Felipe 30 Atenas S4 P6 J7 300
S5 P2 J4 8000
J# JNOMBRE JCIUDAD S5 P2 J2 500
J1 Clasificador París S5 P5 J5 300
J2 Perforadora Roma S5 P5 J7 700
J3 Lectora Atenas S5 P1 J4 900
J4 Consola Atenas S5 P3 J4 100
J5 Terminal Londres S5 P4 J4 200
J6 Cinta Oslo
J7 Impresora Londres
Solución
A) Sin dominios.
B) Con dominios.
Apuntes de SQL
Pág. 20
Consultas simples
2.- Obtener para todas las piezas, el número de pieza y su peso en gramos ( los pesos se dan en
libras en la tabla P. Una libra = 454 gramos).
SELECT P_CODIGO PESO * 454 FROM PIEZAS ;
4,.- Obtener los números de los proveedores de París cuya situación sea mayor que 20.
WHERE PR_CIUDAD = “PARIS” AND SITUATION > 20; OR PR_CIDUDAD =
LONDRES;
PR_CIUDAD = “PARIS” OR “LONDRES”;
5.- Obtener los códigos de proveedor y situación de proveedores de París en orden descendente
por situación.
SELECT PR_CODIGO, SITUACION FROM PROVEEDORES
WHERE PR_CIUDAD = “PARIS” OR BY SITUATION DESC;
6.- Obtener para todas las piezas, su código y su peso en gramos ordenando el resultado por
peso y dentro de peso por código de pieza.
SELECT P_CODIGO, P_NOMBRE, PESO * 454 AS
PESO_ GRAMOS FROM PIEZAS ORDER BY PESO, P_CODIGO;
8.- Obtener todas las combinaciones de información de proveedor y pieza donde la ciudad del
proveedor siga a la ciudad de la pieza en orden alfabético.
SELECT PROVEEDORES.*, PIEZAS.* FROM PROVEEDORES, PIEZAS, WHERE
PROVEEDORES. PR_CIUDAD>PIEZAS. P_CIUDAD;
9.- Obtener todas las combinaciones de información de proveedor y pieza donde el proveedor
y la pieza en cuestión estén cosituados, es decir tengan la misma ciudad, pero omitiendo a los
proveedores cuya situación sea 20.
SELECT PIEZAS.*, PROVEEDORES.*
FROM PIEZAS, PROVEEDORES
WHERE (((PIEZAS.P_CIUDAD)<[PROVEEDORES].[PR_CIUDAD]) AND
((PROVEEDORES.SITUACION)<>20));
10.- Obtener todas las combinaciones de (s#,p#) tales que el proveedor y la pieza en cuestión
estén cosituados.
Apuntes de SQL
Pág. 21
SELECT PR.*, P.*
FROM PIEZAS AS P, PROVEEDORES AS PR
WHERE PR.PR_CIUDAD=P.P_CIUDAD;
11.- Obtener todas las parejas de nombres de ciudad tales que un proveedor situado en la
primera ciudad suministre una pieza almacenada en la segunda ciudad.
SELECT PR_NOMBRE, PR_CIUDAD, P_NOMBRE, P_CIUDAD
FROM PROVEEDORES, PIEZAS, RELACION
WHERE 'PROVEEDORES. PR_CODIGO=RELACION. PR_CODIGO
AND PIEZAS. P_CODIGO=RELACION.P_CODIGO';
12.- Obtener todas las parejas de números de proveedor tales que los dos proveedores en
cuestión estén cosituados.
SELECT
PR1.PR_CODIGO,PR1.PR_NOMBRE,PR1.PR_CIUDAD,PR2.PR_CODIGO,PR2.PR_NOMBRE,P
R2.PR_CIUDAD FROM PROVEEDORES PR1,PROVEEDORES PR2 WHERE
PR1.PR_CIUDAD=PR2.PR_CIUDAD AND PR1.PR_CODIGO<>PR2.PR_CODIGO;
Funciones de agregados
Pág. 22
GROUP BY PIEZAS.P_CODIGO, PIEZAS.P_NOMBRE;
19.- Obtener los códigos de todas las piezas que son suministradas por más de un proveedor.
A) SELECT RELACION.P_CODIGO, Count(*) AS Expr1
FROM RELACION
GROUP BY RELACION.P_CODIGO
HAVING COUNT(*)>2;
C)
SELECT RELACION.P_CODIGO, Count(*) AS Expr1, Avg(RELACION.CANTIDAD) AS
NUMPEDIDOS, Avg(RELACION.CANTIDAD) AS MEDIAPIEZAS,
Sum(RELACION.CANTIDAD) AS TOTALPIEZAS
FROM RELACION
GROUP BY RELACION.P_CODIGO
HAVING (((Count(*))>2));
·CON BETWEEN:
SELECT * FROM PROVEEDORES WHERE FECHA BETWEEN #01/01/2005# AND
#31/05/2005#;
·CON DATE VALUE:
SELECT * FROM PROVEEDORES WHERE FECHA = DATEVALUE ('18/10/2004');
22.- Obtener los nombres de los proveedores que suministran la pieza P2.
SELECT PR_NOMBRE
Apuntes de SQL
Pág. 23
FROM PROVEEDORES, RELACION
WHERE P_CODIGO='P2' AND PROVEEDORES.PR_CODIGO=RELACION.PR_CODIGO;
23.- Obtener los nombres de los proveedores que por lo menos suministran una pieza de color
rojo.
A) SELECT P_CODIGO FROM PIEZAS WHERE COLOR='ROJO';
B) SELECT PR_CODIGO FROM RELACION WHERE P_CODIGO IN(SELECT
P_CODIGO FROM PIEZAS WHERE COLOR='ROJO');
C) SELECT PR_NOMBRE FROM PROVEEDORES WHERE PR_CODIGO IN (SELECT
PR_CODIGO FROM RELACION WHERE P_CODIGO IN(SELECT P_CODIGO FROM
PIEZAS WHERE COLOR='ROJO'));
D) SELECT PR_NOMBRE FROM PROVEEDORES,RELACION,PIEZAS WHERE
RELACION.PR_CODIGO=PROVEEDORES.PR_CODIGO AND
PIEZAS.P_CODIGO=RELACION.P_CODIGO AND PIEZAS.COLOR='ROJO';
23.4 Obtener los datos de las piezas que hayan sido sudministradas por algún proveedor de
Atenas y de Londres.
24.- Obtener los códigos de proveedores situados en la misma ciudad que el proveedor con
código S1.
SELECT PR_CIUDAD FROM PROVEEDORES WHERE PR_CODIGO='S1';
SELECT * FROM PROVEEDORES WHERE PR_CIUDAD=(SELECT PR_CIUDAD FROM
PROVEEDORES WHERE PR_CODIGO='S1');
25.- Obtener los códigos de proveedores cuya situación sea menor que el valor máximo actual
de situación de la tabla S(PROVEEDORES)
SELECT * FROM PROVEEDORES WHERE SITUACION < (SELECT MAX(SITUACION)
AS MAXIMO FROM PROVEEDORES);
Apuntes de SQL
Pág. 24
SELECT * FROM PROVEEDORES WHERE EXISTS (SELECT * FROM RELACION
WHERE P_CODIGO='P2' AND
PROVEEDORES.PR_CODIGO=RELACION.PR_CODIGO);
28.- Obtener los nombres de los proveedores que suministran todas las piezas.
SELECT * FROM PROVEEDORES WHERE NOT EXISTS (SELECT PIEZAS.* FROM
PIEZAS WHERE NOT EXISTS (SELECT RELACION.* FROM RELACION WHERE
PIEZAS.P_CODIGO=RELACION.P_CODIGO AND
PROVEEDORES.PR_CODIGO=RELACION.PR_CODIGO));
28.C)
SELECT PROVEEDORES.* FROM PROVEEDORES WHERE NOT EXISTS (SELECT
RELACION.PR_CODIGO FROM RELACION WHERE
PROVEEDORES.PR_CODIGO=RELACION.PR_CODIGO);
28.D.Obtener el nombre de la pieza que han sido sudministradas por todos los proveedores.
28.E; Sacar los datos de los pedidos que la cantidad sea 100, 200 o 500.
SELECT * FROM RELACION WHERE CANTIDAD IN(100,200,500);
28.F; Obtener los datos de las piezas que no han sido sudministradas con ‘exists’ e ‘in’:
SELECT *
FROM piezas
WHERE not exists (select * from relacion where piezas.p_codigo=relacion.P_codigo);
29.- Obtener los códigos de los proveedores que suministran por lo menos todas las piezas
suministradas por el proveedor S2.
Apuntes de SQL
Pág. 25
Operaciones de actualización
30.C A las piezas cuya fecha este dentro de este año hay q decrementar el peso en 5 unidades
UPDATE PIEZAS SET PESO = PESO-5
WHERE FECHA>=#1/17/2005# And FECHA<=#12/31/2005#;
Operaciones de eliminación
35.-Eliminar todos los envíos cuya cantidad sea mayor que 300
Operaciones de inserción
37.-Añadir la pieza ‘P7’ (ciudad, Atenas, peso, 24; nombre y color desconocidos por ahora) a
la tabla P
38.-Añadir la pieza P8(nombre, cadena, color, rosa, peso, 14, ciudad, Niza) a la tabla P
Apuntes de SQL
Pág. 26
39.-Insertar un nuevo envío con código de proveedor S20, código de pieza P20, código de
proyecto J4 y cantidad 1000.
40.- Para cada pieza suministrada, obtener el número de pieza y la cantidad total suministrada
y guardar el resultado en una tabla temporal de la base de datos
EJERCICIOS PROPUESTOS
Sobre la misma base de datos realizar los siguientes ejercicios
b) Con la orden USE nombre_base_datos hacer que la base de datos recién creada
sea la actual para su uso.
c) Con un editor de textos simple como el bloc de notas de Windows escribir la orden
SQL para crear las tabla S, P, J y SPJ y guardar el archivo con el nombre
crea_s_p_j_spj.sql (los archivos que contienen instrucciones que pueden
ejecutarse se llaman scripts).
f) Con la orden DESC nombre_tabla comprobar los tipos de campos de cada tabla.
Apuntes de SQL
Pág. 27
h) Crear un archivo con el bloc de notas de windows que tenga líneas de texto. Cada
línea de texto será una fila de la tabla de piezas (P) y cada columna estará separada
por el carácter tabulador. El archivo tendrá el siguiente aspecto:
NOTAS:
El comando anterior no funciona si en el archivo encuentra por ejemplo más de un tabulador y
tampoco si el archivo se ha creado escribiendo una fila y copiándola con CTRL-C y CTRL-V.
i) Realizar el mismo proceso que en el ejercicio anterior para crear y cargar el archivo
tabla_s.sql.
j) Realizar el mismo proceso que en el ejercicio anterior para crear y cargar el archivo
tabla_j.sql, pero ahora se creará dicho archivo con una hoja de calculo (excel)
exportándola a un archivo de texto con el carácter tabulador como separador de
columnas.
k) Realizar el mismo proceso que el ejercicio anterior para crear y cargar el archivo
tabla_spj.sql.
Consultas sencillas
1. Obtener los detalles completos de todos los proyectos
2. Obtener los detalles completos de todos los proyectos de Londres
3. Obtener los códigos de provedores que suministran piezas al proyecto J1, ordenados por
número código de proveedor.
4. Obtener todos los envíos en los cuales la cantidad está en el intervalo 300 a 700 inclusive
5. Obtener una lista de todas las combinaciones de color de pieza y ciudad de pieza
eliminando todas las parejas color de pieza y ciudad de pieza repetidas
Apuntes de SQL
Pág. 28
6. Obtener todas la tripletas (número de proveedor,número de pieza,número de proyecto)
tales que el proveedor, la pieza y el proyecto estén todos a la vez en la misma ciudad
(cosituados)
7. Lo mismo que el anterior pero que no estén todos cosituados
8. Obtener todas la tripletas (número de proveedor,número de pieza,número de proyecto)
tales que el proveedor, la pieza y el proyecto estén todos a la vez en diferente ciudad
9. Obtener los números de piezas suministradas por algún (los) proveedor (es) de Londres
10. Obtener los números de piezas suministradas por un proveedor de Londres a un proyecto
de Londres
11. Obtener todas las parejas de nombres de ciudad tales que un proveedor de la primera
ciudad suministre piezas a un proyecto de la segunda ciudad
12. Obtener los números de piezas suministradas a un proyecto por un proveedor en la misma
ciudad que el proyecto
13. Obtener los números de los proyectos a los cuales suministra piezas por lo menos un
proveedor situado en una ciudad distinta que el proyecto
14. Obtener todas las parejas de números de piezas tales que algún proveedor suministre las
dos piezas indicadas
15. Obtener el número total de proyectos a los cuales sumnistra piezas el proveedor S1
16. Obtener la cantidad total de la pieza P1 suministrada por el proveedor S1
17. Para cada pieza suministrada a un proyecto, obtener el número de pieza, el número de
proyecto y la cantidad total correspondiente
18. Obtener los números de las piezas suministradas a algún proyecto tales que la cantida
promedio suministrada sea mayor que 20
Consultas diversas
19. Obtener todos los envíos para los cuales la cantidad no sea nula
20. Obtener los números de proyecto y ciudades en los cuales la segunda letra del nombre de
ciudad sea una “o”.
21. Obtener los nombres de los proyectos a los cuales suministra piezas el proveedor S1
22. Obtener los colores de las piezas que sumininstra el proveedor S1
23. Obtener los números de las piezas suministradas a cualquier proyecto de Londres
24. Obtener los números de los proyectos que utilizan al menos una de las piezas
suministradas por el proveedor S1
25. Obtener los códigos de proveedores que suministren por lo menos una de las piezas
suministradas por al menos uno de los proveedores que suministran por lo menos una
pieza roja
26. Obtener los números de proveedores cuya situación sea inferior a la del proveedor S1
27. Obtener los números de proyectos cuya ciudad sea la primera en la lista alfabética de las
ciudades donde hay proyectos
28. Obtener los códigos de proyectos a los cuales se suministre la pieza P1 en una cantidad
promedio mayor que la cantidad máxima en la cual se suministra alguna pieza del
proyecto J1
Apuntes de SQL
Pág. 29
29. Obtener los números de los proveedores que suministran la pieza P1 a algún proyecto en
una cantidad mayor que la cantidad promedio enviada de la pieza P1 para ese proyecto
Exists
Union
37. Construir una lista ordenada de todas las ciudades en las cuales esté situado por lo menos
un proveedor, una pieza o un proyecto
38. Mostrar el resultado de la siguiente selección:
SELECT COLOR
FROM P
UNION
SELECT COLOR
FROM P;
Operaciones de actualización
Apuntes de SQL
Pág. 30