La primera definición del SQL cuyo nombre original era SEQUEL fue realizada por Chamberlain y otros de
IBM en el Research Laboratory de San José.
Finalmente el ANSI y la ISO tomaron el SQL como norma y lo definieron como un standard.
El SQL tiene dos partes bien diferenciadas: las sentencias que se utilizan par definir los datos que se
denominan LDD y las que se emplean para manipularlos que se denominan LMD.
En este capitulo se verá el SQL (ISO 9075 DE 1992). Todos los sistemas relacionales actuales utilizan dicho
lenguaje con algunas modificaciones o añadidos. Por tanto en este tema estudiaremos este lenguaje.
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:
| Indica una alternativa. Se debe elegir entre lo que hay a la derecha de la barra o la izquierda.
<> Lo que hay entre estos corchetes es un símbolo no terminal, es decir que requiere definición.
Lo que hay a la izquierda de los puntos suspensivos puede repetirse cero o más veces.
{} Agrupa elementos
En la descripción de las instrucciones de SQL todos los símbolos escritos en negrita se consideran terminales
y por tanto propios del SQL.
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
1
( <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>::=
NOTA: se utiliza para expresar una condición que deben cumplir un conjunto de
atributos de la tabla
Ejemplo
2
DNI Int NOT NULL,
Materia Char(10),
Cód_profe_e Char(5),
Catedrático Bit,
CHECK( ( (Cód_prof_e = NULL) And (Catedrático =1)) Or ((Cód_prof_e = NOT NULL) And (Catedrático
=0))
);
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.
[<restricción de dominio>]
[[NOT] DEFERRABLE] |
Ejemplo
CREATE ASSERTION
3
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
[<atributos de aserción>]
Ejemplo
Suponemos una base de datos que recoge información de cursos impartidos por profesores. Entonces para
indicar al sistema que cada curso puede ser impartido por menos de cuatro profesores escribiríamos, una vez
creadas las tablas de la base de datos:
FROM IMPARTE
GROUP BY COD_CURSO
HAVING COUNT(*)>=4)
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.
La cláusula WITH CHECK OPTION indica que las operaciones de modificación e inserción realizadas con
la vista deben verificarse para garantizar que toda fila modificada o insertada cumpla la condición definida en
<expresión de consulta>.
Ejemplo
FROM PROVEEDORES
WHERE SITUACION>15
Esto define una vista de la tabla PROVEEDORES denominada Buenos_proveedores de la cual sólo se
muestran filas compuestas por los campos S#, SITUACION, CIUDAD donde SITUACION>15. Cada vez que
4
se intente modificar o introducir una fila en la tabla de proveedores a través de esta vista se comprobará si el
campo SITUACION tiene un valor mayor de 15 denegándose la operación en caso contrario .
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.
[CLUSTER]
• La cláusula CLUSTER indica que se trata de un índice de agrupamiento, es decir que el sistema sitúa
los registros relacionados de forma lógica lo más próximos posibles unos de otros en el soporte.
• La cláusula UNIQUE se emplea para indicar que no se permite que dos registros de la tabla indicada
tengan el mismo valor en el campo o combinación de campos índices. Esto sirve para que se cumpla
la unicidad de las claves primarias en el sistema DB2.
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.
Ejemplo
Esta sentencia no forma parte del SQL92 sin embargo la contemplan la mayoría de los sistemas comerciales.
5
[NULL | NOT NULL]
Ejemplo
Esta sentencia no forma parte del estándar SQL92 aunque si la incluyen todas las implementaciones
comerciales. Aquí veremos la sintaxis del sistema DB2.
Esta instrucción destruye una tabla y todos sus índices liberando el espacio que ocupaban.
Ejemplo
No forma parte del SQL92 aunque la incluyen todas las implementaciones comerciales. Esta sentencia elimina
una vista.
Ejemplo
Destruye un índice y libera el espacio ocupado por él. No forma parte del SQL92.
Ejemplo
DROP SYNONYM
Destruye un sinónimo de una tabla o de una vista. No froma parte del SQL92.
En SQL92 la manipulación de datos se hace básicamente con las sentencias SELECT (seleccionar), UPDATE
(actualizar), DELETE (borrar) e INSERT (insertar) que constituyen el lenguaje de manipulación de datos
básico.
6
SELECT
<sentencia select>::=
<nombre de sinonimo>.*},}
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'
SELECT S.*,P.* /*Selecciona todos los campos de las dos tablas S y P*/
7
>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
FROM SP
GROUP BY P# Tabla SP
Resultado: P# SUM(CANT)
P1 600
P2 1000
P3 400
P4 500
P5 500
P6 100
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
8
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.
SELECT P#
FROM SP
GROUP BY P#
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:
FROM CLIENTES
SELECTINTO
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.
9
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
EXEC SQL
INTO: número_precios
FROM INVENTARIO
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';
10
WHERE P_CODIGO='P4' OR P_CODIGO='P6';
SUPONEMOS Q VAMOS A CAMBIAR EL COLOR D TODAS LAS PIEZAS CUYO PESO SEA MAYOR
IGUAL Q 17 A AMARILLO:
WHERE PESO>=17;
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.
DELETE
FROM SP
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>.
[({<nombre de columna>},)]
Ejemplos
11
INSERT
En este ejemplo se insertan unas filas obtenidas de la tabla de SUMINISTROS en una tabla temporal TEMP.
INSERT
FROM SUMINISTROS
GROUP BY P#;
SQL ofrece una serie de funciones que actúan sobre el total de valores en una columna de alguna tabla y
producen un sólo valor como resultado. Estas funciones son la suma (SUM), la media (AVG), el máximo de
un conjunto de valores (MAX), el mínimo (MIN) y el número de valores de una columna o cuenta (COUNT).
Estas funciones se utilizan en consultas SELECT o en subconsultas. Una subconsulta es una consulta
SELECT dentro de otra SELECT. Por ejemplo:
SELECT JNOMBRE
FROM J
WHERE J# IN
(SELECT J#
WHERE S#='S1');
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.
Si se especifica la cláusula DISTINCT entonces los valores duplicados en la columna no se tiene en cuenta a
la hora de calcular el promedio. La cláusula ALL si tiene en cuenta todos los valores, aunque esta es la opción
por defecto.
12
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
Calcular el promedio de la cantidad debida a cualquier vendedor que envió un acuenta en octubre.
SELECT AVG(cantdebida)
From cuentaspagar
Wher mesfactura = 10
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
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
13
Calcular la máxima cantidad debida a cualquier vendedor que envió una factura en Octubre.
FROM CUENTASPAGAR
FROM INVENTARIO;
Función MIN
Ejemplos
Obtener la mínima cantidad que se le debe a cualquier vendedor que envió una factura en Octubre.
FROM CUENTASPAGAR
FROM INVENTARIO;
Función SUM
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
14
WHERE MESFACTURA = 10;
FROM INVENTARIO;
En SQL92 son los siguientes (se debe consultar los tipos de datos para sistemas especificos como Oracle,
DB2, etc):
TIPO DESCRIPCIÓN
CHAR[ACTER](n) Cadena de caracteres de longitud fija n
Cadena de caracteres de longitud variable. En las
CHARACTER VARYING 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
Número entero con signo con un rango de
INTEGER −2.147.483.648 a 2.147.483.647 y sin signo de 0 a
4.294.967.295
Decimal empaquetado con un total de p dígitos de los
DEC[IMAL](p,q)
cuales q hay a la derecha del punto decimal.
NUMERIC(p,q) Igual que DECIMAL
Número de punto flotante con una precisión de p
FLOAT[(p)]
dígitos binarios
Igual que FOLAT pero con una precisión definida por
REAL
la implementación.
DOUBLE PRECISION Igualque REAL pero con el doble de precisión.
DATE Fecha en formato aaaammdd
TIME Hora en formato hhmmss
Marca de tiempo. Es una combinación de fecha y hora
TIMESTAMP
con una precisión de microsegundos.
INTERVAL Expresa diferencias entre fechas u horas
BIT Un bit
BIT VARYING Cadena de bits de longitud variable.
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
15
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.
Es el núcleo de la nueva especificación incluyendo nuevos tipos de datos, triggers, subtablas, tipos de datos
abstractos(ADT), capacidades de orientación de objetos, capacidades para definir operaciones complejas,
almacenamiento de operaciones complejas en la base de datos, llamadas a procedimientos externos.
Como vemos todo está muy relacionado con los modelos orientados a objetos. Por este motivo la mayor parte
del trabajo se dedica a redefinir un modelo de objetos SQL−3 compatible con el modelo de objetos propuesto
por el ODMG ( Object−oriented Database consortium).
Un tipo de dato abstracto consiste en una colección de datos junto con unas operaciones que pueden realizarse
sobre ellos y todo ello encapsulado y cuyos elementos pueden tener una visibilidad pública, privada o
protegida. En los lenguajes de programación orientada a objetos TAD es una clase. En el nuevo SQL se
trataría de definir una tabla junto con las operaciones que se puedan realizar sobre ella. Los atributos de la
tabla serían los datos miembro y las operaciones serían las funciones miembro o métodos. La herencia
permitiría así crear subtablas.
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:
• Herramientas cliente−servidor para fácil acceso a bases de datos a través de librerías de enlace
dinámico.
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.
Esta parte se dedica a incorporar al SQL extensiones para lenguaje procedural, procedimientos almacenados y
múltiples instrucciones, procedimientos externos y llamadas a procedimientos.
16
Extensiones para lenguaje procedural
Esto tiene grandes ventajas en los entornos cliente−servidor en los siguientes ámbitos:
• Seguridad ya que un usuario puede dar derecho para llamar a un procedimiento almacenado que
actualice una tabla o conjunto de tablas pero denegar el derecho para actualizar las tablas
directamente sin el procedimiento.
• Código compartido ya que el código de un procedimiento almacenado no tiene que ser escrito y
depurado para cada cliente que accede a la base de datos.
• Control ya que el procedimiento almacenado proporciona un único punto de definición y control para
la lógica de la aplicación.
Una de las capacidades mas deseadas es permitir la llamada a funciones y procedimientos externos escritos
por el usuario. El objetivo es permitir que las bases de datos puedan utilizar un rico y numeroso conjunto de
funciones definidas por el comité estándar.
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 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.
17
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.
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.
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.
18
S4 Susana 20 Londres
S5 Felipe 30 Atenas
J# JNOMBRE JCIUDAD
J1 Clasificador París
J2 Perforadora Roma
J3 Lectora Atenas
J4 Consola Atenas
J5 Terminal Londres
J6 Cinta Oslo
J7 Impresora Londres
Solución
• Sin dominios.
• Con dominios.
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).
4,.− Obtener los números de los proveedores de París cuya situación sea mayor que 20.
5.− Obtener los códigos de proveedor y situación de proveedores de París en orden descendente por situación.
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.
19
7.−Obtener todas las combinaciones de información de proveedores y piezas tales que el proveedor y la pieza
en cuestión estén situados en la misma ciudad.
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.
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.
10.− Obtener todas las combinaciones de (s#,p#) tales que el proveedor y la pieza en cuestión estén
cosituados.
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.
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,PR2.PR_CIUDAD
FROM PROVEEDORES PR1,PROVEEDORES PR2 WHERE PR1.PR_CIUDAD=PR2.PR_CIUDAD AND
PR1.PR_CODIGO<>PR2.PR_CODIGO;
Funciones de agregados
20
13.− Obtener el número total de proveedores
14.− Obtener el número total de proveedores y almacenarlo en una variable denominada total_proveedores
WHERE (PIEZAS.P_CODIGO=RELACION.P_CODIGO)
WHERE (PIEZAS.P_CODIGO=RELACION.P_CODIGO)
WHERE (((PIEZAS.P_CODIGO)=[RELACION].[P_CODIGO]))
19.− Obtener los códigos de todas las piezas que son suministradas por más de un proveedor.
21
FROM RELACION
GROUP BY RELACION.P_CODIGO
HAVING COUNT(*)>2;
FROM RELACION
GROUP BY RELACION.P_CODIGO
HAVING COUNT(*)>2;
C)
FROM RELACION
GROUP BY RELACION.P_CODIGO
HAVING (((Count(*))>2));
WHERE PIEZAS.P_CODIGO=RELACION.P_CODIGO
20.− Obtener todas las piezas cuyos nombres comiencen con la letra B
22
·CON BETWEEN:
22.− Obtener los nombres de los proveedores que suministran la pieza P2.
SELECT PR_NOMBRE
23.− Obtener los nombres de los proveedores que por lo menos suministran una pieza de color rojo.
SELECT PR_CODIGO FROM RELACION WHERE P_CODIGO IN(SELECT P_CODIGO FROM PIEZAS
WHERE COLOR='ROJO' OR COLOR='VERDE');
23.2
23.3 Obtener el nombre de los proveedores que han sudministrado alguna pieza de París y Roma.
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.
23
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 PIEZAS WHERE EXISTS (SELECT * FROM RELACION WHERE PR_CODIGO='S3'
AND PIEZAS.P_CODIGO=RELACION.P_CODIGO);
SELECT * FROM PROVEEDORES WHERE NOT 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));
SELECT PIEZAS.* FROM PIEZAS WHERE NOT EXISTS (SELECT RELACION.P_CODIGO FROM
RELACION WHERE PIEZAS.P_CODIGO=RELACION.P_CODIGO);
28.C)
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.
24
28.F; Obtener los datos de las piezas que no han sido sudministradas con `exists' e `in':
SELECT *
FROM piezas
SELECT * FROM PIEZAS WHERE P_CODIGO NOT IN (SELECT P_CODIGO FROM RELACION);
29.− Obtener los códigos de los proveedores que suministran por lo menos todas las piezas suministradas por
el proveedor S2.
Operaciones de actualización
30.−Cambiar a amarillo el color de la pieza `P2', aumentar su peso en 5 e indicar que su ciudad es
desconocida (NULL).
30.C A las piezas cuya fecha este dentro de este año hay q decrementar el peso en 5 unidades
Operaciones de eliminación
35.−Eliminar todos los envíos cuya cantidad sea mayor que 300
25
36.−Eliminar todos los envíos de los proveedores situados en Londres
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
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
• Con la orden CREATE DATABASE nombre_base_datos creese la base de datos que contendrá las tablas
S, P, J y SPJ.
• Con la orden USE nombre_base_datos hacer que la base de datos recién creada sea la actual para su uso.
• 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).
• Con la orden SOURCE nombre_script o \. nombre_script ejecutar el script crea_s_p_j_spj.sql para crear
las tablas de la base de datos.
• Con la orden SHOW TABLES comprobar la existencia de las tablas en la base de datos una vez creadas.
• Con la orden DESC nombre_tabla comprobar los tipos de campos de cada tabla.
• Si has escrito el script crea_s_p_j_spj.sql copiándolo de las instrucciones CREATE TABLE de los
ejercicios resueltos de los apuntes observarás en el ejercicio anterior que la clave primaria de la tabla S es
de tipo char(5) mientras que en la tabla SPJ es de tipo char(2) y deben ser iguales pues de lo contrario
estamos violando la regla de integridad referencial para claves ajenas. Se trata de que modifiques la
definición de las tablas de manera que todas las claves primarias y ajenas sean de tipo char(5). Para ello se
utiliza la orden ALTER TABLE con la opción MODIFY cuya sintaxis en MySQL es la siguiente:
26
p5 engrane rojo 19 Londres
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.
• Realizar el mismo proceso que en el ejercicio anterior para crear y cargar el archivo tabla_s.sql.
• 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.
• Realizar el mismo proceso que el ejercicio anterior para crear y cargar el archivo tabla_spj.sql.
Consultas sencillas
27
• Obtener el número total de proyectos a los cuales sumnistra piezas el proveedor S1
• Obtener la cantidad total de la pieza P1 suministrada por el proveedor S1
• Para cada pieza suministrada a un proyecto, obtener el número de pieza, el número de proyecto y la
cantidad total correspondiente
• Obtener los números de las piezas suministradas a algún proyecto tales que la cantida promedio
suministrada sea mayor que 20
Consultas diversas
• Obtener todos los envíos para los cuales la cantidad no sea nula
• Obtener los números de proyecto y ciudades en los cuales la segunda letra del nombre de ciudad sea una o.
• Obtener los nombres de los proyectos a los cuales suministra piezas el proveedor S1
• Obtener los colores de las piezas que sumininstra el proveedor S1
• Obtener los números de las piezas suministradas a cualquier proyecto de Londres
• Obtener los números de los proyectos que utilizan al menos una de las piezas suministradas por el
proveedor S1
• 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
• Obtener los números de proveedores cuya situación sea inferior a la del proveedor S1
• Obtener los números de proyectos cuya ciudad sea la primera en la lista alfabética de las ciudades donde
hay proyectos
• 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
• 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
• Construir una lista ordenada de todas las ciudades en las cuales esté situado por lo menos un proveedor, una
pieza o un proyecto
• Mostrar el resultado de la siguiente selección:
SELECT COLOR
FROM P
UNION
28
SELECT COLOR
FROM P;
Operaciones de actualización
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. 7
(P1, 100)
(P1, 100)
(P1, 100)
(P1, 100)
(P1, 100)
(P1, 100)
S# P# J# CANTIDAD
S1 P1 J1 200
S1 P1 J4 700
S2 P3 J1 800
S2 P3 J2 200
S2 P3 J3 100
S2 P3 J4 100
S2 P3 J5 500
S2 P3 J6 300
S2 P3 J7 500
S2 P5 J2 150
S3 P3 J1 125
S3 P4 J2 200
29
S4 P6 J3 200
S4 P6 J7 300
S5 P2 J4 8000
S5 P2 J2 500
S5 P5 J5 300
S5 P5 J7 700
S5 P1 J4 900
S5 P3 J4 100
S5 P4 J4 200
30