Joins In Sql Server

Sql Server Tutorial Lesson 6: JOINS in Sql Server with Examples

Join facilitates the retrieval of information from multiple tables. In Sql server we have following 6 types of Joins:

  1. INNER JOIN
  2. LEFT OUTER JOIN
  3. RIGHT OUTER JOIN
  4. FULL OUTER JOIN
  5. CROSS JOIN
  6. SELF JOIN

To demo these features let us first create the Customers and Orders table as depicted in the below image by using the following script:

Joins1

CREATE DATABASE SqlHintsJoinDemo
GO
USE SqlHintsJoinDemo
GO
--Create Customers Table and Insert records
CREATE TABLE Customers 
( CustomerId INT, Name VARCHAR(50) )
GO
INSERT INTO Customers(CustomerId, Name) VALUES(1,'Shree')
INSERT INTO Customers(CustomerId, Name) VALUES(2,'Kalpana')
INSERT INTO Customers(CustomerId, Name) VALUES(3,'Basavaraj')
GO

--Create Orders Table and Insert records into it
CREATE TABLE Orders
(OrderId INT, CustomerId INT, OrderDate DateTime)
GO
INSERT INTO Orders(OrderId, CustomerId, OrderDate) 
VALUES(100,1,Getdate()-1)

INSERT INTO Orders VALUES(200,4,Getdate())
INSERT INTO Orders VALUES(300,3,Getdate()+1)
GO

[ALSO READ] Joining Two Tables without any Common Column between them

1. INNER JOIN in Sql Server

Inner Join returns only the matching rows in both the tables (i.e. returns only those rows for which the join condition satisfies).

Demo 1: As per the data in our demo tables, Customers with CustomerId 1 and 3 in Customers table have the orders in the Orders table. Where as the customer with CustomerId 2 doesn’t have any order in the Orders table. So the Inner Join on the CustomerId column between Customers and Orders table will return the Customer and Order details of the Customers with CustomerId 1 and 3 only.

SELECT * 
FROM  Customers C 
		INNER JOIN Orders O
			ON O.CustomerId = C.CustomerId

RESULT:
INNER JOIN

Demo 2: Below Inner Join query demonstrates how to get name of all the  Customer who have at-least one order in the Orders table.

SELECT C.Name 
FROM  Customers C 
		INNER JOIN Orders O
			ON O.CustomerId = C.CustomerId

RESULT:
Name
——————-
Basavaraj
Shree

2. Left OUTER JOIN in Sql Server

Left Outer Join/Left Join returns all the rows from the LEFT table and the corresponding matching rows from the right table. If right table doesn’t have the matching record then for such records right table column will have NULL value in the result.

Demo 1: As per the data in our demo tables, Customers with CustomerId 1 and 3 in Customers table have the orders in the Orders table. Where as the customer with CustomerId 2 doesn’t have any order in the Orders table. So the Left join on the CustomerId column between Customers and Orders table will return the Customer and Order details of the Customers with CustomerId 1 and 3 and for CustomerId 2 the Order Table columns will have NULL value in the result.

SELECT * 
FROM  Customers C 
		LEFT OUTER JOIN Orders O
			ON O.CustomerId = C.CustomerId

RESULT:
LEFT OUTER JOIN1

Demo 2: Below query demonstrates how to get the name of the Customer who don’t have Orders using LEFT OUTER JOIN.

SELECT C.CustomerId, C.Name 
FROM  Customers C 
		LEFT OUTER JOIN Orders O
			ON O.CustomerId = C.CustomerId
WHERE O.OrderId IS NULL

RESULT:
CustomerId Name
———– ————————————————–
2 Kalpana

3. RIGHT OUTER JOIN in Sql Server

Right Outer Join/Right Join returns all the rows from the RIGHT table and the corresponding matching rows from the left table. If left table doesn’t have the matching record then for such records left table column will have NULL value in the result.

Demo 1: As per the data in our demo tables, only for the order with OrderId 200 we don’t have it’s corresponding customer info with CustomerId 4 in the Customers table. And for the other two orders, the corresponding customer info is present in the Customers Table. So for the orders with CustomerId 1 and 3 will have customer details and for the order with CustomerId 4, the Customers table columns will have NULL value in the result.

SELECT *
FROM  Customers C 
		RIGHT OUTER JOIN Orders O
			ON O.CustomerId = C.CustomerId

RESULT:
RIGHT OUTER JOIN

Demo 2: Below query demonstrates how to get the Orders with a CustomerId, for which we don’t have a mapping any record in the Customers Table:

SELECT O.*
FROM  Customers C 
		RIGHT OUTER JOIN Orders O
			ON O.CustomerId = C.CustomerId
WHERE C.CustomerId IS NULL

RESULT:
OrderId CustomerId OrderDate
———– ———– ———————–
200 4 2014-01-31 23:48:32.853

4. FULL OUTER JOIN in Sql Server

It returns all the rows from both the tables, if there is no matching row in either of the sides then it displays NULL values in the result for that table columns in such rows.

Full Outer Join = Left Outer Join + Right Outer Join

Demo 1: As per the data in our Demo tables the Customer with CustomerId 2 doesn’t have order in the Orders table. So in the result of FULL Outer join between Customers and Orders table on the CustomerId column will have NULL values for the Orders table columns for the Customer with CustomerId 2.

And for the Order with OrderId 200 having CustomerId 4 doesn’t have a matching record in the customer table with CustomerId 4. So in the result of FULL Outer join between Customers and Orders table on the CustomerId column will have NULL values for the Customers table columns for the Order with OrderId 200.

SELECT *
	FROM Customers C
			FULL OUTER JOIN Orders O
				ON O.CustomerId = C.CustomerId

RESULT:
FULL OUTER JOIN

Demo 2: Below query demonstrates how to get the list of all the Customers without Orders and also the Orders which doesn’t have corresponding customer in the Customers Table.

SELECT *
	FROM Customers C
			FULL OUTER JOIN Orders O
				ON O.CustomerId = C.CustomerId
WHERE C.CustomerId IS NULL OR O.OrderId IS NULL

RESULT:
FULL OUTER JOINDemo2

5. CROSS JOIN in Sql Server

Cross join is also referred to as Cartesian Product. For every row in the LEFT Table of the CROSS JOIN all the rows from the RIGHT table are returned and Vice-Versa (i.e.result will have the Cartesian product of the rows from join tables).

No.of Rows in the Result of CRoss Join = (No. of Rows in LEFT Table) * (No. of Rows in RIGHT Table)

SELECT *
FROM Customers C
		CROSS JOIN Orders O

RESULT:
CROSS JOIN

6. SELF JOIN in Sql Server

If a Table is joined to itself using one of the join types explained above, then such a type of join is called SELF JOIN.

To demo this join let us create an Employee table with data as depicted in the below image by the following script:

SELF JOIN

CREATE TABLE Employee
(EmployeeId INT, Name NVARCHAR(50), ManagerId INT)
GO
INSERT INTO Employee VALUES(1,'Shree',1)
INSERT INTO Employee VALUES(2,'Kalpana',1)
INSERT INTO Employee VALUES(3,'Basavaraj',2) 
INSERT INTO Employee VALUES(4,'Monty',2) 
GO

Demo 1: Now if we need to get the name of the Employee and his Manager name for each employee in the Employee Table. Then we have to Join Employee Table to itself as Employee and his Manager data is present in this table only as shown in the below query:

SELECT E.EmployeeId, 
       E.Name 'Employee Name', M.Name 'Manager Name' 
FROM dbo.Employee E 
		INNER JOIN Employee M
			ON M.EmployeeId = E.ManagerId

RESULT:
SELF JOIN RESULT

[ALSO READ] Joining Two Tables without any Common Column between them

23 thoughts on “Joins In Sql Server

  1. nice blog and post, but i have a question, when i have a mutiple joins ( inner, right or left) in the same query, which is the “right “or “left”table?
    Ex.:

    select t1.a, t2.b,t3.c,t4.d
    from t1
    join t2
    on t1.id = t2.id
    left join t.3
    on t2.id = t3.id
    right join t4
    on t3.id = t4.id

    in my first inner i know wich is my left(t1) or right(t2) table, but on the next left join my “left table” is the result of the first inner join? or just t1? or just t2 ?

    can you help me pls ?
    thanks.

        1. Hi Santosh,

          Will try to write it at the earliest. For this month plan is to write only the Sql Server 2016 articles.

          Thanks,
          Basavaraj

  2. That’s the best explanation for JOIN types I’ve found on the internet, thanks for much! Made my life easier!

Leave a Reply to arun Cancel reply

Your email address will not be published. Required fields are marked *