You are on page 1of 9

Two Table Inner Join

SELECT <column_name>, <column_name> FROM <table_name alias>, <table_name alias> WHERE <alias.column_name> = <alias.column_name> SELECT p.last_name, t.title_name FROM person p, title t WHERE p.title_1 = t.title_abbrev; SELECT <column_name>, <column_name> FROM <table_name alias>, <table_name alias> WHERE <alias.column_name> = <alias.column_name> AND <alias.column_name> = <alias.column_name>; SELECT p.last_name, r.role_name FROM person p, person_role_ie i, person_role r WHERE p.person_id = i.person_id AND i.role_id = r.role_id ORDER BY p.person_id; SELECT <column_name>, <column_name> FROM <table_name alias>, <table_name alias> WHERE <alias.column_name = <alias.column_name> AND <alias.column_name> = <alias.column_name> (+); SELECT p.last_name, t.title_name FROM person p, title t WHERE p.title_1 = t.title_abbrev(+); SELECT <column_name>, <column_name> FROM <table_name alias>, <table_name alias> WHERE <alias.column_name> (+) = <alias.column_name>; SELECT p.last_name, t.title_name FROM person p, title t WHERE p.title_1(+) = t.title_abbrev; SELECT <column_name>, <column_name> FROM <table_name alias>, <table_name alias>, <table_name alias> WHERE <alias.column_name> = < alias.column_name> AND <alias.column_name> = <alias.column_name>;

Three Table Inner Join

Left Outer Join

Right Outer Join

Self Join

UPDATE person SET title_2 = 'PhD' WHERE person_id = 1; COMMIT; SELECT p.last_name, t1.title_name, t2.title_name FROM person p, title t1, title t2 WHERE p.title_1 = t1.title_abbrev AND p.title_2 = t2.title_abbrev;

ANSI Joins SELECT <column_name>, <column_name> FROM <table_name alias> INNER JOIN <table_name alias> ON <alias.column_name> = <alias.column_name> SELECT p.last_name, t.title_name FROM person p INNER JOIN title t ON p.title_1 = t.title_abbrev; SELECT <column_name>, <column_name> FROM <table_name alias> LEFT OUTER JOIN <table_name alias> ON <alias.column_name> = <alias.column_name> SELECT p.last_name, t.title_name FROM person p LEFT OUTER JOIN title t ON p.title_1 = t.title_abbrev; SELECT <column_name>, <column_name> FROM <table_name alias> RIGHT OUTER JOIN <table_name alias> ON <alias.column_name> = <alias.column_name> SELECT p.last_name, t.title_name FROM person p RIGHT OUTER JOIN title t ON p.title_1 = t.title_abbrev; SELECT <column_name>, <column_name> FROM <table_name alias> FULL OUTER JOIN <table_name alias> ON <alias.column_name> = <alias.column_name>

Inner Join

Left Outer Join

Right Outer Join

Full Outer

Join

SELECT p.last_name, t.title_name FROM person p FULL OUTER JOIN title t ON p.title_1 = t.title_abbrev; SELECT <column_name>, <column_name> FROM <table_name alias> NATURAL JOIN <table_name alias> CREATE TABLE parents ( person_id NUMBER(5), adult_name VARCHAR2(20), comments VARCHAR2(40)) PCTFREE 0; CREATE TABLE parent_id person_id child_name comments PCTFREE 0; INSERT INTO INSERT INTO INSERT INTO INSERT INTO INSERT INTO COMMIT; children ( NUMBER(5), NUMBER(5), VARCHAR2(20), VARCHAR2(40))

Natural Join

parents VALUES (1, 'Dan', 'So What'); parents VALUES (2, 'Jack', 'Who Cares'); children VALUES (1, 2, 'Anne', 'Who Cares'); children VALUES (1, 1, 'Julia', 'Yeah Right'); children VALUES (2, 1, 'Marcella', 'So What');

SELECT adult_name, child_name FROM parents NATURAL JOIN children; SELECT <column_name>, <column_name> FROM <table_name alias> INNER JOIN <table_name alias> ON <alias.column_name> = <alias.column_name>, <table_name alias> INNER JOIN <table_name alias> ON <alias .column_name> = <alias.column_name>; SELECT p1.last_name, t1.title_name, t2.title_name FROM person p1 INNER JOIN title t1 ON p1.title_1 = t1.title_abbrev, person p2 INNER JOIN title t2 ON p2.title_2 = t2.title_abbrev; EXPLAIN PLAN FOR SELECT p1.last_name, t1.title_name, t2.title_name

Self Join

FROM person p1 INNER JOIN title t1 ON p1.title_1 = t1.title_abbrev, person p2 INNER JOIN title t2 ON p2.title_2 = t2.title_abbrev; SELECT * FROM TABLE(dbms_xplan.display); ---------------------------------------------------------------------| Id | Operation | Name | Rows | Cost (%CPU)| ---------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 | 16 (0)| | 1 | NESTED LOOPS | | | | | 2 | NESTED LOOPS | | 1 | 16 (0)| | 3 | MERGE JOIN CARTESIAN | | 1 | 15 (0)| | 4 | NESTED LOOPS | | | | | 5 | NESTED LOOPS | | 1 | 10 (0)| | 6 | TABLE ACCESS FULL | PERSON | 5 | 5 (0)| | 7 | INDEX UNIQUE SCAN | PK_TITLE | 1 | 0 (0)| | 8 | TABLE ACCESS BY INDEX ROWID| TITLE | 1 | 1 (0)| | 9 | BUFFER SORT | | 5 | 14 (0)| | 10 | TABLE ACCESS FULL | PERSON | 5 | 5 (0)| | 11 | INDEX UNIQUE SCAN | PK_TITLE | 1 | 0 (0)| | 12 | TABLE ACCESS BY INDEX ROWID | TITLE | 1 | 1 (0)| ---------------------------------------------------------------------SELECT <column_name>, <column_name>
Alternativ FROM <table_name alias> <join_type> <table_name alias>

e Syntax Joining on commonl y named column in both tables

USING (<common_column_name>);

-- does not work SELECT s.srvr_id, s.status, i.location_code FROM servers s INNER JOIN serv_inst i USING (s.srvr_id) WHERE rownum < 11; -- does not work either SELECT s.srvr_id, s.status, i.location_code FROM servers s INNER JOIN serv_inst i USING (srvr_id) WHERE rownum < 11; -- works SELECT srvr_id, s.status, i.location_code FROM servers s INNER JOIN serv_inst i USING (srvr_id) WHERE rownum < 11;

Cartesian Join
Table And Data For Cartesian Product (CrossJoin) Demo

CREATE TABLE cartesian ( join_column NUMBER(10)); CREATE TABLE product ( join_column NUMBER(10));

Load Demo Tables

BEGIN FOR i in 1..1000 LOOP INSERT INTO cartesian VALUES (i); INSERT INTO product VALUES (i); END LOOP; COMMIT; END; /

Inner Join

SELECT COUNT(*) FROM cartesian c, product p WHERE c.join_column = p.join_column; EXPLAIN PLAN FOR SELECT COUNT(*) FROM cartesian c, product p WHERE c.join_column = p.join_column; SELECT * FROM TABLE(dbms_xplan.display); ------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| ------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 | 26 | 11 (10)| | 1 | SORT AGGREGATE | | 1 | 26 | | | 2 | HASH JOIN | | 1000 | 26000 | 11 (10)| | 3 | TABLE ACCESS FULL| CARTESIAN | 1000 | 13000 | 5 (0)| | 4 | TABLE ACCESS FULL| PRODUCT | 1000 | 13000 | 5 (0)| -------------------------------------------------------------------

SELECT COUNT(*) Not Inner FROM cartesian c, product p WHERE c.join_column != p.join_column; Join EXPLAIN PLAN FOR SELECT COUNT(*) FROM cartesian c, product p WHERE c.join_column != p.join_column; SELECT * FROM TABLE(dbms_xplan.display); ------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| ------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 | 26 | 3076 (2)| | 1 | SORT AGGREGATE | | 1 | 26 | | | 2 | NESTED LOOPS | | 999K| 24M| 3076 (2)| | 3 | TABLE ACCESS FULL| CARTESIAN | 1000 | 13000 | 5 (0)| | 4 | TABLE ACCESS FULL| PRODUCT | 999 | 12987 | 3 (0)| -------------------------------------------------------------------

SELECT COUNT(*)
Cartesian FROM cartesian, product; (CrossJoin) EXPLAIN PLAN FOR Product SELECT COUNT(*)

FROM cartesian c, product p; SELECT * FROM TABLE(dbms_xplan.display); ---------------------------------------------------------------| Id | Operation | Name | Rows | Cost (%CPU)| ---------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 | 3076 (2)| | 1 | SORT AGGREGATE | | 1 | | | 2 | MERGE JOIN CARTESIAN| | 1000K| 3076 (2)| | 3 | TABLE ACCESS FULL | CARTESIAN | 1000 | 5 (0)| | 4 | BUFFER SORT | | 1000 | 3071 (2)| | 5 | TABLE ACCESS FULL | PRODUCT | 1000 | 3 (0)| ---------------------------------------------------------------SELECT <alias.column_name>, <alias.column_name> FROM <table_name alias> CROSS JOIN <table_name alias>; SELECT s.srvr_id, i.location_code FROM servers s CROSS JOIN serv_inst i WHERE rownum < 1001;

Intention al Cartesian (CrossJoin) Product

Join Related Queries conn / as sysdba


Column Join Usage

set linesize 121 desc col_usage$ SELECT * FROM col_usage$ WHERE obj# IN ( SELECT object_id FROM dba_objects

WHERE owner = 'UWCLASS');

You might also like