Datos Relacionales
ProInf.net,
SCP
ProInf.net, SCP
www.proinf.net
Tabla de contenidos
1. Generalidades______________________________________________4
1.1. Arquitecturas_______________________________________________4
1.2. Cursores y Buffers___________________________________________5
2. Modelo de datos_____________________________________________8
2.1. Introduccin________________________________________________8
2.2. Los Usuarios________________________________________________9
2.3. Ciclo de vida de una base de datos_____________________________10
2.4. Criterios de calidad_________________________________________12
2.5. Indicadores de calidad_______________________________________15
2.6. El modelo lgico____________________________________________16
2.7. Restricciones de integridad___________________________________17
3. Modelo Relacional__________________________________________21
3.1. Introduccin_______________________________________________21
3.2. Proceso de normalizacin_____________________________________24
3.3. Las interrelaciones__________________________________________29
3.4. Algebra relacional__________________________________________32
3.5. Clculo relacional___________________________________________36
4. Lenguaje SQL______________________________________________38
4.1. Introduccin_______________________________________________38
4.2. Consultas de Seleccin______________________________________41
4.3. Consultas de Accin_________________________________________46
4.4. Consultas de Unin Internas__________________________________50
4.5. Consultas de Unin Externas__________________________________58
4.6. Consultas de Referencias Cruzadas_____________________________60
4.7. Criterios de Seleccin________________________________________64
4.8. Agrupamiento de Registros___________________________________71
4.9. Tipos de Datos_____________________________________________76
4.10.Subconsultas______________________________________________78
4.11.Estructuras de las Tablas_____________________________________84
4.12.Problemas resueltos: Registros duplicados_______________________89
4.13.Problemas resueltos: Registros no relacionados___________________90
4.14.Cursores__________________________________________________90
4.15.FREETEXT y CONTAINS (FULLTEXT SQL-SERVER)__________________94
Claudio Casares
ProInf.net, SCP
www.proinf.net
5. APNDICES______________________________________________125
5.1. Las 12 reglas de Codd que determinan la fidelidad de un sistema relacional
al modelo relacional________________________________________125
Claudio Casares
ProInf.net, SCP
www.proinf.net
1. Generalidades
1.1.
Arquitecturas
En muchas ocasiones, despus de haber realizado un gran estudio detallado
del SGBD y haber revisado su diseo, nos podemos encontrar que ha
implementado sobre un equipo con insuficientes recursos o no se ha
seleccionado la arquitectura adecuada para su explotacin. Entre otras
arquitecturas, caben destacar las siguientes:
ProInf.net, SCP
www.proinf.net
1.2.
Cursores y Buffers
Bsicamente, un cursor es un conjunto de punteros a las filas devueltas por
una consulta, la mayora, son como un conjunto de resultados, excepto por
que los datos reales generalmente permanecen en el servidor.
Un buffer es un depsito RAM en el lado del cliente donde se guardan los datos
del conjunto de resultados de manera temporal hasta que pueden llevarse a
otro lugar para su almacenamiento.
Las columnas de datos de una o varias filas se dice que son miembros del
cursor si la clusula WHERE de la consulta las incluye. Esta columnas,
combinadas en filas lgicas se convierten en filas miembro del conjunto de
resultados.
Por ejemplo:
SELECT
Nombre, Genero
FROM
Animales
WHERE
Edad < 10
Cuando se ejecuta esta consulta, el motor cliente empieza inmediatamente a
seleccionar miembros para el conjunto de resultados. En este caso son todos
los animales menores de diez aos.
Si no es necesaria una ordenador, el SGDB pasa las primeras filas de este
conjunto de resultados de vuelta a la estacin de trabajo nada ms capturarlas
y despus detiene el procesamiento hasta que la estacin recupera las filas
capturadas, una vez recuperadas el gestor de datos pasa ms filas y as
sucesivamente. Debido a este proceso, si otros usuarios estn actualizando la
base de datos, hay posibilidades que se aada otra fila que cumpla las
condiciones del conjunto de resultados; en este caso la fila aadida pasa a ser
miembro del conjunto y es recuperada por la estacin de trabajo. Tambin
existe la posibilidad de la eliminacin o modificacin de una fila, en estos
casos, si la fila no ha sido enviada a la estacin de trabajo o no se enva o se
enva modificada; pero siempre cabe la posibilidad de que la estacin de
trabajo haya ledo una fila que ya no existe o que haya sido modificada por
otro usuario. Estas actualizaciones no se incluirn en el conjunto de resultados
si la estacin de trabajo ha comenzado a procesar los resultados.
El proceso de relleno del cursor finaliza cuando el gestor de datos ha
determinado cual es la ltima fila del conjunto de resultados y se considera
completamente relleno cuando la estacin de trabajo ha capturado la ltima
fila, en este momento cuando se conoce el nmero de filas que componen el
cursor. Por este motivo los mtodos o propiedades que informan del nmero de
filas devueltas o afectadas no son reales hasta que el cursor no se rellenado
completamente.
Claudio Casares
ProInf.net, SCP
www.proinf.net
Cursores desplazables
Uno de los aspectos ms costosos de la administracin de los cursores es dar
soporte a la capacidad de desplazamiento. Esta capacidad significa que, una
vez ejecutada una consulta, un cursor desplazable permite la colocacin en
cualquier fila del conjunto de resultados. Estos mtodos de reubicacin son
costosos en el sentido que consumen recursos del sistema. Para aumentar el
rendimiento se aconseja limitar los cursores y seleccionar los no desplazables.
Cursores estticos
Un cursor esttico proporciona la capacidad de direccionamiento por todo el
conjunto de resultados generando una copia en la estacin de trabajo de las
filas devueltas, todos los trabajos realizados sobre este conjunto de resultados
afectar nicamente a la copia local. Por su naturaleza este cursor necesita de
un espacio de almacenamiento en el cliente. Este cursor no es la mejor opcin
para datos que cambian constantemente, pero para tablas de bsqueda cuyos
valores no es probable que cambien, este cursor tiene mucho sentido.
Claudio Casares
ProInf.net, SCP
www.proinf.net
Cursores dinmicos
Al igual que en los dos casos anteriores, un cursor dinmico almacena un
bloque de claves. Sin embargo, con este tipo de cursor, la consulta que se ha
utilizado para generar el conjunto de resultados se vuelve a ejecutar
constantemente siempre que se hace referencia al cursor. Debido a esta
actividad repetida, los cursores dinmicos consumen gran cantidad de
recursos, pero poseen la gran ventaja que jams cierran la pertenencia o no
pertenencia de las filas al conjunto de resultados. En los dos casos anteriores
una vez rellenado el cursor no se admite la inclusin o exclusin de filas.
Buffers de n filas
Un buffer de n filas ampla el mbito y la capacidad de desplazamiento del
buffer de una nica fila. En este caso, a la estacin de trabajo se le expone un
nmero determinado de filas del conjunto de resultados y a la aplicacin se le
permite que se desplace libremente por esas filas.
Claudio Casares
ProInf.net, SCP
www.proinf.net
2. Modelo de datos
2.1.
Introduccin
Desde tiempos remotos, los datos han sido registrados por el hombre en algn
tipo de soporte (piedra, papel, madera, etc.) a fin de que quedara constancia
de una fenmeno o idea. Los datos han de ser interpretados para que se
conviertan en informacin til, esta interpretacin supone un fenmeno de
agrupacin y clasificacin.
En la era actual y con el auge de los medios informticos aparece el
almacenamiento en soporte electromagntico, ofreciendo mayores
posibilidades de almacenaje, ocupando menos espacio y ahorrando un tiempo
considerable en la bsqueda y tratamiento de los datos. Es en este momento
donde surge el concepto de bases de datos y con ellas las diferentes
metodologas de diseo y tratamiento.
El objetivo bsico de toda base de datos es el almacenamiento de smbolos,
nmeros y letras carentes de un significado en s, que con un tratamiento
adecuado se convierten en informacin til. Un ejemplo podra ser el siguiente
dato: 19941224, con el tratamiento correcto podra convertirse en la siguiente
informacin: "Fecha de nacimiento: 24 de diciembre de 1994".
Segn van evolucionando los tiempos, las necesidades de almacenamiento de
datos van creciendo y con ellas las necesidades de transformar los mismos
datos en informacin de muy diversa naturaleza. Esta informacin es utilizada
diariamente como herramientas de trabajo y como soporte para la toma de
decisiones por un gran colectivo de profesionales que toman dicha informacin
como base de su negocio. Por este motivo el trabajo del diseador de bases de
datos es cada vez ms delicado, un error en el diseo o en la interpretacin de
datos puede dar lugar a informacin incorrecta y conducir al usuario a la toma
de decisiones equivocadas. Se hace necesario la creacin de un sistema que
ayude al diseador a crear estructuras correctas y fiables, minimizando los
tiempos de diseo y explotando todos los datos, nace as la metodologa de
diseo de bases de datos.
La metodologa de diseo de datos divide cada modelo en tres esquemas:
A) Modelo Global: se trata de una representacin grfica legible por el usuario
y que nos aporta el flujo de informacin dentro de una organizacin. No
existen reglas para su construccin y se debe realizar siempre el esquema ms
sencillo posible para la comprensin por parte del usuario de la base de datos.
Por ejemplo:
Claudio Casares
ProInf.net, SCP
www.proinf.net
2.2.
Los Usuarios
En todo sistema de base de datos cabe diferenciar tres tipos diferentes de
usuarios, entre todos comparten la informacin pero acceden a ella de una
forma diferente, siempre en funcin de sus necesidades.
El primer grupo de usuarios es el PED (Procesamiento Electrnico de Datos),
normalmente compuestos por los operarios de la organizacin. Las necesidades
bsicas de este grupo de usuarios son:
1. El foco operativo fundamental se centra en el almacenamiento de los
datos, el procesamiento de los mismos y el flujo de datos;
2. Generan informes de tipo listados;
3. Poseen acceso restringido a la informacin.
El segundo grupo de usuarios es el SIM (Sistemas de Informacin de Gestin)
y suele estar formado por los mandos medios de la organizacin. Las
necesidades bsicas de este grupo de usuarios son:
Claudio Casares
10
ProInf.net, SCP
www.proinf.net
2.3.
11
ProInf.net, SCP
www.proinf.net
Nombre
Cargo
Area de Responsabilidad
Obligaciones principales que requieren informacin de la base datos
De qu aplicaciones recibe informacin?
Con cunta frecuencia recibe informacin?
Qu hace con esta informacin?
Qu precauciones de seguridad debe tomar con respecto a la
informacin?
Para que aplicacin proporciona datos?
Estn contemplados cambios para alguna de sus actividades actuales
que involucren alguna de las informaciones anteriores?
2.3.4. Diseo
Claudio Casares
12
ProInf.net, SCP
www.proinf.net
2.3.5. Implementacin
Una vez totalmente detallado el modelo conceptual se comienza con la
implementacin fsica del modelo de datos, a medida que se va avanzando en
el modelo el administrador del sistema va asegurando la correccin del modelo
y el validador la utilidad del mismo.
La implementacin consiste en el desarrollo de las tablas, los ndices de los
mismos, las condiciones de validacin de los datos, la relacin entre las
diferentes tablas. Por otro lado, la definicin de las consultas y los parmetros
a utilizar por cada una de ellas.
Una vez finalizada la implementacin fsica, se asignan las correspondientes
medidas de seguridad y se ubica la base de datos en el lugar correspondiente.
2.4.
Criterios de calidad
Legibilidad
El diseo de una base de datos ha de estar redactado con la suficiente claridad
para que pueda ser entendido rpidamente. El lenguaje utilizado debe ser lo
Claudio Casares
13
ProInf.net, SCP
www.proinf.net
suficientemente claro, conciso y detallado para que explique con total claridad
el diseo del modelo, sus objetivos, sus restricciones, en general todo aquello
que afecte al sistema de forma directa o indirecta. En este punto conviene
aplicar el principio que una imagen vale ms que mil palabras, pero en
ocasiones son necesarias esas mil palabras y obviar la imagen.
Fiabilidad
Se trata de realizar un sistema de bases de datos lo suficientemente robusto
para que sea capaz de recuperarse frente a errores o usos inadecuados. Se
deben utilizar gestores con las herramientas necesarias para la reparacin de
los posibles errores que las bases de datos pueden sufrir, por ejemplo tras un
corte inesperado de luz.
Portabilidad
El diseo deber permitir la implementacin del modelo fsico en diferentes
gestores de bases de datos.
Modificabilidad
Ningn sistema informtico es esttico, las necesidades de los usuarios varan
con el tiempo y por lo tanto las bases de datos se deben adaptar a las nuevas
necesidades, por lo que se precisa que un buen diseo facilite el
mantenimiento, esto es, las modificaciones y actualizaciones necesarias para
adaptarlo a una nueva situacin.
Eficiencia
Se deben aprovechar al mximo los recursos de la computadora, minimizando
la memoria utilizada y el tiempo de proceso o ejecucin, siempre que no sea a
costa de los requisitos anteriores. En este punto se debe tener en cuenta los
gestores cliente / servidor de bases de datos. En muchas ocasiones es ms
rentable cargar de trabajo al servidor y liberar recursos de los clientes, pero no
todos los gestores permiten este tipo de trabajo, por lo tanto se ha de tener en
cuenta estas dos circunstancias en el diseo de la base de datos.
Auto descripcin
En la documentacin generada debe estar todo el detalle del diseo, evitando
referencias a otros documentos que no estn incluidos dentro de la
documentacin de la base de datos.
Trivialidad
Tanto el diseo como la implantacin se deben realizar utilizando los
estndares fijados a priori, estos estndares debern quedar reflejados al inicio
del documento.
Claridad
Todos los documentos deben estar redactados de forma clara y fcil de
entender, los nombre utilizados para las tablas, los campos, ndices, etc. deben
ser autodescriptivos y estar perfectamente documentados.
Claudio Casares
14
ProInf.net, SCP
www.proinf.net
Coherencia
Las anotaciones y terminologa utilizada deben ser uniformes, para ello se debe
seguir algn tipo de metodologa estndar, indicado cual se ha empleado, en
los casos en que se utilice alguna metodologa no estndar se debe adjuntar a
la documentacin.
Completo
Todos los elementos constitutivos de la base de datos existen, no se han
dejado partes incompletas, sin documentar o sin implementar.
Concisin
No existen elementos intiles ni repetitivos. En este apartado hay que hacer un
especial hincapi en la repeticin de datos en diferentes tablas, hay que evitar
a toda costa que el mismo dato se repita en varias tablas para conseguir as
una optimizacin del tamao de la base de datos.
Facilidad de Aprendizaje
La documentacin de la base de datos se puede utilizar sin necesidad de otros
conocimientos informticos fuera del alcance del diseo e implementacin de la
base de datos.
Facilidad de Uso
Los datos deben ser fciles de elaborar y los resultados fciles de entender.
Generalidad
La base de datos debe ser capaz de adaptarse a cualquier tipo de empresa y a
cualquier casustica.
Independencia de Usuario
La base de datos no debe estar ligada a la utilizacin en una nica instalacin,
hay que tener en cuenta que, aunque se trate de un desarrollo a medida, en
un futuro se podra realizar la instalacin en un cliente diferente al inicial.
Independencia de Sistema
Las prestaciones y diseo de la base de datos no estn vinculadas al entorno.
Independencia de Instalacin
La base de datos se puede transportar fcilmente de una instalacin a otra.
Modularidad
La base de datos puede ser descompuesta en elementos independientes. Si se
trata de un diseo grande, en donde hay un gran nmero de tablas, conviene
realizar agrupaciones entre ella, creando mdulos funcionales que permitan la
mejor compresin del diseo y de la implantacin.
Claudio Casares
15
ProInf.net, SCP
www.proinf.net
Observable
La base de datos debe permitir observar los accesos a los datos. Siempre que
se pueda hay que dejar un rastro de la utilizacin de los datos por parte de los
usuarios, esta informacin ayuda al redimensionado de la base de datos y a
conocer el nmero de accesos a los datos.
Precisin
Los clculos efectuados se deben realizar con la precisin requerida.
Proteccin
La base de datos debe permitir la proteccin de los datos frente a usos no
debidos, para ello hay que elaborar un sistema de accesos definiendo
diferentes usuarios con diferentes claves y especificar que autorizaciones
tendr cada usuario sobre los diferentes datos.
Trazabilidad
Tomando como punto de partida la versin actual se puede remontar su diseo
hasta las especificaciones iniciales
2.5.
Indicadores de calidad
Al finalizar el diseo de una base de datos podemos utilizar la siguiente tabla
para comprobar el grado de calidad del trabajo.
1
10
Legibilidad
__ __ __ __ __ __ __ __ __ __
Fiabilidad
__ __ __ __ __ __ __ __ __ __
Portabilidad
__ __ __ __ __ __ __ __ __ __
Modificabilidad
__ __ __ __ __ __ __ __ __ __
Eficiencia
__ __ __ __ __ __ __ __ __ __
Auto Descripcin
__ __ __ __ __ __ __ __ __ __
Trivialidad
__ __ __ __ __ __ __ __ __ __
Claridad
__ __ __ __ __ __ __ __ __ __
Coherencia
__ __ __ __ __ __ __ __ __ __
Completo
__ __ __ __ __ __ __ __ __ __
Conciso
__ __ __ __ __ __ __ __ __ __
Facilidad de Aprendizaje
__ __ __ __ __ __ __ __ __ __
Facilidad de Uso
__ __ __ __ __ __ __ __ __ __
Claudio Casares
16
ProInf.net, SCP
www.proinf.net
Generalidad
__ __ __ __ __ __ __ __ __ __
Independencia de Usuario
__ __ __ __ __ __ __ __ __ __
__ __ __ __ __ __ __ __ __ __
Independencia de Instalacin
__ __ __ __ __ __ __ __ __ __
Modularidad
__ __ __ __ __ __ __ __ __ __
Observable
__ __ __ __ __ __ __ __ __ __
Precision
__ __ __ __ __ __ __ __ __ __
Proteccin
__ __ __ __ __ __ __ __ __ __
Trazable
__ __ __ __ __ __ __ __ __ __
Legibilidad
__ __ __ __ __ __ __ __ __ __
TOTAL __ __ __ __ __ __ __ __ __ __
PUNTUACIN FINAL
2.6.
__
El modelo lgico
Anteriormente se expuso el ciclo de vida del desarrollo de una base de datos.
Este captulo se centrar en el diseo del modelo lgico de los datos, por tanto
antes de comenzar esta modelacin es necesario tener documentado las
necesidades, viabilidad y definicin de los requisitos, as como tener elaborado
el modelo global o conceptual del diseo.
El paso del modelo global o conceptual de datos al modelo lgico supone una
abstraccin, un mecanismo para la conversin del mundo real a un mundo
formado por datos, a su agrupacin y clasificacin. El proceso de abstraccin
consiste en identificar los elementos conceptos empleados en el modelo
global y transformarlo en lo que denominamos entidades en el modelo lgico.
La abstraccin se puede realizar de las siguientes formas:
Clasificacin
Consiste en generar una nica entidad conceptos con caractersticas comunes,
todos ellos tendrn las mismas caractersticas y se diferencian unos de otros
por los valores que toman dichas caractersticas. Por ejemplo: los conceptos
cursos de ingls, cursos de espaol y cursos de francs se pueden agrupar en
una nica entidad denominada "CURSOS" que englobe y diferencie cada uno
de los diferentes cursos que se imparten.
Claudio Casares
17
ProInf.net, SCP
www.proinf.net
Agregacin
Consiste en separar cada una de las partes de un concepto para generar
distintas entidades, por ejemplo el concepto coche lo podemos definir
utilizando las entidades rueda, motor y chasis.
Generalizacin
Consiste en ir generado entidades de diferentes niveles de tal forma que cada
entidad de nivel superior agrupe las de nivel inferior.
Asociacin
Consiste en la generalizacin de entidades a partir de entidades ya existentes.
2.7.
Restricciones de integridad
En el mundo real existen ciertas restricciones que deben cumplir los elementos
en l existentes; por ejemplo, una persona slo puede tener un nmero de DNI
y una nica direccin oficial. Cuando se disea una base de datos se debe
reflejar fielmente el universo del discurso que estamos tratando, lo que es los
mismo, reflejar las restricciones existentes en el mundo real.
Los componentes de una restriccin son los siguientes:
Claudio Casares
ProInf.net, SCP
www.proinf.net
18
ProInf.net, SCP
www.proinf.net
19
20
ProInf.net, SCP
www.proinf.net
consistentes en s mismas,
El optimizador puede tomarlas en consideracin,
No suponen carga de programacin, slo de definicin.
i. Condicin General
No se especifica la accin, que es siempre de rechazo (el no
cumplimiento de la condicin lleva consigo el rechazo de la
actualizacin),
Es obligatorio declarar la condicin mediante una
proposicin lgica que permite condiciones de complejidad
arbitraria,
Adems de la condicin, se puede especificar algn otro
componente,
Son ms flexibles que las de condicin especfica,
Es ms difcil optimizar su ejecucin que en el caso de las
de condicin especfica.
I. Verificacin
No tienen existencia en s mismas,
Su definicin forma parte de la definicin del
elemento afectado por la restriccin,
Se aplican a un nico elemento y aunque pueden
afectar a otros, en este caso se complica su
definicin,
Pueden no tener nombre.
II. Asercin
Tienen existencia por s mismas,
Se definen con independencia de cualquier
elemento del esquema,
Pueden afectar a ms de un elemento,
Tienen nombre.
ii. Condicin Especfica
Son opciones proporcionadas por el propio modelo,
No se especifica ninguno de los componentes relativos a
una restriccin (ni la operacin, ni la condicin, ni la
accin),
Son poco flexibles,
El optimizador puede tomarlas en consideracin,
Su ejecucin puede ser ms fcilmente optimizada que las
de condicin general.
Claudio Casares
21
ProInf.net, SCP
www.proinf.net
3. Modelo Relacional
3.1.
Introduccin
Las bases de datos relacionales son el tipo de bases de datos actualmente ms
difundido. Los motivos de este xito son fundamentalmente dos:
1. ofrecen sistemas simples y eficaces para representar y manipular los
datos
2. se basan en un modelo, el relacional, con slidas bases tericas
El modelo relacional fue propuesto originariamente por E.F. Codd en un ya
famoso artculo de 1970. Gracias a su coherencia y facilidad de uso, el modelo
se ha convertido en los aos 80 en el ms usado para la produccin de DBMS.
La estructura fundamental del modelo relacional es precisamente esa,
"relacin", es decir una tabla bidimensional constituida por lneas (tuple) y
columnas (atributos). Las relaciones representan las entidades que se
consideran interesantes en la base de datos. Cada instancia de la entidad
encontrar sitio en una tupla de la relacin, mientras que los atributos de la
relacin representarn las propiedades de la entidad. Por ejemplo, si en la base
de datos se tienen que representar personas, se podr definir una relacin
llamada "Personas", cuyos atributos describen las caractersticas de las
personas (tabla siguiente). Cada tupla de la relacin "Personas" representar
una persona concreta.
Persona
Nombre
Apellido
Nacimiento
Sexo
Estado Civil
Juan
Loza
15/06/1971
H
Soltero
Isabel
Galvez
23/12/1969
M
Casada
Micaela
Ruiz
02/10/1985
M
Soltera
En realidad, siendo rigurosos, una relacin es slo la definicin de la estructura
de la tabla, es decir su nombre y la lista de los atributos que la componen.
Cuando se puebla con las tuplas, se habla de "instancia de relacin". Por eso,
la tabla anterior representa una instancia de la relacin persona. Una
representacin de la definiticn de esa relacin podra ser la siguiente:
Personas (nombre, apellido, fecha_nacimiento, sexo, estado_civil)
A continuacin, se indicarn ambas (relacin e instancia de relacin) con el
trmino "relacin", a no ser que no quede claro por el contexto a qu acepcin
se refiere.
Las tuplas en una relacin son un conjunto en el sentido matemtico del
trmino, es decir una coleccin no ordenada de elementos diferentes. Para
distinguir una tupla de otra, se recurre al concepto de "clave primaria", o sea a
un conjunto de atributos que permiten identificar unvocamente una tupla en
una relacin. Naturalmente, en una relacin puede haber ms combinaciones
Claudio Casares
ProInf.net, SCP
www.proinf.net
22
23
ProInf.net, SCP
www.proinf.net
relacin Hijos. La unin entre las dos relaciones est constituida por los
atributos nmero_persona que aparecen en ambas relaciones y que permiten
que se asigne cada tupla de la relacin hijos a una tupla concreta de la relacin
Personas. Ms formalmente se dice que el atributo nmero_persona de la
relacin Hijos es una clave externa (foreign key) hacia la relacin Personas.
Una clave externa es una combinacin de atributos de una relacin que son, a
su vez, una clave primaria para otra relacin. Una caracterstica fundamental
de los valores presentes en una clave externa es que, a no ser que no sean
null, tienen que corresponder a valores existentes en la clave primaria de la
relacin a la que se refieren. En nuestro ejemplo, esto significa que no puede
existir en la relacin Hijos una tupla con un valor del atributo nmero_persona
sin que tambin en la relacin Personas exista una tupla con el mismo valor
para su llave primaria. Esta propiedad va bajo el nombre de integridad
referencial (referential integrity).
Una de las grandes ventajas del modelo relacional es que define tambin un
lgebra, llamada "lgebra relacional". Todas las manipulaciones posibles sobre
las relaciones se obtienen gracias a la combinacin de tan slo cinco
operadores: RESTRICT, PROJECT, TIMES, UNION y MINUS. Por comodidad, se
han definido tambin tres operadores adicionales que de todos modos se
pueden obtener aplicando los cinco fundamentales: JOIN, INTERSECT y
DIVIDE. Los operadores relacionales reciben como argumento una relacin o
un conjunto de relaciones y restituyen una nica relacin como resultado.
Veamos brevemente estos ocho operadores:
RESTRICT: restituye una relacin que contiene un subconjunto de las tuplas
de la relacin a la que se aplica. Los atributos se quedan como estaban.
PROJECT: restituye una relacin con un subconjunto de los atributos de la
relacin a la que viene aplicado. Las tuplas de la relacin resultado se
componen de las tuplas de la relacion original, de manera que siguen siendo
un conjunto en sentido matemtico.
TIME: se aplica a dos relaciones y efecta el producto cartesiano de las tuplas.
Cada tupla de la primera relacin est concatenada con cada tupla de la
segunda.
JOIN: se concatenan las tuplas de dos relaciones de acuerdo con el valor de
un conjunto de sus atributos.
UNION: aplicando este operador a dos relaciones compatibles, se obtiene una
que contiene las tuplas de ambas relaciones. Dos relaciones son compatibles si
tienen el mismo nmero de atributos y los atributos correspondientes en las
dos relaciones tienen el mismo dominio.
MINUS: aplicado a dos relaciones compatibles restituye una tercera que
contiene las tuplas que se encuentran slo en la primera relacin.
Claudio Casares
24
ProInf.net, SCP
www.proinf.net
apellido
fecha_nacimiento
sexo estado_civil
Mario
Rossi
29/03/1965
Casado
Giuseppe
Russo
15/11/1972
Soltero
Alessandra
Mondella 13/06/1970
Soltera
Hijos
nmero_persona
nombre_apellido
edad
sexo
Maria Rossi
Gianni Rossi
RESTRICT (Personas)
sexo='M'
nmero_persona nombre
apellido
fecha_nacimiento
sexo estado_civil
Mario
Rossi
29/03/1965
Casado
Giuseppe Russo
15/11/1972
Soltero
Las bases de datos relacionales efectan todas las operaciones en las tablas
usando el lgebra relacional, aunque normalmente no le permiten al usuario
usarla. El usuario interacciona con la base de datos a travs de una interfaz
diferente el lenguaje SQL, un lenguaje declarativo que permite escribir
conjuntos de datos. Las instrucciones SQL vienen descompuestas por el motor
de datos en una serie de operaciones relacionales.
3.2.
Proceso de normalizacin
El proceso de normalizacin es un estndar que consiste, bsicamente, en un
proceso de conversin de las relaciones entre las entidades, evitando:
La redundancia de los datos: repeticin de datos en un sistema.
Anomalas de actualizacin: inconsistencias de los datos como resultado
de datos redundantes y actualizaciones parciales.
Claudio Casares
25
ProInf.net, SCP
www.proinf.net
NACION
CODLIBRO
TITULO
EDITOR
Date
USA
999
IBD
AW
Ad.Mig.
ESP
888
CyD
RM
Ma.Piat.
ITA
777
CyD
RM
Date
USA
666
BdD
AW
Asegurando:
26
ProInf.net, SCP
www.proinf.net
Nombre
Cursos
Marcos
Ingls
Lucas
Contabilidad, Informtica
Marta
Ingls, Contabilidad
TABLA B
Nombre
Cdigo
Curso
Marcos
Ingls
Lucas
Contabilidad
Marta
Informtica
Ingls
Informtica
27
ProInf.net, SCP
www.proinf.net
La segunda forma normal compara todos y cada uno de los campos de la tabla
con la clave definida. Si todos los campos dependen directamente de la clave
se dice que la tabla est es segunda forma normal (2NF).
Supongamos que construimos una tabla con los aos que cada empleado ha
estado trabajando en cada departamento de una empresa:
Cdigo Empleado
Cdigo Dpto.
Nombre
Departamento
Aos
Juan
Contabilidad
Pedro
Sistemas
Sonia
I+D
Vernica
Sistemas
10
Pedro
Contabilidad
Tomando como punto de partida que la clave de esta tabla est formada por
los campos cdigo de empleado y cdigo de departamento, podemos decir que
la tabla se encuentra en primera forma normal, por tanto vamos a estudiar la
segunda:
1. El campo nombre no depende funcionalmente de toda la clave, slo
depende del cdigo del empleado.
2. El campo departamento no depende funcionalmente de toda la clave,
slo del cdigo del departamento.
3. El campo aos si que depende funcionalmente de la clave ya que
depende del cdigo del empleado y del cdigo del departamento
(representa el nmero de aos que cada empleado ha trabajado en cada
departamento)
Por tanto, al no depender todos los campos de la totalidad de la clave la tabla
no est en segunda forma normal, la solucin es la siguiente:
Tabla A
Tabla B
Tabla C
Cdigo
Empleado
Nombre
Cdigo
Departamento
Dpto.
Cdigo
Empleado
Cdigo
Departamento
Aos
Juan
I+D
Pedro
Sistemas
Sonia
Contabilidad 3
Vernica
10
Podemos observar que ahora si se encuentras las tres tabla en segunda forma
normal, considerando que la tabla A tiene como ndice el campo Cdigo
Claudio Casares
28
ProInf.net, SCP
www.proinf.net
Nombre
Curso
Aula
Marcos
Informtica
Aula A
Lucas
Ingls
Aula B
Marta
Contabilidad
Aula C
Por esta ltima razn se dice que la tabla no est en 3NF. La solucin sera la
siguiente:
Tabla A
Tabla B
Cdigo Nombre
Curso
Curso
Aula
Marcos
Informtica
Informtica
Aula A
Lucas
Ingls
Ingls
Aula B
Marta
Contabilidad
Contabilidad
Aula C
Color
Tamao
Claudio Casares
29
ProInf.net, SCP
www.proinf.net
Cuadrado
Rojo
Grande
Cuadrado
Azul
Grande
Cuadrado
Azul
Mediano
Crculo
Blanco
Mediano
Crculo
Azul
Pequeo
Crculo
Azul
Mediano
Color
Figura
Tamao
Figura
Color
Cuadrado
Grande
Cuadrado
Rojo
Cuadrado
Pequeo
Cuadrado
Azul
Crculo
Mediano
Crculo
Blanco
Crculo
Pequeo
Crculo
Azul
3.3.
Las interrelaciones
Las interrelaciones son las relaciones que existen entre varias tablas del
sistema (Clientes y Pedidos, por ejemplo). Existen tres formas de
interrelaciones dependiendo de la cardinalidad con la que se combinan los
elementos de ambas tablas.
30
ProInf.net, SCP
www.proinf.net
cliente tiene una nica direccin y una direccin en cada una de las tablas.
Representamos la relacin como A 1: 1 B.
Ante la presencia de este tipo de relacin nos podemos plantear el caso de
unificar todos los datos en nica tabla pues no es necesario mantener ambas
tablas a la misma vez.
Este tipo de relacin se genera cuando aparecen tablas muy grandes, con gran
cantidad de campos, disgregando la tabla principal en dos para evitar tener
una tabla muy grande. Tambin surge cuando los diferentes grupos de usuario
cumplimentan una informacin diferente para un mismo registros; en este caso
se crean tantas tablas como registros, evitando as tener que acceder a
informacin que el usuario del grupo actual no necesita.
Puestos
Cdigo Empleado
Empleado
Cdigo Puesto
Puesto
103
Juan
52
Comercial
Claudio Casares
31
ProInf.net, SCP
www.proinf.net
105
Luisa
73
251
Martn
736
Ana Mara
Administrativo
Tabla Puente
Cdigo
Empleado
Cdigo
Puesto
103
52
103
73
105
73
251
52
736
52
736
73
Ahora existe una relacin 1: n entre Empleados y Tabla Puente y otra relacin
1: n entre Puestos y Tabla Puente ya que un empleado posee varios cdigos de
empleado en la tabla puente pero cada elemento de la tabla puente pertenece
a un nico empleado.
Por otro la un puesto de trabajo posee varios elementos relacionados en la
tabla puente, pero cada elemento de la tabla puente est relacionado con un
nico elemento de la tabla puestos.
Nombre
Supervisor
Claudio Casares
32
ProInf.net, SCP
www.proinf.net
102
Juan
NO
105
Luis
SI
821
Mara
NO
956
Martn
SI
Para solucionar la relacin debemos crear una tabla formada por dos campos.
Ambos campos deben ser el cdigo del empleado pero como no podemos tener
dos campos con el mismo nombre a uno de ellos le llamaremos cdigo
supervisor.
Tabla Puente
Cdigo
Empleado
Cdigo
Supervisor
102
105
105
956
821
105
956
105
ProInf.net, SCP
www.proinf.net
33
3.4.
Algebra relacional
Las operaciones de lgebra relacional manipulan relaciones. Esto significa que
estas operaciones usan uno o dos relaciones existentes para crear una nueva
relacin. Esta nueva relacin puede entonces usarse como entrada para una
nueva operacin. Este poderoso concepto - la creacin de una nueva relacin a
partir de relaciones existentes hace considerablemente ms fcil la solucin de
las consultas, debido a que se puede experimentar con soluciones parciales
hasta encontrar la proposicin con la que se trabajar.
El lgebra relacional consta de nueve operaciones:
1.
2.
3.
4.
5.
6.
7.
8.
9.
Unin
Interseccin
Diferencia
Producto
Seleccin
Proyeccin
Reunin
Divisin
Asignacin
3.4.1. Unin
La operacin de unin permite combinar datos de varias relaciones.
Supongamos que una determinada empresa internacional posee una tabla de
empleados para cada uno de los pases en los que opera. Para conseguir un
listado completo de todos los empleados de la empresa tenemos que realizar
una unin de todas las tablas de empleados de todos los pases.
Claudio Casares
34
ProInf.net, SCP
www.proinf.net
3.4.2. Interseccin
La operacin de interseccin permite identificar filas que son comunes en dos
relaciones. Supongamos que tenemos una tabla de empleados y otra tabla con
los asistentes que han realizado un curso de ingls (los asistentes pueden ser
empleados o gente de la calle). Queremos crear una figura virtual en la tabla
denominada "Empleados que hablan Ingls", esta figura podemos crearla
realizando una interseccin de empleados y curso de ingls, los elementos que
existan en ambas tablas sern aquellos empleados que han asistido al curso.
3.4.3. Diferencia
La operacin diferencia permite identificar filas que estn en una relacin y no
en otra. Tomando como referencia el caso anterior, deberamos aplicar una
diferencia entre la tabla empleados y la tabla asistentes al curso para saber
aquellos asistentes externos a la organizacin que han asistido al curso.
3.4.4. Producto
La operacin producto consiste en la realizacin de un producto cartesiano
entre dos tablas dando como resultado todas las posibles combinaciones entre
los registros de la primera y los registros de la segunda. Esta operacin se
entiende mejor con el siguiente ejemplo:
Tabla A
Tabla B
10
22
33
54
11
25
37
98
42
100
10
22
33
54
10
22
37
98
10
22
42
100
11
25
33
54
11
25
37
98
11
25
42
100
Claudio Casares
ProInf.net, SCP
www.proinf.net
35
3.4.5. Seleccin
La operacin seleccin consiste en recuperar un conjunto de registros de una
tabla o de una relacin indicando las condiciones que deben cumplir los
registros recuperados, de tal forma que los registros devueltos por la seleccin
han de satisfacer todas las condiciones que se hayan establecido. Esta
operacin es la que normalmente se conoce como consulta.
Podemos emplearla para saber que empleados son mayores de 45 aos, o
cuales viven en Madrid, incluso podemos averiguar los que son mayores de 45
aos y residen en Madrid, los que son mayores de 45 aos y no viven en
Madrid, etc..
En este tipo de consulta se emplean los diferentes operadores de comparacin
(=,>, <, >=, <=, <>), los operadores lgicos (and, or, xor) o la negacin
lgica (not).
3.4.6. Proyeccin
Una proyeccin es un caso concreto de la operacin seleccin, esta ltima
devuelve todos los campos de aquellos registros que cumplen la condicin que
he establecido. Una proyeccin es una seleccin en la que seleccionamos
aquellos campos que deseamos recuperar. Tomando como referencia el caso de
la operacin seleccin es posible que lo nico que nos interese recuperar sea el
nmero de la seguridad social, omitiendo as los campos telfono, direccin,
etc.. Este ltimo caso, en el que seleccionamos los campos que deseamos, es
una proyeccin.
3.4.7. Reunin
La reunin se utiliza para recuperar datos a travs de varias tablas conectadas
unas con otras mediante clusulas JOIN, en cualquiera de sus tres variantes
INNER, LEFT, RIGHT. La operacin reunin se puede combinar con las
operaciones seleccin y proyeccin.
Un ejemplo de reunin es conseguir los pedidos que nos han realizado los
clientes nacionales cuyo importe supere 15.000 unidades de producto,
generando un informe con el nombre del cliente y el cdigo del pedido. En este
caso se da por supuesto que la tabla clientes es diferente a la tabla pedidos y
que hay que conectar ambas mediante, en este caso, un INNER JOIN.
3.4.8. Divisin
La operacin divisin es la contraria a la operacin producto y quizs sea la
ms compleja de explicar, por tanto comenzar con directamente con un
ejemplo. Una determinada empresa posee una tabla de comerciales, otra tabla
de productos y otra con las ventas de los comerciales. Queremos averiguar que
comerciales han vendido todo tipo de producto.
Lo primero que hacemos es extraer en una tabla todos los cdigos de todos los
productos, a esta tabla la denominamos A.
Claudio Casares
36
ProInf.net, SCP
www.proinf.net
Tabla A
Cdigo Producto
1035
2241
2249
5818
Cdigo Producto
10
2241
23
2518
23
1035
39
2518
37
2518
10
2249
23
2249
23
2241
3.4.9. Asignacin
Claudio Casares
ProInf.net, SCP
www.proinf.net
37
3.5.
Clculo relacional
El clculo relacional usa un enfoque completamente diferente al lgebra
relacional. No obstante, los dos lenguajes son lgicamente equivalentes. Esto
significa que cualquier consulta que pueda resolverse en un lenguaje puede
resolverse en el otro. La solucin para toda consulta en este tipo de clculo se
define por:
1. Una lista de resultados
2. Una sentencia de cualificacin
La lista de resultados est clara, son aquellos registros que cumplen las
condiciones que deseamos. La sentencia de cualificacin contiene las
condiciones que deseamos que cumplan los registros de la lista de resultados.
La diferencia entre el clculo y el lgebra radica en que el clculo realiza la
operacin en un nico paso, sin necesidad de tener que obtener tablas
intermedias, el lgebra realiza las operaciones paso a paso.
Normalmente el clculo relacional se apoya en algn lenguaje de interrogacin
de bases de datos como puede ser el SQL y que desarrollar ms adelante.
El clculo relacional incluye un concepto nuevo denominado cuantificador, los
cuantificadores tratan de averiguar el nmero de registros afectados por una
determinada operacin, incluso antes de realizarla. Segn su naturaleza los
podemos dividir en dos grupos:
Cuantificadores existenciales
Son aquellos que tratan de averiguar el nmero de registros que devolvera un
tipo de consulta. Por ejemplo: saber el nmero de clientes de Madrid que han
comprado el producto 2015. Si el nmero de registros que satisfacen esta
relacin es mayor que cero, podemos generar la consulta para lanzar
posteriormente un informe, en caso contrario se puede enviar un mensaje al
usuario para que sepa que no hay ningn cliente con estas caractersticas.
Cuantificadores universales
Son aquellos que indican que una condicin se aplica a todas las filas de algn
tipo. Se usa para brindar la misma capacidad que la operacin divisin del
lgebra relacional.
Claudio Casares
ProInf.net, SCP
www.proinf.net
38
Claudio Casares
ProInf.net, SCP
www.proinf.net
39
4. Lenguaje SQL
4.1.
Introduccin
El lenguaje de consulta estructurado (SQL) es un lenguaje de base de datos
normalizado, utilizado por los diferentes motores de bases de datos para
realizar determinadas operaciones sobre los datos o sobre la estructura de los
mismos. Pero como sucede con cualquier sistema de normalizacin hay
excepciones para casi todo; de hecho, cada motor de bases de datos tiene sus
peculiaridades y lo hace diferente de otro motor, por lo tanto, el lenguaje SQL
normalizado (ANSI) no nos servir para resolver todos los problemas, aunque
si se puede asegurar que cualquier sentencia escrita en ANSI ser interpretable
por cualquier motor de datos.
40
ProInf.net, SCP
www.proinf.net
Comandos
Existen dos tipos de comandos SQL:
DLL que permiten crear y definir nuevas bases de datos, campos e
ndices.
DML que permiten generar consultas para ordenar, filtrar y extraer datos
de la base de datos.
Comandos DLL
Comando
Descripcin
CREATE
DROP
ALTER
Comando
Descripcin
SELECT
INSERT
UPDATE
DELETE
Claudio Casares
41
ProInf.net, SCP
www.proinf.net
Clusulas
Las clusulas son condiciones de modificacin utilizadas para definir los datos
que desea seleccionar o manipular.
Clusula
Descripcin
FROM
WHERE
GROUP BY
HAVING
ORDER BY
Operadores Lgicos
Operador
Uso
AND
OR
NOT
Operadores de Comparacin
Operador
Uso
<
Menor que
>
Mayor que
<>
Distinto de
<=
>=
Igual que
BETWEEN
LIKE
IN
42
ProInf.net, SCP
www.proinf.net
Funciones de Agregado
Las funciones de agregado se usan dentro de una clusula SELECT en grupos
de registros para devolver un nico valor que se aplica a un grupo de registros.
Funcin
Descripcin
AVG
COUNT
SUM
MAX
MIN
4.2.
Clusula
Clusula
Clusula
Clusula
Clusula
Clusula
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
Consultas de Seleccin
Las consultas de seleccin se utilizan para indicar al motor de datos que
devuelva informacin de las bases de datos, esta informacin es devuelta en
forma de conjunto de registros que se pueden almacenar en un objeto
recordset. Este conjunto de registros puede ser modificable.
43
ProInf.net, SCP
www.proinf.net
FROM
Clientes
Esta sentencia devuelve un conjunto de resultados con el campo nombre y
telfono de la tabla clientes.
44
ProInf.net, SCP
www.proinf.net
FROM
Clientes
ORDER BY
CodigoPostal DESC, Nombre ASC
Descripcin
ALL
TOP
DISTINCT
DISTINCTOW
ALL
Si no se incluye ninguno de los predicados se asume ALL. El Motor de base de
datos selecciona todos los registros que cumplen las condiciones de la
instruccin SQL y devuelve todos y cada uno de sus campos. No es
conveniente abusar de este predicado ya que obligamos al motor de la base de
datos a analizar la estructura de la tabla para averiguar los campos que
contiene, es mucho ms rpido indicar el listado de campos deseados.
SELECT ALL
FROM
Empleados
SELECT *
FROM
Empleados
Claudio Casares
ProInf.net, SCP
www.proinf.net
45
TOP
Devuelve un cierto nmero de registros que entran entre al principio o al final
de un rango especificado por una clusula ORDER BY. Supongamos que
queremos recuperar los nombres de los 25 primeros estudiantes del curso
1994:
SELECT TOP 25
Nombre, Apellido
FROM
Estudiantes
ORDER BY
Nota DESC
Si no se incluye la clusula ORDER BY, la consulta devolver un conjunto
arbitrario de 25 registros de la tabla de Estudiantes. El predicado TOP no elige
entre valores iguales. En el ejemplo anterior, si la nota media nmero 25 y la
26 son iguales, la consulta devolver 26 registros. Se puede utilizar la palabra
reservada PERCENT para devolver un cierto porcentaje de registros que caen al
principio o al final de un rango especificado por la clusula ORDER BY.
Supongamos que en lugar de los 25 primeros estudiantes deseamos el 10 por
ciento del curso:
SELECT TOP 10 PERCENT
Nombre, Apellido
FROM
Estudiantes
ORDER BY
Nota DESC
El valor que va a continuacin de TOP debe ser un entero sin signo. TOP no
afecta a la posible actualizacin de la consulta.
DISTINCT
Omite los registros que contienen datos duplicados en los campos
seleccionados. Para que los valores de cada campo listado en la instruccin
SELECT se incluyan en la consulta deben ser nicos. Por ejemplo, varios
empleados listados en la tabla Empleados pueden tener el mismo apellido. Si
dos registros contienen Lpez en el campo Apellido, la siguiente instruccin
SQL devuelve un nico registro:
SELECT DISTINCT
Apellido
FROM
Empleados
Con otras palabras el predicado DISTINCT devuelve aquellos registros cuyos
campos indicados en la clusula SELECT posean un contenido diferente. El
resultado de una consulta que utiliza DISTINCT no es actualizable y no refleja
los cambios subsiguientes realizados por otros usuarios.
Claudio Casares
46
ProInf.net, SCP
www.proinf.net
DISTINCTROW
Este predicado no es compatible con ANSI. Que yo sepa a da de hoy slo
funciona con ACCESS.
Devuelve los registros diferentes de una tabla; a diferencia del predicado
anterior que slo se fijaba en el contenido de los campos seleccionados, ste lo
hace en el contenido del registro completo independientemente de los campos
indicados en la clusula SELECT.
SELECT DISTINCTROW
Apellido
FROM Empleados
Si la tabla empleados contiene dos registros: Antonio Lpez y Marta Lpez el
ejemplo del predicado DISTINCT devuelve un nico registro con el valor Lpez
en el campo Apellido ya que busca no duplicados en dicho campo. Este ltimo
ejemplo devuelve dos registros con el valor Lpez en el apellido ya que se
buscan no duplicados en el registro completo.
ALIAS
En determinadas circunstancias es necesario asignar un nombre a alguna
columna determinada de un conjunto devuelto, otras veces por simple capricho
o porque estamos recuperando datos de diferentes tablas y resultan tener un
campo con igual nombre. Para resolver todas ellas tenemos la palabra
reservada AS que se encarga de asignar el nombre que deseamos a la columna
deseada. Tomado como referencia el ejemplo anterior podemos hacer que la
columna devuelta por la consulta, en lugar de llamarse apellido (igual que el
campo devuelto) se llame Empleado. En este caso procederamos de la
siguiente forma:
SELECT
Apellido AS Empleado
FROM Empleados
AS no es una palabra reservada de ANSI, existen diferentes sistemas de
asignar los alias en funcin del motor de bases de datos. En ORACLE para
asignar un alias a un campo hay que hacerlo de la siguiente forma:
SELECT
Apellido AS "Empleado"
FROM Empleados
Tambin podemos asignar alias a las tablas dentro de la consulta de seleccin,
en esta caso hay que tener en cuenta que en todas las referencias que
deseemos hacer a dicha tabla se ha de utilizar el alias en lugar del nombre.
Esta tcnica ser de gran utilidad ms adelante cuando se estudien las
vinculaciones entre tablas. Por ejemplo:
SELECT
Claudio Casares
47
ProInf.net, SCP
www.proinf.net
Apellido
FROM
Empleados AS Trabajadores
Para asignar alias a las tablas en ORACLE y SQL-SERVER los alias se asignan
escribiendo el nombre de la tabla, dejando un espacio en blanco y escribiendo
el Alias (se asignan dentro de la clusula FROM).
SELECT
Trabajadores.Apellido AS Empleado
FROM
Empleados Trabajadores
(1)Esta nomenclatura [Tabla].[Campo] se debe utilizar cuando se est
recuperando un campo cuyo nombre se repite en varias de las tablas que se
utilizan en la sentencia. No obstante cuando en la sentencia se emplean varias
tablas es aconsejable utilizar esta nomenclatura para evitar el trabajo que
supone al motor de datos averiguar en que tabla est cada uno de los campos
indicados en la clusua SELECT.
4.3.
Consultas de Accin
Las consultas de accin son aquellas que no devuelven ningn registro, son las
encargadas de acciones como aadir y borrar y modificar registros. Tanto las
Claudio Casares
48
ProInf.net, SCP
www.proinf.net
4.3.1. DELETE
Crea una consulta de eliminacin que elimina los registros de una o ms de las
tablas listadas en la clusula FROM que satisfagan la clusula WHERE. Esta
consulta elimina los registros completos, no es posible eliminar el contenido de
algn campo en concreto. Su sintaxis es:
DELETE FROM Tabla WHERE criterio
Una vez que se han eliminado los registros utilizando una consulta de borrado,
no puede deshacer la operacin. Si desea saber qu registros se eliminarn,
primero examine los resultados de una consulta de seleccin que utilice el
mismo criterio y despus ejecute la consulta de borrado. Mantenga copias de
seguridad de sus datos en todo momento. Si elimina los registros equivocados
podr recuperarlos desde las copias de seguridad.
DELETE
FROM
Empleados
WHERE
Cargo = 'Vendedor'
Claudio Casares
49
ProInf.net, SCP
www.proinf.net
50
ProInf.net, SCP
www.proinf.net
Ejemplos
INSERT INTO
Clientes
SELECT
ClientesNuevos.*
FROM
ClientesNuevos
SELECT
Empleados.*
INTO Programadores
FROM
Empleados
WHERE
Categoria = 'Programador'
Esta consulta crea una tabla nueva llamada programadores con igual
estructura que la tabla empleado y copia aquellos registros cuyo campo
categoria se programador
INSERT INTO
Empleados (Nombre, Apellido, Cargo)
VALUES ('Luis', 'Snchez', 'Becario' )
INSERT INTO
Empleados
SELECT
Vendedores.*
FROM
Vendedores
WHERE
Provincia = 'Madrid'
4.3.3. UPDATE
Claudio Casares
51
ProInf.net, SCP
www.proinf.net
Crea una consulta de actualizacin que cambia los valores de los campos de
una tabla especificada basndose en un criterio especfico. Su sintaxis es:
UPDATE Tabla SET Campo1=Valor1, Campo2=Valor2, CampoN=ValorN
WHERE Criterio
UPDATE es especialmente til cuando se desea cambiar un gran nmero de
registros o cuando stos se encuentran en mltiples tablas. Puede cambiar
varios campos a la vez. El ejemplo siguiente incrementa los valores Cantidad
pedidos en un 10 por ciento y los valores Transporte en un 3 por ciento para
aquellos que se hayan enviado al Reino Unido.:
UPDATE
Pedidos
SET
Pedido = Pedidos * 1.1,
Transporte = Transporte * 1.03
WHERE
PaisEnvo = 'ES'
UPDATE no genera ningn resultado. Para saber qu registros se van a
cambiar, hay que examinar primero el resultado de una consulta de seleccin
que utilice el mismo criterio y despus ejecutar la consulta de actualizacin.
UPDATE
Empleados
SET
Grado = 5
WHERE
Grado = 2
UPDATE
Productos
SET
Precio = Precio * 1.1
WHERE
Proveedor = 8
AND
Familia = 3
Si en una consulta de actualizacin suprimimos la clusula WHERE todos los
registros de la tabla sealada sern actualizados.
UPDATE
Empleados
SET
Salario = Salario * 1.1
Claudio Casares
52
ProInf.net, SCP
www.proinf.net
4.4.
Son los nombres de las tablas desde las que se combinan los
registros.
campo1,
campo2
comp
Se puede utilizar una operacin INNER JOIN en cualquier clusula FROM. Esto
crea una combinacin por equivalencia, conocida tambin como unin interna.
Las combinaciones equivalentes son las ms comunes; stas combinan los
registros de dos tablas siempre que haya concordancia de valores en un campo
comn a ambas tablas. Se puede utilizar INNER JOIN con las tablas
Departamentos y Empleados para seleccionar todos los empleados de cada
departamento. Por el contrario, para seleccionar todos los departamentos
(incluso si alguno de ellos no tiene ningn empleado asignado) se emplea LEFT
JOIN o todos los empleados (incluso si alguno no est asignado a ningn
departamento), en este caso RIGHT JOIN.
Si se intenta combinar campos que contengan datos Memo u Objeto OLE, se
produce un error. Se pueden combinar dos campos numricos cualesquiera,
incluso si son de diferente tipo de datos. Por ejemplo, puede combinar un
campo Numrico para el que la propiedad Size de su objeto Field est
establecida como Entero, y un campo Contador.
El ejemplo siguiente muestra cmo podra combinar las tablas Categoras y
Productos basndose en el campo IDCategoria:
SELECT
NombreCategoria, NombreProducto
FROM
Categorias
INNER JOIN
Productos
ON
Claudio Casares
53
ProInf.net, SCP
www.proinf.net
Categorias.IDCategoria = Productos.IDCategoria
En el ejemplo anterior, IDCategoria es el campo combinado, pero no est
incluido en la salida de la consulta ya que no est incluido en la instruccin
SELECT. Para incluir el campo combinado, incluir el nombre del campo en la
instruccin SELECT, en este caso, Categorias.IDCategoria.
Tambin se pueden enlazar varias clusulas ON en una instruccin JOIN,
utilizando la sintaxis siguiente:
SELECT campos FROM tabla1 INNER JOIN tabla2
ON (tb1.campo1 comp tb2.campo1 AND ON tb1.campo2 comp tb2.campo2)
OR ON (tb1.campo3 comp tb2.campo3)
Tambin puede anidar instrucciones JOIN utilizando la siguiente sintaxis:
SELECT campos FROM tb1 INNER JOIN (tb2 INNER JOIN [( ]tb3
[INNER JOIN [( ]tablax [INNER JOIN ...)]
ON tb3.campo3 comp tbx.campox)]
ON tb2.campo2 comp tb3.campo3)
ON tb1.campo1 comp tb2.campo2
Un LEFT JOIN o un RIGHT JOIN puede anidarse dentro de un INNER JOIN, pero
un INNER JOIN no puede anidarse dentro de un LEFT JOIN o un RIGHT JOIN.
Ejemplo:
SELECT DISTINCT
Sum(PrecioUnitario * Cantidad) AS Sales,
(Nombre + ' ' + Apellido) AS Name
FROM
Empleados
INNER JOIN(
Pedidos
INNER JOIN
DetallesPedidos
ON
Pedidos.IdPedido = DetallesPedidos.IdPedido)
ON
Empleados.IdEmpleado = Pedidos.IdEmpleado
GROUP BY
Nombre + ' ' + Apellido
(Crea dos combinaciones equivalentes: una entre las tablas Detalles de
pedidos y Pedidos, y la otra entre las tablas Pedidos y Empleados. Esto es
necesario ya que la tabla Empleados no contiene datos de ventas y la tabla
Detalles de pedidos no contiene datos de los empleados. La consulta produce
una lista de empleados y sus ventas totales.)
Claudio Casares
54
ProInf.net, SCP
www.proinf.net
ProInf.net, SCP
www.proinf.net
55
ProInf.net, SCP
www.proinf.net
56
SELECT
t.num_emp, t.nombre, t.puesto, t.num_sup,s.nombre, s.puesto
FROM
empleados AS t, empleados AS s
WHERE
t.num_sup = s.num_emp
57
ProInf.net, SCP
www.proinf.net
B0012
1. Francisco Lpez
B0012
2. Javier Alonso
B0012
3. Marta Rebolledo
C0014
1. Francisco Lpez
C0014
2. Javier Alonso
D0120
2. Javier Alonso
D0120
3. Marta Rebolledo
Autor
Autor
B0012
1. Francisco Lpez
1. Francisco Lpez
B0012
1. Francisco Lpez
2. Javier Alonso
B0012
1. Francisco Lpez
3. Marta Rebolledo
B0012
2. Javier Alonso
2. Javier Alonso
B0012
2. Javier Alonso
1. Francisco Lpez
Claudio Casares
58
ProInf.net, SCP
www.proinf.net
B0012
2. Javier Alonso
3. Marta Rebolledo
B0012
3. Marta Rebolledo
3. Marta Rebolledo
B0012
3. Marta Rebolledo
2. Javier Alonso
B0012
3. Marta Rebolledo
1. Francisco Lpez
C0014
1. Francisco Lpez
1. Francisco Lpez
C0014
1. Francisco Lpez
2. Javier Alonso
C0014
2. Javier Alonso
2. Javier Alonso
C0014
2. Javier Alonso
1. Francisco Lpez
D0120
2. Javier Alonso
2. Javier Alonso
D0120
2. Javier Alonso
3. Marta Rebolledo
D0120
3. Marta Rebolledo
3. Marta Rebolledo
D0120
3. Marta Rebolledo
2. Javier Alonso
Como podemos observar, las parejas de autores se repiten en cada uno de los
libros, podemos omitir estas repeticiones de la siguiente forma:
SELECT
A.Codigo, A.Autor, B.Autor
FROM
Autores A, Autores B
WHERE
A.Codigo = B.Codigo AND A.Autor < B.Autor
El resultado ahora es el siguiente:
Cdigo
Autor
Autor
B0012
1. Francisco Lpez
2. Javier Alonso
B0012
1. Francisco Lpez
3. Marta Rebolledo
C0014
1. Francisco Lpez
2. Javier Alonso
D0120
2. Javier Alonso
3. Marta Rebolledo
59
ProInf.net, SCP
www.proinf.net
FROM
Empleados Hombre, Empleados Mujeres
WHERE
Hombre.Sexo = 'Hombre' AND
Mujeres.Sexo = 'Mujer' AND
Hombres.Id <> Mujeres.Id
Para concluir supongamos la tabla siguiente:
Empleados
Id
Nombre
SuJefe
Marcos
Lucas
Ana
Eva
Juan
Antonio
ProInf.net, SCP
www.proinf.net
60
FROM
Autores FULL Libros
ON
Autores.IdAutor = Libros.IdAutor
4.5.
61
ProInf.net, SCP
www.proinf.net
Proveedores
WHERE
Pais = 'Brasil'
UNION
SELECT NombreCompania, Ciudad
FROM Clientes
WHERE Pais = 'Brasil'
(Recupera los nombres y las ciudades de todos proveedores y clientes de
Brasil)
SELECT
NombreCompania, Ciudad
FROM
Proveedores
WHERE
Pais = 'Brasil'
UNION
SELECT NombreCompania, Ciudad
FROM Clientes
WHERE Pais = 'Brasil'
ORDER BY Ciudad
(Recupera los nombres y las ciudades de todos proveedores y clientes
radicados en Brasil, ordenados por el nombre de la ciudad)
SELECT
NombreCompania, Ciudad
FROM
Proveedores
WHERE
Pais = 'Brasil'
UNION
SELECT NombreCompania, Ciudad
FROM Clientes
WHERE Pais = 'Brasil'
UNION
SELECT Apellidos, Ciudad
FROM Empleados
WHERE Region = 'Amrica del Sur'
(Recupera los nombres y las ciudades de todos los proveedores y clientes de
brasil y los apellidos y las ciudades de todos los empleados de Amrica del Sur)
TABLE
Lista_Clientes
UNION TABLE
ListaProveedores
(Recupera los nombres y cdigos de todos los proveedores y clientes)
Claudio Casares
62
ProInf.net, SCP
www.proinf.net
4.6.
1996
1.250
8.560
4.369
1997
3.000
1.253
2.563
instruccin
select
campo pivot
valor1, valor2
ProInf.net, SCP
www.proinf.net
63
Claudio Casares
64
ProInf.net, SCP
www.proinf.net
(Crea una consulta de tabla de referencias cruzadas que muestra las ventas de
productos por trimestre de cada proveedor en el ao indicado. Los trimestres
aparecen de izquierda a derecha como columnas y los nombres de los
proveedores aparecen de arriba hacia abajo como filas.)
Un caso prctico:
Se trata de resolver el siguiente problema: tenemos una tabla de productos
con dos campos, el cdigo y el nombre del producto, tenemos otra tabla de
pedidos en la que anotamos el cdigo del producto, la fecha del pedido y la
cantidad pedida. Deseamos consultar los totales de producto por ao,
calculando la media anual de ventas.
Estructura y datos de las tablas:
ARTICULOS
PEDIDOS
ID
Nombre
ID
Fecha
Cantidad
Zapatos
11/11/1996
250
Pantalones
11/11/1996
125
Blusas
11/11/1996
520
12/10/1996
50
04/10/1996
250
05/08/1996
100
01/01/1997
40
02/08/1997
60
05/10/1997
70
12/12/1997
15/12/1997
520
17/10/1997
1.250
65
ProInf.net, SCP
www.proinf.net
Pedidos, Artculos
WHERE
Pedidos.Id = Artculos.Id
GROUP BY
Pedidos.Id, Artculos.Nombre
PIVOT
Year(Fecha)
Y obtenemos el siguiente resultado:
Producto
Cdigo
Total
Media
1996
1997
Zapatos
348
87
300
48
Pantalones
955
238,75
375
580
Blusas
1940
485
620
1320
Comentarios a la consulta:
La clusula TRANSFORM indica el valor que deseamos visualizar en las
columnas que realmente pertenecen a la consulta, en este caso 1996 y 1997,
puesto que las dems columnas son opcionales. SELECT especifica el nombre
de las columnas opcionales que deseamos visualizar, en este caso Producto,
Cdigo, Total y Media, indicando el nombre del campo que deseamos mostrar
en cada columna o el valor de la misma. Si incluimos una funcin de clculo el
resultado se har basndose en los datos de la fila actual y no al total de los
datos.
FROM especifica el origen de los datos. La primera tabla que debe figurar es
aquella de donde deseamos extraer los datos, esta tabla debe contener al
menos tres campos, uno para los ttulos de la fila, otros para los ttulos de la
columna y otro para calcular el valor de las celdas.
En este caso en concreto se deseaba visualizar el nombre del producto, como
en la tabla de pedidos slo figuraba el cdigo del mismo se aadi una nueva
columna en la clusula select llamada Producto que se corresponda con el
campo Nombre de la tabla de artculos. Para vincular el cdigo del artculo de
la tabla de pedidos con el nombre del mismo de la tabla artculos se insert la
clusula INNER JOIN.
La clusula GROUP BY especifica el agrupamiento de los registros,
contrariamente a los manuales de instruccin esta clusula no es opcional ya
que debe figurar siempre y debemos agrupar los registros por el campo del
cual extraemos la informacin. En este caso existen dos campos de los que
extraemos la informacin: pedidos.cantidad y artculos.nombre, por ello
agrupamos por los campos.
Para finalizar la clusula PIVOT indica el nombre de las columnas no
opcionales, en este caso 1996 y 1997 y como vamos a el dato que aparecer
Claudio Casares
66
ProInf.net, SCP
www.proinf.net
4.7.
Criterios de Seleccin
En el apartado anterior se vio la forma de recuperar los registros de las tablas,
las formas empleadas devolvan todos los registros de la mencionada tabla. A
lo largo de este apartado se estudiarn las posibilidades de filtrar los registros
con el fin de recuperar solamente aquellos que cumplan unas condiciones
preestablecidas.
Antes de comenzar el desarrollo de este apartado hay que recalcar tres
detalles de vital importancia. El primero de ellos es que cada vez que se desee
establecer una condicin referida a un campo de texto la condicin de
bsqueda debe ir encerrada entre comillas simples; la segunda es que no es
posible establecer condiciones de bsqueda en los campos memo y; la tercera
y ltima hace referencia a las fechas. A da de hoy no he sido capaz de
encontrar una sintaxis que funcione en todos los sistemas, por lo que se hace
necesario particularizarlas segn el banco de datos:
Banco de Datos
Sintaxis
SQL-SERVER
Fecha = #mm-dd-aaaa#
ORACLE
Fecha = to_date('YYYYDDMM','aaaammdd',)
ACCESS
Fecha = #mm-dd-aaaa#
Ejemplo
Banco de Datos
SQL-SERVER
Fecha = #05-18-1969#
Fecha = 19690518
ORACLE
ACCESS
Fecha = #05-18-1969#
Claudio Casares
67
ProInf.net, SCP
www.proinf.net
Referente a los valores lgicos True o False cabe destacar que no son
reconocidos en ORACLE, ni en este sistema de bases de datos ni en SQLSERVER existen los campos de tipo "SI/NO" de ACCESS; en estos sistemas se
utilizan los campos BIT que permiten almacenar valores de 0 1.
Internamente, ACCESS, almacena en estos campos valores de 0 -1, as que
todo se complica bastante, pero aprovechando la coincidencia del 0 para los
valores FALSE, se puede utilizar la sintaxis siguiente que funciona en todos los
casos: si se desea saber si el campo es falso "... CAMPO = 0" y para saber los
verdaderos "CAMPO <> 0".
Operador
<expresin2>
Resultado
Verdad
AND
Falso
Falso
Verdad
AND
Verdad
Verdad
Falso
AND
Verdad
Falso
Falso
AND
Falso
Falso
Verdad
OR
Falso
Verdad
Verdad
OR
Verdad
Verdad
Falso
OR
Verdad
Verdad
Falso
OR
Falso
Falso
Verdad
XOR
Verdad
Falso
Verdad
XOR
Falso
Verdad
Falso
XOR
Verdad
Verdad
Falso
XOR
Falso
Falso
Verdad
Eqv
Verdad
Verdad
Verdad
Eqv
Falso
Falso
Falso
Eqv
Verdad
Falso
Falso
Eqv
Falso
Verdad
Verdad
Imp
Verdad
Verdad
Claudio Casares
68
ProInf.net, SCP
www.proinf.net
Verdad
Imp
Falso
Falso
Verdad
Imp
Null
Null
Falso
Imp
Verdad
Verdad
Falso
Imp
Falso
Verdad
Falso
Imp
Null
Verdad
Null
Imp
Verdad
Verdad
Null
Imp
Falso
Null
Null
Imp
Null
Null
69
ProInf.net, SCP
www.proinf.net
70
ProInf.net, SCP
www.proinf.net
Modelo Planteado
Coincide
No coincide
Varios caracteres
'a*a'
'aBC'
Carcter especial
'a[*]a'
'a*a'
'aaa'
Varios caracteres
'ab*'
'abcdefg', 'abc'
'cab', 'aab'
Un solo carcter
'a?a'
'aBBBa'
Un solo dgito
'a#a'
'aaa', 'a10a'
Rango de caracteres
'[a-z]'
'2', '&'
Fuera de un rango
'[!a-z]'
'b', 'a'
Distinto de un dgito
'[!0-9]'
Combinada
'a[!b-m]#'
'abc', 'aj0'
SQL-SERVER
Ejemplo
Descripcin
LIKE 'A%'
LIKE '_NG'
71
ProInf.net, SCP
www.proinf.net
LIKE '[AF]%'
LIKE '[A-F]%'
LIKE '[A^B]%'
4.7.5. El Operador In
Este operador devuelve aquellos registros cuyo campo indicado coincide con
alguno de los en una lista. Su sintaxis es:
expresin [Not] In(valor1, valor2, . . .)
SELECT *
FROM
Pedidos
WHERE
Provincia In ('Madrid', 'Barcelona', 'Sevilla')
ProInf.net, SCP
www.proinf.net
72
FROM
Pedidos
WHERE
FechaEnvio = #05-30-1994#
SELECT
Apellidos, Nombre
FROM
Empleados
WHERE
Apellidos = 'King'
SELECT
Apellidos, Nombre
FROM
Empleados
WHERE
Apellidos Like 'S*'
SELECT
Apellidos, Salario
FROM
Empleados
WHERE
Salario Between 200 And 300
SELECT
Apellidos, Salario
FROM
Empleados
WHERE
Apellidos Between 'Lon' And 'Tol'
SELECT
IdPedido, FechaPedido
FROM
Pedidos
WHERE
FechaPedido Between #01-01-1994# And #12-31-1994#
SELECT
Apellidos, Nombre, Ciudad
FROM
Empleados
WHERE
Ciudad In ('Sevilla', 'Los Angeles', 'Barcelona')
4.8.
Agrupamiento de Registros
4.8.1. GROUP BY
Combina los registros con valores idnticos, en la lista de campos
especificados, en un nico registro. Para cada registro se crea un valor sumario
si se incluye una funcin SQL agregada, como por ejemplo Sum o Count, en la
instruccin SELECT. Su sintaxis es:
Claudio Casares
ProInf.net, SCP
www.proinf.net
73
SELECT campos FROM tabla WHERE criterio GROUP BY campos del grupo
GROUP BY es opcional. Los valores de resumen se omiten si no existe una
funcin SQL agregada en la instruccin SELECT. 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.
Se utiliza la clusula WHERE para excluir aquellas filas que no desea agrupar, y
la clusula HAVING para filtrar los registros una vez agrupados.
A menos que contenga un dato Memo u Objeto OLE, un campo de la lista de
campos GROUP BY puede referirse a cualquier campo de las tablas que
aparecen en la clusula FROM, incluso si el campo no esta incluido en la
instruccin SELECT, siempre y cuando la instruccin SELECT incluya al menos
una funcin SQL agregada.
Todos los campos de la lista de campos de SELECT deben o bien incluirse en la
clusula GROUP BY o como argumentos de una funcin SQL agregada.
SELECT
IdFamilia, Sum(Stock) AS StockActual
FROM
Productos
GROUP BY
IdFamilia
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.
HAVING es similar a WHERE, determina qu registros se seleccionan. Una vez
que los registros se han agrupado utilizando GROUP BY, HAVING determina
cuales de ellos se van a mostrar.
SELECT
IdFamilia, Sum(Stock) AS StockActual
FROM
Productos
GROUP BY
IdFamilia
HAVING
StockActual > 100
AND
NombreProducto Like BOS*
4.8.2. AVG
Calcula la media aritmtica de un conjunto de valores contenidos en un campo
especificado de una consulta. Su sintaxis es la siguiente
Claudio Casares
ProInf.net, SCP
www.proinf.net
74
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. La media calculada por Avg es la media
aritmtica (la suma de los valores dividido por el nmero de valores). La
funcin Avg no incluye ningn campo Null en el clculo.
SELECT
Avg(Gastos) AS Promedio
FROM
Pedidos
WHERE
Gastos > 100
4.8.3. Count
Calcula el nmero de registros devueltos por una consulta. Su sintaxis es la
siguiente
Count(expr)
En donde expr contiene el nombre del campo que desea contar. Los operandos
de expr pueden incluir el nombre de un campo de una tabla, una constante o
una funcin (la cual puede ser intrnseca o definida por el usuario pero no otras
de las funciones agregadas de SQL). Puede contar cualquier tipo de datos
incluso texto.
Aunque expr puede realizar un clculo sobre un campo, Count simplemente
cuenta el nmero de registros sin tener en cuenta qu valores se almacenan
en los registros. La funcin Count no cuenta los registros que tienen campos
null a menos que expr sea el carcter comodn asterisco (*). Si utiliza un
asterisco, Count calcula el nmero total de registros, incluyendo aquellos que
contienen campos null. Count(*) es considerablemente ms rpida que
Count(Campo). No se debe poner el asterisco entre dobles comillas ('*').
SELECT
Count(*) AS Total
FROM
Pedidos
Si expr identifica a mltiples campos, la funcin Count cuenta un registro slo
si al menos uno de los campos no es Null. Si todos los campos especificados
son Null, no se cuenta el registro. Hay que separar los nombres de los campos
con ampersand (&).
SELECT
Count(FechaEnvo & Transporte) AS Total
FROM
Claudio Casares
ProInf.net, SCP
www.proinf.net
75
Pedidos
Podemos hacer que el gestor cuente los datos diferentes de un determinado
campo
SELECT
Count(DISTINCT Localidad) AS Total
FROM
Pedidos
76
ProInf.net, SCP
www.proinf.net
de una tabla, una constante o una funcin (la cual puede ser intrnseca o
definida por el usuario pero no otras de las funciones agregadas de SQL).
StDevP evala una poblacin, y StDev evala una muestra de la poblacin. Si
la consulta contiene menos de dos registros (o ningn registro para StDevP),
estas funciones devuelven un valor Null (el cual indica que la desviacin
estndar no puede calcularse).
SELECT
StDev(Gastos) AS Desviacin
FROM
Pedidos
WHERE
Pas = 'Espaa'
SELECT
StDevP(Gastos) AS Desviacin
FROM
Pedidos
WHERE
Pas = 'Espaa'
4.8.6. Sum
Devuelve la suma del conjunto de valores contenido en un campo especifico de
una consulta. Su sintaxis es:
Sum(expr)
En donde expr representa el nombre del campo que contiene los datos que
desean sumarse o una expresin que realiza un clculo utilizando los datos de
dichos campos. Los operandos de expr pueden incluir el nombre de un campo
de una tabla, una constante o una funcin (la cual puede ser intrnseca o
definida por el usuario pero no otras de las funciones agregadas de SQL).
SELECT
Sum(PrecioUnidad * Cantidad) AS Total
FROM
DetallePedido
ProInf.net, SCP
www.proinf.net
77
VarP evala una poblacin, y Var evala una muestra de la poblacin. Expr el
nombre del campo que contiene los datos que desean evaluarse o una
expresin que realiza un clculo utilizando los datos de dichos campos. Los
operandos de expr pueden incluir el nombre de un campo de una tabla, una
constante o una funcin (la cual puede ser intrnseca o definida por el usuario
pero no otras de las funciones agregadas de SQL)
Si la consulta contiene menos de dos registros, Var y VarP devuelven Null (esto
indica que la varianza no puede calcularse). Puede utilizar Var y VarP en una
expresin de consulta o en una Instruccin SQL.
SELECT
Var(Gastos) AS Varianza
FROM
Pedidos
WHERE
Pas = 'Espaa'
SELECT
VarP(Gastos) AS Varianza
FROM
Pedidos
WHERE
Pas = 'Espaa'
78
ProInf.net, SCP
www.proinf.net
IdPedido
COMPUTE
Sum((PrecioUnidad * Cantidad - Descuento)) // Calcula el Total
BY IdPedido // Calcula el Subtotal
4.9.
Tipos de Datos
Los tipos de datos SQL se clasifican en 13 tipos de datos primarios y de varios
sinnimos vlidos reconocidos por dichos tipos de datos. Los tipos de datos
primarios son:
Datos
Longitud
Descripcin
BINARY
1 byte
BIT
1 byte
BYTE
1 byte
COUNTER
4 bytes
CURRENCY
8 bytes
DATETIME
8 bytes
4 bytes
DOUBLE
8 bytes
SHORT
2 bytes
LONG
4 bytes
LONGTEXT
1 byte
por
carcter
SINGLE
79
ProInf.net, SCP
www.proinf.net
necesite
TEXT
1 byte
por
carcter
Sinnimos
BINARY
VARBINARY
BIT
BOOLEAN
LOGICAL
LOGICAL1
YESNO
BYTE
INTEGER1
COUNTER
AUTOINCREMENT
CURRENCY
MONEY
DATETIME
DATE
TIME
TIMESTAMP
SINGLE
FLOAT4
IEEESINGLE
REAL
DOUBLE
FLOAT
FLOAT8
IEEEDOUBLE
NUMBER
NUMERIC
SHORT
INTEGER2
SMALLINT
LONG
INT
INTEGER
INTEGER4
LONGBINARY
GENERAL
OLEOBJECT
LONGTEXT
LONGCHAR
MEMO
NOTE
TEXT
ALPHANUMERIC
CHAR - CHARACTER
Claudio Casares
80
ProInf.net, SCP
www.proinf.net
STRING - VARCHAR
VARIANT
(No Admitido)
4.10.
VALUE
Subconsultas
Una subconsulta es una instruccin SELECT anidada dentro de una instruccin
SELECT, SELECT...INTO, INSERT...INTO, DELETE, o UPDATE o dentro de otra
subconsulta. Puede utilizar tres formas de sintaxis para crear una subconsulta:
comparacin [ANY | ALL | SOME] (instruccin sql)
expresin [NOT] IN (instruccin sql)
[NOT] EXISTS (instruccin sql)
En donde:
comparacin
expresin
instruccin
SQL
ProInf.net, SCP
www.proinf.net
81
DetallePedido
WHERE
Descuento = 0 .25
)
El predicado ALL se utiliza para recuperar nicamente aquellos registros de la
consulta principal que satisfacen la comparacin con todos los registros
recuperados en la subconsulta. Si se cambia ANY por ALL en el ejemplo
anterior, la consulta devolver nicamente aquellos productos cuyo precio
unitario sea mayor que el de todos los productos vendidos con un descuento
igual o mayor al 25 por ciento. Esto es mucho ms restrictivo.
El predicado IN se emplea para recuperar nicamente aquellos registros de la
consulta principal para los que algunos registros de la subconsulta contienen
un valor igual. El ejemplo siguiente devuelve todos los productos vendidos con
un descuento igual o mayor al 25 por ciento:
SELECT *
FROM
Productos
WHERE
IDProducto
IN
(
SELECT
IDProducto
FROM
DetallePedido
WHERE
Descuento = 0.25
)
Inversamente se puede utilizar NOT IN para recuperar nicamente aquellos
registros de la consulta principal para los que no hay ningn registro de la
subconsulta que contenga un valor igual.
El predicado EXISTS (con la palabra reservada NOT opcional) se utiliza en
comparaciones de verdad/falso para determinar si la subconsulta devuelve
algn registro. Supongamos que deseamos recuperar todos aquellos clientes
que hayan realizado al menos un pedido:
SELECT
Clientes.Compaa, Clientes.Telfono
FROM
Clientes
WHERE EXISTS (
SELECT
FROM
Pedidos
WHERE
Claudio Casares
ProInf.net, SCP
www.proinf.net
82
Pedidos.IdPedido = Clientes.IdCliente
)
Esta consulta es equivalente a esta otra:
SELECT
Clientes.Compaa, Clientes.Telfono
FROM
Clientes
WHERE
IdClientes
IN
(
SELECT
Pedidos.IdCliente
FROM
Pedidos
)
Se puede utilizar tambin alias del nombre de la tabla en una subconsulta para
referirse a tablas listadas en la clusula FROM fuera de la subconsulta. El
ejemplo siguiente devuelve los nombres de los empleados cuyo salario es igual
o mayor que el salario medio de todos los empleados con el mismo ttulo. A la
tabla Empleados se le ha dado el alias T1:
SELECT
Apellido, Nombre, Titulo, Salario
FROM
Empleados AS T1
WHERE
Salario =
(
SELECT
Avg(Salario)
FROM
Empleados
WHERE
T1.Titulo = Empleados.Titulo
)
ORDER BY Titulo
En el ejemplo anterior, la palabra reservada AS es opcional.
SELECT
Apellidos, Nombre, Cargo, Salario
FROM
Empleados
WHERE
Cargo LIKE 'Agente Ven*'
Claudio Casares
83
ProInf.net, SCP
www.proinf.net
AND
Salario ALL
(
SELECT
Salario
FROM
Empleados
WHERE
Cargo LIKE '*Jefe*'
OR
Cargo LIKE '*Director*'
)
(Obtiene una lista con el nombre, cargo y salario de todos los agentes de
ventas cuyo salario es mayor que el de todos los jefes y directores.)
SELECT DISTINCT
NombreProducto, Precio_Unidad
FROM
Productos
WHERE
PrecioUnidad =
(
SELECT
PrecioUnidad
FROM
Productos
WHERE
NombreProducto = 'Almbar anisado'
)
(Obtiene una lista con el nombre y el precio unitario de todos los productos con
el mismo precio que el almbar anisado.)
SELECT DISTINCT
NombreContacto, NombreCompania, CargoContacto, Telefono
FROM
Clientes
WHERE
IdCliente IN (
SELECT DISTINCT IdCliente
FROM Pedidos
WHERE FechaPedido <#07/01/1993#
)
(Obtiene una lista de las compaas y los contactos de todos los clientes que
han realizado un pedido en el segundo trimestre de 1993.)
SELECT
Nombre, Apellidos
FROM
Empleados AS E
Claudio Casares
ProInf.net, SCP
www.proinf.net
84
WHERE EXISTS
(
SELECT *
FROM
Pedidos AS O
WHERE O.IdEmpleado = E.IdEmpleado
)
(Selecciona el nombre de todos los empleados que han reservado al menos un
pedido.)
SELECT DISTINCT
Pedidos.Id_Producto, Pedidos.Cantidad,
(
SELECT
Productos.Nombre
FROM
Productos
WHERE
Productos.IdProducto = Pedidos.IdProducto
) AS ElProducto
FROM
Pedidos
WHERE
Pedidos.Cantidad = 150
ORDER BY
Pedidos.Id_Producto
(Recupera el Cdigo del Producto y la Cantidad pedida de la tabla pedidos,
extrayendo el nombre del producto de la tabla de productos.)
SELECT
NumVuelo, Plazas
FROM
Vuelos
WHERE
Origen = 'Madrid'
AND Exists (
SELECT T1.NumVuelo FROM Vuelos AS T1
WHERE T1.PlazasLibres > 0 AND T1.NumVuelo=Vuelos.NumVuelo
)
(Recupera nmeros de vuelo y capacidades de aquellos vuelos con destino
Madrid y plazas libres
Supongamos ahora que tenemos una tabla con los identificadores de todos
nuestros productos y el stock de cada uno de ellos. En otra tabla se encuentran
todos los pedidos que tenemos pendientes de servir. Se trata de averiguar que
productos no se podemos servir por falta de stock.
SELECT
PedidosPendientes.Nombre
Claudio Casares
85
ProInf.net, SCP
www.proinf.net
FROM
PedidosPendientes
GROUP BY
PedidosPendientes.Nombre
HAVING
SUM (PedidosPendientes.Cantidad <
(
SELECT
Productos.Stock
FROM
Productos
WHERE
Productos.IdProducto = PedidosPendientes.IdProducto
)
)
Supongamos que en nuestra tabla de empleados deseamos buscar todas las
mujeres cuya edad sea mayor a la de cualquier hombre:
SELECT
Empleados.Nombre
FROM
Empleados
WHERE
Sexo = 'M' AND Edad > ANY (
SELECT Empleados.Edad FROM Empleados WHERE Sexo ='H'
)
lo que sera lo mismo:
SELECT
Empleados.Nombre
FROM
Empleados
WHERE
Sexo = 'M' AND Edad >
(SELECT Max( Empleados.Edad )FROM Empleados WHERE Sexo ='H')
La siguiente tabla muestra algn ejemplo del operador ANY y ALL
Valor 1
Operador
Valor 2
Resultado
> ANY
(2,5,7)
Cierto
= ANY
(2,5,7)
Falso
= ANY
(2,3,5,7)
Cierto
> ALL
(2,5,7)
Falso
< ALL
(5,6,7)
Falso
Claudio Casares
86
ProInf.net, SCP
www.proinf.net
4.11.
tabla
campo1
campo2
tipo
tamao
ndice1
ndice2
ndice
multicampos
CREATE TABLE
Empleados (
Nombre TEXT (25),
Apellidos TEXT (50)
)
(Crea una nueva tabla llamada Empleados con dos campos, uno llamado
Nombre de tipo texto y longitud 25 y otro llamado apellidos con longitud 50).
CREATE TABLE
Claudio Casares
87
ProInf.net, SCP
www.proinf.net
Empleados (
Nombre TEXT (10),
Apellidos TEXT,
FechaNacimiento DATETIME
)
CONSTRAINT
IndiceGeneral
UNIQUE (
Nombre, Apellidos, FechaNacimiento
)
(Crea una nueva tabla llamada Empleados con un campo Nombre de tipo texto
y longitud 10, otro con llamado Apellidos de tipo texto y longitud
predeterminada (50) y uno ms llamado FechaNacimiento de tipo Fecha/Hora.
Tambin crea un ndice nico - no permite valores repetidos - formado por los
tres campos.)
CREATE TABLE
Empleados (
IdEmpleado INTEGER CONSTRAINT IndicePrimario PRIMARY,
Nombre TEXT,
Apellidos TEXT,
FechaNacimiento DATETIME
)
(Crea una tabla llamada Empleados con un campo Texto de longitud
predeterminada (50) llamado Nombre y otro igual llamado Apellidos, crea otro
campo llamado FechaNacimiento de tipo Fecha/Hora y el campo IdEmpleado de
tipo entero el que establece como clave principal.)
88
ProInf.net, SCP
www.proinf.net
nombre
primarioN
nicoN
refN
tabla
externa
campos
externos
Descripcin
UNIQUE
PRIMARY
KEY
89
ProInf.net, SCP
www.proinf.net
tabla
campo
ASC|DESC
UNIQUE
DISALLOW
NULL
IGNORE
NULL
PRIMARY
90
ProInf.net, SCP
www.proinf.net
MiIndice
ON
Empleados (IdEmpleado)
WITH DISALLOW NULL
(Crea un ndice en la tabla Empleados utilizando el campo IdEmpleado,
obligando que el campo IdEmpleado no contenga valores nulos ni repetidos.)
campo
tipo
tamao
ndice
ndice
multicampo
Operacin
Descripcin
ADD
COLUMN
ADD
DROP
COLUMN
DROP
Claudio Casares
ProInf.net, SCP
www.proinf.net
91
ALTER TABLE
Empleados
ADD COLUMN
Salario CURRENCY
(Agrega un campo Salario de tipo Moneda a la tabla Empleados.)
ALTER TABLE
Empleados
DROP COLUMN
Salario
(Elimina el campo Salario de la tabla Empleados.)
ALTER TABLE
Pedidos
ADD CONSTRAINT
RelacionPedidos
FOREIGN KEY
(IdEmpleado)
REFERENCES
Empleados (IdEmpleado)
(Agrega un ndice externo a la tabla Pedidos. El ndice externo se basa en el
campo IdEmpleado y se refiere al campo IdEmpleado de la tabla Empleados.
En este ejemplo no es necesario indicar el campo junto al nombre de la tabla
en la clusula REFERENCES, pues ID_Empleado es la clave principal de la tabla
Empleados.)
ALTER TABLE
Pedidos
DROP CONSTRAINT
RelacionPedidos
(Elimina el ndice de la tabla Pedidos.)
4.12.
92
ProInf.net, SCP
www.proinf.net
FROM
Empleados
WHERE
Empleados.Nombre
In (
SELECT Nombre FROM Empleados As Tmp GROUP BY Nombre HAVING
Count(*) > 1)
ORDER BY
Empleados.Nombre
4.13.
4.14.
Cursores
En algunos SGDB es posible la abertura de cursores de datos desde el propio
entorno de trabajo, para ello se utilizan, normalmente procedimientos
almacenados. La sintaxis para definir un cursor es la siguiente:
DECLARE
nombre-cursor
FOR
especificacion-consulta
[ORDER BY]
Por ejemplo:
DECLARE
Mi_Cursor
FOR
SELECT num_emp, nombre, puesto, salario
FROM empleados
WHERE num_dept = 'informatica'
Claudio Casares
93
ProInf.net, SCP
www.proinf.net
ProInf.net, SCP
www.proinf.net
94
95
ProInf.net, SCP
www.proinf.net
96
ProInf.net, SCP
www.proinf.net
BEGIN
PRINT "Author: " + @au_fname + " " + @au_lname
FETCH NEXT FROM authors_cursor
INTO @au_lname, @au_fname
END
CLOSE authors_cursor
DEALLOCATE authors_cursor
4.15.
El predicado CONTAINS
Se utiliza este predicado para buscar un texto especfico en una tabla. Su
funcionamiento es similar al predicado LIKE, a diferencia que ste no puede
realizar bsquedas en los campos grandes de texto. CONTAINS no diferencia
entre maysculas y minsculas.
Sintaxis:
SELECT <Campos> FROM <Tabla>
WHERE CONTAINS(<Campo>,<Cadena>) OR/AND
CONTAINS(<Campo>,<Cadena>)
El predicado CONTAINS soporta sintaxis complejas para buscar:
97
ProInf.net, SCP
www.proinf.net
98
ProInf.net, SCP
www.proinf.net
El predicado FREETEXT
Al utilizar este predicado se analizan todas las palabras de las frases y nos
devuelve como resultado, aquellos registros que contiene la frase completa o
algn fragmento de la misma. La sintaxis es igual que el predicado CONTAINS.
... FREETEXT(descripcion, "En un lugar de la mancha de cuyo nombre no
quiero acordarme" )
El predicado CONTAINSTABLE
Este predicado tiene igual funcionamiento y sintaxis que CONTAINS a
diferencia que en este caso devuelve una tabla con dos columnas, la primera
llamada [KEY] contiene el valor de la clave primaria de la tabla que la que
buscamos, la segunda llamada RANK devuelve un valor indicando el porcentaje
de acierto en la bsqueda para cada registro.
SELECT Preguntas.Pregunta, Preguntas.Respuesta, Resultado.RANK
FROM Preguntas, CONTAINSTABLE(Respuesta, " SQL Server") AS Resultado
WHERE Preguntas.IdPregunta = Resultado.[KEY]
ORDER BY Resultado.RANK Desc
SELECT Preguntas.Pregunta, Preguntas.Respuesta, Resultado.RANK
FROM Preguntas INNER JOIN CONTAINSTABLE (Respuesta, "SQL Server") AS
Resultado
ON Preguntas.IdPregunta = Resultados.KEY
El predicado FREETEXTTABLE
Es el equivalente a CONTAINSTABLE pero realizando bsquedas de FREETEXT.
99
ProInf.net, SCP
www.proinf.net
Escritor
Ttulo
A025
Asimov
A027
Asimov
Fundacin e imperio
C011
Clarke
El fin de la infancia
V109
Verne
La isla misteriosa
Suponga que desea usar una consulta de recuperacin de texto para buscar los
ttulos de los libros que incluyen la palabra Fundacin. En este caso, del ndice
de texto se obtienen los valores A025 y A027. SQL Server usa, a continuacin,
estas claves y el resto de la informacin de los campos para responder a la
consulta.
100
ProInf.net, SCP
www.proinf.net
CONTAINS
FREETEXT
CONTAINSTABLE
FREETEXTTABLE
101
ProInf.net, SCP
www.proinf.net
ProInf.net, SCP
www.proinf.net
102
Sintaxis
CONTAINSTABLE (tabla, {columna | *}, '<condicinBsquedaContenido>')
<condicinBsqueda> ::=
{
| <trminoGeneracin>
| <trminoPrefijo>
| <trminoProximidad>
| <trminoSimple>
| <trminoPeso>
}
| { (<condicinBsqueda>)
{AND | AND NOT | OR} <condicinBsqueda> [...n]
}
<trminoPeso> ::=
ISABOUT
({{
<trminoGeneracin>)
| <trminoPrefijo>)
| <trminoProximidad>)
| <trminoSimple>)
}
[WEIGHT (valorPeso)]
} [,...n]
)
<trminoGeneracin> ::=
FORMSOF (INFLECTIONAL, <trminoSimple> [,...n] )
<trminoPrefijo> ::=
{ "palabra * " | "frase * " }
<trminoProximidad> ::=
{<trminoSimple> | <trminoPrefijo>}
{ {NEAR | ~} {<trminoSimple> | <trminoPrefijo>} } [n]
<trminoSimple> ::=
palabra | " frase "
Argumentos
Argumento
tabla
Descripcin
Es el nombre de la tabla que ha sido registrada para
bsquedas de texto. tabla puede ser el nombre de un
Claudio Casares
ProInf.net, SCP
www.proinf.net
103
objeto de una base de datos de una sola parte o el
nombre de un objeto de una base de datos con varias
partes. Para obtener ms informacin, consulte
Convenciones de sintaxis de Transact-SQL.
columna
frase
<trminoPeso>
ISABOUT
WEIGHT (valorPeso)
104
ProInf.net, SCP
www.proinf.net
<trminoPrefijo>
ProInf.net, SCP
www.proinf.net
<trminoSimple>
105
Esto significa que la palabra o frase a tiene que estar
cerca de la palabra o frase b, que, a su vez, tiene que
estar cerca de la palabra o frase c.
Microsoft SQL Server mide la distancia entre la
palabra o frase izquierda y derecha. Un valor de
distancia bajo (por ejemplo, 0) indica una distancia
grande entre las dos. Si las palabras o frases
especificadas estn lejos unas de las otras, satisfacen la
condicin de la consulta; sin embargo, la consulta tiene
un valor de distancia muy bajo (0). Sin embargo, si
<condicinBsqueda> slo consta de uno o varios
trminos de proximidad NEAR, SQL Server no devuelve
filas con un valor de distancia de 0.
Especifica la coincidencia con una palabra exacta (uno o
varios caracteres sin espacios o signos de puntuacin
en idiomas con caracteres de un solo byte) o una frase
(una o varias palabras consecutivas separadas por
espacios y signos de puntuacin opcionales en idiomas
con caracteres de un solo byte). Ejemplos de trminos
simples vlidos son "blue berry", blueberry y "Microsoft
SQL Server". Las frases tienen que ir entre comillas
dobles (""). Las palabras de una frase tienen que
aparecer en la columna de la base de datos en el
mismo orden que el especificado en
<condicinBsqueda>. La bsqueda de caracteres en la
palabra o la frase distingue entre maysculas y
minsculas. Las palabras de una sola slaba (como un,
y, la) de las columnas de texto indizadas no se
almacenan en los ndices de los textos. Si nicamente
se utiliza una de estas palabras en una bsqueda, SQL
Server devuelve un mensaje de error indicando que en
la consulta slo hay monoslabos. SQL Server incluye
una lista estndar de palabras monoslabas en el
directorio \Mssql7\Ftdata\Sqlserver\Config.
Los signos de puntuacin se omiten. Por lo tanto, el
valor "Dnde est mi equipo? satisface la condicin
CONTAINS(testing, "fallo del equipo") El fallo de la
bsqueda sera grave.".
Es un marcador de posicin que indica que se pueden
especificar varias condiciones y trminos de bsqueda.
Observaciones
CONTAINS no se reconoce como palabra clave si el nivel de compatibilidad es
menor de 70. Para obtener ms informacin, consulte sp_dbcmptlevel.
La tabla devuelta por la funcion CONTAINSTABLE tiene una columna llamada
KEY que contiene valores de claves de texto. Todas las tablas con textos
Claudio Casares
106
ProInf.net, SCP
www.proinf.net
indizados tienen una columna cuyos valores se garantizan que son nicos y los
valores devueltos en la columna KEY son los valores de claves de textos de las
filas que satisfacen los criterios de seleccin especificados en la condicin de
bsqueda. La propiedad TableFulltextKeyColumn, obtenida mediante la funcin
OBJECTPROPERTY, proporciona la identidad de esta columna de clave nica.
Para obtener las filas de la tabla original que desee, especifique una
combinacin con las filas de CONTAINSTABLE. La forma tpica de la clusula
FROM de una instruccin SELECT que utilice CONTAINSTABLE es:
SELECT select_list
FROM table AS FT_TBL INNER JOIN
CONTAINSTABLE(table, column, contains_search_condition) AS KEY_TBL
ON FT_TBL.unique_key_column = KEY_TBL.[KEY]
La tabla que produce CONTAINSTABLE incluye una columna llamada RANK. La
columna RANK es un valor (entre 0 y 1000) que para cada fila indica lo bien
que cada una de ellas satisface los criterios de seleccin. Este valor de
distancia se suele utilizar en las instrucciones SELECT de una de estas
maneras:
Ejemplos
A. Devolver valores de distancia mediante CONTAINSTABLE
Este ejemplo busca todos los nombres de productos que contengan las
palabras "breads", "fish" o "beers", y los distintos pesos asignados a cada
palabra. Por cada fila devuelta que cumpla los criterios de la bsqueda, se
muestra la precisin relativa (valor de distancia) de la coincidencia. Adems,
las filas de mayor valor de distancia se devuelven primero.
USE Northwind
GO
SELECT FT_TBL.CategoryName, FT_TBL.Description, KEY_TBL.RANK
FROM Categories AS FT_TBL INNER JOIN
CONTAINSTABLE(Categories, Description,
'ISABOUT (breads weight (.8),
fish weight (.4), beers weight (.2) )' ) AS KEY_TBL
ON FT_TBL.CategoryID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC
Claudio Casares
ProInf.net, SCP
www.proinf.net
107
GO
B. Devolver valores de distancia mayores que uno especificado mediante
CONTAINSTABLE
Este ejemplo devuelve la descripcin y el nombre de la categora de todas las
categoras de alimentos en las que la columna Description contenga las
palabras "sweet" y "savory" cerca de la palabra "sauces" o de la palabra
"candies". Todas las filas cuya categora sea "Seafood" no se devuelven. Slo
se devuelven las filas cuyo grado de coincidencia sea igual o superior a 2.
USE Northwind
GO
SELECT FT_TBL.Description,
FT_TBL.CategoryName,
KEY_TBL.RANK
FROM Categories AS FT_TBL INNER JOIN
CONTAINSTABLE (Categories, Description,
'("sweet and savory" NEAR sauces) OR
("sweet and savory" NEAR candies)'
) AS KEY_TBL
ON FT_TBL.CategoryID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
AND FT_TBL.CategoryName <> 'Seafood'
ORDER BY KEY_TBL.RANK DESC
C. Utilizar CONTAINS con <trminoSimple>
Este ejemplo busca todos los productos cuyo precio sea $15,00 que contengan
la palabra "bottles".
USE Northwind
GO
SELECT ProductName
FROM Products
WHERE UnitPrice = 15.00
AND CONTAINS(QuantityPerUnit, 'bottles')
GO
D. Utilizar CONTAINS y una frase en <trminoSimple>
Este ejemplo devuelve todos los productos que contengan la frase "sasquatch
ale" o "steeleye stout".
USE Northwind
GO
SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, ' "Sasquatch ale" OR "steeleye stout" ')
GO
E. Utilizar CONTAINS con <trminoPrefijo>
Claudio Casares
108
ProInf.net, SCP
www.proinf.net
Este ejemplo devuelve todos los nombres de productos que tengan al menos
una palabra que empiece por el prefijo "choc" en la columna ProductName.
USE Northwind
GO
SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, ' "choc*" ')
GO
F. Utilizar CONTAINS y OR con <trminoPrefijo>
Este ejemplo devuelve todas las descripciones de categoras que contengan las
cadenas "sea" o "bread".
USE Northwind
SELECT CategoryName
FROM Categories
WHERE CONTAINS(Description, '"sea*" OR "bread*"')
GO
G. Utilizar CONTAINS con <trminoProximidad>
Este ejemplo devuelve todos los nombres de los productos que tengan la
palabra "Boysenberry" cerca de la palabra "spread".
USE Northwind
GO
SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, 'spread NEAR Boysenberry')
GO
H. Utilizar CONTAINS con <trminoGeneracin>
Este ejemplo busca todos los productos que tengan palabras derivadas de
"dry": "dried", "drying", etc.
USE Northwind
GO
SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, ' FORMSOF (INFLECTIONAL, dry) ')
GO
I. Utilizar CONTAINS con <trminoPeso>
Este ejemplo busca todos los nombres de productos que contengan las
palabras "spread", "sauces" o "relishes", y los distintos pesos asignados a cada
palabra.
USE Northwind
GO
Claudio Casares
109
ProInf.net, SCP
www.proinf.net
4.15.6. FREETEXTTABLE
Devuelve una tabla de cero, una o varias filas cuyas columnas contienen datos
de tipo carcter cuyos valores coinciden con el significado, no literalmente, con
el texto especificado en cadenaTexto. Se puede hacer referencia a
FREETEXTTABLE en las clusula FROM de las instrucciones SELECT como a otro
nombre de tabla normal.
Las consultas que utilizan FREETEXTTABLE especifican consultas de texto que
devuelven el valor de coincidencia (RANK) de cada fila.
Sintaxis
FREETEXTTABLE (tabla, {columna | *}, 'cadenaTexto')
Argumentos
tabla
columna
cadenaTexto
Observaciones
FREETEXTTABLE utiliza las mismas condiciones de bsqueda que el predicado
FREETEXT.Al igual que en CONTAINSTABLE, la tabla devuelta tiene columnas
llamadas KEY y RANK, a las que se hace referencia en la consulta para obtener
las filas apropiadas y utilizar los valores de distancia. FREETEXTTABLE no se
reconoce como palabra clave si el nivel de compatibilidad es menor que 70.
Para obtener ms informacin, consulte sp_dbcmptlevel.
Claudio Casares
ProInf.net, SCP
www.proinf.net
110
Ejemplos
En este ejemplo se devuelve el nombre y la descripcin de todas las categoras
relacionadas con sweet, candy, bread, dry y meat.
USE Northwind
SELECT FT_TBL.CategoryName,
FT_TBL.Description,
KEY_TBL.RANK
FROM Categories AS FT_TBL INNER JOIN
FREETEXTTABLE(Categories, Description,
'sweetest candy bread and dry meat') AS KEY_TBL
ON FT_TBL.CategoryID = KEY_TBL.[KEY]
GO
111
ProInf.net, SCP
www.proinf.net
GO
El predicado CONTAINS usa una notacin funcional en la que el primer
parmetro es el nombre de la columna que se est buscando y el segundo
parmetro es una condicin de bsqueda de texto. La condicin de bsqueda,
en este caso "bean curd", puede ser bastante compleja y est formada por uno
o ms elementos, que se describen posteriormente.
El predicado CONTAINS admite una sintaxis compleja para buscar en las
columnas basadas en caracteres:
112
ProInf.net, SCP
www.proinf.net
Palabras:
Fulton, county, grand, jury, Friday, investigation, Atlanta, recent, primary,
election, produce, evidence, irregularities
Frases:
Fulton county grand jury, primary election, grand jury, Atlanta's recent
primary election
Las palabras y frases de la cadena FREETEXT (y sus variaciones generadas de
forma inflexiva) se combinan internamente en una consulta, ponderada para
clasificarla adecuadamente y, a continuacin, se realiza la bsqueda real.
113
ProInf.net, SCP
www.proinf.net
114
ProInf.net, SCP
www.proinf.net
Claudio Casares
115
ProInf.net, SCP
www.proinf.net
4.15.10.
Las consultas que usan funciones que toman valores de conjuntos de filas son
complicadas porque es necesario saber el nombre de la columna de clave
exclusiva. Cada tabla habilitada para texto tiene la propiedad
TableFulltextKeyColumn que contiene el nmero de ID de la columna que ha
sido seleccionada para tener filas nicas en la tabla. En este ejemplo se
muestra cmo se puede obtener el nombre de la columna de clave y usarse en
la programacin.
USE Northwind
GO
DECLARE @key_column sysname
SET @key_column = Col_Name(Object_Id('Categories'),
ObjectProperty(Object_id('Categories'),
'TableFulltextKeyColumn')
)
print @key_column
EXECUTE ('SELECT Description, KEY_TBL.RANK
FROM Categories FT_TBL
INNER JOIN
FreetextTable (Categories, Description,
''How can I make my own beers and ales?'') AS KEY_TBL
ON FT_TBL.'
+ @key_column
+' = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK >= 10
ORDER BY KEY_TBL.RANK DESC
')
GO
Claudio Casares
116
ProInf.net, SCP
www.proinf.net
Opciona
Descripcin
l
SI
@freetext_search
SI
@from_table
SI
@order_by_list
Opcional
@select_list
SI
Condicin de Bsqueda
ProInf.net, SCP
www.proinf.net
117
118
ProInf.net, SCP
www.proinf.net
4.15.11.
Buscar palabras o frases con valores ponderados
(trmino ponderado)
Puede buscar palabras o frases y especificar un valor ponderado. El peso, un
nmero entre 0,0 y 1,0, indica el grado de importancia de cada palabra o frase
en un conjunto de palabras y frases. El valor 0,0 es el peso ms pequeo
disponible, y el valor 1,0 es el peso ms grande. Por ejemplo, en esta consulta
se buscan todas las direcciones de los clientes, con valores ponderados, en los
que cualquier texto que comience con la cadena "des" est cerca de Rue o
Bouchers. Microsoft SQL SERVER da una clasificacin superior a aquellas
filas que contienen la mayor cantidad de palabras especificadas. Por tanto, SQL
SERVER da una clasificacin superior a una fila que contiene des Rue Bouchers
que a una fila que contiene des Rue.
USE Northwind
GO
SELECT CompanyName, ContactName, Address
FROM Customers
WHERE CONTAINS(Address, 'ISABOUT ("*des*",
Rue WEIGHT(0.5),
Bouchers WEIGHT(0.9)
)')
GO
Un trmino ponderado se puede usar en conjuncin con cualquiera de los otros
cuatro tipos de trminos.
Claudio Casares
ProInf.net, SCP
www.proinf.net
119
4.15.12.
Combinar predicados de texto con otros predicados de
TRANSACT-SQL
Los predicados CONTAINS y FREETEXT se pueden combinar con el resto de
predicados de TRANSACT-SQL, como, por ejemplo, LIKE y BETWEEN; tambin
se pueden usar en una subconsulta. En este ejemplo se buscan descripciones
cuya categora no sea Seafood y que contengan la palabra "sauces" y la
palabra "seasonings".
USE Northwind
GO
SELECT Description
FROM Categories
WHERE CategoryName <> 'Seafood' AND
CONTAINS(Description, ' sauces AND seasonings ')
GO
En la siguiente consulta se usa CONTAINS dentro de una subconsulta. Con la
base de datos pubs, la consulta obtiene el valor del ttulo de todos los libros de
la tabla titles del publicador que se encuentra prximo al platillo volante de
Moonbeam, Ontario. (Esta informacin acerca del publicador se encuentra en la
columna pr_info de la tabla pub_info y slo hay uno de estos publicadores.)
USE pubs
GO
-- Add some interesting rows to some tables.
INSERT INTO publishers
VALUES ('9970', 'Penumbra Press', 'Moonbeam', 'ON', 'Canada')
INSERT INTO pub_info (pub_id, pr_info)
VALUES ('9970',
'Penumbra press is located in the small village of Moonbeam. Moonbeam is well
known as the flying saucer capital of Ontario. You will often find one or more
flying saucers docked close to the tourist information centre on the north side
of highway 11.')
INSERT INTO titles
VALUES ('FP0001', 'Games of the World', 'crafts', '9970', 9.85,
0.00, 20, 213, 'A crafts book! A sports book! A history book! The fun and
excitement of a world at play beautifully described and lavishly illustrated', '1977/09/15')
GO
-- Given the full-text catalog for these tables is pubs_ft_ctlg,
-- repopulate it so new rows are included in the full-text indexes.
sp_fulltext_catalog 'pubs_ft_ctlg', 'start_full'
WAITFOR DELAY '00:00:30' -- Wait 30 seconds for population.
GO
-- Issue the query.
SELECT T.title, P.pub_name
Claudio Casares
120
ProInf.net, SCP
www.proinf.net
FROM publishers P,
titles T
WHERE P.pub_id = T.pub_id
AND P.pub_id = (SELECT pub_id
FROM pub_info
WHERE CONTAINS (pr_info,
' moonbeam AND
ontario AND
"flying saucer" '))
GO
4.15.13.
Utilizar predicados de texto para consultar columnas de
tipo IMAGE
Los predicados CONTAINS y FREETEXT pueden utilizarse para buscar columnas
IMAGE indizadas.
En una sola columna IMAGE es posible almacenar muchos tipos de
documentos. Microsoft SQL SERVER admite ciertos tipos de documento y
proporciona filtros para los mismos. Esta versin proporciona filtros para
documentos de Office, archivos de texto y archivos HTML.
Cuando una columna IMAGE participa en un ndice de texto, el servicio de
texto comprueba las extensiones de los documentos de la columna IMAGE y
aplica el filtro correspondiente, para interpretar los datos binarios y extraer la
informacin de texto necesaria para la indizacin y la consulta.
As, cuando configure la indizacin de texto sobre una columna IMAGE de una
tabla, deber crear una columna separada para que contenga la informacin
relativa al documento. Esta columna de tipo debe ser de cualquier tipo de
datos basado en caracteres y contendr la extensin del archivo, como por
ejemplo DOC para los documentos de Microsoft Word. Si el tipo de columna es
NULL, el servicio de texto asumir que el documento es un archivo de texto.
Una vez indizada, podr consultar la columna IMAGE como lo hara con
cualquier otra columna de la tabla, mediante los predicados CONTAINS y
FREETEXT.
Claudio Casares
ProInf.net, SCP
www.proinf.net
4.16.
121
122
ProInf.net, SCP
www.proinf.net
4.17.
Access: Parmetros
Las consultas con parmetros son aquellas cuyas condiciones de bsqueda se
definen mediante parmetros. Si se ejecutan directamente desde la base de
datos donde han sido definidas aparecer un mensaje solicitando el valor de
cada uno de los parmetros. Si deseamos ejecutarlas desde una aplicacin hay
que asignar primero el valor de los parmetros y despus ejecutarlas. Su
sintaxis es la siguiente:
PARAMETERS nombre1 tipo1, nombre2 tipo2, ... , nombreN tipoN Consulta
En donde:
nombre
tipo
consulta
4.18.
123
ProInf.net, SCP
www.proinf.net
4.19.
Parmetro
tipo
ConsultaSQL
PROCEDURE
ListaCategorias;
SELECT DISTINCTROW
NombreCategoria, IdCategoria
FROM
Categorias
ORDER BY
NombreCategoria
(Asigna el nombre Lista_de_categoras a la consulta y la ejecuta.)
PROCEDURE
Resumen
FechaInicio DATETIME,
FechaFinal DATETIME;
SELECT DISTINCTROW
Claudio Casares
ProInf.net, SCP
www.proinf.net
124
4.20.
Optimizar Sentencias
Introduccin
El lenguaje SQL es no procedimental, es decir, en las sentencias se indica que
queremos conseguir y no como lo tiene que hacer el interprete para
conseguirlo. Esto es pura teora, pues en la prctica a todos los gestores de
SQL hay que especificar sus propios truquitos para optimizar el rendimiento.
Por tanto, muchas veces no basta con especificar una sentencia SQL correcta,
sino que adems, hay que indicarle como tiene que hacerlo si queremos que el
tiempo de respuesta sea el mnimo. En este apartado veremos como mejorar el
tiempo de respuesta de nuestro interprete ante unas determinadas
situaciones:
Normaliza las tablas, al menos hasta la tercera forma normal, para asegurar
que no hay duplicidad de datos y se aprovecha al mximo el
almacenamiento en las tablas. Si hay que desnormalizar alguna tabla
piensa en la ocupacin y en el rendimiento antes de proceder.
Los primeros campos de cada tabla deben ser aquellos campos requeridos y
dentro de los requeridos primero se definen los de longitud fija y despus
los de longitud variable.
Ajusta al mximo el tamao de los campos para no desperdiciar espacio.
Es muy habitual dejar un campo de texto para observaciones en las tablas.
Si este campo se va a utilizar con poca frecuencia o si se ha definido con
gran tamao, por si acaso, es mejor crear una nueva tabla que contenga la
clave primaria de la primera y el campo para observaciones.
ProInf.net, SCP
www.proinf.net
125
Campos a Seleccionar
En la medida de lo posible hay que evitar que las sentencias SQL estn
embebidas dentro del cdigo de la aplicacin. Es mucho ms eficaz usar
vistas o procedimientos almacenados por que el gestor los guarda
compilados. Si se trata de una sentencia embebida el gestor debe
compilarla antes de ejecutarla.
Seleccionar exclusivamente aquellos que se necesiten
No utilizar nunca SELECT * por que el gestor debe leer primero la
estructura de la tabla antes de ejecutar la sentencia
Si utilizas varias tablas en la consulta especifica siempre a que tabla
pertenece cada campo, le ahorras al gestor el tiempo de localizar a que
tabla pertenece el campo. En lugar de SELECT Nombre, Factura FROM
Clientes, Facturacion WHERE IdCliente = IdClienteFacturado, usa: SELECT
Clientes.Nombre, Facturacion.Factura WHERE Clientes.IdCliente =
Facturacion.IdClienteFacturado.
Campos de Filtro
Cuando se utilizan varias tablas dentro de la consulta hay que tener cuidado
con el orden empleado en la clausula FROM. Si deseamos saber cuantos
alumnos se matricularon en el ao 1996 y escribimos: FROM Alumnos,
Matriculas WHERE Alumno.IdAlumno = Matriculas.IdAlumno AND
Matriculas.Ao = 1996 el gestor recorrer todos los alumnos para buscar
Claudio Casares
ProInf.net, SCP
www.proinf.net
126
Claudio Casares
127
ProInf.net, SCP
www.proinf.net
5. APNDICES
5.1.
Regla 0
Para que un sistema se denomine sistema de gestin de bases de datos
relacionales, este sistema debe usar (exclusivamente) sus capacidades
relacionales para gestionar la base de datos.
ProInf.net, SCP
www.proinf.net
128
Claudio Casares
ProInf.net, SCP
www.proinf.net
129
ProInf.net, SCP
www.proinf.net
o
o
130
Una BDR tiene integridad de entidad. Es decir, toda tabla debe tener una
clave primaria.
Una BDR tiene integridad referencial. Es decir, toda clave externa no
nula debe existir en la relacin donde es primaria.
Claudio Casares