Você está na página 1de 40

UNIVERSIDAD SALVADOREA

ALBERTO MASFERRER

MANUALDESQLSERVER2

Ing. Mario Valle

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

Ing. Mario Valle


SQL(StructureQueryLanguageLenguajedeConsultaEstructurado)

SQLesellenguajedeconsultauniversalparabasesdedatos.

Desdeestaopcinvamosatratarlostemasrelacionadoscon SQL ANSI 92(American


NationalStandardsInstituteInstitutoNacionalEstadounidensedeEstndares),quees
el estndar SQL , ya que luego existen variantes como TSQL (TransactSQL SQL
Transaccional)yPL/SQL(ProcedureLanguage/SQLSQLProcedimental).

SQL proporciona mtodos para definir la base datos, para manipular la informacin y
paragestionarlospermisosdeaccesoadichainformacin.

Para que un gestor de bases de datos sea considerado como relacional, debe
soportar SQL, independientementede las caractersticas particulares que dicho
gestorpuedaaportar.

ConocerSQLesconocerlasbasesdedatos,ytodosupotencial.

IntroduccinaSQL

SQLesellenguajedeconsultauniversalparabasesdedatos.

Los mandatos de SQL se dividen en tres grandes grupos diferenciados, los cuales
sern tratados por separado y que nicamente se presentan aqu a modo
introductorio.

DDL(Data Definition Language Lenguaje de Definicin de Datos), es el


encargado de la definicin de Bases de Datos, tablas, vistas e ndices entre
otros.

Soncomandospropiosdeestelenguaje:
CREATETABLE
CREATEINDEX
CREATEVIEW
CREATE
SYNONYM

DML(Data ManipulationLanguageLenguaje de Administracin de Datos),cuya


misineslamanipulacindedatos.Atravsdelpodemosseleccionar,insertar,
eliminaryactualizardatos.Eslapartequemsfrecuentementeutilizaremos,y
queconellaseconstruyenlasconsultas.

Ing. Mario Valle

Soncomandospropiosdeestelenguaje:
SELECT
UPDATE
INSERT
INSERTINTO
DELETEFROM

DCL (Data Control LanguageLenguaje de Control de Datos), encargado de la


seguridaddelabasededatos,entodoloreferentealcontroldeaccesosyprivilegios
entrelosusuarios.

Soncomandospropiosdeestelenguaje:
GRANT
REVOKE

Componentesdellenguaje SQL.

Tiposdedatos.

SQLadmiteunavariadagamade tiposde datospara el tratamientode la informacin


contenidaenlastablas,lostiposdedatospuedensernumricos(conosindecimales),
alfanumricos, de fecha o booleanos (si o no). Segn el gestor de base de datos que
estemos utilizando los tipos de datos varan, pero se reducen bsicamente a los
expuestosanteriormente,aunqueen la actualidadcasi todoslos gestoresde bases de
datossoportanunnuevotipo,el BLOB(BinaryLargeObject Objeto Largo en formato
Binario), que es un tipo de datos especial destinado a almacenar archivos, imgenes,
entreotros.

Dependiendodecadagestordebasesdedatoselnombrequesedaacadaunode
estostipospuedevariar.Bsicamentetenemoslossiguientestiposdedatos.

Numricos Alfanumricos Fecha


Lgico
BLOB

Integer
char(n)
Numeric(n.m) varchar(n,m)
Decimal(n,m)
Float

Date
DateTime

Bit

Image
Text

Ing. Mario Valle

Msdetalladamentetenemos:
Tiposdedatosnumricos
Tipo
Definicin
Integer
Valoresenterosconsigno.
Numeric(n,m) Nmerosrealesdehasta18dgitos(condecimales),donden
representaeltotaldedgitosadmitidos(normalmente
denominadoprecisin)ymelnmerodeposicionesdecimales
(escala).

Decimal(n,m) Igualqueeltiponumrico.
Float

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

Ing. Mario Valle

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

Ing. Mario Valle


NOT

devolviendo siempre un valor


verdadero o falso. Los operadores
lgicos se evalan de izquierda a
derecha.
ConcatenacinSeempleaparaunir datosde
tipoalfanumrico.

PalabrasClave
LaspalabrasclavesonidentificadoresconunsignificadoespecialparaSQL,porloque
nopuedenserutilizadasparaotropropsitodistintoalquehansidopensadas.
SQL dispone de muy pocas rdenes, pero de mltiples palabras clave, lo que le
conviertenenunlenguajesencilloperotremendamentepotenteparallevaracabosu
funcin.

PalabrasClave
ALL

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

Ing. Mario Valle

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

Comprueba que al valor est dentro de un


intervalo.

LIKE

Compara un campo con una cadena alfanumrica.


LIKEadmiteelusodecaracterescomodines.

ALL

Sealaatodosloselementosdelaseleccindela
consulta.

ANY

Indicaquelacondicinsecumplirsilacomparacin
esciertaparaalmenosunelementodelconjunto.

EXISTS

Devuelveun valor verdaderosi el resultadode una


subconsultadevuelveresultados.

IN

Compruebasiuncamposeencuentradentrodeun
determinado rango. El rango puede ser una
sentenciaSELECT.

Ing. Mario Valle


LenguajedeDefinicindedatos

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

<>

Encierran parmetros de una orden que el


usuario debe sustituir al escribir dicha orden
por los valores que queramos dar a los
parmetros.

[]

Indicaquesucontenidoesopcional.

{}

Indicaquesu contenidopuederepetirseunaoms
veces.

Significado

Separa expresiones. Indica que pueden emplearse


unauotraexpresinperonomsdeunaalavez.

Adems las palabras clave aparecen en mayscula negrita y los argumentos en


minsculacursiva.Lasintaxisdeunasentenciatendrunaspectocomoeste:
CREATETABLE
<nombre_tabla>(
<nombre_campo><tipo_datos(tamao)>,
{
<nombre_campo><tipo_datos(tamao)>}
);
7

Ing. Mario Valle

Creacin detablas
Enelmodelorelacionallainformacindeunabasededatossealmacenaentablas.
Lacreacindelabasededatosdebecomenzarporlacreacindeunaomstablas.
ParaelloutilizaremoslasentenciaCREATETABLE.
Lasintaxisdelasentenciaeslasiguiente:

CREATETABLE <nombre_tabla>(
<nombre_campo><tipo_datos(tamao)>
[null |not null] [default<valor_por_defecto>]
{
,<nombre_campo><tipo_datos(tamao)>
[null |not null] [default<valor_por_defecto>]}[
,constraint<nombre>primarykey(<nombre_campo>[,...n])][
,constraint<nombre>foreignkey(<nombre_campo>[,...n])
references<tabla_referenciada>(<nombre_campo>[,...n])]
);

Ejemplo: Vamos a simular una base de datos para un negocio de alquiler de


coches,porloquevamosaempezarcreandounatablaparaalmacenarloscoches
quetenemos.

CREATETABLEtCoches
(
matricula char(8) not null, marca varchar(255) null, modelo varchar(255) null, color
varchar(255)null,numero_kilometros
numeric(14,2)nulldefault0,
constraintPK_Cochesprimarykey(matricula)
);

En este ejemplo creamos una tabla llamada tCoches con cinco campos (matricula,
marca,modelo,color,numero_kilometros).

Ntesequesehanomitidolas tildes ylos espaciosa propsito.Nuncacreecampos


quecontengancaracteresespecficosdeunidioma(tildes,ees,...)niespacios.

Lasclavesprimariasyexternas(oforneas)sepuedenimplementardirectamentea
travs de la instruccin CREATE TABLE, o bien se pueden agregar a travs de
sentenciasALTER TABLE.
Cada gestor de bases de datos implementa distintas opciones para la instruccin
CREATETABLE, pudiendoespecificarsegrancantidaddeparmetrosypudiendovariar
elnombrequedamosalostiposdedatos,perolasintaxisestndareslaquehemos
mostradoaqu.
8

Ing. Mario Valle

Modificacin detablas
Enocasionespuedesernecesariomodificarla estructuradeunatabla,comnmente
para aadir un campo o restriccin. Para ello disponemos de la instruccin ALTER
TABLE.
ALTER TABLE nosvaapermitir:
Aadircamposalaestructurainicialdeunatabla.
Aadirrestriccionesyreferencias.

Paraaadiruncampoaunatablaexistente:
ALTER TABLE <nombre_tabla>
ADD<nombre_campo>
<tipo_datos(tamao)>[null |not
null] [default <valor_por_defecto>]
{
,<nombre_campo><tipo_datos(tamao)>
[null |not null] [default <valor_por_defecto>]};
Ejemplo:
ALTER TABLE tCoches
ADDnum_plazasintegernull default 5;
Enesteejemploaadimoselcamponum_plazasalatablatCochesquehabamos
creadoenelapartadoanterior.
Para aadir una clave primaria vamos a crear una tabla de cliente y le
aadiremoslaclaveprimariaejecutandounasentenciaaltertable:
CREATETABLEtClientes
(

codigo
integer
notnull,
nombre
varchar(255)
notnull,
apellidos varchar(255)
null,
nif
varchar(10)
null,
telefono varchar(9)
null,
movil
varchar(9)
null
);

ALTERTABLEtClientesADD
CONSTRAINTPK_tClientesprimarykey(codigo);
9

Ing. Mario Valle

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

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

10

Ing. Mario Valle


Al igual que ocurra con la sentencia CREATE TABLE cada gestor de bases de datos
implementa sus mejoras, siendo la mejor forma de conocerlas recurrir a la
documentacindelgestordebasesdedatos.

Enprincipio,paraborrarcolumnasdeunatabladebemos:
1. Crearunatablaconlanuevaestructura.
2. Transferirlosdatos
3. Borrarlatablaoriginal.
Y digo en principio, porque como ya hemos comentado segn el gestor de bases de
datos con el que trabajemos podremos realizar esta tarea a travs de una sentencia
ALTER TABLE.
Eliminacindetablas.
PodemoseliminarunatabladeunabasededatosmediantelainstruccinDROP TABLE.
DROP TABLE
<nombre_tabla>;
LainstruccinDROP TABLE eliminadeformapermanentelatablaylosdatosenella
contenida.Siintentamoseliminarunatablaquetengaregistrosrelacionadosatravs
de una clave externa la instruccin DROP TABLE fallar por integridad referencial.
Cuandoeliminamosunatablaeliminamostambinsusndices.

Definicin dendices

Unndiceesunaestructuradedatosquepermiteaccederadiferentesfilasdeuna
mismatablaatravsdeuncampo(ocamposclave).

Unndicepermiteunaccesomuchomsrpidoalosdatos.

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

Ing. Mario Valle

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

Losndicesseactualizanautomticamentecuandorealizamosoperacionesdeescritura
enlabasededatos.Esteesunaspectomuyimportantedecaraalrendimientodelas
operacionesdeescritura,yaqueademsdeescribirlosdatosenlatablaseescribirn
tambinenelndice.Unnmeroelevadodendicesharmslentasestasoperaciones.
Sinembargo,salvocasosexcepcionales,elbeneficioqueaportanlosndicescompensa
(delargo)estapenalizacin.

Creacin dendices
Lacreacindendices,comoyahemosvisto,permiteacelerarlasconsultasquese
realizanenlabasededatos.
LassentenciasdeSQLparamanipularndicesson:
CREATEINDEX;
DROPINDEX;

12

Ing. Mario Valle

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

Vistas
Enelmodelodedatosrelacionallaformadeguardarlainformacinnoeslamejor
paraverlosdatos.

Unavistaesunaconsulta,quereflejaelcontenidodeunaomstablas,desdela
quesepuedeaccederalosdatoscomosifueraunatabla.

Dossonlasprincipalesrazonesporlasquepodemoscrearvistas.
13

Ing. Mario Valle

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

Ing. Mario Valle

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

ParaeliminarelsinnimocreadodebemosemplearlasentenciaDROP SYNONYM.

DROPSYNONYMCoches;

15

Ing. Mario Valle


Consulta dedatos.
El proceso ms importante que podemos llevar a cabo en una base de datos es la
consultadelosdatos.Denadaserviraunabasededatossinopudiramosconsultarla.
Esademslaoperacinqueefectuaremosconmayorfrecuencia.

ParaconsultarlainformacinSQLponeanuestradisposicinlasentenciaSELECT.

Lasentencia SELECT

LasentenciaSELECTnospermiteconsultarlosdatosalmacenadosenunatablade
labasededatos.

Elformatodelasentenciaselectes:

SELECT[ALL |DISTINCT]
<nombre_campo>[{,<nombre_campo>}]
FROM
<nombre_tabla>|<nombre
_vista>
[{,<nombre_tabla>|<nomb
re_vista>}]
[WHERE <condicion> [{ AND|OR
<condicion>}]] [GROUP BY <nombre_campo>
[{,<nombre_campo
>}]]
[HAVING
<condicion>[{AND|OR<condicion>}]]
[ORDER BY <nombre_campo>|<indice_campo> [ASC |
DESC] [{,<nombre_campo>|<indice_campo>
[ASC|DESC]}]]

16

Ing. Mario Valle


Veamosporpartesquequieredecircadaunadelaspartesqueconformanlasentencia.

Nomenclatura
Sentencia
Significado

SELECT
PalabraclavequeindicaquelasentenciadeSQLquequeremos
ejecutaresdeseleccin.

ALL
Indica que queremos seleccionar todos los valores. Es el valor
pordefectoynosueleespecificarsecasinunca.
DISTINCT

Indicaquequeremosseleccionarslolosvaloresdistintos.

FROM

Indica la tabla (o tablas) desde la que queremosrecuperarlos


datos.Enelcasodequeexistamsdeunatablasedenominaa
la consulta "consulta combinada" o "join". En las consultas
combinadasesnecesarioaplicarunacondicindecombinacin
atravsdeunaclusulaWHERE.

WHERE

GROUP BY

Especificaunacondicinquedebecumplirseparaquelosdatos
seandevueltosporlaconsulta.Admitenlosoperadoreslgicos
ANDyOR.
Especificalaagrupacinquesedaalosdatos.Seusasiempreen
combinacinconfuncionesagregadas.

HAVING

Especifica una condicin que debe cumplirse para los datos.


Especificaunacondicinquedebecumplirseparaquelosdatos
seandevueltosporlaconsulta.Sufuncionamientoessimilaral
de WHERE pero aplicado al conjunto de resultados devueltos
porlaconsulta.DebeaplicarsesiemprejuntoaGROUP BYyla
condiciondebeestarreferidaaloscamposcontenidosenella.

ORDER BY

Presenta el resultado ordenado por las columnas indicadas. El


orden puede expresarse con ASC (orden ascendente) y DESC
(ordendescendente).ElvalorpredeterminadoesASC.

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

17

Ing. Mario Valle


LapalabraclaveFROM indicaquelosdatossernrecuperadosdelatablatCoches.
Podramoshaberespecificadomsdeunatabla,peroestoseverenelapartadode
consultascombinadas.

Tambinpodramoshabersimplificadolaconsultaatravsdelusodelcomodn
decampos,elasterisco"*".
SELECT*
FROM tCoches
ORDER BYmarca,modelo;
Elusodelasteriscoindicaquequeremosquelaconsultadevuelvatodosloscampos
queexistenenlatabla.
LaclusulaWHERE
La clusula WHERE es la instruccin que nos permite filtrar el resultado de una
sentenciaSELECT.Habitualmentenodeseamosobtenertodalainformacinexistente
enlatabla,sinoquequeremosobtenerslolainformacinquenosresultetilesese
momento.LaclusulaWHEREfiltralosdatosantesdeserdevueltosporlaconsulta.
Ennuestroejemplo,siqueremosconsultaruncocheenconcretodebemosagregar
una clusula WHERE. Esta clusula especifica una o varias condiciones que deben
cumplirseparaquelasentenciaSELECTdevuelvalosdatos.Porejemplo,paraquela
consulta devuelva slo los datos del coche con matrcula M1525ZA debemos
ejecutarlasiguientesentencia:
SELECTmatricula,marca,modelo,color,
numero_kilometros,num_plazas
FROM tCoches
WHEREmatricula='M1525ZA';

Cuando en una clusula where queremos incluir un tipo texto, debemos incluir
el valorentrecomillassimples.
Adems, podemos utilizar tantas condiciones como queramos, utilizando los
operadores lgicos AND y OR . El siguiente ejemplo muestra una consulta que
devolverloscochescuyasmatriculasseanM1525ZAobienM2566AA.
SELECTmatricula,marca,modelo,color,
numero_kilometros,num_plazas
FROM tCoches
WHEREmatricula='M1525ZA'
OR matricula='M2566AA';
18

Ing. Mario Valle


Adems una condicin WHERE puede ser negada a travs del operador lgico
NOT. LasiguienteconsultadevolvertodoslosdatosdelatablatCochesmenosel
quetengamatrculaM1525ZA.

SELECTmatricula,marca,modelo,color,
numero_kilometros,num_plazas
FROM tCoches
WHERENOT matricula='M1525ZA' ;
Podemos tambin obtener las diferentes marcas y modelos de coches ejecutando la
consulta.

SELECTDISTINCTmarca,modelo
FROM tCoches;
La ver los valores distintos. En el caso anterior se devolvern la palabra clave
DISTINCT indica que slo queremos os valores distintos del par formado por los
camposmarcaymodelo.

LaclusulaORDERBY
Comoyahemosvistoenlosejemplosanteriorespodemosespecificarelordenen
elqueserndevueltoslosdatosatravsdelaclusulaORDER BY.
SELECTmatricula,marca,modelo,color,numero_kilometros,num_plazas
FROM tCoches
ORDER BYmarcaASC,modeloDESC;
Como podemos ver en el ejemplo podemos especificar la ordenacin ascendente o
descendenteatravs de las palabras clave ASCy DESC.La ordenacin depende del
tipo de datos que estdefinidoenlacolumna,deformaqueuncamponumrico
ser ordenado como tal, y unalfanumrico se ordenar de la A a la Z, aunque su
contenidoseanumrico.Deestaformaelvalor100sedevuelveantesqueel11.
Tambin podemos especificar el en la clusula ORDER BY el ndice numrico del
campo dentro de la sentencia SELECT para la ordenacin, el siguiente ejemplo
ordenaralosdatosporelcampomarca,yaqueapareceensegundolugardentrodela
listadecamposquecomponenlaSELECT.
SELECTmatricula,marca,modelo,color,numero_kilometros,num_plazas
FROM tCoches
ORDER BY2;
19

Ing. Mario Valle


Insertardatos.

Hastaahorahemosvistocomosealmacenanlosdatosenunabasededatosycomo
consultaresosdatosalmacenados,peronohemosvistocomoalmacenardichosdatos.

Paraalmacenardatosenunabasededatosdebemosinsertarfilasenlastablas.Para
ellosSQLponeanuestradisposicinlasentenciaINSERT.

Insercin defilas
Elprocesodeinsercindefilasconsisteenaadiraunatablaunaomsfilasyencada
filatodosopartedesuscampos.

Podemosdistinguirdosformasdeinsertarfilas:

Insercinindividualdefilas.
Insercinmltipledefilas.

LasintaxisdelasentenciaINSERT esdiferentesegncualseanuestropropsito.

Slopodremosomitiruncampoalefectuarunainsercincuandoesteaceptevalores
nulos.

Insercin individualdefilas
PararealizarlainsercinindividualdefilasSQLposeelainstruccinINSERT INTO.La
insercinindividualde filas es la que ms comnmenteutilizaremos.Su sintaxises la
siguiente:
INSERTINTO
<nombre_tabla>
[(<campo1>[,<campo2>,
...])]values
(<valor1>,<valor2>,...);

Comosepuedeobservarlasentenciatienedospartesclaramentediferenciadas,porun
ladolapropiaINSERT INTO seguidadelalistadecamposenlosquequeremosinsertar
losdatos,yporotrolalistadevaloresquequeremosinsertarenloscampos.Lamejor
formadeverestoesatravsdeunejemplo.

INSERTINTOtCoches
(matricula,marca ,modelo
,color ,numero_kilometros)
values
('M1111CA','RENAULT','MEGANETR100','NEGRODIAMANTE',78000);

20

Ing. Mario Valle


ConestasentenciaINSERT creamosunregistroenlatablatCochesconlosvalores
especificados, es decir, la matricula tendr el valor M1111CA, la marca ser
RENAULTyassucesivamente.

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

Ing. Mario Valle

Ninguna de las filas devueltas por la consulta debe infringir las reglas de
integridaddelatablaenlaquevayamosarealizarlainsercin.
Pongamosunejemplo,vamosacrearunatablaconlasdiferentesmarcasquetenemos
enlabasededatos.LasentenciaSQLparacrearlatablaeslasiguiente:
CREATETABLEtMarcas
(
codigo
integernotnullidentity(1,1),
marca
varchar(255),
constraintPK_Marcasprimarykey(codigo)
);
Nota:Hemosincluidolafuncinidentityparaelcampocodigo,estafuncinespropia
de SQL Server e indica que el cdigo se genera automticamentecada vez que se
insertaunregistroconunvalorautonumrico.Prcticamentetodoslosgestoresde
basesdedatosdanlaopcindelcampoautonumricooincremental.

Unavezquetenemoscreadalatablademarcasvamosainsertarotroparderegistros
enlatablade coches,paraelloutilizamosunasentenciainsertinto paraunanica
fila.
INSERTINTOtCoches
(matricula,marca ,modelo
,color)
values
('M2233FH','SEAT','LEONFR','ROJO');
INSERTINTOtCoches
(matricula,marca ,modelo
,color)
values
('M1332FY','FORD','FIESTA','GRISPLATA');
AhoratenemostresmarcasdiferentesenlatablatCoches,yqueremosinsertarlasenla
tabla de marcas, para ello podemos realizar tres inserciones individuales, pero que
pasara si no supiramos de antemano el nmero de marcas? y si fueran unas
cincuenta marcas?. Nos podramos pasar el da entero escribiendo sentencias insert
into.
Afortunadamentepodemosrealizarunainsercinmltipledelsiguientemodo:
INSERTINTOtMarcas
(marca)
SELECTDISTINCTmarcaFROMtCoches;

22

Ing. Mario Valle

ComoresultadoobtenemosunregistroenlatablatMarcasporcadamarcadelatabla
tCoches. Elcampocodigosehageneradoautomticamenteyaqueestdefinidocomo
identidad.

CODIGO
MARCA
1

FORD
2

RENAULT
3

SEAT
Dmonos cuenta de que el orden de generacin no ha sido el mismo que el de
insercin,sinoquesehaaplicadoelordenenelquehansidodevueltoslosdatosporla
sentenciaSELECT.
AhoradeberamoscambiarlosdatosdelatablatCoches,paraguardarelcdigodela
marcaenlugardesudescripcin,peroparaellonecesitamossabercmomodificarun
datograbado...Esmomentodepasaralsiguientepunto,laactualizacindedatos.

Borradodedatos

Lasentencia DELETE.

Paraborrardatosdeunatabla,debemosutilizarlasentenciaDELETE.Lasintaxisdela
sentenciaDELETEeslasiguiente:

DELETEFROM
<nombre_tabla>[
WHERE
<condicion>];

ElsiguienteejemploilustraelusodelasentenciaDELETE.Esbuenaideaespecificaren
la sentenciaWHERE los camposque formanla clave primariade la tabla para evitar
borrardatosquenoqueramoseliminar.

DELETEFROMtCoches

WHEREmarca='SEAT';
La sintaxis de DELETE varia en Access, siendo necesario el uso del comodn *.
DELETE*FROM<tCoches>

Cuando trabajemos con la sentencia DELETE debemos tener en cuenta las siguientes
consideraciones:
23

Ing. Mario Valle


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

Lasentencia TRUNCATE

Para realizar un borrado completo de tabla debemos considerar la posibilidad de


utilizarlasentenciaTRUNCATE, muchomsrpidaqueDELETE.
LasintaxisdelasentenciaTRUNCATEeslasiguiente:
TRUNCATETABLE<nombre_tabla>;
ElsiguienteejemplomuestraelusodelasentenciaTRUNCATE.
TRUNCATETABLEtCoches;
Cuando trabajemoscon la sentenciaTRUNCATE debemostener en cuenta las
siguientesconsideraciones.
LasentenciaTRUNCATEnoestransaccional.Nosepuededeshacer.
LasentenciaTRUNCATEnoadmiteclausulaWHERE.Borratodalatabla.
NotodoslosgestoresdebasesdedatosadmitenlasentenciaTRUNCATE.

Actualizacindedatos

Lasentencia UPDATE.

Para la actualizacin de datos SQL dispone de la sentencia UPDATE. La sentencia


UPDATE permite la actualizacin de uno o varios registros de una nica tabla. La
sintaxisdelasentenciaUPDATE eslasiguiente
UPDATE<nombre_tabla>
SET <campo1>=<valor1>
{[,<campo2> = <valor2>,...,<campoN> =
<valorN>]}[WHERE<condicion>];

LassiguientessentenciasactualizanlosdatosdelatablatCochesconlosvaloresde
la tabla tMarca obtenidos anteriormente en la pgina dedicada a la insercin de
datos.

24

Ing. Mario Valle


UPDATEtCoches
SET marca='1'
WHEREmarca='FORD';

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

Ing. Mario Valle


Lasintaxiseslasiguiente:

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

Ing. Mario Valle

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

Consultascombinadas.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

Ing. Mario Valle


Combinacin interna.
La combinacininterna nos permite mostrar los datos de dos o ms tablas a
travsdeunacondicinWHERE.

Si recordamos los ejemplos de los captulos anteriores tenemos una tabla de


coches,enlaquetenemosreferenciadalamarcaatravsdelcdigodemarca.Para
realizarlaconsultacombinadaentreestasdostablasdebemosescribirunaconsulta
SELECT en cuya clusula FROM escribiremos el nombre de las dos tablas,
separadosporcomas,yunacondicinWHEREqueobligueaqueelcdigodemarca
delatabladecochesseaigualalcdigodelatablademarcas.
Lomssencilloesverunejemplodirectamente:
SELECTtCoches.matricula,

tMarcas.marca,

tCoches.modelo,

tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
FROMtCoches,tMarcas
WHEREtCoches.marca=tMarcas.codigo
Lamismaconsultadeforma"visual"seraalgoas:

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

28

Ing. Mario Valle

SELECT[ALL|DISTINCT]
<nombre_campo>[{,<nombre_campo>}]
FROM<nombre_tabla>
[{INNERJOIN <nombre_tabla>ON<condicion_combinacion>}]
[WHERE<condicion>[{AND|OR<condicion>}]]
[GROUP
BY
<nombre_campo>
[{,<nombre_campo
>}]]
[HAVING
<condicion>[{AND|OR<condicion>}]]
[ORDERBY<nombre_campo>|<indice_campo>[ASC|DESC]
[{,<nombre_campo>|<indice_campo>[ASC|DESC]}]]
ElejemploanteriorescritoutilizandolaclusulaINNER JOIN quedaradelasiguiente
manera:
SELECTtCoches.matricula,

tMarcas.marca, tCoches.modelo,
tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
FROMtCoches
INNERJOINtMarcasONtCoches.marca=tMarcas.codigo
La clusula INNER JOIN permite separar completamente las condiciones de
combinacinconotroscriterios,cuandotenemosconsultasquecombinannueveodiez
tablasestorealmenteseagradece.Sinembargomuchosprogramadoresnosonamigos
delaclusulaINNER JOIN,laraznesqueunodelosprincipalesgestoresdebasesde
datos, ORACLE, no la soportaba. Si nuestro programa deba trabajar sobre bases de
datos ORACLE no podamos utilizar INNER JOIN. A partir de la versin ORACLE 9i
Oraclesoportalaclusula INNER JOIN.

Combinacin Externa
Lacombinacininternaesexcluyente.Estoquieredecirquesiunregistronocumplela
condicindecombinacinnoseincluyeenlosresultados.Deestemodoenelejemplo
anteriorsiuncochenotienegrabadalamarcanosedevuelveenmiconsulta.
Segnlanaturalezadenuestraconsultaestopuedeserunaventaja,peroenotroscasos
significa un serio problema. Para modificar este comportamientoSQL pone a nuestra
disposicinlacombinacinexterna.Lacombinacinexternanoesexcluyente.
Lasintaxisesmuyparecidaalacombinacininterna,
29

Ing. Mario Valle

SELECT[ALL|DISTINCT]
<nombre_campo>[{,<nombre_campo>}]
FROM<nombre_tabla>
[{LEFT|RIGHTOUTERJOIN
<nombre_tabla>ON<condicion_combinacion>}]
[WHERE<condicion>[{AND|OR
<condicion>}]][GROUPBY<nombre_campo>
[{,<nombre_campo>}]][HAVING
<condicion>[{AND|OR<condicion>}]]
[ORDERBY<nombre_campo>|<indice_campo>[ASC|DESC]
[{,<nombre_campo>|<indice_campo>[ASC|
DESC]}]]
La combinacin externa puede ser diestra o siniestra, LEFT OUTER JOIN o RIGHT
OUTERJOIN. ConLEFT OUTER JOINobtenemostodoslosregistrosdeenlatablaque
situemos a la izquierda de la clusula JOIN, mientras que con RIGHT OUTER JOIN
obtenemoselefectocontrario.
Comomejorsevelacombinacinexternaesconunejemplo.
SELECTtCoches.matricula,

tMarcas.marca,
tCoches.modelo, tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
FROMtCoches
LEFTOUTERJOINtMarcasONtCoches.marca=tMarcas.codigo
Estaconsultadevolvertodoslosregistrosdela tablatCoches,independientemente
dequetenganmarcaono.Enelcasodequeelcochenotengamarcasedevolverel
valornull paraloscamposdelatablatMarcas.
Visualmentelaconsultasereflejaas:

30

Ing. Mario Valle

ElmismoejemploconRIGHTOUTERJOIN.
SELECTtCoches.matricula,

tMarcas.marca,
tCoches.modelo, tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
FROMtCoches
RIGHTOUTERJOINtMarcasONtCoches.marca=tMarcas.codigo
EstaconsultadevolverlosregistrosdelatablatCochesquetenganmarcarelacionada
ytodoslosregistrosdelatablatMarcas,tenganalgnregistroentCochesono.
Visualmentelaconsultasereflejaas:

Union

La clusulaUNION permiteunir dos o ms conjuntosde resultadosen uno detrs del


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

Ing. Mario Valle

UNION[ALL|DISTINCT]
SELECT[ALL|DISTINCT]
<nombre_campo>[{,<nombre_campo>}]
FROM<nombre_tabla>
[{LEFT|RIGHTOUTERJOIN
<nombre_tabla>ON<condicion_combinacion>}]
[WHERE<condicion>[{AND|OR<condicion>}]]
[GROUPBY<nombre_campo>
[{,<nombre_campo>}]][HAVING<condicion>[{
AND|OR<condicion>}]]
}
[ORDERBY<nombre_campo>|<indice_campo>[ASC|DESC]
[{,<nombre_campo>|<indice_campo>[ASC|DESC]}]]
ParautilizarlaclusulaUNIONdebemoscumplirunaseriedenormas.
Las consultas a unir deben tener el mismo nmero campos, y adems los
camposdebenserdelmismotipo.
SlopuedehaberunanicaclausulaORDER BYalfinaldelasentenciaSELECT.
ElsiguienteejemplomuestraelusodeUNION
SELECTtCoches.matricula,

tMarcas.marca,

tCoches.modelo,

tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
FROMtCoches
INNERJOINtMarcasONtCoches.marca=tMarcas.codigo
UNION
SELECTtMotos.matricula,

tMarcas.marca,

tMotos.modelo,

tMotos.color,
tMotos.numero_kilometros
FROMtMotos
INNERJOINtMarcasONtMotos.marca=tMarcas.codigo;

Puedeobservarseelusodelaconstanteceroenla segundalistadeseleccin para


hacercoincidirelnmeroytipodecamposquedevuelvelaconsultaUNION.

32

Ing. Mario Valle


Consultasagregadas

LaclusulaGROUPBY
La clusula GROUP BY combina los registros con valores idnticos en un nico
registro.Paracada registro se puedecrear un valoragregadosi se incluye una funcin
SQLagregada,comoporejemploSumoCount,enlainstruccinSELECT.Susintaxises:

SELECT[ALL|DISTINCT]
<nombre_campo>
[{,<nombre_campo>}]
[{,<funcion_agregado>}]
FROM<nombre_tabla>|<nombre_vista>
[{,<nombre_tabla>|<nombre_vista
>}] [WHERE <condicion> [{ AND|OR
<condicion>}]] [GROUPBY <nombre_campo>
[{,<nombre_campo
>}]]
[HAVING
<condicion>[{AND|OR<condicion>}]]
[ORDER BY <nombre_campo>|<indice_campo> [ASC |
DESC][{,<nombre_campo>|<indice_campo>[ASC
|DESC]}]]

GROUP BY es opcional. Si se utiliza GROUP BY pero no existe una funcin SQL


agregadaenlainstruccinSELECTseobtieneelmismoresultadoqueconunaconsulta
SELECT DISTINCT. Los valores Null en los campos GROUP BY se agrupan y no se
omiten. No obstante, los valores Null no se evalan en ninguna de las funciones SQL
agregadas.

Todos los campos de la lista de campos de SELECT deben incluirse en la clusula


GROUP BYocomoargumentosdeunafuncinSQLagregada.

SELECTmarca,modelo,SUM(numero_kilometros)
FROMtCoches
GROUPBYmarca,modelo

LaclusulaHAVING
Una vez que GROUP BY ha combinado los registros, HAVING muestra cualquier
registro agrupado por la clusula GROUP BY que satisfaga las condiciones de la
clusula HAVING.SeutilizalaclusulaWHEREparaexcluiraquellasfilasquenodesea
agrupar,ylaclusulaHAVINGparafiltrarlosregistrosunavezagrupados.

HAVING es similar a WHERE, determina qu registros se seleccionan. Una vez


que los registros se han agrupado utilizando GROUP BY, HAVINGdetermina cules
33

Ing. Mario Valle

de ellos se van amostrar.HAVING permiteelusodefuncionesagregadas.


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

COUNT(<expr>)

Endondeexprcontieneelnombredelcampoquedeseacontar.Losoperandosdeexpr
puedenincluirelnombredeuncampodeunatabla,unaconstanteounafuncin(la
cual puede ser intrnseca o definida por el usuario pero no otras de las funciones
agregadasdeSQL).Puedecontarcualquiertipodedatosinclusotexto.

Aunqueexprpuederealizarunclculosobreuncampo,Countsimplementecuentael
34

Ing. Mario Valle

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

Max,Min
Devuelvenelmnimooelmximodeunconjuntodevalorescontenidosenuncampo
especificodeunaconsulta.Susintaxises:

MIN(<expr>)
MAX(<expr>)

En donde expr es el campo sobre el que se desea realizar el clculo. Expr puede
incluir el nombre de un campo de una tabla, una constante o una funcin (la cual
puedeserintrnsecaodefinidaporelusuarioperonootrasdelasfuncionesagregadas
deSQL).

SELECT
marca,

modelo,

MIN(numero_kilometros),

MAX(numero_kilometros)
FROM
tCoches
GROUPBY marca,modelo

Sum
Devuelvela suma del conjunto de valores contenidoen un campo especficode una
consulta.
Susintaxises:

SUM(<expr>)
35

Ing. Mario Valle

En donde expr representa el nombre del campo que contiene los datos que desean
sumarseounaexpresinquerealizaunclculoutilizandolosdatosdedichoscampos.
Los operandos de expr pueden incluir el nombre de un campo de una tabla, una
constanteounafuncin(lacualpuedeserintrnsecaodefinidaporelusuarioperono
otrasdelasfuncionesagregadasdeSQL).
SELECT

FROM
GROUPBY

marca,
modelo,
SUM(numero_kilometros)
tCoches
marca,modelo

Subconsultas

Definicin desubconsultas.
UnasubconsultaesunasentenciaSELECT queaparecedentrodeotrasentencia
SELECT.NormalmenteseutilizanparafiltrarunaclausulaWHEREoHAVING con
elconjuntoderesultadosdelasubconsulta,aunquetambinpuedenutilizarseen
lalistadeseleccin.

Porejemplopodramosconsultarelalquilerltimodeuncliente.
SELECTCO_CLIENTE,NOMBRE,MARCA,MODELO
FROMALQUILERES
WHERECO_CLIENTE=1
AND FECHA_ALQUILER=(SELECTMAX(FECHA_ALQUILER)
FROMALQUILERES
WHERECO_CLIENTE=1)

En este caso, la subconsulta se ejecuta en primer lugar, obteniendo el valor de la


mxima fecha de alquiler, y posteriormente se obtienen los datos de la consulta
principal.

Una subconsulta tiene la misma sintaxis que una sentencia SELECT normal
exceptuandoqueapareceencerradaentreparntesis.

La subconsulta se puede encontrar en la lista de seleccin, en la clusula


WHEREoenlaclusulaHAVING delaconsultaprincipal.

Tienelassiguientesrestricciones:
NopuedecontenerlaclusulaORDER BY
36

Ing. Mario Valle

NopuedeserlaUNIONdevariassentenciasSELECT
Si la subconsulta aparece en la lista de seleccin, o est asociada a un operador
igual"="solopuededevolverunnicoregistro.

Referenciasexternas

A menudo, es necesario, dentro del cuerpo de una subconsulta, hacer referencia al


valordeunacolumnadelafilaactualenlaconsultaprincipal,esenombredecolumna
sedenominareferenciaexterna.
Unareferenciaexternaesuncampoqueapareceenlasubconsultaperoserefierea
launadelastablasdesignadasenlaconsultaprincipal.
Cuandoseejecutaunaconsultaquecontieneunasubconsultaconreferenciasexternas,
lasubconsultaseejecutaporcadafiladelaconsultaprincipal.
Enesteejemplolasubconsultaapareceenlalistadeseleccin,ejecutndoseunavez
porcadafilaquedevuelvelaconsultaprincipal.
SELECTCO_EMPLEADO,NOMBRE,
(SELECTMIN(FECHA_NOMINA)
FROMNOMINAS
WHERECO_EMPLEADO=EMPLEADOS.CO_EMPLEADO)PRIMERA_NOMINA
FROMEMPLEADOS;
Anidar subconsultas
Las subconsultas pueden anidarse de forma que una subconsulta aparezca en la
clusulaWHERE(porejemplo)deotrasubconsultaqueasuvezformapartedeotra
consultaprincipal.
SELECT CO_EMPLEADO,EMPLEADOS
FROMEMPLEADOS
WHERECO_EMPLEADOIN(SELECTCO_EMPLEADO
FROMNOMINAS
WHEREESTADO IN(SELECTESTADO
FROMESTADOS_NOMINAS
WHEREEMITIDO='S'
ANDPAGADO='N')
)
Los resultados que se obtienen con subconsultas normalmente pueden
conseguirseatravsdeconsultascombinadas(JOIN).
SELECT CO_EMPLEADO,NOMBRE
37

Ing. Mario Valle

FROMEMPLEADOS
WHEREESTADOIN(SELECTESTADO
FROMESTADOS
WHEREACTIVO='S')
Podrescribirsecomo:
SELECT CO_EMPLEADO,NOMBRE
FROMEMPLEADOS,ESTADOS
WHEREEMPLEADOS.ESTADO=ESTADOS.ESTADO
ANDESTADOS.ACTIVO='S'
Normalmente es ms rpido utilizar un JOIN en lugar de una subconsulta, aunque
esto depende sobre todo del diseo de la base de datos y del volumen de datos que
tenga.

UtilizacindesubconsultasconUPDATE
Podemos utilizar subconsultas tambin en consultas de actualizacin
conjuntamente conUPDATE.Normalmenteseutilizanpara"copiar"elvalordeotra
tabla.
UPDATE EMPLEADOS
SETSALARIO_BRUTO=(SELECTSUM(SALIRO_BRUTO)
FROMNOMINAS
WHERE
NOMINAS.CO_EMPLEADO
EMPLEADOS.CO_EMPLEADO)
WHERESALARIO_BRUTOISNULL

Lafuncin EXISTS
EXISTS es una funcin SQL que devuelve verdadero cuando una subconsulta
retornaalmenosunafila.
SELECT CO_CLIENTE,NOMBRE
FROMCLIENTES
WHEREEXISTS(SELECT*
FROMMOROSOS
WHERECO_CLIENTE=CLIENTES.CO_CLIENTE
ANDPAGADO='N')
La funcin EXISTS puede ser utilizada en cualquier sentencia SQL vlida, SELECT,
UPDATE,INSERT oDELETE.

38

Você também pode gostar