Manipulación de data









Por Viktor Ml. Justo Vasquez

En el capitulo anterior.

  • Una base de datos relacional es un conjunto de una o mas tablas con una o mas filas que se relacionan entre si, ya sea de uno a uno o de uno a muchos, para representar relaciones en la vida real.
  • Las tablas pueden ser estructuradas con comandos como son:
    • Create table
    • Drop table | Drop column
    • Alter table
  • Una llave primera es el campo que identifica las informaciones guardadas en una tabla.
  • Una llave foránea es la que identifica una información con la que esta tabla se relaciona.

Lectura

Para esta clase estamos usando la BD AdventureWorksLT2008 y me gustaría que puncharan conmigo.

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.

Select ... FROM ...

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:

  • Que columnas deseamos retornar
  • De que tabla deseamos que vengan estas columnas
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;

predicados en el select

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

Where ...

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.

SELECT CustomerID, FirstName, LastName FROM SalesLT.Customer
where Title = 'Mr.'
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.'
 No es necesario que las condiciones sean igualdades o diferencias, podemos hacer comparaciones también.
select * from SalesLT.Product
where ListPrice < 50


¿Que pasa?  no siempre podemos filtrar todo con una sola condición, para esto tenemos las conjunciones AND y OR, que nos sirven para concatenar condiciones de manera.

 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.

  • _ : Coincide con un solo caracter.
  • % : Coincide con un string de uno o mas caracteres.
  • [] : Coincide con cualquiera de los caracteres dentro del rango o grupo especificado.
  • [^] : Coincide con cualquiera de los caracteres que no estén dentro del rango o grupo especificado.


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'

También con LIKE podemos usar el operador NOT para cambiarle el significado a la condición:
SELECT * FROM SalesLT.Customer
WHERE FirstName NOT LIKE 'Be[vn]' 

Order BY

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.
Cabe notar que la columna no debe de estar especificada en el SELECT para ser usada por el ORDER BY.

Group BY

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.

Having

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.

JOINS

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:

  • INNER JOIN
  • LEFT JOIN
  • RIGHT JOIN
  • OUTER JOIN

inner 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.

http://codinghorror.typepad.com/.a/6a0120a85dcdae970b012877702708970c-pi

Left join

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.

Venn diagram of SQL left join

Right Join

Es lo mismo que el left Join, pero con la tabla B.

http://4.bp.blogspot.com/-XRWDbCwTpUI/UT9MG7USHmI/AAAAAAAABNY/vJur9GGcEno/s1600/Right+join.png

Outer Joins

Agarran toda la data en las tablas haya o no coincidencias en la condición inicial.

Venn diagram of SQL cartesian join

D

By Viktor Ml. Justo Vasquez