Vous êtes sur la page 1sur 40

UNIVERSIDAD SALVADOREA ALBERTO MASFERRER

MANUALDESQLSERVER 2

Ing. Mario Valle

NDICE

SQL(StructureQueryLanguageLenguajedeConsultaEstructurado).............................1 IntroduccinaSQL.........................................................................................................1 Componentesdellenguaje SQL......................................................................................2 Lenguajede efinicinde atos.....................................................................................7 D d Definicin dendices ...................................................................................................11 . Vistas ...........................................................................................................................13 . Consulta dedatos. ......................................................................................................16 . Insertardatos...............................................................................................................20 Borradodedatos..........................................................................................................23 Actualizacindedatos................................................................................................24 Consultascombinadas. OINS......................................................................................27 J Consultasagregadas...................................................................................................33 Subconsultas...............................................................................................................36

Ing. Mario Valle SQL(StructureQueryLanguageLenguajedeConsultaEstructurado) SQLesellenguajedeconsultauniversalparabasesdedatos. Desdeestaopcinvamosatratarlostemasrelacionadoscon SQL ANSI 92(American NationalStandardsInstituteInstitutoNacionalEstadounidensedeEstndares),quees el estndar SQL , ya que luego existen variantes como TSQL (TransactSQL SQL Transaccional)yPL/SQL(ProcedureLanguage/SQLSQLProcedimental). SQL proporciona mtodos para definir la base datos, para manipular la informacin y paragestionarlospermisosdeaccesoadichainformacin. Para que un gestor de bases de datos sea considerado como relacional, debe soportar SQL, independientementede las caractersticas particulares que dicho gestorpuedaaportar. ConocerSQLesconocerlasbasesdedatos,ytodosupotencial. IntroduccinaSQL SQLesellenguajedeconsultauniversalparabasesdedatos. Los mandatos de SQL se dividen en tres grandes grupos diferenciados, los cuales sern tratados por separado y que nicamente se presentan aqu a modo introductorio. DDL(Data Definition Language Lenguaje de Definicin de Datos), es el encargado de la definicin de Bases de Datos, tablas, vistas e ndices entre otros. Soncomandospropiosdeestelenguaje: CREATETABLE CREATEINDEX CREATEVIEW CREATE SYNONYM DML(Data ManipulationLanguageLenguaje de Administracin de Datos),cuya misineslamanipulacindedatos.Atravsdelpodemosseleccionar,insertar, eliminaryactualizardatos.Eslapartequemsfrecuentementeutilizaremos,y queconellaseconstruyenlasconsultas.
1

Ing. Mario Valle Soncomandospropiosdeestelenguaje: SELECT UPDATE INSERT INSERTINTO DELETEFROM DCL (Data Control LanguageLenguaje de Control de Datos), encargado de la seguridaddelabasededatos,entodoloreferentealcontroldeaccesosyprivilegios entrelosusuarios.

Soncomandospropiosdeestelenguaje: GRANT REVOKE Componentesdellenguaje SQL. Tiposdedatos. SQLadmiteunavariadagamade tiposde datospara el tratamientode la informacin contenidaenlastablas,lostiposdedatospuedensernumricos(conosindecimales), alfanumricos, de fecha o booleanos (si o no). Segn el gestor de base de datos que estemos utilizando los tipos de datos varan, pero se reducen bsicamente a los expuestosanteriormente,aunqueen la actualidadcasi todoslos gestoresde bases de datossoportanunnuevotipo,el BLOB(BinaryLargeObject Objeto Largo en formato Binario), que es un tipo de datos especial destinado a almacenar archivos, imgenes, entreotros. Dependiendodecadagestordebasesdedatoselnombrequesedaacadaunode estostipospuedevariar.Bsicamentetenemoslossiguientestiposdedatos. Numricos Alfanumricos Fecha Lgico BLOB Integer char(n) Numeric(n.m) varchar(n,m) Decimal(n,m) Float Date DateTime Bit Image Text

Ing. Mario Valle Msdetalladamentetenemos: Tiposdedatosnumricos Tipo Definicin Integer Valoresenterosconsigno. Numeric(n,m) Nmerosrealesdehasta18dgitos(condecimales),donden representaeltotaldedgitosadmitidos(normalmente denominadoprecisin)ymelnmerodeposicionesdecimales (escala). Decimal(n,m) Igualqueeltiponumrico. Float TiposdedatosAlfanumricos Tipo char(n) Definicin Almacenade1a255caracteresalfanumricos.Estevalorviene dado porn, yeseltamaoutilizadoendiscoparaalmacenar dato.Es decir si definoun campocomo char(255),el tamao realdelcamposerde255,aunqueelvalorsolocontenga100. Bytes 0255 Bytes 4 517

517

Nmerodecomaflotante,estetipodedatossesueleutilizarpara 48 losvaloresennotacincientfica.

varchar(n)

Igual que el tipo char, con la salvedad que varchar almacena 0255 nicamentelosbytesquecontengaelvalordelcampo.

Nota: El tamao del campo vara en funcin de cada base de datos, siendo 255 el valor estndar.Enrealidadeltamaovienedelimitadoporeltamaodelaspginasdedatos, para SQL Server el lmite est en 8000 bytes (8000 caracteres), siempre y cuando tengamosdefinidoeltamaodelapginadedatosa8K. TiposdedatosFecha Tipo Date Datetime Definicin Almacenafechas,conda,mesyao. Almacenafechasconfechayhora Bytes 8 4

Nota: La aparicin de los tipos de datos de fecha supuso una autntica revolucin el mundodelabasesdedatos,enrealidad,labasededatosalmacenainternamente nmerosenteros,deahqueeltamaoseade4bytesy8bytes(2enteros),pero aportalavalidacindeldatointroducido.
3

Ing. Mario Valle TiposdedatosLgicos Tipo Bit Definicin Tipobit.Almacenaun0nocero,segnlasbasesde datosser11. Seaplicalalgicabooleana,0esfalsoynocero verdadero. TiposdedatosBLOB Tipo Image Text Definicin Bytes Almacenaimgenesenformatobinario,hastaunmximo 02Gb de2Gbdetamao. Almacenatextoenformatobinario,hastaunmximode 02Gb 2Gbdetamao. Bytes 1bit

Operadores Losoperadoressepuedendefinircomocombinacionesdecaracteresqueseutilizan tantopararealizarasignacionescomocomparacionesentredatos. Losoperadoressedividenenaritmticos,relacionales,lgicos,yconcatenacin. Aritmticos Suma + Resta Producto * Divisin / OperadoresSQL ** ^ Exponenciacin Relacionales < Menorque <= Menoroigualque > Mayorque >= Mayoroigualque <> != Distinto !< Nomenorque !> Nomayorque Lgicos Los operadores lgicos AND comparar expresiones OR

permiten lgicas
4

Ing. Mario Valle NOT devolviendo siempre un valor verdadero o falso. Los operadores lgicos se evalan de izquierda a derecha. ConcatenacinSeempleaparaunir datosde tipoalfanumrico.

PalabrasClave LaspalabrasclavesonidentificadoresconunsignificadoespecialparaSQL,porloque nopuedenserutilizadasparaotropropsitodistintoalquehansidopensadas. SQL dispone de muy pocas rdenes, pero de mltiples palabras clave, lo que le conviertenenunlenguajesencilloperotremendamentepotenteparallevaracabosu funcin. PalabrasClave ALL AVG CHECK CREATE DELETE EXISTS FROM IN INTO NOT OR SELECT UNION VALUES AND BEGIN CLOSE CURSOR DESC FETCH GRANT INDEX LIKE NUMERIC ORDER SET UNIQUE VIEW ANY BY COUNT DECIMAL DISTINCT FLOAT GROUP INSERT MAX ON REVOKE SUM UPDATE WHERE ASC CHAR COMMIT DECLARE DEFAULT FOR HAVING INTEGER MIN OPEN ROLLBACK TABLE USER WITH

Ing. Mario Valle Funciones Agregadas LasfuncionesagregadasproporcionanaSQLutilidadesdeclculosobrelosdatosdelas tablas.EstasfuncionesseincorporanenlasconsultasSELECTyretornanunnicovalor aloperarsobreungrupoderegistros. Lasfuncionesagregadasson. FuncionesAgregadas MAX() MIN() SUM() COUNT() AVG() Devuelveelvalormximo. Devuelveelvalormnimo. Devuelveelvalordelasumadelosvaloresdelcampo. Devuelveelnmerodefilasquecumplenlacondicin Devuelveelpromediadelosvaloresdelcampo

Predicados Los predicados son condiciones que se indican en clusula WHERE de una consultaSQL.LasiguientetablailustralospredicadosdeSQL. PredicadosSQL BETWEEN...AND LIKE ALL ANY EXISTS IN Comprueba que al valor est dentro de un intervalo. Compara un campo con una cadena alfanumrica. LIKEadmiteelusodecaracterescomodines. Sealaatodosloselementosdelaseleccindela consulta. Indicaquelacondicinsecumplirsilacomparacin esciertaparaalmenosunelementodelconjunto. Devuelveun valor verdaderosi el resultadode una subconsultadevuelveresultados. Compruebasiuncamposeencuentradentrodeun determinado rango. El rango puede ser una sentenciaSELECT.

Ing. Mario Valle Lenguajede efinicinde atos D d Tablas El lenguaje de definicin de datos (DDL, Data Definition Language Lenguaje de Definicin de Datos) es el encargado de permitir la descripcin de los objetos que formanunabasededatos. Ellenguajededefinicindedatoslevaapermitirllevaracabolassiguientesacciones: Creacindetablas,ndicesyvistas. Modificacindelasestructuradetablas,ndicesyvistas. Supresindetablas,ndicesyvistas. Nomenclatura La sintaxis empleada para la sentencias en las diferentes pginas est basada en la notacinEBNF(ExtendedBackusNaurForm(EBNF))queesunanomenclaturacomn utilizada en los textos informticos para expresar la sintaxis a utilizar en programacin.Vamosaverelsignificadodealgunossmbolos. Nomenclatura Smbolo <> Significado Encierran parmetros de una orden que el usuario debe sustituir al escribir dicha orden por los valores que queramos dar a los parmetros. Indicaquesucontenidoesopcional. Indicaquesu contenidopuederepetirseunaoms veces. Separa expresiones. Indica que pueden emplearse unauotraexpresinperonomsdeunaalavez.

[] {} |

Adems las palabras clave aparecen en mayscula negrita y los argumentos en minsculacursiva.Lasintaxisdeunasentenciatendrunaspectocomoeste: CREATETABLE <nombre_tabla>( <nombre_campo><tipo_datos(tamao)>, { <nombre_campo><tipo_datos(tamao)>} );
7

Ing. Mario Valle Creacin detablas Enelmodelorelacionallainformacindeunabasededatossealmacenaentablas. Lacreacindelabasededatosdebecomenzarporlacreacindeunaomstablas. ParaelloutilizaremoslasentenciaCREATETABLE. Lasintaxisdelasentenciaeslasiguiente:

CREATETABLE <nombre_tabla>( <nombre_campo><tipo_datos(tamao)> [null |not null] [default<valor_por_defecto>] { ,<nombre_campo><tipo_datos(tamao)> [null |not null] [default<valor_por_defecto>]}[ ,constraint<nombre>primarykey(<nombre_campo>[,...n])][ ,constraint<nombre>foreignkey(<nombre_campo>[,...n]) references<tabla_referenciada>(<nombre_campo>[,...n])] ); Ejemplo: Vamos a simular una base de datos para un negocio de alquiler de coches,porloquevamosaempezarcreandounatablaparaalmacenarloscoches quetenemos. CREATETABLEtCoches ( matricula char(8) not null, marca varchar(255) null, modelo varchar(255) null, color varchar(255)null,numero_kilometros numeric(14,2)nulldefault0, constraintPK_Cochesprimarykey(matricula) ); En este ejemplo creamos una tabla llamada tCoches con cinco campos (matricula, marca,modelo,color,numero_kilometros). Ntesequesehanomitidolas tildes ylos espaciosa propsito.Nuncacreecampos quecontengancaracteresespecficosdeunidioma(tildes,ees,...)niespacios. Lasclavesprimariasyexternas(oforneas)sepuedenimplementardirectamentea travs de la instruccin CREATE TABLE, o bien se pueden agregar a travs de sentenciasALTER TABLE. Cada gestor de bases de datos implementa distintas opciones para la instruccin CREATETABLE, pudiendoespecificarsegrancantidaddeparmetrosypudiendovariar elnombrequedamosalostiposdedatos,perolasintaxisestndareslaquehemos mostradoaqu.
8

Ing. Mario Valle Modificacin detablas Enocasionespuedesernecesariomodificarla estructuradeunatabla,comnmente para aadir un campo o restriccin. Para ello disponemos de la instruccin ALTER TABLE. ALTER TABLE nosvaapermitir: Aadircamposalaestructurainicialdeunatabla. Aadirrestriccionesyreferencias. Paraaadiruncampoaunatablaexistente: ALTER TABLE <nombre_tabla> ADD<nombre_campo> <tipo_datos(tamao)>[null |not null] [default <valor_por_defecto>] { ,<nombre_campo><tipo_datos(tamao)> [null |not null] [default <valor_por_defecto>]}; Ejemplo: ALTER TABLE tCoches ADDnum_plazasintegernull default 5; Enesteejemploaadimoselcamponum_plazasalatablatCochesquehabamos creadoenelapartadoanterior. Para aadir una clave primaria vamos a crear una tabla de cliente y le aadiremoslaclaveprimariaejecutandounasentenciaaltertable: CREATETABLEtClientes ( codigo integer notnull, nombre varchar(255) notnull, apellidos varchar(255) null, nif varchar(10) null, telefono varchar(9) null, movil varchar(9) null ); ALTERTABLEtClientesADD CONSTRAINTPK_tClientesprimarykey(codigo);
9

Ing. Mario Valle Creamoslatablaclientesyleaadimosunarestriccinprimarykeyalaquedamosel nombrePK_tClientesenelcampocodigo. SolopodemosmodificarunanicatablaalavezconALTERTABLE,paramodificarms deunatabladebemosejecutarunasentenciaALTERTABLEportabla. Paraaadirunaclaveexterna(ofornea)necesitamosunaterceratablaennuestra estructura. Por un lado tenemos la tabla tCoches y la tabla tClientes, ahora vamos a crearlatablatAlquileresqueserlaencargadade"decirnos"queclienteshanalquilado uncoche.

CREATETABLEtAlquileres ( codigointegernotnull,codigo_cliente integer not null, matriculachar(8) not null, fx_alquilerdatetimenotnull,fx_devoluciondatetimenull ); ALTERTABLEtAlquileresADD CONSTRAINTPK_tAlquileresprimarykey(codigo), CONSTRAINTFK_Clientesforeignkey(codigo_cliente) referencestClientes(Codigo), CONSTRAINTFK_Cochesforeignkey(matricula) referencestCoches(matricula); Bien, en este cdigo creamos la tabla tAlquileres, y luego mediante una sentencia ALTERTABLEaadimosunaclaveprimariallamadaPK_tAlquileresenelcampocodigo, una clave externa llamadaFK_Clientesreferenciadaal codigo de la tabla tClientes, y porltimootraclaveexternallamadaFK_Cochesreferenciadaalcampomatriculadela tablatCoches. Nota: Cuandocreamosunaclaveexternaelcamporeferenciadoyelquesirvedereferencia debenserdelmismotipodedatos. Sisomosobservadoresnosdaremoscuentaqueloscamposquesirvendereferenciaa las claves forneasson las claves primariasde sus tablas. Slo podemoscrear claves externasquereferencienclavesprimarias.

10

Ing. Mario Valle Al igual que ocurra con la sentencia CREATE TABLE cada gestor de bases de datos implementa sus mejoras, siendo la mejor forma de conocerlas recurrir a la documentacindelgestordebasesdedatos. Enprincipio,paraborrarcolumnasdeunatabladebemos: 1. Crearunatablaconlanuevaestructura. 2. Transferirlosdatos 3. Borrarlatablaoriginal. Y digo en principio, porque como ya hemos comentado segn el gestor de bases de datos con el que trabajemos podremos realizar esta tarea a travs de una sentencia ALTER TABLE. Eliminacindetablas. PodemoseliminarunatabladeunabasededatosmediantelainstruccinDROP TABLE. DROP TABLE <nombre_tabla>; LainstruccinDROP TABLE eliminadeformapermanentelatablaylosdatosenella contenida.Siintentamoseliminarunatablaquetengaregistrosrelacionadosatravs de una clave externa la instruccin DROP TABLE fallar por integridad referencial. Cuandoeliminamosunatablaeliminamostambinsusndices.

Definicin dendices Unndiceesunaestructuradedatosquepermiteaccederadiferentesfilasdeuna mismatablaatravsdeuncampo(ocamposclave). Unndicepermiteunaccesomuchomsrpidoalosdatos. Introduccin alosndices. Paraentenderloqueesunndicedebemossaberprimerocomosealmacenala informacininternamenteen las tablasde unabasede datos.Cadatablase divideen pginasdedatos,imaginemosunlibro,podramosescribirloen"unasolahojaenorme" alestilopergaminoegipcio,obienenpginasalasquepodemosaccederrpidamentea travsdeunndice.Estideaeslaqueseaplicaenelmundodelasbasesdedatos,la informacinestaguardadaenunatabla(ellibro)quetienemuchashojasdedatos(las pginas del libro), con un ndice en el que podemos buscar la informacin que nos interesa.
11

Ing. Mario Valle Siqueremosbuscarlapalabrazapatoenundiccionario,quhacemos? Leemos todo el diccionario hasta encontrar la palabra, con lo que nos habremosledoeldiccionarioenterito(seguroqueaprenderamosmucho!) Buscamos en el ndice en que pgina est la letra z, y es en esa pgina donde buscamos. Niquedecirtienequelaopcindoseslacorrecta,yesdeestemodocomoseutilizaun ndiceenlasbasesdedatos,sedefineelndiceatravsdeuncampo(ocampos)yesa partirdeestepuntodesdedondesebusca.

Losndicesseactualizanautomticamentecuandorealizamosoperacionesdeescritura enlabasededatos.Esteesunaspectomuyimportantedecaraalrendimientodelas operacionesdeescritura,yaqueademsdeescribirlosdatosenlatablaseescribirn tambinenelndice.Unnmeroelevadodendicesharmslentasestasoperaciones. Sinembargo,salvocasosexcepcionales,elbeneficioqueaportanlosndicescompensa (delargo)estapenalizacin. Creacin dendices Lacreacindendices,comoyahemosvisto,permiteacelerarlasconsultasquese realizanenlabasededatos. LassentenciasdeSQLparamanipularndicesson: CREATEINDEX; DROPINDEX;

12

Ing. Mario Valle Lasintaxisparalacreacindendicesesla siguiente: CREATE[UNIQUE]INDEX<nombre_indice> ON<nombre_tabla>( <nombre_campo>[ASC|DESC] {,<nombre_campo>[ASC|DESC]}) ) ; LapalabraclaveUNIQUE especificaquenopuedenexistirclavesduplicadasenel ndice. ASC|DESC especificanelcriteriodeordenacinelegido,ascendenteodescendente,por defectoesascendente. Ejemplo: En el apartado dedicado a la definicin de tablas creamos la tabla tClientes, este ejemplocrea un ndice nico en el campo NIF. Esto nos permitir buscar mucho msrpidoporelcampoNIFynosasegurarquenotengamosdosNIFiguales. CREATEUNIQUEINDEXUIX_CLIENTES_NIF ONtCLIENTES(NIF); Las clavesprimariassonndices. Losnombresdelosndicesdebensernicos. ParaeliminarunndicedebemosemplearlasentenciaDROP INDEX. DROPINDEX<nombre_tabla>.<nombre_indice>; Ejemplo:Paraeliminarelndicecreadoanteriormente. DROPINDEXtCLIENTES.UIX_CLIENTES_NIF;

Vistas Enelmodelodedatosrelacionallaformadeguardarlainformacinnoeslamejor paraverlosdatos. Unavistaesunaconsulta,quereflejaelcontenidodeunaomstablas,desdela quesepuedeaccederalosdatoscomosifueraunatabla. Dossonlasprincipalesrazonesporlasquepodemoscrearvistas.


13

Ing. Mario Valle Seguridad,nospuedeninteresarquelosusuariostenganaccesoaunaparte delainformacinquehayenunatabla,peronoatodalatabla. Comodidad, como hemos dicho el modelo relacional no es el ms cmodo para visualizar los datos, lo que nos puede llevar a tener que escribir complejassentenciasSQL,tenerunavistanossimplificaestatarea. Lasvistasnotienenunacopiafsicadelosdatos,sonconsultasalosdatosquehayenlas tablas, por lo que si actualizamos los datos de una vista, estamos actualizando realmentelatabla,ysiactualizamoslatablaestoscambiossernvisiblesdesdelavista. Nota: Nosiemprepodremosactualizarlosdatosdeunavista,dependerdelacomplejidadde lamisma(dependerdesielconjuntoderesultadostieneaccesoalaclaveprincipalde latablaono),ydelgestordebasededatos.Notodoslosgestoresdebasesdedatos permiten actualizar vistas, ORACLE, por ejemplo, no lo permite, mientras que SQL Servers. Creacin devistas. Para crear una vista debemos utilizar la sentencia CREATE VIEW, debiendo proporcionarunnombrealavistayunasentenciaSQLSELECTvlida. CREATEVIEW<nombre_vista> AS (<sentencia_select>); Ejemplo:Crearunavistasobrenuestratablaalquileres,enlaquesenosmuestre elnombreyapellidosdelclienteenlugardesucdigo. CREATEVIEWvAlquileres AS ( SELECTnombre, apellidos,matricula FROMtAlquileres, tClientes WHERE(tAlquileres.codigo_cliente=tClientes.codigo) ) Si queremos, modificar la definicin de nuestra vista podemos utilizar la sentencia ALTER VIEW,deformamuyparecidaacomolohacamosconlastablas.Enestecaso queremosaadirloscamposfx_alquileryfx_devolucionalavista. ALTERVIEWvAlquileres AS (
14

Ing. Mario Valle SELECTnombre, apellidos,matricula,fx_alquiler,fx_devolucion FROMtAlquileres, tClientes WHERE(tAlquileres.codigo_cliente=tClientes.codigo)) Por ltimo podemos eliminar la vista a travs de la sentencia DROP VIEW. Para eliminarlavistaquehemoscreadoanteriormenteseutilizara: DROPVIEWvAlquileres; Unavistaseconsultacomosifueseunatabla. Sinnimos. Unsinnimoesunnombrealternativoqueidentificaunatablaenlabasededatos.Con un sinnimo se pretende normalmente simplificar el nombre original de la tabla, aunque tambin se suelen utilizar para evitar tener que escribir el nombre del propietariodelatabla. Notodas lasbasesdedatos soportanlossinnimos. ParacrearunsinnimohayqueutilizarlasentenciaCREATESYNONYMespecificando el nombre que deseamos utilizar como sinnimo y la tabla para la que estamos creandoelsinnimo. CREATESYNONYM<nombre_sinonimo> FOR<nombre_tabla>; Ejemplo:ElsiguienteejemplocreaelsinnimoCochesparalatablatCoches. CREATESYNONYMCoches FORtCoches;

ParaeliminarelsinnimocreadodebemosemplearlasentenciaDROP SYNONYM. DROPSYNONYMCoches;

15

Ing. Mario Valle Consulta dedatos. El proceso ms importante que podemos llevar a cabo en una base de datos es la consultadelosdatos.Denadaserviraunabasededatossinopudiramosconsultarla. Esademslaoperacinqueefectuaremosconmayorfrecuencia. ParaconsultarlainformacinSQLponeanuestradisposicinlasentenciaSELECT. Lasentencia SELECT LasentenciaSELECTnospermiteconsultarlosdatosalmacenadosenunatablade labasededatos. Elformatodelasentenciaselectes: SELECT[ALL |DISTINCT] <nombre_campo>[{,<nombre_campo>}] FROM <nombre_tabla>|<nombre _vista> [{,<nombre_tabla>|<nomb re_vista>}] [WHERE <condicion> [{ AND|OR <condicion>}]] [GROUP BY <nombre_campo> [{,<nombre_campo >}]] [HAVING <condicion>[{AND|OR<condicion>}]] [ORDER BY <nombre_campo>|<indice_campo> [ASC | DESC] [{,<nombre_campo>|<indice_campo> [ASC|DESC]}]]

16

Ing. Mario Valle Veamosporpartesquequieredecircadaunadelaspartesqueconformanlasentencia. Nomenclatura Sentencia Significado SELECT PalabraclavequeindicaquelasentenciadeSQLquequeremos ejecutaresdeseleccin. ALL Indica que queremos seleccionar todos los valores. Es el valor pordefectoynosueleespecificarsecasinunca. DISTINCT FROM Indicaquequeremosseleccionarslolosvaloresdistintos. Indica la tabla (o tablas) desde la que queremosrecuperarlos datos.Enelcasodequeexistamsdeunatablasedenominaa la consulta "consulta combinada" o "join". En las consultas combinadasesnecesarioaplicarunacondicindecombinacin atravsdeunaclusulaWHERE. Especificaunacondicinquedebecumplirseparaquelosdatos seandevueltosporlaconsulta.Admitenlosoperadoreslgicos ANDyOR. Especificalaagrupacinquesedaalosdatos.Seusasiempreen combinacinconfuncionesagregadas. Especifica una condicin que debe cumplirse para los datos. Especificaunacondicinquedebecumplirseparaquelosdatos seandevueltosporlaconsulta.Sufuncionamientoessimilaral de WHERE pero aplicado al conjunto de resultados devueltos porlaconsulta.DebeaplicarsesiemprejuntoaGROUP BYyla condiciondebeestarreferidaaloscamposcontenidosenella. Presenta el resultado ordenado por las columnas indicadas. El orden puede expresarse con ASC (orden ascendente) y DESC (ordendescendente).ElvalorpredeterminadoesASC.

WHERE

GROUP BY HAVING

ORDER BY

ParaformularunaconsultaalatablatCoches(creadaenelcaptulodetablas)y recuperar los campos matricula, marca, modelo, color, numero_kilometros, num_plazas debemos ejecutar la siguiente consulta. Los datos sern devueltos ordenadospormarcaypormodeloenordenascendente,demenoramayor. SELECTmatricula,marca,modelo,color,numero_kilometros,num_plazas FROM tCoches ORDER BYmarca,modelo;

17

Ing. Mario Valle LapalabraclaveFROM indicaquelosdatossernrecuperadosdelatablatCoches. Podramoshaberespecificadomsdeunatabla,peroestoseverenelapartadode consultascombinadas. Tambinpodramoshabersimplificadolaconsultaatravsdelusodelcomodn decampos,elasterisco"*". SELECT* FROM tCoches ORDER BYmarca,modelo; Elusodelasteriscoindicaquequeremosquelaconsultadevuelvatodosloscampos queexistenenlatabla. LaclusulaWHERE La clusula WHERE es la instruccin que nos permite filtrar el resultado de una sentenciaSELECT.Habitualmentenodeseamosobtenertodalainformacinexistente enlatabla,sinoquequeremosobtenerslolainformacinquenosresultetilesese momento.LaclusulaWHEREfiltralosdatosantesdeserdevueltosporlaconsulta. Ennuestroejemplo,siqueremosconsultaruncocheenconcretodebemosagregar una clusula WHERE. Esta clusula especifica una o varias condiciones que deben cumplirseparaquelasentenciaSELECTdevuelvalosdatos.Porejemplo,paraquela consulta devuelva slo los datos del coche con matrcula M1525ZA debemos ejecutarlasiguientesentencia: SELECTmatricula,marca,modelo,color, numero_kilometros,num_plazas FROM tCoches WHEREmatricula='M1525ZA'; Cuando en una clusula where queremos incluir un tipo texto, debemos incluir el valorentrecomillassimples. Adems, podemos utilizar tantas condiciones como queramos, utilizando los operadores lgicos AND y OR . El siguiente ejemplo muestra una consulta que devolverloscochescuyasmatriculasseanM1525ZAobienM2566AA. SELECTmatricula,marca,modelo,color, numero_kilometros,num_plazas FROM tCoches WHEREmatricula='M1525ZA' OR matricula='M2566AA';
18

Ing. Mario Valle Adems una condicin WHERE puede ser negada a travs del operador lgico NOT. LasiguienteconsultadevolvertodoslosdatosdelatablatCochesmenosel quetengamatrculaM1525ZA. SELECTmatricula,marca,modelo,color, numero_kilometros,num_plazas FROM tCoches WHERENOT matricula='M1525ZA' ; Podemos tambin obtener las diferentes marcas y modelos de coches ejecutando la consulta. SELECTDISTINCTmarca,modelo FROM tCoches; La ver los valores distintos. En el caso anterior se devolvern la palabra clave DISTINCT indica que slo queremos os valores distintos del par formado por los camposmarcaymodelo. LaclusulaORDERBY Comoyahemosvistoenlosejemplosanteriorespodemosespecificarelordenen elqueserndevueltoslosdatosatravsdelaclusulaORDER BY. SELECTmatricula,marca,modelo,color,numero_kilometros,num_plazas FROM tCoches ORDER BYmarcaASC,modeloDESC; Como podemos ver en el ejemplo podemos especificar la ordenacin ascendente o descendenteatravs de las palabras clave ASCy DESC.La ordenacin depende del tipo de datos que estdefinidoenlacolumna,deformaqueuncamponumrico ser ordenado como tal, y unalfanumrico se ordenar de la A a la Z, aunque su contenidoseanumrico.Deestaformaelvalor100sedevuelveantesqueel11. Tambin podemos especificar el en la clusula ORDER BY el ndice numrico del campo dentro de la sentencia SELECT para la ordenacin, el siguiente ejemplo ordenaralosdatosporelcampomarca,yaqueapareceensegundolugardentrodela listadecamposquecomponenlaSELECT. SELECTmatricula,marca,modelo,color,numero_kilometros,num_plazas FROM tCoches ORDER BY2;
19

Ing. Mario Valle Insertardatos. Hastaahorahemosvistocomosealmacenanlosdatosenunabasededatosycomo consultaresosdatosalmacenados,peronohemosvistocomoalmacenardichosdatos. Paraalmacenardatosenunabasededatosdebemosinsertarfilasenlastablas.Para ellosSQLponeanuestradisposicinlasentenciaINSERT. Insercin defilas Elprocesodeinsercindefilasconsisteenaadiraunatablaunaomsfilasyencada filatodosopartedesuscampos. Podemosdistinguirdosformasdeinsertarfilas: Insercinindividualdefilas. Insercinmltipledefilas. LasintaxisdelasentenciaINSERT esdiferentesegncualseanuestropropsito. Slopodremosomitiruncampoalefectuarunainsercincuandoesteaceptevalores nulos. Insercin individualdefilas PararealizarlainsercinindividualdefilasSQLposeelainstruccinINSERT INTO.La insercinindividualde filas es la que ms comnmenteutilizaremos.Su sintaxises la siguiente: INSERTINTO <nombre_tabla> [(<campo1>[,<campo2>, ...])]values (<valor1>,<valor2>,...); Comosepuedeobservarlasentenciatienedospartesclaramentediferenciadas,porun ladolapropiaINSERT INTO seguidadelalistadecamposenlosquequeremosinsertar losdatos,yporotrolalistadevaloresquequeremosinsertarenloscampos.Lamejor formadeverestoesatravsdeunejemplo. INSERTINTOtCoches (matricula,marca ,modelo ,color ,numero_kilometros) values ('M1111CA','RENAULT','MEGANETR100','NEGRODIAMANTE',78000);
20

Ing. Mario Valle ConestasentenciaINSERT creamosunregistroenlatablatCochesconlosvalores especificados, es decir, la matricula tendr el valor M1111CA, la marca ser RENAULTyassucesivamente. QuocurrirasiyaexistierauncocheconlamatrculaM1111CA?Seproducir un error, porquehemosdefinidola clave primariaen el campomatricula, ycomo hemosvistolaclaveprimariadebesernica. Si omitimosalgnpar " campovalor" en la sentenciaINSERT, pueden ocurrirvarias cosas: Queseproduzcaunerror,sielcampo noaceptavaloresnulos. Quesegraveelregistroysedejenuloelcampo,cuandoelcampoaceptevalores nulos. Quesegraveelregistroysetomeelvalorpordefecto,cuandoelcampotenga definidounvalorpordefecto. Quehacerencadamomentodependerdelprograma. Porejemplo,lasiguientesentenciacrearunregistroenlatablatCochesconelcampo numero_kilometroscero,yaqueesteessuvalorpordefecto. INSERTINTOtCoches (matricula,marca ,modelo ,color ,numero_kilometros) values ('M1111CA','RENAULT','MEGANETR100','NEGRODIAMANTE',78000); Insercin mltiple defilas LasentenciaINSERT permitetambininsertarvariosregistrosenunatabla.Pareellose utiliza una combinacin de la sentencia INSERT junto a una sentencia SELECT. El resultadoesqueseinsertantodoslosregistrosdevueltosporlaconsulta. INSERTINTO <nombre_tabla> [(<campo1>[,<campo2 >,...])]SELECT [(<campo1>[,<campo2 >,...])]FROM <nombre_tabla_origen>; Parapoderutilizarlainsercinmltipledefilassedebencumplirlassiguientesnormas: La lista de campos de las sentencias insert y select deben coincidir en nmeroytipodedatos.
21

Ing. Mario Valle Ninguna de las filas devueltas por la consulta debe infringir las reglas de integridaddelatablaenlaquevayamosarealizarlainsercin. Pongamosunejemplo,vamosacrearunatablaconlasdiferentesmarcasquetenemos enlabasededatos.LasentenciaSQLparacrearlatablaeslasiguiente: CREATETABLEtMarcas ( codigo integernotnullidentity(1,1), marca varchar(255), constraintPK_Marcasprimarykey(codigo) ); Nota:Hemosincluidolafuncinidentityparaelcampocodigo,estafuncinespropia de SQL Server e indica que el cdigo se genera automticamentecada vez que se insertaunregistroconunvalorautonumrico.Prcticamentetodoslosgestoresde basesdedatosdanlaopcindelcampoautonumricooincremental. Unavezquetenemoscreadalatablademarcasvamosainsertarotroparderegistros enlatablade coches,paraelloutilizamosunasentenciainsertinto paraunanica fila. INSERTINTOtCoches (matricula,marca ,modelo ,color) values ('M2233FH','SEAT','LEONFR','ROJO'); INSERTINTOtCoches (matricula,marca ,modelo ,color) values ('M1332FY','FORD','FIESTA','GRISPLATA'); AhoratenemostresmarcasdiferentesenlatablatCoches,yqueremosinsertarlasenla tabla de marcas, para ello podemos realizar tres inserciones individuales, pero que pasara si no supiramos de antemano el nmero de marcas? y si fueran unas cincuenta marcas?. Nos podramos pasar el da entero escribiendo sentencias insert into. Afortunadamentepodemosrealizarunainsercinmltipledelsiguientemodo: INSERTINTOtMarcas (marca) SELECTDISTINCTmarcaFROMtCoches;

22

Ing. Mario Valle ComoresultadoobtenemosunregistroenlatablatMarcasporcadamarcadelatabla tCoches. Elcampocodigosehageneradoautomticamenteyaqueestdefinidocomo identidad. CODIGO MARCA 1 FORD 2 RENAULT 3 SEAT Dmonos cuenta de que el orden de generacin no ha sido el mismo que el de insercin,sinoquesehaaplicadoelordenenelquehansidodevueltoslosdatosporla sentenciaSELECT. AhoradeberamoscambiarlosdatosdelatablatCoches,paraguardarelcdigodela marcaenlugardesudescripcin,peroparaellonecesitamossabercmomodificarun datograbado...Esmomentodepasaralsiguientepunto,laactualizacindedatos.

Borradodedatos Lasentencia DELETE. Paraborrardatosdeunatabla,debemosutilizarlasentenciaDELETE.Lasintaxisdela sentenciaDELETEeslasiguiente: DELETEFROM <nombre_tabla>[ WHERE <condicion>]; ElsiguienteejemploilustraelusodelasentenciaDELETE.Esbuenaideaespecificaren la sentenciaWHERE los camposque formanla clave primariade la tabla para evitar borrardatosquenoqueramoseliminar. DELETEFROMtCoches WHEREmarca='SEAT'; La sintaxis de DELETE varia en Access, siendo necesario el uso del comodn *. DELETE*FROM<tCoches> Cuando trabajemos con la sentencia DELETE debemos tener en cuenta las siguientes consideraciones:
23

Ing. Mario Valle Solopodemosborrardatosdeunanicatabla. Cuando borramos datos de una vista, los estamos borrando tambin de la tabla.Lasvistassonsolounaformadeverlosdatos,nounacopia. Si intentamosborrarun registrode unatabla referenciadapor una FOREING KEY comotablamaestra,silatabladependientetieneregistrosrelacionadosla sentenciaDELETEfallar.

Lasentencia TRUNCATE

Para realizar un borrado completo de tabla debemos considerar la posibilidad de utilizarlasentenciaTRUNCATE, muchomsrpidaqueDELETE. LasintaxisdelasentenciaTRUNCATEeslasiguiente: TRUNCATETABLE<nombre_tabla>; ElsiguienteejemplomuestraelusodelasentenciaTRUNCATE. TRUNCATETABLEtCoches; Cuando trabajemoscon la sentenciaTRUNCATE debemostener en cuenta las siguientesconsideraciones. LasentenciaTRUNCATEnoestransaccional.Nosepuededeshacer. LasentenciaTRUNCATEnoadmiteclausulaWHERE.Borratodalatabla. NotodoslosgestoresdebasesdedatosadmitenlasentenciaTRUNCATE.

Actualizacindedatos Lasentencia UPDATE. Para la actualizacin de datos SQL dispone de la sentencia UPDATE. La sentencia UPDATE permite la actualizacin de uno o varios registros de una nica tabla. La sintaxisdelasentenciaUPDATE eslasiguiente UPDATE<nombre_tabla> SET <campo1>=<valor1> {[,<campo2> = <valor2>,...,<campoN> = <valorN>]}[WHERE<condicion>]; LassiguientessentenciasactualizanlosdatosdelatablatCochesconlosvaloresde la tabla tMarca obtenidos anteriormente en la pgina dedicada a la insercin de datos.
24

Ing. Mario Valle UPDATEtCoches SET marca='1' WHEREmarca='FORD'; UPDATEtCoches SET marca='2' WHEREmarca='RENAULT'; UPDATEtCoches SET marca='3' WHEREmarca='SEAT'; Ntese que los valores para el campo marca aparecen entrecomillados, ya que es un campodetipovarchar.Losvaloresconlosqueactualicemoslosdatosdebenserdeltipo delcampo. Unaspectoatenerencuentaesqueloscamposqueformanlaprimarykeydeunatabla slosepodrnmodificarsilosregistrosnoestnreferenciadosenningunaotratabla.En nuestro caso slo podremos modificar la matrcula de un coche si no tiene registros asociadosenlatablatAlquileres. Estopuedecausarproblemas,yaquepodramoshabernosequivocadoaldardealtael cocheen la tablatCoches ydetectarel errordespusdealquilarel coche.Ental caso tendramosdardealtaunnuevococheconlamatrculacorrecta,actualizarlosregistros de la tabla alquileres ypor ltimo borrar el registroerrneo de la tabla tCoches.Este procesopuedeserbastantecomplicadoenelcasodequeexistirnmsrelacionesconla tabla.Sepodraconsiderarquelaclaveprimariadelatablaestmaldefinidayquela matrculanodebeserelelementoqueidentifiqueelcoche.Unaalternativaseriacrear uncdigoautonumricoparalatablatCochesquerealizarlasvecesdeclaveprimariay crearunndicenicoparalamatrcula,estediseotambintienesus"pegas",porloque debemos decidir qu modelo utilizar, y seleccionar las claves primarias con sumo cuidado. UsodesubconsultasconUPDATE Hasta ahora hemos actualizado los datos con valores que conocemos de antemano, peroquocurrecuandoesosdatosdebentomarsedeotratabladelabasededatos?. Podramosdisearunprogramaquerecorrieratodalatablaybuscarelvaloradecuado paracadaregistroyloactualizase.Sindudaesunasolucin,yenocasionescasilanica, pero es una solucin cara y compleja que adems exige que conozcamos algn otro lenguaje de programacin. Para estos casos podemos utilizar subconsultas con la sentenciaUPDATE.
25

Ing. Mario Valle Lasintaxiseslasiguiente: UPDATE<nombre_tabla> SET <campo1>=<valor1>|<subconsulta1> {[,<campo2>=<valor2>|<subconsulta2> ,... , <campoN> = <valorN> | <subconsultaN>]}[WHERE<condicion>]; ComopuedeverselasintaxisesprcticamenteigualalasintaxisdelasentenciaUPDATE, conlasalvedaddequepodemosutilizarsubconsultasenlugardevaloresalasignarlos campos. De forma genrica podemos decir que las subconsultasson consultas SELECT incluidasdentrodeotrasentenciaSQL. LassiguientessentenciasUPDATE sonequivalentes: Utilizando sentencias UPDATE normales: UPDATEtCoches SET marca='1' WHEREmarca='FORD'; UPDATEtCoches SET marca='2' WHEREmarca='RENAULT'; UPDATEtCoches SET marca='3' WHEREmarca='SEAT'; UtilizandosentenciasUPDATEcombinadasconsubconsultas: UPDATEtCoches SET marca=(SELECTCODIGOFROMtMarcas WHEREtMarcas.Marca=tCoches.Marca) WHEREmarcaIN('FORD','RENAULT','SEAT'); Por cada registro de la tabla tCoches se ejecutar la subconsulta, actualizando el campomarcaalvalordelcdigodelamarcaenlatablatMarcas. Elusodesubconsultasparaactualizardatostienealgunaslimitaciones: Lasubconsultaslopuededevolverunnicocampo. Lasubconsultaslopuededevolverunsloregistro. El tipodedatosdevueltoporlasubconsultadebeserdelmismotipoqueel campoalqueestamosasignandoelvalor. No todos los sistemas de bases de datos permiten usar subconsultas para actualizardatos(Access)aunquesiunabuenapartedeellos(ORACLE,SQLServer, Sybase...)
26

Ing. Mario Valle PeroennuestroejemploelcampocodigodelatablatMarcasesnumricoyelcampo marcadelatablatCochesestexto.Porqufunciona?Muyfcil,elmotordelabasede datosescapazdeconvertirelvalornumricoaunvalortextodeformaautomtica,si bienestaesunaexcepcin. Ahora que ya tenemos modificado el valor de la marca de los registros, es convenientemodificarsutipodedatosycrearunaforeignkeycontralatablatMarcas. Paraello ejecutaremoslassiguientessentencias. ALTER TABLE tCoches altercolumn marcaint not null; LaopcinaltercolumnespropiadeSQLServer.Paramodificareltipodedatos deunatabladebemosconsultarlaayudadelgestordebasesdedatos. ALTER TABLE tCoches add constraintFK_Coches_Marcasforeignkey(marca) referencestMarcas(codigo);

Consultascombinadas. OINS J Consultas combinadas. Habitualmente cuando necesitamos recuperar la informacin de una base de datos nos encontramos con que dicha informacin se encuentra repartida en varias tablas, referenciadasatravsdevarioscdigos.Deestemodosituviramosunatabladeventascon uncampocliente,dichocampocontendraelcdigodelclientedelatabladecliente. Sin embargo est forma de almacenar la informacin no resulta muy til a la hora de consultarlosdatos.SQL nosproporcionaunaformafcildemostrarlainformacinrepartida envariastablas,lasconsultas combinadasoJOINS. Lasconsultascombinadaspuedenserdetrestipos: Combinacininterna Combinacinexterna Uniones

27

Ing. Mario Valle Combinacin interna. La combinacininterna nos permite mostrar los datos de dos o ms tablas a travsdeunacondicinWHERE. Si recordamos los ejemplos de los captulos anteriores tenemos una tabla de coches,enlaquetenemosreferenciadalamarcaatravsdelcdigodemarca.Para realizarlaconsultacombinadaentreestasdostablasdebemosescribirunaconsulta SELECT en cuya clusula FROM escribiremos el nombre de las dos tablas, separadosporcomas,yunacondicinWHEREqueobligueaqueelcdigodemarca delatabladecochesseaigualalcdigodelatablademarcas. Lomssencilloesverunejemplodirectamente: SELECTtCoches.matricula, tMarcas.marca, tCoches.modelo, tCoches.color, tCoches.numero_kilometros, tCoches.num_plazas FROMtCoches,tMarcas WHEREtCoches.marca=tMarcas.codigo Lamismaconsultadeforma"visual"seraalgoas:

Dmonos cuenta que hemos antepuesto el nombre de cada tabla al nombre del campo, esto no es obligatorio si los nombres de campos no se repiten en las tablas, peroesaconsejableparaevitarconflictosdenombresentrecampos.Porejemplo,si para referirnos al campo marca no anteponemosel nombre del campo la base de datosnosabesiqueremoselcampomarcadelatablatCoches,quecontieneelcdigo delamarca,oelcampomarcadelatablatMarcas,quecontieneelnombredelamarca. Otra opcin es utilizar la clusula INNERJOIN. Su sintaxis es idntica a la de una consultaSELECThabitual,conlaparticularidaddequeenlaclusulaFROM sloaparece unatablaovista,aadindoseelrestodetablasatravsdeclusulasINNER JOIN.

28

Ing. Mario Valle SELECT[ALL|DISTINCT] <nombre_campo>[{,<nombre_campo>}] FROM<nombre_tabla> [{INNERJOIN <nombre_tabla>ON<condicion_combinacion>}] [WHERE<condicion>[{AND|OR<condicion>}]] [GROUP BY <nombre_campo> [{,<nombre_campo >}]] [HAVING <condicion>[{AND|OR<condicion>}]] [ORDERBY<nombre_campo>|<indice_campo>[ASC|DESC] [{,<nombre_campo>|<indice_campo>[ASC|DESC]}]] ElejemploanteriorescritoutilizandolaclusulaINNER JOIN quedaradelasiguiente manera: SELECTtCoches.matricula, tMarcas.marca, tCoches.modelo, tCoches.color, tCoches.numero_kilometros, tCoches.num_plazas FROMtCoches INNERJOINtMarcasONtCoches.marca=tMarcas.codigo La clusula INNER JOIN permite separar completamente las condiciones de combinacinconotroscriterios,cuandotenemosconsultasquecombinannueveodiez tablasestorealmenteseagradece.Sinembargomuchosprogramadoresnosonamigos delaclusulaINNER JOIN,laraznesqueunodelosprincipalesgestoresdebasesde datos, ORACLE, no la soportaba. Si nuestro programa deba trabajar sobre bases de datos ORACLE no podamos utilizar INNER JOIN. A partir de la versin ORACLE 9i Oraclesoportalaclusula INNER JOIN. Combinacin Externa Lacombinacininternaesexcluyente.Estoquieredecirquesiunregistronocumplela condicindecombinacinnoseincluyeenlosresultados.Deestemodoenelejemplo anteriorsiuncochenotienegrabadalamarcanosedevuelveenmiconsulta. Segnlanaturalezadenuestraconsultaestopuedeserunaventaja,peroenotroscasos significa un serio problema. Para modificar este comportamientoSQL pone a nuestra disposicinlacombinacinexterna.Lacombinacinexternanoesexcluyente. Lasintaxisesmuyparecidaalacombinacininterna,
29

Ing. Mario Valle

SELECT[ALL|DISTINCT] <nombre_campo>[{,<nombre_campo>}] FROM<nombre_tabla> [{LEFT|RIGHTOUTERJOIN <nombre_tabla>ON<condicion_combinacion>}] [WHERE<condicion>[{AND|OR <condicion>}]][GROUPBY<nombre_campo> [{,<nombre_campo>}]][HAVING <condicion>[{AND|OR<condicion>}]] [ORDERBY<nombre_campo>|<indice_campo>[ASC|DESC] [{,<nombre_campo>|<indice_campo>[ASC| DESC]}]] La combinacin externa puede ser diestra o siniestra, LEFT OUTER JOIN o RIGHT OUTERJOIN. ConLEFT OUTER JOINobtenemostodoslosregistrosdeenlatablaque situemos a la izquierda de la clusula JOIN, mientras que con RIGHT OUTER JOIN obtenemoselefectocontrario. Comomejorsevelacombinacinexternaesconunejemplo. SELECTtCoches.matricula, tMarcas.marca, tCoches.modelo, tCoches.color, tCoches.numero_kilometros, tCoches.num_plazas FROMtCoches LEFTOUTERJOINtMarcasONtCoches.marca=tMarcas.codigo Estaconsultadevolvertodoslosregistrosdela tablatCoches,independientemente dequetenganmarcaono.Enelcasodequeelcochenotengamarcasedevolverel valornull paraloscamposdelatablatMarcas. Visualmentelaconsultasereflejaas:

30

Ing. Mario Valle ElmismoejemploconRIGHTOUTERJOIN. SELECTtCoches.matricula, tMarcas.marca, tCoches.modelo, tCoches.color, tCoches.numero_kilometros, tCoches.num_plazas FROMtCoches RIGHTOUTERJOINtMarcasONtCoches.marca=tMarcas.codigo EstaconsultadevolverlosregistrosdelatablatCochesquetenganmarcarelacionada ytodoslosregistrosdelatablatMarcas,tenganalgnregistroentCochesono. Visualmentelaconsultasereflejaas:

Union

La clusulaUNION permiteunir dos o ms conjuntosde resultadosen uno detrs del otrocomosisetratasedeunanicatabla.Deestemodopodemosobtenerlosregistros demsdeunatabla"unidos". La sintaxis corresponde a la de varias SELECT unidas a travs de UNION, como se muestraacontinuacin: SELECT[ALL|DISTINCT] <nombre_campo>[{,<nombre_campo>}] FROM<nombre_tabla> [{LEFT|RIGHTOUTERJOIN <nombre_tabla>ON<condicion_combinacion>}] [WHERE<condicion>[{AND|OR<condicion>}]] [GROUPBY<nombre_campo>[{,<nombre_campo>}]] [HAVING<condicion>[{AND|OR<condicion>}]] {
31

Ing. Mario Valle UNION[ALL|DISTINCT] SELECT[ALL|DISTINCT] <nombre_campo>[{,<nombre_campo>}] FROM<nombre_tabla> [{LEFT|RIGHTOUTERJOIN <nombre_tabla>ON<condicion_combinacion>}] [WHERE<condicion>[{AND|OR<condicion>}]] [GROUPBY<nombre_campo> [{,<nombre_campo>}]][HAVING<condicion>[{ AND|OR<condicion>}]] } [ORDERBY<nombre_campo>|<indice_campo>[ASC|DESC] [{,<nombre_campo>|<indice_campo>[ASC|DESC]}]] ParautilizarlaclusulaUNIONdebemoscumplirunaseriedenormas. Las consultas a unir deben tener el mismo nmero campos, y adems los camposdebenserdelmismotipo. SlopuedehaberunanicaclausulaORDER BYalfinaldelasentenciaSELECT. ElsiguienteejemplomuestraelusodeUNION SELECTtCoches.matricula, tMarcas.marca, tCoches.modelo, tCoches.color, tCoches.numero_kilometros, tCoches.num_plazas FROMtCoches INNERJOINtMarcasONtCoches.marca=tMarcas.codigo UNION SELECTtMotos.matricula, tMarcas.marca, tMotos.modelo, tMotos.color, tMotos.numero_kilometros FROMtMotos INNERJOINtMarcasONtMotos.marca=tMarcas.codigo; Puedeobservarseelusodelaconstanteceroenla segundalistadeseleccin para hacercoincidirelnmeroytipodecamposquedevuelvelaconsultaUNION.

32

Ing. Mario Valle Consultasagregadas LaclusulaGROUPBY La clusula GROUP BY combina los registros con valores idnticos en un nico registro.Paracada registro se puedecrear un valoragregadosi se incluye una funcin SQLagregada,comoporejemploSumoCount,enlainstruccinSELECT.Susintaxises: SELECT[ALL|DISTINCT] <nombre_campo> [{,<nombre_campo>}] [{,<funcion_agregado>}] FROM<nombre_tabla>|<nombre_vista> [{,<nombre_tabla>|<nombre_vista >}] [WHERE <condicion> [{ AND|OR <condicion>}]] [GROUPBY <nombre_campo> [{,<nombre_campo >}]] [HAVING <condicion>[{AND|OR<condicion>}]] [ORDER BY <nombre_campo>|<indice_campo> [ASC | DESC][{,<nombre_campo>|<indice_campo>[ASC |DESC]}]] GROUP BY es opcional. Si se utiliza GROUP BY pero no existe una funcin SQL agregadaenlainstruccinSELECTseobtieneelmismoresultadoqueconunaconsulta SELECT DISTINCT. Los valores Null en los campos GROUP BY se agrupan y no se omiten. No obstante, los valores Null no se evalan en ninguna de las funciones SQL agregadas. Todos los campos de la lista de campos de SELECT deben incluirse en la clusula GROUP BYocomoargumentosdeunafuncinSQLagregada. SELECTmarca,modelo,SUM(numero_kilometros) FROMtCoches GROUPBYmarca,modelo LaclusulaHAVING Una vez que GROUP BY ha combinado los registros, HAVING muestra cualquier registro agrupado por la clusula GROUP BY que satisfaga las condiciones de la clusula HAVING.SeutilizalaclusulaWHEREparaexcluiraquellasfilasquenodesea agrupar,ylaclusulaHAVINGparafiltrarlosregistrosunavezagrupados. HAVING es similar a WHERE, determina qu registros se seleccionan. Una vez que los registros se han agrupado utilizando GROUP BY, HAVINGdetermina cules
33

Ing. Mario Valle de ellos se van amostrar.HAVING permiteelusodefuncionesagregadas. SELECTmarca,modelo,SUM(numero_kilometros) FROMtCoches WHEREmarca<>'BMW' GROUPBYmarca,modelo HAVINGSUM(numero_kilometros)>100000 Enel ejemplo anterior,no se cuentanlos datos para todas las marcasmenos"BMW", unavezquese han contado, se evala HAVING,y el conjunto de resultados devuelve solo aquellosmodelosconmsde100.000km. AVG Calcula la media aritmtica de un conjunto de valores contenidos en un campo especificadodeunaconsulta. Susintaxiseslasiguiente: AVG(<expr>) En donde expr representa el campo que contiene los datos numricos para los que se desea calcular la media o una expresin que realiza un clculo utilizando los datos de dicho campo. Lamedia calculadapor Avg es la media aritmtica (la suma de losvaloresdivididoporel nmerodevalores).LafuncinAvgnoincluyeningncampo Nullenelclculo. SELECTmarca,modelo,AVG(numero_kilometros) FROMtCoches GROUPBYmarca,modelo Count Calculaelnmeroderegistrosdevueltosporunaconsulta. Susintaxiseslasiguiente:

COUNT(<expr>) Endondeexprcontieneelnombredelcampoquedeseacontar.Losoperandosdeexpr puedenincluirelnombredeuncampodeunatabla,unaconstanteounafuncin(la cual puede ser intrnseca o definida por el usuario pero no otras de las funciones agregadasdeSQL).Puedecontarcualquiertipodedatosinclusotexto. Aunqueexprpuederealizarunclculosobreuncampo,Countsimplementecuentael
34

Ing. Mario Valle nmeroderegistrossintenerencuentaquvaloressealmacenanenlosregistros.La funcinCountnocuentalosregistrosquetienencamposnullamenosqueexprseael carctercomodnasterisco(*).Siutilizaunasterisco,Countcalculaelnmerototalde registros, incluyendo aquellos que contienen campos null. Count(*) es considerablementemsrpidaqueCount(Campo).Nosedebeponerelasteriscoentre doblescomillas('*'). SELECTCOUNT(*) FROMtCoches;SELECT marca, COUNT(modelo)FROM tCoches GROUPBYmarca; SELECTmarca,COUNT(DISTINCTmodelo) FROMtCoches GROUPBYmarca;

Max,Min Devuelvenelmnimooelmximodeunconjuntodevalorescontenidosenuncampo especificodeunaconsulta.Susintaxises: MIN(<expr>) MAX(<expr>) En donde expr es el campo sobre el que se desea realizar el clculo. Expr puede incluir el nombre de un campo de una tabla, una constante o una funcin (la cual puedeserintrnsecaodefinidaporelusuarioperonootrasdelasfuncionesagregadas deSQL). SELECT marca, modelo, MIN(numero_kilometros), MAX(numero_kilometros) FROM tCoches GROUPBY marca,modelo Sum Devuelvela suma del conjunto de valores contenidoen un campo especficode una consulta. Susintaxises: SUM(<expr>)
35

Ing. Mario Valle En donde expr representa el nombre del campo que contiene los datos que desean sumarseounaexpresinquerealizaunclculoutilizandolosdatosdedichoscampos. Los operandos de expr pueden incluir el nombre de un campo de una tabla, una constanteounafuncin(lacualpuedeserintrnsecaodefinidaporelusuarioperono otrasdelasfuncionesagregadasdeSQL). SELECT FROM GROUPBY marca, modelo, SUM(numero_kilometros) tCoches marca,modelo

Subconsultas Definicin desubconsultas. UnasubconsultaesunasentenciaSELECT queaparecedentrodeotrasentencia SELECT.NormalmenteseutilizanparafiltrarunaclausulaWHEREoHAVING con elconjuntoderesultadosdelasubconsulta,aunquetambinpuedenutilizarseen lalistadeseleccin. Porejemplopodramosconsultarelalquilerltimodeuncliente. SELECTCO_CLIENTE,NOMBRE,MARCA,MODELO FROMALQUILERES WHERECO_CLIENTE=1 AND FECHA_ALQUILER=(SELECTMAX(FECHA_ALQUILER) FROMALQUILERES WHERECO_CLIENTE=1) En este caso, la subconsulta se ejecuta en primer lugar, obteniendo el valor de la mxima fecha de alquiler, y posteriormente se obtienen los datos de la consulta principal. Una subconsulta tiene la misma sintaxis que una sentencia SELECT normal exceptuandoqueapareceencerradaentreparntesis. La subconsulta se puede encontrar en la lista de seleccin, en la clusula WHEREoenlaclusulaHAVING delaconsultaprincipal. Tienelassiguientesrestricciones: NopuedecontenerlaclusulaORDER BY
36

Ing. Mario Valle NopuedeserlaUNIONdevariassentenciasSELECT Si la subconsulta aparece en la lista de seleccin, o est asociada a un operador igual"="solopuededevolverunnicoregistro. Referenciasexternas A menudo, es necesario, dentro del cuerpo de una subconsulta, hacer referencia al valordeunacolumnadelafilaactualenlaconsultaprincipal,esenombredecolumna sedenominareferenciaexterna. Unareferenciaexternaesuncampoqueapareceenlasubconsultaperoserefierea launadelastablasdesignadasenlaconsultaprincipal. Cuandoseejecutaunaconsultaquecontieneunasubconsultaconreferenciasexternas, lasubconsultaseejecutaporcadafiladelaconsultaprincipal. Enesteejemplolasubconsultaapareceenlalistadeseleccin,ejecutndoseunavez porcadafilaquedevuelvelaconsultaprincipal. SELECTCO_EMPLEADO,NOMBRE, (SELECTMIN(FECHA_NOMINA) FROMNOMINAS WHERECO_EMPLEADO=EMPLEADOS.CO_EMPLEADO)PRIMERA_NOMINA FROMEMPLEADOS; Anidar subconsultas Las subconsultas pueden anidarse de forma que una subconsulta aparezca en la clusulaWHERE(porejemplo)deotrasubconsultaqueasuvezformapartedeotra consultaprincipal. SELECT CO_EMPLEADO,EMPLEADOS FROMEMPLEADOS WHERECO_EMPLEADOIN(SELECTCO_EMPLEADO FROMNOMINAS WHEREESTADO IN(SELECTESTADO FROMESTADOS_NOMINAS WHEREEMITIDO='S' ANDPAGADO='N') ) Los resultados que se obtienen con subconsultas normalmente pueden conseguirseatravsdeconsultascombinadas(JOIN). SELECT CO_EMPLEADO,NOMBRE
37

Ing. Mario Valle FROMEMPLEADOS WHEREESTADOIN(SELECTESTADO FROMESTADOS WHEREACTIVO='S') Podrescribirsecomo: SELECT CO_EMPLEADO,NOMBRE FROMEMPLEADOS,ESTADOS WHEREEMPLEADOS.ESTADO=ESTADOS.ESTADO ANDESTADOS.ACTIVO='S' Normalmente es ms rpido utilizar un JOIN en lugar de una subconsulta, aunque esto depende sobre todo del diseo de la base de datos y del volumen de datos que tenga. UtilizacindesubconsultasconUPDATE Podemos utilizar subconsultas tambin en consultas de actualizacin conjuntamente conUPDATE.Normalmenteseutilizanpara"copiar"elvalordeotra tabla. UPDATE EMPLEADOS SETSALARIO_BRUTO=(SELECTSUM(SALIRO_BRUTO) FROMNOMINAS WHERE NOMINAS.CO_EMPLEADO EMPLEADOS.CO_EMPLEADO) WHERESALARIO_BRUTOISNULL Lafuncin EXISTS EXISTS es una funcin SQL que devuelve verdadero cuando una subconsulta retornaalmenosunafila. SELECT CO_CLIENTE,NOMBRE FROMCLIENTES WHEREEXISTS(SELECT* FROMMOROSOS WHERECO_CLIENTE=CLIENTES.CO_CLIENTE ANDPAGADO='N') La funcin EXISTS puede ser utilizada en cualquier sentencia SQL vlida, SELECT, UPDATE,INSERT oDELETE.

38

Vous aimerez peut-être aussi