[go: up one dir, main page]

0% encontró este documento útil (0 votos)
11 vistas21 páginas

Introducción SQL

El documento proporciona una guía detallada sobre el lenguaje de consulta estructurado (SQL), incluyendo sus componentes, comandos, cláusulas, operadores y funciones de agregado. Se abordan diferentes tipos de consultas, como las de selección, actualización y uniones, así como el acceso a bases de datos externas. Además, se explican ejemplos prácticos de combinaciones de tablas y el uso de predicados en consultas SQL.

Cargado por

Carlos Mamani
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
11 vistas21 páginas

Introducción SQL

El documento proporciona una guía detallada sobre el lenguaje de consulta estructurado (SQL), incluyendo sus componentes, comandos, cláusulas, operadores y funciones de agregado. Se abordan diferentes tipos de consultas, como las de selección, actualización y uniones, así como el acceso a bases de datos externas. Además, se explican ejemplos prácticos de combinaciones de tablas y el uso de predicados en consultas SQL.

Cargado por

Carlos Mamani
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 21

1.

Introducción
2. Consultas
de Selección
3. Criterios
de Selección
4. Agrupamiento
de Registros y Funciones Agregadas
5. Consultas
de Actualización
6. Tipos
de Datos
7. SubConsultas
8. Consultas
y Referencias Cruzadas
9. Consultas
de Unión Interna
10. Consultas
de Unión Externas
11. Estructuras
de las Tablas
12. Consultas
con Parámetros
13. Acceso
a las Bases de Datos Externas
14. Omitir los permisos de ejecución
15. La
Cláusula Procedure
16. Anexos

1. Introducción

El
lenguaje de consulta estructurado (SQL)
es un lenguaje de base de datos normalizado, utilizado por el motor de base
de datos de Microsoft Jet. SQL
se utiliza para crear objetos QueryDef, como el argumento de origen del método
OpenRecordSet y como la propiedad RecordSource del control de datos. También
se puede utilizar con el método Execute para crear y manipular directamente
las bases de datos Jet y crear consultas SQL
de paso a través para manipular bases de datos remotas cliente - servidor.

1.1. Componentes del SQL


El
lenguaje SQL está compuesto por comandos, cláusulas, operadores
y funciones de agregado. Estos elementos se combinan en las instrucciones para
crear, actualizar y manipular las bases de datos.

1.2
Comandos

Existen
dos tipos de comandos SQL:

• Los
DLL que permiten crear y definir nuevas bases de datos, campos e índices.
• Los DML que permiten generar consultas para ordenar, filtrar y extraer datos
de la base de datos.

Comandos DLL

Comando Descripción
Utilizado para crear nuevas tablas, campos
CREATE
e índices
DROP Empleado para eliminar tablas e índices
Utilizado para modificar las tablas agregando
ALTER
campos o cambiando la definición de los campos.

Comandos DML

Comando Descripción
Utilizado
SELECT para consultar registros de la base de datos que satisfagan un criterio
determinado
Utilizado
INSERT para cargar lotes de datos en la base de datos en una única
operación.
Utilizado
UPDATE
para modificar los valores de los campos y registros especificados
Utilizado
DELETE
para eliminar registros de una tabla de una base de datos

1.3 Cláusulas

Las cláusulas son condiciones de modificación utilizadas para


definir los datos que desea seleccionar o manipular.
Comando Descripción
Utilizada
FROM
para especificar la tabla de la cual se van a seleccionar los registros
Utilizada
WHERE para especificar las condiciones que deben reunir los registros que
se van a seleccionar
GROUP Utilizada
BY para separar los registros seleccionados en grupos específicos
Utilizada
HAVING
para expresar la condición que debe satisfacer cada grupo
ORDER Utilizada
BY para ordenar los registros seleccionados de acuerdo con un orden específico

1.4 Operadores Lógicos

Operador Uso
Es
AND el “y” lógico. Evalúa dos condiciones y devuelve un
valor de verdad sólo si ambas son ciertas.
Es
OR el “o” lógico. Evalúa dos condiciones y devuelve un
valor de verdad si alguna de las dos es cierta.
Negación
NOT
lógica. Devuelve el valor contrario de la expresión.

1.5
Operadores de Comparación

OperadorUso
Menor
<
que
Mayor
>
que
Distinto
<>
de
Menor
<=
ó Igual que
Mayor
>=
ó Igual que
Utilizado
BETWEEN
para especificar un intervalo de valores.
Utilizado
LIKE
en la comparación de un modelo
Utilizado
In
para especificar registros de una base de datos

1.6 Funciones de Agregado

Las
funciones de agregado se usan dentro de una cláusula SELECT
en grupos de registros para devolver un único valor que se aplica a un
grupo de registros.

Comando Descripción
Utilizada
AVG
para calcular el promedio de los valores de un campo determinado
Utilizada
COUNT
para devolver el número de registros de la selección
Utilizada
SUM
para devolver la suma de todos los valores de un campo determinado
Utilizada
MAX
para devolver el valor más alto de un campo especificado
Utilizada
MIN
para devolver el valor más bajo de un campo especificado

. Consultas de Selección

Las consultas de selección se utilizan para


indicar al motor de datos que devuelva información de las bases de
datos, esta información es devuelta en forma de conjunto de registros
que se pueden almacenar en un objeto recordset. Este conjunto de registros
es modificable.

2.1 Consultas básicas

La sintaxis básica de una consulta


de selección es la siguiente:

SELECT Campos FROM Tabla;

En donde campos es la lista de campos


que se deseen recuperar y tabla es el origen de los mismos, por ejemplo:

SELECT Nombre, Telefono FROM Clientes;

Esta consulta devuelve un recordset con


el campo nombre y teléfono de la tabla clientes.
2.2 Ordenar los registros

Adicionalmente se puede especificar el


orden en que se desean recuperar los registros de las tablas mediante la claúsula
ORDER BY Lista de Campos. En donde Lista de campos representa los campos a ordenar.
Ejemplo:

SELECT CodigoPostal, Nombre, Telefono


FROM Clientes ORDER BY Nombre;

Esta consulta devuelve los campos CodigoPostal,


Nombre, Telefono de la tabla Clientes ordenados por el campo Nombre.

Se pueden ordenar los registros por mas


de un campo, como por ejemplo:

SELECT CodigoPostal, Nombre, Telefono


FROM Clientes ORDER BY
CodigoPostal, Nombre;

Incluso se puede especificar el orden


de los registros: ascendente mediante la claúsula (ASC -se toma este valor por defecto) ó
descendente (DESC)

SELECT CodigoPostal, Nombre, Telefono


FROM Clientes ORDER BY
CodigoPostal DESC , Nombre ASC;

2.3 Consultas con Predicado

El predicado se incluye entre la claúsula


y el primer nombre del campo a recuperar, los posibles predicados son:

Predicado Descripción
Devuelve todos
ALL
los campos de la tabla
Devuelve un determinado número
TOP
de registros de la tabla
Omite los registros cuyos
DISTINCT
campos seleccionados coincidan totalmente
Omite los registros duplicados
DISTINCROW basandose en la totalidad del registro y no sólo en los campos
seleccionados.

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 instrucción SQL. No se 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 más rápido indicar
el listado de campos deseados.

SELECT ALL FROM Empleados;


SELECT * FROM Empleados;

TOP:

Devuelve un cierto número de registros que entran entre al principio


o al final de un rango especificado por una cláusula 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 cláusula ORDER


BY, la consulta devolverá un conjunto arbitrario de 25
registros de la tabla Estudiantes .El predicado TOP no elige entre valores iguales. En el
ejemplo anterior, si la nota media número
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 cláusula 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 continuación


de TOP debe ser un Integer sin signo.TOP no afecta a la posible actualización
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 instrucción 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
López en el campo Apellido, la siguiente instrucción SQL devuelve
un único registro:

SELECT DISTINCT Apellido FROM Empleados;

Con otras palabras el predicado DISTINCT devuelve aquellos registros cuyos campos
indicados en la cláusula 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.

DISTINCTROW:

Devuelve los registros diferentes


de una tabla; a diferencia del predicado anterior que sólo se fijaba
en el contenido de los campos seleccionados, éste lo hace en el contenido
del registro completo independientemente de los campo indicados en la cláusula SELECT.

SELECT DISTINCTROW Apellido FROM Empleados;

Si la tabla empleados contiene dos registros:


Antonio López y Marta López el ejemplo del predicado DISTINCT devuleve un único
registro con el valor López en el campo Apellido
ya que busca no duplicados en dicho campo. Este último ejemplo devuelve
dos registros con el valor López en el apellido ya que se buscan no duplicados
en el registro completo.

2.4 Alias

En determinadas circunstancias es necesario


asignar un nombre a alguna columna determinada de un conjunto devuelto, otras
veces por simple capricho o por otras circunstancias. 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 procederíamos
de la siguiente forma:

SELECT DISTINCTROW Apellido AS Empleado


FROM Empleados;

2.5 Recuperar Información de una


base de Datos Externa
Para concluir este capítulo se
debe hacer referencia a la recuperación de registros de bases de datos
externa. Es ocasiones es necesario la recuperación de información
que se encuentra contenida en una tabla que no se encuentra en la base de datos
que ejecutará la consulta o que en ese momento no se encuentra abierta,
esta situación la podemos salvar con la palabra reservada IN de la siguiente
forma:

SELECT DISTINCTROW Apellido AS Empleado


FROM Empleados
IN 'c:\databases\gestion.mdb';

En donde c:\databases\gestion.mdb es la
base de datos que contiene la tabla Empleados.

http://es.wikipedia.org/wiki/Join

Contenido
[ocultar]

• 1 Tablas de ejemplo
• 2 Combinación interna (INNER JOIN)
o 2.1 De equivalencia (equi-join)
▪ 2.1.1 Natural (Natural join)
o 2.2 Cruzada (Cross join)
• 3 Combinación externa (OUTER JOIN)
o 3.1 de tabla izquierda (LEFT OUTER JOIN)
o 3.2 de tabla derecha (RIGHT OUTER JOIN)
o 3.3 combinación completa (FULL OUTER JOIN)
• 4 Implementación
o 4.1 Algoritmos de combinación
▪ 4.1.1 Bucles anidados
▪ 4.1.2 Combinación por fusión
▪ 4.1.3 Combinación Hash
o 4.2 Optimización de la combinación
▪ 4.2.1 Semi-combinación
• 5 Véase también
• 6 Enlaces externos

Tablas de ejemplo [editar]

Todas las explicaciones que están a continuación utilizan las siguientes dos tablas para
ilustrar el efecto de diferentes clases de uniones JOIN.
Tabla Empleado

Apellido IDDepartamento

Rafferty 31

Jordán 33

Steinberg 33

Róbinson 34

Smith 34

Gaspar 36

Tabla Departamento

NombreDepartamento IDDepartamento

Ventas 31

Ingeniería 33

Producción 34

Marketing 35
La tabla Empleado contiene a los empleados con el número del departamento al que
pertenecen; mientras que la tabla Departamento, contiene el nombre de los departamentos
de la empresa, se puede notar que existe un empleado que tiene asignado un número de
departamento que no se encuentra en la tabla Departamento (Gaspar), igualmente, en la
tabla Departamento existe un departamento al cual no pertenece empleado alguno
(Marketing). Esto servirá para presentar algunos ejemplos más adelante.

Combinación interna (INNER JOIN) [editar]

Con esta operación se calcula el producto cruzado de todos los registros; así cada registro
en la tabla A es combinado con cada registro de la tabla B; pero sólo permanecen aquellos
registros en la tabla combinada que satisfacen las condiciones que se especifiquen. Este es
el tipo de JOIN más utilizado por lo que es considerado el tipo de combinación
predeterminado.

SQL:2003 especifica dos formas diferentes para expresar estas combinaciones. La primera,
conocida como explícita usa la palabra JOIN, mientras que la segunda es implícita y usa ','
para separar las tablas a combinar en la sentencia FROM de la declaración SELECT.
Entonces siempre se genera el producto cruzado del cual se seleccionan las combinaciones
que cumplan lo que indica la sentencia WHERE.

Es necesario tener especial cuidado cuando se combinan columnas con valores nulos
NULL ya que el valor nulo no se combina con otro valor o con otro nulo, excepto cuando
se le agregan predicados tales como IS NULL o IS NOT NULL.

Como ejemplo, la siguiente consulta toma todos los registros de la tabla Empleado y
encuentra todas las combinaciones en la tabla Departamento. La sentencia JOIN compara
los valores en la columna IDDepartamento en ambas tablas. Cuando no existe esta
correspondencia entre algunas combinaciones, éstas no se muestran; es decir que si el
número de departamento de un empleado no coincide con los números de departamento de
la tabla Departamento, no se mostrará el empleado con su respectivo departamento en la
tabla resultante.

Las dos consultas siguientes son similares, y se realizan de manera explicita (A) e implícita
(B).

A. Ejemplo de la sentencia INNER JOIN explícita:

SELECT *
FROM empleado
INNER JOIN departamento
ON empleado.IDdepartamento = departamento.IDdepartamento
B. Ejemplo de la sentencia INNER JOIN implícita:

SELECT *
FROM empleado, departamento
WHERE empleado.IDdepartamento = departamento.IDDepartamento

Resultados:

Empleado.Apel Empleado.IDdeparta departamento.NombreDepart departamento.IDDeparta


lido mento amento mento

Smith 34 Producción 34

Jordán 33 Ingeniería 33

Róbinson 34 Producción 34

Steinberg 33 Ingeniería 33

Rafferty 31 Ventas 31

El empleado Gaspar y el departamento de Marketing no son presentados en los resultados


ya que ninguno de éstos tiene registros correspondientes en la otra tabla. No existe un
departamento con número 36 ni existe un empleado con número de identificación 35.

A la combinación que utiliza comparaciones dentro del predicado JOIN se le llama theta-
join.

C. Ejemplo de combinación tipo theta:

SELECT *
FROM empleado
INNER JOIN departamento
ON empleado.IDDepartamento < departamento.IDDepartamento

Las operaciones INNER JOIN puede ser clasificadas como de equivalencia, naturales, y
cruzadas.
De equivalencia (equi-join) [editar]

Es una especie de theta-join que usa comparaciones de igualdad en el predicado JOIN.


Cuando se usan operadores, tales como < o > no se puede clasificar en este rango.

D. Ejemplo de combinación de equivalencia:

SELECT *
FROM empleado
INNER JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento

La tabla resultante presenta dos columnas llamadas IDDepartamento, una proveniente de la


tabla Empleado y otra de la tabla Departamento.

SQL:2003 no tiene una sintaxis específica para esta clase de combinaciones.

Natural (Natural join) [editar]

Es una especialización de la combinación de equivalencia, anteriormente mencionada. En


este caso se comparan todas las columnas que tengan el mismo nombre en ambas tablas. La
tabla resultante contiene sólo una columna por cada par de columnas con el mismo nombre.

E. Ejemplo de combinación natural:

SELECT *
FROM empleado NATURAL JOIN departamento

El resultado es un poco diferente al del ejemplo D, ya que esta vez la columna


IDDepartamento se muestra sola una vez en la tabla resultante.

Empleado.Apellido IDDepartamento Departamento.NombreDepartamento

Smith 34 Producción

Jordán 33 Ingeniería

Róbinson 34 Producción

Steinberg 33 Ingeniería
Rafferty 31 Ventas

El uso de esta la sentencia NATURAL puede producir resultados ambiguos y generar


problemas si la base de datos cambia, porque al añadir, quitar, o renombrar las columnas,
puede perder el sentido la sentencia; por esta razón es preferible expresar el predicado
usando las otras expresiones nombradas anteriormente (ejemplos A y B).

Cruzada (Cross join) [editar]

Presenta el producto cartesiano de todos los registros de las dos tablas.

El código SQL para realizar este producto cartesiano enuncia las tablas que serán
combinadas, pero no incluye algún predicado que filtre el resultado.

F. Ejemplo de combinación cruzada explícita:

SELECT *
FROM empleado CROSS JOIN departamento

G. Ejemplo de combinación cruzada implícita:

SELECT *
FROM empleado, departamento;

Empleado.Ape Empleado.IDDeparta Departamento.NombreDepart Departamento.IDDeparta


llido mento amento mento

Rafferty 31 Ventas 31

Jordán 33 Ventas 31

Steinberg 33 Ventas 31

Smith 34 Ventas 31

Róbinson 34 Ventas 31
Gaspar 36 Ventas 31

Rafferty 31 Ingeniería 33

Jordán 33 Ingeniería 33

Steinberg 33 Ingeniería 33

Smith 34 Ingeniería 33

Róbinson 34 Ingeniería 33

Gaspar 36 Ingeniería 33

Rafferty 31 Producción 34

Jordán 33 Producción 34

Steinberg 33 Producción 34

Smith 34 Producción 34

Róbinson 34 Producción 34

Gaspar 36 Producción 34

Rafferty 31 Marketing 35
Jordán 33 Marketing 35

Steinberg 33 Marketing 35

Smith 34 Marketing 35

Róbinson 34 Marketing 35

Gaspar 36 Marketing 35

Esta clase de combinaciones son usadas pocas veces, generalmente se les agregan
condiciones de filtrado con la sentencia WHERE para hallar resultados específicos.

Combinación externa (OUTER JOIN) [editar]

Mediante esta operación no se requiere que cada registro en las tablas a tratar tenga un
registro equivalente en la otra tabla. El registro es mantenido en la tabla combinada si no
existe otro registro que le corresponda.

En SQL:2003 no existe una notación implícita para las combinaciones externas.

Este tipo de operación se subdivide dependiendo de la tabla a la cual se le admitirán los


registros que no tienen correspondencia, ya sean de tabla izquierda, de tabla derecha, o
combinación completa.

de tabla izquierda (LEFT OUTER JOIN) [editar]

El resultado de esta operación siempre contiene todos los registros de la tabla de la


izquierda (la primera tabla que se menciona en la consulta), aun cuando no exista un
registro correspondiente en la tabla de la derecha, para uno de la izquierda.

La sentencia LEFT OUTER JOIN retorna la pareja de todos los valores de la tabla izquierda
con los valores de la tabla de la derecha correspondientes, o retorna un valor nulo NULL
en caso de no correspondencia.

A diferencia del resultado presentado en los ejemplos A y B (de combinación interna)


donde no se mostraba el empleado cuyo departamento no existía; en el siguiente ejemplo se
presentarán los empleados con su respectivo departamento, e inclusive se presentará el
empleado, cuyo departamento no existe.

H. Ejemplo de tabla izquierda para la combinación externa:

SELECT distinct *
FROM empleado
LEFT OUTER JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento

Empleado.Ape Empleado.IDDeparta Departamento.NombreDepart Departamento.IDDeparta


llido mento amento mento

Jordán 33 Ingeniería 33

Rafferty 31 Ventas 31

Róbinson 34 Producción 34

Smith 34 Producción 34

Gaspar 36 NULL NULL

Steinberg 33 Ingeniería 33

de tabla derecha (RIGHT OUTER JOIN) [editar]

Esta operación inversa a la anterior; el resultado de esta operación siempre contiene todos
los registros de la tabla de la derecha (la segunda tabla que se menciona en la consulta), aun
cuando no exista un registro correspondiente en la tabla de la izquierda, para uno de la
derecha.

La sentencia RIGHT OUTER JOIN retorna la pareja de todos los valores de la tabla derecha
con los valores de la tabla de la izquierda correspondientes, o retorna un valor nulo NULL
en caso de no correspondencia.

I. Ejemplo de tabla derecha para la combinación externa:


SELECT *
FROM empleado
RIGHT OUTER JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento

Empleado.Ape Empleado.IDDeparta Departamento.NombreDepart Departamento.IDDeparta


llido mento amento mento

Smith 34 Producción 34

Jordán 33 Ingeniería 33

Róbinson 34 Producción 34

Steinberg 33 Ingeniería 33

Rafferty 31 Ventas 31

NULL NULL Marketing 35

En este caso el área de Marketing fue presentada en los resultados, aunque aún no hay
empleados registrados en dicha área.

combinación completa (FULL OUTER JOIN) [editar]

Esta operación presenta los resultados de tabla izquierda y tabla derecha aunque no tengan
correspondencia en la otra tabla. La tabla combinada contendrá, entonces, todos los
registros de ambas tablas y presentará valores nulos NULLs para registros sin pareja.

J. Ejemplo de combinación externa completa:

SELECT *
FROM empleado
FULL OUTER JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento
Empleado.Ape Empleado.IDDeparta Departamento.NombreDepart Departamento.IDDeparta
llido mento amento mento

Smith 34 Producción 34

Jordán 33 Ingeniería 33

Róbinson 34 Producción 34

Gaspar 36 NULL NULL

Steinberg 33 Ingeniería 33

Rafferty 31 Ventas 31

NULL NULL Marketing 35

Como se puede notar, en este caso se encuentra el empleado Gaspar con valor nulo en su
área correspondiente, y se muestra además el departamento de Marketing con valor nulo en
los empleados de esa área.

Algunos sistemas de bases de datos no soportan esta funcionalidad, pero esta puede ser
emulada a través de las combinaciones de tabla izquierda, tabla derecha y de la setencia de
union union.

K. El mismo ejemplo puede expresarse así:

SELECT *
FROM empleado
LEFT JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento
UNION
SELECT *
FROM empleado
RIGHT JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento
WHERE empleado.IDDepartamento IS NULL
Implementación [editar]

La implementación eficiente de combinaciones ha sido un objetivo de mucho trabajo en los


sistemas de bases de datos, pues aunque sean internas o externas, son muy comunes y
difíciles de ejecutar eficientemente. La combinación interna de tablas se puede hacer con
propiedad conmutativa y asociativa, así que el usuario sólo crea la consulta y el sistema de
base de datos determina la manera más eficiente de realizar la operación, esta decision la
toma el optimizador de consultas quien tiene en cuenta dos puntos importantes:

El orden de las combinaciones

Como las combinaciones son conmutativas, el orden en el cual son combinadas las tablas
no modifica el resultado final de la consulta. En cambio, sí tiene un gran impacto sobre el
costo de la operación, de manera que elegir el mejor orden de combinaciones es muy
importante.

El método de la combinación

Dadas dos tablas y una condición de combinación, existen unos cuantos algoritmos que
devuelven el resultado de la combinación. Cuál algoritmo es el más eficiente dependerá
de los tamaños de las tablas de entrada, la cantidad de filas de cada una que satisfacen la
condición de combinación, y las operaciones requeridas por el resto de la consulta.

Los diferentes algoritmos tratan de forma diferente a las entradas. A las entradas de una
combinación se las llama respectivamente "operando externo(outer)" y "operando
interno(inner)", o bien simplemente izquierdo y derecho. En el caso de bucles anidados,
por ejemplo, la relación interna será completamente recorrida por cada fila de la relación
externa.

Los planes de ejecución que incluyen combinaciones pueden clasificarse en:

Profundo a la izquierda

El operando interno de cada combinación del plan es una tabla base.

Profundo a la derecha

El operando externo de cada combinación del plan es una tabla base.

Denso

Ambas entradas son combinaciones.

Estos nombres derivan de la apariencia de la representación gráfica del plan de ejecución


como un árbol, con la relación externa a la izquierda y la interna a la derecha (por
convención).
Algoritmos de combinación [editar]

Existen tres algoritmos fundamentales para ejecutar una operación de combinación.

Bucles anidados [editar]

Éste es el más simple de los algortimos de combinación. Por cada tupla de la relación
externa, se recorre completamente la relación interna, y toda tupla que verifique la
condición de combinación se añade al resultado. El algoritmo puede ser fácilmente
generalizado para cualquier número de relaciones.

Pseudocódigo para la combinación de las relaciones R and S:

Por cada tupla en R, llamada r:


Por cada tupla en S, llamada s:
Si la tupla <r,s> satisface la condición de combinación
Entonces agregar la tupla <r,s> a la salida

La complejidad computacional del algoritmo es de O( | R | | S | ) operaciones de


entrada/salida, donde | R | y | S | son la cantidad de tuplas en R y S respectivamente.

Naturalmente, este algoritmo tiene un desempeño pobre si alguna de las relaciones es muy
grande. El desempeño puede mejorarse si la relación interna tiene un índice sobre las
columnas del predicado de combinación.

Existe una variación del algoritmo de bucles anidados, llamada bucles anidados en bloque.
Sea | R | < | S | . En lugar de leer las dos relaciones tupla por tupla, se lee la relación R en
bloques, llenando toda la memoria disponible, excepto dos páginas. Por cada bloque de R
se realiza una iteración sobre S, leyendo una página por vez, y por cada página leída de S, la
tupla de la página es comparada con las del bloque de R, y cada par de tuplas que satisfacen
la condición de combinación se agrega a la página de salida.

El algortimo de bucles anidados en bloque tiene una complejidad computacional de

operaciones de entrada/salida, donde M es el número de páginas de memoria


disponibles y Pr y Ps son el tamaño en páginas de R y de S respectivamente. Notar que la
complejidad computacional es de O(Pr + Ps) operaciones de entrada/salida si R cabe en la
memoria disponible.

Combinación por fusión [editar]

Si ambas relaciones están ordenadas por los atributos de combinación, la operación es


trivial:

1. Por cada tupla de la relación externa,


1. Se toma el grupo de tuplas actual de la relación interna; un grupo está formado
por un conjunto de tuplas contiguas con el mismo valor en el atributo de
combinación.
2. Por cada tupla del grupo interno actual que satisfaga la condición de combinación,
se agrega una tupla al resultado. Una vez agotado el grupo interno, ambas
búsquedas, la interna y la externa, pueden avanzar al siguiente grupo.

Por esta razón muchos optimizadores guardan pista del ordenamiento en los nodos del plan
(si uno o ambos operandos ya están ordenados en función del atributo de combinación, no
hace falta otro ordenamiento. De lo contrario, el sistema de gestión de base de datos deberá
realizarlo, generalmente utilizando un ordenamiento externo para evitar consumir
demasiada memoria.

Combinación Hash [editar]

Este algoritmo puede ser utilizado para combinaciones "equi-join". El acceso a las tablas a
ser combinadas se realiza construyendo tablas hash sobre los atributos de combinación. La
búsqueda en tabla hash es mucho más rápida que a través de árboles de índice, pero sólo
puede realizarse una búsqueda por la condición de igualdad.

Optimización de la combinación [editar]

Semi-combinación [editar]

Es una optimización técnica para las combinaciones en bases de datos distribuidas. El


predicado JOIN es aplicado en diferentes fases, comenzando con la más temprana. Esto
puede reducir el tamaño de los resultados inmediatos que deben ser intercambiados con
nodos remotos, así reduce el tráfico de red entre nodos, esto puede mejorarse con un filtro
Bloom.

Véase también [editar]

También podría gustarte