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
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
48 48 49 51
FUOC71Z799014MO
EllenguajeSQL
4SQLhospedado................................................................................................. 4LasSQL/CLI.....................................................................................................
51 52 53 55 55 56 58 59
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.
Dehecho,sepuedendistinguirtresnivelesdentrodelSQL92:
FUOC71Z799014MO
tabla.
EllenguajeSQL
ElconceptodeclaveprimariaysuimportanciaenunarelacinotablasehavistoenlaunidadElmodelorelacionalyellgebrarelacionaldeestecurso.
2) Elnivelintermedio(intermediate),que,ademsdelSQL89,aadealgunasampliacionesdelSQL92.
3) Elnivelcompleto(full),queyatienetodaslasampliacionesdelSQL92.
ElmodelorelacionalsehapresentadoenlaunidadElmodelorelacionalyellgebrarelacionaldeestecurso.
Hablaremosdetablasenlugarderelaciones.
Hablaremosdecolumnasenlugardeatributos.
Hablaremosdefilasenlugardetuplas.
Sinembargo,apesardequelanomenclaturautilizadaseadiferente,losconceptossonlosmismos.
ConelSQLsepuededefinir,manipularycontrolarunabasededatosrelacional.Acontinuacinveremos,aunquesloenun nivelintroductorio,cmosepuedenrealizarestasacciones:
(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:
Ymuchasmscosasqueiremosviendopuntoporpuntoenlossiguientesapartados.
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.
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
Enesteapartadotambinveremoscmosedefinenlosdominios,lasaserciones(restricciones)ylasvistas.
Vistas
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
CREATE DATABASE
Muchosdelossistemas relacionalescomerciales (comoocurreenelcaso deInformix,DB2,SQL Serveryotros)han incorporadosentenciasde creacin debasesdedatosconla siguientesintaxis:
CREATE DATABASE
Lanomenclaturautilizadaenlasentenciaeslasiguiente:
FUOC71Z799014MO
11
EllenguajeSQL
Laspalabrasennegritasonpalabrasreservadasdellenguaje:
Lanotacin[...]quieredecirqueloquehayentreloscorchetessepodraponerono.
FUOC71Z799014MO
1Creacindetablas
12
EllenguajeSQL
Dondedefinicin_columnaes:
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.
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.
FLOAT (precisin)
DOUBLE PRECISION
DATE
TIME
TIMESTAMP
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
ParacrearundominioesnecesarioutilizarlasentenciaCREATE DOMAIN:
donderestricciones_dominiotieneelsiguienteformato:
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.
ParaborrarundominiodefinidoporelusuarioesprecisoutilizarlasentenciaDROP DOMAIN,quetieneesteformato:
Enestecaso,tenemosque:
FUOC71Z799014MO
16
EllenguajeSQL
LaopcindeborradodedominiosRESTRICThacequeeldominioslosepuedaborrarsinoseutilizaenningnsitio.
Laopcin CASCADE borraeldominioaunque est referenciado, ypone eltipo dedatos del dominio alldonde se utilizaba.
BorrarundominiodeBDUOC
SiquisiramosborrareldominioquehemoscreadoantesparalasciudadesdondeseencuentranlosdepartamentosdelaempresaBDUOC,haramos:
Enestecasonosdeberamosasegurardequeningunacolumnaestdefinidasobredom_ciu-dadesantesdeborrareldominio.
ParamodificarundominiosemnticoesnecesarioutilizarlasentenciaALTER DOMAIN.Veamossuformato:
Dondetenemoslosiguiente:
accin_modificar_dominiopuedeser:
accin_modif_restriccin_dominiopuedeser:
{ADDrestricciones_dominio|DROPCONSTRAINTnombre_restriccin}
ModificarundominioenBDUOC
Siquisiramosaadirunanuevaciudad(Matar)aldominioquehemoscreadoantesparalasciudadesdondeseencuentranlosdepartamentosdela empresaBDUOC,haramos:
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.
LaopcinDEFAULTtieneelsiguienteformato:
DEFAULT (literal|funcin|NULL)
Laposibilidadmsutilizadaylaopcinpordefecto,sinoespecificamosnada,eslapalabrareservadaNULL.Sinembargo, tambinpodemosdefinirnuestropropioliteral,obienrecurriraunadelasfuncionesqueaparecenenlatablasiguiente:
SYSTEM_USER
1Restriccionesdecolumna
FUOC71Z799014MO
Restriccionesdecolumna Restriccin NOT NULL
18
EllenguajeSQL
UNIQUE
PRIMARY KEY
1Restriccionesdetabla
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.
CHECK (condiciones)
FUOC71Z799014MO
19
EllenguajeSQL
1Modificacinyborradodeclavesprimariasconclaves
forneasquehacenreferenciaastas
Enotraunidaddeestecursohemosvistotrespolticasaplicablesaloscasosdeborradoymodificacindefilasquetienenuna claveprimariareferenciadaporclavesforneas.Estaspolticaseranlarestriccin,laactualizacinencascadaylaanulacin.
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
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
ParaborrarunaasercinesnecesarioutilizarlasentenciaDROP ASSERTION,quepresentaesteformato:
BorrarunaasercinenBDUOC
Porejemplo,paraborrarlaasercinrestriccion1,utilizaramoslasentenciaDROPASSERTIONdelaformasiguiente:
1Modificacinyborradodetablas
ParamodificarunatablaesprecisoutilizarlasentenciaALTER TABLE.Veamossuformato:
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:
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:
Enestecasotenemosque:
SiutilizamoslaopcinRESTRICT,latablanoseborrarsiestreferenciada,porejemplo,poralgunavista.
SiusamoslaopcinCASCADE,todoloquereferenciealatablaseborrarconsta.
1Creacinyborradodevistas
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
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
nombre_proyec
precio
fecha_inicio
fecha_fin
codigo_cliente
GESCOM PESCI
1,0E+6 2,0E+6
NULL 1598
10 10
codigo_proye c 3
nombre_proyec
precio
fecha_inicio
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
codigo_proyec 1
precio
fecha_inicio
fecha_prev_fin
fecha_fin
codigo_cliente
10 10 20 60
2 3 NULL
FUOC71Z799014MO
NULL NULL NULL NULL NULL NULL
24
EllenguajeSQL
NULL NULL
NULL NULL
NULL NULL
60 60
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:
FUOC71Z799014MO
25
EllenguajeSQL
BorrarunavistaenBDUOC
Paraborrarlavistaclientes_Barcelona_Girona,haramoslosiguiente:
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.
LasentenciaCOMMITseexplicaenelsubapartado3.1deestaunidaddidctica.
Enelcasodequelarestriccinhagareferenciaaunsoloatributo,podemoselegirlaposibilidadquemsnosguste.
Engeneral,lopondremostodocomorestriccionesdetabla,exceptoNOT NULLyCHECKcuandohagareferenciaaunasola
FUOC71Z799014MO
columna.
27
EllenguajeSQL
2Sentenciasdemanipulacin
2Insercindefilasenunatabla
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
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:
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
ModificacindelosvaloresdealgunasfilasenBDUOC
2IntroduccindefilasenlabasededatosrelacionalBDUOC
Tabladepartamentos:
Tablaclientes:
FUOC71Z799014MO
clientes nombre_cl i ECIGSA CME ACME JGM
30
EllenguajeSQL
codigo_cli 10
nif
direccion
ciudad
telefono
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:
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
ConsultasaBDUOC
Larespuestaaestaconsultasera:
codigo_cli 10
nombre_cli
nif
direccion
ciudad
telefono
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
LaclusulaWHEREnospermiteobtenerlasfilasquecumplenlacondicinespecificadaenlaconsulta.
ConsultasaBDUOCseleccionandofilas
Larespuestaaestaconsultaseralaquepodisverenelmargen.
ParadefinirlascondicionesenlaclusulaWHERE,podemosutilizaralgunodelosoperadoresdelosquedisponeelSQL,que sonlossiguientes:
a
Operadoreslgicos NOT Paralanegacindecondiciones
Operadoresdecomparacin = Igual
FUOC71Z799014MO
33
EllenguajeSQL
AND
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
Veremosejemplosdelasdemsfuncionesdeagregacinenlossiguientesapartados.
2Subconsultas
VeremoslaclusulaHAVINGenelsubapartado2.5.5deestaunidaddidctica.
SubconsultaenBDUOC
FUOC71Z799014MO
FROM proyectos WHERE precio = (SELECT MAX(precio) FROM proyectos); codigo_proye nombre_proye c c 4 TINELL
35
EllenguajeSQL
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
FUOC71Z799014MO
codigo_emp l 8 nombre_emp l Sergio
38
EllenguajeSQL
Obtendramoslarespuestaquetenemosalmargen.
5) PredicadosANY/SOMEyALL
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
b) Acontinuacin,presentamosunejemplodeANY/SOMEparabuscarloscdigosylosnombresdelosproyectosquetienenalgnempleadoque ganaunsueldomselevadoqueelpreciodelproyectoenelquetrabaja. SELECT codigo_proyec, nombre_proyec FROM proyectos WHERE precio < ANY (SELECT sueldo
FUOC71Z799014MO
39
EllenguajeSQL
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
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
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
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:
c.nif 38.123.898E
p.codigo_client c.codigo_cli e 20 20
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.
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
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
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
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
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
FUOC71Z799014MO
4) Combinacionesconmsdedostablas
49
EllenguajeSQL
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.
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
3Lastransacciones
LamayoradelastransaccionesseiniciandeformaimplcitaalutilizaralgunasentenciaqueempiezaconCREATE,ALTER, DROP,SET,DECLARE,GRANToREVOKE,aunqueexistelasentenciaSQLparainiciartransacciones,queeslasiguiente:
{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
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.
2) Desautorizaciones
Paradesautorizar,elSQLdisponedelasiguientesentencia: REVOKE [GRANT OPTION FOR] privilegios ON objeto FROM usuarios [RESTRICT|CASCADE]; Dondetenemosque:
a) privilegios,objetoyusuariossonlosmismosqueparalasentenciaGRANT.
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.
4SQLhospedado
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.
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:
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).
FUOC71Z799014MO
61
EllenguajeSQL
OtroslibrostraducidosalcastellanodelSQL92queosrecomendamossonlossiguientes:
Anexos
Anexo1
3) Creacindebasededatos:
4) Borradodebasesdedatos:
FUOC71Z799014MO
); Dondetenemoslosiguiente:
62
EllenguajeSQL
definicin_columnaes:
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:
def_defectotieneelsiguienteformato:
DEFAULT {literal|funcin|NULL}
FUOC71Z799014MO
restricciones_dominiotieneelsiguienteformato:
63
EllenguajeSQL
accin_modificar_dominiopuedeser:
accin_modif_restriccin_dominiopuedeser:
10) Borradodedominioscreadosporelusuario:
11) Definicindeunaasercin:
12) Borradodeunaasercin:
13) Creacindeunavista: CREATE VIEW nombre_vista [(lista_columnas)] AS (consulta) [WITH CHECK OPTION]; 14) Borradodeunavista:
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:
2) Finalizacindetransacciones:
{COMMIT|ROLLBACK} [WORK];
FUOC71Z799014MO
65
EllenguajeSQL