NiC IT Academy

SQL Tutorial – Day – 06

Published On: 18 September 2024

Last Updated: 18 September 2024

No Responses

Joins in Oracle:
================

Equi join – An equi join is a type of join that combines tables
based on matching values in specified columns. =

Non-Equi join – The nonequijoins is such a join which match column
values from different tables based on an inequality
(instead of the equal sign like >, <, >=, <= ) expression

4 Types of Equi join:
=====================

Inner Join
Left Outer join
Right Outer Join
Full Outer Join

2 methods to write join query:
==============================

1. Implicit method
2. ANSI Method

Table scripts for practice:
***************************

create table customer
(
cust_id number,
cust_name varchar2(50),
mob_no number(10),
email varchar2(50),
country_id number(3)
);

Insert into customer (CUST_ID,CUST_NAME,MOB_NO,EMAIL,COUNTRY_ID) values (1000,’Kannan’,8989898989,’kannan@gmail.com’,200);
Insert into customer (CUST_ID,CUST_NAME,MOB_NO,EMAIL,COUNTRY_ID) values (1001,’Arun’,8989898990,’arun@gmail.com’,204);
Insert into customer (CUST_ID,CUST_NAME,MOB_NO,EMAIL,COUNTRY_ID) values (1002,’Karthik’,8989898991,’Karthik@gmail.com’,202);
Insert into customer (CUST_ID,CUST_NAME,MOB_NO,EMAIL,COUNTRY_ID) values (1003,’Shankar’,8989898992,’shankar@gmail.com’,203);
Insert into customer (CUST_ID,CUST_NAME,MOB_NO,EMAIL,COUNTRY_ID) values (1004,’Sree’,8989898993,’Sree@gmail.com’,205);
Insert into customer (CUST_ID,CUST_NAME,MOB_NO,EMAIL,COUNTRY_ID) values (1005,’Babu’,8989898994,’Babu@gmail.com’,200);
Insert into customer (CUST_ID,CUST_NAME,MOB_NO,EMAIL,COUNTRY_ID) values (1006,’Radha’,8989898995,’Radha@gmail.com’,202);
Insert into customer (CUST_ID,CUST_NAME,MOB_NO,EMAIL,COUNTRY_ID) values (1007,’Senthil’,8989898996,’Senthil@gmail.com’,200);

commit;

create table country
(
Country_id number(3),
Country_name varchar2(50)
);

Insert into country (COUNTRY_ID,COUNTRY_NAME) values (200,’INDIA’);
Insert into country (COUNTRY_ID,COUNTRY_NAME) values (201,’CHINA’);
Insert into country (COUNTRY_ID,COUNTRY_NAME) values (202,’USA’);
Insert into country (COUNTRY_ID,COUNTRY_NAME) values (203,’SINGAPORE’);
Insert into country (COUNTRY_ID,COUNTRY_NAME) values (204,’UK’);

commit;

============================================

Inner Join:
————

— implicit method

select
c.cust_id,
c.cust_name,
c.mob_no,
c.email,
c.country_id,
r.country_name
from customer c, country r
where c.country_id=r.country_id;

Inner Join:
————
— ANSI Method

select
c.cust_id,
c.cust_name,
c.mob_no,
c.email,
c.country_id,
r.country_name
from customer c inner join country r
on c.country_id=r.country_id;

*******************************************************

Left Outer Join:
————
— implicit

select
c.cust_id,
c.cust_name,
c.mob_no,
c.email,
c.country_id,
r.country_name
from customer c, country r
where c.country_id=r.country_id(+);

Left Outer Join:
————
— ANSI

select
c.cust_id,
c.cust_name,
c.mob_no,
c.email,
c.country_id,
r.country_name
from customer c Left Outer join country r
on c.country_id=r.country_id;

***************************************************************

Right Outer Join:
————
— implicit

select
c.cust_id,
c.cust_name,
c.mob_no,
c.email,
c.country_id,
r.country_name
from customer c, country r
where c.country_id(+)=r.country_id;

Right Outer Join:
————
— ANSI

select
c.cust_id,
c.cust_name,
c.mob_no,
c.email,
c.country_id,
r.country_name
from customer c Right Outer join country r
on c.country_id=r.country_id;

*****************************************************

Full Outer Join:

— implicit method

select
c.cust_id,
c.cust_name,
c.mob_no,
c.email,
c.country_id,
r.country_name
from customer c, country r
where c.country_id=r.country_id(+)
union
select
c.cust_id,
c.cust_name,
c.mob_no,
c.email,
c.country_id,
r.country_name
from customer c, country r
where c.country_id(+)=r.country_id;

————
— ANSI

select
c.cust_id,
c.cust_name,
c.mob_no,
c.email,
c.country_id,
r.country_name
from customer c Full Outer join country r
on c.country_id=r.country_id;

*********************************************************

3 tables — customer city country

select
c1.cust_id,
c1.cust_name,
c1.mob_no,
c1.email,
c1.city_id,
c2.city_name,
c2.country_id country_id,
c3.country_name
from customer c1,city c2, country c3
where c1.city_id=c2.city_id
and c2.country_id=c3.country_id;

 

select
c1.cust_id,
c1.cust_name,
c1.mob_no,
c1.email,
c1.city_id,
c2.city_name,
c2.country_id country_id,
c3.country_name
from customer c1 inner join city c2
on c1.city_id=c2.city_id
inner join country c3
on c2.country_id=c3.country_id;

*************************************************************
— 2 tables join

select * from employees;

select * from departments;

select
e.employee_id,
e.first_name,
e.email,
e.SALARY,
e.department_id,
d.DEPARTMENT_NAME,
d.LOCATION_ID
from Employees e,departments d
where e.department_id=d.department_id;

select
e.employee_id,
e.first_name,
e.email,
e.SALARY,
e.department_id,
d.DEPARTMENT_NAME,
d.LOCATION_ID
from employees e inner join DEPARTMENTS d
on e.department_id=d.department_id;

— Left Outer Join

select
e.employee_id,
e.first_name,
e.job_id,
e.salary,
e.department_id,
d.DEPARTMENT_NAME
from employees e, departments d
where e.department_id=d.department_id(+);

select
e.employee_id,
e.first_name,
e.job_id,
e.salary,
e.department_id,
d.DEPARTMENT_NAME
from employees e left join departments d
on e.department_id=d.department_id;

—————————————————-

— Right outer join

select
e.employee_id,
e.first_name,
e.job_id,
e.salary,
d.department_id,
d.DEPARTMENT_NAME
from employees e, departments d
where e.department_id(+)=d.department_id;

select
e.employee_id,
e.first_name,
e.job_id,
e.salary,
e.department_id,
d.DEPARTMENT_NAME
from employees e right join departments d
on e.department_id=d.department_id;

— Full Outer Join

select
e.employee_id,
e.first_name,
e.job_id,
e.salary,
e.department_id,
d.DEPARTMENT_NAME
from employees e full join departments d
on e.department_id=d.department_id;

********************************************************************************

select the departmets where no employees are working

select
d.department_id,
d.DEPARTMENT_NAME
from employees e, departments d
where e.department_id(+)=d.department_id and e.employee_id is null;

================================================================================

3 tables join

select * from locations;

select
e.employee_id,
e.first_name,
e.job_id,
e.salary,
e.department_id,
d.DEPARTMENT_NAME,
d.location_id,
l.street_address,
l.city,
l.country_id
from employees e,departments d,locations l
where e.department_id=d.department_id
and d.location_id=l.location_id;

select
e.employee_id,
e.first_name,
e.job_id,
e.salary,
e.department_id,
d.DEPARTMENT_NAME,
d.location_id,
l.country_id
from employees e inner join departments d
on e.department_id=d.department_id
inner join locations l
on d.location_id=l.location_id;

 

select
e.employee_id,
e.first_name,
e.job_id,
e.salary,
e.department_id,
d.DEPARTMENT_NAME,
d.location_id,
l.country_id,
c.COUNTRY_NAME
from employees e inner join departments d
on e.department_id=d.department_id
inner join locations l
on d.location_id=l.location_id
inner join COUNTRIES c on l.COUNTRY_ID=c.COUNTRY_ID
where l.country_id=’CA’ and e.salary >10000;

——————————————–
4 tables join with sub query:
=============================
select
e.employee_id,
e.first_name,
e.job_id,
e.salary,
e.department_id,
d.DEPARTMENT_NAME,
d.location_id,
l.country_id,
c.country_name
from employees e inner join (select department_id,department_name,location_id from departments) d
on e.department_id=d.department_id
join locations l
on d.location_id=l.location_id
join countries c
on l.country_id=c.country_id where c.country_name=’United Kingdom’ and e.salary >10000;

— 5 tables Implicit joins

select
e.employee_id,
e.first_name,
e.job_id,
e.salary,
case when salary >10000 then ‘High salary’ else ‘Low Salary’ end salary_status,
e.department_id,
d.DEPARTMENT_NAME,
d.location_id,
l.country_id,
c.country_name,
j.job_title
from employees e, (select department_id,department_name,location_id from departments) d, locations l, countries c,jobs j
where e.department_id=d.department_id
and d.location_id=l.location_id
and l.country_id=c.country_id
and e.job_id=j.job_id and l.country_id in (‘UK’,’CA’) and e.job_id=’SA_REP’;

— 5 tables ANSI joins

select
e.employee_id,
e.first_name,
e.job_id,
e.salary,
case when salary >10000 then ‘High salary’ else ‘Low Salary’ end salary_status,
e.department_id,
d.DEPARTMENT_NAME,
d.location_id,
l.country_id,
c.country_name,
j.job_title
from employees e inner join (select department_id,department_name,location_id from departments) d
on e.department_id=d.department_id
join locations l
on d.location_id=l.location_id
join countries c
on l.country_id=c.country_id
join jobs j
on e.job_id=j.job_id
where l.country_id in (‘UK’,’CA’) and e.job_id=’SA_REP’;

select
e.employee_id,
e.first_name,
e.job_id,
e.salary,
case when salary >10000 then ‘High salary’ else ‘Low Salary’ end salary_status,
e.department_id,
d.DEPARTMENT_NAME,
d.location_id,
l.country_id,
c.country_name,
j.job_title
from employees e inner join (select department_id,department_name,location_id from departments) d
on e.department_id=d.department_id
join locations l
on d.location_id=l.location_id
join countries c
on l.country_id=c.country_id
join jobs j
on e.job_id=j.job_id
where e.job_id like ‘%CLERK’ and upper(c.country_name) like ‘%UNITED%’;

 

https://stackoverflow.com/questions/16263652/multiple-table-join-query-with-count-in-oracle-sql

——————————————————————————–

–Cross Join or Cartesian product

select * from departments;
select
e.employee_id,
e.first_name,
e.email,
e.SALARY,
e.department_id,
d.DEPARTMENT_NAME,
d.LOCATION_ID
from employees e, departments d
–where e.department_id=d.department_id;

107*27=2889

——————————————————————————–
self Join

select * from employees;

select
e1.employee_id,
e1.first_name,
‘reports to’,
e2.employee_id,
e2.first_name
from employees e1,employees e2
where e1.manager_id=e2.employee_id order by e1.employee_id;

——————————————————————–

–Non-Equi Join

select
e.employee_id,
e.first_name,
e.email,
e.SALARY,
e.department_id,
d.DEPARTMENT_NAME,
d.LOCATION_ID
from employees e, departments d
where e.department_id!=d.department_id;

 

——————————————————————–
Join with USING clause

SELECT employee_id,first_name,job_title,
department_name, city
FROM employees
INNER JOIN departments USING (department_id)
INNER JOIN locations USING (location_id)
INNER JOIN jobs USING (job_id)
ORDER BY 1;

——————————————————————-

 

Loading

Leave a Reply

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

Login with your email & password

Sign up with your email & password

Signup/Registration Form

Registred Email:

- Not Updated -

Set/Update Password