Lenguaje de definicin de datos (DDL: Data Definition Language):Sencillo lenguaje
artificial para definir y describir los objetos de la base de datos, su estructura, relaciones y restricciones. En la prctica puede consistir en un subconjunto de instrucciones de otro lenguaje informtico. Aparte suele poseer dos subconjuntos de instrucciones: Lenguaje de definicin del almacenamiento de los datos (DSDL: Data Storage Definition Language): permite especificar caractersticas fsicas de la base de datos (volmenes y arcivos donde van a ser almacenados los datos, etc!. Lenguaje de control de datos (DCL: Data Control Language): encargado del control y seguridad de los datos (privilegios y modos de acceso, etc!. Lenguaje de manipulacin de datos (DML: Data Manipulation Language): "enguaje artificial de cierta complejidad #ue permite el manejo y procesamiento del contenido de la base de datos. En la prctica puede consistir en un subconjunto de instrucciones de otro lenguaje informtico. "as aplicaciones #ue trabajan sobre la base de datos se programan en un lenguaje de programaci$n (%, %obol, ...! insertando en el c$digo fuente sentencias del &'". Al utili(ar un &'" se deben especificar los datos #ue sern afectados por las sentencias del lenguaje. )n &'" puede tener o no procedimientos, segn sea necesario especificar adems c$mo deben obtenerse esos datos. "os &'" con procedimientos tienen sentencias de control de flujo como bucles o condicionales. "os &'" sin procedimientos son conocidos tambi*n como declarativos. Comandos del DDL y del DML Comandos DDL Comando Descripcin %+EA,E )tili(ado para crear nuevas tablas, stored procedures e ndices &+-. Empleado para eliminar tablas, stored procedures e ndices A",E+ )tili(ado para modificar las tablas agregando campos o cambiando la definici$n de los campos Comandos DML Comando Descripcin SE"E%, )tili(ado para consultar registros de la base de datos #ue satisfagan un criterio determinado. /0SE+, )tili(ado para cargar lotes de datos en la base de datos en una nica operaci$n. &E"E,E )tili(ado para eliminar los valores de los campos y registros especificados. ).&A,E )tili(ado para modificar registros de una tabla de una base de datos. Consultas de Seleccin Consulta 1er la informacion #ue desea ver un usuario por medio de comandos dentro de la base de datos "as consultas de selecci$n se utili(an para indicar al motor de datos #ue devuelva informaci$n de las bases de datos, esta informaci$n es devuelta en forma de conjunto de registros #ue se pueden almacenar en un objeto recordset. Este conjunto de registros es modificable. Consultas bsicas "a sinta2is bsica de una consulta de selecci$n es la siguiente: SELECT %ampos FROM ,abla En donde campos es la lista de campos #ue se deseen recuperar y tabla es el origen de los mismos, por ejemplo: SELECT 0ombre, ,el*fono FROM %lientes Esta consulta devuelve un recordset con el campo nombre y tel*fono de la tabla clientes. Ordenar los registros Adicionalmente se puede especificar el orden en #ue se desean recuperar los registros de las tablas mediante la clusula OD! "# "ista de %ampos. En donde "ista de campos representa los campos a ordenar. Ejemplo: SELECT %$digo .ostal, 0ombre, ,el*fono FROM %lientes ORDER BY 0ombre Esta consulta devuelve los campos %$digo .ostal, 0ombre, ,el*fono de la tabla %lientes ordenados por el campo 0ombre. Se pueden ordenar los registros por ms de un campo, como por ejemplo: SELECT %$digo .ostal, 0ombre, ,el*fono FROM %lientes ORDER BY %$digo .ostal, 0ombre /ncluso se puede especificar el orden de los registros: ascendente mediante la clusula ($SC 3se toma este valor por defecto! $ descendente (D!SC! SELECT %$digo .ostal, 0ombre, ,el*fono FROM %lientes ORDER BY %$digo .ostal D!SC, 0ombre $SC !l predicado D%S&%'C& Se /ncluye entre la clausula y el primer nombre del campo a recuperar. El predicado D%S&%'C& omite los registros #ue contienen datos duplicados en los campos seleccionados. .ara #ue los valores de cada campo listado en la instrucci$n SE"E%, se incluyan en la consulta deben ser nicos. .or ejemplo, varios empleados listados en la tabla Empleados pueden tener el mismo apellido. Si dos registros contienen "$pe( en el campo Apellido, la siguiente instrucci$n S4" devuelve un nico registro: SELECT DISTINCT Apellido FROM Empleados %on otras palabras el predicado &/S,/0%, devuelve a#uellos registros cuyos campos indicados en la clusula SE"E%, posean un contenido diferente. El resultado de una consulta #ue utili(a &/S,/0%, no es actuali(able y no refleja los cambios subsiguientes reali(ados por otros usuarios. Tema 8. El DDL, lenguaje de definicin de datos (I)
Bsqueda Introduccin Hasta ahora hemos estudiado las sentencias que forman parte del DML (Data Management Language) lenguaje de manipulacin de datos, todas esas sentencias siren para recuperar, insertar, !orrar, modificar los datos almacenados en la !ase de datos" lo que eremos en este tema son las sentencias que afectan a la estructura de los datos# $l DDL (Data Definition Language) lenguaje de definicin de datos es la parte del %&L que ms vara de un sistema a otro 'a que esa area tiene que er con cmo se organi(an internamente los datos ' eso, cada sistema lo hace de una manera u otra# )s* como el DML de Microsoft +et inclu'e todas las sentencias DML que nos podemos encontrar en otros %&Ls (o casi todas), el DDL de Microsoft +et en cam!io contiene menos instrucciones que otros sistemas#
CRETE T!LE La sentencia CRETE T!LE sire para crear la estructura de una ta"la no para rellenarla con datos, nos permite definir las columnas que tiene # ciertas restricciones que de!en cumplir esas columnas# La sinta$is es la siguiente,
n!ta!la, nom"re de la ta"la que estamos definiendo n!col, nom"re de la columna que estamos definiendo tipo, ti%o de dato de la columna, todos los datos almacenados en la columna de!er-n ser de ese tipo# .ara er qu/ tipos de datos se pueden emplear ha( clic aqu* 0na restriccin consiste en la definicin de una caracterstica adicional &ue tiene una columna o una com!inacin de columnas, suelen ser caracter*sticas como alores no nulos (campo requerido), definicin de *ndice sin duplicados, definicin de clae principal ' definicin de clae for-nea (clae ajena o e1terna, campo que sire para relacionar dos ta!las entre s*)# restriccin2, una restriccin de ti%o ' es una restriccin que aparece dentro de la definicin de la columna despu/s del tipo de dato ' afecta a una columna, la que se est- definiendo# restriccin3, una restriccin de ti%o ( es una restriccin que se define des%u)s de definir todas las columnas de la ta!la ' afecta a una columna o a una com"inacin de columnas. .ara escri!ir una sentencia CRETE T!LE se empie(a por indicar el nom"re de la ta"la que queremos crear ' a continuacin entre %ar)ntesis indicamos se%aradas %or comas las definiciones de cada columna de la ta!la, la definicin de una columna consta de su nom"re, el ti%o de dato que tiene # podemos a4adir si &ueremos una serie de es%ecificaciones que de!er-n cumplir los datos almacenados en la columna, des%u)s de definir cada una de las columnas que compone la ta!la se %ueden a*adir una serie de restricciones, esas restricciones son las mismas que se pueden indicar para cada columna pero ahora%ueden afectar a ms de una columna por eso tienen una sinta1is ligeramente diferente# 0na restriccin de ti%o ' se utili(a para indicar una caracter*stica de la columna que estamos definiendo, tiene la siguiente sinta1is, La cl-usula +,T +-LL indica que la columna no %odr contener un valor nulo, es decir que se de!er- rellenar o!ligatoriamente ' con un alor -lido (equiale a la propiedad requerido %* de las propiedades del campo)# La cl-usula C,+.TRI+T sire para definir una restriccin que se podr- eliminar cuando queramos sin tener que !orrar la columna# ) cada restriccin se le asigna un nom!re que se utili(a para identificarla ' para poder eliminarla cuando se quiera# 5omo restricciones tenemos la de clae primaria (clae principal), la de *ndice nico (sin duplicados), la de alor no nulo, ' la de clae for-nea# La cl-usula /RI0R1 2E1 se utili(a para definir la columna como clave %rinci%al de la ta"la# $sto supone que la columna no %uede contener valores nulos ni %ueden 3a"er valores du%licados en esa columna, es decir que dos filas no pueden tener el mismo alor en esa columna# $n una ta!la no %ueden 3a"er varias claves %rinci%ales, por lo que no podemos incluir la cl-usula /RI0R1 2E1 m-s de una e(, en caso contrario la sentencia da un error# 6o ha' que confundir la definicin de arias claes principales con la definicin de una clae principal compuesta por arias columnas, esto ltimo s* est- permitido ' se define con una restriccin de tipo 3# La cl-usula -+I4-E sire para definir un ndice 5nico so!re la columna# 0n *ndice nico es un *ndice que no %ermite valores du%licados, es decir que si una columna tiene definida un restriccin de -+I4-E no podr-n ha!er dos filas con el mismo alor en esa columna# %e suele emplear para que el sistema comprue!e el mismo que no se a4aden alores que 'a e1isten, por ejemplo si en una ta!la de clientes queremos asegurarnos que dos clientes no puedan tener el mismo D#6#I# ' la ta!la tiene como clae principal un cdigo de cliente, definiremos la columna dni con la restriccin de -+I4-E# La cl-usula +,T +-LL indica que la columna no puede contener alores nulos, cuando queremos indicar que una columna no puede contener el alor nulo lo podemos hacer sin poner la cl-usula C,+.TRI+T, o utili(ando una cl-usula C,+.TRI+T# La ltima restriccin que podemos definir so!re una columna es la de clae for-nea, una clave fornea es una columna o conjunto de columnas &ue contiene un valor &ue 3ace referencia a una fila de otra ta"la, en una restriccin de tipo 2 se puede definir con la cl-usula RE6ERE+CE., despu/s de la pala!ra reserada indicamos a qu/ ta!la hace referencia, opcionalmente podemos indicar entre par/ntesis el nom!re de la columna donde tiene que !uscar el alor de referencia, por defecto coge la clae principal de la ta!la3, si el alor que tiene que !uscar se encuentra en otra columna de ta!la3, entonces de!emos inidicar el nom!re de esta columna entre par/ntesis, adem-s slo podemos utili(ar una columna que est/ definida con una restriccin de -+I4-E, si la columna3 que indicamos no est- definida sin duplicados, la sentencia CRETE nos dar- un error# %i quieres repasar conceptos de clae for-nea e integridad referencial ha( clic aqu* .ara seguir con la instruccin CRETE T!LE pasa a la siguiente p-gina### $jemplo, CRETE T!LE ta"' 7 col' I+TE8ER C,+.TRI+T %9 /RI0R1 2E1, col( C:R7(;< +,T +-LL, col= C:R7'>< C,+.TRI+T uni' -+I4-E, col? I+TE8ER, col; I+T C,+.TRI+T f9; RE6ERE+CE. ta"( <@ 5on este ejemplo estamos creando la ta!la tab1 compuesta por, una columna llamada col1 de tipo entero definida como clae principal, una columna col2 que puede almacenar hasta 37 caracteres alfanum/ricos ' no puede contener alores nulos, una columna col3 de hasta 28 caracteres que no podr- contener alores repetidos, una columna col4 de tipo entero sin ninguna restriccin, ' una columna col5 de tipo entero clae for-nea que hace referencia a alores de la clae principal de la ta!la tab2# CRETE T!LE...Continuacin 0na restriccin de ti%o ( se utili(a %ara definir una caracterstica &ue afecta a una columna o a una com"inacin de columnas de la ta!la que estamos definiendo, se escri"e des%u)s de 3a"er definido todas las columnas de la ta!la# 9iene la siguiente sinta$is, La sinta1is de una restriccin de tipo 3 es mu' similar a la C,+.TRI+T de una restriccin 2 la diferencia es que ahora tenemos que indicar so!re qu/ columnas queremos definir la restriccin# %e utili(an o!ligatoriamente las restricciones de tipo 3 cuando la restriccin afecta a un grupo de columnas o cuando queremos definir m-s de una C,+.TRI+T para una columna (slo se puede definir una restriccin2 en cada columna)# La cl-usula /RI0R1 2E1 se utili(a para definir la clave %rinci%al de la ta!la# Despu/s de las pala!ras /RI0R1 2E1 se indica entre par/ntesis el nom!re de la columna o las columnas que forman la clae principal# Las columnas que forman la clae principal no pueden contener alores nulos ni pueden ha!er alores duplicados de la com!inacin de columnas, por ejemplo la ta!la pedidos de nuestros ejemplos tiene una clae principal formada por idfa! e idproducto, pues no pueden ha!er dos filas con la misma com!inacin de idfa! con idproducto (aci,0001 por ejemplo) pero s* pueden ha!er dos filas con el alor aci en la columna idfab si tienen alores diferentes en la columna idproducto, ' pueden ha!er dos filas con el mismo idproducto pero distinto idfa!# $n una ta!la no %ueden 3a"er varias claves %rinci%ales, por lo que no podemos indicar la cl-usula /RI0R1 2E1 m-s de una e(, en caso contrario la sentencia da un error# La cl-usula -+I4-E sire para definir un ndice 5nico so!re una columna o so!re una com!inacin de columnas# 0n *ndice nico es un *ndice que no %ermite valores du%licados# %i el *ndice es so!re arias columnas no se puede repetir la misma com!inacin de alores en dos o m-s filas# %e suele emplear para que el sistema comprue!e el mismo que no se a4aden alores que 'a e1isten# La cl-usula 6,REI8+ 2E1 sire para definir una clave fornea so!re una columna o una com!inacin de columnas# 0na clae for-nea es una columna o conjunto de columnas que contiene un valor &ue 3ace referencia a una fila de otra ta"la, en una restriccin 2 se puede definir con la cl-usula RE6ERE+CE.# .ara definir una clae for-nea en una restriccin de tipo 3 de!emos empe(ar por las pala!ras 6,REI8+ 2E1despu/s indicamos entre par/ntesis la:s columna:s que es clae for-nea, a continuacin la pala!ra reserada RE6ERE+CE. seguida del nom!re de la ta!la a la que hace referencia, opcionalmente podemos indicar entre par/ntesis el nom!re de la:s columna:s donde tiene que !uscar el alor de referencia, por defecto coge la clae principal de la ta!la3, si el alor que tiene que !uscar se encuentra en otra:s columna:s de ta!la3, entonces de!emos escri!ir el nom!re de esta:s columna:s entre par/ntesis, adem-s slo podemos utili(ar una columna (o com!inacin de columnas) que est/ definida con una restriccin de -+I4-E, de lo contrario la sentencia CRETE T!LE nos dar- un error# %i necesitas repasar los conce%tos de integridad referencial pincha aqu* $jemplo, CRETE T!LE ta"' 7col' I+TE8ER, col( C:R7(;< +,T +-LL, col= C:R7'><, col? I+TE8ER, col; I+T, C,+.TRI+T %9 /RI0R1 2E1 7col'<, C,+.TRI+T uni' -+I4-E 7col=<, C,+.TRI+T f9; 6,REI8+ 2E1 7col;< RE6ERE+CE. ta"( <@ 5on este ejemplo estamos creando la misma ta!la tab1 del ejemplo de la p-gina anterior pero ahora hemos definido las restricciones utili(ando restricciones de tipo 3# LTER T!LE La sentencia LTER T!LE sire para modificar la estructura de una ta"la que 'a e1iste# Mediante esta instruccin podemos a4adir columnas nueas, eliminar columnas# 9en cuenta que cuando eliminamos una columna se pierden todos los datos almacenados en ella# 9am!i/n nos permite crear nueas restricciones o !orrar algunas e1istentes# La sinta1is puede parecer algo complicada pero sa!iendo el significado de las pala!ras reseradas la sentencia se aclara !astante" )DD (a4ade), )L9$; (modifica), D;<. (elimina), 5<L0M6 (columna), 5<6%9;)I69 (restriccin)# La sinta$is es la siguiente, La sinta$is de restriccion' es id/ntica a la restriccin2 de la sentencia CRETE T!LE, te la descri!imos a continuacin, si tienes alguna duda repasa la sentencia CRETE T!LE# La sinta$is de restriccion( es id/ntica a la restriccin3 de la sentencia CRETE T!LE, te la descri!imos a continuacin, si tienes alguna duda repasa la sentencia CRETE T!LE# La cl-usula DD C,L-0+ (la pala!ra C,L-0+ es opcional) permite a*adir una columna nueva a la ta!la# 5omo en la creacin de ta!la, ha' que definir la columna indicando su nom!re, tipo de datos que puede contener, ' si lo queremos alguna restriccin de alor no nulo, clae primaria, clae for-nea, e *ndice nico, restriccion' es o%cional e indica una restriccin de tipo 2 que afecta a la columna que estamos definiendo# $jemplo, LTER T!LE ta"' DD C,L-0+ col= integer +,T +-LL C,+.TRI+T c' -+I4-E 5on este ejemplo estamos a4adiendo a la ta!la ta!2 una columna llamada col= de tipo entero, requerida (no admite nulos) ' con un *ndice sin duplicados llamado c2# 5uando a4adimos una columna lo m*nimo que se puede poner ser*a, LTER T!LE ta"' DD col= integer $n este caso la nuea columna admite alores nulos ' duplicados# .ara a*adir una nueva restriccin en la ta!la podemos utili(ar la cl-usula DD restriccion( (DD C,+.TRI+T.##)# $jemplo, LTER T!LE ta"' DD C,+.TRI+T c' -+I4-E 7col=< 5on este ejemplo estamos a4adiendo a la ta!la ta!2 un *ndice nico (sin duplicados) llamado c2 so!re la columna col=# .ara "orrar una columna !asta con utili(ar la cl-usula DR,/ C,L-0+ (C,L-0+ es opcional) ' el nom!re de la columna que queremos !orrar, se perder-n todos los datos almacenados en la columna# $jemplo, LTER T!LE ta"' DR,/ C,L-0+ col= 9am!i/n podemos escri!ir, LTER T!LE ta"' DR,/ col= $l resultado es el mismo, la columna col= desaparece de la ta!la ta!2# .ara "orrar una restriccin !asta con utili(ar la cl-usula DR,/ C,+.TRI+T ' el nom!re de la restriccin que queremos !orrar, en este caso slo se elimina la definicin de la restriccin pero los datos almacenados no se modifican ni se pierden# $jemplo, LTER T!LE ta"' DR,/ C,+.TRI+T c' 5on esta sentencia !orramos el *ndice c2 creado anteriormente pero los datos de la columna col= no se en afectados por el cam!io# DR,/ T!LE La sentencia DR,/ T!LE sire para eliminar una ta"la# 6o se puede eliminar una ta!la si est- a!ierta, tampoco la podemos eliminar si el !orrado infringe las reglas de integridad referencial (si interiene como ta!la padre en una relacin ' tiene registros relacionados)# La sinta$is es la siguiente, Ejem%lo, DR,/ T!LE ta"' $limina de la !ase de datos la ta!la ta!2#
CRETE I+DEA La sentencia CRETE I+DEA sire para crear un ndice so!re una o arias columnas de una ta!la# %i quieres repasar conceptos !-sicos so!re *ndices ha( clic aqu* La sinta$is es la siguiente, n"indi, nom"re del ndice que estamos definiendo# En una ta"la no %ueden 3a"er dos ndices con el mismo nom"re de lo contrario da error# n"ta"la, nom"re de la ta"la donde definimos el ndice# ) continuacin entre par/ntesis se indica la composicin del *ndice (las columnas que lo forman)# n"col, nom"re de la columna &ue inde$amos# Despu/s del nom!re de la columna podemos indicar cmo queremos que se ordenen las filas segn el *ndice mediante las cl-usulas .C:DE.C# .C, la cl-usula .C es la que se asume %or defecto e indica que el orden elegido para el *ndice es ascendente (en orden alfa!/tico si la columna es de tipo te1to, de menor a ma'or si es de tipo num/rico, en orden cronolgico si es de tipo fecha)# DE.C, indica orden descendente, es decir el orden inerso al ascendente# .odemos formar un *ndice "asado en varias columnas, en este caso despu/s de indicar la primera columna con su orden, se escri!e una coma ' la segunda columna tam!i/n con su orden, as* sucesiamente hasta indicar todas las columnas que forman el *ndice# <pcionalmente se pueden indicar las cl-usulas, BIT: /RI0R1 indica que el *ndice define la clave %rinci%al de la ta!la, si la ta!la 'a tiene una clae principal, la sentencia CRETE I+DEA dar- error# BIT: DI.LL,B +-LL indica que no %ermite valores nulos en las columnas que forman el *ndice# BIT: I8+,RE +-LL indica que las filas que tengan valores nulos en las columnas que forman el *ndice se ignoran, no aparecen cuando recuperamos las filas de la ta!la utili(ando ese *ndice#
Ejem%loC CRETE -+I4-E I+DEA ind' ,+ clientes 7%rovincia, %o"lacion .C, fec3aDnacimiento DE.C< 5rea un *ndice llamado ind1 so!re la ta!la clientes formado por las columnas provincia, poblacin y fecha_nacimiento# $ste *ndice permite tener ordenadas las filas de la ta!la clientes de forma que apare(can los clientes ordenados por provincia, dentro de la misma proincia por poblacin ' dentro de la misma po!lacin por edad ' del m-s joen al m-s ma'or# )l a4adir la cl-usula -+I4-E el *ndice no permitir- duplicados por lo que no podr*a tener dos clientes con la misma fecha de nacimiento en la misma po!lacin ' misma proincia, para eitar el po!lema ser*a mejor utili(ar, CRETE I+DEA ind' ,+ clientes 7%rovincia, %o"lacion .C, fec3aDnacimiento DE.C<
DR,/ I+DEA La sentencia DR,/ I+DEA sire para eliminar un ndice de una ta!la# %e elimina el *ndice pero no las columnas que lo forman# La sinta$is es la siguiente, Ejem%loC DR,/ I+DEA ind' ,+ clientes $limina el *ndice que ha!*amos creado en el ejemplo anterior# Tema (. Las consultas sim%les (I)
Bsqueda ,"jetivo $mpe(aremos por estudiar la sentencia .ELECT, que permite recu%erar datos de una o arias ta"las# La sentencia %$L$59 es con mucho la m-s compleja ' potente de las sentencias %&L# $mpe(aremos por er las consultas m-s sim%les, "asadas en una sola ta"la# $sta sentencia forma parte del DML (lenguaje de manipulacin de datos), en este tema eremos cmo seleccionar columnas de una ta!la, cmo seleccionar filas ' cmo o!tener las filas ordenadas por el criterio que queramos# $l resultado de la consulta es una ta"la lgica, porque no se guarda en el disco sino que est- en memoria ' cada e( que ejecutamos la consulta se uele a calcular# 5uando ejecutamos la consulta se isuali(a el resultado en forma de ta!la con columnas ' filas, pues en la %$L$59 tenemos que indicar qu/ columnas queremos que tenga el resultado ' qu/ filas queremos seleccionar de la ta!la origen# %i no conoces toda*a las ta!las que utili(aremos para los ejemplos ' ejercicios clic aqu* .inta$is de la sentencia .ELECT (consultas simples) La ta"la origen E 6R,0 E 5on la cl-usula 6R,0 indicamos en &u) ta"la tiene que "uscar la informacin# $n este cap*tulo de consultas simples el resultado se o!tiene de una nica ta!la# La sinta1is de la cl-usula es, 6R,0 es%ecificacin de ta"la 0na especificacin de ta!la puede ser el nom!re de una consulta guardada (las que aparecen en la entana de !ase de datos), o el nom!re de una ta!la que a su e( puede tener el siguiente formato, liasta"la es un nom!re de alias, es como un segundo nom"re que asignamos a la ta"la, si en una consulta definimos un alias para la ta!la, esta se de!er- nom!rar utili(ando ese nom!re ' no su nom!re real, adem-s ese nom"re slo es vlido en la consulta donde se define# $l alias se suele emplear en consultas !asadas en m-s de una ta!la que eremos en el tema siguiente# La pala!ra . que se puede poner delante del nom!re de alias es opcional ' es el alor por defecto por lo que no tienen ningn efecto# $jemplo, .ELECT ......6R,0 oficinas ofi " equialente a .ELECT ......6R,0 oficinas . ofi esta sentencia me indica que se an a !uscar los datos en la ta!la oficinas que queda renom!rada en esta consulta con ofi# $n una .ELECT podemos utili(ar ta!las que no est-n definidas en la !ase de datos (siempre que tengamos los permisos adecuados claro), si la ta!la no est- en la !ase de datos actia, de!emos indicar en qu/ !ase de datos se encuentra con la cl-usula I+# $n la cl-usula I+ el nom!re de la !ase de datos de!e incluir el camino com%leto, la e$tensin (#md!), ' estar entre comillas sim%les# %upongamos que la ta!la empleados estuiese en otra !ase de datos llamada otra en la carpeta c:\mis documentos\, ha!r*a que indicarlo as*, .ELECT F 6R,0 em%leados I+ GcCHmis documentosHotra.md"G >eneralmente tenemos las ta!las en la misma !ase de datos ' no ha' que utili(ar la cl-usula I+# .eleccin de columnas La lista de columnas que queremos que a%areIcan en el resultado es lo que llamamos lista de seleccin ' se especifica delante de la cl-usula 6R,0#
-tiliIacin del F %e utili(a el asterisco ? en la lista de seleccin para indicar Gtodas las columnas de la ta"laG# 9iene dos ventajas, $itar nom!rar las columnas una a una (es m-s corto)# %i a4adimos una columna nuea en la ta!la, esta nuea columna saldr- sin tener que modificar la consulta# %e puede com!inar el ? con el nom!re de una ta!la (ej# oficinas#?), pero esto se utili(a m-s cuando el origen de la consulta son dos ta!las# .ELECT F 6R,0 oficinas o !ien .ELECT oficinas.F 6R,0 oficinas Lista todos los datos de las oficinas columnas de la ta"la origen Las columnas se pueden especificar mediante su nom"re sim%le (n!col) o su nom"re cualificado (n!ta!la#n!col, el nom!re de la columna precedido del nom!re de la ta!la que contiene la columna ' separados por un punto)# $l nom!re cualificado se puede emplear siempre que queramos ' es o!ligatorio en algunos casos que eremos m-s adelante# 5uando el nom"re de la columna o de la ta!la contiene es%acios en "lanco, ha' que poner el nom!re entre corc3etes @ A ' adem-s el nmero de espacios en !lanco de!e coincidir# .or ejemplo @codigo de clienteA no es lo mismo que @ codigo de clienteA (el segundo llea un espacio en !lanco delante de cdigo) $jemplos , .ELECT nom"re, oficina, contrato 6R,0 ofiventas Lista el nom!re, oficina, ' fecha de contrato de todos los empleados# .ELECT idfa", id%roducto, descri%cion, %recio 6R,0 %roductos Lista una tarifa de productos lias de columna# 5uando se isuali(a el resultado de la consulta, normalmente las columnas toman el nom!re que tiene la columna en la ta!la, si queremos cam!iar ese nom!re lo podemos hacer definiendo un alias de columna mediante la cl-usula . ser- el nom!re que aparecer- como ttulo de la columna. $jemplo, .ELECT idfa" . fa"ricante, id%roducto, descri%cion 6R,0 %roductos 5omo t*tulo de la primera columna aparecer- fa!ricante en e( de idfa! Columnas calculadas# )dem-s de las columnas que proienen directamente de la ta!la origen, una consulta %&L puede incluir columnas calculadas cu'os alores se calculan a partir de los alores de los datos almacenados# .ara solicitar una columna calculada, se especifica en la lista de seleccin una e$%resin en e( de un nom!re de columna# La e1presin puede contener sumas, restas, multiplicaciones ' diisiones, concatenacin B , par/ntesis ' tam!i/n funciones predefinidas)# .ara er con m-s detalle cmo formar una e1presin pincha aqu* $jemplos, .ELECT ciudad, regin, 7ventasE o"jetivo< . su%eravit 6R,0 oficinas Lista la ciudad, regin ' el superait de cada oficina# .ELECT idfa", id%roducto, descri%cion, 7e$istencias F %recio< . valoracion 6R,0 %roductos De cada producto o!tiene su fa!ricante, idproducto, su descripcin ' el alor del inentario .ELECT nom"re, 0,+T:7contrato<, 1ER7contrato< 6R,0 re%ventas Lista el nom!re, mes ' a4o del contrato de cada endedor# La funcin M<69H() deuele el mes de una fecha La funcin C$);() deuele el a4o de una fecha .ELECT oficina, Gtiene ventas de G, ventas 6R,0 oficinas Listar las entas en cada oficina con el formato, 33 tiene entas de 2DE,8F3#88 ptas ,rdenacin de las filas E ,RDER !1 E .ara ordenar las filas del resultado de la consulta, tenemos la cl-usula ,RDER !1# 5on esta cl-usula se altera el orden de isuali(acin de las filas de la ta!la pero en ningn caso se modifica el orden de las filas dentro de la ta!la# La ta!la no se modifica# .odemos indicar la columna por la que queremos ordenar utili(ando su nom"re de columna (n!columna) o utili(ando su n5mero de orden que ocupa en la lista de seleccin (6Gcolumna)# $jemplo, SELECT nombre, oficina, contrato FROM empleados ORDER BY oficina es equivalente a SELECT nombre, oficina, contrato FROM empleados ORDER BY 2 .or defecto el orden ser- ascendente (.C) (de menor a ma'or si el campo es num/rico, por orden alfa!/tico si el campo es de tipo te1to, de anterior a posterior si el campo es de tipo fecha:hora, etc### $jemplos, .ELECT nom"re, numem%, oficinare% 6R,0 em%leados ,RDER !1 nom"re <!tiene un listado alfa!/tico de los empleados# .ELECT nom"re, numem%, contrato 6R,0 em%leados ,RDER !1 contrato <!tiene un listado de los empleados por orden de antiguedad en la empresa (los de m-s antiguedad aparecen primero)# .ELECT nom"re, numem%,ventas 6R,0 em%leados ,RDER !1 ventas <!tiene un listado de los empleados ordenados por olmen de entas sac-ndo los de menores entas primero# %i queremos podemos alterar ese orden utili(ando la cl-usula DE.C (D$%5endente), en este caso el orden ser- el inerso al )%5# $jemplos, .ELECT nom"re, numem%, contrato 6R,0 em%leados ,RDER !1 contrato DE.C <!tiene un listado de los empleados por orden de antiguedad en la empresa empe(ando por los m-s recientemente incorporados# .ELECT nom"re, numem%,ventas 6R,0 em%leados ,RDER !1 ventas DE.C <!tiene un listado de los empleados ordenados por olmen de entas sacando primero los de ma'ores entas# 9am!i/n podemos ordenar por varias columnas, en este caso se indican las columnas separadas por comas# %e ordenan las filas por la primera columna de ordenacin, para un mismo alor de la primera columna, se ordenan por la segunda columna, ' as* sucesiamente# La cl-usula DE.C o .C se puede indicar para cada columna ' as* utili(ar una ordenacin distinta para cada columna# .or ejemplo ascendente por la primera columna ' dentro de la primera columna, descendente por la segunda columna# $jemplos, .ELECT region, ciudad, ventas 6R,0 oficinas ,RDER !1 region, ciudad Muestra las entas de cada oficina , ordenadas por orden alfa!/tico de regin ' dentro de cada regin por ciudad# .ELECT region, ciudad, 7ventas E o"jetivo< . su%eravit 6R,0 oficinas Lista las oficinas clasificadas por regin ' dentro de cada regin por superait de modo que las de ma'or superait apare(can las primeras# ,RDER !1 region, = DE.C .eleccin de filas ) continuacin eremos las cl-usulas que nos permiten indicar &u) filas queremos visualiIar#
Las clusulas DI.TI+CT J LL )l incluir la cl-usula DI.TI+CT en la %$L$59, se eliminan del resultado las re%eticiones de filas# %i por el contrario queremos que apare(can todas las filas incluidas las du%licadas, podemos incluir la cl-usulaLL o nada, 'a que )LL es el alor que %&L asume por defecto# .or ejemplo queremos sa!er los cdigos de los directores de oficina# .ELECT dir 6R,0 oficinas .ELECT LL dir 6R,0 oficinas Lista los cdigos de los directores de las oficinas# $l director 28D aparece en cuatro oficinas, por lo tanto aparecer- cuatro eces en el resultado de la consulta# .ELECT DI.TI+CT dir 6R,0 oficinas $n este caso el alor 28D aparecer- una sola e( 'a que le decimos que liste los distintos alores de directores# La clusula T,/ La cl-usula T,/ permite sacar las n %rimeras filas de la ta!la origen# 6o elige entre alores iguales, si pido los 37 primeros alores pero el que hace 3E es el mismo alor que el 37, entonces deoler- 3E registros en e( de 37 (o los que sea)# %iempre se guia por la columna de ordenacin, la que aparece en la cl-usula <;D$; BC o en su defecto la clae principal de la ta!la# .or ejemplo queremos sa!er los dos empleados m-s antiguos de la empresa# .ELECT T,/ ( numem%, nom"re 6R,0 em%leado ,RDER !1 contrato Lista el cdigo ' nom!re de los empleados orden-ndolos por fecha de contrato, sacando unicamente los dos primeros (ser-n los dos m-s antiguos)# .ELECT T,/ = numem%, nom"re 6R,0 em%leado ,RDER !1 contrato $n este caso tiene que sacar los tres primeros, pero si nos fijamos en las fechas de contrato tenemos 38:28:DE, 28:23:DE, 82:8=:DH, 82:8=:DH, la tercera fecha es igual que la cuarta, en este caso sacar- estas cuatro filas en e( de tres, ' sacar*a todas las filas que tuiesen el mismo alor que la tercera fecha de contrato# $l nmero de filas que queremos isuali(ar se puede e1presar con un nmero entero o como un %orcentaje so!re el n5mero total de filas que se recuperar*an sin la cl-usula 9<.# $n este ltimo caso utili(aremos la cl-usula T,/ n /ERCE+T (porcentaje en ingl/s)# .ELECT T,/ (> /ERCE+T nom"re 6R,0 em%leado ,RDER !1 contrato Lista el nom!re de los empleados orden-ndolos por fecha de contrato, sacando unicamente un 38I del total de empleados# 5omo tenemos 28 empleados, sacar- los dos primeros, si tuiesemos 288 empleados sacar*a los 38 primeros# La clusula B:ERE La cl-usula B:ERE selecciona unicamente las filas que cum%lan la condicin de seleccin especificada# $n la consulta slo aparecer-n las filas para las cuales la condicin es erdadera (9;0$), los alores nulos (60LL) no se inclu'en por lo tanto en las filas del resultado# La condicin de seleccin puede ser cualquiercondicin vlida o com"inacin de condiciones utili(ando los operadores +,T (no) +D (') ' ,R ()# $n )55$%%3888 una cl-usula JH$;$ puede contener hasta F8 e1presiones inculadas por operadores lgicos )6D ' <;# %i quieres er cmo funcionan los operadores lgicos .ara empe(ar eamos un ejemplo sencillo, .ELECT nom"re 6R,0 em%leados B:ERE oficina K '( Lista el nom!re de los empleados de la oficina 23# .ELECT nom"re 6R,0 em%leados B:ERE oficina K '( +D edad L => Lista el nom!re de los empleados de la oficina 23 que tengan m-s de =8 a4os# (oficina igual a 23 # edad ma'or que =8) Tema (. Las consultas sim%les (IK) Condiciones de seleccin
Las condiciones de seleccin son las condiciones que pueden aparecer en la clusula !ERE. En SQL tenemos cinco condiciones bsicas: el test de comparacin el test de ran"o el test de pertenencia a #n con$#nto el test de %alor n#lo el test de correspondencia con patrn . El test de comparacin. Compara el valor de una expresin con el valor de otra. La sintaxis es la siguiente:
= igual que < distinto de < menor que <= menor o igual ma!or que = ma!or o igual SELECT n#memp, nombre FROM empleados !ERE %entas & c#ota Lista los empleados cu!as ventas superan su cuota SELECT n#memp, nombre FROM empleados !ERE contrato ' ()*+)*+*,--( Lista los empleados contratados antes del a"o ## $cu!a %ec&a de contrato sea anterior al ' de enero de '(##). **+,o--. las %ec&as entre almo&adillas / / deben estar con el %ormato mes.dia.a"o aunque tengamos de%inido otro %ormato para nuestras %ec&as. SELECT n#memp, nombre FROM empleados !ERE YE.R/contrato0 ' *,-- Este e,emplo obtiene lo mismo que el anterior pero utili0a la %uncin !ear$). +btiene los empleados cu!o a"o de la %ec&a de contrato sea menor que '(##. SELECT oficina FROM oficinas !ERE %entas ' ob$eti%o 1 )2- Lista las o%icinas cu!as ventas est1n por deba,o del #23 de su ob,etivo. 4a! que utili0ar siempre el punto decimal aunque tengamos de%inida la coma como separador de decimales. SELECT oficina FROM oficinas !ERE dir 3 *)- Lista las o%icinas dirigidas por el empleado '2#. Test de ran"o $BETEE4). Examina si el %alor de la expresin est comprendido entre los dos %alores de%inidos por exp' ! exp5. 6iene la siguiente sintaxis: SELECT n#memp, nombre FROM empleados !ERE %entas BETEE4 *))))) .4D 5))))) Lista los empleados cu!as ventas est1n comprendidas entre '22.222 ! 722.22 SELECT n#memp, nombre FROM empleados !ERE /%entas &3 *)))))0 .4D /%entas '3 5)))))0 +btenemos lo mismo que en el e,emplo anterior. Los par1ntesis son opcionales. Test de pertenencia a con$#nto $64) Examina si el %alor de la expresin es uno de los valores incl#idos en la lista de %alores. 6iene la siguiente sintaxis: SELECT n#memp, nombre, oficina FROM empleados !ERE oficina 64 /*2,*7,*80 Lista los empleados de las o%icinas '5. '8 ! '9 SELECT n#memp, nombre FROM empleados !ERE /oficina 3 *20 OR /oficina 3 *70 OR /oficina 3 *80 +btenemos lo mismo que en el e,emplo anterior. Los par1ntesis son opcionales. Test de %alor n#lo $6S 49LL) :na condicin de seleccin puede dar como resultado el valor verdadero 6;:E. %also <=LSE o nulo >:LL. Cuando una col#mna que interviene en una condicin de seleccin contiene el %alor n#lo, el res#ltado de la condicin no es verdadero ni %also. sino n#lo. sea c#al sea el test que se &a!a utili0ado. ?or eso si queremos listar las %ilas que tienen valor en una determinada columna. no podemos utili0ar el test de comparacin. la condicin o%icina = null devuelve el valor nulo sea cual sea el valor contenido en o%icina. Si queremos preguntar si una columna contiene el valor nulo debemos utili0ar un test especial. el test de valor nulo. 6iene la siguiente sintaxis:
E,emplos: SELECT oficina, ci#dad FROM oficinas !ERE dir 6S 49LL Lista las o%icinas que no tienen director. SELECT n#memp, nombre FROM empleados !ERE oficina 6S 4OT 49LL Lista los empleados asignados a alguna o%icina $los que tienen un valor en la columna o%icina). Test de correspondencia con patrn $L6:E) Se utili0a cuando queremos #tili;ar caracteres comodines para %ormar el valor con el comparar. 6iene la siguiente sintaxis:
Los comodines ms usados son los siguientes: < representa un carcter cualquiera 1 representa cero o ms caracteres ( representa un d@gito cualquiera $2A() E,emplos: SELECT n#memp, nombre FROM empleados !ERE nombre L6:E =L#is1= Lista los empleados cu!o nombre empiece por Luis $Luis seguido de cero o ms caracteres). SELECT n#memp, nombre FROM empleados !ERE nombre L6:E =1L#is1= Lista los empleados cu!o nombre contiene Luis. en este caso tambi1n saldr@a los empleados Bos1 Luis $cero o ms caracteres seguidos de L:CS ! seguido de cero o ms caracteres). SELECT n#memp, nombre FROM empleados !ERE nombre L6:E =<<a1= Lista los empleados cu!o nombre contenga una a como tercera letra $dos caracteres. la letra a. ! cero o ms caracteres. Tema =. Las consultas multita"la (I)
Bsqueda Introduccin $n este tema amos a estudiar las consultas multita"la llamadas as* porque est-n "asadas en ms de una ta"la# $l %&L de Microsoft +et F#1 soporta dos grupos de consultas multita!la, L la unin de ta!las L la com%osicin de ta!las La unin de ta"las $sta operacin se utili(a cuando tenemos dos ta"las con las mismas columnas ' queremos o!tener una nueva ta"la con las filas de la %rimera # las filas de la segunda# $n este caso la ta!la resultante tiene las mismas columnas que la primera ta!la (que son las mismas que las de la segunda ta!la)# .or ejemplo tenemos una ta!la de li!ros nueos ' una ta!la de li!ros antiguos ' queremos una lista con todos los li!ros que tenemos# $n este caso las dos ta!las tienen las mismas columnas, lo nico que ar*a son las filas, adem-s queremos o!tener una lista de li!ros (las columnas de una de las ta!las) con las filas que est-n tanto en li!ros nueos como las que est-n en li!ros antiguos, en este caso utili(aremos este tipo de operacin# 5uando ha!lamos de ta!las pueden ser ta"las reales almacenadas en la !ase de datos o ta"las lgicas (resultados de una consulta), esto nos permite utili(ar la operacin con m-s frecuencia 'a que pocas eces tenemos en una !ase de datos ta!las id/nticas en cuanto a columnas# $l resultado es siempre una ta"la lgica# .or ejemplo queremos en un slo listado los productos cu'as e1istencias sean iguales a cero ' tam!i/n los productos que aparecen en pedidos del a4o M8# $n este caso tenemos unos productos en la ta!la de productos ' los otros en la ta!la de pedidos, las ta!las no tienen las mismas columnas no se puede hacer una union de ellas pero lo que interesa realmente es el identificador del producto (idfa!,idproducto), luego por una parte sacamos los cdigos de los productos con e1istencias cero (con una consulta), por otra parte los cdigos de los productos que aparecen en pedidos del a4o M8 (con otra consulta), ' luego unimos estas dos ta!las lgicas# $l operador que permite reali(ar esta operacin es el operador -+I,+#
La com%osicin de ta"las La composicin de ta!las consiste en concatenar filas de una ta!la con filas de otra# $n este caso o!tenemos una ta!la con las columnas de la %rimera ta"la unidas a las columnas de la segunda ta"la, ' las filas de la ta!la resultante son concatenaciones de filas de la %rimera ta"la con filas de la segunda ta"la# $l ejemplo anterior quedar*a de la siguiente forma con la composicin,
) diferencia de la unin la composicin permite o!tener una fila con datos de las dos ta!las, esto es mu' til cuando queremos isuali(ar filas cu'os datos se encuentran en dos ta!las# .or ejemplo queremos listar los pedidos con el nom!re del representante que ha hecho el pedido, pues los datos del pedido los tenemos en la ta!la de pedidos pero el nom!re del representante est- en la ta!la de empleados ' adem-s queremos que apare(can en la misma l*nea" en este caso necesitamos componer las dos ta!las (6ota, en el ejemplo e1puesto a continuacin, hemos seleccionado las filas que nos interesan)#
$1isten distintos tipos de composicin, aprenderemos a utili(arlos todos ' a elegir el tipo m-s apropiado a cada caso# Los ti%os de com%osicin de ta!las son, # $l %roducto cartesiano # $l I++ER M,I+ # $l LE6T J RI8:T M,I+ El o%erador -+I,+ 5omo 'a hemos isto en la p-gina anterior, el operador -+I,+ sire para o!tener a partir de dos ta"las con las mismas columnas, una nuea ta!la con las filas de la %rimera # las filas de la segunda# La sinta1is es la siguiente,
Consulta puede ser un nom"re de ta"la, un nom"re de consulta (en estos dos casos el nom!re de!e estar precedido de la pala!ra T!LE), o una sentencia .ELECT completa (en este caso no se puede ponerT!LE)# La sentencia .ELECT puede ser cualquier sentencia .ELECT con la nica restriccin de que no puede contener la cl-usula ,RDER !1# Despu/s de la primera consulta iene la pala!ra -+I,+ ' a continuacin la segunda consulta# La segunda consulta sigue las mismas reglas que la primera consulta# Las dos consultas de!en tener el mismo n5mero de columnas pero las columnas pueden llamarse de diferente forma ' ser de ti%os de datos distintos# Las columnas del resultado se llaman como las de la %rimera consulta# .or defecto la unin no inclu#e filas re%etidas, si alguna fila est- en las dos ta!las, slo aparece una e( en el resultado# %i &ueremos que apare(can todas las filas incluso las re%eticiones de filas, incluimos la pala!ra LL (todo en ingl/s)# $l empleo de LL tienen una ventaja, la consulta se ejecutar ms ra%idamente# .uede que la diferencia no se note con ta!las peque4as, pero si tenemos ta!las con muchos registros (filas) la diferencia puede ser nota!le# %e puede unir ms de dos ta!las, para ello despu/s de la segunda consulta re%etimos la pala!ra -+I,+ ### ' as* sucesiamente# 9am!i/n podemos indicar que queremos el resultado ordenado por algn criterio, en este caso se inclu'e la cl-usula ,RDER !1 que 'a imos en el tema anterior# La cl-usula ,RDER !1 se escri!e des%u)s de la 5ltima consulta, al final de la sentencia" para indicar las columnas de ordenacin podemos utili(ar su n5mero de orden o el nom"re de la columna, en este ltimo caso se de!en de utili(ar los nom!res de columna de la %rimera consulta 'a que son los que se an a utili(ar para nom!rar las columnas del resultado#
.ara ilustrar la operacin amos a reali(ar el ejercicio isto en la p-gina anterior, amos a o!tener los cdigos de los productos que tienen e1istencias iguales a cero o que apare(can en pedidos del a4o M8#
o !ien T!LE Oe$istencias ceroP -+I,+ LL T!LE O%edidos N>P ,RDER !1 id%roducto %e ha incluido la cl-usula LL porque no nos importa que salgan filas repetidas# %e ha incluido ,RDER !1 para que el resultado salga ordenado por idproducto, o!serar que hemos utili(ado el nom!re de la columna de la primera .ELECT, tam!i/n pod*amos ha!er puesto ,RDER !1 ( pero no,RDER !1 %roducto (es el nom!re de la columna de la segunda ta!la)# .ara el 3G caso hemos creado una consulta llamada eistencias cero con la primera .ELECT, ' una consulta llamada pedidos !0 con la segunda .ELECT# <!serar que los nom!res de las consultas est-n entre corchetes porque contienen espacios en !lanco, ' que en este caso ha' que utili(ar T!LE#
Tema =. Las consultas multita"la (III)
Bsqueda El %roducto cartesiano El producto cartesiano es un tipo de composicin de tablas. aplicando el producto cartesiano a dos tablas se obtiene una tabla con las col#mnas de la primera tabla #nidas a las col#mnas de la se"#nda tabla. ! las %ilas de la tabla resultante son todas las posibles concatenaciones de filas de la primera tabla con %ilas de la se"#nda tabla. La sintaxis es la siguiente:
El prod#cto cartesiano se indica poniendo en la FROM las tablas que queremos componer separadas por comas. podemos obtener as@ el producto cartesiano de dos. tres. o ms tablas. nbtabla puede ser un nombre de tabla o un nombre de cons#lta. Si todas las tablas estn en una base de datos externa. a"adiremos la clusula 64 basedatose>terna desp#?s de la @ltima tabla. ?ero para me,orar el rendimiento ! %acilitar el uso. se recomienda utili0ar una tabla vinculada en lugar de la clusula C>. 4a! que tener en cuenta que el producto cartesiano obtiene todas las posibles combinaciones de %ilas por lo tanto si tenemos dos tablas de '22 registros cada una. el resultado tendr '22x'22 %ilas. si el producto lo &acemos de estas dos tablas con una tercera de 52 %ilas. el resultado tendr 522.222 %ilas $'22x'22x52) ! estamos &ablando de tablas peque"as. Se ve claramente que el producto cartesiano es unaoperacin costosa sobre todo si operamos con ms de dos tablas o con tablas voluminosas. Se puede componer una tabla consi"o misma. en este caso es obli"atorio utili0ar un nombre de alias por lo menos para una de las dos. ?or e,emplo: SELECT 1 FROM empleados, empleados emp En este e,emplo obtenemos el producto cartesiano de la tabla de empleados con ella misma. 6odas las posibles combinaciones de empleados con empleados.
?ara ver cmo %unciona el producto cartesiano cogemos las consultas Dexistencias ceroE ! Dpedidos (2E creadas en la pgina anterior. ! creamos una consulta que &alle el producto cartesiano de las dos.
SELECT 1 FROM Ae>istencias ceroB,Apedidos ,)B
obtenemos la siguiente tabla: Se observa que tenemos las dos %ilas de la primera consulta combinadas con las dos %ilas de la segunda. Esta operacin no es de las mCs #tili;adas. normalmente cuando queremos componer dos tablas es para a"adir a las %ilas de una tabla. una %ila de la otra tabla. por e,emplo a"adir a los pedidos los datos del cliente correspondiente. o los datos del representante. esto equivaldr@a a un producto cartesiano con una seleccin de %ilas: SELECT 1 FROM pedidos,clientes !ERE pedidos2clie3clientes2n#mclie Combinamos todos los pedidos con todos los clientes pero luego seleccionamos los que cumplan que el cdigo de cliente de la tabla de pedidos sea igual al cdigo de cliente de la tabla de clientes. por lo tanto nos quedamos con los pedidos combinados con los datos del cliente correspondiente. Las columnas que aparecen en la clusula F4E;E de nuestra consulta anterior se denominan col#mnas de empare$amiento !a que permiten empare,ar las %ilas de las dos tablas. Las columnas de empare,amiento no tienen por qu1 estar incluidas en la lista de seleccin. >ormalmente empare,amos tablas que estn relacionadas entre s@ ! una de las columnas de empare,amiento es clave principal. pues en este caso. cuando #na de las col#mnas de empare$amiento tienen unDndice de%inido es ms e%iciente utili0ar otro tipo de composicin. el 644ER EO64. El I++ER M,I+ $l I++ER M,I+ es otro tipo de composicin de ta!las, permite em%arejar filas de distintas ta!las de forma ms eficiente que con el producto cartesiano cuando una de las columnas de em%arejamiento est-inde$ada# Ca que en e( de hacer el producto cartesiano completo ' luego seleccionar la filas que cumplen la condicin de emparejamiento, para cada fila de una de las ta!las "usca directamente en la otra ta!la las filas &ue cumplen la condicin, con lo cual se em%arejan slo las filas que luego aparecen en el resultado# La sinta1is es la siguiente,
$jemplo, .ELECT F 6R,0 %edidos I++ER M,I+ clientes ,+ %edidos.clie K clientes.numclie tabla1 ' tabla2 son es%ecificaciones de ta"la (nom!re de ta!la con alias o no, nom!re de consulta guardada), de las ta!las cu'os registros se an a com!inar# .ueden ser las dos la misma ta"la, en este caso es o"ligatorio definir al menos un alias de ta!la# col1, col2 son las columnas de em%arejamiento# <!serar que dentro de la cl-usula ,+ los nom!res de columna de!en ser nom"res cualificados (llean delante el nom!re de la ta!la ' un punto)# Las columnas de em%arejamiento de!en contener la misma clase de datos, las dos de tipo te1to, de tipo fecha etc### los campos num/ricos de!en ser de tipos similares# .or ejemplo, se puede com!inar campos )uto6um/rico ' Long puesto que son tipos similares, sin em!argo, no se puede com!inar campos de tipo %imple ' Do!le# )dem-s las columnas no pueden ser de tipo Memo ni <L$# com% representa cualquier operador de com%aracin ( N, O, P, ON, PN, o OP ) ' se utili(a para esta!lecer la condicin de emparejamiento# %e pueden definir varias condiciones de emparejamiento unidas por los operadores +D ' ,R poniendo cada condicin entre %ar)ntesis# $jemplo, .ELECT F 6R,0 %edidos I++ER M,I+ %roductos ,+ 7%edidos.fa" K %roductos.idfa"< +D 7%edidos.%roducto K %roductos.id%roducto< %e pueden com"inar ms de dos ta"las $n este caso ha' que sustituir en la sinta1is una ta"la por un I++ER M,I+ com%leto# .or ejemplo, .ELECT F 6R,0 7%edidos I++ER M,I+ clientes ,+ %edidos.clie K clientes.numclie< I++ER M,I+ em%leados ,+ %edidos.re% K em%leados.numem% $n e( de tabla1 hemos escrito un I66$; +<I6 completo, tam!i/n podemos escri!ir, .ELECT F 6R,0 clientes I++ER M,I+ 7%edidos I++ER M,I+ em%leados ,+ %edidos.re% K em%leados.numem%< ,+ %edidos.clie K clientes.numclie $n este caso hemos sustituido tabla2 por un I66$; +<I6 completo#
El LE6T M,I+ # RI8:T M,I+ $l LE6T M,I+ ' RI8:T M,I+ son otro tipo de composicin de ta!las, tam!i/n denominada com%osicin e$terna# %on una e1tensin del I++ER M,I+# Las composiciones istas hasta ahora (el %roducto cartesiano ' el I++ER M,I+) son com%osiciones internas 'a que todos los alores de las filas del resultado son alores que est-n en las ta!las que se com!inan# 5on una composicin interna slo se o!tienen las filas que tienen al menos una fila de la otra ta!la que cumpla la condicin, eamos un ejemplo, &ueremos com!inar los empleados con las oficinas para sa!er la ciudad de la oficina donde tra!aja cada empleado, si utili(amos un producto cartesiano tenemos, .ELECT em%leados.F,ciudad 6R,0 em%leados, oficinas B:ERE em%leados.oficina K oficinas.oficina <!serar que hemos cualificado el nom!re de columna oficina 'a que ese nom!re aparece en las dos ta!las de la Q;<M# 5on esta sentencia los em%leados que no tienen una oficina asignada (un alor nulo en el campo oficina de la ta!la empleados) no a%arecen en el resultado 'a que la condicin em%leados.oficina K oficinas.oficina ser- siempre nula para esos empleados# %i utili(amos el I++ER M,I+, .ELECT em%leados.F, ciudad 6R,0 em%leados I++ER M,I+ oficinas ,+ em%leados.oficina K oficinas.oficina 6os pasa lo mismo, el empleado 228 tiene un alor nulo en el campo oficina ' no aparecer- en el resultado# .ues en los casos en que &ueremos que tam"i)n a%areIcan las filas &ue no tienen una fila coincidente en la otra ta!la, utiliIaremos el LE6T o RI8:T M,I+# La sinta1is del LE6T M,I+ es la siguiente,
La descripcin de la sinta1is es la misma que la del I++ER M,I+ (er p-gina anterior), lo nico que cam!ia es la pala!ra I++ER por LE6T (iI&uierda en ingl/s)#
$sta operacin consiste en a*adir al resultado del I++ER M,I+ las filas de la ta"la de la iI&uierda que no tienen corres%ondencia en la otra ta!la, ' rellenar en esas filas los cam%os de la ta"la de la derec3acon valores nulos# $jemplo, .ELECT F 6R,0 em%leados LE6T M,I+ oficinas ,+ em%leados.oficina K oficinas.oficina 5on el ejemplo anterior o!tenemos una lista de los empleados con los datos de su oficina, ' el empleado 228 que no tiene oficina aparece con sus datos normales ' los datos de su oficina a nulos#
La sinta1is del RI8:T M,I+ es la siguiente, La sinta1is es la misma que la del I++ER M,I+ (er p-gina anterior), lo nico que cam!ia es la pala!ra I++ER por RI8:T (derec3a en ingl/s)#
$sta operacin consiste en a*adir al resultado del I++ER M,I+ las filas de la ta"la de la derec3a que no tienen corres%ondencia en la otra ta!la, ' rellenar en esas filas los cam%os de la ta"la de la iI&uierdacon valores nulos# $jemplo, .ELECT F 6R,0 em%leados RI8:T M,I+ oficinas ,+ em%leados.oficina K oficinas.oficina 5on el ejemplo anterior o!tenemos una lista de los empleados con los datos de su oficina, ' adem-s aparece una fila por cada oficina que no est- asignada a ningn empleado con los datos del empleado a nulos#
0na operacin LE6T +<I6 o RI8:T M,I+ se %uede anidar dentro de una operacin I++ER +<I6, pero una operacin I++ER +<I6 no se puede anidar dentro de LE6T +<I6 o RI8:T M,I+# Los anidamientos deM,I+ de distinta naturale(a no funcionan siempre, a eces depende del orden en que colocamos las ta!las, en estos casos lo mejor es pro!ar ' si no permite el anudamiento, cam!iar el orden de las ta!las ( ' por tanto de los M,I+s) dentro de la cl-usula 6R,0# .or ejemplo podemos tener, .ELECT F 6R,0 clientes I++ER M,I+ 7em%leados LE6T M,I+ oficinas ,+ em%leados.oficina K oficinas.oficina< ,+ clientes.re%clie K em%leados.numclie 5om!inamos empleados con oficinas para o!tener los datos de la oficina de cada empleado, ' luego a4adimos los clientes de cada representante, as* o!tenemos los clientes que tienen un representante asignado ' los datos de la oficina del representante asignado# %i hu!i/ramos puesto I++ER en e( de LE6T no saldr*an los clientes que tienen el empleado 228 (porque no tiene oficina ' por tanto no aparece en el resultado del LE6T M,I+ ' por tanto no entrar- en el c-lculo delI++ER M,I+ con clientes)#
Resumen de cundo utiliIar cada o%eracin. .ara sa!er en cada caso qu/ tipo de operacin se de!e utili(ar, a continuacin tienes un gr-fico que indica qu/ preguntas se tienen que hacer ' segn la respuesta, qu/ operacin utili(ar# .ara resumir hemos llamado 92 ' 93 las ta!las de las que queremos sacar los datos ' ; la ta!la lgica que representa el resultado de consulta# 92 ' 93 podr*an ser ta!las guardadas o consultas# $n la ltima parte cuando se pregunta R$n 92 ha' filas que no tienen pareja en 93R, la pregunta se de!e de interpretar como Ren alguna de las ta!las ha' filas que no tienen parejaR#
Tema ?. Las consultas de resumen (I)
Bsqueda Introduccin $n %&L de Microsoft +et F#1 ' de la ma'or*a de los motores de !ases de datos relacionales, podemos definir un ti%o de consultas cu'as filas resultantes son un resumen de las filas de la ta"la origen, por eso las denominamos consultas de resumen, tam!i/n se conocen como consultas sumarias# $s importante entender que las filas del resultado de una consulta de resumen tienen una naturaleIa distinta a las filas de las dem-s ta!las resultantes de consultas, 'a que corresponden a arias filas de la ta!la orgen# .ara simplificar, eamos el caso de una consulta !asada en una sola ta!la, una fila de una consulta Sno resumenS corresponde a una fila de la ta!la origen, contiene datos que se encuentran en una sola fila del origen, mientras que una fila de una consulta de resumen corres%onde a un resumen de varias filas de la ta"la origen, esta diferencia es lo que a a originar una serie de restricciones que sufren las consultas de resumen ' que eremos a lo largo del tema# $n el ejemplo que iene a continuacin tienes un ejemplo de consulta normal en la que se isuali(an las filas de la ta!la oficinas ordenadas por region, en este caso cada fila del resultado se corresponde con una sola fila de la ta!la oficinas, mientras que la segunda consulta es una consulta resumen, cada fila del resultado se corresponde con una o arias filas de la ta!la oficinas# Las consultas de resumen introducen dos nuevas clusulas a la sentencia %$L$59, la clusula 8R,-/ !1 ' la clusula :QI+8, son cl-usulas que slo se pueden utili(ar en una consulta de resumen, se tienen que escri!ir entre la cl-usula B:ERE ' la cl-usula ,RDER !1 ' tienen la siguiente sinta1is, Las detallaremos en la p-gina siguiente del tema, primero amos a introducir otro concepto relacionado con las consultas de resumen, las funciones de columna#
6unciones de columna $n la lista de seleccin de una consulta de resumen aparecen funciones de columna tam!i/n denominadas funciones de dominio agregadas# 0na funcin de columna se a%lica a una columna ' o!tiene un valor&ue resume el contenido de la columna# 9enemos las siguientes funciones de columna, $l argumento de la funcin indica con &u) valores se tiene que operar, por eso expresin suele ser un nom"re de columna, columna que contiene los alores a resumir, pero tam!i/n puede ser cualquier e1presin -lida que deuela una lista de alores# La funcin .-07< calcula la suma de los alores indicados en el argumento# Los datos que se suman de!en ser de ti%o num)rico (entero, decimal, coma flotante o monetario###)# $l resultado ser- del mismo tipo aunque puede tener una precisin ma'or# $jemplo, .ELECT <!tiene una sola fila con el resultado de sumar todos los alores de .-07ventas< 6R,0 oficinas la columna entas de la ta!la oficinas# La funcin Q87< calcula el %romedio (la media arim/tica) de los alores indicados en el argumento, tam!i/n se aplica a datos num)ricos, ' en este caso el tipo de dato del resultado puede cam!iar segn las necesidades del sistema para representar el alor del resultado# .tDev7< ' .tDev/7< calculan la desviacin estndar de una po!lacin o de una muestra de la po!lacin representada por los alores contenidos en la columna indicada en el argumento# %i la consulta !ase (el origen) tiene menos de dos registros, el resultado es nulo# $s interesante destacar que el valor nulo no e&uivale al valor >, las funciones de columna no consideran los valores nulos mientras que consideran el alor 8 como un alor, por lo tanto en las funciones )K>(), %9D$K(), %9D$K.() los resultados no ser-n los mismos con alores 8 que con alores nulos# Ke-moslo con un ejemplo, %i tenemos esta ta!la, La consulta .ELECT Q87col'< . media 6R,0 ta"la' deuele, $n este caso los ceros entran en la media por lo que sale igual a F (28T7T8T=TET8):E N F 5on esta otra ta!la, .ELECT Q87col'< . media 6R,0 ta"la( deuele, $n este caso los ceros se han sustituido por alores nulos ' no entran en el c-lculo por lo que la media sale igual a E (28T7T=TE):F N F Las funciones 0I+7< ' 0A7< determinan los valores menores ' ma#ores respectiamente# Los alores de la columna pueden ser de ti%o num)rico, te$to o fec3a# $l resultado de la funcin tendr- el mismo tipo de dato que la columna# %i la columna es de ti%o num)rico 0I+7< deuele el valor menor contenido en la columna, si la columna es de ti%o te$to 0I+7< deuele el %rimer valor en orden alfa")tico, ' si la columna es de ti%o fec3a, 0I+7< deuele la fec3a ms antigua ' 0A7< la fec3a ms reciente# La funcin C,-+T7n" columna< cuenta el n5mero de valores que ha' en la columna, los datos de la columna pueden ser de cual&uier ti%o, ' la funcin siempre deuele un nmero entero# %i la columna contiene valores nulos esos alores no se cuentan, si en la columna aparece un valor re%etido, lo cuenta varias veces# C,-+T7F< permite contar filas en e( de alores# %i la columna no contiene ningn alor nulo, C,-+T(n!columna) ' C,-+T7F< deuelen el mismo resultado, mientras que si ha' alores nulos en la columna,C,-+T7F< cuenta tam!i/n esos alores mientras que C,-+T(n! columna) no los cuenta# Ejem%lo, U5u-ntos empleados tenemosV .ELECT C,-+T7numem%< 6R,0 em%leados o !ien .ELECT C,-+T7F< 6R,0 em%leados $n este caso las dos sentencias deuelen el mismo resultado 'a que la columna numemp no contiene alores nulos (es la clae principal de la ta!la empleados)# U5u-ntos empleados tienen una oficina asignadaV .ELECT C,-+T7oficina< 6R,0 em%leados $sta sentencia por el contrario, nos deuele el nmero de alores no nulos que se encuentran en la columna oficina de la ta!la empleados, por lo tanto nos dice cu-ntos empleados tienen una oficina asignada# %e pueden com!inar arias funciones de columna en una e1presin pero no se pueden anidar funciones de columna, es decir, .ELECT 7Q87ventas< F =< R .-07cuota< 6R,0 ... es correcto .ELECT Q87.-07ventas<< 6R,0 ... 6< es correcto, no se puede incluir una funcin de columna dentro de una funcin de columna .eleccin en el origen de datos. %i queremos eliminar del origen de datos algunas filas, !asta incluir la cl-usula B:ERE que 'a conocemos despu/s de la cl-usula 6R,0# $jemplo, &ueremos sa!er el acumulado de entas de los empleados de la oficina 23# .ELECT .-07ventas< 6R,0 em%leados B:ERE oficina K '( ,rigen m5lti%le. %i los datos que necesitamos utili(ar para o!tener nuestro resumen se encuentran en varias ta"las, formamos el origen de datos adecuado en la cl-usula 6R,0 como si fuera una consulta multita"la normal# $jemplo, &ueremos o!tener el importe total de entas de todos los empleados ' el ma'or o!jetio de las oficinas asignadas a los empleados, .ELECT .-07em%leados.ventas<, 0A7o"jetivo< 6R,0 em%leados LE6T M,I+ oficinas ,+ em%leados.oficinaKoficinas.oficina 6<9), com!inamos empleados con oficinas por un LE6T M,I+ para que apare(can en el origen de datos todos los empleados incluso los que no tengan una oficina asignada, as* el origen de datos estar- formado por una ta!la con tantas filas como empleados ha'an en la ta!la empleados, con los datos de cada empleado ' de la oficina a la que est- asignado# De esta ta!la sacamos la suma del campo entas (importe total de entas de todos los empleados) ' el o!jetio m-1imo# <!serar que el origen de datos no inclu'e las oficinas que no tienen empleados asignados, por lo que esas oficinas no entran a la hora de calcular el alor m-1imo del o!jetio# La clusula 8R,-/ !1 Hasta ahora las consultas de resumen que hemos isto utili(an todas las filas de la ta!la ' producen una nica fila resultado# %e pueden o!tener su"totales con la cl-usula 8R,-/ !1# 0na consulta con una cl-usula 8R,-/ !1 se denomina consulta agru%ada 'a que agrupa los datos de la ta!la origen ' %roduce una 5nica fila resumen %or cada gru%o formado# Las columnas indicadas en el 8R,-/ !1 se llaman columnas de agru%acin# $jemplo, .ELECT .-07ventas< 6R,0 re%ventas <!tiene la suma de las entas de todos los empleados# .ELECT .-07ventas< 6R,0 re%ventas 8R,-/ !1 oficina %e forma un grupo para cada oficina, con las filas de la oficina, ' la suma se calcula so!re las filas de cada grupo# $l ejemplo anterior o!tiene una lista con la suma de las entas de los empleados de cada oficina# La consulta quedar*a mejor inclu'endo en la lista de seleccin la oficina para sa!er a qu/ oficina corresponde la suma de entas, .ELECT oficina,.-07ventas< 6R,0 re%ventas 8R,-/ !1 oficina 0n columna de agrupacin no puede ser de tipo memo u <L$# La columna de agru%acin se puede indicar mediante un nom"re de columna o cualquier e1presin -lida !asada en una columna pero no se pueden utili(ar los alias de campo# $jemplo, .ELECT im%orteJcant , .-07im%orte< 6R,0 %edidos 8R,-/ !1 im%orteJcant $st- permitido, equialdr*a a agrupar las l*neas de pedido por precio unitario ' sacar de cada precio unitario el importe total endido# .ELECT im%orteJcant . %recio, .-07im%orte< 6R,0 %edidos 8R,-/ !1 %recio 6o est- permitido, no se puede utili(ar un alias campo# En la lista de seleccin slo %ueden a%arecer , valores constantes funciones de columna columnas de agru%acin (columnas que aparecen en la cl-usula 8R,-/ !1) o cual&uier e$%resin "asada en las anteriores# .ELECT .-07im%orte<,re%F'> 6R,0 %edidos 8R,-/ !1 re%F'> $st- permitido .ELECT .-07im%orte<,re% 6R,0 %edidos 8R,-/ !1 re%F'> 6o est- permitido, rep es una columna simple que no est- encerrrada en una funcin de columna, ni est- en la lista de columnas de agrupacin# %e %ueden agru%ar las filas %or varias columnas, en este caso se indican las columnas separadas por una coma ' en el orden de ma#or a menor agru%acin# %e permite incluir en la lista de agrupacin hasta 28 columnas# $jemplo, &ueremos o!tener la suma de las entas de las oficinas agrupadas por region ' ciudad, .ELECT .-07ventas< 6R,0 oficinas 8R,-/ !1 region,ciudad %e agrupa primero por regin, ' dentro de cada regin por ciudad# Todas las filas que tienen valor nulo en el campo de agrupacin, pasan a formar un 5nico gru%o# $s decir, considera el alor nulo como un alor cualquiera a efectos de agrupacin# $jemplo, .ELECT oficina,.-07ventas< . ventasDtotales 6R,0 re%ventas 8R,-/ !1 oficina $n el resultado aparece una fila con el campo oficina sin alor ' a continuacin una cantidad en el campo entasWtotales, esta cantidad corresponde a la suma de las entas de los empleados que no tienen oficina asignada (campo oficina igual a nulo)# La clusula :QI+8 La cl-usula :QI+8 nos permite seleccionar filas de la ta!la resultante de una consulta de resumen# .ara la condicin de seleccin se pueden utili(ar los mismos tests de comparacin descritos en la cl-usula B:ERE, tam!i/n se pueden escri!ir condiciones compuestas (unidas por los operadores ,R, +D,+,T), pero e1iste una restriccin# En la condicin de seleccin slo %ueden a%arecer , valores constantes funciones de columna columnas de agru%acin (columnas que aparecen en la cl-usula >;<0. BC) o cual&uier e$%resin "asada en las anteriores# $jemplo, &ueremos sa!er las oficinas con un promedio de entas de sus empleados ma'or que 788#888 ptas# .ELECT oficina 6R,0 em%leados 8R,-/ !1 oficina :QI+8 Q87ventas< L ;>>>>> 6<9), .ara o!tener lo que se pide ha' que calcular el promedio de entas de los empleados de cada oficina, por lo que ha' que utili(ar la ta!la empleados#9enemos que agrupar los empleados por oficina ' calcular el promedio para cada oficina, por ltimo nos queda seleccionar del resultado las filas que tengan un promedio superior a 788#888 ptas# Resumen del tema U5mo se ejecuta internamente una consulta de resumenV L .rimero se forma la ta!la origen de datos segn la cl-usula 6R,0, L se seleccionan del origen de datos las filas segn la cl-usula B:ERE, L se forman los grupos de filas segn la cl-usula 8R,-/ !1, L por cada grupo se o!tiene una fila en la ta!la resultante con los alores que aparecen en las cl-usulas 8R,-/ !1, :QI+8 ' en la lista de seleccin, L se seleccionan de la ta!la resultante las filas segn la cl-usula :QI+8, L se eliminan de la ta!la resultante las columnas que no aparecen en la lista de seleccin, L se ordenan las filas de la ta!la resultante segn la cl-usula ,RDER !1 0na consulta se conierte en consulta de resumen en cuanto aparece 8R,-/ !1, :QI+8 o una funcin de columna# $n una consulta de resumen, la lista de seleccin ' la cl-usula :QI+8 slo pueden contener, alores constantes funciones de columna columnas de agrupacin (columnas que aparecen en la cl-usula 8R,-/ !1) o cualquier e1presin !asada en las anteriores# Tema ;. Las su"consultas (I)
Bsqueda Definiciones 0na su"consulta es una sentencia .ELECT &ue a%arece dentro de otra sentencia .ELECT que llamaremos consulta %rinci%al# %e puede encontrar en la lista de seleccin, en la clusula B:ERE o en la clusula :QI+8 de la consulta principal# 0na su!consulta tiene la misma sinta1is que una sentencia %$L$59 normal e1ceptuando que aparece encerrada entre %ar)ntesis, no puede contener la cl-usula ,RDER !1, ni puede ser la -+I,+ de arias sentencias .ELECT, adem-s tiene algunas restricciones en cuanto a nmero de columnas segn el lugar donde aparece en la consulta principal# $stas restricciones las iremos descri!iendo en cada caso# 5uando se ejecuta una consulta que contiene una su!consulta, la su"consulta se ejecuta %or cada fila de la consulta %rinci%al# %e aconseja no utili(ar campos calculados en las su!consultas, ralenti(an la consulta# Las consultas que utili(an su!consultas suelen ser ms fciles de inter%retar %or el usuario# Referencias e$ternas ) menudo, es necesario, dentro del cuerpo de una su!consulta, hacer referencia al alor de una columna en la fila actual de la consulta principal, ese nom!re de columna se denomina referencia e1terna# 0na referencia e$terna es un nom!re de columna que estando en la su!consulta, no se refiere a ninguna columna de las ta!las designadas en la 6R,0 de la su!consulta sino a una columna de las ta"las designadas en la 6R,0 de la consulta %rinci%al. 5omo la su!consulta se ejecuta por cada fila de la consulta principal, el alor de la referencia e1terna ir- cam!iando# $jemplo, .ELECT numem%, nom"re, 7.ELECT 0I+7fec3a%edido< 6R,0 %edidos B:ERE re% K numem%< 6R,0 em%leados@ $n este ejemplo la consulta principal es .ELECT... 6R,0 em%leados# La su!consulta es 7 .ELECT 0I+7fec3a%edido< 6R,0 %edidos B:ERE re% K numem% <# $n esta su!consulta tenemos una referencia e1terna ( numemp ) es un campo de la ta!la empleados (origen de la consulta principal)# U&u/ pasa cuando se ejecuta la consulta principalV L se coge el primer empleado ' se calcula la su!consulta sustitu'endo numemp por el alor que tiene en el primer empleado# La su!consulta o!tiene la fecha m-s antigua en los pedidos del rep N 282, L se coge el segundo empleado ' se calcula la su!consulta con numemp N 283 (numemp del segundo empleado)### ' as* sucesiamente hasta llegar al ltimo empleado# )l final o!tenemos una lista con el nmero, nom!re ' fecha del primer pedido de cada empleado# %i quitamos la cl-usula B:ERE de la su!consulta o!tenemos la fecha del primer pedido de todos los pedidos no del empleado correspondiente# nidar su"consultas Las su!consultas pueden anidarse de forma que una su"consulta a%areIca en la clusula B:ERE (por ejemplo) de otra su"consulta que a su e( forma parte de otra consulta principal# $n la pr-ctica, una consulta consume mucho m-s tiempo ' memoria cuando se incrementa el nmero de nieles de anidamiento# La consulta resulta tam!i/n m-s dif*cil de leer , comprender ' mantener cuando contiene m-s de uno o dos nieles de su!consultas# $jemplo, .ELECT numem%, nom"re 6R,0 em%leados B:ERE numem% K 7.ELECT re% 6R,0 %edidos B:ERE clie K 7.ELECT numclie 6R,0 clientes B:ERE nom"re K GMulia nte&ueraG<< $n este ejemplo, por cada linea de pedido se calcula la su!consulta de clientes, ' esto se repite por cada empleado, en el caso de tener 28 filas de empleados ' 388 filas de pedidos (ta!las realmente peque4as), la su!consulta m-s interna se ejecutar*a 3888 eces (28 1 388)# .u"consulta en la lista de seleccin 5uando la su!consulta aparece en la lista de seleccin de la consulta principal, en este caso la su!consulta, no %uede devolver varias filas ni varias columnas, de lo contrario se da un mensaje de error# Muchos %&Ls no permiten que una su!consulta apare(ca en la lista de seleccin de la consulta principal pero eso no es ningn pro!lema 'a que normalmente se puede o!tener lo mismo utili(ando como origen de datos las dos ta!las# $l ejemplo anterior se puede o!tener de la siguiente forma, .ELECT numem%, nom"re, 0I+7fec3a%edido< 6R,0 em%leados LE6T M,I+ %edidos ,+ em%leados.numem% K %edidos.re% 8R,-/ !1 numem%, nom"re En la clusula 6R,0 $n la cl-usula Q;<M se puede encontrar una sentencia %$L$59 encerrada entre par/ntesis pero ms &ue su"consulta sera una consulta 'a que no se ejecuta para cada fila de la ta!la origen sino que se ejecuta una sola e( al principio, su resultado se com!ina con las filas de la otra ta!la para formar las filas origen de la %$L$59 primera ' no admite referencias e1ternas# $n la cl-usula Q;<M imos que se pod*a poner un nom!re de ta!la o un nom!re de consulta, pues en e( de poner un nom!re de consulta se puede poner directamente la sentencia %$L$59 correspondiente a esa consulta encerrada entre par/ntesis#
.u"consulta en las clusulas B:ERE # :QI+8 %e suele utili(ar su!consultas en las cl-usulas JH$;$ o H)KI6> cuando los datos que queremos isuali(ar est-n en una ta!la pero para seleccionar las filas de esa ta!la necesitamos un dato que est- en otra ta!la# $jemplo, .ELECT numem%, nom"re 6R,0 em%leados B:ERE contrato K 7.ELECT 0I+7fec3a%edido< 6R,0 %edidos< $n este ejemplo listamos el nmero ' nom!re de los empleados cu'a fecha de contrato sea igual a la primera fecha de todos los pedidos de la empresa# $n una cl-usula B:ERE : :QI+8 tenemos siempre una condicin ' la su!consulta acta de operando dentro de esa condicin# $n el ejemplo anterior se compara contrato con el resultado de la su!consulta# Hasta ahora las condiciones estudiadas ten*an como operandos alores simples (el alor contenido en una columna de una fila de la ta!la, el resultado de una operacin aritm/tica###) ahora la su!consulta puede deoler una columna entera por lo que es necesario definir otro tipo de condiciones es%eciales para cuando se utili(an con su!consultas# Condiciones de seleccin con su"consultas
Las condiciones de seleccin son las condiciones que pueden aparecer en la cl-usula B:ERE o :QI+8# La ma'or*a se han isto en el tema 3 pero ahora incluiremos las condiciones que utili(an una su!consulta como operando# $n %&L tenemos cuatro nueas condiciones, el test de com%aracin con su"consulta el test de com%aracin cuantificada el test de %ertenencia a un conjunto el test de e$istencia $n todos los tests estudiados a continuacin epresion puede ser cualquier nom!re de columna de la consulta principal o una e1presin -lida como 'a imos en el tema 3# $l test de com%aracin con su"consulta# $s el e&uivalente al test de com%aracin sim%le# %e utili(a para comparar un alor de la fila que se est- e1aminado con un nico alor producido por la su!consulta# La su!consulta de!e deoler una 5nica columna, sino se produce un error# %i la su!consulta no produce ninguna fila o deuele el alor nulo, el test deuele el valor nulo, si la su!consulta produce varias filas, %&L deuele una condicin de error# La sinta1is es la siguiente,
.ELECT oficina, ciudad 6R,0 oficinas Lista las oficinas cu'o o!jetio sea superior a la suma de las entas de sus empleados# B:ERE o"jetivo L 7.ELECT .-07ventas< 6R,0 em%leados B:ERE em%leados.oficina K oficinas.oficina< $n este caso la su!consulta deuele una nica columna ' una nica fila (es un consulta de resumen sin 8R,-/ !1) $l test de com%aracin cuantificada# $ste test es una e1tensin del test de comparacin ' del test de conjunto# Com%ara el valor de la e1presin con cada uno de los valores producidos por la su!consulta# La su!consulta de!e deoler una 5nica columna sino se produce un error# 9enemos el test +1 (al"#n, al"uno en ingl/s) ' el test LL (todos en ingl/s)# La sinta1is es la siguiente, $l test +1# La su!consulta de!e deoler una nica columna sino se produce un error# %e eala la comparacin con cada alor deuelto por la su!consulta# %i alguna de las com%araciones individuales %roduce el resultado verdadero, el test +1 devuelve el resultado verdadero# %i la su!consulta no deuele ning5n valor, el test +1 deuele falso# %i el test de comparacin es falso para todos los valores de la columna, +1 deuele falso# %i el test de comparacin no es verdadero para ningn alor de la columna, # es nulo para al menos alguno de los alores, +1 deuele nulo# .ELECT oficina, ciudad 6R,0 oficinas B:ERE o"jetivo L +1 7.ELECT .-07cuota< 6R,0 em%leados 8R,-/ !1 oficina< $n este caso la su!consulta deuele una nica columna con las sumas de las cuotas de los empleados de cada oficina# Lista las oficinas cu'o o!jetio sea superior a alguna de las sumas o!tenidas# $l test LL# La su!consulta de!e deoler una nica columna sino se produce un error# %e eala la comparacin con cada alor deuelto por la su!consulta# .i todas las comparaciones indiiduales, producen un resultado verdadero, el test deuele el alor verdadero# %i la su!consulta no deuele ning5n valor el test LL deuele el alor verdadero# (X<jo con estoY) %i el test de comparacin es falso para algn alor de la columna, el resultado es falso# %i el test de comparacin no es falso para ningn alor de la columna, pero es nulo para alguno de esos alores, el test LL deuele alor nulo. .ELECT oficina, ciudad 6R,0 oficinas B:ERE o"jetivo L LL 7.ELECT .-07cuota< 6R,0 em%leados 8R,-/ !1 oficina< $n este caso se listan las oficinas cu'o o!jetio sea superior a todas las sumas# Test de %ertenencia a conjunto (I+)# $1amina si el valor de la e1presin es uno de los alores incluidos en la lista de valores %roducida %or la su"consulta# La su!consulta de!e generar una nica columna ' las filas que sean# %i la su!consulta no produce ninguna fila, el test da falso# 9iene la siguiente sinta1is,
.ELECT numem%, nom"re, oficina 6R,0 em%leados B:ERE oficina I+ 7.ELECT oficina 6R,0 oficinas B:ERE region K GesteG< 5on la su!consulta se o!tiene la lista de los nmeros de oficina del este ' la consulta principal o!tiene los empleados cu'o nmero de oficina sea uno de los nmeros de oficina del este# .or lo tanto lista los empleados de las oficinas del este# $l test de e$istencia EAI.T.# $1amina si la su!consulta produce alguna fila de resultados# .i la su"consulta contiene filas, el test adopta el alor verdadero, si la su!consulta no contiene ninguna fila, el test toma el alor falso, nunca puede tomar el alor nulo# 5on este test la su!consulta %uede tener varias columnas, no importa 'a que el test se fija no en los alores deueltos sino en si ha' o no fila en la ta!la resultado de la su!consulta# 5uando se utili(a el test de e1istencia en la ma'or*a de los casos ha!r- que utili(ar una referencia e1terna# %i no se utili(a una referencia e1terna la su!consulta deuelta siempre ser- la misma para todas las filas de la consulta principal ' en este caso se seleccionan todas las filas de la consulta principal (si la su!consulta genera filas) o ninguna (si la su!consulta no deuele ninguna fila) La sinta1is es la siguiente, .ELECT numem%, nom"re, oficina 6R,0 em%leados B:ERE EAI.T. 7.ELECT F 6R,0 oficinas B:ERE region K GesteG +D em%leados.oficina K oficinas.oficina< $ste ejemplo o!tiene lo mismo que el ejemplo del test I+# <!sera que delante de EAI.T. no a ningn nom!re de columna# $n la su!consulta se pueden poner las columnas que queramos en la lista de seleccin (hemos utili(ado el ?)# Hemos a4adido una condicin adicional al B:ERE, la de la referencia e1terna para que la oficina que se compare sea la oficina del empleado# 6<9)# 5uando se tra!aja con ta!las mu' oluminosas el test EAI.T. suele dar mejor rendimiento que el test I+# Resumen del tema
0na su!consulta es una sentencia .ELECT que aparece en la lista de seleccin, o en las cl-usulas B:ERE o :QI+8 de otra sentencia .ELECT# La su!consulta se ejecuta por cada fila de la consulta principal# Dentro de una consulta se puede utili(ar una columna del origen de la consulta principal, una referencia e1terna# )unque se puedan anidar su!consultas no es aconsejado m-s de un niel de anidamiento# La su!consulta sufre una serie de restricciones segn el lugar donde se encuentre# Las condiciones asociadas a las su!consultas son las siguientes, el test de comparacin con su!consulta el test +1 el test LL el test I+ el test EAI.T. Tema S. ctualiIacin de datos (I)
Bsqueda Introduccin Hasta ahora hemos estudiado el cmo recuperar datos almacenados en las ta!las de nuestra !ase de datos# $n este tema amos a tratar el de la actualiIacin de esos datos, es decir insertar nuevas filas, "orrar filas o cam"iar el contenido de las filas de una ta"la. $stas operaciones modifican los datos almacenados en las ta"las %ero no su estructura, ni su definicin# $mpe(aremos por er cmo insertar nueas filas (con la sentencia I+.ERT I+T,), eremos una ariante (la sentencia .ELECT... I+T,), despu/s eremos cmo "orrar filas de una ta!la (con la sentencia DELETE) ' por ltimo cmo modificar el contenido de las filas de una ta!la (con la sentencia -/DTE)# %i tra!ajamos en un entorno multiusuario, todas estas operaciones se podr-n reali(ar siem%re &ue tengamos los %ermisos corres%ondientes# Insertar una fila I+.ERT I+T,...QL-E. La insercin de nueos datos en una ta!la se reali(a a*adiendo filas enteras a la ta"la, la sentencia %&L que lo permite es la orden I+.ERT I+T,# La insercin se puede reali(ar de una fila o de arias filas de golpe, eremos las dos opciones por separado ' empe(aremos por la insercin de una fila. La sinta1is es la siguiente, $sta sinta1is se utili(a para insertar una sola fila cu'os alores indicamos despu/s de la pala!ra reserada QL-E.# $n castellano la sentencia se leer*a, I+.ERT E+ destino...QL,RE. .... Los registros se agregan siempre al final de la ta"la# Destino es el nom!re de la ta"la donde vamos a insertar la fila tam!i/n se puede utili(ar un nom"re de consulta, consulta que tenga como origen de datos una 5nica ta"la# )l nom!re de la ta!la se le puede a4adir la cl-usula I+ si la ta!la se encuentra en otra !ase de datos (en una !ase de datos e1terna)# La pala!ra reserada QL-E. se puede sustituir por la pala!ra .ELECT ( en otros %&Ls se emplea nicamente QL-E.)# ) continuacin de la pala!ra QL-E., entre %ar)ntesis se escri"en los valores &ue &ueremos a*adir# $stos alores se tienen que escri!ir de acuerdo al ti%o de dato de la columna donde se an a insertar (encerrados entre comillas simples S S para alores de tipo te1to, entre Z Z para alores de fecha###) la asignacin de valores se realiIa %or %osicin, el primer alor lo asigna a la primera columna, el segundo alor a la segunda columna, as* sucesiamente### 5uando la ta!la tiene una columna de ti%o contador ()uto6um!er), lo normal es no asignar valor a esa columna para que el sistema le asigne el alor que le toque segn el contador, si por el contrario queremos que la columna tenga un alor concreto, lo indicamos en la lista de alores# 5uando no se indica ninguna lista de columnas despu/s del destino, se asume por defecto todas las columnas de la ta"la, en este caso, los alores se tienen que especificar en el mismo orden en que aparecen las columnas en la entana de dise*o de dic3a ta"la, ' se tiene que utili(ar el alor +-LL para rellenar las columnas de las cuales no tenemos alores# $jemplo, I+.ERT I+T, em%leados QL-E. 7(>>, GMuan L%eIG, =>, +-LL, Gre% ventasG, T>SJ(=J>'T, +-LL, =;>>>>, >< <!serar en el ejemplo que los alores de tipo te1to se encierran entre comillas simples S S (tam!i/n se pueden emplear las comillas do!les R R) ' que la fecha de contrato se encierra entre almohadillas Z Z con el formato mes:dia:a4o# 5omo no tenemos alor para los campos oficina ' director (a este nueo empleado toda*a no se le ha asignado director ni oficina) utili(amos la pala!ra reserada +-LL# Los alores num/ricos se escri!en tal cual, para separar la parte entera de la parte decimal ha' que utili(ar siempre el punto independientemente de la configuracin que tengamos# Cuando indicamos nom"res de columnas, estos corresponden a nom!res de columna de la ta"la, pero no tienen por qu/ estar en el orden en que aparecen en la entana dise4o de la ta!la, tam!i/n se %ueden omitir algunas columnas, la columnas que no se nom!ran tendr-n %or defecto el valor +-LL o el valor %redeterminado indicado en la entana de dise4o de ta!la# $l ejemplo anterior se podr*a escri!ir de la siguiente forma, I+.ERT I+T, em%leados 7numem%,oficina, nom"re, titulo,cuota, contrato, ventas< QL-E. 7(>>, =>, GMuan L%eIG, Gre% ventasG,=;>>>>, T>SJ(=J>'T,>< <!serar que ahora hemos ariado el orden de los alores ' los nom!res de columna no siguen el mismo orden que en la ta!la origen, no importa, lo importante es poner los alores en el mismo orden que las columnas que enunciamos# 5omo no enunciamos las columnas oficina ' director se rellenar-n con el alor nulo (porque es el alor que tienen esas columnas como alor predeterminado)# $l utili(ar la opcin de %oner una lista de columnas podr*a parecer peor 'a que se tiene que escri!ir m-s pero realmente tiene ventajas so!re todo cuando la sentencia la vamos a almacenar # reutiliIar, la sentencia queda ms fcil de inter%retar le'/ndola emos qu/ alor asignamos a qu/ columna, de paso nos aseguramos que el alor lo asignamos a la columna que queremos, si por lo que sea cam"ia el orden de las columnas en la ta"la en el dise4o, no pasar*a nada mientras que de la otra forma intentar*a asignar los alores a otra columna, esto producir*a errores de $tipo no corresponde$ ' lo que es peor podr*a asignar alores errneos sin que nos demos cuenta, otra entaja es que si se a*ade una nueva columna a la ta"la en el dise4o, la primera sentencia I6%$;9 dar*a error 'a que el nmero de alores no corresponde con el nmero de columnas de la ta!la, mientras que la segunda I+.ERT no dar*a error ' en la nuea columna se insertar*a el alor predeterminado#
Errores &ue se %ueden %roducir cuando se ejecuta la sentencia I+.ERT I+T,, .i la ta"la de destino tiene clave %rinci%al ' en ese campo intentamos no asignar alor, asignar el alor nulo o un alor que 'a e1iste en la ta!la, el motor de !ase de datos Microsoft +et no a4ade la fila ' da un mensaje de error de S infracciones de claveS# .i tenemos definido un ndice 5nico (sin duplicados) e intentamos asignar un alor que 'a e1iste en la ta!la tam!i/n deuele el mismo error# .i la ta"la est relacionada con otra, se seguir-n las reglas de integridad referencial Insertar varias filas I+.ERT I+T,....ELECT .odemos insertar en una ta"la varias filas con una sola sentencia .ELECT I+T, si los alores a insertar se pueden o!tener como resultado de una consulta, en este caso sustituimos la cl-usula QL-E. lista de valores por una sentencia .ELECT como las que hemos isto hasta ahora# Cada fila resultado de la .ELECT forma una lista de valores que son los que se insertan en una nuea fila de la ta!la destino# $s como si tuiesemos una I+.ERT...QL-E. por cada fila resultado de la sentencia .ELECT# La sinta1is es la siguiente, $l origen de la .ELECT puede ser el nom"re de una consulta guardada, un nom"re de ta"la o una com%osicin de varias ta"las ( mediante I++ER M,I+, LE6T M,I+, RI8:T M,I+ o producto cartesiano)# Cada fila devuelta por la .ELECT act5a como la lista de valores que imos con la I+.ERT...QL-E. por lo que tiene las mismas restricciones en cuanto a tipo de dato, etc# La asignacin de valores se realiIa %or %osicin por lo que la .ELECT de!e deoler el mismo n5mero de columnas que las de la ta!la destino ' en el mismo orden, o el mismo nmero de columnas que indicamos en la lista de columnas despu/s de destino# Las columnas de la .ELECT no tienen %or&ue llamarse igual &ue en la ta"la destino 'a que el sistema slo se fija en los alores deueltos por la .ELECT# .i no &ueremos asignar valores a todas las columnas entonces tenemos que indicar entre %ar)ntesis la lista de columnas a rellenar des%u)s del nom"re del destino. $l estndar +.IJI., especifica varias restricciones so"re la consulta que aparece dentro de la sentencia I+.ERT, la consulta no puede tener una cl-usula ,RDER !1, la ta!la destino de la sentencia I+.ERT no puede aparecer en la cl-usula 6R,0 de la consulta o de ninguna su!consulta que /sta tenga# $sto prohi!e insertar parte de una ta!la en s* misma, la consulta no puede ser la -+I,+ de arias sentencias .ELECT diferentes, el resultado de la consulta de!e contener el mismo nmero de columnas que las indicadas para insertar ' los tipos de datos de!en ser compati!les columna a columna# %in em!argo en .4L de 0icrosoft Met, se %uede incluir la clusula ,RDER !1 aun&ue no tiene muc3o sentido. se %uede %oner en la cl-usula 6R,0 de la consulta, la ta"la en la que amos a insertar, pero no podemos utili(ar una -+I,+#
$jemplo, %upongamos que tenemos una ta!la llamada repres con la misma estructura que la ta!la empleados, ' queremos insertar en esa ta!la los empleados que tengan como titulo rep ventas I+.ERT I+T, re%res .ELECT F 6R,0 em%leados B:ERE titulo K Gre% ventasG 5on la .ELECT o!tenemos las filas correspondientes a los empleados con t*tulo rep ventas,' las insertamos en la ta!la repres# 5omo las ta!las tienen la misma estructura no hace falta poner la lista de columnas ' podemos emplear ? en la lista de seleccin de la .ELECT# $jemplo, %upongamos ahora que la ta!la repres tuiese las siguientes columnas numemp, oficinarep, nombrerep# $n este caso no podr*amos utili(ar el asterisco, tendr*amos que poner, I+.ERT I+T, re%res .ELECT numem%, oficina, nom"re 6R,0 em%leados B:ERE titulo K Gre% ventasG < !ien, I+.ERT I+T, re%res 7numem%, oficinare%, nom"rere%< .ELECT numem%, oficina, nom"re 6R,0 em%leados B:ERE titulo K Gre% ventasG Insertar filas en una nueva ta"la .ELECT ... I+T, $sta sentencia inserta filas creando en ese momento la ta"la donde se insertan las filas# %e suele utili(ar %ara guardar en una ta"la el resultado de una .ELECT# La sinta$is es la siguiente, Las columnas de la nueva ta"la tendr-n el mismo ti%o # tama*o &ue las columnas origen, ' se llamarn con el nom"re de alias de la columna origen o en su defecto con el nom"re de la columna origen, pero no se transfiere ninguna otra %ro%iedad del campo o de la ta!la como %or ejem%lo las claves e ndices. La sentencia .ELECT puede ser cual&uier sentencia .ELECT sin ninguna restriccin, puede ser una consulta multita!la, una consulta de resumen, una -+I,+ ### $jemplo, .ELECT F I+T, t( 6R,0 t' $sta sentencia genera una nuea ta!la t3 con todas las filas de la ta!la t2# Las columnas se llamar-n igual que en t2 pero t3 no ser- una copia e1acta de t2 'a no tendr- clae principal ni relaciones con las otras ta!las, ni *ndices si los tuiese t2 etc### .i en la "ase de datos 3a# #a una ta"la del mismo nom"re, el sistema nos avisa ' nos pregunta si la queremos !orrar# %i le contestamos que no, la .ELECT no se ejecuta# /ara formar una sentencia .ELECT I+T, lo mejor es escri"ir la .ELECT que permite generar los datos que queremos guardar en la nuea ta!la, ' des%u)s a*adir delante de la cl-usula 6R,0 la cl-usulaI+T, nuevata"la# La sentencia .ELECT I+T, se suele utiliIar %ara crear ta"las de tra"ajo, o ta!las intermedias, las creamos para una determinada tarea ' cuando hemos terminado esa tarea las !orramos# 9am!i/n puede ser til %ara sacar datos en una ta"la %ara enviarlos a alguien# .or ejemplo, &ueremos eniarle a un representante una ta!la con todos los datos personales de sus clientes para que les pueda eniar cartas etc### .ELECT numclie . codigo, nom"re, direccion, telefono I+T, susclientes 6R,0 clientes B:ERE re%clie K G'>=G" Kamos a suponer que hemos a4adido a nuestra ta!la de clientes los campos direccion ' telefono# $n el ejemplo anterior la nuea ta!la tendr- cuatro columnas llamadas codi"o, nombre, direccion, telefono ' contendr- las filas correspondientes a los clientes del representante 28=# 0odificar el contenido de las filas 7 -/DTE < La sentencia -/DTE modifica los valores de una o ms columnas en las filas seleccionadas de una o varias ta"las# La sinta1is es la siguiente, ,rigen puede ser un nom"re de ta"la, un nom"re de consulta o una com%osicin de ta"las, tam!i/n puede incluir la cl-usula I+ si la ta!la a modificar se encuentra en una !ase de datos e1terna# La cl-usula .ET especifica &u) columnas van a modificarse ' &u) valores asignar a esas columnas# n"columna, es el nom"re de la columna a la cual &ueremos asignar un nuevo valor por lo tanto de!e ser una columna de la ta!la origen# $l %&L est-ndar e1ige nom!res sin cualificar pero algunas implementaciones (como por ejemplo el %&L de Microsoft +et que estamos estudiando) s* lo permiten# La e$%resin en cada asignacin de"e generar un valor del ti%o de dato a%ro%iado para la columna indicada# La e1presin de"e ser calcula"le a %artir de los valores de la fila &ue se est actualiIando# %presin no %uede ser una su"consulta# $jemplo, -/DTE oficinas I++ER M,I+ em%leados ,+ oficinas.oficina K em%leados.oficina .ET cuotaKo"jetivoF>.>'@ $n este ejemplo queremos actuali(ar las cuotas de nuestros empleados de tal forma que la cuota de un empleado sea el 2I del o!jetio de su oficina# La columna a actuali(ar es la cuota del empleado ' el alor a asignar es el 2I del o!jetio de la oficina del empleado, luego la cl-usula .ET ser- .ET cuota K o"jetivoF>.>' o .ET cuota K o"jetivoJ'>># $l origen de!e contener la cuota del empleado ' el o!jetio de su oficina, luego el origen ser- el I++ER M,I+ de empleados con oficinas# La cl-usula B:ERE indica &u) filas van a ser modificadas# .i se omite la cl-usula B:ERE se actualiIan todas las filas# $n la condicin del B:ERE se %uede incluir una su"consulta# $n %&L standard la ta!la que aparece en la 6R,0 de la su!consulta no puede ser la misma que la ta!la que aparece como origen, pero en el %&L de Microsoft +et s* se puede# $jemplo, &ueremos poner a cero las entas de los empleados de la oficina 23 -/DTE em%leados .ET ventas K > B:ERE oficina K '(@ $jemplo, &ueremos poner a cero el limite de credito de los clientes asignados a empleados de la oficina 23# -/DTE clientes .ET limitecredito K > B:ERE re%clie I+ 7.ELECT numem% 6R,0 em%leados B:ERE oficina K '(<@ %i para el c-lculo de epresion se utili(a una columna que tam!i/n se modifica, el alor que se utili(a es el antes de la modificacin, lo mismo para la condicin de !squeda# 5uando se ejecuta una sentencia -/DTE %rimero se genera el origen # se seleccionan las filas segn la cl-usula B:ERE# ) continuacin se coge una fila de la seleccin # se le a%lica la clusula .ET,se actualiIan todas las columnas incluidas en la cl-usula .ET a la veI por lo que los nom!res de columna pueden especificarse en cualquier orden# Despu/s se coge la siguiente fila de la seleccin ' se le aplica del mismo modo la cl-usula .ET, as* sucesiamente con todas las filas de la seleccin# $jemplo, -/DTE oficinas .ET ventasK>, o"jetivoKventas@ < !ien, -/DTE oficinas .ET o"jetivoKventas, ventasK>@ Los dos ejemplos anteriores son equialentes 'a que el alor de ventas que se asigna a ob&etivo es el alor antes de la actuali(acin, se deja como ob&etivo las entas que ha tenido la oficina hasta el momento ' se pone a cero la columna ventas# .i actualiIamos una columna definida como clave fornea, esta columna se podr- actuali(ar o no siguiendo las reglas de integridad referencial# $l alor que se le asigna de!e e1istir en la ta!la de referencia# .i actualiIamos una columna definida como columna %rinci%al de una relacin entre dos ta"las, esta columna se podr- actuali(ar o no siguiendo las reglas de integridad referencial !orrar filas 7DELETE< La sentencia DELETE elimina filas de una ta"la# La sinta1is es la siguiente, ,rigen es el nom!re de la ta"la de donde vamos a "orrar, podemos indicar un nom!re de ta!la, incluir la cl-usula I+ si la ta!la se encuentra en una !ase de datos e1terna, tam!i/n podemos escri!ir una composicin de ta!las# La opcin ta"la.F se utili(a cuando el origen est "asado en varias ta"las, ' sire para indicar en &u) ta"la vamos a "orrar# La opcin F es opcional ' es la que se asume %or defecto ' se puede poner unicamente cuando el origen es una sola ta"la# La cl-usula B:ERE sire para especificar &u) filas &ueremos "orrar# %e eliminaran de la ta!la todas las filas que cumplan la condicin# %i no se indica la clusula B:ERE, se "orran T,D. las filas de la ta!la# En la condicin de "5s&ueda de la sentencia DELETE, se %uede utiliIar una su"consulta# $n %&L standard la ta!la que aparece en la 6R,0 de la su!consulta no puede ser la misma que la ta!la que aparece en la 6R,0 de la DELETE pero en el %&L de Microsoft +et s* se puede hacer# 0na e( !orrados, los registros no se %ueden recu%erar# .i la ta"la donde "orramos est relacionada con otras ta"las se podr-n !orrar o no los registros siguiendo las reglas de integridad referencial definidas en las relaciones# )qu* puedes repasar las reglas de integridad referencial# $jemplo, DELETE F 6R,0 %edidos B:ERE clie I+ 7.ELECT numclie 6R,0 clientes B:ERE nom"re K GMulian L%eIG<@ < !ien, DELETE %edidos.F 6R,0 %edidos I++ER M,I+ clientes ,+ %edidos.clie K clientes.numclie B:ERE nom"re K GMulian L%eIG@ Las dos sentencias !orran los pedidos del cliente 'ulian (pe)# $n la segunda estamos o!ligados a poner pedidos#? porque el origen est- !asado en arias ta!las# DELETE F 6R,0 %edidos@ o DELETE 6R,0 %edidos@ Borra todas las filas de pedidos#
Resumen del tema %i queremos a*adir en una ta!la una fila con valores conocidos utili(amos la sentencia I+.ERT I+T, ta"la QL-E. 7lista de valores<# .i los valores a insertar se encuentran en una o arias ta"las utili(amos I+.ERT I+T, ta"la .ELECT ... .ara crear una nueva ta"la con el resultado de una consulta con la sentencia .ELECT...I+T, ta"la 6R,0... .ara cam"iar los datos contenidos en una ta"la, tenemos que actuali(ar las filas de dicha ta!la con la sentencia -/DTE ta"la .ET asignacin de nuevos valores# .ara eliminar filas de una ta"la se utili(a la sentencia DELETE 6R,0 ta"la# 5on la cl-usula B:ERE podemos indicar a &u) filas afecta la actualiIacin o el "orrado# Tema U. Ta"las de referencias cruIadas (I)
Bsqueda Introduccin 5uando queremos representar una consulta sumaria con dos columnas de agru%acin como una ta"la de do"le entrada en la &ue cada una de las columnas de agru%acin es una entrada de la ta"la utiliIaremos una consulta de ta!la de referencias cru(adas# .or ejemplo queremos o!tener las entas mensuales de nuestros empleados# 9enemos que dise4ar una consulta sumaria calculando la suma de los importes de los pedidos agrupando por empleado ' mes de la enta# La consulta ser*a, .ELECT re% as em%leado, mont37fec3a%edido< as mes, sum7im%orte< as vendido 6R,0 %edidos 8R,-/ !1 re%, mont37fec3a%edido< $l resultado ser*a la ta!la que aparece a la derecha,
La consulta quedar*a mucho m-s elegante ' clara presentando los datos en un formato m-s compacto como el siguiente, .ues este ltimo resultado se o!tiene mediante una consulta de referencias cru(adas# <!serar que una de las columnas de agrupacin (rep) sigue definiendo las filas que aparecen (ha' una fila por cada empleado), mientras que la otra columna de agrupacin (mes) ahora sire para definir las otras columnas, cada alor de mes define una columna en el resultado, ' la celda en la interseccin de un alor de rep ' un alor de mes es la columna resumen, la que contiene la funcin de columna (la suma de importe)# Las consultas de referencias cru(adas se pueden crear utili(ando el asistente, es mucho m-s cmodo pero es til sa!er cmo hacerlo directamente en %&L por si queremos ariar algn dato una e( reali(ada la consulta con el asistente o si queremos definir una consulta de referencias cru(adas que no se puede definir con el asistente#
La sentencia TR+.6,R0 La sentencia TR+.6,R0 es la que se utili(a %ara definir una consulta de referencias cruIadas# La sinta1is es la siguiente, Resultado es la funcin de columna que permite o!tener el resultado de las celdas# $n la .ELECT la columna fija es la columna que define el enca"eIado de filas, el origen que indicamos en la cl-usula Q;<M es la ta!la (o ta!las) de donde sacamos la informacin, ' en la cl-usula 8R,-/ !1ponemos la columna &ue va a definir las filas del resultado# La .ELECT puede contener una cl-usula B:ERE para seleccionar la filas que se utili(an para calcular el resultado, puede contener su!consultas pero no la cl-usula :QI+8# $n la cl-usula /IQ,T indicamos la columna cu'os alores an a definir columnas dinmicas del resultado a esta columna la llamaremos %ivote# La cl-usula I+ permite definir el conjunto de valores &ue &ueremos &ue a%areIcan como columnas dinmicas# $s coneniente que la columna piote que sire de enca"eIado de columna tenga un n5mero limitado de %osi"les valores para que no se generen demasiadas columnas# $n nuestro ejemplo es mejor utili(ar el mes como enca!e(ado de columna ' no de fila 'a que posi!les empleados ha' muchos m-s ' adem-s el mes toma alores que conocemos ' podemos utili(ar por lo tanto la cl-usula I+ para que apare(can todos los meses del a4o#
$n nuestro ejemplo resultado ser*a .-07im%orte<, la columna fija es rep con un alias para que salga la pala!ra empleado en el enca!e(ado, el origen de datos es la ta!la pedidos (porque el resultado.-07im%orte< se o!tiene de pedidos), la columna del 8R,-/ !1 es rep 'a que queremos una fila por cada representante, la columna din-mica, la que ponemos en la cl-usula /IQ,T ser*a 0,+T:7fec3a%edido<# La sentencia quedar*a de la siguiente forma, TR+.6,R0 .um7im%orte< .ELECT re% as em%leado 6R,0 %edidos 8R,-/ !1 re% /IQ,T mont37fec3a%edido< Lo mejor para montar una consulta de referencias cru(adas en %&L es pensar la sumaria normal ' luego distri!uir los t/rminos segn corresponda# Las columnas dinmicas 5omo hemos dicho las columnas din-micas son las que se generan segn los alores almacenados en la columna piote (la que aparece en la cl-usula /IQ,T), normalmente se genera una columna din-mica por cada alor que se encuentre en la columna piote del origen de datos# 5uando los posi!les alores que puede tomar la columna piote son conocidos ' queremos definir cuales queremos que apare(can, slo unos cuantos porque no nos interesan algunos o todos incluso si no generan resultado, en este caso usaremos la cl-usula I+, en la cl-usula I+ se ponen entre par/ntesis todos los posi!les alores, o por lo menos los que queremos que apare(can en el resultado# .or ejemplo slo nos interesan los meses de fe!rero, ma'o ' diciem!re,
TR+.6,R0 .um7im%orte< .ELECT re% as em%leado 6R,0 %edidos 8R,-/ !1 re% /IQ,T mont37fec3a%edido< I+ 7(,;,'(<@ %i no utili(amos la cl-usula I+, los meses de ma'o ' septiem!re no aparecen 'a que no ha' pedidos reali(ados durante estos meses, si utili(amos la cl-usula I+ ' definimos los doces alores posi!les, s* aparecen las columnas correspondientes a estos meses ' o!seramos que ningn empleado tiene entas en esos mes# TR+.6,R0 .um7im%orte< .ELECT re% as em%leado 6R,0 %edidos 8R,-/ !1 re% /IQ,T mont37fec3a%edido < I+ 7',(,=,?,;,S,U,8,N,'>, '','(<@ La cl-usula I+ tam!i/n sire para cam!iar el orden de aparicin de las columnas din-micas, las columnas aparecen en el mismo orden en que aparecen en la cl-usula I+. TR+.6,R0 .um7im%orte< .ELECT re% as em%leado 6R,0 %edidos 8R,-/ !1 re% /IQ,T mont37fec3a%edido < I+ 7'>,'','(,',(,=,?,;,S, U,8,N<@ Las columnas fijas Las columnas fijas son las que aparecen delante de las columnas din-micas ' son fijas porque se genera una sola columna en el resultado por cada columna ha'amos indicado en la lista de columnas fijas# Las columnas fijas se indican en la lista de seleccin de la sentencia %$L$59, una columna fija que siempre de!emos incluir es la que sire de enca!e(ado de fila para que podamos sa!er cada fila a qu/ alor de enca!e(ado de fila corresponde# .ero adem-s podemos incluir otras columnas por ejemplo columnas de resumen de cada fila, sin que se tenga en cuenta la agrupacin por la columna piote# .or ejemplo queremos sa!er para cada empleado cu-nto ha endido en total ' cu-l ha sido el importe ma'or endido en un pedido# TR+.6,R0 .um7im%orte< . .uma .ELECT re% . em%leado, .-07im%orte< . OTotal vendidoP,0A7im %orte< . ma#or 6R,0 %edidos 8R,-/ !1 re% /IQ,T mont37fec3a%edi do< @ Resumen del tema La instruccin TR+.6,R0 se utili(a %ara definir una consulta de referencias cruIadas# .ermite presentar los resultados de una sumaria en una ta!la de do!le entrada como la que se presenta a continuacin,
De Qué Manera Los Elementos Estéticos Que Introdujo Oscar Niemeyer en Brasilia, Son Aplicables en La Arquitectrua de Las Estructruras Gubernamentales de Bogotá 1