You are on page 1of 10

La consulta Select

Utilice la instruccin SELECT para recuperar registros de una base de datos en forma de un conjunto de registros, almacenndolos en un nuevo objeto Recordset. Posteriormente, su aplicacin puede manipular este Recordset presentando, agregando, cambiando o eliminando registros segn sea necesario. Su aplicacin tambin puede presentar y crear informes a partir de los datos. SELECT suele ser la primera palabra de una instruccin SQL. La mayora de las instrucciones SQL son SELECT o SELECT...INTO. Puede utilizar una instruccin SELECT en la propiedad SQL de un objeto QueryDef, en la propiedad RecordSource de un control de datos o como argumento para el mtodo OpenRecordset. Las instrucciones SELECT no modifican los datos de la base de datos; slo los recuperan. La estructura general de la consulta SELECT es la siguiente: SELECT lista_campos FROM nombres_tablas IN nombre_base_datos WHERE condiciones_bsqueda GROUP BY lista_campos HAVING criterios grupo ORDER BY lista_campos WITH OWNERACCESS OPTION Cada una de estas instrucciones y clusulas se describen en las prximas secciones.

La consulta bsica
La consulta SELECT ms simple es: SELECT * FROM nombre_tabla Por ejemplo, la siguiente consulta SELECT devolver todas las columnas de todos los registros de la tabla Empleados: SELECT * FROM Empleados El asterisco indica que se van a recuperar todas las columnas de la tabla o tablas deseadas. Podra especificar slo algunas columnas. Cuando muestre los datos de cada columna, aparecern en el orden que se indica, por lo que puede reordenar las columnas para aumentar su legibilidad: SELECT [Nombre], [Apellidos] FROM Empleados

SQL proporciona varios predicados de palabras clave y clusulas opcionales que le ayudan a depurar an ms la consulta y a ordenar el conjunto de resultados. Los ms tiles se describen en las siguientes secciones.

El predicado DISTINCT
Para omitir registros que contengan datos duplicados en las columnas seleccionadas, utilice la palabra clave DISTINCT. Para que se incluyan en los resultados de la consulta, los valores de cada columna o combinacin de columnas que aparecen en la instruccin SELECT debe ser nicos. Por ejemplo, varios empleados incluidos en una tabla Empleados pueden tener el mismo apellido. Si dos registros contienen Soto en el campo Apellido, la siguiente instruccin SQL devuelve slo uno de ellos: SELECT DISTINCT _ [Apellido] _ FROM Empleados; Si omite DISTINCT, esta consulta devuelve ambos registros Soto. El Recordset resultante de una consulta DISTINCT no es actualizable y no refleja cambios posteriores realizados por otros usuarios.

El predicado TOP
1

Para devolver nicamente un cierto nmero de registros que figuran en la parte superior o inferior de un intervalo especificado por una clusula ORDER BY, utilice el predicado TOP. Suponga que desea obtener los nombres de los 25 mejores estudiantes de la promocin de 1994: SELECT TOP 25 [Nombre], [Apellido] FROM Alumnos _ WHERE [Ao de graduacin] = 1994 _ ORDER BY [Nota media] DESC; Si no incluye la clusula ORDER BY, la consulta devolver un conjunto arbitrario de 25 registros de la tabla Alumnos que satisfacen la clusula WHERE. El predicado TOP no selecciona entre valores iguales. En el ejemplo anterior, si los alumnos nmero 25 y 26 tienen la misma media de puntuacin, la consulta devolver 26 registros. Puede utilizar tambin la palabra clave PERCENT para devolver un porcentaje determinado de registros que figuran en la parte superior o inferior de un intervalo especificado por una clusula ORDER BY. Suponga que, en lugar de los 25 mejores alumnos, desea ver el 10 por ciento de los alumnos de la clase que han obtenido las mejores notas: SELECT TOP 10 PERCENT [Nombre], [Apellido] _ FROM Alumnos _ WHERE [Ao de graduacin] = 1994 _ ORDER BY [Nota media] DESC;

La clusula WHERE
La clusula WHERE especifica qu registros de las tablas indicadas en la clusula FROM se incluyen en los resultados de la instruccin SELECT. El motor de base de datos Microsoft Jet selecciona los registros que cumplen las condiciones enumeradas en la clusula WHERE. Si no especifica una clusula WHERE, la consulta devolver todas las filas de la tabla. Si especifica dos o ms tablas en su consulta y no ha incluido una clusula WHERE o JOIN, la consulta generar un producto cartesiano de las tablas. Nota Aunque una clusula WHERE pueda realizar tareas similares, debe utilizar una clusula JOIN para realizar operaciones de combinacin SQL en mltiples tablas si quiere que el Recordset resultante sea actualizable. WHERE es opcional pero, cuando aparece, lo hace despus de FROM. Por ejemplo, puede seleccionar todos los empleados del departamento de Ventas: WHERE Departamento = 'Ventas' o todos los clientes con edades comprendidas entre 18 y 30 aos: WHERE Edad Between 18 AND 30 WHERE es similar a HAVING. WHERE determina qu registros se seleccionan. Igualmente, una vez que los registros se agrupan con GROUP BY, HAVING determina los registros que se muestran. Utilice la clusula WHERE para eliminar los registros que no desea agrupar con la clusula GROUP BY. Utilice varias expresiones para determinar los registros que devuelven las instrucciones SQL. Por ejemplo, la siguiente instruccin SQL selecciona todos los empleados cuyos salarios superan la cifra de 21000 $: SELECT [Apellido], Salario _ FROM Empleados _ WHERE Salario > 21000; Una clusula WHERE puede contener hasta 40 expresiones vinculadas por operadores lgicos, como AND y OR. Cuando especifica un nombre de campo que contiene un espacio en blanco o un signo de puntuacin, debe incluirlo entre corchetes ([ ]): SELECT [Id. de producto], [Unidades en existencia] FROM Productos _ WHERE [Unidades en existencia] <= [Nivel de nuevo pedido]; 2

Cuando especifique el argumento criterio, los literales de fecha deben estar en formato EE.UU., aunque no est utilizando la versin norteamericana del motor de base de datos Jet. Por ejemplo, 10 de mayo de 1994, se escribe 10/5/94 en el Reino Unido y 5/10/94 en Estados Unidos. Asegrese de incluir los literales de fecha con el signo de nmero (#), como muestran los siguientes ejemplos. Para encontrar los registros con fecha del 10 de mayo de 1994 en una base de datos del Reino Unido, debe utilizar la siguiente instruccin SQL: SELECT * FROM Pedidos _ WHERE [Fecha de envo] = #5/10/94#; Tambin puede utilizar la funcin DateValue, que tiene en cuenta la configuracin internacional establecida por Microsoft Windows. Por ejemplo, el cdigo para Estados Unidos es: SELECT * FROM Pedidos _ WHERE [Fecha de envo] = DateValue('5/10/94'); El cdigo en el Reino Unido es: SELECT * FROM Pedidos _ WHERE [Fecha de envo] = DateValue('10/5/94'); Para obtener ms informacin Para obtener informacin acerca de los aspectos internacionales, vea "Aspectos internacionales" del Manual del programador.

La clusula GROUP BY
GROUP BY es una clusula opcional que combina, en un nico registro, registros con valores idnticos en la lista de campos especificada. Se crea un valor resumen para cada registro al incluir en la instruccin SELECT una funcin agregada de SQL, como Sum o Count. Los valores resumen se omiten si no existen funciones agregadas de SQL en la instruccin SELECT. Los valores NULL en los campos GROUP BY se agrupan y no se omiten. Sin embargo, los valores NULL no se evalan en ninguna funcin agregada de SQL. Utilice la clusula WHERE para excluir filas que no desee agrupar y utilice la clusula HAVING para filtrar registros una vez que se hayan agrupado. A menos que contenga datos Memo o de objetos de Automatizacin, un campo de la lista de campos GROUP BY puede hacer referencia a cualquier campo especificado en la clusula FROM, aunque el campo no est incluido en la instruccin SELECT, siempre y cuando la instruccin SELECT incluya al menos una funcin agregada de SQL. El motor de base de datos Jet no puede agrupar campos Memo o de objetos de Automatizacin. Todos los campos de la lista SELECT deben incluirse en la clusula GROUP BY o como argumentos para una funcin agregada de SQL. Cuando especifique un nombre de campo que contenga un espacio en blanco o un signo de puntuacin, inclyalo entre corchetes ([ ]): SELECT [Nombre de producto], Sum([Unidades en existencia]) _ FROM Productos _ GROUP BY [Nombre de producto];

La clusula HAVING
Especifica qu registros agrupados se muestran en una instruccin SELECT con una clusula GROUP BY. Cuando GROUP BY ya ha combinado registros, HAVING muestra cualquier registro agrupado por la clusula GROUP BY que satisfaga las condiciones de la clusula HAVING. HAVING es parecido a WHERE, que determina los registros que se seleccionan. Una vez que los registros se agrupan con GROUP BY, HAVING determina los que se muestran. HAVING es opcional. Una clusula HAVING puede contener hasta 40 expresiones vinculadas por operadores lgicos, como AND y OR. 3

La clusula ORDER BY
La clusula ORDER BY determina el orden de los registros recuperados en la consulta. En la clusula ORDER BY se especifica la columna o columnas utilizadas como clave de ordenacin, especificando a continuacin si los registros se ordenarn de forma ascendente o descendente. El siguiente ejemplo devuelve todos los registros de la tabla Empleados, ordenados alfabticamente por apellido: SELECT * FROM Empleados _ ORDER BY [Apellido] ASC; En este ejemplo, la palabra clave ASC (de orden ascendente) es opcional, ya que el orden predeterminado es ascendente (A Z, 0 9). Sin embargo, puede incluir la palabra clave ASC al final de cada campo que desee ordenar en sentido ascendente para documentar claramente la clusula ORDER BY. Los dos ejemplos siguientes ordenan los nombres de empleados por apellidos: SELECT [Apellido], [Nombre] FROM Empleados _ ORDER BY [Apellido]; SELECT [Apellido], [Nombre] FROM Empleados _ ORDER BY [Apellido] ASC; Para obtener un orden descendente (Z A, 9 0), agregue la palabra clave DESC al final de cada campo que desee ordenar de esta forma. Tambin puede utilizar el nmero ordinal de la columna de orden como aparece en la lista de SELECT, en lugar de volver a escribir su nombre: SELECT [Nombre], [Apellido] FROM Empleados _ ORDER BY 2 ASC; Puede incluir campos adicionales en la clusula ORDER BY. Los registros se ordenan por el primer campo indicado despus de ORDER BY. Los registros que tienen el mismo valor en ese campo se ordenan despus por el valor del segundo campo y as sucesivamente. El siguiente ejemplo selecciona los salarios y los ordena de forma descendente; todos los empleados que tengan el mismo salario se muestran en orden alfabtico ascendente: SELECT [Apellido], Salario FROM Empleados _ ORDER BY Salario DESC, [Apellido]; ORDER BY suele ser el ltimo elemento en una instruccin SQL. Es opcional (a menos que utilice los predicados TOP o TOP n PERCENT en la clusula SELECT.) Si no incluye ORDER BY, los datos se presentan sin ordenar. Crea una consulta de eliminacin que elimina registros de una o ms tablas incluidas en la clusula FROM que satisfagan la clusula WHERE, como se muestra en la siguiente sintaxis: DELETE [tabla.*] FROM expresin_tabla WHERE criterios DELETE es especialmente til cuando desee eliminar numerosos registros. En una instruccin DELETE multitabla, debe incluir el argumento tabla. Si especifica ms de una tabla de las que desea eliminar registros, ninguna de ellas puede contener la clave principal de una relacin uno a varios. Si desea eliminar todos los registros de una tabla, puede ser ms eficaz eliminar la propia tabla que ejecutar la consulta de eliminacin. Puede utilizar el mtodo Execute con una instruccin DROP TABLE para eliminar una tabla de la base de datos. Sin embargo, si elimina la tabla la estructura se pierde. Por el contrario, al utilizar DELETE slo se eliminan los datos, permaneciendo intactas la estructura de la tabla y todas sus propiedades, como los atributos de campos e ndices. Puede utilizar DELETE para quitar registros de una nica tabla o de la parte varios de una relacin uno a varios. Las operaciones de eliminacin en cascada de una consulta nicamente eliminan datos de la parte varios de la relacin. Por 4

ejemplo, en la relacin entre las tablas Clientes y Pedidos, la tabla Pedidos es la parte varios, por lo que la operacin de eliminacin en cascada afecta nicamente a la tabla Pedidos. Una consulta de eliminacin elimina registros enteros, no slo datos de campos determinados. Si desea eliminar valores de un campo especfico, cree una consulta de actualizacin que cambie dichos valores a Null. Cuando haya quitado los registros mediante una consulta de eliminacin, no podr deshacer la operacin. Si desea saber qu registros se han eliminado, examine primero los resultados de una consulta de seleccin que utilice los mismos criterios y despus ejecute la consulta de eliminacin. Debe conservar siempre copias de seguridad de sus datos. Si elimina accidentalmente los registros equivocados, puede recuperarlos a partir de la copia de seguridad.

Puede utilizar la instruccin INSERT INTO para agregar registros a una tabla o crear una consulta de datos anexados. Puede utilizar la siguiente sintaxis para ejecutar una consulta de datos anexados con mltiples registros: INSERT INTO destino [IN base_datos_externa] SELECT [origen.]campo1[, campo2[, ...] FROM expresin_tabla Por el contrario, utilice esta sintaxis para ejecutar una consulta de datos anexados sobre un nico registro: INSERT INTO destino [(campo1[, campo2[, ...]])] VALUES (valor1[, valor2[, ...]) Puede utilizar la instruccin INSERT INTO para agregar un nico registro a una tabla mediante la sintaxis de consulta de datos anexados de registros nicos. En este caso, su cdigo especifica el nombre y el valor para cada campo del registro. Debe especificar los campos del registro a los que se asignar un valor, as como el valor que desea asignarle. Cuando no especifica cada campo, el valor predeterminado o Null se inserta en las columnas que faltan. Los registros se agregan al final de la tabla. Tambin puede utilizar INSERT INTO para anexar un conjunto de registros de otra tabla o consulta mediante la clusula SELECT...FROM, como se muestra en la sintaxis de consulta de datos anexados de mltiples registros. En este caso, la clusula SELECT especifica los campos que se agregan a la tabla de destino especificada. La tabla de origen o de destino puede especificar una tabla o una consulta. Si se especifica una consulta, el motor de base de datos Microsoft Jet anexa un conjunto de registros a todas y cada una de las tablas especificadas en la consulta. INSERT INTO se utiliza a menudo para anexar una nueva tabla de registros de clientes a la tabla Clientes activa. INSERT INTO es opcional, pero cuando se incluye, precede a la instruccin SELECT. Si la tabla de destino contiene una clave principal, asegrese de que anexa valores nicos y que no sean Null al campo o campos de la clave principal; si no lo hace, el motor Jet no anexar los registros. Si anexa registros a una tabla con un campo contador, no incluya el campo contador en su consulta si quiere que el motor Jet vuelva a numerar los registros anexados. Incluya el campo contador en la consulta si desea conservar los valores originales del campo. No obstante, el motor Jet no anexar los registros si hay valores duplicados. Utilice la clusula IN para anexar registros a una tabla de otra base de datos. Para crear una tabla nueva, utilice la instruccin SELECT...INTO en lugar de crear una consulta de creacin de tabla. Para averiguar qu registros se anexarn antes de ejecutar la consulta de datos anexados, ejecute y vea primero los resultados de una consulta de seleccin que utilice los mismos criterios de seleccin. Una consulta de datos anexados copia registros de una o ms tablas a otra. Las tablas que contienen los registros anexados no quedan afectadas por la consulta. En lugar de anexar registros de otra tabla, puede especificar el valor para cada campo en un nico registro nuevo mediante la clusula VALUES. Si omite la lista de campos, la clusula VALUES debe incluir un valor para cada campo de la tabla; si no se hace as, INSERT fallar. Utilice una instruccin INSERT INTO adicional con una clusula VALUES para cada registro adicional que desee crear.

UPDATE crea una consulta de actualizacin que cambia valores de campos en una tabla especificada segn determinados criterios. UPDATE tabla SET nuevo_valor WHERE criterio; UPDATE es especialmente til cuando desea cambiar numerosos registros o cuando los registros que quiere cambiar estn en mltiples tablas. Generalmente, la instruccin UPDATE se usa con el mtodo Execute. Puede cambiar varios campos simultneamente. El siguiente ejemplo incrementa los valores de Cantidad de pedido en un 10 por ciento y los de Gastos de envo en un 3 por ciento para envos del Reino Unido: UPDATE Pedidos _ SET [Cantidad de pedido] = [Cantidad de pedido] * 1.1, _ [Gastos de envo] = [Gastos de envo] * 1.03 _ WHERE [Pas de envo] = 'RU'; UPDATE no genera ningn conjunto de resultados. Si desea saber los registros que se cambiarn, examine primero los resultados de una consulta de seleccin que utilice los mismos criterios y ejecute despus la consulta de actualizacin. Las consultas complejas combinan una o ms instrucciones SELECT, o mltiples clusulas FROM dentro de la instruccin SELECT, para ejecutar consultas que no se pueden realizar con una nica consulta para un nico conjunto de tablas.

Subconsultas
Una subconsulta es una instruccin SELECT anidada dentro de otra instruccin SELECT, SELECT...INTO, INSERT...INTO, DELETE o UPDATE, o bien dentro de otra subconsulta. Puede utilizar tres tipos de sintaxis para crear una subconsulta: comparacin [ANY | ALL | SOME] (instruccin_sql) expresin [NOT] IN (instruccin_sql) [NOT] EXISTS (instruccin_sql) Puede utilizar una subconsulta en lugar de una expresin en la lista de campos de una instruccin SELECT o en una clusula WHERE o HAVING. En una subconsulta, utilice una instruccin SELECT para suministrar un conjunto de uno o varios valores especficos para evaluarlos en la expresin de las clusulas WHERE o HAVING. Utilice los predicados ANY o SOME, que son sinnimos, para recuperar los registros de la consulta principal que satisfacen la comparacin con cualquier registro recuperado en la subconsulta. El siguiente ejemplo devuelve todos los productos cuyo precio unitario es mayor que el de los vendidos con un descuento del 25 por ciento o superior: SELECT * FROM Productos _ WHERE [Precio unitario] > ANY _ (SELECT [Precio unitario] FROM [Detalles de pedido] _ WHERE [Descuento] >= 25); Utilice el predicado ALL para recuperar nicamente los registros de la consulta principal que satisfacen la comparacin con todos los registros recuperados en la subconsulta. Si 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 del 25 por ciento o superior. Esto es mucho ms restrictivo. Utilice el predicado IN para recuperar nicamente los registros de la consulta principal para los cuales algunos registros de la subconsulta contienen un valor igual. El siguiente ejemplo devuelve todos los productos vendidos con un descuento del 25 por ciento o superior: SELECT * FROM Productos _ WHERE [Id. de producto] IN _ (SELECT [Id. de producto] FROM [Detalles de pedido] _ WHERE [Descuento] >= 25); Por el contrario, puede utilizar NOT IN para recuperar nicamente aquellos registros de la consulta principal para los que en la subconsulta no haya ninguno que contenga un valor igual. 6

Utilice el predicado EXISTS (con la palabra clave opcional NOT) en comparaciones de tipo verdadero o falso para determinar si la subconsulta devuelve algn registro. Puede utilizar tambin un alias de nombre de tabla en una subconsulta para hacer referencia a las tablas incluidas en una clusula FROM fuera de la subconsulta. En el ejemplo siguiente se asigna el alias T1 a la tabla Empleados: SELECT [Apellido], [Nombre], Cargo, Salario _ FROM Empleados AS T1 _ WHERE Salario >= _ (SELECT Avg(Salario) _ FROM Empleados _ WHERE T1.Cargo = Empleados.Cargo) Order by Cargo;

Consultas de referencias cruzadas


Las consultas de referencias cruzadas le permiten seleccionar valores de campos o expresiones especificados como encabezados de columnas, de forma que pueda ver sus datos con un formato ms compacto que con la consulta normal SELECT. Utilice la instruccin TRANSFORM para crear consultas de referencias cruzadas: TRANSFORM funcin_agr instruccin_select PIVOT campo_dinmico [IN (valor1[, valor2[, ...]])] La instruccin TRANSFORM utiliza los argumentos siguientes. Argumento Descripcin

funcin_agr Una funcin agregada de SQL que opera sobre los datos seleccionados. instruccin_select Una instruccin SELECT. campo_dinmico El campo o la expresin que desea utilizar para crear encabezados de columna en el conjunto de resultados de la consulta. valor1, valor2 Valores fijos utilizados para crear encabezados de columna. Al resumir datos utilizando una consulta de tabla de referencias cruzadas, selecciona valores de campos o expresiones especificados como encabezados de columna, por lo que puede ver los datos en un formato ms compacto que con una consulta de seleccin. TRANSFORM precede a la instruccin SELECT que especifica los campos utilizados como encabezados de fila y a una clusula GROUP BY que especifica la agrupacin de filas. Opcionalmente puede incluir otras clusulas como WHERE, que especifican criterios adicionales de seleccin o de ordenacin. Los valores devueltos en campo_dinmico se utilizan como encabezados de columna en el conjunto de resultados de la consulta. Por ejemplo, ordenando las cifras de ventas por el mes de la venta en una consulta de tabla de referencias cruzadas creara 12 columnas. Puede restringir campo_dinmico para crear encabezados de valores fijos (valor1, valor2) indicados en la clusula opcional IN. Tambin puede incluir valores fijos para los que no existen datos con el fin de crear columnas adicionales. El siguiente ejemplo crea una consulta de tabla de referencias cruzadas que muestra las ventas mensuales de productos durante un ao especificado por el usuario. Los meses se devuelven de izquierda a derecha (ordenados) como columnas y los nombres de los productos se devuelven de arriba a abajo como filas. PARAMETERS [Ventas de qu ao?] LONG; TRANSFORM _ Sum([Detalles de pedido].Cantidad * ([Detalles de pedido]. _ [Precio unitario] - ([Detalles de pedido].Descuento / 100) _ * [Detalles de pedido].[ Precio unitario])) AS Ventas SELECT _ [Nombre de producto] FROM Pedidos INNER _ JOIN(Productos INNER JOIN [Detalles de pedido] ON _ Productos.[Id. de producto] = [Detalles de pedido]._ [Id. de producto]) ON Pedidos.[Id. de pedido] = _ [Detalles _ Pedido].[Id. de pedido] WHERE DatePart_ ("yyyy", [Fecha de pedido]) = [Ventas de qu ao?] _ GROUP BY [Nombre de producto] ORDER BY [Nombre de producto] _ PIVOT DatePart("m", [Fecha de pedido])

Combinaciones
7

Una de las caractersticas ms poderosas de las bases de datos relacionales es la capacidad de combinar dos o ms tablas para crear una tabla nueva (o Recordset) que contiene informacin de las dos tablas iniciales. Las tablas se combinan de acuerdo con las relaciones existentes entre ellas, generalmente entre la clave principal de una tabla y la clave externa correspondiente de otra. Dependiendo de cmo estn combinadas las tablas, puede crear los siguientes tipos de combinaciones. Combinacin Descripcin INNER JOIN Los registros de las dos tablas se incluyen en la combinacin slo cuando un campo especificado de la primera tabla coincide con el campo especificado de la segunda. LEFT OUTER JOIN Todos los registros de la primera tabla se incluyen en la combinacin, junto con los registros de la segunda tabla en los que coinciden los campos especificados. RIGHT OUTER JOIN Todos los registros de la segunda tabla se incluyen en la combinacin, junto con los registros de la primera tabla en los que coinciden los campos especificados.

Combinaciones internas
Para crear una consulta que incluya nicamente registros en los que coinciden los datos de los campos combinados, utilice la operacin INNER JOIN. INNER JOIN combina registros de dos tablas siempre que existan valores coincidentes en un campo comn. Utilice la siguiente sintaxis: FROM tabla1 INNER JOIN tabla2 ON tabla1.campo1 = tabla2.campo2 Puede utilizar una operacin INNER JOIN en cualquier clusula FROM. Esto crea una combinacin por equivalencia, tambin denominada combinacin interna. Las combinaciones por equivalencia son el tipo de combinaciones ms comn. Combinan registros de dos tablas siempre que hay valores coincidentes en un campo comn a ambas tablas. 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 (aunque algunos no tienen empleados asignados) o todos los empleados (aunque algunos no estn asignados a departamentos), puede utilizar una operacin LEFT JOIN o RIGHT JOIN para crear una combinacin externa. Puede combinar dos campos numricos cualesquiera, aunque tengan diferentes tipos de datos. Por ejemplo, puede combinar un campo Number, para el cual la propiedad Size de su objeto Field es Integer (entero), y un campo contador. El siguiente ejemplo muestra un posible mtodo para combinar las tablas Categoras y Productos por el campo Id. de categora: SELECT [Nombre de categora], [Nombre de producto] _ FROM Categoras INNER JOIN Productos _ ON Categoras.[Id. de categora] = Productos.[Id. de categora]; En el ejemplo anterior, Id. de categora es el campo combinado, pero no se incluye en el resultado de la consulta porque no est incluido en la instruccin SELECT. Para incluir el campo combinado, incluya el nombre del campo en la instruccin SELECT; en este caso, Categor as . [ I d . de categor a ] . El siguiente ejemplo crea dos combinaciones por equivalencia: una entre las tablas Detalles de pedido y Pedidos y otra entre las tablas Pedidos y Empleados. Esto es necesario porque la tabla Empleados no contiene datos de ventas y la tabla Detalles de pedido no contiene datos de empleados. La consulta produce una lista de empleados y sus ventas totales. Dim MiQRY As QueryDef MiQRY.SQL = "SELECT DISTINCTROW Sum([Precio unitario] _ [Cantidad]) AS [Ventas], [Nombre] & " " & _ [Apellido] AS Name FROM Empleados _ INNER JOIN (Pedidos INNER JOIN [Detalles de pedido] _ ON Pedidos.[Id. de pedido] = [Detalles de pedido].[Id. de pedido]) _ ON Empleados.[Id. de empleado] = Pedidos.[Id. de empleado] _ GROUP BY [Nombre] & " " & [Apellido];" Esta instruccin debe utilizarse como la propiedad SQL de un objeto QueryDef o en una expresin SQL con el mtodo OpenRecordset. 8

Omisin de filas duplicadas El ejemplo anterior utiliza el predicado DISTINCTROW en la clusula SELECT para omitir los datos de registros enteros duplicados, no slo campos duplicados. Por ejemplo, podra crear una consulta para combinar las tablas Clientes y Pedidos mediante el campo Id. de cliente. La tabla Clientes no contiene campos Id. de cliente duplicados, pero la tabla Pedidos s, ya que cada cliente puede tener varios pedidos. La siguiente instruccin SQL muestra cmo utilizar DISTINCTROW para crear una lista de compaas que tengan al menos un pedido pero sin detalles sobre tales pedidos: SELECT DISTINCTROW [Nombre de compaa] _ FROM Clientes INNER JOIN Pedidos _ ON Clientes.[Id. de cliente] = Pedidos.[Id. de cliente] _ ORDER BY [Nombre de compaia]; Si omite DISTINCTROW, esta consulta produce mltiples filas para cada compaa que tiene ms de un pedido. DISTINCTROW tiene efecto slo cuando selecciona campos de algunas, pero no todas, las tablas utilizadas en la consulta. DISTINCTROW se pasa por alto si su consulta incluye nicamente una tabla.

Combinaciones izquierda y derecha (externas)


Las combinaciones externas combinan registros de tablas de origen, cuando se utilizan en cualquier clusula FROM, con la siguiente sintaxis: FROM tabla1 [ LEFT | RIGHT ] JOIN tabla2 ON tabla1.campo1 = tabla2.campo2 Utilice una operacin LEFT JOIN para crear una combinacin externa izquierda. Las combinaciones externas izquierdas incluyen todos los registros de la primera de dos tablas (la de la izquierda), aunque no haya valores coincidentes para los registros de la segunda tabla (a la derecha). Utilice una operacin RIGHT JOIN para crear un combinacin externa derecha. Las combinaciones externas derechas incluyen todos los registros de la segunda de dos tablas (la de la derecha), incluso aunque no haya valores coincidentes para los registros de la primera tabla (la de la izquierda). Por ejemplo, podra utilizar LEFT JOIN con las tablas Departamentos (izquierda) y Empleados (derecha) para seleccionar todos los departamentos, incluyendo aquellos que no tengan empleados asignados. Para seleccionar todos los empleados, incluidos aquellos que no estn asignados a ningn departamento, utilice RIGHT JOIN. El siguiente ejemplo muestra un posible mtodo para combinar las tablas Categoras y Productos mediante el campo Id. de categora. La consulta produce una lista de todas las categoras, incluyendo las que no contienen productos: SELECT [Nombre de categora], _ [Nombre de producto] _ FROM Categoras LEFT JOIN Productos _ ON Categoras.[Id. de categora] = Productos.[Id. de categora]; En el siguiente ejemplo, Id. de categora es el campo de combinacin, pero no se incluye en el resultado de la consulta porque no est incluido en la instruccin SELECT. Para incluir el campo combinado, escriba el nombre del campo en la instruccin SELECT; en este caso, Categoras.[Id. de categora].

Combinaciones anidadas
Tambin puede anidar instrucciones JOIN mediante la siguiente sintaxis: SELECT campos FROM tabla1 INNER JOIN (tabla2 INNER JOIN [( ]tabla3 [INNER JOIN [( ]tablax [INNER JOIN ...)] ON tabla3.campo3 = tablax.campox)] ON tabla2.campo2 = tabla3.campo3) ON tabla1.campo1 = tabla2.campo2;

Consultas de unin
Utilice la operacin UNION para crear una consulta de unin, combinando los resultados de dos o ms consultas o tablas independientes. 9

consulta1 UNION [ALL] consulta2 [UNION [ALL] consultan [ ... ]] El marcador de posicin consulta representa una expresin de cadena que identifica el campo que contiene los datos numricos cuya media desea calcular o una expresin que ejecuta un clculo mediante los datos del campo. Los operandos de una expresin pueden incluir el nombre del campo de una tabla, una constante o una funcin (que puede ser intrnseca o definida por el usuario pero no una de las otras funciones agregadas de SQL o agregadas de dominio). Puede combinar los resultados de una consulta y una instruccin SQL en una nica operacin UNION. El siguiente ejemplo combina los resultados de una consulta existente llamada Nuevas cuentas y una instruccin SELECT: TABLE [Nuevas cuentas] UNION ALL _ SELECT * _ FROM Clientes _ WHERE [Cantidad de pedido] > 1000; De manera predeterminada no se devuelven registros duplicados al utilizar una operacin UNION; sin embargo, puede incluir el predicado ALL para asegurarse de que se devuelven todos los registros. Esto tambin hace que la consulta sea ms rpida. Todas las consultas de una operacin UNION deben solicitar el mismo nmero de campos; no obstante, los campos no tienen por qu ser del mismo tipo o tamao. Puede utilizar una clusula GROUP BY o HAVING en cada argumento consulta para agrupar los datos que se devuelven. Puede utilizar la clusula ORDER BY al final del ltimo argumento consulta para mostrar los datos que se devuelven en un orden especfico.

10

You might also like