El comando SELECT se utiliza para recuperar datos desde una base de datos SQL Server y para presentarlos al usuario en uno o mas conjuntos de resultados. Un conjunto de resultados es un arreglo tabular de los datos que se recupera al ejecutarse el comando SELECT. Al igual que una tabla, el conjunto de resultados posee filas y columnas. Este tema proveerá de una vista general de los principales componentes del comando SELECT, y de cómo estos componentes pueden ser usados para recuperar datos específicos desde una base de datos SQLServer.
Los Fundamentos del comando SELECT
Un comando SELECT en Transact-SQL permite recuperar datos desde una base de datos SQL Server. La mayoría de los comandos SELECT incluyen cuatro propiedades primarias del conjunto de resultados:
- La columnas a ser incluidas en el conjuntos de resultados.
- Las tablas de donde se grabarán los datos del conjunto de resultados
- Las condiciones que las filas de las tablas fuentes deben cumplir para ser incluidas en el conjunto de resultado.
- El ordenamiento de las filas en el conjunto de resultados.
Por ejemplo, el siguiente comando SELECT recupera el ID, nombre y precio unitario de cualquier producto cuyo precio unitario supere los $40:
SELECT ProductoID, ProductoNombre, PrecioUnit
FROM Productos
WHERE PrecioUnit > 40
ORDER BY PrecioUnit ASC
FROM Productos
WHERE PrecioUnit > 40
ORDER BY PrecioUnit ASC
En este ejemplo, la cláusula SELECT define qué columnas deberán ser recuperados y la cláusula FROM identifica la tabla que contiene estas columnas La cláusula WHERE limita las filas que serán incluidas en el conjunto de resultados a aquellos productos que tengan un valor de PrecioUnit mayor a $40. Por último, la cláusula ORDER BY especifica que el conjunto de resultados estará ordenado de manera ascendente según el valor de la columna PrecioUnit.
La sintaxis completa del comando SELECT es compleja, pero las principales cláusulas se pueden resumir como sigue:
La sintaxis completa del comando SELECT es compleja, pero las principales cláusulas se pueden resumir como sigue:
SELECT lista_de_selección
[INTO nueva_tabla]
FROM lista_de_tablas
[WHERE condiciones_de_búsqueda]
[GROUP BY lista_de_agrupamientos]
[HAVING condiciones_de_búsqueda]
[ORDER BY lista_de_ordenamiento [ASC | DESC] ]
[INTO nueva_tabla]
FROM lista_de_tablas
[WHERE condiciones_de_búsqueda]
[GROUP BY lista_de_agrupamientos]
[HAVING condiciones_de_búsqueda]
[ORDER BY lista_de_ordenamiento [ASC | DESC] ]
En el resto de este tema se verá cada cláusula en detalle, junto a ejemplos sobre como definir estas cláusulas para recuperar datos específicos desde una base de datos SQL Server.
La cláusula SELECT
La cláusula SELECT incluye la palabra clave SELECT y la lista de selección. La lista de selección es una serie de expresiones separadas por comas. Cada expresión define una columna del conjunto de resultado. Las columnas en el conjunto de resultados estarán en el mismo orden que la secuencia de expresiones en la lista de selección.
Usar palabras claves en la lista de selección.
La lista de selección puede también contener palabras claves que controlen el formato final del conjunto de resultados.
Usar palabras claves en la lista de selección.
La lista de selección puede también contener palabras claves que controlen el formato final del conjunto de resultados.
La palabra clave DISTINCT
La palabra clave DISTINCT elimina filas duplicadas del conjunto de resultados. Por ejemplo, la tabla Ordenes en la base de datos Northwind contiene valores duplicados en la columna CiudadVenta. Para obtener una lista con los valores duplicados de la columna CiudadVenta removidos, ingrese el siguiente código:
SELECT DISTINCT CiudadVenta, RegionVenta
FROM Ordenes
ORDER BY CityVenta
FROM Ordenes
ORDER BY CityVenta
La palabra clave TOP n
La palabra clave TOP n especifica que solo serán devueltas las primeras n filas del conjunto de resultados. Si se especifica ORDER BY, las filas son seleccionadas después que el conjunto de resultados se ordena. El valor n indica el número de filas a ser retornadas (siempre que la palabra clave PERCENT no sea indicada). PERCENT especifica que n es el porcentaje de filas en el conjunto de resultados que se retornarán. Por ejemplo el siguiente comando SELECT retorna las primeras 10 ciudades en orden alfabético de la tabla Ordenes:
SELECT DISTINCT TOP 10 CiudadVenta, RegionVenta
FROM Ordenes
ORDER BY CityVentas
FROM Ordenes
ORDER BY CityVentas
La palabra clave AS
Se puede mejorar la comprensión de un comando SELECT dando a la tabla un alias. Se puede asignar un alias de tabla usando o no la palabra clave AS:
- nombre_tabla AS alias_tabla
- nombre_tabla alias_tabla
En el ejemplo siguiente, el alias p se asigna a la tabla Editores:
USE pubs
SELECT p.ed_id, p.ed_nonmbre
FROM editores AS p
SELECT p.ed_id, p.ed_nonmbre
FROM editores AS p
IMPORTANTE
Si se asigna un alias a una tabla, toda referencia explícita a la tabla en un comando Transact-SQL debe usar el alias, en vez del nombre de la tabla.
Tipos de información en la lista de selección
Una lista de selección puede incluir muchos tipos de información, tal como una expresión simple o una subconsulta escalar. Los ejemplos siguientes muestran varios de los ítems que se pueden incluir en las listas de selección:
SELECT Nombre + ' ' + Apellido AS "Nombre_Empleado",
IDENTITYCOL AS "ID_Empleado",
Telefono_casa,
Region
FROM Northwind.dbo.Empleados
ORDER BY Apellido, Nombre ASC
IDENTITYCOL AS "ID_Empleado",
Telefono_casa,
Region
FROM Northwind.dbo.Empleados
ORDER BY Apellido, Nombre ASC
En este ejemplo, los apellidos y los nombres de los empleados son combinados en una columna. Un espacio se inserta entre el nombre y el apellido. El nombre de la columna que contendrá los nombres de los empleados será Nombre_Empleado. El conjunto de resultados también incluirá la columna de identificación llamada ID_Empleado; la columna Telefono_casa; y la columna Region. El conjunto de resultado se ordenará primero por apellido y después por nombre.
La cláusula INTO
La cláusula INTO habilita para especificar que el conjunto de resultados se utilizará para crear una tabla nueva con el nombre definido en la cláusula. El comando SELECT...INTO se utiliza para combinar datos de varias tablas o vistas en una nueva tabla. Se puede usar para crear una tabla nueva desde un servidor conectado. El ejemplo utiliza un comando SELECT para recuperar valores desde las columnas Apellido y Nombre de la tabla Empleados:
SELECT Nombre, Apellido
INTO NombresEmpleados
FROM Empleados
INTO NombresEmpleados
FROM Empleados
El comando crea una nueva tabla llamada NombresEmpleados y guarda en ella el conjunto de resultados generado. La nueva tabla contendrá las columnas Nombre y Apellido, y estas columnas contendrán los valores de la tabla Empleados. El conjunto de resultados no se muestra en el panel Results a no ser que específicamente se consulte la nueva tabla.
La cláusula FROM
La cláusula FROM se requiere en todo comando SELECT que recupere datos de tablas o vistas. Se usa la cláusula FROM para listar las tablas y vistas que contienen las columnas referenciadas en la lista de selección y en la cláusula WHERE. Se pueden asignar alias a las tablas y vistas mediante el uso de la cláusula AS. Se puede utilizar, además, la cláusula FROM para unir tablas especificando las condiciones de unión en la cláusula JOIN.
La cláusula FROM es una lista separada por comas de nombres de tablas, vistas y de cláusulas JOIN. El comando SELECT usa la cláusula FROM para especificar la tabla Vendedores
La cláusula FROM es una lista separada por comas de nombres de tablas, vistas y de cláusulas JOIN. El comando SELECT usa la cláusula FROM para especificar la tabla Vendedores
SELECT *
FROM Vendedores
FROM Vendedores
Por otra parte, se puede usar la cláusula FROM para especificar combinaciones entre dos tablas o vistas, lo que se discutirá mas adelante en detalle.
Las cláusulas WHERE, GROUP BY, y HAVING
Las cláusulas WHERE y HAVING en un comando SELECT controlan qué filas de las tablas fuentes serán usadas para construir el conjunto de resultados. Las cláusulas WHERE y HAVING son filtros. Especifican una serie de condiciones de búsqueda, y solo se utilizan para construir el conjunto de resultados aquellas filas que satisfacen las condiciones de filtro. Se dice que estas filas califican para participar del conjunto de resultados. Por ejemplo, la cláusula WHERE en el siguiente comando
SELECT retornará solo aquellas filas cuyo valor para la región sea Washington:
SELECT IDCliente, NombreCompañia
FROM Northwind.dbo.Clientes
WHERE Region = 'WA'
SELECT IDCliente, NombreCompañia
FROM Northwind.dbo.Clientes
WHERE Region = 'WA'
La cláusula HAVING se usa típicamente en conjunción con la cláusula GROUP BY, aún cuando se puede especificar sin la cláusula GROUP BY. La cláusula HAVING especifica filtros adicionales y posteriores a los aplicados por la cláusula WHERE. El siguiente comando SELECT incluye una cláusula WHERE, una cláusula GROUP BY, y una cláusula HAVING:
SELECT OrdD1.OrdenID AS OrdenID,
SUM(OrdD1.Cantidad) AS "Ventas_Unidas",
SUM(OrdD1.PrecioUnitario * OrdD1.Cantidad) AS Precio
FROM [Detalle_Orden] AS OrdD1
WHERE OrdD1.OrdenID in (SELECT DISTINCT OrdD2.OrdenID
FROM [Detalle_Orden] AS OrdD2
WHERE OrdD2.Precio_Unitario > $100)
GROUP BY OrdD1.OrdenID
HAVING SUM(OrdD1.Cantidad) > 100
SUM(OrdD1.Cantidad) AS "Ventas_Unidas",
SUM(OrdD1.PrecioUnitario * OrdD1.Cantidad) AS Precio
FROM [Detalle_Orden] AS OrdD1
WHERE OrdD1.OrdenID in (SELECT DISTINCT OrdD2.OrdenID
FROM [Detalle_Orden] AS OrdD2
WHERE OrdD2.Precio_Unitario > $100)
GROUP BY OrdD1.OrdenID
HAVING SUM(OrdD1.Cantidad) > 100
En este comando SELECT, la cláusula WHERE retornará solo aquellas órdenes que incluyan un producto con un precio unitario mayor a $100, y la cláusula HAVING incorpora una restricción adicional tomando aquellas órdenes que incluyen más de 100 unidades. La cláusula GROUP BY limitará las filas a valores distintos de la columna OrdenID.
La cláusula GROUP BY
La cláusula GROUP BY se utiliza para producir valores agregados para cada fila en el conjunto de resultados. Cuando no se usa la cláusula GROUP BY, las funciones de agregación retornan un solo valor para un comando SELECT.
La palabra clave GROUP BY se sigue de una lista de columnas, conocidas como columnas de agrupamiento. La cláusula GROUP BY restringe las filas del conjunto de resultados. Habrá una sola fila para cada valor distinto de la o las columnas de agrupamiento. Cada fila del conjunto de resultados contendrá datos resumidos relacionados con el valor específico de la columna de agrupamiento.
SQL Server tiene restricciones sobre los ítems que pueden ser especificados en la lista de selección cuando un comando SELECT contiene una cláusula GROUP BY. La lista de selección puede contener las columnas de agrupamiento y expresiones que retornen sólo un valor para cada valor de las columnas de agrupamiento, tal como funciones de agregación que tienen un nombre de columna como uno de sus parámetros
Típicamente la cláusula HAVING se usa con la cláusula GROUP BY, aunque no necesariamente.
En una cláusula GROUP BY, se debe especificar el nombre de la columna de la tabla o vista, no el nombre de la columna del conjunto de resultados asignada con una cláusula AS. Se puede listar más de una columna en la cláusula GROUP BY para anidar grupos; esto es, se puede agrupar una tabla por una combinación de columnas.
La palabra clave GROUP BY se sigue de una lista de columnas, conocidas como columnas de agrupamiento. La cláusula GROUP BY restringe las filas del conjunto de resultados. Habrá una sola fila para cada valor distinto de la o las columnas de agrupamiento. Cada fila del conjunto de resultados contendrá datos resumidos relacionados con el valor específico de la columna de agrupamiento.
SQL Server tiene restricciones sobre los ítems que pueden ser especificados en la lista de selección cuando un comando SELECT contiene una cláusula GROUP BY. La lista de selección puede contener las columnas de agrupamiento y expresiones que retornen sólo un valor para cada valor de las columnas de agrupamiento, tal como funciones de agregación que tienen un nombre de columna como uno de sus parámetros
Típicamente la cláusula HAVING se usa con la cláusula GROUP BY, aunque no necesariamente.
En una cláusula GROUP BY, se debe especificar el nombre de la columna de la tabla o vista, no el nombre de la columna del conjunto de resultados asignada con una cláusula AS. Se puede listar más de una columna en la cláusula GROUP BY para anidar grupos; esto es, se puede agrupar una tabla por una combinación de columnas.
Cómo se procesan las cláusulas WHERE, GROUP BY, y HAVING
Entender la secuencia correcta en la que las cláusulas WHERE, GROUP BY, y HAVING se aplican, ayuda a formular consultas eficientes
- La cláusula WHERE se usa para filtrar las filas que resultan de aplicar las operaciones indicadas en la cláusula FROM.
- La cláusula GROUP BY se aplica para agrupar el resultado de la cláusula WHERE.
- Por último, la cláusula HAVING se utiliza para filtrar las filas del resultado agrupado.
Para cualquier condición de búsqueda que se podría aplicar indistintamente antes o después de la operación de agrupamiento, es más eficiente indicarla en la cláusula WHERE. Esto reduce el número de filas a ser agrupadas. Las únicas condiciones de filtro que deben ser indicadas en la cláusula HAVING son aquellas que deben ser aplicadas después que se realicen las operaciones de agrupamiento.
La cláusula ORDER BY
La cláusula ORDER BY ordena el resultado de una consulta por una o más columnas (hasta 8060 bytes). Un ordenamiento puede ser ascendente (ASC) o descendente (DESC). Si no se especifica una ordenamiento, se asume ASC. Si se indican más de una columna en la cláusula ORDER BY el ordenamiento es anidado.
El siguiente comando ordena las filas en la tabla Titulos, primero por Editor (en orden descendente), luego por tipo (en orden ascendente dentro de cada editor), y finalmente por precio (en orden ascendente, dado que no se indica DESC):
USE Pubs
SELECT Pub_id, Tipo, Titulo, Precio
FROM Titulos
ORDER BY Pub_id DESC, Tipo, Precio
El siguiente comando ordena las filas en la tabla Titulos, primero por Editor (en orden descendente), luego por tipo (en orden ascendente dentro de cada editor), y finalmente por precio (en orden ascendente, dado que no se indica DESC):
USE Pubs
SELECT Pub_id, Tipo, Titulo, Precio
FROM Titulos
ORDER BY Pub_id DESC, Tipo, Precio
No hay comentarios:
Publicar un comentario