One of the areas I feel I need to brush up on are joins. I know they “join” tables together, but exactly how and why I’m not sure. So I set about to do some testing to learn.
First some setup…
-- create department table CREATE TABLE department ( departmentid number(5) NOT NULL, departmentname varchar(20), CONSTRAINT PK_dptid PRIMARY KEY (departmentid) );
-- create employee table CREATE TABLE employee ( lastname VARCHAR2(20) NOT NULL , departmentid NUMBER(5), CONSTRAINT FK_DEPTID FOREIGN KEY (departmentid) REFERENCES department(departmentid) ON DELETE CASCADE);
-- Insert data into DEPARTMERNT table insert into department values (31,'sales'); insert into department values (33,'engineering'); insert into department values (34,'clerical'); insert into department values (35,'marketing');
-- Insert data into EMPLOYEE table insert into employee values ('rafferty',31); insert into employee values ('jones',33); insert into employee values ('steinberg',33); insert into employee values ('robinson',34); insert into employee values ('smith',34); insert into employee values ('jasper',NULL);
Now for some testing.
If you query the employee table by itself you will get the employee name and a department number. The number by itself is not very helpful or user friendly. However all the department names are in the department table not the employee table. I assume this would be done to conserve space and improve performance?
Anyway, to get a more user friendly report you have to join the employee table and the department tables.
The INNER JOIN below will display all rows that have a matching department.
select lastname, departmentname from employee inner join department on employee.departmentid = department.departmentid;
Note however that it does not display employees without a department or departments without employees.
To do that you have to do either,
a LEFT OUTER JOIN to display employees without a department
select lastname, departmentname from employee left outer join department on employee.departmentid = department.departmentid;
a RIGHT OUT JOIN to display departments without employees,
select lastname, departmentname from employee right outer join department on employee.departmentid = department.departmentid;
or a FULL OUTER JOIN to display departments without employees and employees without departments
select lastname, departmentname from employee FULL outer join department on employee.departmentid = department.departmentid;
The LEFT and RIGHT of the OUTER JOINs come from the fact that employee is on the LEFT hand side of the JOIN statement and department is on the RIGHT hand side. I always wondered what the LEFT and RIGHT meant! Now I know.
Most of this information come thanks of http://en.wikipedia.org/wiki/Join_(SQL) and some testing of my own.