Tuesday 6 March 2012

Different Types of Joins in SQL Server | Basic tutorial for Joins in SQL Server | SQL LEFT outer Join | SQL RIGHT outer Join | SQL FULL outer Join | SQL Cross Join sample | SQL inner Join sample | Self Join example in SQL Server

When studying relationships, we reviewed techniques of making data from one table available to the records of another table. This demonstrated to reduce data duplication and mistakes. Another issue that involves the combination of tables consists of creating records from more than one table and making the result into a single list. This is the basis of data joins.

A data join is a technique of creating a list of records from more that one table, using all columns from all tables involved, or selecting only the desired columns from one or all of the tables involved. This means that a data join is essentially created in three steps:
  1. Selecting the tables that will be involved in the join
  2. Selecting a column that will create the link in each table
  3. Writing a SQL statement that will create the records


The Tables of a Join

Before creating a join, you must have the tables that would be involved. The tables are created using the techniques we have seen in previous lessons. It is also important to create a primary key for each table. The parent table would usually need only this primary key that would be used to "link" it to a child table. If needed, you can then create the necessary records for the table. Here is an example:
CREATE TABLE Genders
(
    GenderID int identity(1, 1) not null,
    Gender nchar(15),
    CONSTRAINT PK_Genders PRIMARY KEY(GenderID)
);
GO

INSERT INTO Genders(Gender)
VALUES(N'Male'),(N'Female'),(N'Unknown');
GO
When creating the child table, remember to create a column that would serve as the link with the parent table. By a (good) habit as we saw when studying relationships, the name and the data type of this column are the same as the primary key of the parent table. Here is an example:
-- ===================================================
-- Database:  People
-- Author:  Ramesh
-- Date Created: Tuesday, July 28, 2009
-- ===================================================

IF EXISTS(SELECT name FROM sys.databases
   WHERE name = N'People')
DROP DATABASE People;
GO
CREATE DATABASE People;
GO

USE People;
GO

IF OBJECT_ID('Genders', 'U') IS NOT NULL
  DROP TABLE Genders
GO

-- ===================================================
-- Database:  People
-- Table:  Genders
-- Author:  Raamesh
-- Date Created: Tuesday, July 28, 2009
-- Description:  This table holds the list of genders
-- ===================================================
CREATE TABLE Genders
(
    GenderID int identity(1, 1) not null,
    Gender nchar(15),
    CONSTRAINT PK_Genders PRIMARY KEY(GenderID)
);
GO

INSERT INTO Genders(Gender)
VALUES(N'Male'),(N'Female'),(N'Unknown');
GO

-- ===================================================
-- Database:  People
-- Table:  Persons
-- Author:  Ramesh
-- Date Created: Tuesday, July 28, 2009
-- Description:  This table holds a list of people
--     and their genders
-- ===================================================
CREATE TABLE Persons
(
    PersonID int identity(1, 1) not null,
    FirstName nvarchar(20),
    LastName nvarchar(20),
    GenderID int,
    CONSTRAINT PK_Persons PRIMARY KEY(PersonID)
);
GO

INSERT INTO Persons(FirstName, LastName, GenderID)
VALUES(N'John', N'Franks', 1), (N'Peter', N'Sonnens', 1);
GO
INSERT INTO Persons(FirstName, LastName)
VALUES(N'Leslie',N'Aronson');
GO
INSERT INTO Persons(FirstName, LastName, GenderID)
VALUES(N'Mary', N'Shamberg', 2), (N'Chryssa', N'Lurie', 2),
      (N'Hellah', N'Zanogh', 3), (N'Olympia', N'Sumners', 2),
      (N'Roberta', N'Jerseys', 2);
GO
INSERT INTO Persons(FirstName, LastName)
VALUES(N'Hel�ne', N'Campo');
GO
INSERT INTO Persons(LastName, GenderID)
VALUES(N'Millam', 1), (N'Hessia', 2);
GO
INSERT INTO Persons(FirstName, LastName, GenderID)
VALUES(N'Stanley', N'Webbs', 2), (N'Arnie', N'Ephron', 3),
      (N'Mike', N'Pastore', 1);
GO
INSERT INTO Persons(FirstName) VALUES(N'Salim');
GO
INSERT INTO Persons(FirstName, LastName, GenderID)
VALUES(N'Mary', N'Shamberg', 2), (N'Chryssa', N'Lurie', 2);
GO
INSERT INTO Persons(LastName) VALUES(N'Millers');
GO
INSERT INTO Persons(FirstName, GenderID) VALUES(N'Robert', 1);
GO
 
 
Join Creation



Equipped with the necessary tables and their columns, you can create the join. To do this in the SQL Server Management Studio, in the Object Explorer, right-click the database and click open a Query window. Then:
  • On the main menu, click Query -> Query Design in Editor...
  • Right-click somewhere in the Query window and click Query Design in Editor
Any of these actions would display the Table window:
Query Designer


Because the foundation of a join lies on at least two tables, you should add them. To do this, you use the Add Table dialog box. If you had closed the Add Table dialog box, you can right-click the top section of

the Query Designer and click Add Table...
Query Designer

On the Add Table dialog box:
  • You can click the table's name and click Add
  • You can double-click a table
After adding the tables, click Close.
Here is an example of two tables that have been added:
Query Designer

If a relationship was already established between the tables, a joining line would show it.
In the SQL, the basic formula to create a join is:
 
 
SELECT WhatColumn(s)
FROM ChildTable
TypeOfJoin ParentTable
ON Condition


ChildTable specifies the table that holds the records that will be retrieved. It can be represented as follows:
 
 
SELECT WhatColumn(s)
FROM Persons
TypeOfJoin ParentTable
ON Condition

ParentTable specifies the table that holds the column with the primary key that will control what records, related to the child table that will display. This would be represented as follows:
 
SELECT WhatColumn(s)
FROM Persons
TypeOfJoin Genders
ON Condition

Condition is a logical expression used to validate the records that will be isolated. The condition can be created using the following formula:
Table1Column Operator Table2Column

To create the condition, you start with the ON kyword. You can assign the primary key column of the parent table to the foreign key column of the child table. Because both columns likely have the same name, to distinguish them, their names should be qualified. This would be done as follows:
 
SELECT WhatColumn(s)
FROM Persons
TypeOfJoin Genders
ON Persons.GenderID = Genders.GenderID

Although we used the assignment operator "=", another operator, such as LIKE, can also be used, as long as it can be used to assign one column to another.

Here is an example:
 
SELECT WhatColumn(s)
FROM Persons
TypeOfJoin Genders
ON Persons.GenderID LIKE Genders.GenderID

The WhatColumn(s) of our formula allows you to make a list of the columns you want to include in your statement. As you should be aware, you can include all columns by using the * operator. Here is an

example:
 
SELECT *
FROM Persons
TypeOfJoin Genders
ON Persons.GenderID = Genders.GenderID

In this case, all columns from all tables would be included in the result. Instead of all columns, you may want a restricted list. In this case, create the list after the SELECT keyword separating them with commas. You can use the name of a column normally if that name is not duplicated in more than one column.
Here is an example:
 
SELECT LastName, FirstName, Gender
FROM Persons
TypeOfJoin Genders
ON Persons.GenderID = Genders.GenderID

If the same name of a column is found in more than one table, as is the case for a primary-foreign key combination, you should qualify the name. Here is an example:
 
SELECT LastName, FirstName, Persons.GenderID,
       Genders.GenderID, Gender
FROM Persons
TypeOfJoin Genders
ON Persons.GenderID = Genders.GenderID

In fact, to make your code easier to read, you should qualify the name of each column of your SELECT statement. Here is an example:
 
SELECT Persons.LastName, Persons.FirstName, Persons.GenderID,
       Genders.GenderID, Genders.Gender
FROM Persons
TypeOfJoin Genders
ON Persons.GenderID = Genders.GenderID

If you have a schema, you can use it to qualify a (each) table. Here is an example:
 
SELECT dbo.Persons.LastName, dbo.Persons.FirstName, dbo.Persons.GenderID,
       dbo.Genders.GenderID, dbo.Genders.Gender
FROM dbo.Persons
TypeOfJoin dbo.Genders
ON dbo.Persons.GenderID = dbo.Genders.GenderID

You can also use an alias name for each table. Here is an example:
 
 
SELECT pers.LastName, pers.FirstName, pers.GenderID,
       Genders.GenderID, Genders.Gender
FROM Persons pers
TypeOfJoin Genders
ON pers.GenderID = Genders.GenderID


Practical LearningPractical Learning: Preparing a Join



Cross and Inner Joins

 
Introduction


When studying data relationships, we saw the role of the primary and foreign keys in maintaining the exchange of information between two tables. This technique of linking tables plays a major role when creating a join. It allows you to decide whether you want to include all records or only isolate some of them. To respect the direction of a relationship between two tables as it is applied to a query, Transact-SQL supports three types of joins.


Cross Joins


A cross join creates a list of all records from both tables as follows: the first record from the parent table is associated to each record from the child table, then the second record from the parent table is associated to each record from the child table, and so on. In this case also, there is no need of a common column between both tables. In other words, you will not use the ON clause.

To create a cross join, you can replace the TypeOfJoin of our formula with CROSS JOIN or CROSS OUTER JOIN. Here is an example:
 
SELECT Persons.PersonID, Persons.FirstName, Persons.LastName, 
       Genders.GenderID, Genders.Gender
FROM   Persons
CROSS  JOIN Genders
GO

By default, in the SQL Server Management Studio, after you have just added a table to another one (if no relationship was already established between both tables), the query would be automatically made a cross join. All you have to do is to select the necessary columns:

After selecting the columns, you can click OK and execute the query to see the result:
Join


Inner Joins


Imagine you have two tables that can be linked through one's primary key and another's foreign key:
Genders


Notice that some records in the Persons table don't have an entry for the GenderID column and were marked with NULL by the database engine. When creating a query of records of the Persons table, if you want your list to include only records that have an entry, you can create it as inner join.

By default, from the SQL Server Management Studio, when creating a new query, if a relationship was already established between both tables, the query is made an inner join. If there was no relationship explicitly established between both tables, you would have to create it or edit the SQL statement. Consider the following:

Notice that, because no relationship is established between both tables, the join is crossed.
To create an inner join, you have two options. You can drag the primary key from the parent table and drop it on the foreign key in the child table. Here is an example:
Join


Alternatively, you can edit the SQL statement manually to make it an inner join. To do this, you would specify the TypeOfJoin factor of our formula with the expression INNER JOIN. Here is an example:
 
 
SELECT Persons.PersonID, Persons.FirstName, Persons.LastName, Persons.GenderID,
       Genders.GenderID AS [Gender ID], Genders.Gender
FROM   Persons INNER JOIN Genders ON Persons.GenderID = Genders.GenderID

After creating the join, in the Diagram pane, a line would be created to join the tables:
Join

You can then execute the query to see the result. This would produce:
Join

We mentioned earlier that you could include all columns in the query. In our result, since we are more interested in the gender of each Persons record, we would not need the GenderID column from the Genders table.

Here is an example:
Join
Join

As mentioned earlier, notice that the result includes only records that have an entry (a non-NULL entry) in the GenderID foreign key column of the Persons table.


An alternative to the INNER JOIN expression is to simply type JOIN. Here is an example:
 
 
SELECT Persons.PersonID, Persons.FirstName, Persons.LastName, 
       Genders.Gender
FROM Persons
JOIN Genders
ON Persons.GenderID = Genders.GenderID
GO


To destroy a join between two tables, if you are working in the Table window, you can right-click the line that joins the tables and click Remove. In SQL, you must modify the expressions that make up the join (the JOIN and the ON expressions).
 

 
 
Practical LearningPractical Learning: Creating an Inner Join

  1. To create an inner join, from the PropertyTypes table, drag PropertyTypeID and drop it on the PropertyTypeID field of the Properties table:

    Creating an Inner Join
  2. Release the mouse
  3. On the tables, click the check boxes of the following fields: PropertyType, City, Bedrooms, Bathrooms, YearBuilt, and MarketValue

    Creating an Inner Join
  4. Click OK
  5. On the SQL Editor toolbar, click the Execute button Execute to see the result

    An Inner Join
  6. Click in the top section of the Query window where the code was written
  7. On the main menu, click Edit -> Select All
  8. On the main menu, click Edit -> Delete
  9. On the main menu, click Query -> Design Query in Editor...
  10. In the Add Table dialog box, double-click Properties (Listing) and double-click PropertyTypes (Listing)
  11. Click Close
  12. Drag PropertyTypeID and drop it on the PropertyTypeID field of the Properties table:

    Joining
  13. Release the mouse
  14. On the tables, click the check boxes of the following fields: PropertyType, City, Bedrooms, Bathrooms, YearBuilt, and MarketValue
Outer Joins

 
Introduction

Instead of showing only records that have entries in the child table, you may want your query to include all records, including those that are null. To get this result, you would create an outer join. You have three options.
Left Outer Joins

A left outer join produces all records of the child table, also called the right table. The records of the child table that don't have an entry in the foreign key column are marked as NULL.
To create a left outer join, if you are working in the Table window, in the Diagram pane, right-click the line that joins the tables and click the option that would select all records from the child table (in this case, that would be Select All Rows From Persons):
Alternatively, you can replace the TypeOfJoin factor of our formula with either LEFT JOIN or LEFT OUTER JOIN. Here is an example:
SELECT  Persons.PersonID, Persons.FirstName, Persons.LastName, 
        Genders.GenderID, Genders.Gender
FROM Persons
LEFT OUTER JOIN Genders
ON Persons.GenderID = Genders.GenderID
GO
In both cases, the button in the middle of the line would be added an arrow that points to the parent table. You can then execute the query to see the result. Here is an example:
Join
Join
Notice that the result includes all records of the Persons (also called the right) table and the records that don't have an entry in the GenderID column of the Persons (the right) table are marked with NULL.
Right Outer Joins

A right outer join considers all records from the parent table and finds a matching record in the child table. To do this, it starts with the first record of the parent table (in this case the Genders table) and shows each record of the child table (in this case the Persons table) that has a corresponding entry. This means that, in our example, a right outer join would first create a list of the Persons records that have a 1 (Female) value for the GenderID column. After the first record, the right outer join moves to the second record, and so on, each time listing the records of the child table that have a corresponding entry for the primary key of the parent table.
To visually create a right outer join in the Table window, after establishing a join between both tables, if you had previously created a left outer join, you should remove it by right-clicking the line between the tables and selecting the second option under Remove. Then, you can right-click the line that joins them and click the option that would select all records from the parent table. In our example, you would click Select All Rows From Genders.
To create a right outer join in SQL, you can replace the TypeOfJoin factor of our formula with RIGHT JOIN or RIGHT OUTER JOIN. Here is an example:
SELECT Persons.PersonID, Persons.FirstName, Persons.LastName, 
       Genders.GenderID, Genders.Gender
FROM Persons
RIGHT OUTER JOIN Genders
ON Persons.GenderID = Genders.GenderID
GO
In both cases, the button on the joining line between the tables would have an arrow that points to the child table. You can then run the query. Here is an example:
Join
Join
Notice that the query result starts with the first record of the parent table, also called the left table (in this case the Genders table), and lists the records of the child table, also called the right table (in this case the Persons table), that have the entry corresponding to that first record. Then it moves to the next GenderID value. Also, notice that there are no NULL records in the Gender.
Practical LearningPractical Learning: Creating a Right Outer Join

  1. To get a list of only properties whose types are known, right-click the line between the tables and click Select All Rows from PropertyTypes (Listing)

    Creating a Right Outer Join

    Creating a Right Outer Join

    Creating a Right Outer Join
  2. Click OK
  3. On the SQL Editor toolbar, click the Execute button Execute

    Creating a Right Outer Join
Full Outer Joins

A full outer join produces all records from both the parent and the child tables. If a record from one table doesn't have a corresponding value in the other table, the value of that record is marked as NULL.
To visually create a full outer join, in the Table window, right-click the line between the tables and select each option under Remove so that both would be checked. To create a full outer join in SQL, replace the TypeOfJoin factor of our formula with FULL JOIN or FULL OUTER JOIN. Here is an example:
SELECT Persons.PersonID, Persons.FirstName, Persons.LastName, 
       Genders.GenderID, Genders.Gender
FROM Persons
FULL OUTER JOIN Genders
ON Persons.GenderID = Genders.GenderID
GO
The button on the line between the tables would now appear as a square. You can then execute the query. Here is an example:
Join
Join

Just as we have involved only two tables in our joins so far, you can create a join that includes many tables.


No comments :