Monday, August 29, 2011

SQL JOINS

The SQL JOIN clause is used whenever we have to select data from 2 or more tables.

To be able to use SQL JOIN clause to extract data from 2 (or more) tables, we need a relationship between certain columns in these tables.

We are going to illustrate our SQL JOIN example with the following 2 tables:

Company:
CustomerID
FirstName
LastName
Email
DOB
Phone


1
Scott
Armstrong
Armstrong.yahoo.com
2/4/1968
887-676-2321


2
Adam
Red
red@himail.com
4/4/1978
792 343-2422


3
Santo
Harry
Harry@livingin.org
5/24/1978
416 323-3232


4
Jackson
Jimmy
Jimmy@supermail.co.uk
20/10/1980
416 323-8888



Orders:

CustomerID
Date
OrderAmount
2
5/6/2004
$100.22
1
5/7/2004
$99.95
3
5/7/2004
$122.95
3
5/13/2004
$100.00
4
5/22/2004
$555.55

As you can see those 2 tables have common field called CustomerID and thanks to that we can extract information from both tables by matching their CustomerID columns.

Consider the following SQL statement:

SELECT Company.FirstName, Company.LastName, SUM(Orders.OrderAmount) AS OrdersPerCustomer
FROM Company, Orders
WHERE Company.CustomerID = Orders.CustomerID
GROUP BY Company.FirstName, Company.LastName

The SQL expression above will select all distinct Company (their first and last names) and the total respective amount of dollars they have spent.

The SQL JOIN condition has been specified after the SQL WHERE clause and says that the 2 tables have to be matched by their respective CustomerID columns.

Here is the result of this SQL statement:

FirstName
LastName
OrdersPerCompany
Scott
Armstrong
$99.95
Adam
Red
$100.22
Santo
Harry
$222.95
Jackson
Armstrong
$555.55

The SQL statement above can be re-written using the SQL JOIN clause like this:

SELECT Company.FirstName, Company.LastName, SUM(Orders.OrderAmount) AS OrdersPerCustomer
FROM Company JOIN Orders
ON Company.CustomerID = Orders.CustomerID
GROUP BY Company.FirstName, Company.LastName

There are 2 types of SQL JOINS – INNER JOINS and OUTER JOINS. If you don't put INNER or OUTER keywords in front of the SQL JOIN keyword, then INNER JOIN is used. In short "INNER JOIN" = "JOIN" (note that different databases have different syntax for their JOIN clauses).

The INNER JOIN will select all rows from both tables as long as there is a match between the columns we are matching on. In case we have a customer in the Company table, which still hasn't made any orders (there are no entries for this customer in the Orders table), this customer will not be listed in the result of our SQL query above.
 
If the Orders table has the following rows:

CustomerID
Date
OrderAmount
2
5/6/2004
$100.22
1
5/6/2004
$99.95

And we use the same SQL JOIN statement from above:

SELECT Company.FirstName, Company.LastName, SUM(Orders.OrderAmount) AS OrdersPerCustomer
FROM Company JOIN Orders
ON Company.CustomerID = Orders.CustomerID
GROUP BY Company.FirstName, Company.LastName

We'll get the following result:

FirstName
LastName
OrdersPerCompany
Scott
Armstrong
$99.95
Adam
Red
$100.22

Even though Santo and Jackson are listed as Company in the Company table they won't be displayed because they haven't purchased anything yet.

But what if you want to display all the Company and their orders, no matter if they have ordered something or not? We’ll do that with the help of SQL OUTER JOIN clause.

The second type of SQL JOIN is called SQL OUTER JOIN and it has 2 sub-types called LEFT OUTER JOIN and RIGHT OUTER JOIN.

The LEFT OUTER JOIN or simply LEFT JOIN (you can omit the OUTER keyword in most databases), selects all the rows from the first table listed after the FROM clause, no matter if they have matches in the second table.
 If we slightly modify our last SQL statement to:

 SELECT Company.FirstName, Company.LastName, SUM(Orders.OrderAmount) AS OrdersPerCustomer
FROM Company LEFT JOIN Orders
ON Company.CustomerID = Orders.CustomerID
GROUP BY Company.FirstName, Company.LastName

and the Orders table still has the following rows:

CustomerID
Date
OrderAmount
2
5/6/2004
$100.22
1
5/6/2004
$99.95

The result will be the following:

FirstName
LastName
OrdersPerCompany
Scott
Armstrong
$99.95
Adam
Red
$100.22
Santo
Harry
NULL
Jackson
Armstrong
NULL

As you can see we have selected everything from the Company (first table). For all rows from Company, which don’t have a match in the Orders (second table), the OrdersPerCustomer column has amount NULL (NULL means a column contains nothing).

The RIGHT OUTER JOIN or just RIGHT JOIN behaves exactly as SQL LEFT JOIN, except that it returns all rows from the second table (the right table in our SQL JOIN ).



MORE BASIC SQL COMMANDS

No comments:

Post a Comment