Introduccion A SQL
Introduccion A SQL
Introduccion A SQL
Parte cuatro
Implementacin
de bases de datos
con el modelo
relacional
En este captulo presentamos enunciados interactivos SQLque necesitan ser ajustados y modificados cuando se implantan en programas, como se muestra en los captulos
12 y 13. El presente captulo se refiere slo a los enunciados para el manejo de datos; en
los captulos 12 y 13 se analizan los enunciados de definicin de datos.
SQL es un lenguaje orientado a la transformacin que acepta como entrada una o
ms relaciones y produce una sola relacin de salida. El resultado de cada consulta SQL
es una relacin; incluso si el resultado es un nmero independiente, ese nmero se
considera como una relacin con un solo rengln y una sola columna. Por lo tanto,
SQLes como el lgebra relacional: cerrado.
>-
CONSULTA DE UNA
En esta seccin consideramos las facilidades SQLpara consultar una tabla independiente.
Ms adelante analizaremos tablas mltiples y enunciados de actualizacin. Por costumbre, las palabras reservadas de SQLtales como SELECTy FROMestn escritas con letras
maysculas. Tambin, los enunciados SQLpor lo general se escriben en lneas mltiples,
como se muestra en este captulo. Sin embargo, los compiladores de lenguaje SQLno requieren ni letras maysculas ni lneas mltiples. Estas convenciones se usan slo para
proporcionar una claridad especial a quienes leen los enunciados SQL.
Usamos el mismo conjunto de seis relaciones con las que ilustramos el lgebra relacional en el captulo 8. La estructura de estas relaciones se ejemplifica en la figura
9-1 y los datos de muestra para tres de ellas aparecen en la figura 9-2.
Relaciones usadas
para los ejemplos
SQL
Captulo
EID
nueve
Lenguaje
Nombre
de consulta
Especialidad
estructurado
237
Grado
Datos de muestra
usados en los
ejemplos SQL:
(a) relacin ESTUDIANTE, (b) relacin
INSCRIPCIN, y
(e) relacin CLASE
(a)
NmerodeEstudiante
NombredeClase
NmerodePosicin
(b)
Nombre
Horario
Aula
(e)
Para formar una proyeccin con SQL nombramos la relacin a proyectarse y listamos
las columnas que van a ser mostradas. Utilizando la sintaxis estndar SQL, la proyeccin ESTUDIANTE[EID,Nombre, Especialidad] se especifica como
SELECT
FROM
Las palabras reservadas SELECTy FROM siempre se requieren; las columnas a obtener
se listan despus de la palabra reservada SELECT,y la tabla que se va a usar se enumera
despus de la palabra reservada FROM. El resultado de esta proyeccin para los datos
de la figura 9-2 es
238
Parte cuatro
Implementacin
relacional
Especialidad
ESTUDIANTE
DISTINCTEspecialidad
ESTUDIANTE
ES
El operador de seleccin de lgebra relacional tambin se lleva a cabo con la orden SQL
SELECT.Un ejemplo de esto es:
SELECT
FROM
WHERE
Esta expresin SELECTespecifica los nombres de todas las columnas de las tablas.
FROMespecifica la tabla que hay que usar, y la nueva frase, WHERE,proporciona la(s)
condicin(es) para la seleccin. El formato SELECT-FROM-WHERE
es la estructura fundamental de los enunciados SQL.La siguiente es una forma equivalente de la consulta
anterior:
SELECT
FROM
WHERE
ESTUDIANTE
Especialidad == 'MATEMTICAS'
Captulo
nueve
Lenguaje
de consulta
estructurado
239
El asterisco (*) significa que deben obtenerse todas las columnas de la tabla. El resultado de ambas consultas es:
Nombre, Grado
ESTUDIANTE
Especialidad = 'MATEMTICAS'
El resultado es:
Nombre, Grado
ESTUDIANTE
Especialidad = 'MATEMTICAS'Y Grado
= 'GR'
se obtiene lo siguiente:
Las condiciones en las clusulas WHEREse pueden referir a un conjunto de valores. Para hacer esto, se pueden usar las palabras reservadas IN o NOT IN. Considere:
SELECT
FROM
WHERE
Nombre
ESTUDIANTE
Especialidad IN ['MATEMTICAS','CONTABILIDAD']
Observe que dentro de los corchetes se pueden colocar valores mltiples. Esta expresin significa: "Desplegar los nombres de los estudiantes que tienen una especialidad,
ya sea en matemticas o en contabilidad". El resultado es:
La expresin:
SELECT
FROM
WI-IERE
Nombre
ESTUDIANTE
Especialidad NOT IN ['MATEMTICAS','CONTABILIDAD']
240
Parte cuatro
Implementacin
de bases de datos
con el modelo
relacional
hace que aparezcan los nombres de estudiantes que no tienen especialidad en matemticas o contabilidad. El resultado es:
La expresin ESPECIALIDADIN significa que el valor de la columna Especialidad puede ser igual a cualquiera de las especialidades listadas. Esto es equivalente al operador
lgico ORoLa expresin ESPECIALIDADNOT IN significa que el valor debe ser diferente a todas las especialidades listadas.
Las clusulas WHERE tambin se pueden referir a rangos y valores parciales. La
palabra reservada BETWEENse usa para los rangos. Por ejemplo, con el enunciado:
SELECT
FROM
WI-IERE
Nombre, Especialidad
ESTUDIANTE
EID BETWEEN200 AND 300
Nombre, Especialidad
ESTUDIANTE
EID >= 200 AND EID <= 300
Por lo tanto, los valores finales de BETWEEN(200 y 300 en este caso) estn incluidos
en el rango seleccionado.
La palabra reservada LIKEse usa en expresiones SQLpara seleccionar valores parciales. El smbolo_ (guin bajo) representa un carcter independiente no especificado el
smbolo % representa una serie de uno o ms caracteres no especificados. As, el resultado de la expresin:
SELECT
FROM
WI-IERE
Nombre, Grado
ESTUDIANTE
Grado LIKE'_R'
es una relacin que tiene las columnas Nombre y Grado, donde Grado consta de dos
caracteres, el segundo de los cuales es R:
Nombre
ESTUDIANTE
Nombre LIKE'CJ6S'
el resultado es:
Captulo
nueve
Lenguaje
de consulta
estructurado
241
Cabe sealar que Microsoft Accessusa un conjunto de smbolos comodines diferentes a la norma ANSI.Un II?" se usa en lugar del guin bajo, y un 11*" se emplea en lugar
de 11%".
Por ltimo, las palabras reservadas ISNULLse usan para buscar valores nulos (o faltantes). Con la expresin:
SELECT
FROM
WHERE
Nombre
ESTUDIANTE
Grado 1SNULL
se obtendrn los nombres de los estudiantes que no tienen un valor registrado de Grado. Para los datos de la figura 9-2 todos los estudiantes tienen un Grado y esta expresin regresar una relacin sin renglones.
ORDENAMIENTO
Los renglones del resultado de la relacin se pueden ordenar por los valores de una o
ms columnas. Considere el siguiente ejemplo:
SELECT
FROM
WHERE
ORDERBY
Se puede elegir ms de una columna para el ordenamiento. Si es as, la primera columna listada ser el campo ordenado de la especialidad; la segunda, el siguiente campo ordenado de la especialidad, y as sucesivamente. Las columnas tambin pueden
declararse como ascendentes (ASC)o descendentes (DESC),como se muestra en el siguiente enunciado:
SELECT
FROM
WHERE
ORDERBY
El resultado es:
242
Pa rt e cu a tro
COUNT(*)
ESTUDIANTE
cuenta el nmero de renglones ESTUDIANTEy despliega ese total en una tabla con un
rengln independiente y una sola columna:
COUNT(Especialidad)
ESTUDIANTE
y
SELECT
FROM
COUNT (DISTINCTEspecialidad)
ESTUDIANTE
La primera expresin cuenta todas las especialidades, incluyendo duplicados, y la segunda cuenta slo las especialidades nicas. Los resultados son:
respectivamente.
Con excepcin de GROUPBY(que analizaremos a continuacin), las funciones interconstruidas no se pueden mezclar con los nombres de las columnas en el enunciado
SELECT.As,
SELECT
no est permitido.
Las funciones interconstruidas se pueden usar para solicitar un resultado, como en
los ejemplos anteriores. En la mayora de las implementaciones de SQLy en la norma
ANSIde SQL,las funciones interconstruidas no se pueden usar como parte de una clusula WHERE.
FUNCIONES
INTERCONSTRUIDAS
y DE AGRUPAMIENTO
Para aumentar su utilidad, se pueden aplicar funciones interconstruidas a grupos de renglones dentro de una tabla. Estos grupos se forman uniendo esos renglones (en forma lgica, no fsica) que tengan el mismo valor de una columna especfica, Por ejemplo, se
2 A veces
las funciones construidas se conocen como funciones agregadas para distinguirlas de las
funciones interconstruicIas de lenguajes eleprogramacin tales como SUBSTR1NG.
Captulo
nueve
Lenguaje
de consulta
estructurado
243
pueden agrupar los estudiantes por especialidad, lo que significa que un grupo estar formado por cada valor de ESPECIALIDAD.
Para los datos de la figura 9-2, hay un grupo de
estudiantes de HISTORIA,otro de CONTABILIDAD,y otro ms de MATEMTICAS.
La palabra reservada de SQL:GROUP BY,instruye al DBMSa que agrupe esos renglones que tengan el mismo valor de una columna. Considere:
SELECT
FROM
GROUPBY
Los renglones de la tabla ESTUDIANTEse han agrupado en forma lgica por el valor de
ESPECIALIDAD,y la funcin COUNT suma el nmero de renglones en cada grupo. El
resultado es una tabla con dos columnas, el nombre de la especialidad y la suma. Para
los subgrupos se pueden especificar las columnas y las funciones interconstruidas en el
enunciado SELECT.
En algunos casos no queremos considerar todos los grupos. Por ejemplo, podramos formar grupos de estudiantes con la misma especialidad y considerar slo aquellos
grupos que tengan ms de dos estudiantes. En este caso, usaramos la clusula SQL
HAVINGpara identificar el subconjunto de grupos que deseamos considerar.
Los siguientes enunciados SQLpueden listar las especialidades que tengan ms de
dos estudiantes y tambin la cuenta de estudiantes en cada una de las especialidades.
SELECT
FROM
GROUPBY
HAVING
Para una generalidad aun mayor se pueden agregar las clusulas WHERE.Sin embargo,
al hacerlo se pueden generar ambigedades. Por ejemplo,
SELECT
FROM
WHERE
GROUPBY
HAVING
El resultado de esta expresin diferir dependiendo de si la condicin WHEREse aplica o no antes o despus de la condicin HAVING.Para eliminar esta incertidumbre, la
norma SQL especifica que las clusulas WHEREdebern ser aplicadas primero. En concordancia, en los enunciados anteriores las operaciones son: seleccionar a los estudiantes graduados; formar los grupos; seleccionar los grupos que cumplan la condicin HAVING; desplegar los resultados. En este caso, el resultado es:
244
Parte cuatro
Implementacin
de bases de datos
con el modelo
relacional
(No hay que perder de vista que esta consulta no es vlida para todas las implementaciones SQL.Para algunas, los nicos atributos que pueden aparecer en la frase SELECT
de una consulta con GROUP BY son los atributos que pueden aparecer en la frase
GROUPBYy las funciones interconstruidas de esos atributos. As, en esta consulta slo
seran permitidas ESPECIALIDADy las funciones interconstruidas de ESPECIALIDAD.)
>-
CONSULTAS
En esta seccin ampliamos nuestro anlisis de SQL para incluir operaciones en dos o
ms tablas. Los datos de la figura 9-2 ESTUDIANTE,CLASE,e INSCRIPCINse utilizan
para ilustrar estos comandos SQL.
RECUPERACIN
Suponga que necesitamos saber los nombres de aquellos estudiantes inscritos en la clase BD445. Si sabemos que los estudiantes con EID de 100 y 200 estn inscritos en esa
clase, lo siguiente producir los nombres correctos:
SELECT
FROM
WHERE
Nombre
ESTUDIANTE
EID IN [lOO, 200]
En general no conocemos los EID de los estudiantes en una clase, pero tenemos los
medios para encontrarlos. Examine la expresin:
SELECT
FROM
WHERE
NmerodeEstudiante
INSCRIPCIN
NombredeClase = 'BD445'
stos son los nmeros de estudiantes que necesitamos. Combinando las ltimas dos
consultas, obtenemos lo siguiente:
SELECT
FROM
WHERE
Nombre
ESTUDIANTE
EID IN
(SELECT
FROM
WHERE
NmerodeEstudiante
INSCRIPCIN
NombredeClase = 'BD445')
Captulo
nueve
Lenguaje
de consulta
estructurado
245
CLASE.Nombre
CLASE
Horario = 'LMV3'
(Puesto que estamos tratando con tres tablas diferentes, calificamos los nombres de las
columnas con los nombres de las tablas para evitar confusin y ambigedad. AS,CLASE.Nombre se refiere a la columna Nombre en la relacin CLASE.)
Ahora obtenemos los nmeros de identificacin de los estudiantes en estas clases
usando la siguiente expresin:
SELECT
FROM
WHERE
INSCRIPCIN.NmerodeEstudiante
INSCRIPCIN
INSCRIPCIN.ClaseNombre IN
(SELECT CLASE.Nombre
FROM
CLASE
WHERE
HORARIO= 'LMV3')
los cuales son los nmeros de los estudiantes en la clase LMV3. Para obtener los nombres de aquellos estudiantes, especificamos:
SELECT
FROM
WHERE
ESTUDIANTE.Nombre
ESTUDIANTE
ESTUDIANTE.EIDIN
(SELECTINSCRIPCIN.NmerodeEstudian te
FROMINSCRIPCIN
WHEREINSCRIPCIN.NombredeClase IN
(SELECTCLASE.Nombre IN
FROM
CLASE
WHERE CLASE.Horario = 'LMV3'))
El resultado es:
Esta estrategia funciona bien siempre que los atributos en la respuesta provengan
de una sola tabla. Sin embargo, si el resultado proviene de dos o ms tablas tendremos
un problema. Por ejemplo, suponga que queremos saber los nombres de los estudiantes y los de sus clases. Digamos que necesitamos EID, NombredelEstudiante, y Nom-
246
Parte cuatro
Implementacin
relacional
bredeClase. En este caso, los resultados provienen de dos tablas diferentes (ESTUDIANTE e INSCRIPCIN)y as la estrategia de la subconsulta no funcionar.
SQL
Para producir el EID, Nombre y NombredeClase para todos los estudiantes, debemos
hacer el join de la tabla ESTUDIANTEcon la tabla INSCRIPCIN.Los siguientes enunciados harn esto:
SELECT
FROM
WHERE
ESTUDIANTE.EID,
ESTUDIANTE.Nombre,INSCRIPCIN.NombredeClase
ESTUDIANTE,INSCRIPCIN
ESTUDIANTE.EID= INSCRIPCIN.NmerodeEstudiante
ESTUDIANTE.EIDINSCRIPCIN.NombredeClase
ESTUDIANTE,INSCRIPCIN
ESTUDIANTE.EID= INSCRIPCIN.NmerodeEstudiante
ESTUDIANTE.
Nombre = 'RYE'
INSCRIPCIN.NmerodePosicin = 1
Cuando se necesiten datos de ms de dos tablas, podemos usar una estrategia similar. En el siguiente ejemplo se juntan tres tablas:
SELEer
FROM
WHERE
AND
AND
ESTUDIANTE.EID,CLASE.Nombre,CLASE.Horario,
INSCRIPCIN.NmerodePosicin
ESTUDIANTE,INSCRIPCIN,CLASE
ESTUDIANTE.EID= INSCRIPCIN.NmerodeEstudiante
INSCRIPCIN.NombredeClase = CLASE.Nombre
ESTUDIANTE.
Nombre = 'BAKER'
Ca ptul
COMPARACiN
11 ueve
247
Se puede usar un join como forma alternativa de expresin para muchas subconsultas.
Por ejemplo, usamos una subconsulta para encontrar a los estudiantes inscritos en la
clase BD445. Tambin podemos usar un join para expresar esta consulta:
SELECT
FROM
WHERE
AND
ESTUDIANTE.
Nombre
ESTUDIANTE,INSCRIPCIN
ESTUDIANTE.EID= INSCRIPCIN.NmerodeEstudiante
INSCRIPCIN.NombredeClase = 'BD445'
De manera similar, la consulta: Cules son los nombres de los estudiantes en las
clases LMVa las 37" se puede expresar como:
11
SELECT
FROM
WHERE
AND
AND
ESTUDIANTE.NOMBRE
ESTUDIANTE,INSCRIPCIN,CLASE
ESTUDIANTE.EID= INSCRIPCIN.NmerodeEstudiante
INSCRIPCIN.NombredeClase = CLASE.Nombre
CLASE.Horario = 'LMV3'
Aunque las expresiones del join pueden sustituir a muchas expresiones de subconsultas, no pueden reemplazarlas a todas. Por ejemplo, las subconsultas que implican
EXISTSy NOT EXISTS(las cuales analizaremos en la siguiente seccin) no se pueden
representar por medio de un join.
De igual forma, las subconsultas no se pueden sustituir por todos los join. Cuando
usamos una unin, las columnas desplegadas pueden provenir de cualquiera de las tablas juntadas, pero cuando usamos una subconsulta las columnas desplegadas pueden
provenir slo de la tabla indicada en la expresin FROM en elprimer SELECT.Por
ejemplo, supongamos que queremos saber los nombres de las clases que toman los no
graduados. Podemos expresar esto como una subconsulta:
SELECT
PROM
WHERE
DISTINCTNombredeClase
INSCRIPCIN
Nmerodelistudiante IN
(SELECTEID
FROMESTUDIANTE
WI-IEREGrado NOT = 'GR')
o como un join:
SELECT
FROM
WHERE
AND
DISTINCTINSCRIPCIN.NombredeClase
INSCRIPCIN,ESTUDIANTE
INSCRIPCIN.NmerodeEstudiante = ESTUDIANTE.EID
ESTUDIANTE.Grado NOT = 'GR'
Pero si queremos conocer los nombres de las clases y los niveles de grado de los estudiantes que an no terminan su posgrado, debemos usar un join. Una subconsulta
no ser suficiente porque los resultados deseados provienen de dos tablas diferentes.
Esto es, los nombres de las clases en INSCRIPCINy los nombres de los estudiantes se
almacenan en ESTUDIANTE.Lo siguiente arroja la respuesta correcta:
248
Parte cuatro
Implementacin
SELECT
FROM
WHERE
AND
relacional
DISTINCTINSCRIPCIN.NombredeClase! ESTUDIANTE.
Grado
INSCRIPCIN!ESTUDIANTE
INSCRIPCIN.NmerodeEstudiante = ESTUDIANTE.EID
ESTUDIANTE.Grado NOT = !GR!
El resultado es:
OUTER JOIN
La norma SQL de la ANSI no avala los outer join. Sin embargo! muchos productos
DBMSlos manejan. Aqu ilustraremos el uso de uno de ellos.
Suponga que queremos una lista de todos los estudiantes y los nombres de las clases que toman! y que adems deseamos incluir a todos los estudiantes! incluso aquellos
que no estn tomando clases. La siguiente expresin SQL dar este resultado utilizando Microsoft Access:
SELECT
FROM
Nombre! NombredeClase
ESTUDIANTELEFTJOIN INSCRIPCIN
ON EID = NmerodeEstudiante;
El resultado es:
>-
EXISTS y NOT
EXISTSy NOT EXISTSson operadores lgicos cuyo valor puede ser verdadero o falso! dependiendo de la presencia o ausencia de renglones que cumplan las condiciones calificativas. Por ejemplo! suponga que deseamos saber los nmeros de estudiantes inscritos en
ms de una clase.
Captulo
SELECT
PROM
WHERE
nueve
Lenguaje
de consulta
estructurado
249
DISTINCTNmerodeEstucliante
INSCRIPCINA
EXISTS
(SELECT *
INSCRIPCINB
PROM
WHERE
A.NmerodeEstudiante = B.NmerodeEstudiante
AND A.NombredeClase NOT = B.NombrecleCIase)
En este ejemplo, tanto la consulta como la subconsulta se refieren a la tabla INSCRIPCIN.Para evitar la ambigedad, a estos dos usos de INSCRIPCINse les ha asignado un nombre diferente. En el primer enunciado PROM, a INSCRIPCINse le ha
asignado, temporal y arbitrariamente, el nombre A, y en el segundo enunciado PROM,
el nombre B.
El significado de la expresin subconsulta es: Encontrar dos renglones en INSCRIPCIN que tengan el mismo nmero de estudiante, pero diferentes nombres de clases
(lo cual significa que el estudiante est tomando ms de una clase). Si existen dos de estos renglones, entonces el valor lgico de EXISTSes verdadero. En este caso, presentamos el nmero de estudiante en la respuesta. De otra manera, el valor lgico de EXISTS
es falso, as que no presentamos ese EID en la respuesta.
Otra forma de ver esta consulta es imaginar dos copias separadas e idnticas de la
tabla INSCRIPCIN.Nombre a una copia Tabla A y a la otra Tabla B. Compare cada
rengln de la tabla A con cada rengln de la B. Primero busque en el primer rengln
en A y en el primer rengln de B. En este caso, puesto que ambos son idnticos, tanto
NmerosdeEstudiantes como NombresdeClases son iguales, as que no desplegamos
el EID.
Ahora observe el primer rengln en A y el segundo rengln en B. Si NmerosdeEstudiantes son los mismos y NombresdeClases son diferentes, desplegamos NmerodeEstudiante. Esencialmente, estamos comparando el primer rengln de INSCRIPCIN con el segundo rengln de INSCRIPCIN. Para los datos de la figura 9-2, ni
NmerosdeEstudiantes ni NombresdeClases son iguales.
Continuamos comparando el primer rengln de A con cada rengln de B, Si las condiciones se cumplen imprimimos el NmerodeEstudiante. Cuando se hayan examinado
todos los renglones en 13,nos movemos al segundo rengln de A y lo comparamos con todos los renglones en B (realmente, si estamos considerando los 11 renglones en A, slo se
necesita considerar en B los renglones mayores que 11).
El resultado de esta consulta es:
Para ilustrar la aplicacin NOT EXISTSsuponga que queremos conocer los nombres de los estudiantes que asisten a todas las clases. Otra forma de establecer lo anterior es que queremos los nombres de los estudiantes donde no haya clases que stos no
tomen. Lo siguiente expresa esto:
SELECT
PROM
WHERE
ESTUDIANTE.Nombre
ESTUDIANTE
NOTEXISTS
(SELECT *
PROM INSCRIPCIN
WI-IERE NOT EXISTS
(SELECT *
CLASE
PROM
WHERE CLASE.Nombre = INSCRIPCIN.NombredeClase
INSCRIPCrN.NmerodeEstudiante = ESTUDlANAND
TE.EID
250
Parte cuatro
Implementacin
de bases de datos
con el modelo
relacional
Esta consulta tiene tres partes. En la inferior, se encuentran las clases que el estudiante
ha tomado. La parte media determina si se encontraron algunas clases que el estudiante no haya tomado. De lo contrario, significa que el estudiante est tomando todas las
clases y su nombre ser desplegado.
Esta consulta puede ser difcil de comprender. Si tiene problemas use los datos de
la figura 9-2 y siga las instrucciones. Para estos datos la respuesta es que ningn estudiante est tomando todas sus clases. Puede tratar de cambiar los datos, de tal forma
que un estudiante tome todas las clases. Otra forma de analizar esta consulta es tratar
de resolverla de otra manera usando NOT EXISTS.Los problemas que encuentre le ayudarn a comprender por qu NOT EXISTSes necesario.
>-
CAMB
SQLtiene medios para cambiar datos en tablas insertando renglones nuevos, eliminando renglones, y modificando los valores de los renglones existentes. SQLtambin puede
cambiar la estructura de los datos, pero esto lo abordaremos hasta los captulos 12
y 13.
DE
En una tabla se pueden insertar renglones uno por uno o en grupos. Para insertar uno
slo establecemos:
INSERT
INTO INSCRIPCIN
VALUES(400, 'BD445', 44)
INTO INSCRIPCIN
(NmerodeEstudiante, NombredeClase)
VALUES(400, 'BD445')
INTO]UNIOR
VALES
(SELECTEID, Nombre, Especialidad
FROM
ESTUDIANTE
WHERE
Grado = ']R')
Se pueden usar las expresiones contenidas en SELECTy todas las SELECTde SQL
desarrolladas en las dos secciones anteriores para identificar los renglones que sern
copiados. Esta caracterstica ofrece capacidades bastante poderosas.
DE DATOS
Al igual que con la insercin, los renglones se pueden eliminar uno por uno o en grupos. El siguiente ejemplo suprime el rengln para Estudiante 100:
DELETE
WHERE
FROMESTUDIANTE
ESTUDIANTE.EID= 100
Captulo
nueve
Lenguaje
de consulta
estructurado
251
Observe que si Estudiante 100 est inscrito en las clases, esta eliminacin causar
un problema de integridad: como los renglones de INSCRIPCINtienen NmerodeEstudiante = 100 no tendrn correspondencia con el rengln ESTUDIANTE.
Los grupos de renglones se pueden borrar como se muestra en los dos ejemplos siguientes, lo cual elimina todas las inscripciones para la especialidad de contabilidad,
as como tambin a todos los estudiantes de esa especialidad.
DELETE
WHERE
DELETE
WHERE
PROMINSCRIPCIN
INSCRIPCIN.Nmeroc1eEshlclianteIN
(SELECT ESTUDIANTE.EID
PROM
ESTUDIANTE
WI-IERE
ESTUDIANTE.Especialidad= 'Contabilidad')
PROM ESTUDIANTE
ESTUDIANTE.Especialidad = 'Contabilidad'
MODiFiCACiN
DE DATOS
Los renglones tambin se pueden modificar uno a la vez o en grupos. La palabra reservada SETse usa para cambiar el valor de una columna. Despus de SET,se cambia el
nombre de la columna y se especifica el nuevo valor o la forma de calcularlo. Considere dos ejemplos:
UPDATE
SET
WHERE
INSCRIPCIN
Nrnerodef'osicin
EID = 400
= 44
INSCRIPCIN
NmerodePosicin
EID = 400
= MAX (NmerodePosicin) +
y
UPDATE
SET
WHERE
INSCRIPCIN
NombredeClase = 'BD564'
NombredeClase = 'BD445'
CLASE
NombredeClase = 'BD564'
NombrecleClase = 'BD445'
252
Parte cuatro
Implementacin
de bases de datos
con el modelo
relacional
SQLes el lenguaje de manejo de datos relacionales ms importante que hay. Se ha convertido en el estndar para el intercambio de informacin entre computadoras, y su
popularidad contina en aumento. Los enunciados SQL que operan en una sola tabla
incluyen SELECT,SELECTcon WHERE,SELECTcon GROUPBYy SELECTcon GROUP
BYy HAVING.SQLtambin contiene las funciones interconstruidas de COUNT,SUM,
AVG,MAXy MIN.
Las operaciones en dos o ms tablas se pueden hacer usando subconsultas, join,
EXISTSy NOT EXISTS.Las subconsultas y los join realizan muchas de las mismas operaciones, pero no las sustituyen completamente. Las subconsultas requieren que los
atributos recuperados provengan de una relacin independiente, pero los join, no. Por
otro lado, algunas consultas son posibles con subconsultas y EXISTSy NOT EXISTS,las
cuales son imposibles con los join.
Los enunciados SQL para la modificacin de datos incluyen las rdenes INSERT,
DELETEy UPDATE,que se usan para agregar, remover y cambiar valores de datos.
En este captulo presentamos los comandos bsicos SQL de manera genrica, y en
los captulos 13, 14, Y1610s usaremos para procesar una base de datos empleando productos comerciales DBMS.
9.8
Muestre los nombres de los clientes que se localicen en una Ciudad que termine
con S.
9.9
Muestre los nombres y los salarios de todos los vendedores que no tengan un
pedido con Abernathy Construction, en orden ascendente de salario.
Captulo
nueve
Lenguaje
de consulta
estructurado
253
Nombre
PorcentajedeCuota
Salario
Datos de muestra
para las preguntas
del grupo 1
VENDEDOR
Nmero
NombredelCliente
NombredelVendedor
Cantidad
PEDIDO
Nombre
CLIENTE
Ciudad
Tipodelndustria
254
Parte cuatro
Implementacin
relacional
9.23 Muestre los nombres y porcentajes de cuota de los vendedores que tengan dos o
ms pedidos.
9.24 Muestre los nombres y edades de los vendedores que tengan un pedido con todos los clientes.
9.25 Muestre un enunciado SQLpara insertar un nuevo rengln en CLIENTE.
9.26 Muestre un enunciado SQLpara insertar un nombre nuevo y edad en VENDEDOR; suponga que el salario no est determinado.
9.27 Muestre un enunciado SQLpara insertar renglones en una tabla nueva, ALTORENDIMIENTO(Nombre, salaria), el cual incluya que un vendedor debe tener
un salario de cuando menos $100000.
9.28 Muestre un enunciado SQL para borrar un cliente de ABERNATHY
CONSTRUCTION.
9.29 Muestre un enunciado SQLpara eliminar todos los pedidos de ABERNATHY
CONSTRUCTION.
9.30 Muestre un enunciado SQLpara cambiar el salario del vendedor ]AIMESa
$45,000.
9.31 Muestre un enunciado SQLpara dar a todos los vendedores un aumento de 10
por ciento.
9.32 Suponga que el vendedor ]AIMEScambia su apellido a PARKER.Muestre el
enunciado SQL que crea los cambios apropiados.
~ PREGU
9.33 Instale Accss 2002 y abra la base de datos Northwind. Use la herramienta
Query-by-design/SQL View; escriba los enunciados SQLpara las siguientes preguntas e imprmalas.
a. Liste todas las columnas de proveedores
b. Liste NombredelaCompafia de los proveedores con NombredeCompafia
empezando con I/Nuevo,i
c. Liste todas las columnas de los productos que abastecen los proveedores con
NombredeCompafia empezando con "Nuevo", Muestre las respuestas usando un [oin y una subconsulta
d. Liste NiveldeReordenamiento y cuente todos los productos
e. Liste NiveldeReordenamiento y cuente todos los NivelesdeReordenamiento
que tengan ms de un elemento
f. Liste NiveldeReordenamiento y cuente todos los NivelesdeReordenamiento
que tengan ms de un elemento para los productos de los proveedores cuyos
nombres empiecen con "Nuevo"
Suponga que FiredUp ha creado una base de datos con las siguientes tablas:
CLIENTE(ClienteSK, Nombre, Telfono, CorreoElectrnico)
ESTUFA(NmerodeSere, Tipo, Versin, FechadeFabricacin)
REGISTRO(ClenteSK, Nz/JwrodeSerie, Fecha)
REPARACIN_ESTUFA
(NmerodeFacturacleReparacill, Nmetodesetie, Fecha,
Descripcin, Costo, ClienteSK)