Database Programming Sections 3 – Joins & Hierarchical Queries Overview Oracle Proprietary Joins (8i and prior): SQL: 1999 Compliant Joins: Cartesian Product Equijoin Non-equijoin Outer join Self join Marge Hohly Cross joins Natural joins Using clause Full or two sided outer joins Arbitrary join conditions for outer joins 2 Natural Join ANSI/ISO SQL: 1999 Join equivalent of an equijoin Join on all common columns ie. columns with same name and data type SYNTAX: SELECT field1, field2 FROM table1 NATURAL JOIN table2 WHERE fieldn = value; Marge Hohly 3 Example Natural Join SELECT event_id, song_id, cd_number FROM d_play_list_items NATURAL JOIN d_track_listings WHERE event_id = 105; Marge Hohly 4 Example Natural Join SELECT first_name, last_name, event_date, description FROM d_clients NATURAL JOIN d_events; FIRST_NAME LAST_NAME EVENT_DATE DESCRIPTION Hiram Peters 14-May-04 Party for 200, red, white, blue motif Lauren Vigil 28-Apr-04 Black tie at Four Season hotel Marge Hohly 5 Example Use an equijoin between the DJs on Demand database tables, d_songs and d_types. Display the type code, description and title. Limit the rows returned to those type codes between 70 and 80. Marge Hohly 6 Cross Join ANSI/ISO SQL: 1999 syntax for achieving of a Cartesian product Syntax: SELECT * FROM employees CROSS JOIN departments; Last section Cartesian Product: SELECT * FROM employees, departments; Marge Hohly 7 Join Using ANSI/ISO SQL: 1999 join condition used to join two tables on only one column Typically used where NATURAL JOIN cannot be used because there are other common columns with same name and different data types No table name or alias can be used on the referenced column anywhere in the USING statement Marge Hohly 8 Join Using SYNTAX: SELECT field1, field2, field3 FROM table1 JOIN table2 USING(column name); Example: SELECT e.employee_id, e.last_name, d.location_id FROM employees e JOIN departments d USING(department_id); Marge Hohly 9 Example SELECT e.employee_id, e.last_name, d.location_id FROM employees e JOIN departments d USING(department_id); Marge Hohly 10 JOIN ON ANSI/ISO: 1999 join clause that may be used to specify the condition or columns used: Syntax: SELECT field1, field2, field3 FROM table1 JOIN table2 ON(table1.fieldx=table2.fieldy); SELECT e.last_name emp, m.last_name mgr FROM employees e JOIN employees m ON(e.manager_id = m.employee_id); SELECT e.last_name as "EMP", w.last_name as "MGR“ FROM employees e JOIN employees w ON (e.manager_id = w.employee_id) WHERE e.last_name like 'H%'; Where clause can limit results. Marge Hohly 11 Example of JOIN ON SELECT e.last_name, e.department_id, d.department_name FROM employees e JOIN departments d ON (e.department_id = d.department_id); Marge Hohly 12 Summary/Comparison Marge Hohly 13 Marge Hohly 14 Examples 2. Join DJs on Demand d_play_list_items, d_track_listings, and d_cds tables with the JOIN USING syntax. Include the song ID, CD number, title, and comments in the output. 3. Display the city, department name, location ID, and department ID for departments 10, 20, and 30 for the city of Seattle. 6. Display job title, employee first name, last name, and email for all employees that are stock clerks. 9. (Use Join On) Query and display manager ID, department ID, department name, first name, and last name for all employees in departments 80, 90, 110, and 190. Marge Hohly 15 Three-way Joins with the ON clause A three-way join is the join of three tables Syntax: SELECT employee_id, city, department_name FROM employees e JOIN departments d ON (d.department_id = e.department_id) JOIN locations l ON (d.location_id=l.location_id); Marge Hohly 16 Example SELECT employee_id, city, department_name FROM employees e JOIN departments d ON (d.department_id = e.department_id) JOIN locations l ON (d.location_id=l.location_id); Marge Hohly 17 Revised example SELECT e.employee_id, l.city, d.department_name FROM employees e, departments d, locations l WHERE e.department_id = d.department_id AND d.location_id = l.location_id; Marge Hohly 18 INNER JOINS An inner join returns only those rows that match the join condition SELECT e.last_name, e.department_id, d.department_name FROM employees e JOIN departments d ON (e.department_id = d.department_id); Marge Hohly 19 OUTER JOIN Outer joins return those rows that match the join condition and those that do not There are three ANSI/ISO SQL: 1999 outer joins: LEFT OUTER JOIN RIGHT OUTER JOIN FULL OUTER JOIN Marge Hohly 20 LEFT OUTER JOIN SELECT e.last_name, e.department_id, d.department_name FROM employees e LEFT OUTER JOIN departments d ON(e.department_id=d.department_id); SQL 99 equivalent: SELECT e.last_name, e.department_id, d.department_name FROM employees e, departments d WHERE e.department_id=d.department_id(+); This statement will return those employees who do not have a department_id Marge Hohly 21 RIGHT OUTER JOIN SELECT field1, field2 .... FROM table1 a RIGHT OUTER JOIN table2 b ON (a.field=b.field); or USING(field name); SELECT e.last_name, e.department_id, d.department_name FROM employees e RIGHT OUTER JOIN departments d ON(e.department_id=d.department_id); This statement will return those departments who do not have any employees in them Marge Hohly 22 FULL OUTER JOIN The FULL OUTER JOIN returns both matched and all unmatched rows Syntax: SELECT field1, field2, field3 FROM table1 a FULL OUTER JOIN table2 b ON a.field=b.field; SELECT e.last_name, e.department_id, d.department_name FROM employees e FULL OUTER JOIN departments d ON(e.department_id=d.department_id); There is no direct comparable Oracle specific join Marge Hohly 23 Example Construct a join to display a list of Global Fast Foods customers whether or not they have placed an order as yet and all the customers who have placed orders. SELECT c.first_name, c.last_name, o.order_number,o.order_date, o.order_total FROM f_customers c LEFT OUTER JOIN f_orders o ON (c.id = o.cust_id); Marge Hohly 24 Types of Joins Oracle Proprietary Joins (8i and prior): SQL: 1999 Compliant Joins: Cartesian Product Equijoin Non-equijoin Outer join Self join Marge Hohly Cross joins Natural joins Using clause Full or two sided outer joins Arbitrary join conditions for outer joins On clause 25 Self-Join Marge Hohly 26 Self-Join Employee_id last_name 100 King 101 Kochar 102 manager_id employee_id last_name 100 King 100 101 Kochar De Haan 100 102 De Haan 103 Hunold 102 103 Hunold 104 Ernst 103 104 Ernst 107 Lorentz 103 107 Lorentz 124 Mourgos 100 124 Mourgos EMPLOYEES (worker) table EMPLOYEES (manager) table Manager_id in worker table = employee_id in Manager table Marge Hohly 27 Example SELECT chair.last_name || ‘ is the section chair of ‘ || player.last_name FROM band_members chair, band_members player WHERE player.chair_id = chair.member_id; Marge Hohly 28 Hierarchical Queries Similar to the self-join Similar to an Organization Chart Shows company, department , family structure etc. Marge Hohly 29 Using Hierarchical Queries Retrieve data based on natural hierarchical relationships between rows If data within a single table called tree walking Marge Hohly 30 Hierarchical queries EMPLOYEES as an organization chart King Kochar De Haan Hunold Mourgos Rajs Ernst Marge Hohly 31 Hierarchical queries keywords START WITH CONNECT BY PRIOR LEVEL Marge Hohly 32 Hierarchical queries keyword example Marge Hohly 33 Another example SELECT last_name || ' reports to ' || PRIOR last_name "Walk Top Down“ FROM employees START WITH last_name = 'King‘ CONNECT BY PRIOR employee_id = manager_id; Marge Hohly 34 Results of query Walk Top Down King reports to Kochhar reports to King Whalen reports to Kochhar Higgins reports to Kochhar Gietz reports to Higgins De Haan reports to King Hunold reports to De Haan Ernst reports to Hunold Lorentz reports to Hunold Marge Hohly 35 Marge Hohly 36 Hierarchical query report SELECT LPAD(last_name, LENGTH(last_name)+(LEVEL*2)2,'_') AS ORG_CHART FROM employees START WITH last_name = 'King‘ CONNECT BY PRIOR employee_id = manager_id; Marge Hohly 37 Hierarchical queries pruning Delete branches of tree with WHERE clause or CONNECT BY PRIOR clause WHERE - only row named is excluded CONNECT BY PRIOR – entire branch is excluded View example on next slide Marge Hohly 38 Pruning Example SELECT last_name FROM employees WHERE last_name <> 'Higgins‘ START WITH last_name = 'Kochhar‘ CONNECT BY PRIOR employee_id = manager_id; Only the branch under King is returned Marge Hohly 39 Pruning Example SELECT last_name FROM employees START WITH last_name = 'Kochhar‘ CONNECT BY PRIOR employee_id = manager_id AND last_name <> 'Higgins'; Marge Hohly 40