Escolar Documentos
Profissional Documentos
Cultura Documentos
ALBERTO MASFERRER
MANUALDESQLSERVER2
NDICE
SQL(StructureQueryLanguageLenguajedeConsultaEstructurado).............................1
IntroduccinaSQL.........................................................................................................1
Componentesdellenguaje SQL......................................................................................2
LenguajedeDefinicindedatos.....................................................................................7
Definicin dendices....................................................................................................11
Vistas............................................................................................................................13
Consulta dedatos........................................................................................................16
Insertardatos...............................................................................................................20
Borradodedatos..........................................................................................................23
Actualizacindedatos................................................................................................24
Consultascombinadas.JOINS......................................................................................27
Consultasagregadas...................................................................................................33
Subconsultas...............................................................................................................36
SQLesellenguajedeconsultauniversalparabasesdedatos.
SQL proporciona mtodos para definir la base datos, para manipular la informacin y
paragestionarlospermisosdeaccesoadichainformacin.
Para que un gestor de bases de datos sea considerado como relacional, debe
soportar SQL, independientementede las caractersticas particulares que dicho
gestorpuedaaportar.
ConocerSQLesconocerlasbasesdedatos,ytodosupotencial.
IntroduccinaSQL
SQLesellenguajedeconsultauniversalparabasesdedatos.
Los mandatos de SQL se dividen en tres grandes grupos diferenciados, los cuales
sern tratados por separado y que nicamente se presentan aqu a modo
introductorio.
Soncomandospropiosdeestelenguaje:
CREATETABLE
CREATEINDEX
CREATEVIEW
CREATE
SYNONYM
Soncomandospropiosdeestelenguaje:
SELECT
UPDATE
INSERT
INSERTINTO
DELETEFROM
Soncomandospropiosdeestelenguaje:
GRANT
REVOKE
Componentesdellenguaje SQL.
Tiposdedatos.
Dependiendodecadagestordebasesdedatoselnombrequesedaacadaunode
estostipospuedevariar.Bsicamentetenemoslossiguientestiposdedatos.
Integer
char(n)
Numeric(n.m) varchar(n,m)
Decimal(n,m)
Float
Date
DateTime
Bit
Image
Text
Msdetalladamentetenemos:
Tiposdedatosnumricos
Tipo
Definicin
Integer
Valoresenterosconsigno.
Numeric(n,m) Nmerosrealesdehasta18dgitos(condecimales),donden
representaeltotaldedgitosadmitidos(normalmente
denominadoprecisin)ymelnmerodeposicionesdecimales
(escala).
Decimal(n,m) Igualqueeltiponumrico.
Float
Bytes
4
517
517
Nmerodecomaflotante,estetipodedatossesueleutilizarpara 48
losvaloresennotacincientfica.
TiposdedatosAlfanumricos
Tipo
char(n)
varchar(n)
Definicin
Almacenade1a255caracteresalfanumricos.Estevalorviene
dado porn, yeseltamaoutilizadoendiscoparaalmacenar
dato.Es decir si definoun campocomo char(255),el tamao
realdelcamposerde255,aunqueelvalorsolocontenga100.
Bytes
0255
Igual que el tipo char, con la salvedad que varchar almacena 0255
nicamentelosbytesquecontengaelvalordelcampo.
Nota:
El tamao del campo vara en funcin de cada base de datos, siendo 255 el valor
estndar.Enrealidadeltamaovienedelimitadoporeltamaodelaspginasdedatos,
para SQL Server el lmite est en 8000 bytes (8000 caracteres), siempre y cuando
tengamosdefinidoeltamaodelapginadedatosa8K.
TiposdedatosFecha
Tipo
Date
Datetime
Definicin
Almacenafechas,conda,mesyao.
Almacenafechasconfechayhora
Bytes
8
4
Nota:
La aparicin de los tipos de datos de fecha supuso una autntica revolucin el
mundodelabasesdedatos,enrealidad,labasededatosalmacenainternamente
nmerosenteros,deahqueeltamaoseade4bytesy8bytes(2enteros),pero
aportalavalidacindeldatointroducido.
3
TiposdedatosLgicos
Tipo
Bit
Definicin
Tipobit.Almacenaun0nocero,segnlasbasesde
datosser11.
Seaplicalalgicabooleana,0esfalsoynocero
verdadero.
Bytes
1bit
TiposdedatosBLOB
Tipo
Image
Text
Definicin
Bytes
Almacenaimgenesenformatobinario,hastaunmximo 02Gb
de2Gbdetamao.
Almacenatextoenformatobinario,hastaunmximode 02Gb
2Gbdetamao.
Operadores
Losoperadoressepuedendefinircomocombinacionesdecaracteresqueseutilizan
tantopararealizarasignacionescomocomparacionesentredatos.
Losoperadoressedividenenaritmticos,relacionales,lgicos,yconcatenacin.
Aritmticos
Suma
+
Resta
Producto
*
Divisin
/
OperadoresSQL
** ^ Exponenciacin
Relacionales
<
Menorque
<=
Menoroigualque
>
Mayorque
>=
Mayoroigualque
<> != Distinto
!<
Nomenorque
!>
Nomayorque
Lgicos
Los operadores lgicos
AND
comparar
expresiones
OR
permiten
lgicas
4
PalabrasClave
LaspalabrasclavesonidentificadoresconunsignificadoespecialparaSQL,porloque
nopuedenserutilizadasparaotropropsitodistintoalquehansidopensadas.
SQL dispone de muy pocas rdenes, pero de mltiples palabras clave, lo que le
conviertenenunlenguajesencilloperotremendamentepotenteparallevaracabosu
funcin.
PalabrasClave
ALL
AND
ANY
ASC
AVG
CHECK
CREATE
DELETE
EXISTS
FROM
IN
INTO
NOT
OR
BEGIN
CLOSE
CURSOR
DESC
FETCH
GRANT
INDEX
LIKE
NUMERIC
ORDER
BY
COUNT
DECIMAL
DISTINCT
FLOAT
GROUP
INSERT
MAX
ON
REVOKE
CHAR
COMMIT
DECLARE
DEFAULT
FOR
HAVING
INTEGER
MIN
OPEN
ROLLBACK
SELECT
SET
SUM
TABLE
UNION
UNIQUE
UPDATE
USER
VALUES
VIEW
WHERE
WITH
Funciones Agregadas
LasfuncionesagregadasproporcionanaSQLutilidadesdeclculosobrelosdatosdelas
tablas.EstasfuncionesseincorporanenlasconsultasSELECTyretornanunnicovalor
aloperarsobreungrupoderegistros.
Lasfuncionesagregadasson.
FuncionesAgregadas
MAX()
Devuelveelvalormximo.
MIN()
Devuelveelvalormnimo.
SUM()
Devuelveelvalordelasumadelosvaloresdelcampo.
COUNT()
Devuelveelnmerodefilasquecumplenlacondicin
AVG()
Devuelveelpromediadelosvaloresdelcampo
Predicados
Los predicados son condiciones que se indican en clusula WHERE de una
consultaSQL.LasiguientetablailustralospredicadosdeSQL.
PredicadosSQL
BETWEEN...AND
LIKE
ALL
Sealaatodosloselementosdelaseleccindela
consulta.
ANY
Indicaquelacondicinsecumplirsilacomparacin
esciertaparaalmenosunelementodelconjunto.
EXISTS
IN
Compruebasiuncamposeencuentradentrodeun
determinado rango. El rango puede ser una
sentenciaSELECT.
Tablas
El lenguaje de definicin de datos (DDL, Data Definition Language Lenguaje de
Definicin de Datos) es el encargado de permitir la descripcin de los objetos que
formanunabasededatos.
Ellenguajededefinicindedatoslevaapermitirllevaracabolassiguientesacciones:
Creacindetablas,ndicesyvistas.
Modificacindelasestructuradetablas,ndicesyvistas.
Supresindetablas,ndicesyvistas.
Nomenclatura
La sintaxis empleada para la sentencias en las diferentes pginas est basada en la
notacinEBNF(ExtendedBackusNaurForm(EBNF))queesunanomenclaturacomn
utilizada en los textos informticos para expresar la sintaxis a utilizar en
programacin.Vamosaverelsignificadodealgunossmbolos.
Nomenclatura
Smbolo
<>
[]
Indicaquesucontenidoesopcional.
{}
Indicaquesu contenidopuederepetirseunaoms
veces.
Significado
Creacin detablas
Enelmodelorelacionallainformacindeunabasededatossealmacenaentablas.
Lacreacindelabasededatosdebecomenzarporlacreacindeunaomstablas.
ParaelloutilizaremoslasentenciaCREATETABLE.
Lasintaxisdelasentenciaeslasiguiente:
CREATETABLE <nombre_tabla>(
<nombre_campo><tipo_datos(tamao)>
[null |not null] [default<valor_por_defecto>]
{
,<nombre_campo><tipo_datos(tamao)>
[null |not null] [default<valor_por_defecto>]}[
,constraint<nombre>primarykey(<nombre_campo>[,...n])][
,constraint<nombre>foreignkey(<nombre_campo>[,...n])
references<tabla_referenciada>(<nombre_campo>[,...n])]
);
CREATETABLEtCoches
(
matricula char(8) not null, marca varchar(255) null, modelo varchar(255) null, color
varchar(255)null,numero_kilometros
numeric(14,2)nulldefault0,
constraintPK_Cochesprimarykey(matricula)
);
En este ejemplo creamos una tabla llamada tCoches con cinco campos (matricula,
marca,modelo,color,numero_kilometros).
Lasclavesprimariasyexternas(oforneas)sepuedenimplementardirectamentea
travs de la instruccin CREATE TABLE, o bien se pueden agregar a travs de
sentenciasALTER TABLE.
Cada gestor de bases de datos implementa distintas opciones para la instruccin
CREATETABLE, pudiendoespecificarsegrancantidaddeparmetrosypudiendovariar
elnombrequedamosalostiposdedatos,perolasintaxisestndareslaquehemos
mostradoaqu.
8
Modificacin detablas
Enocasionespuedesernecesariomodificarla estructuradeunatabla,comnmente
para aadir un campo o restriccin. Para ello disponemos de la instruccin ALTER
TABLE.
ALTER TABLE nosvaapermitir:
Aadircamposalaestructurainicialdeunatabla.
Aadirrestriccionesyreferencias.
Paraaadiruncampoaunatablaexistente:
ALTER TABLE <nombre_tabla>
ADD<nombre_campo>
<tipo_datos(tamao)>[null |not
null] [default <valor_por_defecto>]
{
,<nombre_campo><tipo_datos(tamao)>
[null |not null] [default <valor_por_defecto>]};
Ejemplo:
ALTER TABLE tCoches
ADDnum_plazasintegernull default 5;
Enesteejemploaadimoselcamponum_plazasalatablatCochesquehabamos
creadoenelapartadoanterior.
Para aadir una clave primaria vamos a crear una tabla de cliente y le
aadiremoslaclaveprimariaejecutandounasentenciaaltertable:
CREATETABLEtClientes
(
codigo
integer
notnull,
nombre
varchar(255)
notnull,
apellidos varchar(255)
null,
nif
varchar(10)
null,
telefono varchar(9)
null,
movil
varchar(9)
null
);
ALTERTABLEtClientesADD
CONSTRAINTPK_tClientesprimarykey(codigo);
9
Creamoslatablaclientesyleaadimosunarestriccinprimarykeyalaquedamosel
nombrePK_tClientesenelcampocodigo.
SolopodemosmodificarunanicatablaalavezconALTERTABLE,paramodificarms
deunatabladebemosejecutarunasentenciaALTERTABLEportabla.
Paraaadirunaclaveexterna(ofornea)necesitamosunaterceratablaennuestra
estructura. Por un lado tenemos la tabla tCoches y la tabla tClientes, ahora vamos a
crearlatablatAlquileresqueserlaencargadade"decirnos"queclienteshanalquilado
uncoche.
CREATETABLEtAlquileres
(
codigointegernotnull,codigo_cliente integer not null, matriculachar(8) not null,
fx_alquilerdatetimenotnull,fx_devoluciondatetimenull
);
ALTERTABLEtAlquileresADD
CONSTRAINTPK_tAlquileresprimarykey(codigo),
CONSTRAINTFK_Clientesforeignkey(codigo_cliente)
referencestClientes(Codigo),
CONSTRAINTFK_Cochesforeignkey(matricula)
referencestCoches(matricula);
Bien, en este cdigo creamos la tabla tAlquileres, y luego mediante una sentencia
ALTERTABLEaadimosunaclaveprimariallamadaPK_tAlquileresenelcampocodigo,
una clave externa llamadaFK_Clientesreferenciadaal codigo de la tabla tClientes, y
porltimootraclaveexternallamadaFK_Cochesreferenciadaalcampomatriculadela
tablatCoches.
Nota:
Cuandocreamosunaclaveexternaelcamporeferenciadoyelquesirvedereferencia
debenserdelmismotipodedatos.
Sisomosobservadoresnosdaremoscuentaqueloscamposquesirvendereferenciaa
las claves forneasson las claves primariasde sus tablas. Slo podemoscrear claves
externasquereferencienclavesprimarias.
10
Enprincipio,paraborrarcolumnasdeunatabladebemos:
1. Crearunatablaconlanuevaestructura.
2. Transferirlosdatos
3. Borrarlatablaoriginal.
Y digo en principio, porque como ya hemos comentado segn el gestor de bases de
datos con el que trabajemos podremos realizar esta tarea a travs de una sentencia
ALTER TABLE.
Eliminacindetablas.
PodemoseliminarunatabladeunabasededatosmediantelainstruccinDROP TABLE.
DROP TABLE
<nombre_tabla>;
LainstruccinDROP TABLE eliminadeformapermanentelatablaylosdatosenella
contenida.Siintentamoseliminarunatablaquetengaregistrosrelacionadosatravs
de una clave externa la instruccin DROP TABLE fallar por integridad referencial.
Cuandoeliminamosunatablaeliminamostambinsusndices.
Definicin dendices
Unndiceesunaestructuradedatosquepermiteaccederadiferentesfilasdeuna
mismatablaatravsdeuncampo(ocamposclave).
Unndicepermiteunaccesomuchomsrpidoalosdatos.
Introduccin alosndices.
Paraentenderloqueesunndicedebemossaberprimerocomosealmacenala
informacininternamenteen las tablasde unabasede datos.Cadatablase divideen
pginasdedatos,imaginemosunlibro,podramosescribirloen"unasolahojaenorme"
alestilopergaminoegipcio,obienenpginasalasquepodemosaccederrpidamentea
travsdeunndice.Estideaeslaqueseaplicaenelmundodelasbasesdedatos,la
informacinestaguardadaenunatabla(ellibro)quetienemuchashojasdedatos(las
pginas del libro), con un ndice en el que podemos buscar la informacin que nos
interesa.
11
Siqueremosbuscarlapalabrazapatoenundiccionario,quhacemos?
Leemos todo el diccionario hasta encontrar la palabra, con lo que nos
habremosledoeldiccionarioenterito(seguroqueaprenderamosmucho!)
Buscamos en el ndice en que pgina est la letra z, y es en esa pgina donde
buscamos.
Niquedecirtienequelaopcindoseslacorrecta,yesdeestemodocomoseutilizaun
ndiceenlasbasesdedatos,sedefineelndiceatravsdeuncampo(ocampos)yesa
partirdeestepuntodesdedondesebusca.
Losndicesseactualizanautomticamentecuandorealizamosoperacionesdeescritura
enlabasededatos.Esteesunaspectomuyimportantedecaraalrendimientodelas
operacionesdeescritura,yaqueademsdeescribirlosdatosenlatablaseescribirn
tambinenelndice.Unnmeroelevadodendicesharmslentasestasoperaciones.
Sinembargo,salvocasosexcepcionales,elbeneficioqueaportanlosndicescompensa
(delargo)estapenalizacin.
Creacin dendices
Lacreacindendices,comoyahemosvisto,permiteacelerarlasconsultasquese
realizanenlabasededatos.
LassentenciasdeSQLparamanipularndicesson:
CREATEINDEX;
DROPINDEX;
12
Lasintaxisparalacreacindendicesesla
siguiente:
CREATE[UNIQUE]INDEX<nombre_indice>
ON<nombre_tabla>(
<nombre_campo>[ASC|DESC]
{,<nombre_campo>[ASC|DESC]})
)
;
LapalabraclaveUNIQUE especificaquenopuedenexistirclavesduplicadasenel
ndice.
ASC|DESC especificanelcriteriodeordenacinelegido,ascendenteodescendente,por
defectoesascendente.
Ejemplo: En el apartado dedicado a la definicin de tablas creamos la tabla tClientes,
este ejemplocrea un ndice nico en el campo NIF. Esto nos permitir buscar mucho
msrpidoporelcampoNIFynosasegurarquenotengamosdosNIFiguales.
CREATEUNIQUEINDEXUIX_CLIENTES_NIF
ONtCLIENTES(NIF);
Las clavesprimariassonndices.
Losnombresdelosndicesdebensernicos.
ParaeliminarunndicedebemosemplearlasentenciaDROP INDEX.
DROPINDEX<nombre_tabla>.<nombre_indice>;
Ejemplo:Paraeliminarelndicecreadoanteriormente.
DROPINDEXtCLIENTES.UIX_CLIENTES_NIF;
Vistas
Enelmodelodedatosrelacionallaformadeguardarlainformacinnoeslamejor
paraverlosdatos.
Unavistaesunaconsulta,quereflejaelcontenidodeunaomstablas,desdela
quesepuedeaccederalosdatoscomosifueraunatabla.
Dossonlasprincipalesrazonesporlasquepodemoscrearvistas.
13
Seguridad,nospuedeninteresarquelosusuariostenganaccesoaunaparte
delainformacinquehayenunatabla,peronoatodalatabla.
Comodidad, como hemos dicho el modelo relacional no es el ms cmodo
para visualizar los datos, lo que nos puede llevar a tener que escribir
complejassentenciasSQL,tenerunavistanossimplificaestatarea.
Lasvistasnotienenunacopiafsicadelosdatos,sonconsultasalosdatosquehayenlas
tablas, por lo que si actualizamos los datos de una vista, estamos actualizando
realmentelatabla,ysiactualizamoslatablaestoscambiossernvisiblesdesdelavista.
Nota:
Nosiemprepodremosactualizarlosdatosdeunavista,dependerdelacomplejidadde
lamisma(dependerdesielconjuntoderesultadostieneaccesoalaclaveprincipalde
latablaono),ydelgestordebasededatos.Notodoslosgestoresdebasesdedatos
permiten actualizar vistas, ORACLE, por ejemplo, no lo permite, mientras que SQL
Servers.
Creacin devistas.
Para crear una vista debemos utilizar la sentencia CREATE VIEW, debiendo
proporcionarunnombrealavistayunasentenciaSQLSELECTvlida.
CREATEVIEW<nombre_vista>
AS
(<sentencia_select>);
Ejemplo:Crearunavistasobrenuestratablaalquileres,enlaquesenosmuestre
elnombreyapellidosdelclienteenlugardesucdigo.
CREATEVIEWvAlquileres
AS
(
SELECTnombre,
apellidos,matricula
FROMtAlquileres,
tClientes
WHERE(tAlquileres.codigo_cliente=tClientes.codigo)
)
Si queremos, modificar la definicin de nuestra vista podemos utilizar la sentencia
ALTER VIEW,deformamuyparecidaacomolohacamosconlastablas.Enestecaso
queremosaadirloscamposfx_alquileryfx_devolucionalavista.
ALTERVIEWvAlquileres
AS
(
14
SELECTnombre,
apellidos,matricula,fx_alquiler,fx_devolucion
FROMtAlquileres,
tClientes
WHERE(tAlquileres.codigo_cliente=tClientes.codigo))
Por ltimo podemos eliminar la vista a travs de la sentencia DROP VIEW. Para
eliminarlavistaquehemoscreadoanteriormenteseutilizara:
DROPVIEWvAlquileres;
Unavistaseconsultacomosifueseunatabla.
Sinnimos.
Unsinnimoesunnombrealternativoqueidentificaunatablaenlabasededatos.Con
un sinnimo se pretende normalmente simplificar el nombre original de la tabla,
aunque tambin se suelen utilizar para evitar tener que escribir el nombre del
propietariodelatabla.
Notodas lasbasesdedatos soportanlossinnimos.
ParacrearunsinnimohayqueutilizarlasentenciaCREATESYNONYMespecificando
el nombre que deseamos utilizar como sinnimo y la tabla para la que estamos
creandoelsinnimo.
CREATESYNONYM<nombre_sinonimo>
FOR<nombre_tabla>;
Ejemplo:ElsiguienteejemplocreaelsinnimoCochesparalatablatCoches.
CREATESYNONYMCoches
FORtCoches;
ParaeliminarelsinnimocreadodebemosemplearlasentenciaDROP SYNONYM.
DROPSYNONYMCoches;
15
ParaconsultarlainformacinSQLponeanuestradisposicinlasentenciaSELECT.
Lasentencia SELECT
LasentenciaSELECTnospermiteconsultarlosdatosalmacenadosenunatablade
labasededatos.
Elformatodelasentenciaselectes:
SELECT[ALL |DISTINCT]
<nombre_campo>[{,<nombre_campo>}]
FROM
<nombre_tabla>|<nombre
_vista>
[{,<nombre_tabla>|<nomb
re_vista>}]
[WHERE <condicion> [{ AND|OR
<condicion>}]] [GROUP BY <nombre_campo>
[{,<nombre_campo
>}]]
[HAVING
<condicion>[{AND|OR<condicion>}]]
[ORDER BY <nombre_campo>|<indice_campo> [ASC |
DESC] [{,<nombre_campo>|<indice_campo>
[ASC|DESC]}]]
16
Nomenclatura
Sentencia
Significado
SELECT
PalabraclavequeindicaquelasentenciadeSQLquequeremos
ejecutaresdeseleccin.
ALL
Indica que queremos seleccionar todos los valores. Es el valor
pordefectoynosueleespecificarsecasinunca.
DISTINCT
Indicaquequeremosseleccionarslolosvaloresdistintos.
FROM
WHERE
GROUP BY
Especificaunacondicinquedebecumplirseparaquelosdatos
seandevueltosporlaconsulta.Admitenlosoperadoreslgicos
ANDyOR.
Especificalaagrupacinquesedaalosdatos.Seusasiempreen
combinacinconfuncionesagregadas.
HAVING
ORDER BY
ParaformularunaconsultaalatablatCoches(creadaenelcaptulodetablas)y
recuperar los campos matricula, marca, modelo, color, numero_kilometros,
num_plazas debemos ejecutar la siguiente consulta. Los datos sern devueltos
ordenadospormarcaypormodeloenordenascendente,demenoramayor.
SELECTmatricula,marca,modelo,color,numero_kilometros,num_plazas
FROM tCoches
ORDER BYmarca,modelo;
17
Tambinpodramoshabersimplificadolaconsultaatravsdelusodelcomodn
decampos,elasterisco"*".
SELECT*
FROM tCoches
ORDER BYmarca,modelo;
Elusodelasteriscoindicaquequeremosquelaconsultadevuelvatodosloscampos
queexistenenlatabla.
LaclusulaWHERE
La clusula WHERE es la instruccin que nos permite filtrar el resultado de una
sentenciaSELECT.Habitualmentenodeseamosobtenertodalainformacinexistente
enlatabla,sinoquequeremosobtenerslolainformacinquenosresultetilesese
momento.LaclusulaWHEREfiltralosdatosantesdeserdevueltosporlaconsulta.
Ennuestroejemplo,siqueremosconsultaruncocheenconcretodebemosagregar
una clusula WHERE. Esta clusula especifica una o varias condiciones que deben
cumplirseparaquelasentenciaSELECTdevuelvalosdatos.Porejemplo,paraquela
consulta devuelva slo los datos del coche con matrcula M1525ZA debemos
ejecutarlasiguientesentencia:
SELECTmatricula,marca,modelo,color,
numero_kilometros,num_plazas
FROM tCoches
WHEREmatricula='M1525ZA';
Cuando en una clusula where queremos incluir un tipo texto, debemos incluir
el valorentrecomillassimples.
Adems, podemos utilizar tantas condiciones como queramos, utilizando los
operadores lgicos AND y OR . El siguiente ejemplo muestra una consulta que
devolverloscochescuyasmatriculasseanM1525ZAobienM2566AA.
SELECTmatricula,marca,modelo,color,
numero_kilometros,num_plazas
FROM tCoches
WHEREmatricula='M1525ZA'
OR matricula='M2566AA';
18
SELECTmatricula,marca,modelo,color,
numero_kilometros,num_plazas
FROM tCoches
WHERENOT matricula='M1525ZA' ;
Podemos tambin obtener las diferentes marcas y modelos de coches ejecutando la
consulta.
SELECTDISTINCTmarca,modelo
FROM tCoches;
La ver los valores distintos. En el caso anterior se devolvern la palabra clave
DISTINCT indica que slo queremos os valores distintos del par formado por los
camposmarcaymodelo.
LaclusulaORDERBY
Comoyahemosvistoenlosejemplosanteriorespodemosespecificarelordenen
elqueserndevueltoslosdatosatravsdelaclusulaORDER BY.
SELECTmatricula,marca,modelo,color,numero_kilometros,num_plazas
FROM tCoches
ORDER BYmarcaASC,modeloDESC;
Como podemos ver en el ejemplo podemos especificar la ordenacin ascendente o
descendenteatravs de las palabras clave ASCy DESC.La ordenacin depende del
tipo de datos que estdefinidoenlacolumna,deformaqueuncamponumrico
ser ordenado como tal, y unalfanumrico se ordenar de la A a la Z, aunque su
contenidoseanumrico.Deestaformaelvalor100sedevuelveantesqueel11.
Tambin podemos especificar el en la clusula ORDER BY el ndice numrico del
campo dentro de la sentencia SELECT para la ordenacin, el siguiente ejemplo
ordenaralosdatosporelcampomarca,yaqueapareceensegundolugardentrodela
listadecamposquecomponenlaSELECT.
SELECTmatricula,marca,modelo,color,numero_kilometros,num_plazas
FROM tCoches
ORDER BY2;
19
Hastaahorahemosvistocomosealmacenanlosdatosenunabasededatosycomo
consultaresosdatosalmacenados,peronohemosvistocomoalmacenardichosdatos.
Paraalmacenardatosenunabasededatosdebemosinsertarfilasenlastablas.Para
ellosSQLponeanuestradisposicinlasentenciaINSERT.
Insercin defilas
Elprocesodeinsercindefilasconsisteenaadiraunatablaunaomsfilasyencada
filatodosopartedesuscampos.
Podemosdistinguirdosformasdeinsertarfilas:
Insercinindividualdefilas.
Insercinmltipledefilas.
LasintaxisdelasentenciaINSERT esdiferentesegncualseanuestropropsito.
Slopodremosomitiruncampoalefectuarunainsercincuandoesteaceptevalores
nulos.
Insercin individualdefilas
PararealizarlainsercinindividualdefilasSQLposeelainstruccinINSERT INTO.La
insercinindividualde filas es la que ms comnmenteutilizaremos.Su sintaxises la
siguiente:
INSERTINTO
<nombre_tabla>
[(<campo1>[,<campo2>,
...])]values
(<valor1>,<valor2>,...);
Comosepuedeobservarlasentenciatienedospartesclaramentediferenciadas,porun
ladolapropiaINSERT INTO seguidadelalistadecamposenlosquequeremosinsertar
losdatos,yporotrolalistadevaloresquequeremosinsertarenloscampos.Lamejor
formadeverestoesatravsdeunejemplo.
INSERTINTOtCoches
(matricula,marca ,modelo
,color ,numero_kilometros)
values
('M1111CA','RENAULT','MEGANETR100','NEGRODIAMANTE',78000);
20
QuocurrirasiyaexistierauncocheconlamatrculaM1111CA?Seproducir
un error, porquehemosdefinidola clave primariaen el campomatricula, ycomo
hemosvistolaclaveprimariadebesernica.
Si omitimosalgnpar " campovalor" en la sentenciaINSERT, pueden ocurrirvarias
cosas:
Queseproduzcaunerror,sielcampo noaceptavaloresnulos.
Quesegraveelregistroysedejenuloelcampo,cuandoelcampoaceptevalores
nulos.
Quesegraveelregistroysetomeelvalorpordefecto,cuandoelcampotenga
definidounvalorpordefecto.
Quehacerencadamomentodependerdelprograma.
Porejemplo,lasiguientesentenciacrearunregistroenlatablatCochesconelcampo
numero_kilometroscero,yaqueesteessuvalorpordefecto.
INSERTINTOtCoches
(matricula,marca ,modelo
,color ,numero_kilometros)
values
('M1111CA','RENAULT','MEGANETR100','NEGRODIAMANTE',78000);
Insercin mltiple defilas
LasentenciaINSERT permitetambininsertarvariosregistrosenunatabla.Pareellose
utiliza una combinacin de la sentencia INSERT junto a una sentencia SELECT. El
resultadoesqueseinsertantodoslosregistrosdevueltosporlaconsulta.
INSERTINTO
<nombre_tabla>
[(<campo1>[,<campo2
>,...])]SELECT
[(<campo1>[,<campo2
>,...])]FROM
<nombre_tabla_origen>;
Parapoderutilizarlainsercinmltipledefilassedebencumplirlassiguientesnormas:
La lista de campos de las sentencias insert y select deben coincidir en
nmeroytipodedatos.
21
Ninguna de las filas devueltas por la consulta debe infringir las reglas de
integridaddelatablaenlaquevayamosarealizarlainsercin.
Pongamosunejemplo,vamosacrearunatablaconlasdiferentesmarcasquetenemos
enlabasededatos.LasentenciaSQLparacrearlatablaeslasiguiente:
CREATETABLEtMarcas
(
codigo
integernotnullidentity(1,1),
marca
varchar(255),
constraintPK_Marcasprimarykey(codigo)
);
Nota:Hemosincluidolafuncinidentityparaelcampocodigo,estafuncinespropia
de SQL Server e indica que el cdigo se genera automticamentecada vez que se
insertaunregistroconunvalorautonumrico.Prcticamentetodoslosgestoresde
basesdedatosdanlaopcindelcampoautonumricooincremental.
Unavezquetenemoscreadalatablademarcasvamosainsertarotroparderegistros
enlatablade coches,paraelloutilizamosunasentenciainsertinto paraunanica
fila.
INSERTINTOtCoches
(matricula,marca ,modelo
,color)
values
('M2233FH','SEAT','LEONFR','ROJO');
INSERTINTOtCoches
(matricula,marca ,modelo
,color)
values
('M1332FY','FORD','FIESTA','GRISPLATA');
AhoratenemostresmarcasdiferentesenlatablatCoches,yqueremosinsertarlasenla
tabla de marcas, para ello podemos realizar tres inserciones individuales, pero que
pasara si no supiramos de antemano el nmero de marcas? y si fueran unas
cincuenta marcas?. Nos podramos pasar el da entero escribiendo sentencias insert
into.
Afortunadamentepodemosrealizarunainsercinmltipledelsiguientemodo:
INSERTINTOtMarcas
(marca)
SELECTDISTINCTmarcaFROMtCoches;
22
ComoresultadoobtenemosunregistroenlatablatMarcasporcadamarcadelatabla
tCoches. Elcampocodigosehageneradoautomticamenteyaqueestdefinidocomo
identidad.
CODIGO
MARCA
1
FORD
2
RENAULT
3
SEAT
Dmonos cuenta de que el orden de generacin no ha sido el mismo que el de
insercin,sinoquesehaaplicadoelordenenelquehansidodevueltoslosdatosporla
sentenciaSELECT.
AhoradeberamoscambiarlosdatosdelatablatCoches,paraguardarelcdigodela
marcaenlugardesudescripcin,peroparaellonecesitamossabercmomodificarun
datograbado...Esmomentodepasaralsiguientepunto,laactualizacindedatos.
Borradodedatos
Lasentencia DELETE.
Paraborrardatosdeunatabla,debemosutilizarlasentenciaDELETE.Lasintaxisdela
sentenciaDELETEeslasiguiente:
DELETEFROM
<nombre_tabla>[
WHERE
<condicion>];
ElsiguienteejemploilustraelusodelasentenciaDELETE.Esbuenaideaespecificaren
la sentenciaWHERE los camposque formanla clave primariade la tabla para evitar
borrardatosquenoqueramoseliminar.
DELETEFROMtCoches
WHEREmarca='SEAT';
La sintaxis de DELETE varia en Access, siendo necesario el uso del comodn *.
DELETE*FROM<tCoches>
Cuando trabajemos con la sentencia DELETE debemos tener en cuenta las siguientes
consideraciones:
23
Lasentencia TRUNCATE
Actualizacindedatos
Lasentencia UPDATE.
LassiguientessentenciasactualizanlosdatosdelatablatCochesconlosvaloresde
la tabla tMarca obtenidos anteriormente en la pgina dedicada a la insercin de
datos.
24
UPDATEtCoches
SET marca='2'
WHEREmarca='RENAULT';
UPDATEtCoches
SET marca='3'
WHEREmarca='SEAT';
Ntese que los valores para el campo marca aparecen entrecomillados, ya que es un
campodetipovarchar.Losvaloresconlosqueactualicemoslosdatosdebenserdeltipo
delcampo.
Unaspectoatenerencuentaesqueloscamposqueformanlaprimarykeydeunatabla
slosepodrnmodificarsilosregistrosnoestnreferenciadosenningunaotratabla.En
nuestro caso slo podremos modificar la matrcula de un coche si no tiene registros
asociadosenlatablatAlquileres.
Estopuedecausarproblemas,yaquepodramoshabernosequivocadoaldardealtael
cocheen la tablatCoches ydetectarel errordespusdealquilarel coche.Ental caso
tendramosdardealtaunnuevococheconlamatrculacorrecta,actualizarlosregistros
de la tabla alquileres ypor ltimo borrar el registroerrneo de la tabla tCoches.Este
procesopuedeserbastantecomplicadoenelcasodequeexistirnmsrelacionesconla
tabla.Sepodraconsiderarquelaclaveprimariadelatablaestmaldefinidayquela
matrculanodebeserelelementoqueidentifiqueelcoche.Unaalternativaseriacrear
uncdigoautonumricoparalatablatCochesquerealizarlasvecesdeclaveprimariay
crearunndicenicoparalamatrcula,estediseotambintienesus"pegas",porloque
debemos decidir qu modelo utilizar, y seleccionar las claves primarias con sumo
cuidado.
UsodesubconsultasconUPDATE
Hasta ahora hemos actualizado los datos con valores que conocemos de antemano,
peroquocurrecuandoesosdatosdebentomarsedeotratabladelabasededatos?.
Podramosdisearunprogramaquerecorrieratodalatablaybuscarelvaloradecuado
paracadaregistroyloactualizase.Sindudaesunasolucin,yenocasionescasilanica,
pero es una solucin cara y compleja que adems exige que conozcamos algn otro
lenguaje de programacin. Para estos casos podemos utilizar subconsultas con la
sentenciaUPDATE.
25
UPDATE<nombre_tabla>
SET <campo1>=<valor1>|<subconsulta1>
{[,<campo2>=<valor2>|<subconsulta2>
,...
, <campoN> = <valorN> |
<subconsultaN>]}[WHERE<condicion>];
ComopuedeverselasintaxisesprcticamenteigualalasintaxisdelasentenciaUPDATE,
conlasalvedaddequepodemosutilizarsubconsultasenlugardevaloresalasignarlos
campos. De forma genrica podemos decir que las subconsultasson consultas SELECT
incluidasdentrodeotrasentenciaSQL.
LassiguientessentenciasUPDATE sonequivalentes:
Utilizando sentencias UPDATE normales:
UPDATEtCoches
SET marca='1'
WHEREmarca='FORD';
UPDATEtCoches
SET marca='2'
WHEREmarca='RENAULT';
UPDATEtCoches
SET marca='3'
WHEREmarca='SEAT';
UtilizandosentenciasUPDATEcombinadasconsubconsultas:
UPDATEtCoches
SET marca=(SELECTCODIGOFROMtMarcas
WHEREtMarcas.Marca=tCoches.Marca)
WHEREmarcaIN('FORD','RENAULT','SEAT');
Por cada registro de la tabla tCoches se ejecutar la subconsulta, actualizando el
campomarcaalvalordelcdigodelamarcaenlatablatMarcas.
Elusodesubconsultasparaactualizardatostienealgunaslimitaciones:
Lasubconsultaslopuededevolverunnicocampo.
Lasubconsultaslopuededevolverunsloregistro.
El tipodedatosdevueltoporlasubconsultadebeserdelmismotipoqueel
campoalqueestamosasignandoelvalor.
No todos los sistemas de bases de datos permiten usar subconsultas para
actualizardatos(Access)aunquesiunabuenapartedeellos(ORACLE,SQLServer,
Sybase...)
26
PeroennuestroejemploelcampocodigodelatablatMarcasesnumricoyelcampo
marcadelatablatCochesestexto.Porqufunciona?Muyfcil,elmotordelabasede
datosescapazdeconvertirelvalornumricoaunvalortextodeformaautomtica,si
bienestaesunaexcepcin.
Ahora que ya tenemos modificado el valor de la marca de los registros, es
convenientemodificarsutipodedatosycrearunaforeignkeycontralatablatMarcas.
Paraello ejecutaremoslassiguientessentencias.
ALTER TABLE tCoches
altercolumn marcaint not null;
LaopcinaltercolumnespropiadeSQLServer.Paramodificareltipodedatos
deunatabladebemosconsultarlaayudadelgestordebasesdedatos.
ALTER TABLE tCoches
add constraintFK_Coches_Marcasforeignkey(marca)
referencestMarcas(codigo);
Consultascombinadas.JOINS
Consultas combinadas.
Habitualmente cuando necesitamos recuperar la informacin de una base de datos nos
encontramos con que dicha informacin se encuentra repartida en varias tablas,
referenciadasatravsdevarioscdigos.Deestemodosituviramosunatabladeventascon
uncampocliente,dichocampocontendraelcdigodelclientedelatabladecliente.
Sin embargo est forma de almacenar la informacin no resulta muy til a la hora de
consultarlosdatos.SQL nosproporcionaunaformafcildemostrarlainformacinrepartida
envariastablas,lasconsultas combinadasoJOINS.
Lasconsultascombinadaspuedenserdetrestipos:
Combinacininterna
Combinacinexterna
Uniones
27
tMarcas.marca,
tCoches.modelo,
tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
FROMtCoches,tMarcas
WHEREtCoches.marca=tMarcas.codigo
Lamismaconsultadeforma"visual"seraalgoas:
Dmonos cuenta que hemos antepuesto el nombre de cada tabla al nombre del
campo, esto no es obligatorio si los nombres de campos no se repiten en las tablas,
peroesaconsejableparaevitarconflictosdenombresentrecampos.Porejemplo,si
para referirnos al campo marca no anteponemosel nombre del campo la base de
datosnosabesiqueremoselcampomarcadelatablatCoches,quecontieneelcdigo
delamarca,oelcampomarcadelatablatMarcas,quecontieneelnombredelamarca.
Otra opcin es utilizar la clusula INNERJOIN. Su sintaxis es idntica a la de una
consultaSELECThabitual,conlaparticularidaddequeenlaclusulaFROM sloaparece
unatablaovista,aadindoseelrestodetablasatravsdeclusulasINNER JOIN.
28
SELECT[ALL|DISTINCT]
<nombre_campo>[{,<nombre_campo>}]
FROM<nombre_tabla>
[{INNERJOIN <nombre_tabla>ON<condicion_combinacion>}]
[WHERE<condicion>[{AND|OR<condicion>}]]
[GROUP
BY
<nombre_campo>
[{,<nombre_campo
>}]]
[HAVING
<condicion>[{AND|OR<condicion>}]]
[ORDERBY<nombre_campo>|<indice_campo>[ASC|DESC]
[{,<nombre_campo>|<indice_campo>[ASC|DESC]}]]
ElejemploanteriorescritoutilizandolaclusulaINNER JOIN quedaradelasiguiente
manera:
SELECTtCoches.matricula,
tMarcas.marca, tCoches.modelo,
tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
FROMtCoches
INNERJOINtMarcasONtCoches.marca=tMarcas.codigo
La clusula INNER JOIN permite separar completamente las condiciones de
combinacinconotroscriterios,cuandotenemosconsultasquecombinannueveodiez
tablasestorealmenteseagradece.Sinembargomuchosprogramadoresnosonamigos
delaclusulaINNER JOIN,laraznesqueunodelosprincipalesgestoresdebasesde
datos, ORACLE, no la soportaba. Si nuestro programa deba trabajar sobre bases de
datos ORACLE no podamos utilizar INNER JOIN. A partir de la versin ORACLE 9i
Oraclesoportalaclusula INNER JOIN.
Combinacin Externa
Lacombinacininternaesexcluyente.Estoquieredecirquesiunregistronocumplela
condicindecombinacinnoseincluyeenlosresultados.Deestemodoenelejemplo
anteriorsiuncochenotienegrabadalamarcanosedevuelveenmiconsulta.
Segnlanaturalezadenuestraconsultaestopuedeserunaventaja,peroenotroscasos
significa un serio problema. Para modificar este comportamientoSQL pone a nuestra
disposicinlacombinacinexterna.Lacombinacinexternanoesexcluyente.
Lasintaxisesmuyparecidaalacombinacininterna,
29
SELECT[ALL|DISTINCT]
<nombre_campo>[{,<nombre_campo>}]
FROM<nombre_tabla>
[{LEFT|RIGHTOUTERJOIN
<nombre_tabla>ON<condicion_combinacion>}]
[WHERE<condicion>[{AND|OR
<condicion>}]][GROUPBY<nombre_campo>
[{,<nombre_campo>}]][HAVING
<condicion>[{AND|OR<condicion>}]]
[ORDERBY<nombre_campo>|<indice_campo>[ASC|DESC]
[{,<nombre_campo>|<indice_campo>[ASC|
DESC]}]]
La combinacin externa puede ser diestra o siniestra, LEFT OUTER JOIN o RIGHT
OUTERJOIN. ConLEFT OUTER JOINobtenemostodoslosregistrosdeenlatablaque
situemos a la izquierda de la clusula JOIN, mientras que con RIGHT OUTER JOIN
obtenemoselefectocontrario.
Comomejorsevelacombinacinexternaesconunejemplo.
SELECTtCoches.matricula,
tMarcas.marca,
tCoches.modelo, tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
FROMtCoches
LEFTOUTERJOINtMarcasONtCoches.marca=tMarcas.codigo
Estaconsultadevolvertodoslosregistrosdela tablatCoches,independientemente
dequetenganmarcaono.Enelcasodequeelcochenotengamarcasedevolverel
valornull paraloscamposdelatablatMarcas.
Visualmentelaconsultasereflejaas:
30
ElmismoejemploconRIGHTOUTERJOIN.
SELECTtCoches.matricula,
tMarcas.marca,
tCoches.modelo, tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
FROMtCoches
RIGHTOUTERJOINtMarcasONtCoches.marca=tMarcas.codigo
EstaconsultadevolverlosregistrosdelatablatCochesquetenganmarcarelacionada
ytodoslosregistrosdelatablatMarcas,tenganalgnregistroentCochesono.
Visualmentelaconsultasereflejaas:
Union
UNION[ALL|DISTINCT]
SELECT[ALL|DISTINCT]
<nombre_campo>[{,<nombre_campo>}]
FROM<nombre_tabla>
[{LEFT|RIGHTOUTERJOIN
<nombre_tabla>ON<condicion_combinacion>}]
[WHERE<condicion>[{AND|OR<condicion>}]]
[GROUPBY<nombre_campo>
[{,<nombre_campo>}]][HAVING<condicion>[{
AND|OR<condicion>}]]
}
[ORDERBY<nombre_campo>|<indice_campo>[ASC|DESC]
[{,<nombre_campo>|<indice_campo>[ASC|DESC]}]]
ParautilizarlaclusulaUNIONdebemoscumplirunaseriedenormas.
Las consultas a unir deben tener el mismo nmero campos, y adems los
camposdebenserdelmismotipo.
SlopuedehaberunanicaclausulaORDER BYalfinaldelasentenciaSELECT.
ElsiguienteejemplomuestraelusodeUNION
SELECTtCoches.matricula,
tMarcas.marca,
tCoches.modelo,
tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
FROMtCoches
INNERJOINtMarcasONtCoches.marca=tMarcas.codigo
UNION
SELECTtMotos.matricula,
tMarcas.marca,
tMotos.modelo,
tMotos.color,
tMotos.numero_kilometros
FROMtMotos
INNERJOINtMarcasONtMotos.marca=tMarcas.codigo;
32
LaclusulaGROUPBY
La clusula GROUP BY combina los registros con valores idnticos en un nico
registro.Paracada registro se puedecrear un valoragregadosi se incluye una funcin
SQLagregada,comoporejemploSumoCount,enlainstruccinSELECT.Susintaxises:
SELECT[ALL|DISTINCT]
<nombre_campo>
[{,<nombre_campo>}]
[{,<funcion_agregado>}]
FROM<nombre_tabla>|<nombre_vista>
[{,<nombre_tabla>|<nombre_vista
>}] [WHERE <condicion> [{ AND|OR
<condicion>}]] [GROUPBY <nombre_campo>
[{,<nombre_campo
>}]]
[HAVING
<condicion>[{AND|OR<condicion>}]]
[ORDER BY <nombre_campo>|<indice_campo> [ASC |
DESC][{,<nombre_campo>|<indice_campo>[ASC
|DESC]}]]
SELECTmarca,modelo,SUM(numero_kilometros)
FROMtCoches
GROUPBYmarca,modelo
LaclusulaHAVING
Una vez que GROUP BY ha combinado los registros, HAVING muestra cualquier
registro agrupado por la clusula GROUP BY que satisfaga las condiciones de la
clusula HAVING.SeutilizalaclusulaWHEREparaexcluiraquellasfilasquenodesea
agrupar,ylaclusulaHAVINGparafiltrarlosregistrosunavezagrupados.
COUNT(<expr>)
Endondeexprcontieneelnombredelcampoquedeseacontar.Losoperandosdeexpr
puedenincluirelnombredeuncampodeunatabla,unaconstanteounafuncin(la
cual puede ser intrnseca o definida por el usuario pero no otras de las funciones
agregadasdeSQL).Puedecontarcualquiertipodedatosinclusotexto.
Aunqueexprpuederealizarunclculosobreuncampo,Countsimplementecuentael
34
nmeroderegistrossintenerencuentaquvaloressealmacenanenlosregistros.La
funcinCountnocuentalosregistrosquetienencamposnullamenosqueexprseael
carctercomodnasterisco(*).Siutilizaunasterisco,Countcalculaelnmerototalde
registros, incluyendo aquellos que contienen campos null. Count(*) es
considerablementemsrpidaqueCount(Campo).Nosedebeponerelasteriscoentre
doblescomillas('*').
SELECTCOUNT(*)
FROMtCoches;SELECT
marca,
COUNT(modelo)FROM
tCoches
GROUPBYmarca;
SELECTmarca,COUNT(DISTINCTmodelo)
FROMtCoches
GROUPBYmarca;
Max,Min
Devuelvenelmnimooelmximodeunconjuntodevalorescontenidosenuncampo
especificodeunaconsulta.Susintaxises:
MIN(<expr>)
MAX(<expr>)
En donde expr es el campo sobre el que se desea realizar el clculo. Expr puede
incluir el nombre de un campo de una tabla, una constante o una funcin (la cual
puedeserintrnsecaodefinidaporelusuarioperonootrasdelasfuncionesagregadas
deSQL).
SELECT
marca,
modelo,
MIN(numero_kilometros),
MAX(numero_kilometros)
FROM
tCoches
GROUPBY marca,modelo
Sum
Devuelvela suma del conjunto de valores contenidoen un campo especficode una
consulta.
Susintaxises:
SUM(<expr>)
35
En donde expr representa el nombre del campo que contiene los datos que desean
sumarseounaexpresinquerealizaunclculoutilizandolosdatosdedichoscampos.
Los operandos de expr pueden incluir el nombre de un campo de una tabla, una
constanteounafuncin(lacualpuedeserintrnsecaodefinidaporelusuarioperono
otrasdelasfuncionesagregadasdeSQL).
SELECT
FROM
GROUPBY
marca,
modelo,
SUM(numero_kilometros)
tCoches
marca,modelo
Subconsultas
Definicin desubconsultas.
UnasubconsultaesunasentenciaSELECT queaparecedentrodeotrasentencia
SELECT.NormalmenteseutilizanparafiltrarunaclausulaWHEREoHAVING con
elconjuntoderesultadosdelasubconsulta,aunquetambinpuedenutilizarseen
lalistadeseleccin.
Porejemplopodramosconsultarelalquilerltimodeuncliente.
SELECTCO_CLIENTE,NOMBRE,MARCA,MODELO
FROMALQUILERES
WHERECO_CLIENTE=1
AND FECHA_ALQUILER=(SELECTMAX(FECHA_ALQUILER)
FROMALQUILERES
WHERECO_CLIENTE=1)
Una subconsulta tiene la misma sintaxis que una sentencia SELECT normal
exceptuandoqueapareceencerradaentreparntesis.
Tienelassiguientesrestricciones:
NopuedecontenerlaclusulaORDER BY
36
NopuedeserlaUNIONdevariassentenciasSELECT
Si la subconsulta aparece en la lista de seleccin, o est asociada a un operador
igual"="solopuededevolverunnicoregistro.
Referenciasexternas
FROMEMPLEADOS
WHEREESTADOIN(SELECTESTADO
FROMESTADOS
WHEREACTIVO='S')
Podrescribirsecomo:
SELECT CO_EMPLEADO,NOMBRE
FROMEMPLEADOS,ESTADOS
WHEREEMPLEADOS.ESTADO=ESTADOS.ESTADO
ANDESTADOS.ACTIVO='S'
Normalmente es ms rpido utilizar un JOIN en lugar de una subconsulta, aunque
esto depende sobre todo del diseo de la base de datos y del volumen de datos que
tenga.
UtilizacindesubconsultasconUPDATE
Podemos utilizar subconsultas tambin en consultas de actualizacin
conjuntamente conUPDATE.Normalmenteseutilizanpara"copiar"elvalordeotra
tabla.
UPDATE EMPLEADOS
SETSALARIO_BRUTO=(SELECTSUM(SALIRO_BRUTO)
FROMNOMINAS
WHERE
NOMINAS.CO_EMPLEADO
EMPLEADOS.CO_EMPLEADO)
WHERESALARIO_BRUTOISNULL
Lafuncin EXISTS
EXISTS es una funcin SQL que devuelve verdadero cuando una subconsulta
retornaalmenosunafila.
SELECT CO_CLIENTE,NOMBRE
FROMCLIENTES
WHEREEXISTS(SELECT*
FROMMOROSOS
WHERECO_CLIENTE=CLIENTES.CO_CLIENTE
ANDPAGADO='N')
La funcin EXISTS puede ser utilizada en cualquier sentencia SQL vlida, SELECT,
UPDATE,INSERT oDELETE.
38