Title: SQL: Part 3
1SQL Part 3
Original materials supplied by the Oracle
Academic Initiative (OAI). Edited for classroom
use by Professor Laku Chidambaram. Not for
commercial use. Do not redistribute.
2OUTLINE
- Group Functions
- Sub-queries
- Set Operations
3Group Functions
Original materials supplied by the Oracle
Academic Initiative (OAI) edited for classroom
use by Professor Laku Chidambaram. Do not
redistribute.
4What Are Group Functions?
- Group functions operate on sets of rows to give
one result per group.
EMP
DEPTNO SAL --------- --------- 10
2450 10 5000 10
1300 20 800 20 1100
20 3000 20 3000 20
2975 30 1600 30 2850
30 1250 30 950 30
1500 30 1250
MAX(SAL) --------- 5000
maximum salary in the EMP table
5Types of Group Functions
- AVG
- COUNT
- MAX
- MIN
- STDDEV
- SUM
- VARIANCE
6Using Group Functions
SELECT column, group_function(column) FROM tabl
e WHERE condition GROUP BY column ORDER
BY column
7Using AVG and SUM Functions
- You can use AVG and SUM for numeric data.
SQLgt SELECT AVG(sal), MAX(sal), 2 MIN(sal),
SUM(sal) 3 FROM emp 4 WHERE job LIKE 'SALES'
AVG(SAL) MAX(SAL) MIN(SAL) SUM(SAL) --------
--------- --------- --------- 1400 1600
1250 5600
8Using MIN and MAX Functions
- You can use MIN and MAX for any datatype.
SQLgt SELECT MIN(hiredate), MAX(hiredate) 2
FROM emp
MIN(HIRED MAX(HIRED --------- --------- 17-DEC-80
12-JAN-83
9Using the COUNT Function
- COUNT() returns the number of rows in a table.
SQLgt SELECT COUNT() 2 FROM emp 3
WHERE deptno 30
COUNT() --------- 6
10Using the COUNT Function
- COUNT(expr) returns the number of nonnull rows.
SQLgt SELECT COUNT(comm) 2 FROM emp 3
WHERE deptno 30
COUNT(COMM) ----------- 4
11Group Functions and Null Values
- Group functions ignore null values in the column.
SQLgt SELECT AVG(comm) 2 FROM emp
AVG(COMM) --------- 550
12Using the ISNULL Function with Group Functions
- The ISNULL function forces group functions to
include null values.
SQLgt SELECT AVG(ISNULL(comm,0)) 2 FROM emp
AVG(ISNULL(COMM,0)) ----------------
157.14286
13Creating Groups of Data
EMP
DEPTNO SAL --------- --------- 10
2450 10 5000 10
1300 20 800 20 1100
20 3000 20 3000 20
2975 30 1600 30 2850
30 1250 30 950 30
1500 30 1250
DEPTNO AVG(SAL) ------- --------- 10
2916.6667 20 2175 30 1566.6667
averagesalary in EMPtable for each
department
14Creating Groups of Data GROUP BY Clause
SELECT column, group_function(column) FROM table
WHERE condition GROUP BY group_by_expression
ORDER BY column
- Divide rows in a table into smaller groups by
using the GROUP BY clause.
15Using the GROUP BY Clause
- All columns in the SELECT list that are not in
group functions must be in the GROUP BY clause.
SQLgt SELECT deptno, AVG(sal) 2 FROM emp
3 GROUP BY deptno
DEPTNO AVG(SAL) --------- --------- 10
2916.6667 20 2175 30 1566.6667
16Using the GROUP BY Clause
- The GROUP BY column does not have to be in the
SELECT list.
SQLgt SELECT AVG(sal) 2 FROM emp 3
GROUP BY deptno
AVG(SAL) --------- 2916.6667 2175 1566.6667
17Grouping by More Than One Column
EMP
DEPTNO JOB SAL --------- ---------
--------- 10 MANAGER 2450 10
PRESIDENT 5000 10 CLERK
1300 20 CLERK 800 20
CLERK 1100 20 ANALYST
3000 20 ANALYST 3000 20
MANAGER 2975 30 SALESMAN
1600 30 MANAGER 2850 30
SALESMAN 1250 30 CLERK
950 30 SALESMAN 1500 30
SALESMAN 1250
JOB SUM(SAL) --------- --------- CLERK
1300 MANAGER 2450 PRESIDENT
5000 ANALYST 6000 CLERK
1900 MANAGER 2975 CLERK
950 MANAGER 2850 SALESMAN 5600
DEPTNO -------- 10 10 10 20 20 20 30 30 30
sum salaries in the EMP tablefor each job,
grouped by department
18Using the GROUP BY Clause on Multiple Columns
SQLgt SELECT deptno, job, sum(sal) 2 FROM
emp 3 GROUP BY deptno, job
DEPTNO JOB SUM(SAL) --------- ---------
--------- 10 CLERK 1300 10
MANAGER 2450 10 PRESIDENT
5000 20 ANALYST 6000 20
CLERK 1900 ... 9 rows selected.
19Illegal Queries Using Group Functions
- Any column or expression in the SELECT list that
is not an aggregate function must be in the GROUP
BY clause.
SQLgt SELECT deptno, COUNT(ename) 2 FROM emp
Column missing in the GROUP BY clause
SELECT deptno, COUNT(ename) ERROR at
line 1 not a single-group group function
20Illegal Queries Using Group Functions
- You cannot use the WHERE clause to restrict
groups. - You use the HAVING clause to restrict groups.
SQLgt SELECT deptno, AVG(sal) 2 FROM emp 3
WHERE AVG(sal) gt 2000 4 GROUP BY deptno
Cannot use the WHERE clause to
restrict groups
WHERE AVG(sal) gt 2000 ERROR at line 3
group function is not allowed here
21Excluding Group Results
EMP
DEPTNO SAL --------- --------- 10
2450 10 5000 10
1300 20 800 20 1100
20 3000 20 3000 20
2975 30 1600 30 2850
30 1250 30 950 30
1500 30 1250
maximumsalaryper department greater than2900
DEPTNO MAX(SAL) --------- --------- 10
5000 20 3000
22Excluding Group Results HAVING Clause
- Use the HAVING clause to restrict groups
- Rows are grouped.
- The group function is applied.
- Groups matching the HAVING clause are displayed.
SELECT column, group_function FROM table WHERE c
ondition GROUP BY group_by_expression HAVING g
roup_condition ORDER BY column
23Using the HAVING Clause
SQLgt SELECT deptno, max(sal) 2 FROM emp
3 GROUP BY deptno 4 HAVING max(sal)gt2900
DEPTNO MAX(SAL) --------- --------- 10
5000 20 3000
24Using the HAVING Clause
SQLgt SELECT job, SUM(sal) PAYROLL 2 FROM
emp 3 WHERE job NOT LIKE 'SALES' 4
GROUP BY job 5 HAVING SUM(sal)gt5000 6
ORDER BY SUM(sal)
JOB PAYROLL --------- --------- ANALYST
6000 MANAGER 8275
25Sub-queries
26What Is a Subquery?
- A subquery is a SELECT statement embedded in a
clause of another SQL statement.
27Subqueries
- The subquery (inner query) executes once before
the main query. - The result of the subquery is used by the main
query (outer query).
SELECT select_list FROM table WHERE expr operator
(SELECT select_list FROM table)
28Using a Subquery
SQLgt SELECT ename 2 FROM emp 3 WHERE sal
gt 4 (SELECT sal 5 FROM
emp 6 WHERE empno 7566)
ENAME ---------- KING FORD SCOTT
29Correlated Subqueries
- Used to affect row-by-row processing, each
subquery is executed once for every row of the
outer query.
GET candidate row
EXECUTE inner query using candidate row value
USE value(s) from inner query to qualify
candidate row
30Correlated Subqueries
SELECT outer1, outer2, ... FROM table1
alias1 WHERE outer1 operator (SELECT
inner1 FROM table2
alias2 WHERE
alias1.outer2 alias2.inner1)
The subquery references a column from a table in
the parent query.
31Using Correlated Subqueries
- Find all employees who make more than the average
salary in their department.
SQLgt SELECT empno, sal, deptno 2 FROM emp
outr 3 WHERE sal gt (SELECT AVG(sal) 4
FROM emp innr 5 WHERE
outr.deptno innr.deptno)
EMPNO SAL DEPTNO -------- ---------
--------- 7839 5000 10 7698
2850 30 7566 2975 20
... 6 rows selected.
32Using the EXISTS Operator
- 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.
33Using the EXISTS Operator
Find employees who have at least one person
reporting to them.
SQLgt SELECT empno, ename, job, deptno 2 FROM
emp outr 3 WHERE EXISTS (SELECT empno 4
FROM emp innr 5
WHERE innr.mgr outr.empno)
EMPNO ENAME JOB
DEPTNO --------- ---------- --------- ---------
7839 KING PRESIDENT 10 7698
BLAKE MANAGER 30 7782 CLARK
MANAGER 10 7566 JONES
MANAGER 20 ... 6 rows selected.
34Using the NOT EXISTS Operator
Find all departments that do not have any
employees.
SQLgt SELECT deptno, dname 2 FROM dept d 3
WHERE NOT EXISTS (SELECT 4
FROM emp e 5 WHERE
d.deptno e.deptno)
DEPTNO DNAME --------- ---------- 40
OPERATIONS
35Correlated UPDATE
- Use a correlated subquery to update rows in one
table based on rows from another table.
UPDATE table1 alias1 SET column (SELECT
expression FROM table2 alias2
WHERE alias1.column
alias2.column)
36Correlated DELETE
Use a correlated subquery to delete only
those rows that also exist in another table.
DELETE FROM table1 alias1 WHERE column
operator (SELECT expression
FROM table2 alias2 WHERE
alias1.column alias2.column)
37Summary
- Correlated subqueries are useful whenever a
subquery must return a different result for each
candidate row. - The EXISTS operator is a Boolean operator,
testing the presence of a value. - Correlated subqueries can be used with SELECT,
UPDATE, and DELETE statements.
38Set Operations
39UNION
A
B
40Using the UNION Operator
- Display the name, job title, and department of
all employees.
SQLgt SELECT ename, job, deptno 2 FROM emp
3 UNION 4 SELECT name, title, deptid 5
FROM emp_history
ENAME JOB DEPTNO ---------- ---------
--------- ADAMS CLERK 30 ALLEN
SALESMAN 30 ALLEN SALESMAN
20 BALFORD CLERK 20 BLAKE
MANAGER 30 ... 20 rows selected.
41UNION ALL
A
B
42Using the UNION ALL Operator
- Display the names, employee numbers, and job
titles of all employees.
SQLgt SELECT ename, empno, job 2 FROM emp
3 UNION ALL 4 SELECT name, empid, title
5 FROM emp_history
ENAME EMPNO JOB ---------- ---------
--------- KING 7839 PRESIDENT BLAKE
7698 MANAGER CLARK 7782
MANAGER CLARK 7782 MANAGER MARTIN
7654 SALESMAN ... 23 rows selected.
43SET Operator Rules
- The expressions in the SELECT lists must match in
number and datatype. - Duplicate rows are automatically eliminated
except in UNION ALL. - Column names from the first query appear in the
result. - The output is sorted in ascending order by
default except in UNION ALL. - Parentheses can be used to alter the sequence of
execution.