SQL SERVER – Introduction to JOINs – Basic of JOINs

The launch of Gandhinagar SQL Server User Group was a tremendous, astonishing success! It was overwhelming to see a large gathering of enthusiasts looking up to me (I was the Key Speaker) eager to enhance their knowledge and participate in some brainstorming discussions. Some members of User Group had requested me to write a simple article on JOINS elucidating its different types.

INNER JOIN

This join returns rows when there is at least one match in both the tables.
SQL SERVER - Introduction to JOINs - Basic of JOINs inner join

OUTER JOIN

There are three different Outer Join methods.

LEFT OUTER JOIN
This join returns all the rows from the left table in conjunction with the matching rows from the right table. If there are no columns matching in the right table, it returns NULL values.
SQL SERVER - Introduction to JOINs - Basic of JOINs left join

RIGHT OUTER JOIN
This join returns all the rows from the right table in conjunction with the matching rows from the left table. If there are no columns matching in the left table, it returns NULL values.
SQL SERVER - Introduction to JOINs - Basic of JOINs right join

FULL OUTER JOIN
This join combines left outer join and right outer join. It returns row from either table when the conditions are met and returns null value when there is no match.
SQL SERVER - Introduction to JOINs - Basic of JOINs outer join

CROSS JOIN

This join is a Cartesian join that does not necessitate any condition to join. The resultset contains records that are multiplication of record number from both the tables.

SQL SERVER - Introduction to JOINs - Basic of JOINs cross join - half

Additional Notes related to JOIN:

The following are three classic examples to display where Outer Join is useful. You will notice several instances where developers write query as given below.

SELECT t1.*
FROM Table1 t1
WHERE t1.ID NOT IN (SELECT t2.ID FROM Table2 t2)
GO

The query demonstrated above can be easily replaced by Outer Join. Indeed, replacing it by Outer Join is the best practice. The query that gives same result as above is displayed here using Outer Join and WHERE clause in join.

/* LEFT JOIN - WHERE NULL */
SELECT t1.*,t2.*
FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.ID = t2.ID
WHERE t2.ID IS NULL

SQL SERVER - Introduction to JOINs - Basic of JOINs left join null

The above example can also be created using Right Outer Join.

SQL SERVER - Introduction to JOINs - Basic of JOINs right join null

NOT INNER JOIN
Remember, the term Not Inner Join does not exist in database terminology. However, when full Outer Join is used along with WHERE condition, as explained in the above two examples, it will give you exclusive result to Inner Join. This join will give all the results that were not present in Inner Join.

SQL SERVER - Introduction to JOINs - Basic of JOINs outer join null

You can download the complete SQL Script here, but for the sake of complicity I am including the same script here.

USE AdventureWorks
GO
CREATE TABLE table1
(ID INT, Value VARCHAR(10))
INSERT INTO Table1 (ID, Value)
SELECT 1,'First'
UNION ALL
SELECT 2,'Second'
UNION ALL
SELECT 3,'Third'
UNION ALL
SELECT 4,'Fourth'
UNION ALL
SELECT 5,'Fifth'
GO
CREATE TABLE table2
(ID INT, Value VARCHAR(10))
INSERT INTO Table2 (ID, Value)
SELECT 1,'First'
UNION ALL
SELECT 2,'Second'
UNION ALL
SELECT 3,'Third'
UNION ALL
SELECT 6,'Sixth'
UNION ALL
SELECT 7,'Seventh'
UNION ALL
SELECT 8,'Eighth'
GO
SELECT *
FROM Table1
SELECT *
FROM Table2
GO
USE AdventureWorks
GO
/* INNER JOIN */
SELECT t1.*,t2.*
FROM Table1 t1
INNER JOIN Table2 t2 ON t1.ID = t2.ID
GO
/* LEFT JOIN */
SELECT t1.*,t2.*
FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.ID = t2.ID
GO
/* RIGHT JOIN */
SELECT t1.*,t2.*
FROM Table1 t1
RIGHT JOIN Table2 t2 ON t1.ID = t2.ID
GO
/* OUTER JOIN */
SELECT t1.*,t2.*
FROM Table1 t1
FULL OUTER JOIN Table2 t2 ON t1.ID = t2.ID
GO
/* LEFT JOIN - WHERE NULL */
SELECT t1.*,t2.*
FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.ID = t2.ID
WHERE t2.ID IS NULL
GO
/* RIGHT JOIN - WHERE NULL */
SELECT t1.*,t2.*
FROM Table1 t1
RIGHT JOIN Table2 t2 ON t1.ID = t2.ID
WHERE t1.ID IS NULL
GO
/* OUTER JOIN - WHERE NULL */
SELECT t1.*,t2.*
FROM Table1 t1
FULL OUTER JOIN Table2 t2 ON t1.ID = t2.ID
WHERE t1.ID IS NULL OR t2.ID IS NULL
GO
/* CROSS JOIN */
SELECT t1.*,t2.*
FROM Table1 t1
CROSS JOIN Table2 t2
GO
DROP TABLE table1
DROP TABLE table2
GO

I hope this article fulfills its purpose. I would like to have feedback from my blog readers. Please suggest me where do you all want me to take this article next.

Reference : Pinal Dave (https://blog.sqlauthority.com)

Best Practices, Database, SQL Joins, SQL Scripts, SQL User Group
Previous Post
SQL SERVER – FIX : ERROR : The SQL Server System Configuration Checker cannot be executed due to WMI configuration on the machine Error:2147749896 (0×80041008)
Next Post
SQL SERVER – Check if Current Login is Part of Server Role Member

Related Posts

402 Comments. Leave new

  • Thank You Very Much
    This is a VeryGood Artical on Joins

    Reply
  • Firstly thanks..
    Very useful and worth article to study and easy to understand.
    Hope more articles from u….

    Reply
  • article is simple but excellent

    Thank You

    Reply
  • Excellent Post !!

    I love the way u used Venn Diagrams to explain the JOINS.

    Reply
  • Thank you – your examples of queries that can be replaced by joins – and going from a venn representation of one’s query to the corresponding sql was very helpful.

    Reply
  • Amarnath Madhavan
    June 19, 2009 4:22 pm

    Hi Sir

    Can you please describe about the SELF JOIN i was questioned in one interview,where they asked the functinality of SELF JOIN with example.

    Regards
    Amarnath

    Reply
  • Excellent!
    Wonderful !

    Reply
  • This is EXCELLENT !
    BRAVO !

    Yaar ! You sense of Explanation is Amazing

    :)

    K.K.B

    Reply
  • superb article on joins… best ever explanation…

    Reply
  • First Time i have cleared my concept.

    A lots of thanks with best wishes.

    Reply
  • Amir Abdullah
    July 17, 2009 1:27 pm

    Really Excellent Post !! Please post these kinds of Articles usually and help the devlopers….

    Reply
  • Patrick from Germany
    July 17, 2009 7:49 pm

    Thank you for your article ! I bookmarked it on my browser.

    Reply
  • Narendra kalavadiya
    July 22, 2009 10:25 pm

    Amazing any one can understand only one sight , today i visualize use of joins
    thanks

    Reply
  • devendar rao marru
    August 14, 2009 4:30 pm

    very good one for beginner

    Reply
  • Really very good article !! I cleared my doubts about joins..!!! Thanks a lot ..

    Reply
  • select x1.itemname as ‘equipment name’,
    x2.itemname as ‘wbs’
    from jnameditem
    join jnameditem x1 on jequipmentocc.oid=x1.oid
    join jnameditem x2 on x2.oid=xbelongstoproject.oidorigin

    i am getting multipart identifier cannot be bound error for this query …can anyone help??

    Reply
  • Noel Stefan Stoyanoff
    August 25, 2009 2:00 am

    Hi Pinal,

    I have a question concerning a statement you made above where rather than writing a query as

    SELECT t1.*
    FROM Table1 t1
    WHERE t1.ID NOT IN (SELECT t2.ID FROM Table2 t2)

    I should write it as

    SELECT t1.*,t2.*
    FROM Table1 t1
    LEFT JOIN Table2 t2 ON t1.ID = t2.ID
    WHERE t2.ID IS NULL

    as it is a best practice. Does this mean that the later statement will run more quickly than the former or are you calling it a best practice from a legibility stand point?

    The reason I am asking is I tend to use my WHERE clause for the main table and put my other filter conditions on my INNER JOINs for example:

    SELECT *
    FROM customers c
    INNER JOIN sales s ON c.id = s.id AND YEAR(s.date) = 2009
    WHERE c.country = ‘USA’

    I find more legible than:

    SELECT *
    FROM customers c
    INNER JOIN sales s ON c.id = s.id
    WHERE c.country = ‘USA’ AND YEAR(s.date) = 2009

    and I feel the same about

    SELECT t1.*
    FROM Table1 t1
    WHERE t1.ID NOT IN (SELECT t2.ID FROM Table2 t2)

    as I can see everything in fail swoop and I don’t have to look at several places.

    Naturally we are all artists and there is always a personal preference, but when it comes to speed, that takes precedence over everything!! :-)

    Love the site and am becoming a huge fan, thank you for being there for us. Peace!

    Reply
  • Very nice article. I could refresh my skills about joins quickly as i lost touch to SQL.

    Reply
  • very nice article indeed. thanks for helping and sharing :)

    Reply
  • Shashidhar Vajramatti
    September 22, 2009 2:30 am

    Good one Pinal.
    Was wondering if you have something on optimizing the joins.

    Reply

Leave a Reply