e computer notes - Advanced Sub Queries

26
Advanced Subqueries http://ecomputernotes.com 

Transcript of e computer notes - Advanced Sub Queries

Page 1: e computer notes - Advanced Sub Queries

8/3/2019 e computer notes - Advanced Sub Queries

http://slidepdf.com/reader/full/e-computer-notes-advanced-sub-queries 1/26

Advanced Subqueries

http://ecomputernotes.com 

Page 2: e computer notes - Advanced Sub Queries

8/3/2019 e computer notes - Advanced Sub Queries

http://slidepdf.com/reader/full/e-computer-notes-advanced-sub-queries 2/26

Objectives

After completing this lesson, you should be ableto do the following:

" Write a multiple-column subquery

" Describe and explain the behavior of subqueries when

null values are retrieved

" Write a subquery in a FROM  clause

" Use scalar subqueries in SQL

" Describe the types of problems that can be solved with

correlated subqueries

" Write correlated subqueries

" Update and delete rows using correlated subqueries

" Use the EXISTS and NOT EXISTS operators

" Use the WITH clause

http://ecomputernotes.com 

Page 3: e computer notes - Advanced Sub Queries

8/3/2019 e computer notes - Advanced Sub Queries

http://slidepdf.com/reader/full/e-computer-notes-advanced-sub-queries 3/26

What Is a Subquery?

A subquery is a SELECT statement embedded in aclause of another SQL statement.

Main SELECT ...query FROM ...

WHERE ...(SELECT ... Subquery

FROM ...

WHERE ...)

http://ecomputernotes.com 

Page 4: e computer notes - Advanced Sub Queries

8/3/2019 e computer notes - Advanced Sub Queries

http://slidepdf.com/reader/full/e-computer-notes-advanced-sub-queries 4/26

Subqueries

SELECT select_list 

FRO M table

WHERE  expr operator  (SELECT select_list 

FRO M table);

"The subquery (inner query) executes once before

the main query.

"The result of the subquery is used by the main

query (outer query).

http://ecomputernotes.com 

Page 5: e computer notes - Advanced Sub Queries

8/3/2019 e computer notes - Advanced Sub Queries

http://slidepdf.com/reader/full/e-computer-notes-advanced-sub-queries 5/26

Using a Subquery

SELECT last_name10500FROM employees

WHERE salary >

(SELECT salary

FROM employees

WHERE employee_id = 149) ;

http://ecomputernotes.com 

Page 6: e computer notes - Advanced Sub Queries

8/3/2019 e computer notes - Advanced Sub Queries

http://slidepdf.com/reader/full/e-computer-notes-advanced-sub-queries 6/26

Multiple-Column Subqueries

Main query

WHERE (MANAGER_ID, DEPARTMENT_ID) IN

Subquery

100 90

102 60124 50

Each row of the main query is compared to

values from avalues from a multiple-row and multiplecolumnsubquery.

http://ecomputernotes.com 

Page 7: e computer notes - Advanced Sub Queries

8/3/2019 e computer notes - Advanced Sub Queries

http://slidepdf.com/reader/full/e-computer-notes-advanced-sub-queries 7/26

Column Comparisons

Column comparisons in a multiple-column subquerycan be:

" Pairwise comparisons

" Nonpairwise comparisons

http://ecomputernotes.com 

Page 8: e computer notes - Advanced Sub Queries

8/3/2019 e computer notes - Advanced Sub Queries

http://slidepdf.com/reader/full/e-computer-notes-advanced-sub-queries 8/26

Pairwise Comparison Subquery

isplay the details of the employees who are managed

y the same manager and  work in the same department

s the employees with EMPLOYEE_ID 178 or 174.

ECT employee_id, manager_id, department_id

M employees

ERE (manager_id, department_id) IN

(SELECT manager_id, department_id

FROM employees

WHERE employee_id IN (178,174))D  employee_id NOT IN (178,174);

http://ecomputernotes.com 

Page 9: e computer notes - Advanced Sub Queries

8/3/2019 e computer notes - Advanced Sub Queries

http://slidepdf.com/reader/full/e-computer-notes-advanced-sub-queries 9/26

Nonpairwise Comparison Subquery

play the details of the employees who are managed by

e same manager as the employees with EMPLOYEE_ID

4 or 141 and  work in the same department as the

mployees with EMPLOYEE_ID 174 or 141.

ELECT employee_id, manager_id, department_id

ROM employees

HERE manager_id IN(SELECT manager_id

FROM employees

WHERE employee_id IN (174,141))

ND department_id IN

(SELECT department_idFROM employees

WHERE employee_id IN (174,141))

ND employee_id NOT IN(174,141);

http://ecomputernotes.com 

Page 10: e computer notes - Advanced Sub Queries

8/3/2019 e computer notes - Advanced Sub Queries

http://slidepdf.com/reader/full/e-computer-notes-advanced-sub-queries 10/26

Using a Subquery

in the FROM  Clause

SELECT a.last_name, a.salary,

a.department_id, b.salavg

FROM employees a, (SELECTdepartment_id,AVG(salary) salavgFROM employees

GROUP BY department_id) b

WHERE a.department_id = b.department_idAND a.salary > b.salavg;

http://ecomputernotes.com 

Page 11: e computer notes - Advanced Sub Queries

8/3/2019 e computer notes - Advanced Sub Queries

http://slidepdf.com/reader/full/e-computer-notes-advanced-sub-queries 11/26

Scalar Subquery Expressions

A scalar subquery expression is a subquery that

returns exactly one column value from one row.

Scalar subqueries were supported in Oracle8i only in a

limited set of cases, For example:

SELECT statement (FROM  and WHERE clauses) ±

ALUES list of an INSERT statement "In Oracle9i , 

alar subqueries can be used in:

Condition and expression part of  DECODE  and CASE

All clauses of  SELECT except GROUP BY

http://ecomputernotes.com 

Page 12: e computer notes - Advanced Sub Queries

8/3/2019 e computer notes - Advanced Sub Queries

http://slidepdf.com/reader/full/e-computer-notes-advanced-sub-queries 12/26

Scalar Subqueries: Examples

alar Subqueries in CASE Expressions

LECT employee_id, last_name,

(CASE20

WHEN department_id =

(SELECT department_id FROM departmentsWHERE location_id = 1800)

THEN 'Canada' ELSE 'USA' END) locationOM employees;

alar Subqueries in ORDER BY Clause

LECT employee_id, last_name

OM employees e

DER BY (SELECT department_nameFROM departments d

WHERE e.department_id = d.department_id);

http://ecomputernotes.com 

Page 13: e computer notes - Advanced Sub Queries

8/3/2019 e computer notes - Advanced Sub Queries

http://slidepdf.com/reader/full/e-computer-notes-advanced-sub-queries 13/26

Correlated Subqueries

Correlated subqueries are used for row-by-rowprocessing. Each subquery is executed once for

every row of the outer query.

GET

candidate row from outer query

EXECUTE

inner query using candidate row value

USEvalues from inner query to qualify ordisqualify candidate row

http://ecomputernotes.com 

Page 14: e computer notes - Advanced Sub Queries

8/3/2019 e computer notes - Advanced Sub Queries

http://slidepdf.com/reader/full/e-computer-notes-advanced-sub-queries 14/26

Correlated Subqueries

ELECT column1,  column2, ...

ROM table1 outer 

WHERE column1  operator

(SELECT colum1, column2

FROM table2WHERE expr1 =

outer   .expr2);

he subquery references a column from a table in

e parentthe parent query.the parent query.

http://ecomputernotes.com 

Page 15: e computer notes - Advanced Sub Queries

8/3/2019 e computer notes - Advanced Sub Queries

http://slidepdf.com/reader/full/e-computer-notes-advanced-sub-queries 15/26

Using Correlated Subqueries

Find all employees who earn more than the averagealary in their department.

SELECT last_name, salary, department_idFROM employees outer

WHERE salary >

(SELECT AVG(salary)

FROM employeesWHERE department_id =

outer.department_id) ;

http://ecomputernotes.com 

Page 16: e computer notes - Advanced Sub Queries

8/3/2019 e computer notes - Advanced Sub Queries

http://slidepdf.com/reader/full/e-computer-notes-advanced-sub-queries 16/26

Using Correlated Subqueries

splay details of those employees who have switchedbs at least twice.

LECT e.employee_id, last_name,e.job_id

ROM employees e

HERE 2 <= (SELECT COUNT(*)FROM job_history

WHERE employee_id = e.employee_id);

http://ecomputernotes.com 

Page 17: e computer notes - Advanced Sub Queries

8/3/2019 e computer notes - Advanced Sub Queries

http://slidepdf.com/reader/full/e-computer-notes-advanced-sub-queries 17/26

Using the EXISTS Operator

"The EXISTS operator tests for existence of rows in

the results set of the subquery.

"If a subquery row value is found:

The search does not continue in the inner query

The condition is flagged TRUE

"If a subquery row value is not found:

The condition is flagged  FALSE The

search continues in the inner query

http://ecomputernotes.com 

Page 18: e computer notes - Advanced Sub Queries

8/3/2019 e computer notes - Advanced Sub Queries

http://slidepdf.com/reader/full/e-computer-notes-advanced-sub-queries 18/26

Using the EXISTS Operator

nd employees who have at least one personporting to them.

ELECT employee_id, last_name, job_id, department_idROM employees outer

WHERE EXISTS ( SELECT 'X'

FROM employees

WHERE manager_id =

outer.employee_id);

http://ecomputernotes.com 

Page 19: e computer notes - Advanced Sub Queries

8/3/2019 e computer notes - Advanced Sub Queries

http://slidepdf.com/reader/full/e-computer-notes-advanced-sub-queries 19/26

Using the NOT EXISTS Operator

nd all departments that do not have any employees.

ELECT department_id, department_name

ROM departments d

WHERE NOT EXISTS (SELECT 'X'

FROM employees

WHERE department_id= d.department_id);

http://ecomputernotes.com 

Page 20: e computer notes - Advanced Sub Queries

8/3/2019 e computer notes - Advanced Sub Queries

http://slidepdf.com/reader/full/e-computer-notes-advanced-sub-queries 20/26

Correlated UPDATE

PDATE table1 alias1

T column = (SELECT expression

FROM table2 alias2WHERE alias1.column =alias2.column );

e a correlated subquery to update rows in one

ble based on rows from another table.

http://ecomputernotes.com 

Page 21: e computer notes - Advanced Sub Queries

8/3/2019 e computer notes - Advanced Sub Queries

http://slidepdf.com/reader/full/e-computer-notes-advanced-sub-queries 21/26

Correlated UPDATE

" Denormalize the EMPLOYEES table by adding a

column to store the department name.

" Populate the table by using a correlated

update.

ALTER TABLE employeesADD(department_name VARCHAR2(14));

UPDATE employees e

SET department_name =

(SELECT department_name

FROM departments d

WHERE e.department_id = d.department_id);

http://ecomputernotes.com 

Page 22: e computer notes - Advanced Sub Queries

8/3/2019 e computer notes - Advanced Sub Queries

http://slidepdf.com/reader/full/e-computer-notes-advanced-sub-queries 22/26

Correlated DELETE

DELETE FROM  table1 alias1 WHERE

column operator (SELECT expression

FROM table2 alias2

WHERE alias1.column = alias2.column);

e a correlated subquery to delete rows in one table

sed on rows from another table.

http://ecomputernotes.com 

Page 23: e computer notes - Advanced Sub Queries

8/3/2019 e computer notes - Advanced Sub Queries

http://slidepdf.com/reader/full/e-computer-notes-advanced-sub-queries 23/26

Correlated DELETE

a correlated subquery to delete only those rows

om the EMPLOYEES table that also exist in the

MP_HISTORY table.

ELETE FROM employees E

HERE employee_id = (SELECT

mployee_id FROM emp_history

WHERE employee_id = E.employee_id);

http://ecomputernotes.com 

Page 24: e computer notes - Advanced Sub Queries

8/3/2019 e computer notes - Advanced Sub Queries

http://slidepdf.com/reader/full/e-computer-notes-advanced-sub-queries 24/26

The WITH Clause

" Using the WITH clause, you can use the same

query block in a SELECT statement when it occursmore than once within a complex query.

" The WITH clause retrieves the results of a query

block and stores it in the user's temporarytablespace.

" The WITH clause improves performance

http://ecomputernotes.com 

Page 25: e computer notes - Advanced Sub Queries

8/3/2019 e computer notes - Advanced Sub Queries

http://slidepdf.com/reader/full/e-computer-notes-advanced-sub-queries 25/26

WITH Clause: Example

Using the WITH clause, write a query to display thedepartment name and total salaries for thosedepartments whose total salary is greater than the

average salary across departments.

http://ecomputernotes.com 

Page 26: e computer notes - Advanced Sub Queries

8/3/2019 e computer notes - Advanced Sub Queries

http://slidepdf.com/reader/full/e-computer-notes-advanced-sub-queries 26/26

WITH Clause: Example

ITHpt_costs AS (

SELECT d.department_name, SUM(e.salary) AS dept_total

FRO M employees e, departments d

WHERE e.department_id = d.department_id

GROUP BY d.department_name),

g_cost AS (

SELECT SUM(dept_total)/COUNT(*) AS dept_avgFRO M dept_costs)

LECT *

ROM dept_costs WHERE

pt_total > (SELECT

pt_avg

FRO M  avg_cost )

RDER BY department_name;

http://ecomputernotes.com