Por Viktor Ml. Justo Vasquez
El comando SELECT forma parte de la especificación de SQL que se utiliza para la extracción y filtro de información de una base de datos relacional.
Es, por mucho, el comando mas utilizado en el manejo de una base de datos y en el desarrollo de aplicaciones.
Aunque generalmente nuestra aplicación se la pasa leyendo data de nuestra base de datos. es necesario poder filtrar la información que deseamos utilizar y esto es lo que veremos a continuación.
El comando SELECT puede ser dividido en diferentes partes, cada una de ellas iniciando con una palabra clave. Es recomendado, por convención, escribir cada palabra clave en SQL en mayúscula.
SELECT ... FROM ... ;
Esta es la forma mas sencilla de SELECT, consta de dos partes que son:
SELECT * FROM SalesLT.Customer
Utilizamos el asterisco representando que queremos todas las columnas dentro de esa tabla. SalesLT representa el Esquema que queremos acceder. Por lo que el comando arriba significa "tráeme todas las columnas en la tabla Customer en el esquema SalesLT"
SELECT ProductID, ProductModelID, ProductNumber FROM SalesLT.Product
En este caso estamos especificando solamente las columnas que nos interesan, filtrando así cualquier exceso de información innecesaria. Cabe notar que especificando las columnas podemos jugar con el orden en que son retornadas estas. SELECT CustomerID, LastName, FirstName FROM SalesLT.Customer;
SELECT CustomerID, FirstName, LastName FROM SalesLT.Customer;
Los predicados son palabras claves que generalmente son incluidas al principio de un SELECT para modificar su comportamiento. entre las mas usadas tenemos:
DISTINCT: nos devuelve valores no repetidos para la columna(s) dada(s).
TOP: limita al query a que nos devuelva solo x cantidad de filas.
SELECT TOP 25 ProductID, Product, ProductNumber FROM SalesLT.Product
SELECT DISTINCT FirstName FROM SalesLT.Customer
No siempre queremos toda la data de la tabla, por lo que lo siguiente seria filtrar un poco la información que recibimos de la base de datos. Al agregar la clausula WHERE a un comando SELECT, estamos especificando una condición que debe cumplirse para que esa data sea seleccionada. Esto limitara la cantidad de filas que sera devuelta por la base de datos. Cabe notar que es generalmente aquí donde pasa toda la acción en un query.
SELECT ... FROM ... WHERE ...;
Continuando con ejemplos anteriores pudiéramos tomar el nombre y apellido de todos los clientes de genero masculino.
De manera opuesta pudiéramos filtrar los hombres y seleccionar solo las mujeres de esta manera:SELECT CustomerID, FirstName, LastName FROM SalesLT.Customer
where Title = 'Mr.'
SELECT CustomerID, FirstName, LastName FROM SalesLT.Customer
where Title <> 'Mr.'
No es necesario que las condiciones sean igualdades o diferencias, podemos hacer comparaciones también.select * from SalesLT.Product
where ListPrice < 50
SELECT ... FROM ... WHERE ... AND ...;
SELECT * FROM SalesLT.SalesOrderHeader
WHERE TotalDue > 5000 AND TotalDue < 10000;
También podemos escribir eso de la siguiente manera utilizando la clausula BETWEEN:SELECT EmployeeID, FirstName, LastName, HireDate, City FROM Employees WHERE HireDate BETWEEN '1-june-1992' AND '15-december-1993'
En casos donde queremos el resultado contrario a las condiciones que estamos especificando tenemos la palabra clave NOT:
SELECT EmployeeID, FirstName, LastName, HireDate, City FROM Employees WHERE HireDate NOT BETWEEN '1-june-1992' AND '15-december-1993'
Ese query nos devuelve los empleados que fueron contratados antes del 1ro de Junio del 92' y luego del 15 de diciembre del 93'. Cabe destacar que también puede ser escrito de la siguiente manera:SELECT EmployeeID, FirstName, LastName, HireDate, City
FROM Employees
WHERE HireDate < '1-june-1992' or HireDate > '15-december-1993'
SELECT EmployeeID, FirstName, LastName, HireDate, City
FROM Employees
WHERE NOT (HireDate > '1-june-1992' and HireDate < '15-december-1993')
En los casos donde queremos retornar una lista exhaustiva de datos donde un campo debe tener una extensa lista de valores, los cuales no seria factible filtrar mediante OR, pues entonces utilizamos IN.
SELECT * FROM SalesLT.Customer WHERE SalesPerson IN (
'adventure-works\shu0', 'adventure-works\linda3', 'adventure-works\garrett1');
También podemos encadenarlo con NOT para filtrar exactamente esos valores
SELECT * FROM SalesLT.Customer WHERE SalesPerson NOT IN (
'adventure-works\shu0', 'adventure-works\linda3', 'adventure-works\garrett1');
Por ultimo, LIKE es una palabra cable que nos permite efectuar identificación de patrones utilizando comodines para crear condiciones con solo parte de la información.
SELECT * FROM SalesLT.Customer
WHERE FirstName LIKE 'J__n'
Coincide con todos los clientes con un primer nombre de 4 letras que empiezan con 'J' y terminan con 'n'.SELECT * FROM SalesLT.Customer
WHERE FirstName LIKE 'Kath%'
Coincide con todos los clientes con un primer nombre que empiezan con 'Kath'SELECT * FROM SalesLT.Customer
WHERE FirstName LIKE '%arol%'
Coincide con todos los clientes que el primer nombre contenga 'arol' en alguna parte que no sea ni el principio, ni el final.SELECT * FROM SalesLT.Customer
WHERE FirstName LIKE 'Be[vn]'
Coincide con todos los clientes que el primer nombre sea de tres letras, empieze con 'Be' y termine con 'v' o 'n'SELECT * FROM SalesLT.Customer
WHERE LastName LIKE 'M[^c]%'
Coincide con todos los clientes que el apellido comienza con M y no le siga una 'c'SELECT * FROM SalesLT.Customer
WHERE FirstName NOT LIKE 'Be[vn]'
Hasta ahora hemos estado discutiendo filtración de datos para determinar que filas serán incluidas en el set final. Una vez que hemos que queremos que nos devuelva nuestro SELECT, podríamos desear tener control sobre el orden por el cual están organizadas estas filas.
Para cambiar la organización de la tabla que nos genera el SELECT solo especificamos la clausula ORDER BY. Esta toma una o mas nombres de columnas que especifican el orden.
SELECT ... FROM ... WHERE ... ORDER BY
SELECT EmployeeID, FirstName, LastName, HireDate, City FROM Employees ORDER BY City
Como se podrán imaginar, esta consulta toma solo las columnas nombre, apellidos, fecha de contratado, city de la tabla empleados y despliega toda la data ordenada por ciudad.SELECT EmployeeID, FirstName, LastName, HireDate, Country, City FROM Employees ORDER BY Country, City DESC
al especificarle al ORDER BY mas de una columna, se le esta diciendo que en caso de que mas de una fila posea el mismo valor en el primer columna de orden, pues utilizara la segunda para organizar esas dos columnas.Este comando agrupa las filas en una sola fila que resume una o mas columnas o expresiones. Una fila es retornada para cada grupo. las funciones agregadas del SELECT proveen información acerca de cada grupo en vez de filas individuales.
SELECT SalesPerson, COUNT(SalesPerson) FROM SalesLT.Customer
GROUP BY c.SalesPerson
Cabe notar que cada columna que no este en una función agregada del SELECT debe estar incluida en el GROUP BY.
Las filas que no cumplan las condiciones en un WHERE son filtradas antes de ejecutar cualquier tipo de agrupación.
Especifica una condición de búsqueda en un grupo o agregado, es generalmente usada con un SELECT con clausulas GROUP BY. Cabe destacar que HAVING solo puede ser usado con SELECT.
SELECT SalesOrderID, SUM(LineTotal) AS SubTotal FROM Sales.SalesOrderDetail GROUP BY SalesOrderID HAVING SUM(LineTotal) > 100000.00 ORDER BY SalesOrderID ;
Este ejemplo, usa HAVING para retornar el total de cada orden a partir de la table de detalle de ordenes que exceda los 100,000.Un Join de SQL combina los records de dos o mas tablas en una base de datos, este genera un set que puede ser grabado como una tabla o usado de forma anónima. Al combinar campos de dos tablas usando valores comunes para cada una de ellas estamos usando un join. El estándar especifica 4 tipos de join:
Este tipo de join toma los campos del predicado y los compara y con los records que cumplen esa condición toma los calores de cada par de filas y los combina en una sola fila.
A diferencia del inner join, el left join toma todos los record de la tabla A aun cuando no haya un record que coincida con la condición inicial especificada en el join.
Es lo mismo que el left Join, pero con la tabla B.
Agarran toda la data en las tablas haya o no coincidencias en la condición inicial.