Multiple Tables
Multiple Tables
Multiple Tables
Multiple Tables
Chapter 4
1
Objectives
Lesson Aim
This lesson covers how to obtain data from more than one table, using the
different methods available.
2
Cartesian Product
• A Cartesian product is formed when:
• A join condition is omitted
• A join condition is invalid
• All rows in the first table are joined to
all rows in the second table
3
Generating a Cartesian Product
ENAME DNAME
BLAKE ACCOUNTING
SMITH ACCOUNTING
ALLEN ACCOUNTING
56 Rows Selected
4
What Is a Join?
Use a join to query data from more than one table.
Old Syntax
ANSI Syntax
Prefix the column name with the table name when the same column name appears
in more than one table.
Defining Joins
When data from more than one table in the database is required, a join condition
is used. Rows in one table can be joined to rows in another table according to
common values existing in corresponding columns, that is, usually primary and
foreign key columns.
TO display data from two or more related tables, write a simple join condition in
the WHERE clause, in the syntax:
Table1.column1 denotes the table and column from which data is retrieved
Table1. column1 = table2. column2 is the condition that joins (or relates) the
tables together.
5
Types of Joins
• Equijoin
• Non-equijoin
• Outer join
• Self join
6
Types of Joins
There are two main types of join conditions:
• Equijoins
• Non-equijoins
Note: Set operators are not covered in this course . They are covered in another
SQL course.
7
What Is an Equijoin?
Equijoins
To determine the name of an employee’s department, you compare the value in
the DEPTNO column in the EMP table with the DEPTNO values in the DEPT
table.
The relationship between the EMP and DEPT table is an equijoin - that is,
values in the DEPTNO column on both tables must be equal.
Frequently, this type of join involves primary and foreign key complements.
Sometimes you need to use data from more than one table. In the slide example,
the report displays data from two separate tables.
To prodııce the report. you need to link EMP and DEPT tables and access data
from both of them.
8
ANSI Syntax
on e.deptno = d.deptno;
9
Retrieving Records with Equijoins
SELECT EMP.EMPNO, EMP.ENAME, EMP.DEPTNO,
DEPT.DEPTNO, DEPT.LOC
14 rows selected.
10
Oualifying Ambiguous Column Names
Use table prefixes to qualify column names that are in multiple tables.
Improve performance by using table prefixes.
Distinguish columns that have identical names but reside in different
tables by using column aliases.
If there are no common column names between the two tables, there is no need
to qualify the columns. Howevwr, you will gain improved performance by using
the table prefix because you tell the Oracle Server exactly where to find the
columns.
11
EQUIJOIN
14 rows selected.
12
Using Table Aliases
The following two scripts are equivalent. In the second one table aliases are used.
14 rows selected.
13
Additional Search Conditions
Using the AND Operator
DEPT.DEPTNO, DEPT.LOC
14
ANSI Ssyntax
ORACLE’da Inner Join ‘i yapan
yerine
ON e.deptno = d.deptno
koşulu yazılır.
Eğer, ayrıca satırlardan yeni süzme yapılacaksa WHERE ile istenen koşul konulabilir:
Örnek
SELECT e.empno, e.ename, e.deptno, d.deptno, d.loc
ON e.deptno = d.deptno
15
Non-Equijoins
The relationship between the EMP table and the SALGRADE table is a non-equijoin,
meaning that no column in the EMP table corresponds directly to a column in the
SALGRADE table.
The relationship between the two tables is that the SAL column in the EMP table is between
the LOSAL and HISAL column of the SALGRADE table.
SELECT *
FROM emp ;
14 rows selected.
SELECT *
FROM salgrade ;
GRADE LOSAL HISAL
1 700 1200
2 1201 1400
3 1401 2000
4 2001 3000
5 3001 9999
5 rows selected.
16
Retreive records where Salary in the EMP table is between low salary and high
salary in the SALGRADE table.
WHERE e.sal
14 rows selected.
17
ANSI Syntax
14 rows selected.
18
Joining More Than Two Tables
14 rows selected.
19
ANSI Syntax
14 rows selected.
20
Retrieving Records with Non-Equijoins
SELECT e.ename, e.sal, s.grade
FROM EMP e, SALGRADE s
WHERE e.sal +e.comm > s.hisal
ENAME SAL GRADE
TURNER 1500 1
WARD 1250 1
ALLEN 1600 1
MARTIN 1250 1
TURNER 1500 2
WARD 1250 2
ALLEN 1600 2
MARTIN 1250 2
MARTIN 1250 3
9 rows selected.
Non-Equijoins (continued)
The slide example creates a non-equijoin to evaluate an employee's salary grade. The salary
must be between any pair of the low and high salary ranges.
It is important to note that all employees appear exactly once when this query is
executed. No employee is repeated in the list. There are two reasons for this:
None of the rows in the salary grade table contain grades that overlap. That is, the
salary value for an employee can only lie between the low salary and high salary
values of one of the rows in the salary grade table.
All of the employees' salaries lie within the limits provided by the salary grade table.
That is, no employee earns less than the lowest value contained in the LOSAL column or
more than the highest value contained in the HISAL column.
Note: Other operators such as <= and >= could be used, but BETWEEN is the simplest.
Remember to specify the low value first and the high value last when using BETWEEN.
Table aliases have been specified for performance reasons, not because of possible ambiguity.
21
ANSI Syntax (Non Equijoin)
9 rows selected.
22
Outer joins
When two tables are joined with an inner join, data will only be returned if
matching data exists in both tables. An outer join is like saying "and also include
the rows from one table if there are no matching rows in the other one."
With an outer join the columns from the table where data is "missing" are
returned as NULL values.
Outer joins come in two basic flavours, called Left and Right. Left outer joins
mean that the data must be contained in the table defined to the left side of the
equivalence, but not necessarily the right hand side. Right outer joins, of course,
work the other way around.
To illustrate this, cut and paste the code below into a Query Analyser window
and try running it. I have used the newer ANSI syntax here, and the older
equivalents are included but commented out using the "--" comment notation.
Comment them back in if you want to try them.
23
Outer Joins
Returning Records with No Direct Match with Outer Joins
If a row does not satisfy a join condition, the row will not appear in the query
result. For example, in the equijoin condition of EMP and DEPT tables,
department OPERATIONS does not appear because no one works in that
department.
14 rows selected.
24
Outer Joins
If a row does not satisfy a join condition, the row will not appear in the query
result. For example, in the equijoin condition of EMP and DEPT tables,
department OPERATIONS does not appear because no one works in that
department.
In the condition that joins (or relates) the lables together, is the outer join
symbol, which can be placed on either side of the WHERE clause condition, but
not on both sides (Place the outer join symbol following the name of the column
in the table without the matching rows.)
25
Old Usage
15 rows selected.
26
ANSI Right Outer Join Syntax
15 rows selected.
27
ANSI Left Outer Join Syntax
14 rows selected.
28
Old usage
14 rows selected.
29
OUTER JOIN
Previously, we had looked at left join, or inner join, where we select rows common to the
participating tables to a join. What about the cases where we are interested in selecting
elements in a table regardless of whether they are present in the second table? We will now
need to use the SQL OUTER JOIN command.
The syntax for performing an outer join in SQL is database-dependent. For example, in
Oracle, we will place an "(+)" in the WHERE clause on the other side of the table for which
we want to include all the rows.
Table Store_Information
Table Geography
region_name store_name
East Boston
East New York
West Los Angeles
West San Diego
and we want to find out the sales amount for all of the stores. If we do a regular join, we will
not be able to get what we want because we will have missed "New York," since it does not
appear in the Store_Information table. Therefore, we need to perform an outer join on the
two tables above:
30
OUTER JOIN
Note that in this case, we are using the Oracle syntax for outer join.
Result:
store_name SALES
Boston $700
New York
Los Angeles $1800
San Diego $250
Note: NULL is returned when there is no match on the second table. In this case, "New York"
does not appear in the table Store_Information, thus its corresponding "SALES" column is
NULL.
31
ORDER BY usage in OUTER JOIN
SELECT e.ename, d.DEPTNO, d.dname
FROM emp e, dept d
WHERE e.deptno(+) = d.deptno
ORDER BY e.deptno;
ENAME DEPTNO DNAME
ALLEN 30 SALES
WARD 30 SALES
40 OPERATIONS
15 rows selected.
32
ANSI Syntax for OUTER JOIN
15 rows selected.
33
Using Outer Joins
15 rows selected.
34
Joining a Table to Itself
SQL JOIN
Now we want to look at joins. To do joins correctly in SQL requires many of the elements we
have introduced so far. Let's assume that we have the following two tables,
Table Store_Information
Table Geography
region_name store_name
East Boston
East New York
West Los Angeles
West San Diego
and we want to find out sales by region. We see that table Geography includes information on
regions and stores, and table Store_Information contains sales information for each store. To
get the sales information by region, we have to combine the information from the two tables.
Examining the two tables, we find that they are linked via the common field, "store_name".
We will first present the SQL statement and explain the use of each segment later:
35
Joining a Table to Itself
Result:
REGION SALES
East $700
West $2050
The first two lines tell SQL to select two fields, the first one is the field "region_name" from
table Geography (aliased as REGION), and the second one is the sum of the field "Sales"
from table Store_Information (aliased as SALES). Notice how the table aliases are used here:
Geography is aliased as A1, and Store_Information is aliased as A2. Without the aliasing, the
first line would become
SUM(Store_Information.Sales) SALES
which is much more cumbersome. In essence, table aliases make the entire SQL statement
easier to understand, especially when multiple tables are included.
Next, we turn our attention to line 3, the WHERE statement. This is where the condition of
the join is specified. In this case, we want to make sure that the content in "store_name" in
table Geography matches that in table Store_Information, and the way to do it is to set them
equal. This WHERE statement is essential in making sure you get the correct output. Without
the correct WHERE statement, a Cartesian Join will result. Cartesian joins will result in the
query returning every possible combination of the two (or whatever the number of tables in
the FROM statement) tables. In this case, a Cartesian join would result in a total of 4 x 4 = 16
rows being returned.
36
Self Joins
13 rows selected.
37
Self Joins
13 rows selected.
38
ANSI Syntax for SELF JOIN
13 rows selected.
39
SELF JOINS
WORKER.ENAME||'WORKSFOR'||MANAGER.ENAME
SMITHworks for FORD
ALLENworks for BLAKE
WARDworks for BLAKE
JONESworks for KING
MARTINworks for BLAKE
BLAKEworks for KING
CLARKworks for KING
SCOTTworks for JONES
TURNERworks for BLAKE
ADAMSworks for SCOTT
JAMESworks for BLAKE
FORDworks for JONES
MILLERworks for CLARK
13 rows selected.
The slide example joins the EMP table to itself. To simulate two tables in the
FROM clause, there are two aliases, namely WORKER and MANAGER, for
the same table EMP.
In this example, the WHERE clause contains the join that means ''where a
worker's manager number matches the employee number for the manager.
40
ANSI syntax for SELF JOINS
WORKER.ENAME||'WORKSFOR'||MANAGER.ENAME
SMITHworks for FORD
ALLENworks for BLAKE
WARDworks for BLAKE
JONESworks for KING
MARTINworks for BLAKE
BLAKEworks for KING
CLARKworks for KING
SCOTTworks for JONES
TURNERworks for BLAKE
ADAMSworks for SCOTT
JAMESworks for BLAKE
FORDworks for JONES
MILLERworks for CLARK
13 rows selected.
41
Self Joins
13 rows selected.
Sometimes you need to join a table to itself. To find the name of each
employee's manager, you need to join the EMP table to itself, or perform a self
join. For example, to find the name of Blake's manager, you need to:
In this process, you look in the table twice. The first time you look in the table to
find Blake in the ENAME column and MGR value of 7839. The second time you
look in the EMPNO column to find 7839 and the ENAME column to find King
42
Summary
SELECT tablel. Column , table2. column
FROM tablel , table2
WHERE tablel. columnl = table2. column2;
• Equijoin
• Non-equijoin
• Outer join
• Self join
Summary
There are multiple ways to join tables. The common thread, though, is that you
want to link them through a condition in the WHERE clause. The method you
choose will be based on the required result and the data structures that you are
using.
43
Exercices
Solution 1
SELECT e.ename, e.deptno, d.dname
FROM emp e , dept d
WHERE e.deptno = d.deptno ;
Solution 2
SELECT e.job, d.loc
FROM emp e , dept d
WHERE e.deptno = d.deptno
AND e.deptno = 30;
Solution 3
SELECT e.ename, d.dname, d.loc
FROM emp e , dept d
WHERE comm IS NOT NULL
AND e.deptno = d.deptno ;
Solution 4
SELECT e.ename, d.dname, d.loc
FROM emp e , dept d
WHERE comm IS NOT NULL
AND e.deptno = d.deptno ;
Solution 5
SELECT e.ename, e.job, e.deptno, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno
AND
d.loc = 'DALLAS' ;
Solution 6
SELECT e.ename "İşçi" , e.empno "İşçi No" ,
m.ename "Manager" , m.empno "Mgr No"
FROM emp e, emp m
WHERE e.mgr = m.empno ;
Solution 7
SELECT e.ename "İşçi" , e.empno "İşçi No" ,
m.ename "Manager" , m.empno "Mgr No"
FROM emp e, emp m
WHERE e.mgr = m.empno(+) ;
44
Solution 8a
SELECT e.deptno "Bölüm" , e.ename "İşçi" ,
b.ename
FROM emp e , emp b
WHERE e.deptno = b.deptno
ORDER BY e.empno ;
Solution 8b
SELECT e.deptno "Bölüm" , e.ename "İşçi" ,
b.ename
FROM emp e , emp b
WHERE e.deptno = b.deptno
AND e.ename != b.ename
ORDER BY e.empno ;
Solution 8c
SELECT e.deptno "Bölüm" , e.ename "İşçi" , b.ename
FROM emp e , emp b
WHERE e.deptno = b.deptno
AND e.ename <> b.ename
ORDER BY e.deptno ;
Solution 9a
DESC salgrade;
Solution 9b
SELECT e.ename "İşçi" , e.job "İşi" , d.dname "Bölümü" ,
e.sal "Maaş" , s.grade "Barem"
FROM emp e, dept d , salgrade s
WHERE
e.deptno = d.deptno
AND e.sal BETWEEN s.losal AND s.hisal ;
Solution 10
SELECT e.ename "İşçi" , e.hiredate "İşe Giriş Tarihi" , b.hiredate "Blake"
FROM emp e, emp b
WHERE
e.hiredate > b.hiredate
AND b.ename = 'BLAKE' ;
Solution 11
SELECT e.ename "İşçi" , e.hiredate "İşe Giriş Tarihi" , m.ename "Manageri" ,
m.hiredate "Managerin Giriş Tar"
FROM emp e, emp m
WHERE
e.hiredate < m.hiredate
AND e.mgr = m.empno ;
45