SQL es el lenguaje de consulta universal para bases de datos.
Desde esta opcin vamos a tratar los temas relacionados con SQL ANSI 92, que es el standar SQL , ya que luego extinten variantes como T-SQL (TransactSQL! y PL/SQL ("rocedure Language # SQL! que ser$n tratados en sus propias opciones. SQL propociona m%todos para de&inir la base datos, para manipular la in&ormacin y para gestionar los permisos de acceso a dic'a in&ormacin. "ara que un gestor de bases de datos sea consisderado como relacional, debe soportar SQL, independientemente de las caracteristicas particulares que dic'o gestor pueda aportar. (onocer SQL es conocer las bases de datos, y todo su potencial. ) 2. Intr!ucci"n a SQL. SQL es el lenguaje de consulta universal para bases de datos. Los mandatos de SQL se dividen en tres grandes grupos di&erenciados, los cuales ser$n tratados por separado y que unicamente se presentan aqui a modo introductorio. ##L(Data De&inition Language!, es el encargado de la de&inicin de *ases de Datos, tablas, vistas e +ndices entre otros. Son comandos propios de este lenguaje, CREATE TABLE CREATE INDEX CREATE VIEW CREATE SYNONYM #$L(Data -anipulation Language!, cuya misin es la manipulacin de datos. . trav%s de %l podemos seleccionar, insertar, eliminar y actuali/ar datos. 0s la parte que m$s &recuentemente utili/aremos, y que con ella se construyen las consultas. Son comandos propios de este lenguaje, SELECT UPDATE INSERT INSERT INTO DELETE FROM #%L (Data (ontrol Laguage!, encargado de la seguridad de la base de datos, en todo lo re&erente al control de accesos y privilegios entre los usuarios. Son comandos propios de este lenguaje, GRANT REVOKE 1 &. %'(nentes !el lengua)e SQL. &.1. Ti(s !e !ats. SQL admite una variada gama de tipos de datos para el tratamiento de la in&ormacin contenida en las tablas, los tipos de datos pueden ser num%ricos (con o sin decimales!, al&anum%ricos, de &ec'a o booleanos(si o no!. Seg2n el gestor de base de datos que estemos utili/ando los tipos de datos var+an, pero se reducen b$sicamente a los expuestos anteriormente, aunque en la actualidad casi todos los gestores de bases de datos soportan un nuevo tipo, el *L3* (*inary Large 3bject!, que es un tipo de datos especial destinado a almacenar arc'ivos, im$genes entre otros. Dependiendo de cada gestor de bases de datos el nombre que se da a cada uno de estos tipos puede variar. *$sicamente tenemos los siguientes tipos de datos. N*'erics Al+an*'erics ,ec-a L"gic .L/. 4nteger c'ar(n! Date *it 4mage 5umeric(n.m! varc'ar(n,m! DateTime Text Decimal(n,m! 6loat -as detalladamente tenemos, Ti(s !e !ats nu'0rics Ti( #e+inci"n .ytes 4nteger 7alores enteros con signo. 8 5umeric(n,m! 52meros reales de 'asta )9 digitos (con decimales!, donde n representa el total de d+gitos admitidos (normalmente denominado precisin! y m el n2mero de posiciones decimales (escala!. :); Decimal(n,m! 4gual que el tipo numeric. :); 6loat 52mero de coma &lotante, este tipo de datos se suele utili/ar para los valores en notacin cienti&ica. 89 < Ti(s !e !ats al+anu'0rics Ti( #e+inci"n .ytes c'ar(n! .lmacena de ) a 1:: caracteres al&anum%ricos. 0ste valor viene dado por n, y es el tama=o utili/ado en disco para almacenar dato. 0s decir si de&ino un campo como c'ar(1::!, el tama=o real del campo ser$ de 1::, aunque el valor solo contenga )>>. >1:: varc'ar(n! 4gual que el tipo c'ar, con la salvedad que varc'ar almacena 2nicamente los bytes que contenga el valor del campo. >1:: 5ota,0l tama=o del campo var+a en &uncin de cada base de datos, siendo 1:: el valor standart. 0n realidad el tama=o viene delimitado por el tama=o de las p$ginas de datos, 1?, 8?, 9?. Ti(s !e !ats +ec-a Ti( #e+inici"n .ytes Date .lmacena &ec'as, con d+a, mes y a=o. 9 Datetime .lmacena &ec'as con &ec'a y 'ora 8 5ota,La aparicin de los tipos de datos de &ec'a supuso una aut%ntica revolucin en el mundo de la bases de datos, en realidad, la base de datos almacena internamente n2meros enteros, de a'+ que el tama=o sea de 8 y 9 bytes (1 enteros!, pero aporta la validacin del dato introducido. 8 Ti(s !e !ats l"gics Tipo De&inicin *ytes *it Tipo bit. .lmacena un > no cero, seg2n las bases de datos ser$ ) ). Se aplica la lgica booleana, > es &also y no cero verdadero. 5o soportado para oracle. ) bit Ti(s !e !ats .L/. Tipo De&inicin *ytes 4mage .lmacena im$genes en &ormato binario, 'asta un m$ximo de 1 @b de tama=o. >1@b Text .lmacena texto en &ormato binario, 'asta un m$ximo de 1 @b de tama=o. >1@b : &.2. /(era!res. Los operadores se pueden de&inir como combinaciones de caracteres que se utili/an tanto para reali/ar asignaciones como comparaciones entre datos. Los operadores se dividen en aritm%ticos, relacionales, lgicos, y concatenacin . /(era!res SQL Arit'0tics 1 Suma - Aesta 2 "roducto / Divisin 22 3 0xponenciacin 4elacinales 5 -enor que 56 -enor o igual que 7 -ayor que 76 -ayor o igual que 57 86 Distinto 85 5o menor que 87 5o mayor que L"gics AN# Los operadores lgicos permiten comparar expresiones lgicas devolviendo siempre un valor verdadero o &also.Los operadores lgicos se evaluan de i/quierda a derec'a. /4 N/T %ncatenaci"n 1 Se emplea para unir datos de tipo al&anum%rico. B &.&. Pala9ras %lave. Las palabras clave son identi&icadores con un signi&icado especial para SQL, por lo que no pueden ser utili/adas para otro propsito distinto al que 'an sido pensadas. SQL dispone de muy pocas rdenes, pero de multiples p$labras clave, lo que le convierten en un lenguaje sencillo pero tremendamente potente para llevar a cabo su &uncin. Pala9ras %lave .LL .5D .5C .S( .7@ *0@45 *C (D.A (D0(? (L3S0 (3E5T (3--4T (A0.T0 (EAS3A D0(4-.L D0(L.A0 D0L0T0 D0S( D4ST45(T D06.ELT 0F4STS 60T(D 6L3.T 63A 6A3- @A.5T @A3E" D.745@ 45 45D0F 45S0AT 45T0@0A 45T3 L4?0 -.F -45 53T 5E-0A4( 35 3"05 3A 3AD0A A073?0 A3LL*.(? S0L0(T S0T SE- T.*L0 E5435 E54QE0 E"D.T0 ES0A 7.LE0S 740G GD0A0 G4TD ; &.:. ,uncines Agrega!as. Las &unciones agregadas proporcionan a SQL utilidades de c$lculo sobre los datos de las tablas. 0stas &unciones se incorporan en las consultas S;L;%T y retornan un *nic valr al operar sobre un grupo de registros. Las &unciones agregadas son. 6unciones .gregadas $A<() Devuelve el valor m$ximo. $IN() Devuelve el valor m+nimo. S=$() Devuelve el valor de la suma de los valores del campo. %/=NT() Devuelve el n2mero de &ilas que cumplen la condicin A>?() Devuelve el promedia de los valores del campo 9 &.@. Pre!ica!s. Los predicados son condiciones que se indican en cl$usula AB;4; de una consulta SQL. La siguiente tabla ilustra los predicados de SQL. "redicados SQL .;TA;;N...AN# (omprueba que al valor esta dentro de un intervalo LIC; (ompara un campo con una cadena al&anum%rica. L4?0 admite el uso de caracteres comodines ALL Se=ala a todos los elementos de la seleccin de la consulta AND 4ndica que la condicin se cumplir$ si la comparacin es cierta para al menos un elemento del conjunto. ;<ISTS Devuelve un valor verdadero si el resultado de una subconsulta devuelve resultados. IN (omprueba si un campo se encuentra dentro de un determinado rango. 0l rango puede ser una sentencia S0L0(T. H :.##L.
:.1. Lengua)e !e #e+inici"n !e !ats (I). :.1.1. Ta9las. 0l lenguaje de de&inicin de datos (DDL, Data De&inition Language! es el encargado de permitir la descripcin de los objetos que &orman una base de datos. 0l lenguaje de de&inicin de datos le va a permitir llevar a cabo las siguientes acciones, (reacin de tablas, +ndices y vistas. -odi&icacin de las estructura de tablas, +ndices y vistas. Supresin de tablas, +ndices y vistas. "ero antes de continuar vamos a comentar la nomenclatura que emplearemos, si tiene alg2n conocimiento de programacin le resultar$ &amiliar. :.1.2. N'enclatura. La sintaxis empleada para la sentencias en las di&erentes p$ginas esta basada en la notacin 0*56 (II!. 7amos a ver el signi&icado de algunos s+mbolos. SE'9l Signi+ica! J K 0ncierran par$metros de una orden que el usuario debe sustituir al escribir dic'a orden por los valores que queramos dar a los par$metros. L M 4ndica que su contenido es opcional. N O 4ndica que su contenido puede repetirse una o mas veces. P Separa expresiones. 4ndica que pueden emplearse una u otra expresin pero no m$s de una a la ve/. )> .dem$s las palabras clave aparecen en may2scula negrita y los argumentos en min2scula cursiva. La sintaxis de una sentencia tendr$ un aspecto como este, CREATE TABLE <nombre_tabla> ( <nombre_campo> <tipo_datos(tamao)>, { <nombre_campo> <tipo_datos(tamao)>} ) ; :.1.&. %reaci"n !e ta9las. 0n el modelo relacional la in&ormacin de una base de datos se almacena en tablas. La creacin de la base de datos debe comen/ar por con la creacin de una o m$s tablas. "ara ello utili/aremos la sentencia %4;AT; TA.L;. La sintaxis de la sentencia es la siguiente, %4;AT; TA.L; Jnombre_tb!K ( Jnombre_"m#oK Jt$#o_%to&'tm(o)K Lnull P nt nullM Lde&ault J*!or_#or_%e+e"toKM N ,Jnombre_"m#oK Jt$#o_%to&'tm(o)K Lnull P nt nullM Lde&ault J*!or_#or_%e+e"toKMO L , cnstraint JnombreK (ri'ary Fey (Jnombre_"m#oKL ,...n M!M L , cnstraint JnombreK +reign Fey (Jnombre_"m#oKL ,...n M! re+erences JtablaQre&erenciadaK ( Jnombre_"m#oK L ,...n M ! M ! R )) 0jemplo, 7amos a simular una base de datos para un negocio de alquiler de coc'es (renta de autos!, por lo que vamos a empe/ar creando una tabla para almacenar los coc'es que tenemos. %4;AT; TA.L; t(oc'es ( matricula c'ar(9! nt null, marca varc'ar(1::! null, modelo varc'ar(1::! null, color varc'ar(1::! null, numeroQSilometros numeric()8,1! null !e+ault >, cnstraint "?Q(oc'es (ri'ary Fey (matricula! ! R 0n este ejemplo creamos una tabla llamada t(oc'es con cinco campos (matricula, marca, modelo, color, numeroQSilometros!. 5tese que se 'an omitido las tildes y los espacios a propsito. 5unca cree campos que contengan caracteres espec+&icos de un idioma (tildes, e=es, ...! ni espacios. Las claves primarias y externas (o &or$neas! se pueden implementar directamente a trav%s de la instruccin %4;AT; TA.L;, o bien se pueden agregar a trav%s de sentencias ALT;4 TA.L;. (ada gestor de bases de datos implementa distintas opciones para la instruccin %4;AT; TA.L;, pudiendo especi&icarse gran cantidad de par$metros y pudiendo variar el nombre que damos a los tipos de datos, pero la sintaxis standart es la que 'emos mostrado aqu+. Si queremos conocer m$s acerca de las opciones de %4;AT; TA.L; lo mejor es recurrir a la documentacin del Sistema -anejador de *ase de Datos (S-*D! que se est% utili/ando. )1 :.1.:. $!i+icaci"n !e ta9las. 0n ocasiones puede ser necesario modi&icar la estructura de una tabla, com2nmente para a=adir un campo o reestriccin. "ara ello disponemos de la instrucccin ALT;4 TA.L;. ALT;4 TA.L; nos va a permitir, .=adir campos a la estructura incial de una tabla. .=adir reestriciones y re&erencias. "ara a=adir un campo a una tabla existente, ALT;4 TA.L; Jnombre_tb!K A## JnombreQcampoK Jt$#o_%to&'tm(o)K Lnull Pnt nullM L!e+ault JvalorQporQde&ectoKM N , Jnombre_"m#oK Jt$#o_%to&'tm(o)K Lnull Pnt nullM L!e+ault JvalorQporQde&ectoKMO R 0jemplo, ALT;4 TA.L; t(oc'es A## numQpla/as integer null !e+ault :R 0n este ejemplo a=adimos el campo numQpla/as a la tabla t(oc'es que 'ab+amos creado en el apartado anterior. "ara a=adir una clave primaria vamos a crear una tabla de cliente y le a=adiremos la clave primaria ejecutando una sentencia alter table, )< CREATE TABLE tClientes ( codigo integer not null, nombre varchar(255) not null, apellidos varchar(255) null, nif varchar(!) null, telefono varchar(") null, movil varchar(") null ); ALTER TABLE tClientes ADD CONSTRAINT #$%tClientes primary key (codigo); (reamos la tabla clientes y le a=adimos una reestriccin primary Sey a la que damos el nombre "?Qt(lientes en el campo codigo. Solo podemos modi&icar una 2nica tabla a la ve/ con .LT0A T.*L0, para modi&icar m$s de una tabla debemos ejecutar una sentencia .LT0A T.*L0 por tabla. "ara a=adir una clave externa (o &oranea! necesitamos una tercera tabla en nuestra estructura. "or un lado tenemos la tabla t(oc'es y la tabla t(lientes, a'ora vamos a crear la tabla t.lquileres que ser$ la encargada de TdecirnosT que clientes 'an alquilado un coc'e. CREATE TABLE t&l'uileres ( codigo integer not null, codigo%cliente integer not null, matricula char(() not null, f)%al'uiler datetime not null, f)%devolucion datetime null );
ALTER TABLE t&l'uileres ADD CONSTRAINT #$%t&l'uileres primary key (codigo), CONSTRAINT *$%Clientes foreign key (codigo%cliente) references tClientes (Codigo), CONSTRAINT *$%Coches foreign key (matricula) references tCoches (matricula); *ien, en este cdigo creamos la tabla t.lquileres, y luego mediante una sentencia .LT0A T.*L0 a=adimos una clave primaria llamada "?Qt.lquileres en el campo codigo, una clave externa llamada 6?Q(lientes re&erenciada al codigo )8 de la tabla t(lientes, y por 2ltimo otra clave externa llamada 6?Q(oc'es re&erenciada al campo matricula de la tabla t(oc'es. 5ota, (uando creamos una clave externa el campo re&erenciado y el que sirve de re&erencia deben ser del mismo tipo de datos. Si somos observadores nos daremos cuenta que los campos que sirven de re&erencia a las claves &or$neas son las claves primarias de sus tablas. Slo podemos crear claves externas que re&erencien claves primarias. .l igual que ocurr+a con la sentencia %4;AT; TA.L; cada manejador de bases de datos implementa sus mejoras, siendo la mejor &orma de conocerlas recurrir a la documentacin del gestor de bases de datos. 0n principio, para borrar columnas de una tabla debemos, ). (rear una tabla con la nueva estructura. 1. Trans&erir los datos <. *orrar la tabla original. y digo en principio, porque como ya 'emos comentado seg2n el manejador de bases de datos con el que trabajemos podremos reali/ar esta tarea a trav%s de una sentencia ALT;4 TA.L;. :.1.@. ;li'inaci"n !e ta9las. "odemos eliminar una tabla de una base de datos mediante la instruccion #4/P TA.L;. #4/P TA.L; Jnombre_tb!KR La instruccin #4/P TA.L; elimina de &orma permanente la tabla y los datos en ella contenida. Si intenta eliminar una tabla que tenga registros relacionados a trav%s de una clave externa la instruccin #4/P TA.L; &allar$ por integridad re&erencial. (uando se elimina una tabla eliminamos tambi%n sus +ndices. ): :.2. Lengua)e !e !e+inici"n !e !ats (II). :.2.1. #e+inici"n !e Gn!ices. En +ndice es una estructura de datos que permite acceder a di&erentes &ilas de una misma tabla a trav%s de un campo (o campos clave!. En +ndice permite un acceso muc'o m$s r$pido a los datos. :.2.2.Intr!ucci"n a ls En!ices. "ara entender lo que es un +ndice se debe saber primero como se almacena la in&ormacin internamente en las tablas de una base de datos. (ada tabla se divide en p$ginas de datos, imaginemos un libro, podriamos escribirlo en Tuna sola 'oja enormeT al estilo pergamino egipcio, o bien en p$ginas a las que podemos acceder r$pidamente a traves de un +ndice. 0st$ idea es la que se aplica en el mundo de las bases de datos, la in&ormacin est$ guardada en una tabla (el libro! que tiene muc'as 'ojas de datos (las p$ginas del libro!, con un +ndice en el que podemos buscar la in&ormacin que interesa. Si queremos buscar la palabra /apato en un diccionario , Uqu% 'acemosI Leemos todo el diccionario 'asta encontrar la palabra, con lo que nos 'abremos leido el diccionario enterito. *uscamos en el +ndice en que p$gina est$ la letra /, y es en esa p$gina donde buscamos. La opcin dos es la correcta, y es de este modo como se utili/a un +ndice en las bases de datos, se de&ine el +nidice a trav%s de un campo (o campos! y es a partir de este punto desde donde de busca. )B Los +ndices se actuali/an autom$ticamente cuando se reali/an operaciones de escritura en la base de datos. 0ste es un aspecto muy importante de cara al rendimiento de las operaciones de escritura, ya que adem$s de escribir los datos en la tabla se escribir$n tambi%n en el +ndice. En n2mero elevado de +ndices 'ar$ m$s lentas %stas operaciones. Sin embargo, salvo casos excepcionales, el bene&icio que aportan los +ndices compensa (de largo! %sta penali/acin. :.2.&. %reaci"n !e En!ices. La creacin de +ndices, como ya 'emos visto, permite acelerar las consultas que se reali/an en la base de datos. Las sentencias de SQL para manipular +ndices son, CREATE INDEX; DROP INDEX; La sintaxis para la creacin de indices es la siguiente, CREATE +UNIQUE, INDEX <nombre%indice> ON <nombre%tabla>( <nombre%campo> +ASC - DESC, {,<nombre%campo> +ASC - DESC,}) ); ); La p$labra clave =NIQ=; especi&ica que no pueden existir claves duplicadas en el +ndice. AS% P #;S% especi&ican el criterio de ordenacin elegido, ascendente o descendente, por de&ecto es ascendente. 0jemplo, 0n el apartado dedicado a la de&inicin de tablas creamos la tabla t(lientes, este ejemplo crea un +ndice 2nico en el campo 546. 0sto nos permitir$ buscar muc'o mas r$pido por el campo 546 y nos asegurar$ que no tengamos dos 546 iguales. CREATE UNIQUE INDEX ./0%C1/23425%3/* ON tC1/23425 (3/*); Las claves primarias son +ndices. :.2.:. ;li'inaci"n !e En!ices. Los nombres de los +ndices deben ser 2nicos. "ara eliminar un +ndice debemos emplear la sentencia #4/P IN#;<. DROP INDEX <nombre%tabla>6<nombre%indice>; 0jemplo,"ara eliminar el +ndice creado anteriormente. DROP INDEX tC1/234256./0%C1/23425%3/*; )9 :.&. Lengua)e !e !e+inici"n !e !ats (III). :.&.1. >istas. 0n el modelo de datos relacional la &orma de guardar la in&ormacin no es la mejor para ver los datos Ena vista es una consulta, que re&leja el contenido de una o m$s tablas, desde la que se puede acceder a los datos como si &uera una tabla. Dos son las principales ra/ones por las que podemos crear vistas. Seguridad, nos pueden interesar que los usuarios tengan acceso a una parte de la in&ormacin que 'ay en una tabla, pero no a toda la tabla. (omodidad, como 'emos dic'o el modelo relacional no es el m$s cmodo para visuali/ar los datos, lo que nos puede llevar a tener que escribir complejas sentencias SQL, tener una vista nos simpli&ica esta tarea. Las vistas no tienen una copia &+sica de los datos, son consultas a los datos que 'ay en las tablas, por lo que si actuali/amos los datos de una vista, estamos actuali/ando realmente la tabla, y si actuali/amos la tabla estos cambios ser$n visibles desde la vista. 5ota, 5o siempre podremos actuali/ar los datos de una vista, depender$ de la complejidad de la misma (depender$ de si el cojunto de resultados tiene acceso a la clave principal de la tabla o no!, y del gestor de base de datos. 5o todos los gestores de bases de datos permiten actuali/ar vistas, 3A.(L0, por ejemplo, no lo permite, mientrar que SQL Server si. ("robar esta anotacin!. )H :.&.2. %reaci"n !e vistas. "ara crear una vista debemos utili/ar la sentencia %4;AT; >I;A, debiendo proporcionar un nombre a la vista y una sentencia SQL S;L;%T v$lida. CREATE IE! <nombre%vista> AS (<sentencia%select>); 0jemplo, (rear una vista sobre nuestra tabla alquileres, en la que se nos muestre el nombre y apellidos del cliente en lugar de su cdigo. CREATE IE! "A#$%i#eres AS ( SELECT nombre, apellidos, matricula &RO' t&l'uileres, tClientes !(ERE ( t&l'uileres6codigo%cliente 7 tClientes6codigo ) ) Si queremos, modi&icar la de&inicin de nuestra vista podemos utili/ar la sentencia ALT;4 >I;A, de &orma muy parecida a como lo 'aciamos con las tablas. 0n este caso queremos a=adir los campos &xQalquiler y &xQdevolucion a la vista. ALTER IE! v&l'uileres AS ( SELECT nombre, apellidos, matricula, f)%al'uiler, f)%devolucion &RO' t&l'uileres, tClientes !(ERE ( t&l'uileres6codigo%cliente 7 tClientes6codigo ) ) 1> "or 2ltimo podemos eliminar la vista a trav%s de la sentencia #4/P >I;A. "ara eliminar la vista que 'emos creado anteriormente se uitli/ar+a, DROP IE! v&l'uileres; Ena vista se consulta como si &uese una tabla. :.&.&. Sin"ni's. En sinnimo es un nombre alternativo que identi&ica un tabla en la base de datos. (on un sinnimo se pretende normalmente simplicar el nombre original de la tabla, aunque tambien se suelen utili/ar para evitar tener que escribir el nombre del propietario de la tabla. N t!as las 9ases !e !ats s(rtan ls sin"ni's. "ara crear un sinnimo 'ay uque utili/ar la sentencia %4;AT; SDN/ND$ especi&icando el nombre que deseamos utili/ar como sinnimo y la tabla para la que estamos creando el sinnimo. CREATE S)NON)' <nombre%sinonimo> &OR <nombre%tabla>; 0jemplo, 0l siguente ejemplo crea el sinnimo (oc'es para la tabla t(oc'es. CREATE S)NON)' Coches &OR tCoches; "ara eliminar el sinnimo creado debemos emplear la sentencia #4/P SDN/ND$. DROP S)NON)' Coches; 1) @. #$L @.1. Lengua)e !e 'ani(ulaci"n !e !ats (I) @.1.1. %nsulta !e !ats. 0l proceso m$s importate que podemos llevar a cabo en una base de datos es la consulta de los datos. De nada servir+a una base de datos si no puedi%ramos consultarla. 0s adem$s la operacin que e&ectuaremos con mayor &recuencia. "ara consultar la in&ormacin SQL pone a nuestra disposicin la sentencia S;L;%T. La sentencia S;L;%T nos permite consultar los datos almacenados en una tabla de la base de datos. 0l &ormato de la sentencia select es, S;L;%T LALL H #ISTIN%T M Jnombre_"m#oK LN,Jnombre_"m#oKOM ,4/$ Jnombre_tb!KPJnombre_*$&tK LN,Jnombre_tb!KPJnombre_*$&tKOM LAB;4; J"on%$"$onK LN AN#P/4 JcondicionKOMM L?4/=P .D Jnombre_"m#oK LN,Jnombre_"m#o KOMM LBA>IN? J"on%$"$onKLN AN#P/4 JcondicionKOMM L/4#;4 .D Jnombre_"m#oKPJindiceQcampoK LAS% P #;S%M LN,Jnombre_"m#oKPJindiceQcampoK LAS% P #;S% MOMM
7eamos por partes que quiere decir cada una de las partes que con&orman la sentecia. 11 Pala9ra Signi+ica! S;L;%T "alabra clave que indica que la sentencia de SQL que queremos ejecutar es de seleccin. ALL 4ndica que queremos seleccionar todos los valores.0s el valor por de&ecto y no suele especi&icarse casi nunca. #ISTIN%T 4ndica que queremos seleccionar slo los valores distintos. ,4/$ 4ndica la tabla (o tablas! desde la que queremos recuperar los datos. 0n el caso de que exista m$s de una tabla se denomina a la consulta Tconsulta combinadaT o TjoinT. 0n las consultas combinadas es necesario aplicar una condicin de combinacin a trav%s de una cl$usula AB;4;. AB;4; 0speci&ica una condicin que debe cumplirse para que los datos sean devueltos por la consulta. .dmite los operadores lgicos AN# y /4. ?4/=P .D 0speci&ica la agrupacin que se da a los datos. Se usa siempre en combinacin con &unciones agregadas. BA>IN? 0speci&ica una condicin que debe cumplirse para los datos0speci&ica una condicin que debe cumplirse para que los datos sean devueltos por la consulta. Su &uncionamiento es similar al de AB;4; pero aplicado al conjunto de resultados devueltos por la consulta. Debe aplicarse siempre junto a ?4/=P .D y la condicion debe estar re&erida a los campos contenidos en ella. /4#;4 .D "resenta el resultado ordenado por las columnas indicadas. 0l orden puede expresarse con AS% (orden ascendente! y #;S% (orden descendente!. 0l valor predeterminado es AS%. "ara &ormular una consulta a la tabla t(oc'es (creada en el cap+tulo de tablas! y recuperar los campos matricula, marca, modelo, color, numeroQSilometros, numQpla/as debemos ejecutar la siguiente consulta. Los datos seran devueltos ordenados por marca y por modelo en orden ascendente, de menor a mayor. 1< S;L;%T matricula, marca, modelo, color, numeroQSilometros, numQpla/as ,4/$ t(oc'es /4#;4 .D marca,modeloR La palabra clave ,4/$ indica que los datos ser$n recuperados de la tabla t(oc'es. "odr+amos 'aber especi&icado mas de una tabla, pero esto se ver$ en el apartado de consultas combinadas. Tambien podr+amos 'aber simplicado la consulta a trav%s del uso del comod+n de campos, el asterisco TVT. S;L;%T V ,4/$ t(oc'es /4#;4 .D marca,modeloR 0l uso del asterisco indica que queremos que la consulta devuelva todos los campos que existen en la tabla. @.1.2. La clIusula AB;4; La cl$usula AB;4; es la instruccin que nos permite &iltrar el resultado de una sentencia S;L;%T. Dabitualmente no deseamos obtener toda la in&ormacin existente en la tabla, sino que queremos obtener slo la in&ormacin que nos resulte 2til es ese momento. La cl$usula AB;4; &iltra los datos antes de ser devueltos por la consulta. 0n nuestro ejemplo, si queremos consultar un auto en concreto debemos agregar una cl$usula AB;4;. 0sta cl$usula especi&ica una o varias condiciones que deben cumplirse para que la sentencia S;L;%T devuelva los datos. "or ejemplo, para que la consulta devuelva slo los datos del coc'e con matr+cula -):1:W. debemos ejecutar la siguiente sentencia, 18 S;L;%T matricula, marca, modelo, color, numeroQSilometros, numQpla/as ,4/$ t(oc'es AB;4; matricula X Y-):1:W.YR
(uando en una cl$usula Z'ere queremos incluir un tipo texto, debemos incluir el valor entre comillas simples. .dem$s, podemos utili/ar tantas condiciones como queramos, utili/ando los operadores lgicos AN# y /4 . 0l siguiente ejemplo muestra una consulta que devolver$ los coc'es cuyas matr+culas sean -):1:W. o bien -1:BB... S;L;%T matricula, marca, modelo, color, numeroQSilometros, numQpla/as ,4/$ t(oc'es AB;4; matricula X Y-):1:W.Y /4 matricula X Y-1:BB..Y R .dem$s una condicin AB;4; puede ser negada a trav%s del operador lgico N/T. La siguiente consulta devolver$ todos los datos de la tabla t(o'es menos el que tenga matricula -):1:W.. S;L;%T matricula, marca, modelo, color, numeroQSilometros, numQpla/as ,4/$ t(oc'es AB;4; N/T matricula X Y-):1:W.Y R 1: "odemos tambi%n obtener las di&erentes marcas y modelos de auots ejecutando la consulta. S;L;%T #ISTIN%T marca, modelo ,4/$ t(oc'esJ 0n el caso anterior se devolver$n la palabra clave #ISTIN%T indica que slo queremos os valores distintos del par &ormado por los campos marca y modelo. @.1.&. La clIusula /4#;4 .D (omo ya 'emos visto en los ejemplos anteriores podemos especi&icar el orden en el que ser$n devueltos los datos a trav%s de la cl$usula /4#;4 .D. S;L;%T matricula, marca, modelo, color, numeroQSilometros, numQpla/as ,4/$ t(oc'es /4#;4 .D marca AS%,modelo #;S%R 1B (omo se puede ver en el ejemplo se puede especi&icar la ordenacin ascendente o descendente a trav%s de las palabras clave AS% y #;S%. La ordenacin depende del tipo de datos que est% de&inido en la columna, de &orma que un campo num%rico ser$ ordenado como tal, y un al&anum%rico se ordenar$ de la . a la W, aunque su contenido sea num%erico. De esta &orma el valor )>> se devuelve antes que el )). Tambi%n podemos especi&icar el en la cl$usula /4#;4 .D el +ndice n2merico del campo dentro del la sentencia S;L;%T para la ordenacin, el siguiente ejemplo ordenar+a los datos por el campo marca, ya que aparece en segundo lugar dentro de la lista de campos que componen el S;L;%T. S;L;%T matricula, marca, modelo, color, numeroQSilometros, numQpla/as ,4/$ t(oc'es /4#;4 .D 1R 0l resto de opciones que podemos especi&icar al construir sentencias S;L;%T se ir$n presentando en los siguientes cap+tulos de este tutorial. 1; @.2. Lengua)e !e 'ani(ulaci"n !e !ats (II). @.2.1. Insertar !ats. Dasta a'ora 'emos visto como se almacenan los datos en una base de datos y como consultar esos datos almacenados, pero no 'emos visto como almacenar dic'os datos. "ara almacenar datos en una base de datos debemos insertar &ilas en las tablas. "ara ellos SQL pone a nuestra disposicin la sentencia INS;4T. Inserci"n !e +ilas. 0l proceso de insercin de &ilas consiste en a=adir a una tabla una o m$s &ilas y en cada &ila todos o parte de sus campos. "odemos distinguir dos &ormas de insertar &ilas, 4nsercin individual de &ilas. 4nsercin m2ltiple de &ilas. La sintaxis de la sentencia INS;4T es di&erente seg2n cual sea nuestro propsito. Slo podremos omitir un campo al e&ectuar una insercin cuando %ste acepte valores nulos. 19 @.2.1.1. Inserci"n in!ivi!ual !e +ilas. "ara reali/ar la inserccin individual de &ilas SQL posee la instruccin INS;4T INT/. La inserccin individual de &ilas es la que m$s comunmente utili/aremos. Su sintaxis es la siguiente, INSERT INTO <nombre_tabla> +(<campo1>+,<campo2>,666,), "a#%es (<valor1>,<valor2>,666); (omo se puede observar la sentencia tiene dos partes claramente di&erenciadas, por un lado la propia INS;4T INT/ seguida de la lista de campos en los que queremos insertar los datos, y por otro la lista de valores que queremos insertar en los campos. La mejor &orma de ver esto es a trav%s de un ejemplo. INSERT INTO tCoches (matricula, marca , modelo , color , numero%8ilometros) "a#%es (9:C&9, 9;23&.149, 9:2<&32 4;!!9, 932<;= >/&:&3429, ?(!!!); 3ota@Aemos utiliBado el color roCo para los datos de tipo te)to, entrecomillados con la comilla simple, D el aBul para los numericos6 (on esta sentencia INS;4T creamos un registro en la tabla t(oc'es con los valores especi&icados, es decir, la matricula tendr$ el valor -))))(., la marca ser$ A05.ELT y as+ sucesivamente. UQue ocurrir+a si ya existiera un coc'e con la matricula -))))(.I Se producir$ un error, porque 'emos de&inido la clave primaria en el campo matr+cula, y como 'emos visto la clave primaria debe ser 2nica. 1H Si omitimos alg2n par T campovalor T en la sentencia INS;4T, pueden ocurrir varias cosas, Que se produ/ca un error , si el campo no acepta valores nulos. Que se grave el registro y se deje nulo el campo, cuando el campo acepte valores nulos. Que se grave el registro y se tome el valor por de&ecto, cuando el campo tenga de&inido un valor por de&ecto. Que 'acer en cada cada momento depender$ del programa. "or ejemplo, la siguiente sentencia crear$ un registro en la tabla t(oc'es con el campo numeroQSilometros cero, ya que este es su valor por de&ecto. INSERT INTO tCoches (matricula, marca , modelo , color) "a#%es (9:C&9, 9;23&.149, 9:2<&32 4;!!9, 932<;= >/&:&3429); @.2.1.2. Inserci"n '*lti(le !e +ilas. La sentencia INS;4T permite tambien insertar varios registros en una tabla. "are ello se utili/a una combinacin de la sentencia INS;4T junto a una sentencia S;L;%T. 0l resultado es que se insertan todos los registros devueltos por la consulta. INSERT INTO <nombre_tabla> +(<campo1>+,<campo2>,666,), SELECT +(<campo1>+,<campo2>,666,), &RO' <nombre_tabla_origen>; <> "ara poder utili/ar la insercin multiple de &ilas se deben cumplir las siguientes normas, La lista de campos de las sentencias insert y select deben coincidir en n2mero y tipo de datos. 5inguna de las &ilas devueltas por la consulta debe in&ringir las reglas de integridad de la tabla en la que vayamos a reali/ar la insercin. "ongamos un ejemplo, vamos a crear una tabla con las di&erentes marcas que tenemos en la base de datos. La sentencia SQL para crear la tabla es la siguiente, CREATE TABLE t:arcas ( codigo integer not null i*en+i+y(,), marca varchar(255), cons+rain+ #$%:arcas primary key (codigo) ); 3ota@ Aemos incluido la funciEn identitD para el campo codigo, esta funciEn es propia de 5F1 5erver e indica 'ue el cEdigo se genera automGticamente cada veB 'ue se inserta un registro con un valor autonumHrico6 #raticamente todos los gestores de bases de datos dan la opciEn del campo autonumerico o incremental, si bien el modo varias6 #ara 5F1 5erver utiliBaremos la funcion identitD, para =;&C12 las secuencias 666 Ena ve/ que tenemos creada la tabla de marcas vamos a insetar otro par de registros en la tabla de coc'es, para ello utili/amos una sentencia insert int para una 2nica &ila. INSERT INTO tCoches (matricula, marca , modelo , color) "a#%es (9:22II*A9, 952&49, 912=3 *;9, 9;=J=9);
INSERT INTO tCoches (matricula, marca , modelo, color) "a#%es (9:II2*K9, 9*=;>9, 9*/254&9, 9<;/5 #1&4&9); .'ora tenemos tres marcas di&erentes en la tabla t(oc'es, y queremos insertarlas en la tabla de marcas, para ello podemos reali/ar tres inserciones individuales, pero Uque pasar+a si no supi%ramos de antemano el n2mero de marcasI Uy si &ueran unas cincuenta marcasI. <) .&ortunadamente podemos reali/ar una insercin multiple del siguiente modo, INSERT INTO t:arcas (marca) SELECT DISTINCT marca &RO' tCoches; (omo resultado obtenemos un registro en la tabla t-arcas por cada marca de la tabla t(oc'es. 0l campo codigo se 'a generado autom$ticamente ya que est$ de&inido como identidad. %/#I?/ $A4%A ) 63AD 1 A05.ELT < S0.T Day que darnos cuenta de que el orden de generacin no 'a sido el mismo que el de insercin, sino que se 'a aplicado el orden en el que 'an sido devueltos los datos por la sentencia S0L0(T. .'ora deber+amos cambiar los datos de la tabla t(oc'es, para guardar el cdigo de la marca en lugar de su descripcin, pero para ello necesitamos saber como modi&icar un dato grabado. <1 @.2.2. .rra! !e !ats. @.2.2.1. La sentencia #;L;T;. "ara borrar datos de una tabla, debemos utili/ar la sentencia #;L;T;. La sintaxis de la sentencia #;L;T; es la siguiente, DELETE &RO' <nombre_tabla> + !(ERE <condicion>,; 0l siguiente ejemplo ilustra el uso de la sentencia #;L;T;. 0s buena idea especi&icar en la sentencia AB;4; los campos que &orman la clave primaria de la tabla para evitar borrar datos que no queramos eliminar. DELETE &RO' tCoches !(ERE marca 7 952&49; (uando trabajemos con la sentencia #;L;T; debemos tener en cuenta las siguientes consideraciones, Solo podemos borrar datos de una 2nica tabla. (uando borramos datos de una vista, los estamos borrando tambi%n de la tabla. Las vistas son solo una &orma de ver los datos, no una copia. Si intentamos borrar un registro de una tabla re&erenciada por una ,/4;IN? C;D como tabla maestra, si la tabla dependiente tiene registros relacionados la sentencia #;L;T; &allar$. << @.2.2.2. La sentencia T4=N%AT;. "ara reali/ar un borrado completo de tabla debemos considerar la posibilidad de utili/ar la sentencia T4=N%AT;, muc'o m$s r$pida que #;L;T;. La sintaxis de la sentencia T4=N%AT; es la siguiente, TRUNCATE TABLE <nombre_tabla>; 0l siguiente ejemplo muestra el uso de la sentencia T4=N%AT;. TRUNCATE TABLE tCoches; (uando trabajemos con la sentencia T4=N%AT; debemos tener en cuenta las siguientes consideraciones. La sentencia T4=N%AT; no es transaccional. 5o se puede des'acer. La sentencia T4=N%AT; no admite clausula AB;4;. *orra toda la tabla. 5o todos los gestores de bases de datos admiten la sentencia T4=N%AT;. <8 @.2.&. ActualiKaci"n !e !ats. @.2.&.1. La sentencia =P#AT;. "ara la actuali/acin de datos SQL dispone de la sentencia =P#AT;. La sentencia =P#AT; permite la actuali/acin de uno o varios registros de una 2nica tabla. La sintaxis de la sentencia =P#AT; es la siguiente , UPDATE <nombre_tabla> SET <campo1> 7 <valor1> {+,<campo2> 7 <valor2>,666,<campoN> 7 <valorN>,} + !(ERE <condicion>,; Las siguientes sentencias actuali/an los datos de la tabla t(oc'es con los valores de la tabla t-arca obtenidos anteriormente. UPDATE tCoches SET marca 7 99 !(ERE marca 7 9*=;>9;
UPDATE tCoches SET marca 7 929 !(ERE marca 7 9;23&.149;
UPDATE tCoches SET marca 7 9I9 !(ERE marca 7 952&49; 5tese que los valores para el campo marca aparecen entrecomillados, ya que es un campo de tipo varc-ar. Los valores con los que actualicemos los datos deben ser del tipo del campo. En aspecto a tener en cuenta es que los campos que &orman la (ri'ary Fey de una tabla slo se podr$n modi&icar si los registros no est$n re&erenciados en ninguna otra tabla. 0n nuestro caso slo podremos modi&icar la matr+cula de un coc'e si no tiene registros asociados en la tabla t.lquileres. 0sto puede causar poblemas, ya que podr+amos 'abernos equivocado al dar de alta el coc'e en la tabla t(oc'es y detectar el error despues de alquilar el coc'e. 0n tal caso tendr+amos dar de alta un nuevo coc'e con la matr+cula correcta, actuali/ar los registros de la tabla alquileres y por 2ltimo borrar el registro erroneo de la tabla t(oc'es. 0ste proceso puede ser bastante complicado en el caso de que existieran m$s relaciones con la tabla. <: Se podr+a considerar que la clave primaria de la tabla esta mal de&inida y que la matr+cula no debe ser el elemento que identi&ique el coc'e. Ena alternativa ser+a crear un cdigo autonum%rico para la tabla t(oc'es que reali/ar$ las veces de clave primaria y crear un +ndice 2nico para la matr+cula, %ste dise=o tambien tiene sus TlimitantesT, por lo que debemos decidir que modelo utili/ar, y seleccionar las claves primarias con sumo cuidado. @.2.&.2. =s !e su9cnsultas cn =P#AT;. 0l uso de subconsultas es una t%cnica avan/ada de consulta que veremos con detalle m$s adelante, pero que tratamos aqu+ de &orma introductoria. Dasta a'ora 'emos actuali/ado los datos con valores que conocemos de antemano, Upero qu% ocurre cuando esos datos deben tomarse de otra tabla de la base de datosI. "odr+amos dise=ar un programa que recorriera toda la tabla y buscara el valor adecuado para cada registro y lo actuali/ase. Sin duda es una solucin, y en ocasiones cas+ la 2nica, pero es una solucin cara y compleja que adem$s exige que cono/camos alg2n otro lenguaje de programacin. "ara estos casos podemos utili/ar subconsultas con la sentencia =P#AT;. La sintaxis es la siguiente, UPDATE <nombre%tabla> SET <campo> 7 <valor> - <subconsulta> {+,<campo2> 7 <valor2> - <subconsulta2> ,666 , <campo3> 7 <valor3> - <subconsulta3>,} + !(ERE <condicion>,; (omo puede verse la sintaxis es pr$cticamente igual a la sintaxis del la sentencia =P#AT;, con la salvedad de que podemos utili/ar subconsultas en lugar de valores al asignar los campos. De &orma generica podemos decir que las subconsultas son consultas S;L;%T incluidas dentro de otra sentencia SQL. <B Las siguientes sentencias =P#AT; son equivalentes, U+i#i,an*o sen+encias UPDATE norma#es- UPDATE tCoches SET marca 7 99 !(ERE marca 7 9*=;>9; UPDATE tCoches SET marca 7 929 !(ERE marca 7 9;23&.149; UPDATE tCoches SET marca 7 9I9 !(ERE marca 7 952&49; .tiliBando sentencias .#>&42 combinadas con subconsultas@ UPDATE tCoches SET marca 7 (SELECT C=>/<= &RO' t:arcas !(ERE t:arcas6:arca 7 tCoches6:arca ) !(ERE marca IN (9*=;>9,9;23&.149,952&49); "or cada registro de la tabla t(oc'es se ejecutar$ la subconsulta, actuali/ando el campo marca a el valor del cdigo de la marca en la tabla t-arcas. 0l uso de subconsultas para actuali/ar datos tiene algunas limitaciones, La subconsulta slo puede devover un 2nico campo. La subconsulta slo puede devolver un slo registro. 0l tipo de datos devuelto por la subconsulta debe ser del mismo tipo que el campo al que estamos asignando el valor. 5o todos los sistemas de bases de datos permiten usar subconsultas para actuali/ar datos aunque si una buena parte de ellos (3A.(L0, SQL Server, Sybase ...! "ero en nuestro ejemplo el campo codigo de la tabla t-arcas es num%rico y el campo marca de la tabla t(oc'es es texto. U"or qu% &uncionaI -uy &$cil, el motor de la base de datos es capa/ de convertir el valor num%rico a un valor texto de &orma autom$tica, si bien esta es una excepcin. .'ora que ya tenemos modi&icado el valor de la marca de los registros, es conveniente modi&icar su tipo de datos y crear una &oreign Sey contra la tabla t-arcas. "ara ello ejecutaremos las siguientes sentencias. <; ALT;4 TA.L; t(oc'es alter clu'n marca int nt nullJ La opcion alter column es propia de SQL Server. "ara modi&icar el tipo de datos de una tabla debemos consultar la ayuda del gestor de bases de datos. ALT;4 TA.L; t(oc'es a!! cnstraint 6?Q(oc'esQ-arcas +reign Fey (marca! re+erences t-arcas (codigo!R <9 L. %nsultas c'9ina!as. M/INS. L.1. %nsultas c'9ina!as. Dabitualmente cuando necesitamos recuperar la in&ormacin de una base de datos nos encontramos con que dic'a in&ormacin se encuentra repartida en varias tablas, re&erenciadas a trav%s de varios cdigos. De este modo si se tuviese una tabla de ventas con un campo cliente, dic'o campo contendr+a el cdigo del cliente de la tabla de cliente. Sin embargo est$ &orma de almacenar la in&ormacin no resulta muy util a la 'ora de consultar los datos. SQL nos proporciona una &orma &acil de mostrar la in&ormacin repartida en varias tablas, las cnsultas c'9ina!as o M/INS. Las consultas combinadas pueden ser de tres tipos, (ombinacin interna (ombinacin externa Eniones L.2. %'9inaci"n interna. La combinacin interna permite mostrar los datos de dos o m$s tablas a trav%s de una condicin AB;4;. Si recuerda, los ejemplos de los cap+tulos anteriores existe una tabla de coc'es, en la que es tiene re&erenciada la marca a trav%s del cdigo de marca. "ara reali/ar la consulta combinada entre estas dos tablas debemos escribir una consulta S;L;%T en cuya cl$usula ,4/$ se escribe el nombre de las dos tablas, separados por comas, y una condicin AB;4; que obligue a que el cdigo de marca de la tabla de coc'es sea igual al cdigo de la tabla de marcas. Lo m$s sencillo es ver un ejemplo directamente, <H 5212C4 tCoches6matricula, t:arcas6marca, tCoches6modelo, tCoches6color, tCoches6numero%8ilometros, tCoches6num%plaBas *;=: tCoches, t:arcas LA2;2 tCoches6marca 7 t:arcas6codigo La misma consulta de &orma TvisualT ... Day que darse cuenta que 'emos antepuesto el nombre de cada tabla a el nombre del campo, esto no es obligatorio si los nombres de campos no se repiten en las tablas, pero es aconsejable para evitar con&lictos de nombres entre campos. "or ejemplo, si para re&erirnos al campo marca no anteponemos el nombre del campo la base de datos no sabe si queremos el campo marca de la tabla t(oc'es, que contiene el cdigo de la marca, o el campo marca de la tabla t-arcas, que contiene el nombre de la marca. 3tra opcin es utili/ar la cl$usula INN;4 M/IN. Su sintaxis es identica a la de una consulta S;L;%T 'abitual, con la particularidad de que %n la cl$usula ,4/$ slo aparece una tabla o vista, a=adiendose el resto de tablas a trav%s de cl$usulas INN;4 M/IN . SELECT +ALL . DISTINCT , <nombre_campo> +{,<nombre_campo>}, &RO' <nombre_tabla> +{INNER /OIN <nombre_tabla> ON <condicion_combinacion>}] +!(ERE <condicion> +{ AND-OR <condicion>},, +0ROUP B) <nombre_campo> +{,<nombre_campo >},, +(AIN0 <condicion>+{ AND-OR <condicion>},, +ORDER B) <nombre_campo>-<indice%campo> +ASC - DESC, +{,<nombre_campo>-<indice%campo> +ASC - DESC ,},, 8> 0l ejemplo anterior escrito utili/ando la clausula INN;4 M/IN quedar+a de la siguiente manera, 5212C4 tCoches6matricula, t:arcas6marca, tCoches6modelo, tCoches6color, tCoches6numero%8ilometros, tCoches6num%plaBas *;=: tCoches /332; J=/3 t:arcas =3 tCoches6marca 7 t:arcas6codigo La cl$usula INN;4 M/IN permite separar completamente las condiciones de combinacin con otros criterios, cuando tenemos consultas que combinan nueve o die/ tablas esto realmente se agradece. Sin embargo muc'os programadores no son amigos de la cl$usula INN;4 M/IN, la ra/n es que uno de los principales gestores de bases de datos, /4A%L;, no la soportaba. Si nuestro porgrama deb+a trabajar sobre bases de datos /4A%L; no pod+amos utili/ar INN;4 M/IN. A (artir !e la versin /4A%L; 9i racle s(rta la clIusula INN;4 M/IN. L.&. %'9inaci"n ;Nterna La combinacin interna es excluyente. 0sto quiere decir que si un registro no cumple la condicin de combinacin no se incluye en los resultados. De este modo en el ejemplo anterior si un coc'e no tiene grabada la marca no se devuelve en la consulta. Seg2n la naturale/a de la consulta esto puede ser una ventaja , pero en otros casos signi&ica un serio problema. "ara modi&icar este comportamiento SQL pone a disposicin la combinacin externa. La combinacin externa no es excluyente. La sintaxis es muy parecida a la combinacin interna, 8) SELECT +ALL . DISTINCT , <nombre_campo> +{,<nombre_campo>}, &RO' <nombre_tabla> +{LE&T.RI0(T OUTER /OIN <nombre_tabla> ON <condicion_combinacion>}] +!(ERE <condicion> +{ AND-OR <condicion>},, +0ROUP B) <nombre_campo> +{,<nombre_campo >},, +(AIN0 <condicion>+{ AND-OR <condicion>},, +ORDER B) <nombre_campo>-<indice%campo> +ASC - DESC, +{,<nombre_campo>-<indice%campo> +ASC - DESC ,},, La combinacin externa puede ser diestra o siniestra, L;,T /=T;4 M/IN o 4I?BT /=T;4 M/IN. (on L;,T /=T;4 M/IN obtenemos todos los registros de en la tabla que situemos a la i/quierda de la clausula M/IN, mientras que con 4I?BT /=T;4 M/IN obtenmos el e&ecto contrario. (omo mejor se ve la combinacin externa es con un ejemplo. 5212C4 tCoches6matricula, t:arcas6marca, tCoches6modelo, tCoches6color, tCoches6numero%8ilometros, tCoches6num%plaBas *;=: tCoches LE&T OUTER /OIN t:arcas =3 tCoches6marca 7 t:arcas6codigo 0sta consulta devolver$ todos los registros de la tabla t(oc'es, independientemente de que tengan marca o no. 0n el caso de que el coc'e no tenga marca se devolver$ el valor null para los campos de la tabla t-arcas. 7isualmente (la consulta devuelve los datos en sobreado a/ul! ...
81 0l mismo ejemplo con A4@DT 3ET0A [345. 5212C4 tCoches6matricula, t:arcas6marca, tCoches6modelo, tCoches6color, tCoches6numero%8ilometros, tCoches6num%plaBas *;=: tCoches RI0(T OUTER /OIN t:arcas =3 tCoches6marca 7 t:arcas6codigo 0sta consulta devolver$ los registros de la tabla t(oc'es que tengan marca relacionada y todos los registros de la tabla t-arcas, tengan alg2n registro en t(oc'es o no. 7isualmente (la consulta devuelve los datos en en sombreado! ... L.:. =nin La cl$usula =NI/N permite unir dos o m$s conjuntos de resultados en uno detr$s del otro como si se tratase de una 2nica tabla. De este modo podemos obtener los registros de m$s de una tabla TunidosT. La sintaxis corresponde a la de varias S;L;%T unidas a trav%s de =NI/N, como se muestra a continuacin, 8< SELECT +ALL . DISTINCT , <nombre_campo> +{,<nombre_campo>}, &RO' <nombre_tabla> +{LE&T.RI0(T OUTER /OIN <nombre_tabla> ON <condicion_combinacion>}] +!(ERE <condicion> +{ AND-OR <condicion>},, +0ROUP B) <nombre_campo> +{,<nombre_campo >},, +(AIN0 <condicion>+{ AND-OR <condicion>},, { UNION 1ALL . DISTINCT 2 SELECT +ALL . DISTINCT , <nombre_campo> +{,<nombre_campo>}, &RO' <nombre_tabla> +{LE&T.RI0(T OUTER /OIN <nombre_tabla> ON <condicion_combinacion>}] +!(ERE <condicion> +{ AND-OR <condicion>},, +0ROUP B) <nombre_campo> +{,<nombre_campo >},, +(AIN0 <condicion>+{ AND-OR <condicion>},, } +ORDER B) <nombre_campo>-<indice%campo> +ASC - DESC, +{,<nombre_campo>-<indice%campo> +ASC - DESC ,},, "ara utili/ar la cl$usula =NI/N debemos cumplir una serie de normas. Las consultas a unir deben tener el mismo n2mero campos, y adem$s los campos deben ser del mismo tipo. Slo puede 'aber una 2nica clausula /4#;4 .D al &inal de la sentencia S;L;%T. 88 0l siguiente ejemplo muestra el uso de =NI/N 5212C4 tCoches6matricula, t:arcas6marca, tCoches6modelo, tCoches6color, tCoches6numero%8ilometros, tCoches6num%plaBas *;=: tCoches INNER /OIN t:arcas =3 tCoches6marca 7 t:arcas6codigo .3/=3 5212C4 t:otos6matricula, t:arcas6marca, t:otos6modelo, t:otos6color, t:otos6numero%8ilometros, ! *;=: t:otos INNER /OIN t:arcas =3 t:otos6marca 7 t:arcas6codigo;
"uede observarse el uso de la constante cero en la segunda lista de seleccin para 'acer coincidir el n2mero y tipo de campos que devuelve la consulta E5435. 8: O. %nsultas agrega!as. O.1. La clIusula ?4/=P .D. La clausula ?4/=P .D combina los registros con valores id%nticos en un 2nico registro. "ara cada registro se puede crear un valor agregado si se incluye una &uncin SQL agregada, como por ejemplo Sum o (ount, en la instruccin S;L;%T. Su sintaxis es, SELECT +ALL . DISTINCT , <nombre_campo> +{,<nombre_campo>}, +{,<funcion_agregado>}, &RO' <nombre_tabla>-<nombre_vista> +{,<nombre_tabla>-<nombre_vista>}, +!(ERE <condicion> +{ AND-OR <condicion>},, +0ROUP B) <nombre_campo> +{,<nombre_campo >},, +(AIN0 <condicion>+{ AND-OR <condicion>},, +ORDER B) <nombre_campo>-<indice%campo> +ASC - DESC, +{,<nombre_campo>-<indice%campo> +ASC - DESC ,},, ?4/=P .D es opcional. Si se utili/a ?4/=P .D pero no existe una &uncin SQL agregada en la instruccin S;L;%T se obtiene el mismo resultado que con una consulta S;L;%T #ISTIN%T. Los valores 5ull en los campos ?4/=P .D se agrupan y no se omiten. 5o obstante, los valores 5ull no se eval2an en ninguna de las &unciones SQL agregadas. Todos los campos de la lista de campos de S;L;%T deben incluirse en la cl$usula ?4/=P .D o como argumentos de una &uncin SQL agregada. SELECT marca, modelo, SU'(numero%8ilometros) &RO' tCoches 0ROUP B) marca, modelo 8B O.2. La clIusula BA>IN?. Ena ve/ que ?4/=P .D 'a combinado los registros, BA>IN? muestra cualquier registro agrupado por la cl$usula ?4/=P .D que satis&aga las condiciones de la cl$usula BA>IN?. Se utili/a la cl$usula AB;4; para excluir aquellas &ilas que no desea agrupar, y la cl$usula BA>IN? para &iltrar los registros una ve/ agrupados. BA>IN? es similar a AB;4;, determina qu% registros se seleccionan. Ena ve/ que los registros se 'an agrupado utili/ando ?4/=P .D, BA>IN? determina cuales de ellos se van a mostrar. BA>IN? permite el uso de &unciones agregadas. SELECT marca, modelo, SU'(numero%8ilometros) &RO' tCoches !(ERE marca <> 9M:L9 0ROUP B) marca, modelo (AIN0 SU'(numero%8ilometros)>!!!!! 0n el ejemplo anterior, no se cuentan los datos para todas las marcas menos T*-GT, una ve/ que se 'an contado, se evalua BA>IN?, y el conjunto de resultados devuelve solo aquellos modelos con m$s de )>>.>>> Sm. A>? (alcula la media aritm%tica de un conjunto de valores contenidos en un campo especi&icado de una consulta. Su sintaxis es la siguiente A0(<expr>)
0n donde expr representa el campo que contiene los datos num%ricos para los que se desea calcular la media o una expresin que reali/a un c$lculo utili/ando los datos de dic'o campo. La media calculada por .vg es la media aritm%tica (la suma de los valores dividido por el n2mero de valores!. La &uncin .vg no incluye ning2n campo 5ull en el c$lculo. SELECT marca, modelo, A0(numero%8ilometros) &RO' tCoches 0ROUP B) marca, modelo
8; %unt (alcula el n2mero de registros devueltos por una consulta. Su sintaxis es la siguiente, COUNT(<expr>) 0n donde e,#r contiene el nombre del campo que desea contar. Los operandos de expr pueden incluir el nombre de un campo de una tabla, una constante o una &uncin (la cual puede ser intr+nseca o de&inida por el usuario pero no otras de las &unciones agregadas de SQL!. "uede contar cualquier tipo de datos incluso texto. .unque expr puede reali/ar un c$lculo sobre un campo, (ount simplemente cuenta el n2mero de registros sin tener en cuenta qu% valores se almacenan en los registros. La &uncin (ount no cuenta los registros que tienen campos null a menos que expr sea el car$cter comod+n asterisco (V!. Si utili/a un asterisco, (ount calcula el n2mero total de registros, incluyendo aquellos que contienen campos null. (ount(V! es considerablemente m$s r$pida que (ount((ampo!. 5o se debe poner el asterisco entre dobles comillas (YVY!. SELECT COUNT(N) &RO' tCoches; SELECT marca, COUNT(modelo) &RO' tCoches 0ROUP B) marca; SELECT marca, COUNT(DISTINCT modelo) &RO' tCoches 0ROUP B) marca;
$aN, $in Devuelven el m+nimo o el m$ximo de un conjunto de valores contenidos en un campo especi&ico de una consulta. Su sintaxis es, 'IN(<expr>) 'AX(<expr>) 89 0n donde expr es el campo sobre el que se desea reali/ar el c$lculo. 0xpr pueden incluir el nombre de un campo de una tabla, una constante o una &uncin (la cual puede ser intr+nseca o de&inida por el usuario pero no otras de las &unciones agregadas de SQL!. SELECT marca, modelo, 'IN(numero%8ilometros) , 'AX(numero%8ilometros) &RO' tCoches 0ROUP B) marca, modelo Su' Devuelve la suma del conjunto de valores contenido en un campo especi&ico de una consulta. Su sintaxis es, SU'(<expr>) 0n donde e,#r respresenta el nombre del campo que contiene los datos que desean sumarse o una expresin que reali/a un c$lculo utili/ando los datos de dic'os campos. Los operandos de e,#r pueden incluir el nombre de un campo de una tabla, una constante o una &uncin (la cual puede ser intr+nseca o de&inida por el usuario pero no otras de las &unciones agregadas de SQL!. SELECT marca, modelo, SU'(numero%8ilometros) &RO' tCoches 0ROUP B) marca, modelo
8H P. Su9cnsultas. P.1. #e+inici"n !e su9cnsultas. Ena subconsulta es una sentencia S;L;%T que aparece dentro de otra sentencia S;L;%T. 5ormalmente se utili/an para &iltrar una clausula AB;4; o BA>IN? con el conjunto de resultados de la subconsulta, aunque tambi%n pueden utili/arse en la lista de seleccin. "or ejemplo podr+amos consultar el alquirer 2ltimo de un cliente. SELECT C=%C1/2342, 3=:M;2, :&;C&, :=>>21= &RO' &1F./12;25 !(ERE C=%C1/2342 7 AND *2CA&%&1F./12; 7 (SELECT 'AX(!"#$_$%&'(%!)) &RO' $%&'(%!)!* !(ERE "+_"%(!N,! - 1)
0n este caso, la subconsulta se ejecuta en primer lugar, obteniendo el valor de la m$xima &ec'a de alquier, y posteriormente se obtienen los datos de la consulta principal. Ena subconsulta tiene la misma sintaxis que una sentencia S;L;%T normal exceptuando que aparece encerrada entre par%ntesis. La subconsulta se puede encontrar en la lista de seleccin, en la cl$usula AB;4; o en la cl$usula BA>IN? de la consulta principal. Tiene las siguientes reestricciones, 5o puede contener la cl$usula /4#;4 .D 5o puede ser la =NI/N de varias sentencias S;L;%T Si la subconsulta aparece en la lista de seleccin, o est$ asociada a un operador igual TXT solo puede devolver un 2nico registro. :> P.2. 4e+erencias eNternas.
. menudo, es necesario, dentro del cuerpo de una subconsulta, 'acer re&erencia al valor de una columna de la &ila actual en la consulta principal, ese nombre de columna se denomina re&erencia externa. Ena re&erencia externa es un campo que aparece en la subconsulta pero se re&iere a la una de las tablas designadas en la consulta principal. (uando se ejecuta una consulta que contiene una subconsulta con re&erencias externas, la subconsulta se ejecuta por cada &ila de la consulta principal. 0n este ejemplo la subconsulta aparece en la lista de seleccin, ejecutandose una ve/ por cada &ila que devuelve la consulta principal. SELECT C=%2:#12&>=, 3=:M;2, (SELECT 'IN(!"#$_N+.(N$) &RO' N+.(N$* !(ERE "+_!./%!$0+ - !./%!$0+*1"+_!./%!$0+) #;/:2;&%3=:/3& &RO' 2:#12&>=5; P.&. Ani!ar su9cnsultas.
Las subconsultas pueden anidarse de &orma que una subconsulta apare/ca en la cl$usula AB;4; (por ejemplo! de otra subconsulta que a su ve/ &orma parte de otra consulta principal. SELECT C=%2:#12&>=, 2:#12&>=5 &RO' 2:#12&>=5 !(ERE C=%2:#12&>= IN (SELECT "+_!./%!$0+ &RO' N+.(N$* !(ERE !*,$0+ IN ( SELECT !*,$0+ &RO' !*,$0+*_N+.(N$* !(ERE !.(,(0+ - 2*2 AND /$3$0+ - 3N3) ) :) Los resultados que se obtienen con subconsultas normalmente pueden conseguirse a trav%s de consultas combinadas ( M/IN !. SELECT C=%2:#12&>=, 3=:M;2 &RO' 2:#12&>=5 !(ERE 254&>= IN (SELECT !*,$0+ &RO' !*,$0+* !(ERE $",(4+ - 2*2) "odr$ escribirse como, SELECT C=%2:#12&>=, 3=:M;2 &RO' 2:#12&>=5, 254&>=5 !(ERE 2:#12&>=56254&>= 7 254&>=56254&>= AND 254&>=56&C4/O= 7 959 5ormalmente es m$s r$pido utili/ar un M/IN en lugar de una subconsulta, aunque esto depende sobre todo del dise=o de la base de datos y del volumen de datos que tenga. P.:. =tiliKacin !e su9cnsultas cn =P#AT;.
"odemos utili/ar subconsultas tambi%n en consultas de actuali/acin conjuntamente con E"D.T0 . 5ormalmente se utili/an para TcopiarT el valor de otra tabla. UPDATE 2:#12&>=5 SET 5&1&;/=%M;.4= 7 (SELECT SU'(5&1/;=%M;.4=) &RO' 3=:/3&5 !(ERE 3=:/3&56C=%2:#12&>= 7 2:#12&>=56C=%2:#12&>=) !(ERE 5&1&;/=%M;.4= IS NULL :1 P.@. La +unci"n ;<ISTS. ;<ISTS es una &uncin SQL que devuelve veradero cuando una subconsulta retorna al menos una &ila. SELECT C=%C1/2342, 3=:M;2 &RO' C1/23425 !(ERE EXISTS ( SELECT 5 &RO' .+)+*+* !(ERE "+_"%(!N,! - "%(!N,!*1"+_"%(!N,! AND /$3$0+ - 2N2) :<
"La Productividad y Comercialización de La Fibra de Alpaca y Su Influencia en El Nivel de Ingreso de Los Productores Del Distrito de Callali, Provincia de Caylloma, Departamento de Arequipa 2017