Anda di halaman 1dari 65

EllenguajeSQL

CarmeMartnEscofet

FUOC71Z799014MO
ndice

EllenguajeSQL

Introduccin..................................................................................................................... Objetivos..........................................................................................................................
1Sentenciasdedefinicin.......................................................................................... 1Creacinyborradodeunabasededatosrelacional........................................ 1Creacindetablas............................................................................................. 1Tiposdedatos...................................................................................... 1Creacin,modificacinyborradodedominios.................................. 1Definicionespordefecto..................................................................... 1Restriccionesdecolumna.................................................................... 1Restriccionesdetabla.......................................................................... 1Modificacinyborradodeclavesprimariasconclaves

10 11 12 13 13 14 16 17 17 18 19 19 20 23

forneasquehacenreferenciaastas.................................................... 1Aserciones............................................................................................ 1Modificacinyborradodetablas..................................................................... 1Creacinyborradodevistas............................................................................ 1DefinicindelabasededatosrelacionalBDUOC..........................................

2Sentenciasdemanipulacin................................................................................... 2Insercindefilasenunatabla.......................................................................... 2Borradodefilasdeunatabla............................................................................ 2Modificacindefilasdeunatabla................................................................... 2IntroduccindefilasenlabasededatosrelacionalBDUOC.......................... 2Consultasaunabasededatosrelacional......................................................... 2Funcionesdeagregracin.................................................................... 2Subconsultas........................................................................................ 2Otrospredicados.................................................................................. 2Ordenacindelosdatosobtenidos

26 26 27 27 28 29 31 32 32 35 36 38 43 44 45

enrespuestasaconsultas....................................................................... 2Consultasconagrupacindefilasdeunatabla.................................. 2Consultasamsdeunatabla............................................................... 2Launin............................................................................................... 2Lainterseccin..................................................................................... 2Ladiferencia........................................................................................


3Sentenciasdecontrol............................................................................................... 3Lastransacciones.............................................................................................. 3Lasautorizacionesydesautorizaciones............................................................ 4Sublenguajesespecializados...................................................................................

48 48 49 51

FUOC71Z799014MO

EllenguajeSQL

4SQLhospedado................................................................................................. 4LasSQL/CLI.....................................................................................................

51 52 53 55 55 56 58 59

Resumen........................................................................................................................... Actividad.......................................................................................................................... Ejerciciosdeautoevaluacin.......................................................................................... Solucionario..................................................................................................................... Bibliografa...................................................................................................................... Anexos..............................................................................................................................

FUOC71Z799014MO
Introduccin

EllenguajeSQL

El SQL es el lenguaje estndar ANSI/ISOde definicin, manipulacin y control de bases de datos relacionales. Es un lenguajedeclarativo:slohayqueindicarqusequierehacer.Encambio,enloslenguajesprocedimentalesesnecesario especificarcmohayquehacercualquieraccinsobrelabasededatos.ElSQLesunlenguajemuyparecidoallenguaje natural;concretamente,separecealingls,yesmuyexpresivo.Porestasrazones,ycomolenguajeestndar,elSQLesun lenguajeconelquesepuedeaccederatodoslossistemasrelacionalescomerciales.

Recordadqueellgebrarelacional,quehemosvistoenlaunidadElmodelorelacionalyellgebrarelacional,esunlenguajeprocedimental.

EmpezamosconunabreveexplicacindelaformaenqueelSQLhallegadoaserellenguajeestndardelasbasesdedatos relacionales:

1) Al principio de los aos setenta, los laboratorios deinvestigacin Santa Teresa deIBMempezaron a trabajar en el proyectoSystemR. ElobjetivodeesteproyectoeraimplementarunprototipodeSGBDrelacional;porlotanto,tambin necesitabaninvestigarenelcampodeloslenguajesdebasesdedatosrelacionales.Amediadosdelosaossetenta,elproyectode IBMdiocomoresultadounprimerlenguajedenominadoSEQUEL(StructuredEnglishQueryLanguage),queporrazoneslegales sedenominmsadelante SQL (StructuredQueryLanguage).Alfinaldeladcadadelossetentayalprincipiodeladelos ochenta, una vez finalizado el proyecto System R, IBM y otras empresas empezaron a utilizar el SQL en sus SGBD relacionales,conloqueestelenguajeadquiriunagranpopularidad.

2) En1982,ANSI(AmericanNationalStandardsInstitute)encargaunodesuscomits(X3H2)ladefinicindeunlenguajede basesdedatosrelacionales.Estecomit,despusdeevaluardiferenteslenguajes,yantelaaceptacincomercialdelSQL,eligiun lenguajeestndarqueestababasadoensteprcticamenteensutotalidad.ElSQLseconvirtioficialmenteenellenguajeestndar deANSIenelao1986,ydeISO(InternationalStandardsOrganization)en1987.Tambinhasidoadoptadocomolenguaje estndarporFIPS(FederalInformationProcessingStandard),UnixX/OpenySAA(SystemsApplicationArchitecture)deIBM.

3) Enelao1989,elestndarfueobjetodeunarevisinyunaampliacinquedieronlugarallenguajequeseconoceconel nombredeSQL1oSQL89.Enelao1992elestndarvolviaserrevisadoyampliadoconsiderablementeparacubrir carenciasdelaversinanterior.EstanuevaversindelSQL,queseconoceconelnombrede SQL2 o SQL92,eslaque nosotrospresentaremosenestaunidaddidctica.

Comoveremosmsadelante,aunqueaparezcaslolasiglaSQL,siemprenosestaremosrefiriendoalSQL92,yaqueste tienecomosubconjuntoelSQL89;porlotanto,todoloqueeravlidoenelcasodelSQL89locontinuarsiendoenel SQL92.

Dehecho,sepuedendistinguirtresnivelesdentrodelSQL92:

1) El nivelintroductorio(entry),queincluyeelSQL89ylasdefinicionesde claveprimaria y clavefornea alcrearuna

FUOC71Z799014MO
tabla.

EllenguajeSQL

ElconceptodeclaveprimariaysuimportanciaenunarelacinotablasehavistoenlaunidadElmodelorelacionalyellgebrarelacionaldeestecurso.

2) Elnivelintermedio(intermediate),que,ademsdelSQL89,aadealgunasampliacionesdelSQL92.

3) Elnivelcompleto(full),queyatienetodaslasampliacionesdelSQL92.

Elmodelorelacionaltienecomoestructuradealmacenamientodelosdatoslasrelaciones.Laintensinoesquemadeuna relacinconsisteenelnombrequehemosdadoalarelacinyunconjuntodeatributos.Laextensindeunarelacinesun conjuntodetuplas.AltrabajarconSQL,estanomenclaturacambia,comopodemosapreciarenlasiguientefigura:

ElmodelorelacionalsehapresentadoenlaunidadElmodelorelacionalyellgebrarelacionaldeestecurso.

Hablaremosdetablasenlugarderelaciones.

Hablaremosdecolumnasenlugardeatributos.

Hablaremosdefilasenlugardetuplas.

Sinembargo,apesardequelanomenclaturautilizadaseadiferente,losconceptossonlosmismos.

ConelSQLsepuededefinir,manipularycontrolarunabasededatosrelacional.Acontinuacinveremos,aunquesloenun nivelintroductorio,cmosepuedenrealizarestasacciones:

1) Seranecesariocrearunatablaquecontuvieselosdatosdelosproductosdenuestraempresa: CREATE TABLE productos

(codigo_producto INTEGER, nombre_producto CHAR(20), tipo CHAR(20), descripcion CHAR(50), precio REAL, PRIMARY KEY (codigo_producto));

FUOC71Z799014MO
2) Insertarunproductoenlatablacreadaanteriormente:

EllenguajeSQL

INSERT INTO productos VALUES (1250, LENA, Mesa, Diseo Juan Pi. Ao 1920., 25000); 3) Consultarquproductosdenuestraempresasonsillas:

SELECT codigo_producto, nombre_producto FROM productos WHERE tipo = Silla; 4) Dejaraccederaunodenuestrosvendedoresalainformacindelatablaproductos:

GRANT SELECT ON productos TO jmontserrat;

Ymuchasmscosasqueiremosviendopuntoporpuntoenlossiguientesapartados.

FijmonosenlaestructuradetodoloquehemoshechohastaahoraconSQL.LasoperacionesdeSQLrecibenelnombrede sentenciasyestnformadaspordiferentespartesquedenominamos clusulas,talycomopodemosapreciarenelsiguiente ejemplo:

SELECT codigo_producto, nombre_producto, tipo FROM productos WHERE precio > 1000; Estaconsultamuestraelcdigo,elnombreyeltipodelosproductosquecuestanmsde1.000euros.

LostresprimerosapartadosdeestemdulotratansobreuntipodeSQLdenominadoSQLinteractivo,quepermiteacceder directamenteaunabasededatosrelacional:

a) Enelprimerapartadodefiniremoslasdenominadassentenciasdedefinicin,dondecrearemoslabasededatos,lastablas quelacompondrnylosdominios,lasasercionesylasvistasquequeramos.

b) Enelsegundoaprenderemosamanipularlabasededatos,yaseaintroduciendo,modificandooborrandovaloresenlas filasdelastablas,obienhaciendoconsultas.

FUOC71Z799014MO

EllenguajeSQL

c) Enelterceroveremoslassentenciasdecontrol,queaseguranunbuenusodelabasededatos.

Sinembargo,muchasvecesquerremosaccederalabasededatosdesdeunaaplicacinhechaenunlenguajedeprogramacin cualquiera,quenosofrecemuchamspotenciafueradelentornodelasbasesdedatos.ParautilizarSQLdesdeunlenguaje deprogramacinnecesitaremossentenciasespecialesquenos permitandistinguirentrelasinstrucciones del lenguaje de programacinylassentenciasdeSQL.Laideaesquetrabajandobsicamenteconunlenguajedeprogramacinanfitrinse puedecobijarSQLcomosifueseunhusped.Porestemotivo,estetipodeSQLseconoceconelnombredeSQLhospedado. ParatrabajarconSQLhospedadonecesitamosunprecompiladorqueseparelassentenciasdellenguajedeprogramacinde las del lenguaje de bases de datos. Una alternativa a esta forma de trabajar son las rutinas SQL/CLI* (SQL/CallLevel Interface), que resolviendo tambin el problema de acceder a SQL desde un lenguaje de programacin, no necesitan precompilador.

*LasrutinasSQL/CLIseaadieron alestndarSQL92en1995.

IntroduciremosSQLhospedadoyelconceptodeSQL/CLIenelapartado4deestaunidaddidctica.

Antesdeempezaraconocerellenguaje,esnecesarioaadirunltimocomentario.AunqueSQLesellenguajeestndarpara basesdedatosrelacionalesyhasidoampliamenteaceptadoporlossistemasrelacionalescomerciales,nohasidocapazde reflejartodalateoradelmodelorelacionalestablecidaporE.F.Codd;estoloiremosviendoamedidaqueprofundicemosen ellenguaje.

EncontrarislateoradelmodelorelacionaldeE.F.CoddenlaunidadElmodelorelacionalyellgebrarelacionaldeestecurso.

Los sistemas relacionales comerciales y los investigadores de bases de datos son una referencia muy importante para mantenerelestndaractualizado.EnestosmomentosyasedisponedeunanuevaversindeSQL92quesedenominaSQL: 1999oSQL3.SQL:1999tieneaSQL92comosubconjunto,eincorporanuevasprestacionesdegraninters.Eninformtica,en general,yparticularmenteenbasesdedatos,esnecesarioestarsiemprealda,yporesoesmuyimportantetenerelhbitodeleer publicacionesperidicasquenosinformenynosmantenganalcorrientedelasnovedades.

Objetivos

Una vez finalizado el estudio de los materiales didcticos de esta unidad, dispondris de las herramientas indispensablesparaalcanzarlossiguientesobjetivos:

FUOC71Z799014MO
1. ConocerellenguajeestndarANSI/ISOSQL92.

EllenguajeSQL

2. Definirunabasededatosrelacional,incluyendodominios,asercionesyvistas.

3. Saberintroducir,borrarymodificardatos.

4. Sercapazdeplantearcualquiertipodeconsultaalabasededatos.

5. Saberutilizarsentenciasdecontrol.

6. ConocerlosprincipiosbsicosdelautilizacindelSQLdesdeunlenguajedeprogramacin.

FUOC71Z799014MO
1Sentenciasdedefinicin

EllenguajeSQL

Parapodertrabajarconbasesdedatosrelacionales,loprimeroquetenemosquehaceresdefinirlas.Veremoslasrdenesdel estndarSQL92paracrearyborrarunabasededatosrelacionalyparainsertar,borrarymodificarlasdiferentestablasquela componen.

Enesteapartadotambinveremoscmosedefinenlosdominios,lasaserciones(restricciones)ylasvistas.
Vistas

Unavistaenelmodelo relacionalnoessinouna tablavirtualderivadadelas tablasrealesdenuestra basededatos,unesquema externopuedeserun conjuntodevistas.

LasencillezylahomogeneidaddelSQL92hacenque:

1) Paracrearbasesdedatos,tablas,dominios,asercionesyvistasseutilicelasentenciaCREATE.

2) ParamodificartablasydominiosseutilicelasentenciaALTER.

3) Paraborrarbasesdedatos,tablas,dominios,asercionesyvistasseutilicelasentenciaDROP.

Laadecuacindeestassentenciasacadacasonosdardiferenciasqueiremosperfilandoalhacerladescripcinindividualde cadauna.

ParailustrarlaaplicacindelassentenciasdeSQLqueveremos,utilizaremosunabasededatosdeejemplomuysencillade una pequea empresa con sede en Barcelona, Girona, Lleida y Tarragona, que se encarga de desarrollar proyectos informticos.Lainformacinquenosinteresaralmacenardeestaempresa,quedenominaremosBDUOC,serlasiguiente:

1) Sobrelosempleadosquetrabajanenlaempresa,querremossabersucdigodeempleado,elnombreyapellido,elsueldo, elnombreylaciudaddesudepartamentoyelnmerodeproyectoalqueestnasignados.

2) Sobrelosdiferentesdepartamentosenlosqueestestructuradalaempresa,nosinteresaconocersunombre,laciudad

FUOC71Z799014MO

10

EllenguajeSQL

dondeseencuentranyeltelfono.Sernecesariotenerencuentaqueundepartamentoconelmismonombrepuedeestaren ciudadesdiferentes,yqueenunamismaciudadpuedehaberdepartamentosconnombresdiferentes.

3) Sobrelosproyectosinformticosquesedesarrollan,querremossabersucdigo,elnombre,elprecio,lafechadeinicio,la fechaprevistadefinalizacin,lafecharealdefinalizacinyelcdigodeclienteparaquiensedesarrolla.

4) Sobrelosclientesparaquientrabajalaempresa,querremossaberelcdigodecliente,elnombre,elNIF,ladireccin,la ciudadyeltelfono.

1Creacinyborradodeunabasededatosrelacional

ElestndarSQL92nodisponedeningunasentenciadecreacindebasesdedatos.Laideaesqueunabasededatosnoes msqueunconjunto detablasy,porlotanto, lassentenciasquenos ofreceelSQL92seconcentranenlacreacin,la modificacinyelborradodeestastablas.


Lainstruccin

CREATE DATABASE
Muchosdelossistemas relacionalescomerciales (comoocurreenelcaso deInformix,DB2,SQL Serveryotros)han incorporadosentenciasde creacin debasesdedatosconla siguientesintaxis:

CREATE DATABASE

Encambio,disponemosdeunasentenciamspotentequeladecreacindebasesdedatos:lasentenciadecreacindeesquemas denominadaCREATE SCHEMA.Conlacreacindeesquemaspodemosagruparunconjuntodeelementosdelabasededatosque sonpropiedaddeunusuario.Lasintaxisdeestasentenciaeslaquetenisacontinuacin:

CREATE SCHEMA {[nombre_esquema]} | [AUTHORIZATION usuario]} [lista_de_elementos_del_esquema];

Lanomenclaturautilizadaenlasentenciaeslasiguiente:

FUOC71Z799014MO

11

EllenguajeSQL

Laspalabrasennegritasonpalabrasreservadasdellenguaje:

Lanotacin[...]quieredecirqueloquehayentreloscorchetessepodraponerono.

Lanotacin{A| ... |B}quieredecirquetenemosqueelegirentretodaslasopcionesquehayentrelasllaves,perodebemos ponerunaobligatoriamente.

Lasentenciadecreacindeesquemashacequevariastablas(lista_de_ele-mentos_del_esquema)sepuedanagrupar bajounmismonombre(nom-bre_esquema)yquetenganunpropietario(usuario).Aunquetodoslosparmetrosdela sentenciaCREATE SCHEMAsonopcionales,comomnimosedebedarobienelnombredelesquema,obienelnombredelusuario propietariodelabasededatos.Sisloespecificamoselusuario,steserelnombredelesquema.

Lacreacindeesquemaspuedehacermuchomsqueagrupartablas,porque lista_de_elementos_del_esquema puede,ademsdetablas,sertambindominios,vistas,privilegiosyrestricciones,entreotrascosas.

Paraborrarunabasededatos encontramos elmismoproblemaqueparacrearla.ElestndarSQL92slo nosofrecela sentenciadeborradodeesquemasDROP SCHEMA,quepresentalasiguientesintaxis:

DROP SCHEMA nombre_esquema {RESTRICT|CASCADE};


Lasentencia DROP DATABASE Muchosdelossistemas relacionalescomerciales (comoporejemploInformix, DB2,SQLServeryotros) hanincorporadosentencias deborradodebasesde datosconlasiguiente sintaxis: DROP DATABASE

Dondetenemoslosiguiente: LaopcindeborradodeesquemasRESTRICThacequeelesquemaslosepuedaborrarsinocontieneningnelemento. LaopcinCASCADEborraelesquemaaunquenoestcompletamentevaco.

FUOC71Z799014MO
1Creacindetablas

12

EllenguajeSQL

Comoyahemosvisto,laestructuradealmacenamientodelosdatosdelmodelorelacionalsonlastablas.Paracrearunatabla, esnecesarioutilizarlasentenciaCREATE TABLE.Veamossuformato: CREATE TABLE nombre_tabla ( definicin_columna [, definicin_columna...] [, restricciones_tabla] );


RecordadquelastablassehanestudiadoenlaunidadElmodelorelacionalyellgebrarelacionaldeestecurso.

Dondedefinicin_columnaes:

nombre_columna {tipo_datos|dominio} [def_defecto] [restric_col]

Elprocesoquehayqueseguirparacrearunatablaeselsiguiente:

1) Loprimeroquetenemosquehaceresdecidirqunombrequeremosponeralatabla(nombre_tabla). 2) Despus, iremos dando el nombre de cada uno de los atributos que formarn las columnas de la tabla (nombre_columna). 3) Acadaunadelascolumnasleasignaremosuntipodedatospredefinidoobienundominiodefinidoporelusuario. Tambinpodremosdardefinicionespordefectoyrestriccionesdecolumna. 4) Unavezdefinidaslascolumnas,slonosquedardarlasrestriccionesdetabla.

1Tiposdedatos

Paracadacolumnatenemosqueelegirentrealgndominiodefinidoporelusuariooalgunodelostiposdedatospredefinidosquese describenacontinuacin:
Tiposdedatospredefinidos Tiposdedatos CHARACTER (longitud) CHARACTER VARYING (longitud) Descripcin Cadenasdecaracteresdelongitudfija. Cadenasdecaracteresdelongitudvariable.

Tiposdedatospredefinidos Tiposdedatos BIT (longitud) Descripcin Cadenasdebitsdelongitudfija.

FUOC71Z799014MO
BIT VARYING (longitud)

13

EllenguajeSQL

Cadenasdebitsdelongitudvariables. Nmerodecimalescontantosdgitos comoindiquelaprecisinytantosdecimales comoindiquelaescala. Nmerodecimalescontantosdgitos comoindiquelaprecisinytantosdecimales comoindiquelaescala. Nmerosenteros. Nmerosenterospequeos. Nmerosconcomaflotanteconprecisin predefinida. Nmerosconcomaflotanteconlaprecisin especificada. Nmerosconcomaflotanteconmsprecisin predefinidaqueladeltipoREAL. Fechas.Estncompuestasde:YEAR ao, MONTH mes, DAY da. Horas.EstncompuestasdeHOUR hora, MINUT minutos, SECOND segundos. Fechasyhoras.EstncompuestasdeYEAR ao, MONTH mes, DAY da, HOUR hora, MINUT minutos, SECOND segundos.

NUMERIC (precisin, escala)

DECIMAL (precisin, escala)

INTEGER SMALLINT REAL

FLOAT (precisin)

DOUBLE PRECISION

DATE

TIME

TIMESTAMP

Lostiposdedatos NUMERIC y DECIMAL NUMERICyDECIMALse describenigual,yes posibleutilizartantoeluno comoelotroparadefinir nmerosdecimales.

Eltratamientodeltiempo

FUOC71Z799014MO

14

EllenguajeSQL

ElestndarSQL92define lasiguientenomenclatura paratrabajarconeltiempo: YEAR (0001..9999) MONTH (01..12) DAY (01..31) HOUR (00..23) MINUT (00..59) SECOND (00..59.precisin) Detodosmodos,los sistemasrelacionales comerciales disponendediferentes formatos,entreloscuales podemoselegircuando tenemosquetrabajarcon columnastemporales.

Recordadquelascorrespondenciasentrelostiposdedatosylosdominiospredefinidosdelmodelorelacionalsehanvistoenelsubapartado2.2delaunidadElmodelorelacional yellgebrarelacionaldeestecurso.

Ejemplosdeasignacionesdecolumnas

VeamosalgunosejemplosdeasignacionesdecolumnasenlostiposdedatospredefinidosDATE,TIMEyTIMESTAMP:

Lacolumnafecha_nacimientopodraserdeltipoDATEypodratenercomovalor19781225.

Lacolumnainicio_partidopodraserdeltipoTIMEypodratenercomovalor17:15:00.000000.

Lacolumnaentrada_trabajopodraserdetipoTIMESTAMPypodratenercomovalor1998789:30:05.

1Creacin,modificacinyborradodedominios

Ademsdelosdominiosdadosporeltipodedatospredefinidos,elSQL92nosofrecelaposibilidaddetrabajarcondominios definidosporelusuario.
Dominiosdefinidos porelusuario

FUOC71Z799014MO

15

EllenguajeSQL

AunqueelSQL92nos ofrece lasentenciaCREATE DOMAIN,haypocos sistemasrelacionales comercialesquenos permitanutilizarla.

ParacrearundominioesnecesarioutilizarlasentenciaCREATE DOMAIN:

CREATE DOMAIN nombre dominio [AS] tipos_datos [def_defecto] [restricciones_dominio];

donderestricciones_dominiotieneelsiguienteformato:

[CONSTRAINT nombre_restriccin] CHECK (condiciones)

Explicaremos la construccin de condiciones ms adelante, en el subapartado 2.5 cuando hablemos de cmo se hacen consultas a una base de datos. Veremos

def_defectoenelsubapartado1.2.3deestaunidad.

CreacindeundominioenBDUOC

SiquisiramosdefinirundominioparalasciudadesdondeseencuentranlosdepartamentosdelaempresaBDUOC,haramos: CREATE DOMAIN dom_ciudades AS CHAR (20) CONSTRAINT ciudades_validas CHECK (VALUE IN (Barcelona, Tarragona, Lleida, Girona)); Deestemodo,cuandodefinimoslacolumnaciudadesdentrodelatabladepartamentosnosetendrquedecirqueesdetipoCHAR(20),sinode tipodom_ciudades.Estonosdeberaasegurar,segnelmodelorelacional,quesloharemosoperacionessobrelacolumnaciudadesconotras columnas que tengan este mismo dominio definido por el usuario; sin embargo, el SQL92 no nos ofrece herramientas para asegurar que las comparacionesquehacemosseanentrelosmismosdominiosdefinidosporelusuario.

Porejemplo,sitenemosunacolumnaconlosnombresdelosempleadosdefinidasobreeltipodedatosCHAR(20),elSQLnospermitecompararla conlacolumnaciudades,aunquesemnticamentenotengasentido.Encambio,segnelmodelorelacional,estacomparacinnosedeberahaber permitido.

ParaborrarundominiodefinidoporelusuarioesprecisoutilizarlasentenciaDROP DOMAIN,quetieneesteformato:

DROP DOMAIN nombre_dominio {RESTRICT|CASCADE};

Enestecaso,tenemosque:

FUOC71Z799014MO

16

EllenguajeSQL

LaopcindeborradodedominiosRESTRICThacequeeldominioslosepuedaborrarsinoseutilizaenningnsitio.

Laopcin CASCADE borraeldominioaunque est referenciado, ypone eltipo dedatos del dominio alldonde se utilizaba.

BorrarundominiodeBDUOC

SiquisiramosborrareldominioquehemoscreadoantesparalasciudadesdondeseencuentranlosdepartamentosdelaempresaBDUOC,haramos:

DROP DOMAIN dom_ciudades RESTRICT;

Enestecasonosdeberamosasegurardequeningunacolumnaestdefinidasobredom_ciu-dadesantesdeborrareldominio.

ParamodificarundominiosemnticoesnecesarioutilizarlasentenciaALTER DOMAIN.Veamossuformato:

ALTER DOMAIN nombre_dominio {accin_modificar_dominio| accin_modif_restriccin_dominio};

Dondetenemoslosiguiente:

accin_modificar_dominiopuedeser:

{SET def_defecto|DROP DEFAULT}

accin_modif_restriccin_dominiopuedeser:

{ADDrestricciones_dominio|DROPCONSTRAINTnombre_restriccin}

ModificarundominioenBDUOC

Siquisiramosaadirunanuevaciudad(Matar)aldominioquehemoscreadoantesparalasciudadesdondeseencuentranlosdepartamentosdela empresaBDUOC,haramos:

ALTER DOMAIN dom_ciudades DROP CONSTRAINT ciudades_validas;

Conestohemoseliminadolarestriccindedominioantigua.Yahoratenemosqueintroducirlanuevarestriccin: ALTER_DOMAIN dom_ciudades ADD CONSTRAINT ciudades_validas CHECK (VALUE IN (Barcelona, Tarragona, Lleida, Girona, Mataro));

FUOC71Z799014MO
1Definicionespordefecto

17

EllenguajeSQL

Yahemosvistoenotrosmduloslaimportanciadelosvaloresnulosysuinevitableaparicincomovaloresdelasbasesde datos.

Laopcindef_defectonospermiteespecificarqunomenclaturaqueremosdaranuestrosvaloresporomisin.

Porejemplo,paraunempleadoquetodavanosehadecididocuntoganar,podemoselegirque,demomento,tengaunsueldo de0euros(DEFAULT 0.0),obienquetengaunsueldoconunvalornulo(DEFAULT NULL).

Sin embargo,hay quetenerencuentaquesi elegimosla opcin DEFAULT NULL,lacolumnaparalaque daremosla definicinpordefectodevalornulodeberaadmitirvaloresnulos.

LaopcinDEFAULTtieneelsiguienteformato:

DEFAULT (literal|funcin|NULL)

Laposibilidadmsutilizadaylaopcinpordefecto,sinoespecificamosnada,eslapalabrareservadaNULL.Sinembargo, tambinpodemosdefinirnuestropropioliteral,obienrecurriraunadelasfuncionesqueaparecenenlatablasiguiente:

Funcin {USER|CURRENT_USER} SESSION_USER

Descripcin Identificadordelusuarioactual Identificadordelusuariodeestasesin Identificadordelusuariodelsistema operativo Fechaactual Horaactual Fechayhoraactuales

SYSTEM_USER

CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP

1Restriccionesdecolumna

Encadaunadelascolumnasdelatabla,unavezleshemosdadounnombreyhemosdefinidosudominio,podemosimponer ciertasrestriccionesquesiempresetendrnquecumplir.Lasrestriccionesquesepuedendarsonlasqueaparecenenlatablaque tenemosacontinuacin:

FUOC71Z799014MO
Restriccionesdecolumna Restriccin NOT NULL

18

EllenguajeSQL

Descripcin Lacolumnanopuedetenervaloresnulos. Lacolumnanopuedetenervaloresrepetidos.Esuna clavealternativa. Lacolumnanopuedetenervaloresrepetidosninulos. Eslaclaveprimaria. Lacolumnaeslaclaveforneadelacolumnadelatabla especificada. Lacolumnadebecumplirlascondicionesespecificadas.

UNIQUE

PRIMARY KEY

REFERENCES tabla [(columna)] CHECK (condiciones)

1Restriccionesdetabla

Unavezhemosdadounnombre,hemosdefinidounatablayhemosimpuestociertasrestriccionesparacadaunadelas columnas,podemosaplicarrestriccionessobretodalatabla,quesiempresedeberncumplir.Lasrestriccionesquesepueden darsonlassiguientes:

Restriccionesdetabla Restriccin UNIQUE (columna [, columna...]) Descripcin Elconjuntodelascolumnasespecificadas nopuedetenervaloresrepetidos.Esuna clavealternativa. Restriccionesdetabla Restriccin PRIMARY KEY (columna [, columna...]) Descripcin Elconjuntodelascolumnasespecificadas nopuedetenervaloresnulosnirepetidos. Esunaclaveprimaria. Elconjuntodelascolumnasespecificadas esunaclaveforneaquereferencialaclave primariaformadaporelconjuntodelas columnas2delatabladada.Silascolumnas ylascolumnas2sedenominanexactamente igual,entoncesnoseranecesarioponer columnas2. Latabladebecumplirlascondiciones especificadas.

FOREIGN KEY (columna [, columna...]) REFERENCES tabla [(columna2 [, columna2...])]

CHECK (condiciones)

FUOC71Z799014MO

19

EllenguajeSQL

1Modificacinyborradodeclavesprimariasconclaves

forneasquehacenreferenciaastas

Enotraunidaddeestecursohemosvistotrespolticasaplicablesaloscasosdeborradoymodificacindefilasquetienenuna claveprimariareferenciadaporclavesforneas.Estaspolticaseranlarestriccin,laactualizacinencascadaylaanulacin.

Pararecordar laspolticasquesepuedenaplicaraloscasosdeborradoymodificacindelasfilas,consultadlossubapartados4.3.1,4.3.2y4.3.3delaunidadElmodelo relacionalyellgebrarelacionaldeestecurso.

ElSQLnos ofrecelaposibilidad deespecificar,aldefinirunaclavefornea,qu polticaqueremos seguir.Veamossu formato:

CREATE TABLE nombre_tabla ( definicin_columna [, definicin_columna. . .] [, restricciones_tabla] ); Dondeunadelasrestriccionesdetablaeraladefinicindeclavesforneas,quetieneelsiguienteformato: FOREIGNKEYclave_secundariaREFERENCEStabla[(clave_primaria)] [ON DELETE {NO ACTION | CASCADE | SET DEFAULT | SET NULL}] [ON UPDATE {NO ACTION | CASCADE | SET DEFAULT | SET NULL}] Donde NO ACTION correspondealapolticaderestriccin; CASCADE,alaactualizacinencascada,y SET NULL serala anulacin.SET DEFAULTsepodraconsiderarunavariantedeSET NULL,dondeenlugardevaloresnulossepuedeponerel valorespecificadopordefecto.

1Aserciones

Unaasercinesunarestriccingeneralquehacereferenciaaunaomscolumnasdemsdeunatabla.Para definiruna asercinseutilizalasentenciaCREATE ASSERTION,ytieneelsiguienteformato:

CREATE ASSERTION nombre_asercin CHECK (condiciones);

FUOC71Z799014MO
CrearunaasercinenBDUOC

20

EllenguajeSQL

CreamosunaasercinsobrelabasededatosBDUOCquenosasegurequenohayningnempleadoconunsueldosuperiora80.000asignadoal proyectoSALSA: CREATE ASSERTION restriccion1 CHECK (NOT EXISTS (SELECT * FROM proyectos p, empleados e WHERE p.codigo_proyec = = e.num_proyec and e.sueldo

>

8.0E+4

and p.nom_proj = SALSA) );

ParaborrarunaasercinesnecesarioutilizarlasentenciaDROP ASSERTION,quepresentaesteformato:

DROP ASSERTION nombre_asercin;

BorrarunaasercinenBDUOC

Porejemplo,paraborrarlaasercinrestriccion1,utilizaramoslasentenciaDROPASSERTIONdelaformasiguiente:

DROP ASSERTION restriccion1;

1Modificacinyborradodetablas

ParamodificarunatablaesprecisoutilizarlasentenciaALTER TABLE.Veamossuformato:

ALTER TABLE nombre_tabla {accin_modificar_columna| accin_modif_restriccin_tabla}; Enestecaso,tenemosque:

accin_modificar_columnapuedeser:

{ADD [COLUMN] columna def_columna | ALTER [COLUMN] columna {SET def_defecto|DROP DEFAULT}| DROP [COLUMN ] columna {RESTRICT|CASCADE}} accin_modif_restriccin_tablapuedeser:

{ADD restriccin| DROP CONSTRAINT restriccin {RESTRICT|CASCADE}}

Siqueremosmodificarunatablaesquequeremosrealizarunadelassiguientesoperaciones:

FUOC71Z799014MO
1) Aadirleunacolumna(ADD columna).

21

EllenguajeSQL

2) Modificarlasdefinicionespordefectodelacolumna(ALTER columna).

3) Borrarlacolumna(DROP columna).

4) Aadiralgunanuevarestriccindetabla(ADD restriccin).

5) Borraralgunarestriccindetabla(DROPCONSTRAINT restriccin).

ParaborrarunatablaesprecisoutilizarlasentenciaDROP TABLE:

DROP TABLE nombre_tabla {RESTRICT|CASCADE};

Enestecasotenemosque:

SiutilizamoslaopcinRESTRICT,latablanoseborrarsiestreferenciada,porejemplo,poralgunavista.

SiusamoslaopcinCASCADE,todoloquereferenciealatablaseborrarconsta.

1Creacinyborradodevistas

Comohemosobservado,laarquitecturaANSI/SPARCdistinguetresniveles,quesedescribenenelesquemaconceptual,el esquemainternoylosesquemasexternos.Hastaahora,mientrascrebamoslastablasdelabasededatos,bamosdescribiendoel esquemaconceptual.ParadescribirlosdiferentesesquemasexternosutilizamoselconceptodevistadelSQL.

LostresnivelesdelaarquitecturaANSI/SPARCsehanestudiadoenelsubapartado4.1delaunidadIntroduccinalasbasesdedatosdeestecurso.

ParacrearunavistaesnecesarioutilizarlasentenciaCREATE VIEW.Veamossuformato: CREATE VIEW nombre_vista [(lista_columnas)] AS (consulta) [WITH CHECK OPTION]; Loprimeroquetenemosquehacerparacrearunavistaesdecidirqunombrelequeremosponer(nombre_vista).Si queremoscambiarelnombredelascolumnas,obienponernombreaalgunaqueenprincipionotena,lopodemoshaceren lista_columnas.Yyaslonosquedardefinirlaconsultaqueformarnuestravista.

Porloquerespectaalaconstruccindeconsultas,consultadelsubapartado2.5deestaunidaddidctica.

FUOC71Z799014MO

22

EllenguajeSQL

Lasvistasnoexistenrealmentecomounconjuntodevaloresalmacenadosenlabasededatos,sinoquesontablasficticias, denominadasderivadas(nomaterializadas).Seconstruyenapartirdetablasreales(materializadas)almacenadasenlabase dedatos,yconocidasconelnombrede tablasbsicas (otablasdebase).Lanoexistenciarealdelasvistashaceque puedanseractualizablesono.

CreacindeunavistaenBDUOC

CreamosunavistasobrelabasededatosBDUOCquenosdparacadaclienteelnmerodeproyectosquetieneencargadoselclienteencuestin. CREATE VIEW proyectos_por_cliente (codigo_cli, numero_proyectos) AS (SELECT c.codigo_cli, COUNT(*) FROM proyectos p, clientes c WHERE p.codigo_cliente = c.codigo_cli GROUP BY c.codigo_cli); Situvisemoslassiguientesextensiones:

Tablaclientes: clientes codigo_cl i 10 nombre_cl i ECIGSA nif direccio n Aragn11 Valencia 22 Mallorca 33 ciudad telefono

38.567.893C

Barcelona

NULL

20

CME

38.123.898E

Girona

972.23.57.21

30

ACME

36.432.127A

Lleida

973.23.45.67

Tablaproyectos: proyectos codigo_proye c 1 fecha_prev_fi n 1199 31398

nombre_proyec

precio

fecha_inicio

fecha_fin

codigo_cliente

GESCOM PESCI

1,0E+6 2,0E+6

1198 11096 proyectos

NULL 1598

10 10

codigo_proye c 3

nombre_proyec

precio

fecha_inicio

fecha_prev_fi n 1299 11299

fecha_fin

codigo_cliente

SALSA TINELL

1,0E+6 4,0E+6

10298 1197

NULL NULL

20 30

FUOC71Z799014MO

23

EllenguajeSQL

Ymirsemoslaextensindelavistaproyectos_por_clientes,veramosloqueencontramosenelmargen.

Enlasvistas,ademsdehacerconsultas,podemosinsertar,modificaryborrarfilas.
proyectos_por_clientes codigo_cl i 10 20 30 numero_proyect os 2 1 1

ActualizacindevistasenBDUOC

Sialguieninsertaseenlavistaproyectos_por_cliente,losvaloresparaunnuevocliente60contresproyectosencargados,encontraramos queestostresproyectostendranquefigurarrealmenteenlatablaproyectosy,porlotanto,elSGBDlosdeberainsertarconlainformacinque tenemos, que es prcticamente inexistente. Veamos grficamente cmo quedaran las tablas despus de esta hipottica actualizacin, que no llegaremosahacernunca,yaqueiraencontradelateoradelmodelorelacional:

Tablaclientes clientes codigo_c li 10 20 30 60 nombre_cl i ECIGSA CME ACME NULL nif direccion ciudad telefono

38.567.893C 38.123.898E 36.432.127A NULL

Aragn11 Valencia22 Mallorca33 NULL

Barcelona Girona Lleida NULL

NULL 972.23.57.21 973.23.45.67 NULL

Tablaproyectos: proyectos nombre_proye c GESCOM PESCI SALSA NULL

codigo_proyec 1

precio

fecha_inicio

fecha_prev_fin

fecha_fin

codigo_cliente

1,0E+6 2,0E+6 1,0E+6 NULL

1198 11096 10298 NULL

1199 31398 1299 NULL

NULL 1598 NULL NULL

10 10 20 60

2 3 NULL

FUOC71Z799014MO
NULL NULL NULL NULL NULL NULL

24

EllenguajeSQL

NULL NULL

NULL NULL

NULL NULL

60 60

ElSGBDnopuedeactualizarlatablabsica clientes sislosabelaclaveprimaria,ytodavamenoslatablabsica proyectossinla claveprimaria;porlotanto,estavistanoseraactualizable.

Encambio,sidefinimosunavistaparasaberlosclientesquetenemosenBarcelonaoenGirona,haramos: CREATE VIEW clientes_Barcelona_Girona AS (SELECT * FROM clientes WHERE ciudad IN (Barcelona, Girona)) WHITH CHECK OPTION; Siqueremosasegurarnosdequesecumplalacondicindelaclusula WHERE,debemosponerlaopcin WHITH CHECK OPTION.Sinolo hicisemos,podraocurrirquealguienincluyeseenlavistaclientes_Barcelona_Gironaaunclientenuevoconelcdigo70,denombre JMB,conelNIF36.788.224C,ladireccinenNULL,laciudadLleidayeltelfonoNULL.

Siconsultsemoslaextensindelavistaclientes_Barcelona_Girona,veramos: clientes_Barcelona_Girona codigo_cli 10 nombre_cli ECIGSA CME nif 38.567.893C 38.123.898E direccion Aragn11 Valencia22 ciudad Barcelona Girona telefono NULL 972.23.57.21

20

Estavistaspodraseractualizable.Podramosinsertarunnuevoclienteconcdigo50,denombreCEA,conelNIF38.226.777D,conladireccin Pars44,laciudadBarcelonayeltelfono93.422.60.77.Despusdeestaactualizacin,enlatablabsicaclientesencontraramos,efectivamente: clientes codigo_cli nombre_cli 10 ECIGSA CME ACME CEA nif 38.567.893C 38.123.898E 36.432.127A 38.226.777D direccion Aragn11 Valencia22 Mallorca33 Pars,44 ciudad Barcelona Girona Lleida Barcelona telefono NULL 972.23.57.21 973.23.45.67 93.442.60.77

20 30 50

ParaborrarunavistaesprecisoutilizarlasentenciaDROP VIEW,quepresentaelformato:

DROP VIEW nombre_vista (RESTRICT|CASCADE);

FUOC71Z799014MO

25

EllenguajeSQL

Siutilizamoslaopcin RESTRICT,lavistanoseborrarsiestreferenciada,porejemplo,porotravista.Encambio,si ponemoslaopcinCASCADE,todoloquereferenciealavistaseborrarconsta.

BorrarunavistaenBDUOC

Paraborrarlavistaclientes_Barcelona_Girona,haramoslosiguiente:

DROP VIEW clientes_Barcelona_Girona RESTRICT;

1DefinicindelabasededatosrelacionalBDUOC

VeamoscmosecrearalabasededatosBDUOC,utilizando,porejemplo,unSGBDrelacionalquedispongadelasentencia CREATE DATABASE: CREATE DATABASE bduoc; CREATE TABLE clientes (codigo_cli INTEGER, nombre_cli CHAR(30) NOT NULL, nif CHAR (12), direccion CHAR (30), ciudad CHAR (20), telefono CHAR (12), PRIMARY KEY (codigo_cli), UNIQUE(nif) ); CREATE TABLE departamentos (nombre_dep CHAR(20) PRIMARY KEY,* ciudad_dep CHAR(20), telefono INTEGER DEFAULT NULL, PRIMARY KEY (nombre_dep, ciudad_dep) ); CREATE TABLE proyectos (codigo_proyec INTEGER, nombre_proyec CHAR(20), precio REAL, fecha_inicio DATE, fecha_prev_fin DATE, fecha_fin DATE DEFAULT NULL, codigo_cliente INTEGER, PRIMARY KEY (codigo_proyec), FOREIGNKEYcodigo_clienteREFERENCESclientes(codigo_cli), CHECK (fecha_inicio < fecha_prev_fin), CHECK (fecha_inicio < fecha_fin) ); CREATE TABLE empleados

FUOC71Z799014MO

26

EllenguajeSQL

(codigo_empl INTEGER, nombre_empl CHAR (20), apellido_empl CHAR(20), sueldo REAL CHECK (sueldo > 7000), nombre_dep CHAR(20) ciudad_dep CHAR(20), num_proyec INTEGER, PRIMARY KEY (codigo_empl), FOREIGN KEY (nombre_dep, ciudad_dep) REFERENCES departamentos (nombre_dep, ciudad_dep), FOREIGNKEY(num_proyec)REFERENCESproyectos(codigo_proyec) ); COMMIT;
Ordendecreacin Antesdecrearunatabla conunaomsclaves forneas,sedebenhaber creadolas tablasquetienencomo claveprimarialas referenciadas porlasforneas.

*Tenemosqueelegirrestriccin detablaporquelaclaveprimaria estcompuestaporms deunatributo.

LasentenciaCOMMITseexplicaenelsubapartado3.1deestaunidaddidctica.

Alcrearunatablavemosquemuchasrestriccionessepuedenimponerdedosformas:comorestriccionesdecolumnaocomo restriccionesdetabla.Porejemplo,cuandoqueremosdecirculeslaclaveprimariadeunatabla,tenemoslasdosposibilidades. EstosedebealaflexibilidaddelSQL:

Enelcasodequelarestriccinhagareferenciaaunsoloatributo,podemoselegirlaposibilidadquemsnosguste.

Enelcasodelatabla departamentos,tenemosqueelegirporfuerzalaopcinderestriccionesdetabla,porquela claveprimariaestcompuestapormsdeunatributo.

Engeneral,lopondremostodocomorestriccionesdetabla,exceptoNOT NULLyCHECKcuandohagareferenciaaunasola

FUOC71Z799014MO
columna.

27

EllenguajeSQL

2Sentenciasdemanipulacin

Unavezcreadalabasededatosconsustablas,debemospoderinsertar,modificaryborrarlosvaloresdelasfilasdelas tablas.Parapoderhaceresto,elSQL92nosofrecelassiguientessentencias:INSERTparainsertar,UPDATEparamodificary DELETEparaborrar.Unavezhemosinsertadovaloresennuestrastablas,tenemosquepoderconsultarlos.Lasentenciapara hacerconsultasaunabasededatosconelSQL92esSELECT FROM.Veamosacontinuacinestassentencias.

2Insercindefilasenunatabla

Antesdepoderconsultarlosdatosdeunabasededatos,esprecisointroducirlosconlasentenciaINSER TINTO VALUES, quetieneelformato: INSERT INTO nombre_tabla [(columnas)] {VALUES({v1|DEFAULT|NULL},...,{vn/DEFAULT/NULL})|<consulta>};


Insercindemltiplesfilas Parainsertarmsdeuna filaconunasolasentencia, tenemosqueobtenerlos valorescomoresultadode unaconsultarealizadaen una omstablas.

Losvalores v1, v2,..., vn sedebencorresponderexactamenteconlascolumnasquehemosdichoquetendramosconel CREATE TABLEydebenestarenelmismoorden,amenosquelasvolvamosaponeracontinuacindelnombredelatabla. Enesteltimocaso,losvaloressedebendisponerdeformacoherenteconelnuevoordenquehemosimpuesto.Podradarse elcasodequequisiramosquealgunosvaloresparainsertarfuesenvaloresporomisin,definidospreviamenteconlaopcin DEFAULT.Entoncespondramoslapalabrareservada DEFAULT.Sisetratadeintroducirvaloresnulos,tambinpodemos utilizarlapalabrareservadaNULL.

InsercindeunafilaenBDUOC

LaformadeinsertaraunclienteenlatablaclientesdelabasededatosdeBDUOCes: INSERT INTO clientes VALUES (10, ECIGSA, 37.248.573-C, ARAGON 242, Barcelona, DEFAULT); obien:

FUOC71Z799014MO

28

EllenguajeSQL

INSERTINTOclientes(nif,nombre_cli,codigo_cli,telefono,direccion, ciudad) VALUES(37.248.573-C,ECIGSA,10,DEFAULT,ARAGON242,Barcelona);

2Borradodefilasdeunatabla

Para borrarvaloresdealgunasfilasdeunatabla podemosutilizarla sentencia DELETE FROM WHERE.Suformatoesel siguiente: DELETE FROM nombre_tabla [WHERE condiciones]; Encambio,siloquequisiramosconseguires borrartodaslasfilasdeunatabla,entoncesslotendramosqueponerla sentenciaDELETE FROM,sinWHERE.

BorrartodaslasfilasdeunatablaenBDUOC

Podemosdejarlatablaproyectossinningunafila:

DELETE FROM proyectos;

Ennuestrabasededatos,borrarlosproyectosdelcliente2seharadelaformaquemostramosacontinuacin: DELETE FROM proyectos WHERE codigo_cliente = 2; Borradodemltiplesfilas Notemosqueelclientecon elcdigo2podratener ms deunproyectocontratado y,porlotanto,seborrara msdeunafilaconuna sola sentencia.

2Modificacindefilasdeunatabla

Siquisiramosmodificarlosvaloresdealgunasfilasdeunatabla,tendramosqueutilizarlasentenciaUPDATE SET WHERE. Acontinuacinpresentamossuformato: UPDATE nombre_tabla SET columna = {expresin|DEFAULT|NULL} [, columna = {expr|DEFAULT|NULL} ...] WHERE condiciones;

FUOC71Z799014MO

29

EllenguajeSQL

Modificacindemltiplesfilas Notemosqueelproyecto nmero2podratener amsdeunempleado asignadoy,porlotanto, semodificaralacolumna sueldo,demsdeunafila conunasolasentencia.

ModificacindelosvaloresdealgunasfilasenBDUOC

Supongamosquequeremosincrementarelsueldodetodoslosempleadosdelproyecto2en1.000euros.Lamodificacinaejecutarsera: UPDATE empleados SET sueldo = sueldo + 1000 WHERE num_proyec = 2;

2IntroduccindefilasenlabasededatosrelacionalBDUOC

AntesdeempezarahacerconsultasalabasededatosBDUOC,habremosintroducidounascuantasfilasensustablasconla sentenciaINSERT INTO.Deestaforma,podremosverreflejadoelresultadodelasconsultasqueiremoshaciendo,apartirde estemomento,sobrecadaextensin;estolopodemosobservarenlastablascorrespondientesacadaextensin,quepresentamos acontinuacin:

Tabladepartamentos:

departamentos nombre_dep ciudad_dep

telefono 93.422.60.70 972.23.89.70 973.23.50.40 93.224.85.23 977.33.38.52 972.23.50.91

DIR DIR DIS DIS PROG PROG

Barcelona Girona Lleida Barcelona Tarragona Girona

Tablaclientes:

FUOC71Z799014MO
clientes nombre_cl i ECIGSA CME ACME JGM

30

EllenguajeSQL

codigo_cli 10

nif

direccion

ciudad

telefono

38.567.893C 38.123.898E 36.432.127A 38.782.345B

Aragn11 Valencia22 Mallorca33 Roselln44

Barcelona Girona Lleida Tarragona

NULL 972.23.57.21 973.23.45.67 977.33.71.43

20 30 40

Tablaempleados:

empleados codigo_empleado 1 2 3 4 5 6 7 8 nombre_empl Mara Pedro Ana Jorge Clara Laura Rogelio Sergio apellido_empl Puig Mas Ros Roca Blanc Tort Salt Grau sueldo 1,0E+5 9,0E+4 7,0E+4 7,0E+4 4,0E+4 3,0E+4 4,0E+4 3,0E+4 nombre_dep DIR DIR DIS DIS PROG PROG NULL PROG ciudad_dep Girona Barcelona Lleida Barcelona Tarragona Tarragona NULL Tarragona num_proyec 1 4 3 4 1 3 4 NULL

Tablaproyectos:

proyectos codigo_proyec 1 nombre_proyec precio fecha_inicio fecha_prev_fin fecha_fin codigo_cliente

GESCOM PESCI

1,0E+6 2,0E+6

1198 11096

1199 31398

NULL 1598

10 10

FUOC71Z799014MO
3 4 SALSA TINELL 1,0E+6 4,0E+6

31

EllenguajeSQL

10298 1197

1299 11299

NULL NULL

20 30

2Consultasaunabasededatosrelacional

Parahacer consultas sobreunatablaconelSQLesprecisoutilizarla sentencia SELECT FROM,quetieneelsiguiente formato:

SELECTnombre_columna_a_seleccionar[[AS]col_renombrada] [,nombre_columna_a_seleccionar[[AS]col_renombrada]...] FROM tabla_a_consultar [[AS] tabla_renombrada];

Laopcin ASnospermiterenombrarlascolumnasquequeremosseleccionarolastablasquequeremosconsultarqueeneste caso,esslouna.Dichodeotromodo,nospermiteladefinicindealias.FijmonosenquelapalabraclaveASesopcional,yes bastantehabitualponerslounespacioenblancoenlugardetodalapalabra.

ConsultasaBDUOC

AcontinuacinpresentamosunejemplodeconsultaalabasededatosBDUOCparaconocertodoslosdatosqueapareceenlatablaclientes: SELECT * FROM clientes;


El*despusdeSELECTindica quequeremosvertodos losatributosqueaparecen enlatabla.

Larespuestaaestaconsultasera:

codigo_cli 10

nombre_cli

nif

direccion

ciudad

telefono

ECIGSA CME ACME JGM

38.567.893C 38.123.898E 36.432.127A 38.782.345B

Aragn11 Valencia22 Mallorca33

Barcelona Girona Lleida

NULL 972.23.57.21 973.23.45.67 977.33.71.43

20 30 40

Roselln44 Tarragona

FUOC71Z799014MO

32

EllenguajeSQL

Sihubisemosqueridoversloelcdigo,elnombre,ladireccinylaciudad,habramoshecho: SELECT codigo_cli, nombre_cli, direccion, ciudad FROM clientes; Yhabramosobtenidolarespuestasiguiente: codigo_cli 10 nombre_cli ECIGSA CME ACME JGM direccion Aragn11 Valencia22 Mallorca33 Roselln44 ciudad Barcelona Girona Lleida Tarragona

20 30 40

ConlasentenciaSELECT FROMpodemosseleccionarcolumnasdeunatabla,peroparaseleccionarfilasdeunatablaespreciso aadirlelaclusulaWHERE.Elformatoes:


SELECT nombre_columnas_a_seleccionar FROM tabla_a_consultar WHERE condiciones;

LaclusulaWHEREnospermiteobtenerlasfilasquecumplenlacondicinespecificadaenlaconsulta.
ConsultasaBDUOCseleccionandofilas

Veamosunejemploenelquepedimosloscdigosdelosempleadosquetrabajanenelproyectonmero4: SELECT codigo_empl FROM empleados WHERE num_proyec = 4; codigo_empl 2 4 7

Larespuestaaestaconsultaseralaquepodisverenelmargen.

ParadefinirlascondicionesenlaclusulaWHERE,podemosutilizaralgunodelosoperadoresdelosquedisponeelSQL,que sonlossiguientes:

a
Operadoreslgicos NOT Paralanegacindecondiciones

Operadoresdecomparacin = Igual

FUOC71Z799014MO

33

EllenguajeSQL

< > <= >= <>

Menor Mayor Menoroigual Mayoroigual Diferente

AND

Paralaconjuncinde condiciones Paraladisyuncindecondiciones

OR

Si queremos que en una consulta nos aparezcan las filas resultantes sin repeticiones, es preciso poner la palabra clave DISTINCT inmediatamente despus de SELECT. Tambin podramos explicitar que lo queremos todo, incluso con repeticiones,poniendoALL(opcinpordefecto)enlugardeDISTINCT.ElformatodeDISTINCTes: SELECT DISTINCT nombre_columnas_a_seleccionar FROM tabla_a_consultar [WHERE condiciones];
ConsultaaBDUOCseleccionandofilassinrepeticiones Porejemplo,siquisiramosverqusueldosseestnpagandoennuestraempresa,podramoshacer: SELECT DISTINCT sueldo FROM empleados; sueldo 3,0E+4 4,0E+4 7,0E+4 9,0E+4 1,0E+5

Larespuestaaestaconsulta,sinrepeticiones,seralaqueapareceenelmargen.

2Funcionesdeagregracin

ElSQLnosofrecelassiguientesfuncionesdeagregacinparaefectuarvariasoperacionessobrelosdatosdeunabasede datos:
Funcionesdeagregacin Funcin COUNT Descripcin Nosdaelnmerototaldefilas seleccionadas

FUOC71Z799014MO
SUM MIN MAX AVG

34

EllenguajeSQL

Sumalosvaloresdeunacolumna Nosdaelvalormnimodeunacolumna Nosdaelvalormximodeunacolumna Calculaelvalormediodeunacolumna

Engeneral,lasfuncionesdeagregacinseaplicanaunacolumna,exceptolafuncindeagregacinCOUNT,quenormalmentese aplicaatodaslascolumnasdelatablaotablasseleccionadas.Porlotanto,COUNT(*)contartodaslasfilasdelatablaolas tablasquecumplanlascondiciones.SiseutilizaseCOUNT(distinct columna),slocontaralosvaloresquenofuesen nulosnirepetidos,ysiseutilizaseCOUNT (columna),slocontaralosvaloresquenofuesennulos.


EjemplodeutilizacindelafuncinCOUNT(*) Veamosunejemplodeusodelafuncin COUNT,queapareceenlaclusula SELECT,parahacerlaconsultaCuntosdepartamentosestn ubicadosenlaciudaddeLleida?: SELECT COUNT(*) AS numero_dep FROM departamentos WHERE ciudad_dep = Lleida; Larespuestaaestaconsultaseralaqueaparecereflejadaenlatablaqueencontrarisenelmargen. numero_dep 1

Veremosejemplosdelasdemsfuncionesdeagregacinenlossiguientesapartados.

2Subconsultas

Unasubconsultaesunaconsultaincluidadentrodeunaclusula WHERE o HAVING deotraconsulta.Enocasiones,para expresarciertascondicionesnohaymsremedioqueobtenerelvalorquebuscamoscomoresultadodeunaconsulta.

VeremoslaclusulaHAVINGenelsubapartado2.5.5deestaunidaddidctica.

SubconsultaenBDUOC

Siquisiramossaberloscdigosylosnombresdelosproyectosdeprecio mselevado, enprimerlugartendramosqueencontrarlos proyectosquetienenelpreciomselevado.Loharamosdelaformasiguiente: SELECT codigo_proyec, nombre_proyec

FUOC71Z799014MO
FROM proyectos WHERE precio = (SELECT MAX(precio) FROM proyectos); codigo_proye nombre_proye c c 4 TINELL

35

EllenguajeSQL

Elresultadodelaconsultaanteriorseraloquepuedeversealmargen. Losproyectosdepreciomsbajo Sienlugardeloscdigos ylosnombresdeproyectos depreciomsalto hubisemosqueridosaber losdepreciomsbajo, habramosaplicadola funcindeagregacinMIN.

2Otrospredicados

1) PredicadoBETWEEN

Paraexpresarunacondicinquequiereencontrarunvalorentreunoslmitesconcretos,podemosutilizarBETWEEN:

SELECT nombre_columnas_a_seleccionar FROM tabla_a_consultar WHERE columna BETWEEN lmite1 AND lmite2;
EjemplodeusodelpredicadoBETWEEN

UnejemploenelquesepideLoscdigosdelosempleadosquegananentre20.000y50.000eurosanualessera: SELECT codigo_empl FROM empleados WHERE sueldo BETWEEN 2.0E+4 and 5.0E+4; codigo_empl 5 6 7 8

FUOC71Z799014MO

36

EllenguajeSQL

Larespuestaaestaconsultaseralaqueseveenelmargen.

2) PredicadoIN ParacomprobarsiunvalorcoincideconloselementosdeunalistautilizaremosIN,yparaversinocoincide,NOT IN: SELECT nombre_columnas_a_seleccionar FROM tabla_a_consultar WHERE columna [NOT] IN (valor1, ..., valorN);
EjemplodeusodelpredicadoIN QueremossaberelnombredetodoslosdepartamentosqueseencuentranenlasciudadesdeLleidaoTarragona: SELECT nombre_dep, ciudad_dep FROM departamentos WHERE ciudad_dep IN (Lleida, Tarragona); nombre_dep DIS PROG ciudad_dep Lleida Tarragona

Larespuestaseralaqueapareceenelmargen.

3) PredicadoLIKE Paracomprobarsiunacolumnadetipocarctercumplealgunapropiedaddeterminada,podemosusarLIKE: SELECT nombre_columnas_a_seleccionar FROM tabla_a_consultar WHERE columna LIKE caracterstica; LospatronesdelSQL92paraexpresarcaractersticassonlossiguientes:

a
Otrospatrones Aunque_y%sonlos caractereselegidospor elestndar,cadasistema relacionalcomercialofrece diversasvariantes.

a) Pondremosuncarcter_paracadacarcterindividualquequeramosconsiderar. b) Pondremosuncarcter%paraexpresarunasecuenciadecaracteres,quepuedenoestarformadaporninguno.

FUOC71Z799014MO
EjemplodeusodelpredicadoLIKE

37

EllenguajeSQL

Acontinuacin presentamos un ejemplo en el que buscaremoslos nombresdelosempleados que empiezan por J,y otro ejemplo enelque obtendremoslosproyectosquecomienzanporSytienencincoletras: a) NombresdeempleadosqueempiezanporlaletraJ: SELECT codigo_empl, nombre_empl FROM empleados WHERE nombre_empl LIKE J%; Atributosaadidos Aunquelaconsultapide slolosnombresde empleadosaadimosel cdigoparapoder diferenciardosempleados conelmismonombre.

codigo_emp l 4

nombre_emp l Jorge

Larespuestaaestaconsultaseralaquesemuestraenelmargen. b) ProyectosqueempiezanporSytienencincoletras: SELECT codigo_proyec FROM proyectos WHERE nombre_proyec LIKE S_ _ _ _; codigo_proyec 3

Ylarespuestaaestaotraconsultaseralaqueapareceenelmargen.

4) PredicadoIS NULL

ParacomprobarsiunvaloresnuloutilizaremosIS NULL,yparaaveriguarsinoloes,IS NOT NULL.Elformatoes: SELECT nombre_columnas_a_seleccionar FROM tabla_a_consultar WHERE columna IS [NOT] NULL;
EjemplodeusodelpredicadoIS NULL

UnejemplodeusodeestepredicadoseraQueremossaberelcdigoyelnombredetodoslosempleadosquenoestnasignadosaningnproyecto: SELECT codigo_empl, nombre_empl FROM empleados WHERE num_proyec IS NULL;

FUOC71Z799014MO
codigo_emp l 8 nombre_emp l Sergio

38

EllenguajeSQL

Obtendramoslarespuestaquetenemosalmargen.

5) PredicadosANY/SOMEyALL

Paraversiunacolumnacumplequetodassusfilas(ALL)oalgunasdesusfilas(ANY/SOME)satisfaganunacondicin, podemoshacer: SELECTnombre_columnas_aseleccionar FROMtabla_a_consultar WHEREcolumnaoperador_comparacin{ALL|ANY|SOME}subconsulta;


LospredicadosANY/SOME Podemoselegircualquiera delosdospredicadospara pedirquealgunafila satisfagaunacondicin.

EjemplodeusodelospredicadosALLyANY/SOME

a) VeamosunejemplodeaplicacindeALLparaencontrarloscdigosylosnombresdelosproyectosenlosquelossueldosdetodoslosempleados asignadossonmenoresqueelpreciodelproyecto: SELECT codigo_proyec, nombre_proyec FROM proyectos WHERE precio > ALL (SELECT sueldo FROM empleados WHERE codigo_proyec = num_proyec); codigo_proye nombre_proye c c 1 2 3 4 GESCOM PESCI SALSA TINELL

Fijmonosenlacondicinde WHERE delasubconsulta,quenosaseguraquelossueldosqueobservamossonlosdelosempleadosasignadosal proyectodelaconsulta.Larespuestaaestaconsultaseralaqueapareceenelmargen.

b) Acontinuacin,presentamosunejemplodeANY/SOMEparabuscarloscdigosylosnombresdelosproyectosquetienenalgnempleadoque ganaunsueldomselevadoqueelpreciodelproyectoenelquetrabaja. SELECT codigo_proyec, nombre_proyec FROM proyectos WHERE precio < ANY (SELECT sueldo

FUOC71Z799014MO

39

EllenguajeSQL

FROM empleados WHERE codigo_proyec = num_proyec); codigo_proye nombre_proye c c

Larespuestaaestaconsultaestvaca,comoseveenelmargen.

6) PredicadoEXISTS

Paracomprobarsi una subconsulta produce alguna filaderesultados, podemos utilizarlasentenciadenominada test de existencia: EXISTS. Para comprobar si una subconsulta no produce ninguna fila de resultados, podemos utilizar NOT EXISTS. SELECT nombre_columnas_a_seleccionar FROM tabla_a_consultar WHERE [NOT] EXISTS subconsulta;
EjemplodeusodelpredicadoEXISTS

Unejemploenelquesebuscanloscdigosylosnombresdelosempleadosqueestnasignadosaalgnproyectosera: SELECT codigo_empl, nombre_empl FROM empleados WHERE EXISTS (SELECT * FROM proyectos WHERE codigo_proyec = num_proyec); codigo_emp l 1 2 3 4 5 6 7 nombre_emp l Mara Pedro Ana Jorge Clara Laura Rogelio

Larespuestaaestaconsultaseralaquesemuestraenelmargen.

2Ordenacindelosdatosobtenidosenrespuestasaconsultas

Sisedeseaque,alhacerunaconsulta,losdatosaparezcanenunordendeterminado,esprecisoutilizarlaclusulaORDER BY

FUOC71Z799014MO
enlasentenciaSELECT,quepresentaelsiguienteformato:

40

EllenguajeSQL

SELECT nombre_columnas_a seleccionar FROM tabla_a_consultar [WHERE condiciones] ORDER BY columna_segn_la_cual_se_quiere_ordenar [DESC] [, col_ordenacin [DESC]...];
ConsultaaBDUOCconrespuestaordenada

Imaginemosquequeremosconsultarlosnombresdelosempleadosordenadossegnelsueldoqueganan,ysigananelmismosueldo,ordenados alfabticamenteporelnombre: SELECT codigo_empl, nombre_empl, apellido_empl, sueldo FROM empleados ORDER BY sueldo, nombre_empl; Estaconsultadaralarespuestasiguiente:

codigo_empl 6 8 5 7 3 4 2 1

nombre_empl Laura Sergio Clara Rogelio Ana Jorge Pedro Mara

apellido_empl Tort Grau Blanc Salt Ros Roca Mas Puig

sueldo 3,0E+4 3,0E+4 4,0E+4 4,0E+4 7,0E+4 7,0E+4 9,0E+4 1,0E+5

Sinoseespecificanadams,seseguirunordenascendente,perosisedeseaseguirunordendescendenteesnecesarioaadir DESCdetrsdecadafactordeordenacinexpresadoenlaclusulaORDER BY:

ORDERBYcolumna_ordenacin [DESC][,columna[DESC]...];

TambinsepuedeexplicitarunordenascendenteponiendolapalabraclaveASC(opcinpordefecto).

FUOC71Z799014MO
2Consultasconagrupacindefilasdeunatabla

41

EllenguajeSQL

Lasclusulassiguientes,aadidasalainstruccinSELECT FROM,permitenorganizarlasfilasporgrupos:

a) LaclusulaGROUP BYnossirveparaagruparfilassegnlascolumnasqueindiqueestaclusula.

b) LaclusulaHAVINGespecificacondicionesdebsquedaparagruposdefilas;llevaacabolamismafuncinqueantes cumplalaclusulaWHEREparalasfilasdetodalatabla,peroahoralascondicionesseaplicanalosgruposobtenidos.

Presentaelsiguienteformato: SELECT nombre_columnas_a seleccionar FROM tabla_a_consultar [WHERE condiciones] GROUP BY columnas_segn_las_cuales_se_quiere_agrupar [HAVING condiciones_por_grupos] [ORDERBYcolumna_ordenacin[DESC][,columna [DESC]...]]; NotemosqueenlassentenciasSQLsevanaadiendoclusulasamedidaqueladificultadolaexigenciadelaconsultalo requiere.

ConsultaconagrupacindefilasenBDUOC

Imaginemosquequeremossaberelsueldomedioquegananlosempleadosdecadadepartamento: SELECT nombre_dep, ciudad_dep, AVG(sueldo) AS sueldo_medio FROM empleados GROUP BY nombre_dep, ciudad_dep; Factoresdeagrupacin Losfactoresdeagrupacin delaclusulaGROUP BY debenser,comomnimo, lascolumnasquefiguran enSELECT,exceptuando lascolumnasafectadaspor funcionesdeagregacin.

Elresultadodeestaconsultasera: nombre_dep DIR DIR ciudad_dep Barcelona Girona sueldo_medio 9,0E+4 1,0E+5

FUOC71Z799014MO
DIS DIS PROG NULL

42

EllenguajeSQL

Lleida Barcelona Tarragona NULL

7,0E+4 7,0E+4 3,3E+4 4,0E+4

EjemplodeusodelafuncindeagregacinSUM

VeamosunejemplodeusodeunafuncindeagregacinSUMdelSQLqueapareceenlaclusulaHAVINGdeGROUP BY:Queremossaberlos cdigosdelosproyectosenlosquelasumadelossueldosdelosempleadosesmayorque180.000euros: SELECT num_proyec FROM empleados GROUP BY num_proyec HAVING SUM (sueldo) >1.8E+5; Elresultadodeestaconsultaseraelquesevealmargen. num_proyec 4

DISTINCTyGROUP BY Enesteejemplonoes necesarioponerDISTINCT, apesardequelacolumna num_proyecnoesatributo identificador. Fijmonosenqueenla tablaempleadoshemos puesto quetodoslosproyectos tienenelmismocdigo juntosenunmismogrupoy noesposibleque aparezcanrepetidos.

2Consultasamsdeunatabla

Muchasvecesqueremosconsultardatosdemsdeunatablahaciendocombinacionesdecolumnasdetablasdiferentes.Enel SQLesposiblelistarmsdeunatablaquesequiereconsultarespecificndoloenlaclusulaFROM.

1) Combinacin

FUOC71Z799014MO

43

EllenguajeSQL

LacombinacinconsiguecrearunasolatablaapartirdelastablasespecificadasenlaclusulaFROM,haciendocoincidirlos valoresdelascolumnasrelacionadasdeestastablas.

Recordadquelamismaoperacindecombinacin,perodellgebrarelacional,sehavistoenelsubapartado5.3.3.delaunidadElmodelorelacionalyellgebrarelacionalde estecurso.

EjemplodecombinacinenBDUOC

AcontinuacinmostramosunejemploconlabasededatosBDUOCenelquequeremossaberelNIFdelclienteyelcdigoyelpreciodelproyecto quedesarrollamosparaelclientenmero20: SELECTproyectos.codigo_proyecto,proyectos.precio, clientes.nif FROM clientes, proyectos WHEREclientes.codigo_cli=proyectos.codigo_cliente ANDclientes. codigo_cli=20; Elresultadosera: proyectos.codigo_proyecto 3 proyectos.precio 1,0E+6 clientes.nif 38.123.898E

Sitrabajamosconmsdeunatabla,puedeocurrirquelatablaresultantetengadoscolumnasconelmismonombre.Porello esobligatorioespecificaraqutablacorrespondenlascolumnasalasquenosestamosrefiriendo,denominandolatablaala quepertenecenantesdeponerlas(porejemplo,clientes.codigo_cli).Parasimplificarlo,seutilizanlosaliasque,en estecaso,sedefinenenlaclusulaFROM.


EjemplodealiasenBDUOC

c podra ser el alias de la tabla clientes. De este modo, para indicar a qu tabla pertenece codigo_cli, slo hara falta poner: c.codigo_cli.

Veamoscmoquedaralaconsultaanteriorexpresadamediantealias,aunqueenesteejemplonoserannecesarios,porquetodaslascolumnasdelas dostablastienennombresdiferentes.Pediremos,adems,lascolumnasc.codigo_cliyp.codigo_cliente. SELECTp.codigo_proyecto,p.precio,c.nif,p.codigo_cliente,c.codigo_cli FROM clientes c, proyectos p WHERE c.codigo_cli = p.codigo_cliente AND c.codigo_cli = 20; Entoncesobtendramosesteresultado:

p.codigo_proyec p.precio 3 1,0E+6

c.nif 38.123.898E

p.codigo_client c.codigo_cli e 20 20

Notemosqueen WHERE necesitamosexpresarelvnculo que seestableceentrelasdostablas,en estecaso codigo_cli de clientes y codigo_clientedeproyectos.Expresadoenoperacionesdellgebrarelacional,estosignificaquehacemosunacombinacinenlugardeun

FUOC71Z799014MO
productocartesiano.

44

EllenguajeSQL

Fijmonosenque,aligualqueenlgebrarelacional,laoperacinqueacabamosdehaceresunaequicombinacin(equijoin);porlotanto,nos aparecendoscolumnasidnticas:c.codigo_cliyp.codigo_cliente.

Lasoperacionesdellgebrarelacionalsehanvistoenelapartado5delaunidadElmodelorelacionalyellgebrarelacional deestecurso.

LaformadeexpresarlacombinacinqueacabamosdeverpertenecealSQL92introductorio.Unaformaalternativade realizarlaequicombinacinanterior,utilizandoelSQL92intermedioocompleto,seralasiguiente:

SELECT nombre_columnas_a_seleccionar FROM tabla1 JOIN tabla2 {ON condiciones|USING (columna [, columna...])} [WHERE condiciones];
EjemploanteriorconelSQL92intermedioocompleto

ElejemploquehemosexpuestoantesutilizandoelSQL92intermedioocompletosera: SELECT p.codigo_proyecto, p.precio, c.nif, p.codigo_cliente, c.codigo_cli FROM clientes c JOIN proyectos p ON c.codigo_cli = p.codigo_cliente WHERE c.codigo_cli = 20; Yobtendramoselmismoresultadodeantes.

LaopcinON,ademsdeexpresarcondicionesconlaigualdad,enelcasodequelascolumnasquequeramosvinculartengan nombresdiferentes,nosofrecelaposibilidaddeexpresarcondicionesconlosdemsoperadoresdecomparacinquenosean eldeigualdad.Seraelequivalentealaoperacinqueenlgebrarelacionalhemosdenominadocombinacin(join).

Podisverlaequicombinacinylacombinacinenelsubapartado5.3.3delaunidadElmodelorelacionalyellgebrarelacionaldeestecurso.

Tambinpodemosutilizarunamismatabladosvecesconaliasdiferentes,paradistinguirlas.

DosaliasparaunamismatablaenBDUOC

Sipidisemosloscdigosylosapellidosdelosempleadosquegananmsqueelempleadoquetieneporcdigoelnmero5,haramoslosiguiente: SELECT el.codigo_empl, el.apellido_empl FROM empleados el JOIN empleados e2 ON el.sueldo > e2.sueldo WHERE e2.codigo_empl = 5; Hemostomadolatabla e2 parafijarlafiladelempleadoconcdigonmero5,demodoquepodamoscompararelsueldodelatabla e1,que contieneatodoslosempleados,conelsueldodelatablae2,quecontienesloalempleado5.

Larespuestaaestaconsultasera:

FUOC71Z799014MO
e1.codigo_empl 1 2 3 4

45

EllenguajeSQL

e1.apellido_empl Puig Mas Ros Roca

2) Combinacinnatural Lacombinacinnatural(naturaljoin)dedostablasconsistebsicamente,aligualqueenellgebrarelacional,enhaceruna equicombinacinentrecolumnasdelmismonombreyeliminarlascolumnasrepetidas.Lacombinacinnatural,utilizandoel SQL92intermedioocompleto,seharadelaformasiguiente: SELECT nombre_columnas_a_seleccionar FROM tabla1 NATURAL JOIN tabla2 [WHERE condiciones];
CombinacinnaturalenBDUOC

Veamosacontinuacinunejemploenelquelascolumnasparalasqueseharalacombinacinnaturalsedenominanigualenlasdostablas.Ahora queremossaberelcdigoyelnombredelosempleadosqueestnasignadosaldepartamentocuyotelfonoes977.33.38.52: SELECT codigo_empl, nombre_empl FROM empleados NATURAL JOIN departamentos WHERE telefono = '977.333.852'; LacombinacinnaturaltambinsepodrahacerconlaclusulaUSING,sloaplicandolapalabrareservadaJOIN: SELECT codigo_empl, nombre_empl FROM empleados JOIN departamentos USING (nombre_dep, ciudad_dep) WHERE telefono = '977.333.852'; Larespuestaquedarasera: empleados.codigo_empl 5 6 8 empleados.nombre_empl Clara Laura Sergio

3) Combinacininternayexterna Cualquiercombinacinpuedeserinternaoexterna: a) Lacombinacininterna(innerjoin)slosequedaconlasfilasquetienenvaloresidnticosenlascolumnasdelastablas quecompara.Estopuedehacerqueperdamosalgunafilainteresantedealgunadelasdostablas;porejemplo,porquese

FUOC71Z799014MO

46

EllenguajeSQL

encuentraaNULLenelmomentodehacerlacombinacin.Suformatoeselsiguiente: SELECT nombre_columnas_a_seleccionar FROM t1 [NATURAL] [INNER] JOIN t2 {ON condiciones| |USING (columna [,columna...])} [WHERE condiciones]; b) Porellodisponemosdela combinacinexterna (outerjoin),quenospermiteobtenertodoslosvaloresdelatablaque hemospuestoaladerecha,losdelatablaquehemospuestoalaizquierdaotodoslosvaloresdelasdostablas.Suformatoes: SELECT nombre_columnas_a_seleccionar FROM t1 [NATURAL] [LEFT|RIGHT|FULL] [OUTER] JOIN t2 {ON condiciones| [USING (columna [,columna...])} [WHERE condiciones];
CombinacinnaturalinternaenBDUOC

Siquisiramosvincularconunacombinacinnaturalinternalastablasempleadosydepartamentosparasaberelcdigoyelnombrede todoslosempleadosyelnombre,laciudadyeltelfonodetodoslosdepartamentos,haramos: SELECT e.codigo_empl, e.nombre_empl, e.nombre_dep, e.ciudad_dep, d.telefono FROM empleados e NATURAL JOIN departamentos d; Combinacininterna Aunqueenelejemplo estamoshaciendouna combinacin naturalinterna,noes necesarioponerlapalabra INNER,yaqueeslaopcin pordefecto.

Yobtendramoselsiguienteresultado: e.codigo_emp l 1 2 3 4 5 6 8 e.nombre_emp l Mara Pedro Ana Jorge Clara Laura Sergio e.nombre_de p DIR DIR DIS DIS PROG PROG PROG e.ciudad_de p Girona Barcelona Lleida Barcelona Tarragona Tarragona Tarragona d.telefon o 972.23.89.70 93.422.60.70 973.23.50.40 93.224.85.23 977.33.38.52 977.33.38.52 977.33.38.52

Fijmonosenqueenelresultadonoapareceelempleadonmero7,quenoestasignadoaningndepartamento,nieldepartamentodeprogramacin deGirona,quenotieneningnempleadoasignado.

FUOC71Z799014MO
CombinacinnaturalexternaaBDUOC

47

EllenguajeSQL

Enlosejemplossiguientesveremoscmovaranlosresultadosqueiremosobteniendosegnlostiposdecombinacinexterna:

a) Combinacinexternaizquierda SELECT e.codigo_empl, e.nombre_empl, e.nombre_dep, e.ciudad_dep, d.telefono FROM empleados e NATURAL LEFT OUTER JOIN departamentos d; Elresultadoseraelquepodemosveracontinuacin: e.codigo_emp l 1 e.nombre_emp l Mara e.nombre_de p DIR e.ciudad_de p Girona d.telefon o 972.23.89.7 0 93.422.60.7 0 973.23.50.4 0 93.224.85.2 3 977.33.38.5 2 977.33.38.5 2 NULL 977.33.38.5 2

Pedro

DIR

Barcelona

Ana

DIS

Lleida

Jorge

DIS

Barcelona

Clara

PROG

Tarragona

6 7 8

Laura Rogelio Sergio

PROG NULL PROG

Tarragona NULL Tarragona

Combinacinexternaizquierda Aqufiguraelempleado7.

b) Combinacinexternaderecha SELECT e.codigo_empl, e.nombre_empl, e.nombre_dep, e.ciudad_dep, d.telefono FROM empleados e NATURAL RIGHT OUTER JOIN departamentos d; Obtendramosesteresultado: e.codigo_emp l 1 2 3 e.nombre_emp l Mara Pedro Ana e.nombre_de p DIR DIR DIS e.ciudad_de p Girona Barcelona Lleida d.telefon o 972.23.89.70 93.422.60.70 973.23.50.40

FUOC71Z799014MO
4 5 6 8 NULL Jorge Clara Laura Sergio NULL

48

EllenguajeSQL

DIS PROG PROG PROG PROG

Barcelona Tarragona Tarragona Tarragona Girona

93.224.85.23 977.33.38.52 977.33.38.52 977.33.38.52 972.23.50.91

Combinacinexternaderecha Aqufiguraeldepartamento deprogramacindeGirona.

c) Combinacinexternaplena
SELECT e.codigo_empl, e.nombre_empl, e.nombre_dep, e.ciudad_dep, d.telefono FROM empleados e NATURAL FULL OUTER JOIN departamentos d; Yobtendramoselsiguienteresultado: e.codigo_emp l 1 2 3 4 5 6 7 8 NULL e.nombre_emp l Mara Pedro Ana Jorge Clara Laura Rogelio Sergio NULL e.nombre_de p DIR DIR DIS DIS PROG PROG NULL PROG PROG e.ciudad_de p Girona Barcelona Lleida Barcelona Tarragona Tarragona NULL Tarragona Girona d.telefon o 972.23.89.70 93.422.60.70 973.23.50.40 93.224.85.23 977.33.38.52 977.33.38.52 NULL 977.33.38.52 972.23.50.91

Combinacinexternaplena Aqufiguraelempleado7 yeldepartamento deprogramacindeGirona.

FUOC71Z799014MO
4) Combinacionesconmsdedostablas

49

EllenguajeSQL

SiqueremoscombinartrestablasomsconelSQL92introductorio,slotenemosqueaadirtodaslastablasenelFROMy losvnculosnecesariosenelWHERE.SiqueremoscombinarlasconelSQL92intermediooconelcompleto,tenemosqueir haciendocombinacionesdetablasporpares,ylatablaresultanteseconvertirenelprimercomponentedelsiguientepar.


CombinacionesconmsdedostablasenBDUOC

Veamosejemplosdelosdoscasos,suponiendoquequeremoscombinarlastablasempleados,proyectosyclientes: SELECT * FROM empleados, proyectos, clientes WHERE num_proyec = codigo_proyec AND codigo_cliente = codigo_cli; obien: SELECT * FROM (empleados JOIN proyectos ON num_proyec = codigo_proyec) JOIN clientes ON codigo_cliente = codigo_cli;

2Launin

LaclusulaUNIONpermiteunirconsultasdedosomssentenciasSELECTFROM.Suformatoes: SELECT columnas FROM tabla [WHERE condiciones] UNION [ALL] SELECT columnas FROM tabla [WHERE condiciones]; Siponemos laopcin ALL,aparecerntodaslasfilasobtenidas acausadelaunin. Nolapondremos siqueremos eliminarlasfilasrepetidas.Lomsimportantedelauninesquesomosnosotrosquienestenemosqueprocurarquese efecteentrecolumnasdefinidassobredominioscompatibles;esdecir,quetenganlamismainterpretacinsemntica. Como ya hemos comentado, el SQL92 no nos ofrece herramientas para asegurar la compatibilidad semntica entre columnas.

UtilizacindelauninenBDUOC

Siqueremossabertodaslasciudadesquehayennuestrabasededatos,podramoshacer: SELECT ciudad FROM clientes UNION SELECT ciudad_dep FROM departamentos; ciudad Barcelona

FUOC71Z799014MO
Girona Lleida Tarragona

50

EllenguajeSQL

Elresultadodeestaconsultaseraelquesemuestraalmargen.

2Lainterseccin

Parahacerla interseccin entredos omssentencias SELECT FROM,podemos utilizarlaclusula INTERSECT,cuyo formatoes: SELECT columnas FROM tabla [WHERE condiciones] INTERSECT [ALL] SELECT columnas FROM tabla [WHERE condiciones]; Siindicamoslaopcin ALL,aparecerntodaslasfilasobtenidasapartirdelainterseccin.Nolapondremossiqueremos eliminarlasfilasrepetidas.

Lo ms importante de la interseccin es que somos nosotros quienes tenemos que vigilar que se haga entre columnas definidassobredominioscompatibles;esdecir,quetenganlamismainterpretacinsemntica.
UtilizacindelainterseccinenBDUOC Siqueremossabertodaslasciudadesdondetenemosdepartamentosenlosquepodamosencontraralgncliente,podramoshacer: SELECT ciudad FROM clientes INTERSECT SELECT ciudad_dep FROM departamentos; ciudad Barcelona Girona Lleida Tarragona

Elresultadodeestaconsultaseraelquesemuestraalmargen.

Sinembargo,lainterseccinesunadelasoperacionesdelSQLquesepuedehacerdemsformasdiferentes.Tambin

FUOC71Z799014MO
podramosencontrarlainterseccinconINoEXISTS:

51

EllenguajeSQL

a) InterseccinutilizandoIN SELECT columnas FROM tabla WHERE columna IN (SELECT columna FROM tabla [WHERE condiciones]); b) InterseccinutilizandoEXISTS SELECT columnas FROM tabla WHERE EXISTS (SELECT * FROM tabla WHERE condiciones);
EjemploanteriorexpresadoconINyconEXISTS

ElejemploquehemospropuestoantessepodraexpresarconIN: SELECT c.ciudad FROM clientes c WHERE c.ciudad IN (SELECT d.ciudad_dep FROM departamentos d); otambinconEXISTS: SELECT c.ciudad FROM clientes c WHERE EXISTS (SELECT * FROM departamentos d WHERE c.ciudad = d.ciudad_dep;

2Ladiferencia

Paraencontrarladiferenciaentredosomssentencias SELECT FROMpodemosutilizarlaclusula EXCEPT,quetieneeste formato: SELECT columnas FROM tabla [WHERE condiciones] EXCEPT [ALL] SELECT columnas FROM tabla [WHERE condiciones]; Siponemoslaopcin ALL aparecerntodaslasfilasquedaladiferencia.Nolapondremossiqueremoseliminarlasfilas repetidas.

FUOC71Z799014MO

52

EllenguajeSQL

Lomsimportantedeladiferenciaesquesomosnosotrosquienestenemosquevigilarquesehagaentrecolumnasdefinidassobre dominioscompatibles.

UtilizacindeladiferenciaenBDUOC

Siqueremossaberlosclientesquenonoshancontratadoningnproyecto,podramoshacer: SELECT codigo_cli FROM clientes EXCEPT SELECT codigo_cliente FROM proyectos; codigo_cli 40

Elresultadodeestaconsultaseraelqueseveenelmargen.

Ladiferenciaes,juntoconlainterseccin,unadelasoperacionesdelSQLquesepuederealizardemsformasdiferentes. TambinpodramosencontrarladiferenciautilizandoNOT INoNOT EXISTS:

a) DiferenciautilizandoNOT IN: SELECT columnas FROM tabla WHERE columna NOT IN (SELECT columna FROM tabla [WHERE condiciones]); b) DiferenciautilizandoNOT EXISTS: SELECT columnas FROM tabla WHERE NOT EXISTS (SELECT * FROM tabla WHERE condiciones);
EjemploanteriorexpresadoconNOT INyconNOT EXISTS

ElejemploquehemoshechoantessepodraexpresarconNOT IN: SELECT c.codigo_cli FROM clientes c WHERE c.codigo_cli NOT IN (SELECT p.codigo_cliente FROM proyectos p); otambinconNOT EXISTS SELECT c.codigo_cli

FUOC71Z799014MO

53

EllenguajeSQL

FROM clientes c WHERE NOT EXISTS (SELECT * FROM proyectos p WHERE c.codigo_cli = p.codigo_cliente);

3Sentenciasdecontrol

Ademsdedefinirymanipularunabasededatosrelacional,esimportantequeseestablezcan mecanismosdecontrol para resolverproblemasdeconcurrenciadeusuariosygarantizarlaseguridaddelosdatos.Paralaconcurrenciadeusuariosutilizaremos elconceptodetransaccin,yparalaseguridadveremoscmosepuedeautorizarydesautorizarausuariosaaccederalabasede datos.

3Lastransacciones

Unatransaccinesunaunidadlgicadetrabajo.Oinformalmente,ytrabajandoconSQL,unconjuntodesentenciasquese ejecutancomosifuesenunasola.Engeneral,lassentenciasqueformanpartedeunatransaccinseinterrelacionanentres,y notienesentidoqueseejecuteunasinqueseejecutenlasdems.

LamayoradelastransaccionesseiniciandeformaimplcitaalutilizaralgunasentenciaqueempiezaconCREATE,ALTER, DROP,SET,DECLARE,GRANToREVOKE,aunqueexistelasentenciaSQLparainiciartransacciones,queeslasiguiente:

SET TRANSACTION {READ ONLY|READ WRITE};

SiqueremosactualizarlabasededatosutilizaremoslaopcinREAD WRITE,ysinolaqueremosactualizar,elegiremosla opcinREAD ONLY. Sinembargo,encambio,unatransaccinsiempredebeacabarexplcitamenteconalgunadelassentenciassiguientes:

{COMMIT|ROLLBACK} [WORK];

Ladiferenciaentre COMMIT y ROLLBACK esquemientraslasentencia COMMIT confirmatodosloscambiosproducidos contra la BD durante la ejecucin de la transaccin, la sentencia ROLLBACK deshace todos los cambios que se hayan producidoenlabasededatosyladejacomoestabaantesdeliniciodenuestratransaccin.

LapalabrareservadaWORKslosirveparaaclararloquehacelasentencia,yestotalmenteopcional.
Ejemplodetransaccin

Acontinuacinproponemosunejemplodetransaccinenelquesequieredisminuirelsueldodelosempleadosquehantrabajadoenelproyecto3en

FUOC71Z799014MO

54

EllenguajeSQL

1.000euros.yaumentarelsueldodelosempleadosquehantrabajadoenelproyecto1tambinen1.000euros. SET TRANSACTION READ WRITE; UPDATE empleados SET sueldo = sueldo 1000 WHERE num_proyec = 3; UPDATE empleados SET sueldo = sueldo + 1000 WHERE num_proyec = 1; COMMIT;

3Lasautorizacionesydesautorizaciones

Todoslosprivilegiossobrelabasededatoslostienesupropietario,peronoeselnicoqueaccedeasta.Porestemotivo,el SQLnosofrecesentenciasparaautorizarydesautorizaraotrosusuarios.

1) Autorizaciones

Paraautorizar,elSQLdisponedelasiguientesentencia: GRANT privilegios ON objeto TO usuarios [WITH GRANT OPTION]; Dondetenemosque:

a) privilegiospuedeser:

ALL PRIVILEGES:todoslosprivilegiossobreelobjetoespecificado.

USAGE:utilizacindelobjetoespecificado;enestecasoeldominio.

SELECT:consultas.

INSERT[(columnas)]:inserciones.Sepuedeconcretardequcolumnas.

UPDATE[(columnas)]:modificaciones.Sepuedeconcretardequcolumnas.

DELETE:borrados.

REFERENCES[(columna)]:referenciadelobjetoenrestriccionesdeintegridad.Sepuedeconcretardequcolumnas.

b) Objetodebeser:

FUOC71Z799014MO
DOMAIN:dominio

55

EllenguajeSQL

TABLE:tabla.

Vista.

c) Usuarios puede ser todo el mundo: PUBLIC, o bien una lista de los identificadores de los usuarios que queremos autorizar.

d) LaopcinWITH GRANT OPTIONpermitequeelusuarioqueautoricemospueda,asuvez,autorizaraotrosusuariosa accederalobjetoconlosmismosprivilegiosconlosquehasidoautorizado.

2) Desautorizaciones

Paradesautorizar,elSQLdisponedelasiguientesentencia: REVOKE [GRANT OPTION FOR] privilegios ON objeto FROM usuarios [RESTRICT|CASCADE]; Dondetenemosque:

a) privilegios,objetoyusuariossonlosmismosqueparalasentenciaGRANT.

b) Laopcin GRANT OPTION FOR seutilizaraenelcasodequequisiramoseliminarelderechoaautorizar(WITH GRANT OPTION).

c) Siunusuarioalquehemosautorizadohaautorizadoasuvezaotros,quealmismotiempopuedenhaberhechoms autorizaciones,laopcinCASCADEhacequequedendesautorizadostodosalavez.

d) LaopcinRESTRICTnonospermitedesautorizaraunusuariosistehaautorizadoaotros.
4Sublenguajesespecializados

Muchasvecesquerremosaccederalabasededatosdesdeunaaplicacinhechaenunlenguajedeprogramacincualquiera.

FUOC71Z799014MO

56

EllenguajeSQL

Para utilizarel SQL desde un lenguaje de programacin, podemos utilizar el SQL hospedado, y para trabajarcon ste necesitamosunprecompiladorqueseparelassentenciasdellenguajedeprogramacindelasdellenguajedebasesdedatos. UnaalternativamuyinteresanteaestaformadetrabajarsonlasrutinasSQL/CLI.

Elobjetivo deesteapartadonoesexplicarcondetallenielSQLhospedadoni, anmenos,lasrutinasSQL/CLI.Slo introduciremoslasideasbsicasdelfuncionamientodeambos.

4SQLhospedado

ParacrearymanipularunabasededatosrelacionalnecesitamosSQL.Adems,silatareaquequeremoshacerrequiereel poderdeprocesamientodeunlenguajedeprogramacincomoJava,C,Cobol,Fortran,Pascal,etc.,podemosutilizarelSQL hospedadoenellenguajedeprogramacinelegido.Deestemodo,podemosutilizarlassentenciasdelSQLdentrodenuestras aplicaciones,poniendosiempredelantelapalabrareservadaEXEC SQL*.

a
*Puedehaberpequeasdiferencias dependiendodellenguaje deprogramacinconcreto queestemosconsiderando.

Para poder compilar la mezcla de llamadas de SQL y sentencias de programacin, antes tenemos que utilizar un precompilador.Un precompilador esunaherramientaqueseparalassentenciasdelSQLylassentenciasdeprogramacin. Alldondeenelprogramafuentehayaunasentenciadeaccesoalabasededatos,sedebeinsertarunallamadaalainterfazdel SGBD.Elprogramafuenteresultantedelaprecompilacinyaestnicamenteenellenguajedeprogramacin,preparadopara sercompilado,montadoyejecutado.

Enlafiguraqueencontrarisenlapginasiguientepodisobservarestefuncionamiento.

Todas las sentencias de definicin, manipulacin ycontrol que hemos visto paraelSQLse pueden utilizar enelSQL hospedado,peroprecedidasdelaclusulaEXEC SQL.Slohabrunaexcepcin:cuandoelresultadodeunasentenciaSQL obtengamsdeunafilaohagareferenciatambinamsdeuna,deberemostrabajarconelconceptodecursor.

Uncursorsetienequehaberdeclaradoantesdesuutilizacin(EXECSQLDECLAREnombre_cursorCURSORFOR). Parautilizarlo,sedebeabrir(EXEC SQL OPEN nombre_cursor),irtomandolosdatosunoauno,tratarlos(EXEC SQL FETCH nombre_cursor INTO),yfinalmente,cerrarlo(EXEC SQL CLOSE nombre_cursor).

FUOC71Z799014MO
4LasSQL/CLI

57

EllenguajeSQL

LasSQL/CLI(SQL/CallLevelInterface),denominadasdeformaabreviadaCLI,permitenqueaplicacionesdesarrolladas en un cierto lenguaje de programacin (con slo las herramientas disponibles para este lenguaje y sin el uso de un precompilador)puedanincluirsentenciasSQLmediantellamadasalibreras.EstassentenciasSQLsedebeninterpretaren tiempodeejecucindelprograma,adiferenciadelSQLhospedado,querequeraelusodeunprecompilador.

LainterfazODBC(OpenDatabaseConnectivity)defineunalibreradefuncionesquepermitealasaplicacionesaccederal SGBDutilizando elSQL.LasrutinasSQL/CLIestnfuertementebasadas enlascaractersticasdelainterfazODBC,y graciasaltrabajodesarrolladoporSAGX/Open(SQLAccessGroupX/Open),fueronaadidasalestndarANSI/ISOSQL92 en1995.

LasSQL/CLIsonsimplementerutinasquellamanalSGBDparainterpretarlassentenciasSQLquepidelaaplicacin.Desde elpuntodevistadelSGBD,lasSQL/CLIsepuedenconsiderar,simplemente,comootrasaplicaciones.

Resumen

En esta unidad hemos presentado las sentencias ms utilizadas del lenguaje estndar ANSI/ISO SQL92 de definicin, manipulacinycontroldebasesdedatosrelacionales.Comoyahemoscomentadoenlaintroduccin,elSQLesunlenguaje muypotente,yestohacequeexistanmssentenciasyopcionesdelasquehemosexplicadoenestemdulo.Sinembargo,no esmenosciertoquehemos vistomssentenciasquelasquealgunos sistemasrelacionalesofrecenactualmente.Hemos intentado seguircon la mayorfidelidadel estndar, incluyendo comentarios slocuando enla mayora delossistemas relacionalescomercialesalgunaoperacinsehacadeformadistinta.

ConociendoelSQL92podemostrabajarconcualquiersistemarelacionalcomercial;slotendremosquededicarunascuantas horasaverquvariacionessedanconrespectoalestndar.

RecordemoscmoserlacreacindeunabasededatosconSQL:

1) Enprimerlugar,tendremosquedarnombrealabasededatos,conlasentenciaCREATE DATABASE,silahay,ocon CREATE SCHEMA.

2) Acontinuacindefiniremoslastablas,losdominios,lasasercionesylasvistasqueformarnnuestrabasededatos.

3) Unavezdefinidaslastablas,queestarncompletamentevacas,sedebernllenarconlasentenciaINSERTINTO.

FUOC71Z799014MO

58

EllenguajeSQL

Cuando labase dedatos tenga un conjunto de filas,la podremos manipular, ya seaactualizando filas obien hacindo consultas.

Adems,podemosusartodaslassentenciasdecontrolquehemosexplicado.

Actividad
1. Seguroquesiemprehabisqueridosaberdndetenaisaquellapelculadevdeoquenuncaencontrabais.Porelloosproponemoscrearunabasede datosparaorganizarlascintasdevdeoylocalizarlasrpidamentecuandoosapetezcautilizarlas.Tendrisquecrearlabasededatosylastablas; tambindeberisdecidirlasclavesprimariaseinsertarfilas. Paraalmacenarlascintasdevdeo,tendremosquecrearlassiguientestablas: a) Lascintas:querremossabersucdigo,laestanteradondeseencuentran,elestanteylafila,suponiendoqueenunestantehayamsdeunafila. Tendremosqueponernosotroselcdigodelascintas,conunrotulador,enellomodecadauna. b) Laspelculas:querremossabersucdigo,ttulo,directorprincipal(enelcasodequehayamsdeuno)yeltema.Elcdigodelaspelculas tambinlotendremosqueescribirnosotrosconunrotuladorparadistinguirpelculasquetienenelmismonombre. c) Losactores:sloquerremossaberdeellosuncdigo,elnombreyelapellidoy,sisomosaficionadosalcine,otrosdatosquenospuedainteresar almacenar.Elcdigodelosactores,queinventaremosnosotros,nospermitirdistinguirentreactoresquesellamanigual. d) Pelculasquehayencadacinta:enestatablapondremoselcdigodelacintayelcdigodelapelcula.Enunacintapuedehabermsdeuna pelcula,ypodemostenerunapelcularepetidaenmsdeunacinta;sedebetenerencuentaestehechoenelmomentodeelegirlaclaveprimaria. e) Actoresque aparecen en las pelculas: en esta tabla indicaremos el cdigo de la pelcula y el cdigo del actor. En una pelcula puede participar msdeun actor y un actor puede aparecer en ms de una pelcula; hay que tener presente este hecho cuando seelige la clave primaria. Esperamosque,ademsdepracticarsentenciasdedefinicin,manipulacinycontroldelSQL,estaactividadosresultemuytil.

Ejerciciosdeautoevaluacin
ConlaactividadanteriorhemospracticadosentenciasdedefinicinycontroldelSQL.Mediantelassentenciasdemanipulacinhemosinsertado filasy,sinoshubisemosequivocado,tambinhabramosborradoymodificadoalgunafila.Conlosejerciciosdeautoevaluacinpracticaremosla partedesentenciasdemanipulacinquenohemostratadotodava:lasconsultas.Losejerciciosqueproponemosseharnsobrelabasededatos relacionalBDUOCquehaidoapareciendoalolargodeestaunidad.

1. Obtenedloscdigosylosnombresyapellidosdelosempleados,ordenadosalfabticamentedeformadescendenteporapellidoy,encasode repeticiones,pornombre.

2. ConsultadelcdigoyelnombredelosproyectosdelosclientesquesondeBarcelona.

3. Obtenedlosnombresylasciudadesdelosdepartamentosquetrabajanenlosproyectosnmero3ynmero4.

4. Detodoslosempleadosquepercibenunsueldodeentre50.000y80.000euros,buscadloscdigosdeempleadoylosnombresdelosproyectos quetienenasignados.

5. Buscadelnombre,laciudadyeltelfonodelosdepartamentosdondetrabajanlosempleadosdelproyectoGESCOM.

6. Obtenedloscdigosylosnombresyapellidosdelosempleadosquetrabajanenlosproyectosdepreciomsalto.

7. Averiguadculeselsueldomsaltodecadadepartamento.Concretamente,esnecesariodarelnombreylaciudaddeldepartamentoyelsueldo mselevado.

8. Obtenedloscdigosylosnombresdelosclientesquetienenmsdeunproyectocontratado.

9. Averiguadloscdigosylosnombresdelosproyectoscuyosempleadosasignadostienenunsueldosuperiora30.000euros.

10. Buscadlosnombresylasciudadesdelosdepartamentosquenotienenningnempleadoasignado.

FUOC71Z799014MO
Solucionario
Ejerciciosdeautoevaluacin
1. SELECT apellido_empl, nombre_empl, codigo_empl FROM empleados ORDER BY apellido_empl DESC, nombre_empl DESC; 2. ConelSQL92introductorio,lasolucinsera:

59

EllenguajeSQL

SELECT p.codigo_proyec, p.nombre_proyec FROM proyectos p, clientes c WHERE c.ciudad = Barcelona and c.codigo_cli = p.codigo_cliente; ConelSQL92intermediooconelcompleto,lasolucinsera: SELECT p.codigo_proyec, p.nombre_proyec FROM proyectos p JOIN clientes c ON c.codigo_cli = p.codigo_cliente WHERE c.ciudad = Barcelona; 3. SELECT DISTINCT e.nombre_dep, e.ciudad_dep FROM empleados e WHERE e.num_proyec IN (3,4); 4. ConelSQL92introductorio,lasolucinsera: SELECT e.codigo_empl, p.nombre_proyec FROM empleados e, proyectos p WHERE e.sueldo BETWEEN 5.0E+4 AND 8.0E+4 and e. num_proyec = p.codigo_proyec; ConelSQL92intermediooconelcompleto,lasolucinsera: SELECT e.codigo_empl, p.nombre_proyec FROM empleados e JOIN proyectos p ON e.num_proyec = p.codigo_proyec WHERE e.sueldo BETWEEN 5.0E+4 AND 8.0E+4; 5. ConelSQL92introductorio,lasolucinsera: SELECT DISTINCT d.* FROM departamentos d, empleados e, proyectos p WHERE p. nombre_proyec = GESCOM and d.nombre_dep = e.nombre_dep AND d.ciudad_dep = e.ciudad_dep and e. num_proyec = p.codigo_proyec; ConelSQL92intermediooconelcompleto,lasolucinsera: SELECT DISTINCT d.nombre_dep, d.ciudad_dep, d.telefono FROM (departamentos dNATURAL JOIN empleados e) JOIN proyectos p ON e.num_proyec = p.codigo_proyec WHERE p.nombre_proyec = GESCOM; 6. ConelSQL92introductorio,lasolucinsera: SELECT e.codigo_empl, e.nombre_empl, e.apellido_empl FROM proyectos p, empleados e WHERE e.num_proyec = p.codigo_proyec and p.precio = (SELECT MAX(p1. precio) FROM proyectos p1); ConelSQL92intermediooconelcompleto,lasolucinsera: SELECT e.codigo_empl, e.nombre_empl, e.apellido_empl FROM empleados e JOIN proyectos p ON e.num_proyec = p.codigo_proyec WHERE p.precio = (SELECT MAX(p1.precio) FROM proyectos p1); 7.

FUOC71Z799014MO

60

EllenguajeSQL

SELECT nombre_dep, ciudad_dep, MAX(sueldo) AS sueldo_maximo FROM empleados GROUP BY nombre_dep, ciudad_dep; 8. ConelSQL92introductorio,lasolucinsera: SELECT c.codigo_cli, c.nombre_cli FROM proyectos p, clientes c WHERE c.codigo_cli = p.codigo_cliente GROUP BY c.codigo_cli, c.nombre_cli HAVING COUNT(*) > 1; ConelSQL92intermediooconelcompleto,lasolucinsera: SELECT c.codigo_cli, c.nombre_cli FROM proyectos p JOIN clientes c ON c.codigo_cliente = p.codigo_cliente GROUP BY c.codigo_cli, c.nombre cli HAVING COUNT(*) > 1; 9. ConelSQL92introductorio,lasolucinsera: SELECT p.codigo_proyec, p.nombre_proyec FROM proyectos p, empleados e WHERE e.num_proyec = p.codigo_proyec GROUP BY p.codigo_proyec, p.nombre_proyec HAVING MIN(e.sueldo) > 3.0E+4; ConelSQL92intermediooconelcompleto,lasolucinsera: SELECT p.codigo_proyec, p.nombre_proyec FROM empleados e JOIN proyectos p ON e.num_proyec = p.codigo_proyec GROUP BY p.codigo_proyec, p.nombre_proyec HAVING MIN(e.sueldo)>3.0E+4; 10. SELECT d.nombre_dep, d.ciudad_dep FROM departamentos d WHERE NOT EXISTS (SELECT * FROM empleados e WHERE e.nombre_dep = d.nombre_dep AND e.ciudad_dep = d.ciudad_dep); obien: SELECT nombre_dep, ciudad_dep FROM departamentos EXCEPT SELECT nombre_dep, ciudad_dep FROM empleados;

Bibliografa
Bibliografabsica
ElSQL92sedefine,segnlobusquisenISOoenANSI,encualquieradelosdosdocumentossiguientes:

DatabaseLanguageSQL(1992).DocumentISO/IEC9075:1992.InternationalOrganizationforStandardization(ISO).

DatabaseLanguageSQL(1992).DocumentANSI/X3.1351992.AmericanNationalStandardsInstitute(ANSI).

Date,C.J.;Darwen,H.(1997).AguidetotheSQLStandard(4.aed.).Reading,Massachusetts:AddisonWesley. LoslibrosquecontienenladescripcindelestndarANSI/ISOSQL92sonbastantegruesosypesadosdeleer.Estelibroconstituyeunresumendel oficial.

FUOC71Z799014MO

61

EllenguajeSQL

Date,C.J.(2001).Introduccinalossistemasdebasesdedatos(7edicin).PrenticeHall. Tenistodavaunaversinmsresumidadeunodelosmismosautoresdellibroanteriorenelcaptulo4deestelibro.AdemsenelapndiceBpodis encontrarunapanormicadeSQL3.

OtroslibrostraducidosalcastellanodelSQL92queosrecomendamossonlossiguientes:

Groff,J.R.;Weinberg,P.N.(1998).LANTimes.GuadeSQL.Osborne:McGrawHill. Osrecomendamoslaconsultadeestelibroporsuclaridadyporloscomentariossobreelmodoenelqueseutilizaelestndarenlosdiferentes sistemasrelacionalescomerciales.

Silberschatz,A.;Korth,H.F.;Sudarshan,S.(1998).Fundamentosdebasesdedatos.(3.aed.).Madrid:McGrawHill. Podisencontrarunalecturarpida,resumida,perobastantecompletadelSQLenelcaptulo4deestelibro. Porltimo,paraprofundizarenelestudiodeSQL:1999recomendamoselsiguientelibro: Melton,J.;Simon,A.R.(2001).SQL:1999.UndestandignRelationalLanguageComponents.MorganKaufmann.

Anexos
Anexo1

Sentenciasdedefinicin 1) Creacindeesquemas: CREATE SCHEMA {nombre_esquema | AUTHORIZATION usuario} [lista_de_elementos_del_esquema]; 2) Borradodeesquemas:

DROP SCHEMA nombre_esquema {RESTRICT|CASCADE};

3) Creacindebasededatos:

CREATE DATABASE nombre_base_de_datos;

4) Borradodebasesdedatos:

DROP DATABASE nombre_base_de_datos;

5) Creacindetablas CREATE TABLE nombre_tabla (definicin_columna [, definicin_columna...] [, restricciones_tabla]

FUOC71Z799014MO
); Dondetenemoslosiguiente:

62

EllenguajeSQL

definicin_columnaes:

nombre_columna {tipos_datos|dominio} [def_defecto] [restric_col]

Unadelasrestriccionesdelatablaeraladefinicindeclavesforneas:

FOREIGN KEY clave_foranea REFERENCES tabla [(clave_primaria)] [ON DELETE {NO ACTION|CASCADE|SET DEFAULT|SET NULL}] [ON UPDATE {NO ACTION|CASCADE|SET DEFAULT|SET NULL}] 6) Modificacindeunatabla: ALTER TABLE nombre_tabla {accin_modificar_columna| accin_modif_restriccin_tabla}; Dondetenemoslosiguiente:

accin_modificar_columnapuedeser:

{ADD [COLUMN] columna def_columna| ALTER [COLUMN] columna {SET def_defecto|DROP DEFAULT}| DROP [COLUMN] columna {RESTRICT|CASCADE}} accin_modif_restriccion_tablapuedeser:

{ADD restriccin| DROP CONSTRAINT restriccin {RESTRICT|CASCADE}} 7) Borradodetablas:

DROP TABLE nombre_tabla {RESTRICT|CASCADE};

8) Creacindedominios: CREATE DOMAIN nombre_dominio [AS] tipo_datos [def_defecto] [restricciones_dominio]; Dondetenemoslosiguiente:

def_defectotieneelsiguienteformato:

DEFAULT {literal|funcin|NULL}

FUOC71Z799014MO
restricciones_dominiotieneelsiguienteformato:

63

EllenguajeSQL

[CONSTRAINT nombre_restriccion] CHECK (condiciones)

9) Modificacindeundominiosemntico: ALTER DOMAIN nombre_dominio {accin_modificar_dominio| accin_modif_restriccin_dominio}; Dondetenemoslosiguiente:

accin_modificar_dominiopuedeser:

{SET def_defecto|DROP DEFAULT}

accin_modif_restriccin_dominiopuedeser:

{ADD restricciones_dominio|DROP CONSTRAINT nombre_restriccin}

10) Borradodedominioscreadosporelusuario:

DROP DOMAIN nombre_dominio {RESTRICT|CASCADE};

11) Definicindeunaasercin:

CREATE ASSERTION nombre_asercin CHECK (condiciones);

12) Borradodeunaasercin:

DROP ASSERTION nombre_asercin;

13) Creacindeunavista: CREATE VIEW nombre_vista [(lista_columnas)] AS (consulta) [WITH CHECK OPTION]; 14) Borradodeunavista:

DROP VIEW nombre_vista {RESTRICT|CASCADE};

FUOC71Z799014MO
Anexo2

64

EllenguajeSQL

Sentenciasdemanipulacin

1) Insercindefilasenunatabla: INSERT INTO nombre_tabla [(columnas)] {VALUES ({v1|DEFAULT|NULL}, ..., {{vn|DEFAULT|NULL})|<consulta>}; 2) Borradodefilasdeunatabla DELETE FROM nombre_tabla [WHERE condiciones]; 3) Modificacindefilasdeunatabla: UPDATE nombre_tabla SET columna = {expresion|DEFAULT|NULL} [, columna = {expr|DEFAULT|NULL} ...] WHERE condiciones; 4) Consultasdeunabasededatosrelacional: SELECT [DISTINCT] nombre_columnas_a_seleccionar FROM tablas_a_consultar [WHERE condiciones] [GROUP BY atributos_segn_los_cuales_se_quiere_agrupar] [HAVING condiciones_por_grupos] [ORDER BY columna_ordenacin [DESC] [, columna [DESC]...]]; Anexo3 Sentenciasdecontrol 1) Iniciacindetransacciones:

SET TRANSACTION {READ ONLY|READ WRITE};

2) Finalizacindetransacciones:

{COMMIT|ROLLBACK} [WORK];

3) Autorizaciones: GRANT privilegios ON objeto TO usuarios [WITH GRANT OPTION]; 4) Desautorizaciones:

FUOC71Z799014MO

65

EllenguajeSQL

REVOKE [GRANT OPTION FOR] privilegios ON objeto FROM usuarios {RESTRICT|CASCADE};

Anda mungkin juga menyukai