You are on page 1of 35

SQL para Access 2000

Consultas simples
Se emplea la sentencia SELECT, que permite recuperar datos de una o varias tablas; la cual forma parte del DML (lenguaje de manipulacin de datos). El resultado arrojado es una tabla lgica, ya que no se almacena en disco sino que permanece en memoria y se recalcula cada vez que se ejecuta la consulta. Tiene la apariencia de una tabla integrada por columnas y filas, ya que deben indicarse las columnas que mostrar el resultado y las filas que se filtrarn desde la tabla origen. Sintaxis de la sentencia SELECT (consultas simples)

La clausula FROM
Permite especificar la tabla de origen de la informacin. Si el resultado se obtiene a partir de una nica tabla, la sintaxis de la clusula ser:
FROM especificacin de tabla

Donde la especificacin de tabla puede ser tanto el nombre de una consulta guardada como el nombre de una tabla y tiene el siguiente formato: Sintaxis de la clausula From

Donde Aliastabla es un nombre de alias o sobrenombre asignado a la tabla. Si en una consulta se asigna un alias a la tabla, esta deber nombrarse utilizando ese alias y no su nombre real. El alias slo es vlido en la consulta en la que se define. Se suele usar en consultas basadas en ms de una tabla. La sentencia AS ubicada delante del alias es opcional. Ejemplos:
SELECT * FROM Categorias Cate SELECT * FROM Categorias AS Cate

Ambas sentencias devuelven todos los campos de la tabla Categorias que se renombra en esta consulta como Cate

La clausula IN
Permite acceder a tablas no pertenecientes ala base de datos actual; para lo que se debe indicar la ruta de acceso a la misma y su nombre con extensin inclusive encerrada entre apostrofes. Ejemplos:

SELECT * FROM Empleados IN 'C:\Mis Documentos\Empresa.mdb'

La consulta anterior devuelve todos los campos de la tabla Empleados perteneciente a la base Empresa.mdb.

Especificacin de Campos
Los Campos que se desean incluir en el resultado se especifican separados por comas delante de la clusula FROM. Sintaxis de la especificacin de campos

El * Permite seleccionar todos los campos de la tabla; puede utilizarse junto con el nombre de la tabla a la que pertenecen los campos cuando el origen de datos es mas de una tabla. Ejemplos:
SELECT * FROM Categoras SELECT Categorias.* FROM Categorias

Las consultas anteriores devuelven todos los campos de la tabla Categoras. Los campos pueden especificarse mediante su nombre simple (nombre del campo) o su nombre cualificado (nombre del campo precedido por el nombre de la tabla a la que pertenece seguida de un punto de separacin. Si el nombre de Campo o de la tabla contienen espacios en blanco, deben encerrarse entre corchetes [ ] Ejemplos:
SELECT Id_Producto, Producto, Precio FROM Productos SELECT Productos.Id_Producto, Productos.Producto, Productos.Precio FROM Productos

Las consultas anterior devuelven los campos Id_Producto, Producto, Precio de la tabla Productos.

Clausula AS
Permite especificar un Alias para los nombres de Campo de la tabla. Ejemplos:
SELECT Id_Categoria AS Categoria, Cargo AS Funcion, Sueldo as Remuneracin FROM Cargos

La consulta anterior devuelve la informacin de los campos Id_Categora, Categora y Sueldo provenientes de la tabla Cargos bajo los nombres Categoria, Funcion y Remuneracin respectivamente.

Campos calculados
Son columnas que no existen en la tabla de origen de datos y cuyos valores se pueden obtener a travs de operaciones matemticas, concatenaciones, etc. Para obtener un campo calculado, se especifica en la lista de campos una expresin en vez de un nombre de columna. Esta expresin puede contener operadores matemticos (suma, resta, multiplicacion divisin), operadores de concatenacin (&), parntesis y funciones de SQL. Ejemplos
SELECT Ciudad, Region, Pais, (Venta-Objetivo) AS Superavit, FROM Ventas

La consulta anterior devuelve la informacin de los campos Ciudad, Region, Pais y el Superavit (calculado en base a la informacin de los campos Venta y Objetivo); provenientes de la tabla Ventas.
SELECT Apellido, Nombre, MONTH(Nacimiento) AS Mes FROM Empleados

La consulta anterior devuelve la informacin de los campos Apellido, Nombre y el Mes (calculado mediante la funcin Month en base a la informacin del campo Nacimiento); provenientes de la tabla Empleados.
SELECT IdEmpleado, Apellido & ', ' & Nombre AS Empleado, Ingreso FROM Empleados

La consulta anterior devuelve la informacin de los campos IdEmpleado, Empleado (obtenido a partir de la concatenacin de los campos Apellido y Nombre) e Ingreso; provenientes de la tabla Empleados.
SELECT Apellido, Nombre, 'Reside en la ciudad de: ' AS Mensaje, Ciudad FROM Empleados

La consulta anterior devuelve la informacin de los campos Apellido, Nombre, aade el texto Reside en la ciudad de: en una columna llamada Mensaje, y a continuacin incorpora el campo Ciudad; provenientes de la tabla Empleados.
SELECT Apellido, Nombre, 'Reside en la ciudad de: ' & Ciudad AS Residencia FROM Empleados

La consulta anterior devuelve la informacin de los campos Apellido, Nombre, concatena el texto Reside en la ciudad de: al campo Ciudad, mostrndolo bajo el alias Residencia; provenientes de la tabla Empleados.

Ordenamiento de Registros Clausula ORDER BY


Permite ordenar los registros arrojados por el resultado de la consulta. No afecta el orden original de los registros en la tabla. Para ello es necesario especificar la columna por la que se realizar el ordenamiento, ya sea empleando su nombre o utilizando el nmero correspondiente a la posicin que ocupa en la lista de seleccin de columnas. Sintaxis de la clausula Order By

Ejemplos:
SELECT Nombre, Apellido, Direccion, Ciudad, Pais FROM Empleados ORDER BY Apellido

Equivale a:
SELECT Nombre, Apellido, Direccion, Ciudad, Pais FROM Empleados ORDER BY 2

La consulta anterior devuelve la informacin de los campos Apellido, Nombre, Ciudad y Pais provenientes de la tabla Empleados y los ordena por Apellido (columna N 2).

Clausulas ASC y DESC


Permiten especificar si el orden ser Creciente (ASC) o Decreciente (DESC). Por defecto el orden ser ascendente (ASC), es decir: de menor a mayor en campos tipo numrico, alfabtico en campos tipo texto, del mas viejo al mas reciente en campos tipo fecha/hora. Ejemplos de ordenamiento ascendente:
SELECT Nombre, Apellido, Direccion, Ciudad, Pais FROM Empleados ORDER BY Apellido

Equivale a:
SELECT Nombre, Apellido, Direccion, Ciudad, Pais FROM Empleados ORDER BY Apellido ASC

Las consultas anteriores devuelve la informacin de los campos Apellido, Nombre, Ciudad y Pais provenientes de la tabla Empleados ordenada por Apellido (Campo tipo texto) en forma creciente.
SELECT Nombre, Apellido, Direccion, Ciudad, Pais, Nacimiento FROM Empleados ORDER BY Nacimiento

Equivale a:
SELECT Nombre, Apellido, Direccion, Ciudad, Pais, Nacimiento FROM Empleados ORDER BY Nacimiento ASC

Las consultas anteriores devuelven la informacin de los campos Apellido, Nombre, Ciudad, Pais y Nacimiento provenientes de la tabla Empleados ordenada por Nacimiento (Campo tipo fecha) en forma creciente.
SELECT IdEmpleado, Nombre, Apellido, Direccion, Ciudad, Pais FROM Empleados ORDER BY IdEmpleado

Equivale a:
SELECT IdEmpleado, Nombre, Apellido, Direccion, Ciudad, Pais FROM Empleados ORDER BY IdEmpleado ASC

Las consultas anteriores devuelven la informacin de los campos IdEmpleado, Apellido, Nombre, Ciudad y Pais provenientes de la tabla Empleados ordenada por IdEmpleado (Campo tipo numrico) en forma creciente. Ejemplos de ordenamiento descendente:

SELECT Nombre, Apellido, Direccion, Ciudad, Pais FROM Empleados ORDER BY Apellido DESC

La consulta anterior devuelve la informacin de los campos Apellido, Nombre, Ciudad y Pais proveniente de la tabla Empleados ordenada por Apellido (Campo tipo texto) en forma decreciente.
SELECT Nombre, Apellido, Direccion, Ciudad, Pais, Nacimiento FROM Empleados ORDER BY Nacimiento DESC

La consulta anterior devuelve la informacin de los campos Apellido, Nombre, Ciudad, Pais y Nacimiento proveniente de la tabla Empleados ordenada por Nacimiento (Campo tipo fecha) en forma decreciente.
SELECT IdEmpleado, Nombre, Apellido, Direccion, Ciudad, Pais FROM Empleados ORDER BY IdEmpleado DESC

La consulta anterior devuelve la informacin de los campos IdEmpleado, Apellido, Nombre, Ciudad y Pais proveniente de la tabla Empleados ordenada por IdEmpleado (Campo tipo numrico) en forma decreciente.

Ordenamiento por varias columnas:


Deben especificarse las columnas por las que se ordenar separadas por comas. Los registros devueltos se ordenarn por la primera columna especificada. Luego, para un mismo valor de la primera columna, se ordenarn por la segunda columna, y as sucesivamente. Ejemplo:
SELECT IdEmpleado, Nombre, Apellido, Direccion, Ciudad, Pais FROM Empleados ORDER BY Pais, Apellido

La consulta anterior devuelve la informacin de los campos IdEmpleado, Apellido, Nombre, Ciudad y Pais proveniente de la tabla Empleados ordenada primero por Pais y luego por Apellido. Las clusulas DESC y ASC pueden especificarse para cada una de las columnas obteniendo as un ordenacin diferente para cada una de ellas. Ejemplo:
SELECT IdEmpleado, Nombre, Apellido, Direccion, Ciudad, Pais FROM Empleados ORDER BY Pais ASC, Apellido DESC

La consulta anterior devuelve la informacin de los campos IdEmpleado, Apellido, Nombre, Ciudad y Pais proveniente de la tabla Empleados ordenada primero por Pais (ascendente) y luego por Apellido (descendente).

Seleccin de Registros
Para filtrar los registros devueltos por una consulta se emplean las clusulas ALL, DISTINCT, TOP, PERCENT y WHERE.

La clusula DISTINCT
Permite eliminar los registros repetidos. Ejemplo:
SELECT Ciudad, Pais FROM Empleados

La consulta anterior devuelve la informacin de los campos Ciudad y Pais proveniente de la tabla Empleados. Debido a que existen varios empleados en algunas de las ciudades, se visualizan registros repetidos.
SELECT DISTINCT Ciudad, Pais FROM Empleados

La consulta anterior devuelve la informacin de los campos Ciudad y Pais proveniente de la tabla Empleados, eliminando los registros repetidos.

La clusula ALL
Muestra todas las filas incluso las duplicadas. La clusula ALL es el valor que SQL asume por defecto, por lo cual puede omitirse. Ejemplo:

SELECT ALL Ciudad, Pais FROM Empleados Select Ciudad, Pais FROM Empleados

La consulta anterior devuelve la informacin de los campos Ciudad y Pais proveniente de la tabla Empleados, incluyendo los registros repetidos.

La clusula TOP
Permite obtener los n primeros registros de la tabla de origen. No identifica registros iguales, solo valores; por lo cual si se solicitan los primeros 15 valores y el registro nmero 16 posee el mismo valor que el registro 15, se incluirn en la lista los 15 primeros valores, pero generndose un listado conformados por 16 registros. Se toma como referencia la columna especificada en la clusula ORDER BY.o en su defecto la clave principal de la tabla. Ejemplos:
SELECT TOP 3 Apellido, Nombre, Ingreso FROM Empleados ORDER BY Ingreso

La consulta anterior devuelve la informacin de los campos Apellido, Nombre e Ingreso correspondiente a los tres primeros valores del campo Ingreso provenientes de la tabla Empleados.
SELECT TOP 2 Apellido, Nombre, Ciudad FROM Empleados ORDER BY Ciudad

La consulta anterior devuelve la informacin de los campos Apellido, Nombre y Ciudad correspondiente a los dos primeros valores del campo Ciudad, provenientes de la tabla Empleados.
SELECT TOP 2 Apellido, Nombre, Ciudad FROM Empleados ORDER BY Ciudad DESC

La consulta anterior devuelve la informacin de los campos Apellido, Nombre y Ciudad correspondiente a los dos primeros valores del campo Ciudad ordenado descendentemente, provenientes de la tabla Empleados.

La clusula PERCENT
Permite especificar la cantidad de filas solicitadas como porcentaje del total de filas.
SELECT TOP 33 PERCENT Apellido, Nombre, Nacimiento FROM Empleados ORDER BY Nacimiento

La consulta anterior devuelve la informacin de los campos Apellido, Nombre y Nacimiento correspondiente al 33% inicial de las fechas de Nacimiento, provenientes de la tabla Empleados.

La clusula WHERE
Permite filtrar los registros a listar mediante una condicin.

En el resultado de la consulta slo aparecern las filas que cumplan con la restriccin impuesta por la condicin. Esta condicin puede ser cualquier condicin vlida o combinacin de condiciones; para lo que debern emplearse los operadores NOT, AND y OR. Access 2000 permite hasta 40 expresiones vinculadas por operadores lgicos AND y OR en una clusula WHERE. Ejemplos:
SELECT IdEmpleado, Apellido, Nombre, Pais FROM Empleados WHERE IdEmpleado > 5

La consulta anterior devuelve la informacin de los campos IdEmpleado, Apellido, Nombre y Pais, provenientes de la tabla Empleados, en los cuales el IdEmpleado es mayor a 5.
SELECT IdEmpleado, Apellido, Nombre, Pais FROM Empleados WHERE IdEmpleado > 5 and Pais = Reino Unido

La consulta anterior devuelve la informacin de los campos IdEmpleado, Apellido, Nombre y Pais, provenientes de la tabla Empleados, en los cuales el IdEmpleado es mayor a 5 y el Pais es igual a Reino Unido.

Condiciones de seleccin
Son las condiciones que se incluyen en la clusula WHERE. Existen cinco tipos de condiciones bsicas: Test de comparacin. Test de rango. Test de pertenencia a un conjunto. Test de valor nulo. Test de correspondencia con patrn. Test de comparacin Compara los valores de dos expresiones empleando operadores relacionales. Su sintaxis es la siguiente:

Operadores Relacionales <> Distinto de = Igual que <= Menor o igual que < Menor que >= Mayor o igual que > Mayor que Ejemplos:
SELECT IdEmpleado, Apellido, Nombre, Pais FROM Empleados WHERE IdEmpleado > 5

La consulta anterior devuelve la informacin de los campos IdEmpleado, Apellido, Nombre y Pais, provenientes de la tabla Empleados, en los cuales el IdEmpleado es mayor a 5.
SELECT IdEmpleado, Apellido, Nombre, Pais FROM Empleados WHERE Pais = Reino Unido

La consulta anterior devuelve la informacin de los campos IdEmpleado, Apellido, Nombre y Pais, provenientes de la tabla Empleados, en los cuales el Pais es igual a Reino Unido. Las cadenas de caracteres deben encerrarse entre apstrofes.
SELECT IdEmpleado, Apellido, Nombre, Nacimiento FROM Empleados WHERE Nacimiento < #01/15/1960#

La consulta anterior devuelve la informacin de los campos IdEmpleado, Apellido, Nombre y Nacimiento, provenientes de la tabla Empleados, en los cuales el Nacimiento es menor o igual al 15/01/1960. Las fechas deben ingresarse entre caracteres numerales y expresarse en formato Mes, Dia, Ao.
SELECT IdEmpleado, Apellido, Nombre, Nacimiento, YEAR(Nacimiento) as Ao Nacimiento FROM Empleados WHERE YEAR(Nacimiento) > 1960

La consulta anterior devuelve la informacin de los campos IdEmpleado, Apellido, Nombre y Nacimiento provenientes de la tabla Empleados, calcula el campo Ao Nacimiento y filtra los registros cuyo Ao Nacimiento sea posterior a 1960. Test de rango (BETWEEN) Verifica si el valor de la expresin se halla comprendido entre dos valores expresados como exp1 y exp2. Tiene la siguiente sintaxis:

Ejemplos:
SELECT IdEmpleado, Apellido, Nombre, Nacimiento FROM Empleados WHERE Nacimiento BETWEEN #01/01/1960# and #31/12/1969#

La consulta anterior devuelve la informacin de los campos IdEmpleado, Apellido, Nombre y Nacimiento, provenientes de la tabla Empleados, en los cuales el Nacimiento esta entre el 01/01/1960 y el 31/12/1969.
SELECT IdEmpleado, Apellido, Nombre, Nacimiento FROM Empleados WHERE IdEmpleado BETWEEN 3 and 7

La consulta anterior devuelve la informacin de los campos IdEmpleado, Apellido, Nombre y Nacimiento, provenientes de la tabla Empleados, en los cuales el IdEmpleado esta entre 3 y el 7. Test de pertenencia a conjunto (IN) Verifica si el valor de la expresin corresponde a alguno de los valores incluidos en una lista de valores. Tiene la siguiente sintaxis:

Ejemplos:
SELECT IdEmpleado, Apellido, Nombre, Nacimiento FROM Empleados WHERE IdEmpleado In (1,3,5,7)

La consulta anterior devuelve la informacin de los campos IdEmpleado, Apellido, Nombre y Nacimiento, provenientes de la tabla Empleados, en los cuales el IdEmpleado es 1, 3, 5 o 7.
SELECT IdEmpleado, Apellido, Nombre, Nacimiento FROM Empleados WHERE IdEmpleado = 1 or IdEmpleado = 3 or IdEmpleado = 5 or IdEmpleado =7

La consulta anterior devuelve el mismo resultado que la previa. Test de valor nulo (IS NULL) Verifica si una consulta de seleccin arroja valor nulo (NULL), es decir, no arroja resultado Verdadero (True) ni Falso (False).

Ejemplos:
SELECT IdEmpleado, Apellido, Nombre, Nacimiento, Jefe FROM Empleados WHERE Jefe IS NULL

La consulta anterior devuelve la informacin de los campos IdEmpleado, Apellido, Nombre, Nacimiento y Jefe, provenientes de la tabla Empleados, en los cuales el campo Jefe es Nulo.
SELECT IdEmpleado, Apellido, Nombre, Nacimiento, Jefe FROM Empleados WHERE Jefe IS NOT NULL

La consulta anterior devuelve la informacin de los campos IdEmpleado, Apellido, Nombre, Nacimiento y Jefe, provenientes de la tabla Empleados, en los cuales el campo Jefe No es Nulo. Test de correspondencia con patrn (LIKE) Se emplea cuando se utilizan caracteres comodines en la especificacin del valor de comparacin. Tiene la siguiente sintaxis:

Caracteres comodin ? representa un carcter cualquiera * representa cero o ms caracteres # representa un dgito cualquiera (0-9) Ejemplos:
SELECT IdEmpleado, Apellido, Nombre, Nacimiento, Jefe FROM Empleados WHERE Nombre LIKE M*

La consulta anterior devuelve la informacin de los campos IdEmpleado, Apellido, Nombre, Nacimiento y Jefe, provenientes de la tabla Empleados, en los cuales el campo Nombre comienza con M.
SELECT IdEmpleado, Apellido, Nombre, Nacimiento, Ciudad FROM Empleados WHERE Ciudad LIKE *tt*

La consulta anterior devuelve la informacin de los campos IdEmpleado, Apellido, Nombre, Nacimiento y Ciudad, provenientes de la tabla Empleados, en los cuales el campo Ciudad posea tt en cualquier posicin del mismo.
SELECT IdEmpleado, Apellido, Nombre, Nacimiento, Ciudad FROM Empleados WHERE Nombre LIKE ??n*

La consulta anterior devuelve la informacin de los campos IdEmpleado, Apellido, Nombre, Nacimiento y Ciudad, provenientes de la tabla Empleados, en los cuales el campo Nombre posea una n como tercer caracter.

Consultas con Multiples Tablas


En este tipo de consultas interviene mas de una tabla. El motor de base de datos Microsoft Jet 4.x soporta dos grupos de consultas con tablas multiples: Consultas de unin de tablas. Consultas de composicin de tablas.

Consultas de unin de tablas


Permiten obtener un nico listado a partir de dos tablas existentes que posean los mismos campos. Por lo tanto, la tabla resultante tendr las mismas columnas que las tablas de origen y todos sus registros. Cuando se habla de tablas, estas pueden ser tablas reales (almacenadas fsicamente en la base de datos) o tablas lgicas (obtenidas como resultado de una consulta). El resultado de la unin de tablas es una tabla lgica. Tiene la siguiente sintaxis:

Como puede observarse en la sintaxis, una consulta de Unin est formada por dos consultas de tablas diferentes, encadenadas por la sentencia UNION. Tener presente que: Ambas consultas deben poseer el mismo nmero de campos aunque estos tengan distinta denominacin y tipos de datos. Los campos resultantes toman sus nombres de la primera consulta. Por defecto la unin no incluye registros repetidos, de tal forma que si algn registro se encuentra en ambas tablas, ste slo se mostrar una vez en el resultado. Para que aparezcan tambin los registros repetidos, se incluye la sentencia ALL. El empleo de la sentencia ALL acelera la ejecucin de la consulta ya que se evita la deteccin y eliminacin de registros repetidos. Para unir mas de dos tablas, se repite la sentencia UNION a continuacin de la segunda consulta, luego de esta se incorpora la tercera consulta; y as sucesivamente. Ejemplo: Las tablas Proveedores y Clientes poseen campos similares. Se desea obtener un listado de todos ellos.

Para obtener un solo listado de los campos NombreCia, Contacto, Direccin, Ciudad y Pais proveniente de las tablas Clientes y Proveedores nicamente de Espaa y Reino unido se utiliza el operador UNION.
SELECT NombreCia, Contacto, Direccion, Ciudad, Pais From Clientes Where Pais = Espaa or Pais = Reino Unido UNION ALL SELECT NombreCia, Contacto, Direccion, Ciudad, Pais From Proveedores Where Pais = Espaa or Pais = Reino Unido

La consulta anterior devuelve la informacin de los campos NombreCia, Contacto, Direccion, Ciudad y Pais, provenientes de las tablas Clientes y Proveedores, de los Pases Espaa y Reino Unido.
SELECT NombreCia, Contacto, Direccion, Ciudad, Pais From Clientes Where Pais = Espaa or Pais = Reino Unido UNION ALL SELECT NombreCia, Contacto, Direccion, Ciudad, Pais From Proveedores Where Pais = Espaa or Pais = Reino Unido Order By Contacto

La consulta anterior devuelve la informacin de los campos NombreCia, Contacto, Direccion, Ciudad y Pais, provenientes de las tablas Clientes y Proveedores, de los Pases Espaa y Reino Unido, ordenada por el campo Contacto.

Consultas de composicin de tablas


Permiten obtener un nico listado a partir de dos tablas existentes encadenando los registros de una tabla con los de la otra, permitiendo visualizar filas cuyos datos se encuentran ubicados en diferentes tablas. Existen distintos tipos de composicin: Producto cartesiano Emparejamiento INNER JOIN LEFT y RIGHT JOIN En los ejemplos se utilizarn las tablas Productos y Categoras que como puede observarse en las imgenes, es posible establecer una relacin entre ambas empelando el cambo IdCategoria.

Producto Cartesiano Es un tipo de composicin de tablas en el que cada uno de los registros de la primera tabla se combina con cada uno de los registros de la otra, obtenindose una tabla lgica con los campos de ambas tablas rellena con los registros correspondientes a la combinatoria de los registros de las mismas. Por lo tanto si cada tabla posee 50 registros, la tabla lgica resultante tendr 50 x 50 registros = 2500 registros Su sintaxis es:

Como la sintaxis lo indica: El Producto Cartesiano se genera utilizando la sentencia FROM y escribiendo a continuacin de la misma los nombres de las tablas intervinientes separados por coma. El nombre de la tabla puede ser tanto un nombre de tabla fsica como lgica (consulta). En caso de que las tablas estn en una base de datos externa, se agrega la clusula IN; seguida del nombre de la base de datos externa, a continuacin de la ltima tabla. En este tipo

de casos es recomendable emplear una tabla vinculada en lugar de la clusula IN, a fin de mejorar el rendimiento y facilitar el uso. Es posible componer una tabla consigo misma, para lo cual es obligatorio el uso de un alias al menos para una de ellas. Ejemplo:
SELECT Productos.IdProducto, Productos.NombreProducto, Categorias.NombreCategoria FROM Categorias, Productos

La consulta anterior devuelve la informacin de los campos IdProducto de la Tabla Productos, NombreProducto de la tabla Productos y NombreCategoria de la tabla Categoras. Rellena con los registros resultante de la combinatoria de ambas tablas. Emparejamiento Es un tipo de composicin similar al Producto Cartesiano, en el que se eliminan los registros que no tienen un campo en comn utilizando un filtro, en el que se especifica que los datos en este campo en comn deben ser iguales o corresponderse en ambas tablas. En otras palabras: Este tipo de consultas obtienen el producto cartesiano de las dos tablas y luego eliminan los registros que no se corresponden entre si, empleando para ello un campo en comn a las dos tablas. Ejemplo:
SELECT Productos.IdProducto, Productos.NombreProducto, Categorias.NombreCategoria FROM Categorias, Productos WHERE Productos.IdCategoria = Categorias.IdCategoria

La consulta anterior devuelve la informacin de los campos IdProducto de la Tabla Productos, NombreProducto de la tabla Productos y NombreCategoria de la tabla Categoras; rellena con los registros en los cuales al informacin del campo IdCategoria de la tabla Productos coincida con la del campo IdCategoria de la tabla Categoras. Las columnas que aparecen en la clusula WHERE de la consulta anterior se denominan Columnas de Emparejamiento ya que permiten emparejar o relacionar las filas de ambas tablas. Como puede observarse en el ejemplo, no es necesario incluir las columnas de emparejamiento en la lista de seleccin de campos. Normalmente una de las columnas empleadas para realizar el emparejamiento, es la clave principal (est indexada) de alguna de las tablas intervinientes en el mismo. En este caso, es ms eficiente utilizar otro tipo de composicin llamado INNER JOIN.

INNER JOIN Es un tipo de composicin de tablas que permite emparejar registros de distintas tablas cuando una de las columnas de emparejamiento est indexada, de una manera ms eficiente que el Producto Cartesiano o el Emparejamiento; debido a que en lugar de realizar primero el Producto Cartesiano completo y luego seleccionar la filas que cumplen la condicin de emparejamiento; directamente busca para cada fila de la clave principal de una de las tablas, todas las filas que cumplen la condicin en la otra tabla. De esta manera, slo se emparejan las filas que se muestran en el resultado de la consulta. Sintaxis: Donde: Tabla1 y Tabla2 son los nombres de las tablas (fsicas o lgicas), o de las consultas guardadas cuyos registros se van a combinar. Pueden ser la misma tabla, en este caso es obligatorio definir al menos un alias de tabla. Col1, Col2 son las columnas empleadas para realizar el emparejamiento. En la clusula ON los nombres de columna deben ser nombres cualificados, es decir, se les debe anteponer en nombre de la tabla a la que pertenecen seguido de un punto. Las columnas de emparejamiento deben ser exactamente del mismo tipo de datos. Las columnas de emparejamiento no pueden ser de tipo Memo ni OLE. Comp representa cualquier operador de comparacin (=, <, >, <=, >=, o <>) y se emplea para establecer la condicin de emparejamiento. Ejemplo 1:
SELECT Productos.IdProducto, Productos.NombreProducto, Categorias.NombreCategoria FROM Productos INNER JOIN Categorias ON Productos.IdCategoria = Categorias.IdCategoria

La consulta anterior devuelve la informacin de los campos IdProducto de la Tabla Productos, NombreProducto de la tabla Productos y NombreCategoria de la tabla Categoras; rellena con los registros en los cuales la informacin del campo IdCategoria de la tabla Productos coincida con la del campo IdCategoria de la tabla Categoras, dejando fuera todos aquellos registros de ambas tablas que no tengan pareja. Ejemplo 2:
SELECT Pedidos.IdPedido, Pedidos.FechaPedido, Empleados.Apellido, Empleados.Nombre FROM Pedidos INNER JOIN Empleados ON Pedidos.IdEmpleado = Empleados.IdEmpleado;

La consulta anterior devuelve la informacin de los campos IdPedido de la Tabla Pedidos, FechaPedido de la tabla Pedidos, Apellido de la tabla Empleados y Nombre de la tabla Empleados; rellena con los registros en los cuales la informacin del campo IdEmpleado de la tabla Pedidos coincida con la del campo IdEmpleado de la tabla Empleados, dejando fuera todos aquellos registros de ambas tablas que no tengan pareja.

INNER JOIN CON MULTIPLES CONDICIONES Pueden definirse varias condiciones de emparejamiento unidas entre si por operadores AND y OR; para ello es necesario escribir cada condicin entre parntesis. Ejemplo: Agreguemos a la consulta anterior el proveedor (NombreCia) que se encuentra en la tabla Proveedores tal como puede observarse en la siguiente imagen.

INNER JOIN CON MULTIPLES TABLAS Pueden combinarse ms de dos tablas. Esto se logra sustituyendo en la sintaxis el nombre de una tabla por un nuevo INNER JOIN completo. Ejemplo 1:

SELECT Productos.IdProducto, Productos.NombreProducto, Categorias.NombreCategoria, Proveedores.NombreCia FROM (Productos INNER JOIN Categorias ON Productos.IdCategoria = Categorias.IdCategoria) INNER JOIN Proveedores ON Productos.IdProveedor = Proveedores.IdProveedor

La consulta anterior devuelve la informacin de los campos IdProducto de la Tabla Productos, NombreProducto de la tabla Productos, NombreCategoria de la tabla Categorias y NombreCia de la tabla Proveedores; rellena con los registros en los cuales la informacin del campo IdCategoria de la tabla Productos coincida con la del campo IdCategoria de la tabla Categoras y que a su vez, la informacin del campo IdProveedor de la tabla Productos coincida con la del campo IdProveedor de la tabla Proveedores, dejando fuera todos aquellos registros de las tres tablas que no tengan pareja. Ejemplo 2:
SELECT Pedidos.IdPedido, Pedidos.FechaPedido, Empleados.Apellido, Empleados.Nombre, Clientes.IdCliente, Clientes.NombreCia,Clientes.Pais FROM (Pedidos INNER JOIN Empleados ON Pedidos.IdEmpleado = Empleados.IdEmpleado) INNER JOIN Clientes ON Pedidos.IdCliente=Clientes.IdCliente;

La consulta anterior devuelve la informacin de los campos IdPedido de la Tabla Pedidos, FechaPedido de la tabla Pedidos, Apellido de la tabla Empleados, Nombre de la tabla Empleados, IdCliente de la tabla Clientes, NombreCia de la tabla Clientes y Pais de la tabla Clientes; rellena con los registros en los cuales la informacin del campo IdEmpleado de la tabla Pedidos coincida con la del campo IdEmpleado de la tabla Empleados y que a su vez, la informacin del campo IdCliente de la tabla Pedidos coincida con la del campo IdCliente de la tabla Clientes, dejando fuera todos aquellos registros de las tres tablas que no tengan pareja.

LEFT JOIN y RIGHT JOIN Corresponden a otro tipo de composicin de tablas denominada composicin externa. Es una extensin del INNER JOIN. Tanto el Emparejamiento como el INNER JOIN son composiciones internas ya que todos los valores de las filas del resultado estn en las tablas que se combinan; por lo tanto slo se incluyen las filas de una tabla que poseen al menos una fila correspondiente en la otra tabla, cumpliendo la condicin de emparejamiento. En los prximos ejemplos se utilizarn las tablas TblEmpleados y TblCiudades mostradas a continuacin

Ejemplo usando el Emparejamiento

SELECT TblEmpleados.Apellido, TblEmpleados.Nombre, TblCiudades.Ciudad FROM TblEmpleados,TblCiudades WHERE TblEmpleados.Id_Ciudad=TblCiudades.Id_Ciudad;

La consulta anterior devuelve la informacin de los campos Apellido de la Tabla TblEmpleados, Nombre de la tabla TblEmpleados y Ciudad de la tabla TblCiudades; rellena con los registros en los cuales la informacin del campo Id_Ciudad de la tabla TblEmpleados coincida con la del campo

Id_Ciudad de la tabla TblCiudades, dejando fuera todos aquellos registros de ambas tablas que no tengan pareja. Con esta sentencia los Empleados que no tengan asignada una Localidad no aparecern en el resultado, ya que existe un valor nulo en el campo Id_Ciudad de la tabla TblEmpleados y esto provoca que la condicin de emparejamiento TblEmpleados. Id_Ciudad = TblCiudades.Id_Ciudad no se cumpla. Observar que los Empleados Juan Tomac, Julia Moss, Antonio Lemos y Hector Lopez no figuran en el resultado de la consulta. Ejemplo usando el INNER JOIN
SELECT TblEmpleados.Apellido, TblEmpleados.Nombre, TblCiudades.Ciudad FROM TblEmpleados INNER JOIN TblCiudades ON TblEmpleados.Id_Ciudad=TblCiudades.Id_Ciudad;

La consulta anterior devuelve la informacin de los campos Apellido de la Tabla TblEmpleados, Nombre de la tabla TblEmpleados y Ciudad de la tabla TblCiudades; rellena con los registros en los cuales la informacin del campo Id_Ciudad de la tabla TblEmpleados coincida con la del campo Id_Ciudad de la tabla TblCiudades, dejando fuera todos aquellos registros de ambas tablas que no tengan pareja. Con esta sentencia los Empleados que no tengan asignada una Localidad no aparecern en el resultado, ya que existe un valor nulo en el campo Id_Ciudad de la tabla TblEmpleados y esto provoca que la condicin de emparejamiento TblEmpleados. Id_Ciudad = TblCiudades.Id_Ciudad no se cumpla. Observar que los Empleados Juan Tomac, Julia Moss, Antonio Lemos y Hector Lopez no figuran en el resultado de la consulta. Para casos en que se requiera que se incluyan las filas que no posean una fila coincidente en la otra tabla, se emplea el LEFT o RIGHT JOIN. Ejemplo usando el LEFT JOIN Sintaxis: El Left Join consiste en aadir al resultado del INNER JOIN los registros de la tabla ubicada a la izquierda de la sentencia que no posean registros correspondientes en la tabla ubicada a la derecha, rellenando los campos sin pareja de la tabla de la derecha con valores nulos.
SELECT TblEmpleados.Apellido, TblEmpleados.Nombre, TblCiudades.Ciudad FROM TblEmpleados LEFT JOIN TblCiudades ON TblEmpleados.Id_Ciudad=TblCiudades.Id_Ciudad;

La consulta anterior devuelve la informacin de los campos Apellido de la Tabla TblEmpleados, Nombre de la tabla TblEmpleados y Ciudad de la tabla TblCiudades; rellena con los registros en los cuales la informacin del campo Id_Ciudad de la tabla TblEmpleados coincida con la del campo Id_Ciudad de la tabla TblCiudades, incluyendo todos los registros de la tabla ubicada a la izquierda de la sentencia que no tengan pareja, rellenando los valores de los campos no apareados con valores nulos. Con esta sentencia aparecen en el resultado los Empleados que no tengan asignada una Localidad. Observar que los Empleados Juan Tomac, Julia Moss, Antonio Lemos y Hector Lopez ahora si figuran en el resultado de la consulta con el campo localidad conteniendo valores nulos. Ejemplo usando el RIGHT JOIN Sintaxis: El RIGHT Join consiste en aadir al resultado del INNER JOIN los registros de la tabla ubicada a la derecha de la sentencia que no posean registros correspondientes en la tabla ubicada a la izquierda, rellenando los campos sin pareja de la tabla de la izquierda con valores nulos.
SELECT TblEmpleados.Apellido, TblEmpleados.Nombre, TblCiudades.Ciudad FROM TblEmpleados RIGHT JOIN TblCiudades ON TblEmpleados.Id_Ciudad=TblCiudades.Id_Ciudad;

La consulta anterior devuelve la informacin de los campos Apellido de la Tabla TblEmpleados, Nombre de la tabla TblEmpleados y Ciudad de la tabla TblCiudades; rellena con los registros en

los cuales la informacin del campo Id_Ciudad de la tabla TblEmpleados coincida con la del campo Id_Ciudad de la tabla TblCiudades, incluyendo todos los registros de la tabla ubicada a la derecha de la sentencia que no tengan pareja, rellenando los valores de los campos no apareados con valores nulos. Con esta sentencia aparecen en el resultado las Ciudades que no hayan sido asignadas a un Empleado. Observar que las Ciudades Tigre, Pilar, Moron, Castelar, Lanu y Zarate ahora si figuran en el resultado de la consulta con los campos Apellido y Nombre conteniendo valores nulos. Anidamiento de LEFT, RIGHT e INNER JOIN Tanto el LEFT JOIN como el RIGHT JOIN se pueden anidar dentro de un INNER JOIN, pero no al revez. Ejemplo:
SELECT TblEmpleados.Apellido, TblEmpleados.Nombre, TblCiudades.Ciudad, TblCargos.Cargo, TblCargos.Sueldo FROM TblCargos INNER JOIN (TblEmpleados LEFT JOIN TblCiudades ON TblEmpleados.Id_Ciudad=TblCiudades.Id_Ciudad) ON TblCargos.Id_Cargo=TblEmpleados.Id_Cargo;

La consulta anterior devuelve la informacin de los campos Apellido de la Tabla TblEmpleados, Nombre de la tabla TblEmpleados, Ciudad de la tabla TblCiudades, Cargo de la Tabla TblCargos y Sueldo de la tabla TblCargos; rellena con los registros en los cuales la informacin del campo Id_Ciudad de la tabla TblEmpleados coincida con la del campo Id_Ciudad de la tabla TblCiudades, incluyendo todos los registros de la tabla ubicada a la derecha de la sentencia que no tengan pareja, rellenando los valores de los campos no apareados con valores nulos; y a su vez en los cuales la informacin del campo Id_Cargo de la tabla de la tabla TblCargos coincida con la del campo Id_Cargo de la tabla TblEmpleados. Cundo utilizar cada operacin El siguiente diagrama permite, mediante la respuesta a distintas preguntas, identificar el tipo de operacin necesaria para obtener los registros deseados, en consultas en las que intervienen varias tablas. T1 y T2 identifican a las tablas de origen de los datos y R el resultado o tabla lgica obtenida. Tanto T1 como T2 pueden ser tablas fsicas o lgicas. La pregunta "En T1 hay filas que no tienen pareja en T2", debe interpretarse como "en alguna de las tablas existen filas que no poseen pareja en la otra?".

Consultas de resumen
Son aquellas en las cuales los registros resultantes son un resumen de los registros de la tabla origen. Debe tenerse en cuenta que las filas resultantes corresponden a varios registros de la tabla de origen. En los prximos ejemplos se utilizar la tabla TblCargos mostrada a continuacin.

Inicialmente se trabajar sobre una sola tabla. Sobre esta tabla se realizarn las consultas de agrupamiento bsicas. Una consulta estndar como la siguiente arroja una fila por cada registro en la tabla de origen. Ejemplo:
SELECT Sueldo FROM TblCargos;

Por el contrario, una fila de una consulta de resumen corresponde a un resumen de varios registros de la tabla de origen, esto provoca que las consultas de resumen sufran una serie de restricciones. Sintaxis:

En las consultas de resumen se introducen dos nuevas clusulas en la sentencia SELECT, la clusula GROUP BY y la clusula HAVING, de uso exclusivo en consulta de resumen. Ambas clusulas deben escribirse entre la clusula WHERE y ORDER BY.

En las consultas de resumen se emplean tambien funciones de columna.

Funciones de columna
Tambin llamadas funciones de dominio agregadas, se aplican a una columna y permiten obtener un valor que resume el contenido de la misma. Las funciones de columna son las siguientes:

El argumento exresin incluido en la sintaxis de la funcin indica con qu valores se trabajar, por ello suele ser el nombre del campo de la tabla que contiene los valores a resumir o bien, pero una expresin vlida que devuelva una lista de valores. La funcin SUM() Calcula la suma de los valores contenidos en el campo especificado en el argumento. Por lo cual, los datos de ste campo deben ser de tipo numrico El resultado arrojado ser del mismo tipo de datos que el campo de origen, aunque puede tener una precisin mayor. Ejemplo:
SELECT SUM(Sueldo) AS [Suma de Sueldos] FROM TblCargos;

El resultado arrojado por la consulta corresponde a la suma de los valores contenidos en el campo Sueldo de la tabla TblCargos. La funcin AVG() Calcula el promedio (la media arimtica) de los valores contenidos en el campo especificado en el argumento. Por lo cual, los datos de ste campo deben ser de tipo numrico. El resultado arrojado ser del mismo tipo de datos que el campo de origen, aunque puede tener una precisin mayor. Ejemplo:
SELECT AVG(Sueldo) AS [Promedio de Sueldos] FROM TblCargos;

El resultado arrojado por la consulta corresponde al promedio de los valores contenidos en el campo Sueldo de la tabla TblCargos. Las funciones StDev() y StDevP() Calculan el desvio estndar de una poblacin o de una muestra de la poblacin representada por los valores contenidos en el campo especificado en el argumento. Por lo cual, los datos de ste campo deben ser de tipo numrico. El resultado arrojado ser del mismo tipo de datos que el campo de origen, aunque puede tener una precisin mayor. Si el origen de datos posee menos de dos registros, el resultado ser un valor nulo. Ejemplos:
SELECT STDEV(Sueldo) AS [Desvi Estndar de Sueldos] FROM TblCargos;

SELECT STDEVP(Sueldo) AS [Desvi Estndar P de Sueldos] FROM TblCargos;

Los resultados arrojados por las consultas corresponden al Desvi Estndar y Desvo Estndar P de los valores contenidos en el campo Sueldo de la tabla TblCargos. Nota: Debe tenerse en cuenta que un valor nulo no equivale a un valor 0, las funciones de columna no tienen en cuenta los valores nulos mientras que si toman en cuenta los valores 0 en el clculo. Es por esto que al existir valores 0 en lugar de valores nulos en el campo empleado en el clculo el resultado arrojado variar. Ejemplo: RESULTADOS CON VALORES 0 RESULTADOS CON VALORES NULL

SELECT AVG(Cantidad) AS [Promedio de Prueba] FROM TblPruebaValoresNulosY0;

SELECT AVG(Cantidad) AS [Promedio de Prueba] FROM TblPruebaValoresNulosY0;

SELECT STDEV(Cantidad) AS [Desvio Estndar de Prueba] FROM TblPruebaValoresNulosY0;

SELECT STDEV(Cantidad) AS [Desvio Estndar de Prueba] FROM TblPruebaValoresNulosY0;

SELECT STDEVP(Cantidad) AS [Desvio Estndar P de Prueba] FROM TblPruebaValoresNulosY0;

SELECT STDEVP(Cantidad) AS [Desvio Estndar P de Prueba] FROM TblPruebaValoresNulosY0;

La funcion MIN() Obtiene el valor mas pequeo de los valores contenidos en el campo especificado en el argumento. Los datos de ste campo deben ser de tipo numrico, fecha o texto. El resultado arrojado ser del mismo tipo de datos que el campo de origen. Si el campo es de tipo texto, MIN() devuelve el primer valor en orden alfabtico, en tanto que si el campo es de tipo fecha, MIN() devuelve la fecha ms antigua. Ejemplo:
SELECT MIN(Sueldo) AS [Minimo Sueldo] FROM TblCargos;

El resultado arrojado por la consulta corresponde al menor de los valores contenidos en el campo Sueldo de la tabla TblCargos. La funcion MAX() Obtiene el valor mas grande de los valores contenidos en el campo especificado en el argumento. Los datos de ste campo deben ser de tipo numrico, fecha o texto. El resultado arrojado ser del mismo tipo de datos que el campo de origen. Si el campo es de tipo texto, Max() devuelve el ltimo valor en orden alfabtico, en tanto que si el campo es de tipo fecha, MAX()devuelve la fecha ms reciente. Ejemplo:
SELECT MAX(Sueldo) AS [Mximo Sueldo] FROM TblCargos;

El resultado arrojado por la consulta corresponde al mayor de los valores contenidos en el campo Sueldo de la tabla TblCargos. La funcin COUNT Existen dos variantes: COUNT(nb columna) Cuenta el nmero de valores que existen en el campo especificado en el argumento. Los datos de ste campo pueden ser de cualquier tipo. La funcin siempre devuelve un nmero entero. En caso de que el campo contenga valores nulos, los mismos no se toman en cuentan. Si en el campo existen valores repetidos, se los incluye tantas veces como aparezcan. COUNT(*) Cuenta filas en vez de valores. Si existen valores nulos en el campo, los mismos si se tienen en cuenta a diferencia de COUNT(nb columna) que los ignora. Ejemplos: COUNT(nb columna) COUNT(*)

SELECT COUNT(Cantidad) AS [Cantidad de Valores] FROM TblPruebaValoresNulosY0;

SELECT COUNT(*) AS [Cantidad de Filas] FROM TblPruebaValoresNulosY0;

Nota: Se pueden combinar varias funciones de columna en una expresin pero no se pueden anidar funciones de columna entre s.

Seleccin en el origen de datos.


Para filtrar datos que cumplan con un criterio de seleccin, basta con incluir la clusula WHERE a continuacin de la clusula FROM. Ejemplo:
SELECT COUNT(Sexo) AS [Cantidad de Mujeres] FROM TblEmpleados Where Sexo='F';

La consulta anterior devuelve la cantidad de empleados de sexo femenino (F). Origen de datos de mltiples tablas

Seleccin de mltiples tablas.


Si los campos a utilizar se encuentran en varias tablas, se construye el origen de datos necesario en la clusula FROM ya que se trata de una consulta multitabla como cualquier otra. Ejemplo:
SELECT AVG(TblCargos.Sueldo) AS [Promedio de Sueldos Empleados Mujeres] FROM TblEmpleados INNER JOIN TblCargos ON TblEmpleados.Id_Cargo = TblCargos.Id_Cargo WHERE TblEmpleados.Sexo='F';

La consulta anterior devuelve el promedio de sueldos de los empleados de sexo femenino (F).

La clusula GROUP BY Sintaxis

Las consultas de resumen vistas hasta aqu, utilizan todas las filas de la tabla de origen de datos y dan origen a una sola fila de resultado; en tanto que la clusula GROUP BY permite agrupar registros por los datos contenidos en una o mas columnas de la tabla de origen y calcular subtotales para cada uno de los grupos obtenidos. Es decir que, una consulta que emplea la clusula GROUP BY agrupa los datos de la tabla origen y produce un nico registro de resumen por cada grupo obtenido, por ello reciben el nombre de consultas agrupadas. Las columnas especificadas en la clusula GROUP BY reciben el nombre de columnas de agrupacin. Ejemplo:
SELECT SUM(TblCargos.Sueldo) AS [Suma de Sueldos de todos los Empleados] FROM TblEmpleados INNER JOIN TblCargos ON TblEmpleados.Id_Cargo = TblCargos.Id_Cargo;

La consulta anterior devuelve la suma de sueldos de todos los empleados.


SELECT SUM(TblCargos.Sueldo) AS [Suma de Sueldos de Empleados por Sexo] FROM TblEmpleados INNER JOIN TblCargos ON TblEmpleados.Id_Cargo = TblCargos.Id_Cargo GROUP BY TblEmpleados.Sexo;

La consulta anterior devuelve la suma de sueldos de los empleados agrupada por sexo, esta informacin se comprendera mejor agregando el campo Sexo proveniente de la tabla TblEmpleados a fin de identificar a que grupo pertenece cada total obtenido.
SELECT TblEmpleados.Sexo, SUM(TblCargos.Sueldo) AS [Suma de Sueldos de Empleados por Sexo] FROM TblEmpleados INNER JOIN TblCargos ON TblEmpleados.Id_Cargo = TblCargos.Id_Cargo GROUP BY TblEmpleados.Sexo;

Restricciones respecto a las columnas de agrupacin:

Un columna de agrupacin no puede ser de tipo memo u OLE. La columna de agrupacin se puede indicar mediante un nombre de columna o cualquier expresin vlida basada en una columna pero no se pueden utilizar los alias de campo. Ejemplo:
SELECT Year(TblEmpleados.Nacimiento) AS [Ao de Nacimiento], COUNT(TblEmpleados.Nacimiento) AS [Cantidad de Empleados] FROM TblEmpleados GROUP BY Year(TblEmpleados.Nacimiento);

La consulta anterior obtiene los Aos de Nacimiento de los empleados a partir del campo Nacimiento de la tabla TblEmpleados, agrupa por Ao de Nacimiento y calcula la cantidad de Empleados pertenecientes a cda grupo. Ejemplo:
SELECT Year(TblEmpleados.Nacimiento) AS [Ao de Nacimiento], COUNT(TblEmpleados.Nacimiento) AS [Cantidad de Empleados] FROM TblEmpleados GROUP BY [Ao de Nacimiento];

El error arrojado por la sentencia anterior se debe a que no es posible incluir como argumento de la expresin GROUP BY un alias de campo ([Ao de Nacimiento]).

Restricciones respecto a la lista de seleccin de campos:


Solo pueden incluirse: valores constantes funciones de columna columnas de agrupacin (columnas que aparecen en la clusula GROUP BY) cualquier expresin basada en las anteriores. Ejemplo:
SELECT Apellido, Year(TblEmpleados.Nacimiento) AS [Ao de Nacimiento], COUNT(TblEmpleados.Nacimiento) AS [Cantidad de Empleados] FROM TblEmpleados GROUP BY Year(TblEmpleados.Nacimiento);

El error arrojado por la sentencia anterior se debe a que no es posible incluir en la lista de seleccin de campos al campo Apellido, ya que el mismo no se encuentra incluido dentro de una funcin de columna, no es una constante y tampoco se utiliza como columna de agrupacin.

Agrupamiento por campos mltiples


Se pueden agrupar registros por hasta 10 campos; para ello deben escribirse los nombres de campo separados por comas en el orden de mayor a menor jerarquia. Ejemplo:
SELECT Sexo, EstadoCivil, COUNT(TblEmpleados.Nacimiento) AS [Cantidad de Empleados] FROM TblEmpleados GROUP BY Sexo, EstadoCivil;

La consulta anterior devuelve la cantidad de empleados agrupados por Sexo y luego por Estado Civil. Los registros que poseen valor nulo en el campo por el cual se agrupan se incluyen en un nico grupo. Es decir, se considera el valor nulo como un valor mas para la agrupacin. Ejemplo:
SELECT Count(TblEmpleados.Apellido) AS [Cantidad de Empleados por Ciudad] FROM TblEmpleados GROUP BY TblEmpleados.Id_Ciudad;

La consulta anterior devuelve la cantidad de empleados agrupados por el campo Id_Ciudad de la tabla TblEmpleados; en la cual existen 4 Empleados sin Ciudad asignada. En contraposicin a esto, si a la misma consulta se le agrega el campo Ciudad proveniente de la tabla TblCiudades generando un INNER JOIN por el campo Id_Ciudad de ambas tablas; los registros que poseen valor nulo quedan fuera. Ejemplo:
SELECT TblCiudades.Ciudad, Count(TblEmpleados.Apellido) AS [Cantidad de Empleados por Ciudad] FROM TblEmpleados INNER JOIN Tblciudades ON TblEmpleados.Id_Ciudad= TblCiudades.Id_Ciudad GROUP BY TblEmpleados.Id_Ciudad,TblCiudades.Ciudad;

La consulta anterior devuelve la Ciudad de la tabla TblCiudades, la cantidad de empleados agrupados primero por el campo Id_Ciudad de la tabla TblEmpleados y luego por el campo Ciudad de la tabla TblCiudades. Como se emplea un INNER JOIN; los registros que no tiene pareja en ambas tablas (4 Empleados sin Ciudad asignada) quedan excluidos. Si en lugar de emplear un INNER JOIN se utiliza un LEFT JOIN, se generar un nuevo grupo sin nombre de Ciudad. Ejemplo:
SELECT TblCiudades.Ciudad, Count(TblEmpleados.Apellido) AS [Cantidad de Empleados por Ciudad] FROM TblEmpleados LEFT JOIN Tblciudades ON TblEmpleados.Id_Ciudad= TblCiudades.Id_Ciudad GROUP BY TblEmpleados.Id_Ciudad,TblCiudades.Ciudad;

La consulta anterior devuelve la Ciudad de la tabla TblCiudades, la cantidad de empleados agrupados primero por el campo Id_Ciudad de la tabla TblEmpleados y luego por el campo Ciudad de la tabla TblCiudades. Como se emplea un LEFT JOIN; se incluyen todos los registros de la tabla TblEmpleados y solo los registros de la tabla TblCiudades coincidentes. Los 4 Empleados sin Ciudad asignada se incluyen en un nuevo grupo. La clusula HAVING Permite seleccionar filas de la tabla resultante de una consulta de resumen. En la condicin de seleccin se utilizan los mismos tests de comparacin que en la clusula WHERE, tambin pueden emplearse condiciones compuestas unidas por los operadores lgicos OR, AND, NOT; teniendo en cuenta la restriccin de que en la condicin de seleccin slo pueden incluirse:

Valores constantes Funciones de columna Columnas de agrupacin (columnas que aparecen en la clusula GROUP BY) Cualquier expresin basada en las anteriores. Ejemplo 1
SELECT Sexo, EstadoCivil, COUNT(TblEmpleados.Nacimiento) AS [Cantidad de Empleados] FROM TblEmpleados GROUP BY Sexo, EstadoCivil HAVING EstadoCivil = 'S';

La consulta anterior devuelve la cantidad de empleados agrupados por Sexo y luego por Estado Civil, filtrando unicamente a los de EstadoCivil S. Ejemplo 2:
SELECT Sexo, EstadoCivil, COUNT(TblEmpleados.Nacimiento) AS [Cantidad de Empleados] FROM TblEmpleados GROUP BY Sexo, EstadoCivil HAVING EstadoCivil = 'S' or EstadoCivil='D' or EstadoCivil='V';

La consulta anterior devuelve la cantidad de empleados agrupados por Sexo y luego por Estado Civil, filtrando unicamente a los de EstadoCivil S o D o V. Resumen del tema

Mecanismo de ejecucin de una consulta de resumen:


Se genera la tabla origen de datos a partir de la clusula FROM Se seleccionan del origen de datos los registros indicados por la clusula WHERE Se generan los grupos de registros de acuerdo a la clusula GROUP BY Se obtiene una fila por cada grupo de registros de la tabla resultante a partir de las especificaciones de las clusulas GROUP BY,

Se seleccionan de la tabla resultante las filas filtradas por la clusula HAVING Se eliminan de la tabla resultante las columnas no indicadas en la lista de seleccin Se ordenan las filas de la tabla resultante de acuerdo a la clusula ORDER BY

Subconsultas o Consultas Anidadas


Es una sentencia SELECT (SubConsulta) ubicada dentro de otra sentencia SELECT (consulta principal) y debe cumplir con los siguientes requisitos. Debe estar ubicada en la lista de seleccin de campos, en la clusula WHERE o en la clusula HAVING de la consulta principal. Posee la misma sintaxis que una sentencia SELECT estndar pero se halla escrita entre parntesis. No puede contener la clusula ORDER BY. No puede ser una consulta de UNION de varias sentencias SELECT Dependiendo de su ubicacin en el SELECT Principal, posee restricciones en cuanto al nmero de columnas que puede incluir. Observaciones: Durante la ejecucin de consultas anidadas, la subconsulta se ejecuta por cada fila de la consulta principal. Es conveniente no usar Campos Calculados dentro de las subconsultas, ya que enlentecen la ejecucin. Las consultas anidadas son ms fciles de comprender. Referencias externas Son referencias al valor de un Campo perteneciente a la fila actual de la consulta principal, realizadas en del cuerpo de una subconsulta. En otras palabras, es el nombre de un campo ubicado dentro de una subconsulta, que no pertenece a ninguna de las tablas especificadas en la clausula FROM de la subconsulta, sino a alguna de las tablas indicadas en la clusula FROM de la consulta principal. Debido a que la subconsulta se ejecuta por cada fila de la consulta principal, el valor de la referencia externa cambiar para cada fila de la consulta principal. Ejemplo:
SELECT Categorias.IdCategoria, Categorias.NombreCategoria, (SELECT COUNT(Productos.IdProducto) FROM Productos Where Categorias.IdCategoria= Productos.IdCategoria) AS [Cantidad de productos en la Categora] FROM Categorias;

La consulta anterior devuelve la cantidad de productos de la tabla Productos, pertenecientes a cada una de las categoras de Producto de la tabla Categoras. Veamos el resultado de la ejecucin independiente de cada una de las consultas anteriores.

Detalle de la consulta
Consulta Principal
SELECT Categorias.IdCategoria, Categorias.NombreCategoria FROM Categorias

Consulta Anidada

(SELECT COUNT(Productos.IdProducto) FROM Productos Where Categorias.IdCategoria= Productos.IdCategoria)

Aqu puede observarse claramente que como en la SubConsulta el campo IdCategoria de la tabla Categoras es una referencia externa, se solicita el valor del parmetro. Si se ingresa dicho valor, como puede observarse en la siguiente imagen.

Se obtiene el resultado para la categora ingresada.

De esta forma queda claramente demostrado que el campo IdCategoria perteneciente a la tabla Categoras es una Referencia externa.

Referencia externa

Categorias.IdCategoria

En este caso la consulta principal es la realizada sobre la tabla Categor.as, mientras que la consulta anidada es la que arroja el resultado de la cuenta realizada sobre los registros de la tabla Productos para cada uno de los registros de la tabla Categorias.

Mecanismo de ejecucin de consultas anidadas:


Se toma el primer Registro (1 Bebidas) de la tabla principal (Categorias). Para este registro de la tabla principal se ejecuta la subconsulta, sustituyendo el campo externo Categorias.IdCategoria por su valor actual en la consulta principal (1 Bebidas). Se obtiene el resultado solicitado (12) para el registro actual de la tabla ubicada en la consulta principal (Categoras). Se repiten los pasos anteriores por cada uno de los registros de la tabla principal.

Anidamiento de subconsultas Es posible anidar una subconsulta dentro de la clusula WHERE de otra subconsulta que a su vez se encuentra anidada dentro de una consulta principal. En la prctica, el consumo de los recursos del sistema (memoria) aumenta al incrementarse el nmero de niveles de anidamiento. Por otra parte, la lectura y comprensin de la consulta se hace ms difcil a medida que aumentan los niveles de anidamiento. Ejemplo:
SELECT Empleados.IdEmpleado, Empleados.Apellido, Empleados.Nombre FROM Empleados Where Empleados.IdEmpleado = (Select Top 1 Pedidos.IdEmpleado FROM Pedidos WHERE Pedidos.IdCliente=(Select Clientes.IdCliente FROM Clientes WHERE Clientes.NombreCia='Ocano Atlntico Ltda.') ORDER BY Pedidos.FechaPedido Asc);

En este ejemplo, por cada linea de pedido se calcula la subconsulta de clientes, y esto se repite por cada empleado, en el caso de tener 10 filas de empleados y 200 filas de pedidos (tablas realmente pequeas), la subconsulta ms interna se ejecutara 2000 veces (10 x 200). Subconsulta
Select Clientes.IdCliente FROM Clientes WHERE Clientes.NombreCia='Ocano Atlntico Ltda.';

Resultado

Select Pedidos.FechaPedido, Pedidos.IdEmpleado FROM Pedidos WHERE Pedidos.IdCliente=(Select Clientes.IdCliente FROM Clientes WHERE Clientes.NombreCia='Ocano Atlntico Ltda.') ORDER BY Pedidos.FechaPedido Asc

Select Top 1 Pedidos.FechaPedido, Pedidos.IdEmpleado FROM Pedidos WHERE Pedidos.IdCliente=(Select Clientes.IdCliente FROM Clientes WHERE Clientes.NombreCia='Ocano Atlntico Ltda.') ORDER BY Pedidos.FechaPedido Asc;

Subconsulta en la lista de seleccin

Cuando la subconsulta aparece en la lista de seleccin de la consulta principal, en este caso la subconsulta, no puede devolver varias filas ni varias columnas, de lo contrario se da un mensaje de error. Muchos SQLs no permiten que una subconsulta aparezca en la lista de seleccin de la consulta principal pero eso no es ningn problema ya que normalmente se puede obtener lo mismo utilizando como origen de datos las dos tablas. El ejemplo anterior se puede obtener de la siguiente forma: SELECT numemp, nombre, MIN(fechapedido) FROM empleados LEFT JOIN pedidos ON empleados.numemp = pedidos.rep GROUP BY numemp, nombre

En la clusula FROM

En la clusula FROM se puede encontrar una sentencia SELECT encerrada entre parntesis pero ms que subconsulta sera una consulta ya que no se ejecuta para cada fila de la tabla origen sino que se ejecuta una sola vez al principio, su resultado se combina con las filas de la otra tabla para formar las filas origen de la SELECT primera y no admite referencias externas. En la clusula FROM vimos que se poda poner un nombre de tabla o un nombre de consulta, pues en vez de poner un nombre de consulta se puede poner directamente la sentencia SELECT correspondiente a esa consulta encerrada entre parntesis.

Subconsulta en las clusulas WHERE y HAVING

Se suele utilizar subconsultas en las clusulas WHERE o HAVING cuando los datos que queremos visualizar estn en una tabla pero para seleccionar las filas de esa tabla necesitamos un dato que est en otra tabla. Ejemplo: SELECT numemp, nombre FROM empleados WHERE contrato = (SELECT MIN(fechapedido) FROM pedidos) En este ejemplo listamos el nmero y nombre de los empleados cuya fecha de contrato sea igual a la primera fecha de todos los pedidos de la empresa. En una clusula WHERE / HAVING tenemos siempre una condicin y la subconsulta acta de operando dentro de esa condicin. En el ejemplo anterior se compara contrato con el resultado de la subconsulta. Hasta ahora las condiciones estudiadas tenan como operandos valores simples (el valor contenido en una columna de una fila de la tabla, el resultado de una operacin aritmtica...) ahora la subconsulta puede devolver una columna entera por lo que es necesario definir otro tipo de condiciones especiales para cuando se utilizan con subconsultas. Estas nuevas condiciones se describen en la pgina siguiente...

Tema 5. Las subconsultas (II)

Condiciones de seleccin con subconsultas

Las condiciones de seleccin son las condiciones que pueden aparecer en la clusula WHERE o HAVING. La mayora se han visto en el tema 2 pero ahora incluiremos las condiciones que utilizan una subconsulta como operando. En SQL tenemos cuatro nuevas condiciones: el test de comparacin con subconsulta el test de comparacin cuantificada el test de pertenencia a un conjunto el test de existencia En todos los tests estudiados a continuacin expresion puede ser cualquier nombre de columna de la consulta principal o una expresin vlida como ya vimos en el tema 2.

El test de comparacin con subconsulta. Es el equivalente al test de comparacin simple. Se utiliza para comparar un valor de la fila que se est examinado con un nico valor producido por la subconsulta. La subconsulta debe devolver una nica columna, sino se produce un error.

Si la subconsulta no produce ninguna fila o devuelve el valor nulo, el test devuelve el valor nulo, si la subconsulta produce varias filas, SQL devuelve una condicin de error. La sintaxis es la siguiente:

SELECT oficina, ciudad FROM oficinas WHERE objetivo > (SELECT SUM(ventas) FROM empleados WHERE empleados.oficina = oficinas.oficina)

Lista las oficinas cuyo objetivo sea superior a la suma de las ventas de sus empleados. En este caso la subconsulta devuelve una nica columna y una nica fila (es un consulta de resumen sin GROUP BY)

El test de comparacin cuantificada. Este test es una extensin del test de comparacin y del test de conjunto. Compara el valor de la expresin con cada uno de los valores producidos por la subconsulta. La subconsulta debe devolver una nica columna sino se produce un error. Tenemos el test ANY (algn, alguno en ingls) y el test ALL (todos en ingls). La sintaxis es la siguiente:

El test ANY. La subconsulta debe devolver una nica columna sino se produce un error. Se evala la comparacin con cada valor devuelto por la subconsulta. Si alguna de las comparaciones individuales produce el resultado verdadero, el test ANY devuelve el resultado verdadero. Si la subconsulta no devuelve ningn valor, el test ANY devuelve falso. Si el test de comparacin es falso para todos los valores de la columna, ANY devuelve falso. Si el test de comparacin no es verdadero para ningn valor de la columna, y es nulo para al menos alguno de los valores, ANY devuelve nulo.

SELECT oficina, ciudad FROM oficinas WHERE objetivo > ANY (SELECT SUM(cuota) FROM empleados GROUP BY oficina)

En este caso la subconsulta devuelve una nica columna con las sumas de las cuotas de los empleados de cada oficina. Lista las oficinas cuyo objetivo sea superior a alguna de las sumas obtenidas.

El test ALL. La subconsulta debe devolver una nica columna sino se produce un error. Se evala la comparacin con cada valor devuelto por la subconsulta. Si todas las comparaciones individuales, producen un resultado verdadero, el test devuelve el valor verdadero. Si la subconsulta no devuelve ningn valor el test ALL devuelve el valor verdadero. (Ojo con esto!) Si el test de comparacin es falso para algn valor de la columna, el resultado es falso. Si el test de comparacin no es falso para ningn valor de la columna, pero es nulo para alguno de esos valores, el test ALL devuelve valor nulo.

SELECT oficina, ciudad FROM oficinas

WHERE objetivo > ALL (SELECT SUM(cuota) FROM empleados GROUP BY oficina)

En este caso se listan las oficinas cuyo objetivo sea superior a todas las sumas.

Test de pertenencia a conjunto (IN). Examina si el valor de la expresin es uno de los valores incluidos en la lista de valores producida por la subconsulta. La subconsulta debe generar una nica columna y las filas que sean. Si la subconsulta no produce ninguna fila, el test da falso. Tiene la siguiente sintaxis:

SELECT numemp, nombre, oficina FROM empleados WHERE oficina IN (SELECT oficina FROM oficinas WHERE region = 'este') Con la subconsulta se obtiene la lista de los nmeros de oficina del este y la consulta principal obtiene los empleados cuyo nmero de oficina sea uno de los nmeros de oficina del este. Por lo tanto lista los empleados de las oficinas del este.

El test de existencia EXISTS. Examina si la subconsulta produce alguna fila de resultados. Si la subconsulta contiene filas, el test adopta el valor verdadero, si la subconsulta no contiene ninguna fila, el test toma el valor falso, nunca puede tomar el valor nulo. Con este test la subconsulta puede tener varias columnas, no importa ya que el test se fija no en los valores devueltos sino en si hay o no fila en la tabla resultado de la subconsulta. Cuando se utiliza el test de existencia en la mayora de los casos habr que utilizar una referencia externa. Si no se utiliza una referencia externa la subconsulta devuelta siempre ser la misma para todas las filas de la consulta principal y en este caso se seleccionan todas las filas de la consulta principal (si la subconsulta genera filas) o ninguna (si la subconsulta no devuelve ninguna fila) La sintaxis es la siguiente:

SELECT numemp, nombre, oficina FROM empleados WHERE EXISTS (SELECT * FROM oficinas WHERE region = 'este' AND empleados.oficina = oficinas.oficina)

Este ejemplo obtiene lo mismo que el ejemplo del test IN. Observa que delante de EXISTS no va ningn nombre de columna. En la subconsulta se pueden poner las columnas que queramos en la lista de seleccin (hemos utilizado el *). Hemos aadido una condicin adicional al WHERE, la de la referencia externa para que la oficina que se compare sea la oficina del empleado. NOTA. Cuando se trabaja con tablas muy voluminosas el test EXISTS suele dar mejor rendimiento que el test IN.

Resumen del tema

Una subconsulta es una sentencia SELECT que aparece en la lista de seleccin, o en las clusulas WHERE o HAVING de otra sentencia SELECT. La subconsulta se ejecuta por cada fila de la consulta principal. Dentro de una consulta se puede utilizar una columna del origen de la consulta principal, una referencia externa. Aunque se puedan anidar subconsultas no es aconsejado ms de un nivel de anidamiento. La subconsulta sufre una serie de restricciones segn el lugar donde se encuentre. Las condiciones asociadas a las subconsultas son las siguientes: el test de comparacin con subconsulta el test ANY

el test ALL el test IN el test EXISTS

You might also like