Introduccion a SQL

19
Relaciones usadas para los ejemplos SQL En esta sección consideramos las facilidades SQLpara consultar una tabla independiente. Más adelante analizaremos tablas múltiples y enunciados de actualización. Por costum- bre, las palabras reservadas de SQLtales como SELECTy FROMestán escritas con letras mayúsculas. También, los enunciados SQLpor lo general se escriben en líneas múltiples, como se muestra en este capítulo. Sin embargo, los compiladores de lenguaje SQLno re- quieren ni letras mayúsculas ni líneas múltiples. Estas convenciones se usan sólo para proporcionar una claridad especial a quienes leen los enunciados SQL. Usamos el mismo conjunto de seis relaciones con las que ilustramos el álgebra re- lacional en el capítulo 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. >- CONSULTA DE UNA En este capítulo presentamos enunciados interactivos SQLque necesitan ser ajusta- dos y modificados cuando se implantan en programas, como se muestra en los capítulos 12 y 13. Elpresente capítulo se refiere sólo a los enunciados para el manejo de datos; en los capítulos 12 y 13 se analizan los enunciados de definición de datos. SQLes un lenguaje orientado a la transformación que acepta como entrada una o más relaciones y produce una sola relación de salida. Elresultado de cada consulta SQL es una relación; incluso si el resultado es un número independiente, ese número se considera como una relación con un solo renglón y una sola columna. Por lo tanto, SQLes como el álgebra relacional: cerrado. 236 Parte cuatro Implementación de bases de datos con el modelo relacional

description

Libro introductorio a Sql Ejercicios completos, Para ingenieros.

Transcript of Introduccion a SQL

  • Relaciones usadaspara los ejemplosSQL

    En esta seccin consideramos las facilidades SQLpara consultar una tabla independiente.Ms adelante analizaremos tablas mltiples y enunciados de actualizacin. Por costum-bre, las palabras reservadas de SQLtales como SELECTy FROMestn escritas con letrasmaysculas. Tambin, los enunciados SQLpor lo general se escriben en lneas mltiples,como se muestra en este captulo. Sin embargo, los compiladores de lenguaje SQLno re-quieren ni letras maysculas ni lneas mltiples. Estas convenciones se usan slo paraproporcionar una claridad especial a quienes leen los enunciados SQL.

    Usamos el mismo conjunto de seis relaciones con las que ilustramos el lgebra re-lacional en el captulo 8. La estructura de estas relaciones se ejemplifica en la figura9-1 y los datos de muestra para tres de ellas aparecen en la figura 9-2.

    >- CONSULTA DE UNA

    En este captulo presentamos enunciados interactivos SQLque necesitan ser ajusta-dos y modificados cuando se implantan en programas, como se muestra en los captulos12 y 13. Elpresente captulo se refiere slo a los enunciados para el manejo de datos; enlos captulos 12 y 13 se analizan los enunciados de definicin de datos.

    SQLes un lenguaje orientado a la transformacin que acepta como entrada una oms relaciones y produce una sola relacin de salida. El resultado de cada consulta SQLes una relacin; incluso si el resultado es un nmero independiente, ese nmero seconsidera como una relacin con un solo rengln y una sola columna. Por lo tanto,SQLes como el lgebra relacional: cerrado.

    236 Parte cuatro Implementacin de bases de datos con el modelo relacional

  • Las palabras reservadas SELECTy FROMsiempre se requieren; las columnas a obtenerse listan despus de la palabra reservada SELECT,y la tabla que se va a usar se enumeradespus de la palabra reservada FROM.El resultado de esta proyeccin para los datosde la figura 9-2 es

    EID,Nombre, EspecialidadESTUDIANTE

    SELECTFROM

    Para formar una proyeccin con SQLnombramos la relacin a proyectarse y listamoslas columnas que van a ser mostradas. Utilizando la sintaxis estndar SQL, la proyec-cin ESTUDIANTE[EID,Nombre, Especialidad] se especifica como

    (e)

    AulaHorarioNombre

    (b)

    Nmero-dePosicin

    Nombre-deClase

    Nmerode-Estudiante

    (a)

    Datos de muestrausados en losejemplos SQL:(a) relacin ESTU-DIANTE, (b) relacinINSCRIPCIN, y(e) relacin CLASE

    GradoEspecialidadNombreEID

    Captulo nueve Lenguaje de consulta estructurado 237

  • ESTUDIANTEEspecialidad == 'MATEMTICAS'

    *SELECTFROMWHERE

    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-WHEREes la estructura fun-damental de los enunciados SQL.La siguiente es una forma equivalente de la consultaanterior:

    EID, Nombre, Especialidad, GradoESTUDIANTEEspecialidad = 'MATEMTICAS'

    SELECTFROMWHERE

    El operador de seleccin de lgebra relacional tambin se lleva a cabo con la orden SQLSELECT.Un ejemplo de esto es:

    ES

    El resultado de esta operacin es la relacin:

    DISTINCTEspecialidadESTUDIANTE

    SELECTFROM

    Como puede ver, esta tabla contiene renglones duplicados y, en consecuencia, enun sentido estricto esta tabla no es una relacin. De hecho, SQLno elimina automti-camente los duplicados porque puede tomar mucho tiempo y en muchos casos no esdeseable ni necesario.

    Si se deben eliminar los renglones duplicados el calificador DISTINCTdebe ser es-pecificado as:

    El resultado de esta operacin es el siguiente:

    EspecialidadESTUDIANTE

    SELECTFROM

    No confunda la palabra reservada SELECTcon el operador de seleccin del lgebrarelacional. SELECTes un verbo SQLque se puede usar para realizar una proyeccin delgebra relacional, seleccionar, y especificar otras acciones. Por otra parte, Seleccin di-fiere de SELECTporque es la operacin de lgebra relacional para obtener un subcon-junto de renglones de una tabla.

    Considere otro ejemplo:

    238 Parte cuatro Implementacin de bases de datos con el modelo relacional

  • NombreESTUDIANTEEspecialidad NOT IN ['MATEMTICAS','CONTABILIDAD']

    SELECTFROMWI-IERE

    La expresin:

    Observe que dentro de los corchetes se pueden colocar valores mltiples. Esta expre-sin significa: "Desplegar los nombres de los estudiantes que tienen una especialidad,ya sea en matemticas o en contabilidad". El resultado es:

    NombreESTUDIANTEEspecialidad IN ['MATEMTICAS','CONTABILIDAD']

    SELECTFROMWHERE

    Las condiciones en las clusulas WHEREse pueden referir a un conjunto de valo-res. Para hacer esto, se pueden usar las palabras reservadas IN o NOT IN. Considere:

    se obtiene lo siguiente:

    Nombre, GradoESTUDIANTEEspecialidad = 'MATEMTICAS'Y Grado = 'GR'

    SELECTFROMWHERE

    Sepueden expresar varias condiciones en la clusula WHERE.Por ejemplo, con laexpresin:

    Nombre, GradoESTUDIANTEEspecialidad = 'MATEMTICAS'

    El resultado es:

    SELECTFROMWHERE

    Podemos combinar la seleccin y la proyeccin como sigue:

    El asterisco (*) significa que deben obtenerse todas las columnas de la tabla. El resulta-do de ambas consultas es:

    Captulo nueve Lenguaje de consulta estructurado 239

  • NombreESTUDIANTENombre LIKE'CJ6S'

    el resultado es:

    SELECTFROMWHERE

    De manera similar, la siguiente expresin encontrar a los estudiantes cuyos apellidosterminen con S:

    es una relacin que tiene las columnas Nombre y Grado, donde Grado consta de doscaracteres, el segundo de los cuales es R:

    Nombre, GradoESTUDIANTEGrado LIKE'_R'

    SELECTFROMWI-IERE

    Por lo tanto, los valores finales de BETWEEN(200 y 300 en este caso) estn incluidosen el rango seleccionado.

    La palabra reservada LIKEse usa en expresiones SQLpara seleccionar valores parcia-les. El smbolo_ (guin bajo) representa un carcter independiente no especificado elsmbolo % representa una serie de uno o ms caracteres no especificados. As, el resulta-do de la expresin:

    Nombre, EspecialidadESTUDIANTEEID >= 200 ANDEID

  • ORDERBYse puede combinar con cualquiera de los enunciados SELECT.

    El resultado es:

    Nombre, Especialidad, GradoESTUDIANTEGrado IN ['FR', 'SO', 'SN']Especialidad ASC,Grado DESC

    SELECTFROMWHEREORDERBY

    Sepuede elegir ms de una columna para el ordenamiento. Si es as, la primera co-lumna listada ser el campo ordenado de la especialidad; la segunda, el siguiente cam-po ordenado de la especialidad, y as sucesivamente. Las columnas tambin puedendeclararse como ascendentes (ASC)o descendentes (DESC),como se muestra en el si-guiente enunciado:

    Esta consulta listar las especialidades de contabilidad en secuencia ascendente por elvalor del nombre. El resultado es:

    Los renglones del resultado de la relacin se pueden ordenar por los valores de una oms columnas. Considere el siguiente ejemplo:

    SELECT Nombre, Especialidad, GradoFROM ESTUDIANTEWHERE Especialidad = 'CONTABILIDAD'ORDERBY Nombre

    ORDENAMIENTO

    se obtendrn los nombres de los estudiantes que no tienen un valor registrado de Gra-do. Para los datos de la figura 9-2 todos los estudiantes tienen un Grado y esta expre-sin regresar una relacin sin renglones.

    NombreESTUDIANTEGrado 1SNULL

    SELECTFROMWHERE

    Cabe sealar que Microsoft Accessusa un conjunto de smbolos comodines diferen-tes a la norma ANSI.Un II?" se usa en lugar del guin bajo, y un 11*" se emplea en lugarde 11%".

    Por ltimo, las palabras reservadas ISNULLse usan para buscar valores nulos (o fal-tantes). Con la expresin:

    Captulo nueve Lenguaje de consulta estructurado 241

  • 2Aveces las funciones construidas se conocen como funciones agregadas para distinguirlas de lasfunciones interconstruicIas de lenguajes eleprogramacin tales como SUBSTR1NG.

    Para aumentar su utilidad, se pueden aplicar funciones interconstruidas a grupos de ren-glones dentro de una tabla. Estosgrupos se forman uniendo esos renglones (en forma l-gica, no fsica) que tengan el mismo valor de una columna especfica, Por ejemplo, se

    FUNCIONES INTERCONSTRUIDAS y DE AGRUPAMIENTO

    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 normaANSIde SQL,las funciones interconstruidas no se pueden usar como parte de una clu-sula WHERE.

    Nombre, COUNT (*)SELECT

    respectivamente.Con excepcin de GROUPBY(que analizaremos a continuacin), las funciones in-

    terconstruidas no se pueden mezclar con los nombres de las columnas en el enunciadoSELECT.As,

    y

    La primera expresin cuenta todas las especialidades, incluyendo duplicados, y la se-gunda cuenta slo las especialidades nicas. Los resultados son:

    COUNT (DISTINCTEspecialidad)ESTUDIANTE

    y

    SELECTFROM

    COUNT(Especialidad)ESTUDIANTE

    SELECTFROM

    Considere las expresiones:

    cuenta el nmero de renglones ESTUDIANTEy despliega ese total en una tabla con unrengln independiente y una sola columna:

    COUNT(*)ESTUDIANTE

    SELECTFROM

    SQLproporciona cinco funciones interconstruidas: COUNT(contar), SUM(sumar), AVG(promediar), MAX(obtener el valor mximo) y MIN2(obtener el valor mnimo). AunqueCOUNTy SUMsuenan similares, son realmente diferentes. COUNT calcula el nmerode renglones en una tabla, mientras que SUM totaliza las columnas numricas, AVG,MAXy MIN tambin operan en columnas numricas: AVGcalcula el valor promedio,y MAXyMIN obtienen los valores mximos y mnimos de una columna en una tabla.

    La expresin de consulta:

    242 Pa rt e cu a tro Irn p l em en t a ci n de b a se s de ela to s con el m od e1o re l aci on a 1

  • El resultado de esta expresin diferir dependiendo de si la condicin WHEREse apli-ca o no antes o despus de la condicin HAVING.Para eliminar esta incertidumbre, lanorma SQLespecifica que las clusulas WHEREdebern ser aplicadas primero. En con-cordancia, en los enunciados anteriores las operaciones son: seleccionar a los estudian-tes graduados; formar los grupos; seleccionar los grupos que cumplan la condicin HA-VING; desplegar los resultados. En este caso, el resultado es:

    Especialidad, MAX(EID)ESTUDIANTEGrado = 'SN'EspecialidadCOUNT (*) > 1

    SELECTFROMWHEREGROUPBYHAVING

    Para una generalidad aun mayor se pueden agregar las clusulas WHERE.Sin embargo,al hacerlo se pueden generar ambigedades. Por ejemplo,

    Aqu se forman grupos de estudiantes con la misma especialidad y a continuacin seseleccionan los grupos que tienen ms de dos estudiantes (los dems grupos se igno-ran). La especialidad y la cuenta de estudiantes se produce en estos grupos selecciona-dos. El resultado es:

    SELECT Especialidad, COUNT (*)FROM ESTUDIANTEGROUPBY EspecialidadHAVING COUNT (*) > 2

    Los renglones de la tabla ESTUDIANTEse han agrupado en forma lgica por el valor deESPECIALIDAD,y la funcin COUNT suma el nmero de renglones en cada grupo. Elresultado es una tabla con dos columnas, el nombre de la especialidad y la suma. Paralos subgrupos se pueden especificar las columnas y las funciones interconstruidas en elenunciado SELECT.

    En algunos casos no queremos considerar todos los grupos. Por ejemplo, podra-mos formar grupos de estudiantes con la misma especialidad y considerar slo aquellosgrupos que tengan ms de dos estudiantes. En este caso, usaramos la clusula SQLHAVINGpara identificar el subconjunto de grupos que deseamos considerar.

    Los siguientes enunciados SQLpueden listar las especialidades que tengan ms dedos estudiantes y tambin la cuenta de estudiantes en cada una de las especialidades.

    SELECT Especialidad, COUNT (*)FROM ESTUDIANTEGROUPBY Especialidad

    El resultado de esta expresin es:

    pueden agrupar los estudiantes por especialidad, lo que significa que un grupo estar for-mado por cada valor de ESPECIALIDAD.Para los datos de la figura 9-2, hay un grupo deestudiantes de HISTORIA,otro de CONTABILIDAD,y otro ms de MATEMTICAS.

    La palabra reservada de SQL:GROUPBY,instruye al DBMSa que agrupe esos ren-glones que tengan el mismo valor de una columna. Considere:

    Captulo nueve Lenguaje de consulta estructurado 243

  • El segundo SELECT,denominado subconsulta, est entre parntesis.Puede ser ms fcil comprender estos enunciados si trabaja desde la parte inferior

    y lee hacia arriba. Los tres ltimos enunciados producen los nombres dejos dos estu-diantes inscritos en BD445, y los primeros tres enunciados arrojan los nombres de losdos estudiantes seleccionados. El resultado de esta consulta es:

    NmerodeEstudianteINSCRIPCINNombredeClase = 'BD445')

    NombreESTUDIANTEEID IN

    (SELECTFROMWHERE

    SELECTFROMWHERE

    stos son los nmeros de estudiantes que necesitamos. Combinando las ltimas dosconsultas, obtenemos lo siguiente:

    El resultado de esta operacin es:

    NmerodeEstudianteINSCRIPCINNombredeClase = 'BD445'

    SELECTFROMWHERE

    En general no conocemos los EIDde los estudiantes en una clase, pero tenemos losmedios para encontrarlos. Examine la expresin:

    NombreESTUDIANTEEID IN [lOO, 200]

    SELECTFROMWHERE

    Suponga que necesitamos saber los nombres de aquellos estudiantes inscritos en la cla-se BD445. Si sabemos que los estudiantes con EID de 100 y 200 estn inscritos en esaclase, lo siguiente producir los nombres correctos:

    RECUPERACIN USANDO UNA SUBCONSULTA

    En esta seccin ampliamos nuestro anlisis de SQLpara incluir operaciones en dos oms tablas. Los datos de la figura 9-2 ESTUDIANTE,CLASE,e INSCRIPCINse utilizanpara ilustrar estos comandos SQL.

    >- CONSULTAS

    (No hay que perder de vista que esta consulta no es vlida para todas las implementa-ciones SQL.Para algunas, los nicos atributos que pueden aparecer en la frase SELECTde una consulta con GROUP BYson los atributos que pueden aparecer en la fraseGROUPBYy las funciones interconstruidas de esos atributos. As, en esta consulta sloseran permitidas ESPECIALIDADy las funciones interconstruidas de ESPECIALIDAD.)

    244 Parte cuatro Implementacin de bases de datos con el modelo relacional

  • Esta estrategia funciona bien siempre que los atributos en la respuesta provengande una sola tabla. Sin embargo, si el resultado proviene de dos o ms tablas tendremosun problema. Por ejemplo, suponga que queremos saber los nombres de los estudian-tes y los de sus clases. Digamos que necesitamos EID, NombredelEstudiante, y Nom-

    CLASE.Horario = 'LMV3'))WHERE

    ESTUDIANTE.NombreESTUDIANTEESTUDIANTE.EIDIN

    (SELECTINSCRIPCIN.NmerodeEstudian teFROMINSCRIPCINWHEREINSCRIPCIN.NombredeClase IN

    (SELECTCLASE.Nombre INFROM CLASE

    El resultado es:

    SELECTFROMWHERE

    los cuales son los nmeros de los estudiantes en la clase LMV3.Para obtener los nom-bres de aquellos estudiantes, especificamos:

    Esto da como resultado:

    INSCRIPCIN.NmerodeEstudianteINSCRIPCININSCRIPCIN.ClaseNombre IN

    (SELECT CLASE.NombreFROM CLASEWHERE HORARIO= 'LMV3')

    SELECTFROMWHERE

    (Puesto que estamos tratando con tres tablas diferentes, calificamos los nombres de lascolumnas con los nombres de las tablas para evitar confusin y ambigedad. AS,CLA-SE.Nombre se refiere a la columna Nombre en la relacin CLASE.)

    Ahora obtenemos los nmeros de identificacin de los estudiantes en estas clasesusando la siguiente expresin:

    CLASE.NombreCLASEHorario = 'LMV3'

    SELECTFROMWHERE

    Para que esta operacin sea semnticamente correcta, EID y NmerodeEstudiantedeben provenir del mismo dominio.

    Las subconsultas pueden constar de tres o ms tablas. Por ejemplo, supongamosque queremos saber los nombres de los estudiantes inscritos en la clase de los lunes,mircoles y viernes a las 3:00 p.m. (denotado como LMV3en nuestros datos). Primero,necesitamos los nombres de las clases que cumplen este horario:

    Captulo nueve Lenguaje de consulta estructurado 245

  • El resultado de esta operacin es:

    ESTUDIANTE.EID,CLASE.Nombre,CLASE.Horario,INSCRIPCIN.NmerodePosicinESTUDIANTE,INSCRIPCIN,CLASEESTUDIANTE.EID= INSCRIPCIN.NmerodeEstudianteINSCRIPCIN.NombredeClase = CLASE.NombreESTUDIANTE.Nombre = 'BAKER'

    FROMWHEREANDAND

    SELEer

    Cuando se necesiten datos de ms de dos tablas, podemos usar una estrategia simi-lar. En el siguiente ejemplo se juntan tres tablas:

    Los calificadores adicionales aqu son ESTUDIANTE.Nombre = 'RYE'e INSCRIPCIN.N-merodePosicin = 1.Esta operacin listar el nmero de estudiante y el nombre de la cla-se de todos los estudiantes llamados RYEque se inscribieron primero en la clase. Elresultado es:

    ESTUDIANTE.EIDINSCRIPCIN.NombredeClaseESTUDIANTE,INSCRIPCINESTUDIANTE.EID= INSCRIPCIN.NmerodeEstudianteESTUDIANTE.Nombre = 'RYE'INSCRIPCIN.NmerodePosicin = 1

    SELECTFROMWHEREANDAND

    La clusula WHEREpuede contener calificadores adems de los que se necesitanpara la junta. Por ejemplo,

    Recuerde que un join es la combinacin de la operacin de un producto seguidopor una seleccin, y (generalmente) por una proyeccin. As, el enunciado FROMex-presa el producto de ESTUDIANTEe INSCRIPCIN,y el enunciado WHERE,la selec-cin. El significado es: "Seleccionar del producto ESTUDIANTEe INSCRIPCINaque-llos renglones en las que el EID de ESTUDIANTEsea igual a NmerodeEstudiante enINSCRIPCIN".Por ltimo, despus de seleccionar, se toma la proyeccin del nmerode estudiante, su nombre y el de la clase. El resultado es:

    ESTUDIANTE.EID,ESTUDIANTE.Nombre,INSCRIPCIN.NombredeClaseESTUDIANTE,INSCRIPCINESTUDIANTE.EID= INSCRIPCIN.NmerodeEstudiante

    SELECTFROMWHERE

    Para producir el EID, Nombre y NombredeClase para todos los estudiantes, debemoshacer el join de la tabla ESTUDIANTEcon la tabla INSCRIPCIN.Los siguientes enun-ciados harn esto:

    SQL

    bredeClase. En este caso, los resultados provienen de dos tablas diferentes (ESTUDIAN-TEe INSCRIPCIN)y as la estrategia de la subconsulta no funcionar.

    246 Parte cuatro Implementacin de bases de datos con el modelo relacional

  • Pero si queremos conocer los nombres de las clases y los niveles de grado de los es-tudiantes que an no terminan su posgrado, debemos usar un join. Una subconsultano 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 sealmacenan en ESTUDIANTE.Lo siguiente arroja la respuesta correcta:

    DISTINCTINSCRIPCIN.NombredeClaseINSCRIPCIN,ESTUDIANTEINSCRIPCIN.NmerodeEstudiante = ESTUDIANTE.EIDESTUDIANTE.Grado NOT = 'GR'

    DISTINCTNombredeClaseINSCRIPCINNmerodelistudiante IN

    (SELECTEIDFROMESTUDIANTEWI-IEREGrado NOT = 'GR')

    SELECTFROMWHEREAND

    o como un join:

    SELECTPROMWHERE

    Aunque las expresiones del join pueden sustituir a muchas expresiones de subcon-sultas, no pueden reemplazarlas a todas. Por ejemplo, las subconsultas que implicanEXISTSy NOT EXISTS(las cuales analizaremos en la siguiente seccin) no se puedenrepresentar por medio de un join.

    De igual forma, las subconsultas no se pueden sustituir por todos los join. Cuandousamos una unin, las columnas desplegadas pueden provenir de cualquiera de las ta-blas juntadas, pero cuando usamos una subconsulta las columnas desplegadas puedenprovenir slo de la tabla indicada en la expresin FROM en elprimer SELECT.Porejemplo, supongamos que queremos saber los nombres de las clases que toman los nograduados. Podemos expresar esto como una subconsulta:

    ESTUDIANTE.NOMBREESTUDIANTE,INSCRIPCIN,CLASEESTUDIANTE.EID= INSCRIPCIN.NmerodeEstudianteINSCRIPCIN.NombredeClase = CLASE.NombreCLASE.Horario = 'LMV3'

    SELECTFROMWHEREANDAND

    De manera similar, la consulta: 11Cules son los nombres de los estudiantes en lasclases LMVa las 37" se puede expresar como:

    ESTUDIANTE.NombreESTUDIANTE,INSCRIPCINESTUDIANTE.EID= INSCRIPCIN.NmerodeEstudianteINSCRIPCIN.NombredeClase = 'BD445'

    SELECTFROMWHEREAND

    Sepuede usar un join como forma alternativa de expresin para muchas subconsultas.Por ejemplo, usamos una subconsulta para encontrar a los estudiantes inscritos en laclase BD445. Tambin podemos usar un join para expresar esta consulta:

    COMPARACiN DEl JOIN y DE LA SUBCONSUlTA

    Ca ptul o 11ueve Lengua j e de con sul t a es tru ctu ra d o 247

  • EXISTSy NOTEXISTSson operadores lgicos cuyo valor puede ser verdadero o falso! de-pendiendo de la presencia o ausencia de renglones que cumplan las condiciones califica-tivas. Por ejemplo! suponga que deseamos saber los nmeros de estudiantes inscritos enms de una clase.

    >- EXISTSy NOT

    Observe las diferencias en AccessSQLy la norma de notacin ANSI.Las condiciones dela junta se especifican usando la palabra llave ON. Tambin! todas las expresiones SQLterminan con punto y coma.

    FROMSELECT Nombre! NombredeClase

    ESTUDIANTELEFTJOIN INSCRIPCINON EID=NmerodeEstudiante;

    El resultado es:

    La norma SQL de la ANSI no avala los outer join. Sin embargo! muchos productosDBMSlos manejan. Aqu ilustraremos el uso de uno de ellos.

    Suponga que queremos una lista de todos los estudiantes y los nombres de las cla-ses que toman! y que adems deseamos incluir a todos los estudiantes! incluso aquellosque no estn tomando clases. La siguiente expresin SQLdar este resultado utilizan-do Microsoft Access:

    OUTER JOIN

    El resultado es:

    DISTINCTINSCRIPCIN.NombredeClase!ESTUDIANTE.GradoINSCRIPCIN!ESTUDIANTEINSCRIPCIN.NmerodeEstudiante = ESTUDIANTE.EIDESTUDIANTE.Grado NOT = !GR!

    SELECTFROMWHEREAND

    248 Parte cuatro Implementacin de bases de datos con el modelo relacional

  • CLASECLASE.Nombre= INSCRIPCIN.NombredeClaseINSCRIPCrN.NmerodeEstudiante = ESTUDlAN-TE.EID

    PROMWHEREAND

    WI-IERE NOT EXISTS(SELECT *

    INSCRIPCINPROM

    ESTUDIANTE.NombreESTUDIANTENOTEXISTS

    (SELECT *

    SELECTPROMWHERE

    Para ilustrar la aplicacin NOT EXISTSsuponga que queremos conocer los nom-bres de los estudiantes que asisten a todas las clases. Otra forma de establecer lo ante-rior es que queremos los nombres de los estudiantes donde no haya clases que stos notomen. Lo siguiente expresa esto:

    En este ejemplo, tanto la consulta como la subconsulta se refieren a la tabla INS-CRIPCIN.Para evitar la ambigedad, a estos dos usos de INSCRIPCINse les ha asig-nado un nombre diferente. En el primer enunciado PROM, a INSCRIPCINse le haasignado, 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 INSCRIP-CIN 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 es-tos renglones, entonces el valor lgico de EXISTSes verdadero. En este caso, presenta-mos el nmero de estudiante en la respuesta. De otra manera, el valor lgico de EXISTSes falso, as que no presentamos ese EID en la respuesta.

    Otra forma de ver esta consulta es imaginar dos copias separadas e idnticas de latabla INSCRIPCIN.Nombre a una copia Tabla A y a la otra Tabla B. Compare cadarengln de la tabla A con cada rengln de la B. Primero busque en el primer renglnen Ay en el primer rengln de B. En este caso, puesto que ambos son idnticos, tantoNmerosdeEstudiantes como NombresdeClases son iguales, as que no desplegamosel EID.

    Ahora observe el primer rengln en Ay el segundo rengln en B. SiNmerosdeEs-tudiantes son los mismos y NombresdeClases son diferentes, desplegamos Nmero-deEstudiante. Esencialmente, estamos comparando el primer rengln de INSCRIP-CIN con el segundo rengln de INSCRIPCIN. Para los datos de la figura 9-2, niNmerosdeEstudiantes ni NombresdeClases son iguales.

    Continuamos comparando el primer rengln de A con cada rengln de B, Silas con-diciones se cumplen imprimimos el NmerodeEstudiante. Cuando se hayan examinadotodos los renglones en 13,nos movemos al segundo rengln de Ay lo comparamos con to-dos los renglones en B (realmente, si estamos considerando los 11 renglones en A, slo senecesita considerar en B los renglones mayores que 11).

    El resultado de esta consulta es:

    INSCRIPCINBA.NmerodeEstudiante =B.NmerodeEstudianteA.NombredeClase NOT = B.NombrecleCIase)

    PROMWHERE

    AND

    *

    DISTINCTNmerodeEstuclianteINSCRIPCINAEXISTS

    (SELECT

    SELECTPROMWHERE

    Captulo nueve Lenguaje de consulta estructurado 249

  • DELETE FROMESTUDIANTEWHERE ESTUDIANTE.EID= 100

    Al igual que con la insercin, los renglones se pueden eliminar uno por uno o en gru-pos. El siguiente ejemplo suprime el rengln para Estudiante 100:

    DE DATOS

    Se pueden usar las expresiones contenidas en SELECTy todas las SELECTde SQLdesarrolladas en las dos secciones anteriores para identificar los renglones que serncopiados. Esta caracterstica ofrece capacidades bastante poderosas.

    Grado = ']R')WHERE

    INTO]UNIORVALES(SELECTEID,Nombre, EspecialidadFROM ESTUDIANTE

    INSERT

    El NmerodePosicin se puede agregar despus. Como podr observar, esto ocasionaque el valor de NmerodePosicin tenga un valor nulo en el nuevo rengln.

    Tambin podemos copiar renglones en bloque de una tabla a otra. Por ejemplo, su-ponga que queremos llenar la tabla]UNIOR que se muestra en la figura 9-1.

    INTO INSCRIPCIN(NmerodeEstudiante, NombredeClase)VALUES(400, 'BD445')

    INSERT

    Si no conocemos todos los datos -por ejemplo, si no conocemos el NmerodePosi-cirr=- podramos decir:

    INTO INSCRIPCINVALUES(400, 'BD445', 44)

    INSERT

    En una tabla se pueden insertar renglones uno por uno o en grupos. Para insertar unoslo establecemos:

    DE

    SQLtiene medios para cambiar datos en tablas insertando renglones nuevos, eliminan-do renglones, y modificando los valores de los renglones existentes. SQLtambin puedecambiar la estructura de los datos, pero esto lo abordaremos hasta los captulos 12y 13.

    >- CAMB

    Esta consulta tiene tres partes. En la inferior, se encuentran las clases que el estudianteha tomado. La parte media determina si se encontraron algunas clases que el estudian-te no haya tomado. De lo contrario, significa que el estudiante est tomando todas lasclases y su nombre ser desplegado.

    Esta consulta puede ser difcil de comprender. Si tiene problemas use los datos dela figura 9-2 y siga las instrucciones. Para estos datos la respuesta es que ningn estu-diante est tomando todas sus clases. Puede tratar de cambiar los datos, de tal formaque un estudiante tome todas las clases. Otra forma de analizar esta consulta es tratarde resolverla de otra manera usando NOTEXISTS.Losproblemas que encuentre le ayu-darn a comprender por qu NOT EXISTSes necesario.

    250 Parte cuatro Implementacin de bases de datos con el modelo relacional

  • Recuerde que las actualizaciones en bloque pueden ser bastante peligrosas. Se le daun gran poder al usuario -poder que cuanclo se usa en forma correcta ayuda a realizar r-pidamente la tarea, pero cuando se usa errneamente puede ocasionar serios problemas.

    INSCRIPCINNombredeClase = 'BD564'NombredeClase = 'BD445'CLASENombredeClase = 'BD564'NombrecleClase = 'BD445'

    UPDATESETWHEREUPDATESETWHERE

    En el segundo enunciado UPDATE,el valor de la columna se calcula usando la funcinMAX.Sin embargo, algunas implementaciones de SQLno permiten usar la funcin in-terconstruida como argumento en el comando SET.

    Para ilustrar las actualizaciones en masa, suponga que el nombre de un curso hacambiado de BD445 a BD564. En este caso, para evitar problemas de integridad se de-ben cambiar las tablas INSCRIP.CINy CLASE.

    INSCRIPCINNmerodePosicin =MAX(NmerodePosicin) + 1EID= 400

    INSCRIPCINNrnerodef'osicin = 44EID = 400

    UPDATESETWHERE

    y

    UPDATESETWHERE

    Los renglones tambin se pueden modificar uno a la vez o en grupos. La palabra reser-vada SETse usa para cambiar el valor de una columna. Despus de SET,se cambia elnombre de la columna y se especifica el nuevo valor o la forma de calcularlo. Conside-re dos ejemplos:

    MODiFiCACiN DE DATOS

    El orden de estas dos operaciones es importante, porque si se invirtiera ninguno delos renglones INSCRIPCIN se eliminaran debido a.que los renglones coincidentesde ESTUDIANTEya habran sido eliminados.

    WI-IERE ESTUDIANTE.Especialidad= 'Contabilidad')PROMESTUDIANTEESTUDIANTE.Especialidad = 'Contabilidad'

    ESTUDIANTEPROM

    PROMINSCRIPCININSCRIPCIN.Nmeroc1eEshlclianteIN

    (SELECT ESTUDIANTE.EID

    DELETEWHERE

    DELETEWHERE

    Observe que si Estudiante 100 est inscrito en las clases, esta eliminacin causarun problema de integridad: como los renglones de INSCRIPCINtienen NmerodeEs-tudiante = 100 no tendrn correspondencia con el rengln ESTUDIANTE.

    Los grupos de renglones se pueden borrar como se muestra en los dos ejemplos si-guientes, lo cual elimina todas las inscripciones para la especialidad de contabilidad,as como tambin a todos los estudiantes de esa especialidad.

    Captulo nueve Lenguaje de consulta estructurado 251

  • Una instancia de estas relaciones se muestra en la figura 9-3. Use los datos en esastablas y muestre los enunciados SQLpara desplegar o modificar datos como se indicaen las siguientes preguntas:9.1 Muestre los salarios de todos los vendedores.9.2 Muestre los salarios de todos los vendedores, pero omita duplicados.9.3 Muestre los nombres de todos los vendedores que estn por abajo del 30% de la

    cuota.9.4 Muestre los nombres de todos los vendedores que tengan un pedido con

    Abernathy Construction.9.5 Muestre los nombres de todos los vendedores que ganan ms de $49999 y me-

    nos de $100000.9.6 Muestre los nombres de todos los vendedores con un PorcentajedeCuota mayor

    a 49 y menor de 60. Use la palabra reservada BETWEEN.9.7 Muestre los nombres de todos los vendedores con un PorcentajedeCuota de

    ms de 49 y menos de 60. Use la palabra reservada LIKE.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.9.10 Calcule el nmero de pedidos.9.11 Calcule el nmero de diferentes clientes que tienen un pedido.9.12 Calcule el porcentaje promedio de cuota para los vendedores.

    VENDEDOR(Nombre, PorcentajedeCuota, Salario)PEDIDO(Nmero, NombredeCliente, NombredeVendedor, Cantidad)CLIENTE(Nombre, Ciudad, TipodeIndustrla)

    Las preguntas en este grupo se refieren a las tres relaciones siguientes:

    SQLes el lenguaje de manejo de datos relacionales ms importante que hay. Seha con-vertido en el estndar para el intercambio de informacin entre computadoras, y supopularidad contina en aumento. Los enunciados SQLque operan en una sola tablaincluyen SELECT,SELECTcon WHERE,SELECTcon GROUPBYy SELECTcon GROUPBYy 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 ope-raciones, pero no las sustituyen completamente. Las subconsultas requieren que losatributos recuperados provengan de una relacin independiente, pero los join, no. Porotro lado, algunas consultas son posibles con subconsultas y EXISTSy NOT EXISTS,lascuales son imposibles con los join.

    Los enunciados SQLpara 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 SQLde manera genrica, y enlos captulos 13, 14, Y1610s usaremos para procesar una base de datos empleando pro-ductos comerciales DBMS.

    252 Parte cuatro Implementacin de bases de datos con el modelo relacional

  • CLIENTE

    TipodelndustriaCiudadNombre

    PEDIDO

    NombredelVendedor CantidadNombredelClienteNmero

    VENDEDOR

    SalarioPorcentaje-deCuotaNombre

    9.13 Muestre el nombre del vendedor con el porcentaje de cuota ms alto.9.14 Calcule el nmero de pedidos de cada vendedor.9.15 Calcule el nmero de pedidos de cada vendedor, considerando slo los pedidos

    que excedan de 500.9.16 Muestre los nombres y porcentajes de los vendedores que tienen un pedido con

    ABERNATHYCONSTRUCTION,en orden descendente de porcentaje de cuota(use una subconsulta).

    9.17 Muestre los nombres y porcentajes de cuota de los vendedores que tengan unpedido con ABERNATHYCONSTRUCTION,en orden descendente de porcenta-je de cuota (use un join).

    9.18 Muestre los porcentajes de cuota de los vendedores que tengan un pedido conun cliente en MEMPHIS(use una subconsulta).

    9.19 Muestre los porcentajes de cuota de los vendedores que tengan un pedido conun cliente en MEMPHIS(use un join).

    9.20 Muestre el tipo de industria y los nombres de los vendedores de todos los pedi-dos para las compaas en MEMPHIS.

    9.21 Muestre los nombres de los vendedores junto con los nombres de los clientesque les hayan hecho un pedido. Incluya a los vendedores que no tengan pedi-dos. Use la notacin de Microsoft Access.

    9.22 Muestre los nombres de los vendedores que tengan dos o ms pedidos.

    Captulo nueve Lenguaje de consulta estructurado 253

    Datos de muestrapara las preguntasdel grupo 1

  • CLIENTE(ClienteSK, Nombre, Telfono, CorreoElectrnico)ESTUFA(NmerodeSere, Tipo, Versin, FechadeFabricacin)REGISTRO(ClenteSK, Nz/JwrodeSerie, Fecha)REPARACIN_ESTUFA(NmerodeFacturacleReparacill, Nmetodesetie, Fecha,Descripcin, Costo, ClienteSK)

    Suponga que FiredUp ha creado una base de datos con las siguientes tablas:

    9.33 Instale Accss 2002 y abra la base de datos Northwind. Use la herramientaQuery-by-design/SQL View; escriba los enunciados SQLpara las siguientes pre-guntas e imprmalas.a. Liste todas las columnas de proveedoresb. Liste NombredelaCompafia de los proveedores con NombredeCompafia

    empezando con I/Nuevo,ic. Liste todas las columnas de los productos que abastecen los proveedores conNombredeCompafia empezando con "Nuevo", Muestre las respuestas usan-do un [oin y una subconsulta

    d. Liste NiveldeReordenamiento y cuente todos los productose. Liste NiveldeReordenamiento y cuente todos los NivelesdeReordenamiento

    que tengan ms de un elementof. Liste NiveldeReordenamiento y cuente todos los NivelesdeReordenamientoque tengan ms de un elemento para los productos de los proveedores cuyosnombres empiecen con "Nuevo"

    ~ PREGU

    9.23 Muestre los nombres y porcentajes de cuota de los vendedores que tengan dos oms pedidos.

    9.24 Muestre los nombres y edades de los vendedores que tengan un pedido con to-dos 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 VENDE-

    DOR; suponga que el salario no est determinado.9.27 Muestre un enunciado SQLpara insertar renglones en una tabla nueva, ALTO-

    RENDIMIENTO(Nombre, salaria), el cual incluya que un vendedor debe tenerun salario de cuando menos $100000.

    9.28 Muestre un enunciado SQLpara borrar un cliente de ABERNATHYCONSTRUCTION.

    9.29 Muestre un enunciado SQLpara eliminar todos los pedidos de ABERNATHYCONSTRUCTION.

    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 10por ciento.

    9.32 Suponga que el vendedor ]AIMEScambia su apellido a PARKER.Muestre elenunciado SQLque crea los cambios apropiados.

    254 Parte cuatro Implementacin de bases de datos con el modelo relacional